*/ class PhoneNumber extends Database implements Di\ApplicationStateAware, Di\AclManagerAware { use Di\ApplicationStateSetter; use Di\AclManagerSetter; protected $hooksDisabled = true; const ERASED_PREFIX = 'ERASED:'; /** * @param string [] $numberList * @return string[] */ public function getIds($numberList = []): array { $ids = []; if (!empty($numberList)) { $phoneNumbers = $this ->where([ [ 'name' => $numberList, 'hash' => null, ] ]) ->find(); $ids = []; $exist = []; foreach ($phoneNumbers as $phoneNumber) { $ids[] = $phoneNumber->getId(); $exist[] = $phoneNumber->get('name'); } foreach ($numberList as $number) { $number = trim($number); if (empty($number)) { continue; } if (!in_array($number, $exist)) { $phoneNumber = $this->getNew(); $phoneNumber->set('name', $number); $this->save($phoneNumber); $ids[] = $phoneNumber->getId(); } } } return $ids; } /** * @return array */ public function getPhoneNumberData(Entity $entity): array { if (!$entity->hasId()) { return []; } $dataList = []; $numberList = $this ->select(['name', 'type', 'invalid', 'optOut', ['en.primary', 'primary']]) ->join( 'EntityPhoneNumber', 'en', [ 'en.phoneNumberId:' => 'id', ] ) ->where([ 'en.entityId' => $entity->getId(), 'en.entityType' => $entity->getEntityType(), 'en.deleted' => false, ]) ->order('en.primary', true) ->find(); foreach ($numberList as $number) { $item = (object) [ 'phoneNumber' => $number->get('name'), 'type' => $number->get('type'), 'primary' => $number->get('primary'), 'optOut' => $number->get('optOut'), 'invalid' => $number->get('invalid'), ]; $dataList[] = $item; } return $dataList; } public function getByNumber(string $number): ?PhoneNumberEntity { /** @var ?PhoneNumberEntity */ return $this->where(['name' => $number])->findOne(); } /** * @return Entity[] */ public function getEntityListByPhoneNumberId(string $phoneNumberId, ?Entity $exceptionEntity = null): array { $entityList = []; $where = [ 'phoneNumberId' => $phoneNumberId, ]; if ($exceptionEntity) { $where[] = [ 'OR' => [ 'entityType!=' => $exceptionEntity->getEntityType(), 'entityId!=' => $exceptionEntity->getId(), ] ]; } $itemList = $this->entityManager ->getRDBRepository('EntityPhoneNumber') ->sth() ->select(['entityType', 'entityId']) ->where($where) ->find(); foreach ($itemList as $item) { $itemEntityType = $item->get('entityType'); $itemEntityId = $item->get('entityId'); if (!$itemEntityType || !$itemEntityId) { continue; } if (!$this->entityManager->hasRepository($itemEntityType)) { continue; } $entity = $this->entityManager->getEntity($itemEntityType, $itemEntityId); if (!$entity) { continue; } $entityList[] = $entity; } return $entityList; } public function getEntityByPhoneNumberId(string $phoneNumberId, ?string $entityType = null): ?Entity { $where = [ 'phoneNumberId' => $phoneNumberId, ]; if ($entityType) { $where[] = ['entityType' => $entityType]; } $itemList = $this->entityManager ->getRDBRepository('EntityPhoneNumber') ->sth() ->select(['entityType', 'entityId']) ->where($where) ->limit(0, 20) ->order([ ['primary', 'DESC'], ['LIST:entityType:User,Contact,Lead,Account'], ]) ->find(); foreach ($itemList as $item) { $itemEntityType = $item->get('entityType'); $itemEntityId = $item->get('entityId'); if (!$itemEntityType || !$itemEntityId) { continue; } if (!$this->entityManager->hasRepository($itemEntityType)) { continue; } $entity = $this->entityManager->getEntity($itemEntityType, $itemEntityId); if ($entity) { if ($entity->getEntityType() === 'User') { if (!$entity->get('isActive')) { continue; } } return $entity; } } return null; } protected function beforeSave(Entity $entity, array $options = []) { parent::beforeSave($entity, $options); if ($entity->has('name')) { $number = $entity->get('name'); if (is_string($number) && strpos($number, self::ERASED_PREFIX) !== 0) { $numeric = preg_replace('/[^0-9]/', '', $number); } else { $numeric = null; } $entity->set('numeric', $numeric); } } public function markNumberOptedOut(string $number, bool $isOptedOut = true): void { $phoneNumber = $this->getByNumber($number); if (!$phoneNumber) { return; } $phoneNumber->set('optOut', $isOptedOut); $this->save($phoneNumber); } }