isAttributeChanged('status')) { if ($entity->get('status') == 'Completed') { $entity->set('dateCompleted', date('Y-m-d H:i:s')); } else { $entity->set('dateCompleted', null); } } if (!$entity->isNew() && $entity->isAttributeChanged('parentId')) { $entity->set('accountId', null); $entity->set('contactId', null); $entity->set('accountName', null); $entity->set('contactName', null); } if ($entity->isAttributeChanged('parentId') || $entity->isAttributeChanged('parentType')) { $this->processParentChanged($entity); } parent::beforeSave($entity, $options); } protected function processParentChanged(Entity $entity): void { $parent = null; $parentId = $entity->get('parentId'); $parentType = $entity->get('parentType'); if ($parentId && $parentType && $this->entityManager->hasRepository($parentType)) { $columnList = ['id', 'name']; $defs = $this->entityManager->getMetadata()->getDefs(); if ($defs->getEntity($parentType)->hasAttribute('accountId')) { $columnList[] = 'accountId'; } if ($defs->getEntity($parentType)->hasAttribute('contactId')) { $columnList[] = 'contactId'; } if ($parentType === 'Lead') { $columnList[] = 'status'; $columnList[] = 'createdAccountId'; $columnList[] = 'createdAccountName'; $columnList[] = 'createdContactId'; $columnList[] = 'createdContactName'; } $parent = $this->entityManager ->getRDBRepository($parentType) ->select($columnList) ->where(['id' => $parentId]) ->findOne(); } $accountId = null; $contactId = null; $accountName = null; $contactName = null; if ($parent) { if ($parent->getEntityType() == 'Account') { $accountId = $parent->getId(); $accountName = $parent->get('name'); } else if ($parent->getEntityType() == 'Lead' && $parent->get('status') == 'Converted') { if ($parent->get('createdAccountId')) { $accountId = $parent->get('createdAccountId'); $accountName = $parent->get('createdAccountName'); } if ($parent->get('createdContactId')) { $contactId = $parent->get('createdContactId'); $contactName = $parent->get('createdContactName'); } } else if ($parent->getEntityType() == 'Contact') { $contactId = $parent->getId(); $contactName = $parent->get('name'); } if ( !$accountId && $parent->get('accountId') && $parent instanceof CoreEntity && $parent->getRelationParam('account', 'entity') == 'Account' ) { $accountId = $parent->get('accountId'); } if ( !$contactId && $parent->get('contactId') && $parent instanceof CoreEntity && $parent->getRelationParam('contact', 'entity') == 'Contact' ) { $contactId = $parent->get('contactId'); } } $entity->set('accountId', $accountId); $entity->set('accountName', $accountName); $entity->set('contactId', $contactId); $entity->set('contactName', $contactName); if ( $entity->get('accountId') && !$entity->get('accountName') ) { $account = $this->entityManager ->getRDBRepository('Account') ->select(['id', 'name']) ->where(['id' => $entity->get('accountId')]) ->findOne(); if ($account) { $entity->set('accountName', $account->get('name')); } } if ( $entity->get('contactId') && !$entity->get('contactName') ) { $contact = $this->entityManager ->getRDBRepository('Contact') ->select(['id', 'name']) ->where(['id' => $entity->get('contactId')]) ->findOne(); if ($contact) { $entity->set('contactName', $contact->get('name')); } } } }