contact: set account id

This commit is contained in:
Yurii
2026-03-03 10:47:07 +02:00
parent 3a161ef0e7
commit 10ccbe4709
2 changed files with 51 additions and 13 deletions
@@ -40,6 +40,14 @@ class Contact extends Person
{
public const ENTITY_TYPE = 'Contact';
/** @since v9.3.0. */
public const string ATTR_ACCOUNT_ID = 'accountId';
/** @since v9.3.0. */
public const string FIELD_ACCOUNTS = 'accounts';
/** @since v9.3.0. */
public const string RELATIONSHIP_ACCOUNT_CONTACT = 'AccountContact';
/** @since v9.3.0. */
public const string COLUMN_ACCOUNTS_ROLE = 'role';
@@ -61,6 +69,17 @@ class Contact extends Person
return $this->relations->getOne('account');
}
/**
* Get accounts as link-multiple.
*
* @since 9.4.0
*/
public function getAccountsLinkMultiple(): LinkMultiple
{
/** @var LinkMultiple */
return $this->getValueObject('accounts');
}
/**
* Get accounts.
*
@@ -29,7 +29,9 @@
namespace Espo\Modules\Crm\Hooks\Contact;
use Espo\Core\Field\Link;
use Espo\Core\Hook\Hook\AfterSave;
use Espo\Core\Hook\Hook\BeforeSave;
use Espo\Modules\Crm\Entities\Contact;
use Espo\ORM\Entity;
use Espo\ORM\EntityManager;
@@ -37,28 +39,45 @@ use Espo\ORM\Name\Attribute;
use Espo\ORM\Repository\Option\SaveOptions;
/**
* @implements BeforeSave<Contact>
* @implements AfterSave<Contact>
*/
class Accounts implements AfterSave
class Accounts implements BeforeSave, AfterSave
{
private const string COLUMN_ROLE = Contact::COLUMN_ACCOUNTS_ROLE;
private const string ATTR_TITLE = 'title';
public function __construct(private EntityManager $entityManager) {}
/**
* @param Contact $entity
*/
public function beforeSave(Entity $entity, SaveOptions $options): void
{
if (
!$entity->isAttributeChanged(Contact::ATTR_ACCOUNT_ID) &&
!$entity->isAttributeChanged(Contact::FIELD_ACCOUNTS . 'Ids')
) {
return;
}
if (!$entity->getAccount() && $entity->getAccountsLinkMultiple()->getList()) {
$first = $entity->getAccountsLinkMultiple()->getList()[0];
$entity->setAccount(Link::create($first->getId(), $first->getName()));
}
}
public function afterSave(Entity $entity, SaveOptions $options): void
{
$accountIdChanged = $entity->isAttributeChanged('accountId');
$titleChanged = $entity->isAttributeChanged('title');
$accountIdChanged = $entity->isAttributeChanged(Contact::ATTR_ACCOUNT_ID);
$titleChanged = $entity->isAttributeChanged(self::ATTR_TITLE);
/** @var ?string $fetchedAccountId */
$fetchedAccountId = $entity->getFetched('accountId');
$fetchedAccountId = $entity->getFetched(Contact::ATTR_ACCOUNT_ID);
$accountId = $entity->getAccount()?->getId();
$title = $entity->getTitle();
$relation = $this->entityManager
->getRDBRepositoryByClass(Contact::class)
->getRelation($entity, 'accounts');
->getRelation($entity, Contact::FIELD_ACCOUNTS);
if (!$accountId && $fetchedAccountId) {
$relation->unrelateById($fetchedAccountId);
@@ -75,8 +94,8 @@ class Accounts implements AfterSave
}
$accountContact = $this->entityManager
->getRDBRepository('AccountContact')
->select(['role'])
->getRDBRepository(Contact::RELATIONSHIP_ACCOUNT_CONTACT)
->select([self::COLUMN_ROLE])
->where([
'accountId' => $accountId,
'contactId' => $entity->getId(),
@@ -85,13 +104,13 @@ class Accounts implements AfterSave
->findOne();
if (!$accountContact && $accountIdChanged) {
$relation->relateById($accountId, ['role' => $title]);
$relation->relateById($accountId, [self::COLUMN_ROLE => $title]);
return;
}
if ($titleChanged && $accountContact && $title !== $accountContact->get('role')) {
$relation->updateColumnsById($accountId, ['role' => $title]);
if ($titleChanged && $accountContact && $title !== $accountContact->get(self::COLUMN_ROLE)) {
$relation->updateColumnsById($accountId, [self::COLUMN_ROLE => $title]);
}
}
}