Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Sync\SyncDataExchange\Helper; | |
use Mautic\ChannelBundle\Helper\ChannelListHelper; | |
use Mautic\IntegrationsBundle\Event\MauticSyncFieldsLoadEvent; | |
use Mautic\IntegrationsBundle\IntegrationEvents; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\FieldDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Value\EncodedValueDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Value\NormalizedValueDAO; | |
use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotFoundException; | |
use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotSupportedException; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\Object\Contact; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\ObjectProvider; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange; | |
use Mautic\IntegrationsBundle\Sync\VariableExpresser\VariableExpresserHelperInterface; | |
use Mautic\LeadBundle\Model\FieldModel; | |
use Mautic\LeadBundle\Model\LeadModel; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Contracts\Translation\TranslatorInterface; | |
class FieldHelper | |
{ | |
private array $fieldList = []; | |
private array $requiredFieldList = []; | |
/** | |
* @var array | |
*/ | |
private $syncFields = []; | |
/** | |
* @var EventDispatcher | |
*/ | |
private $eventDispatcher; | |
public function __construct( | |
private FieldModel $fieldModel, | |
private VariableExpresserHelperInterface $variableExpresserHelper, | |
private ChannelListHelper $channelListHelper, | |
private TranslatorInterface $translator, | |
EventDispatcherInterface $eventDispatcher, | |
private ObjectProvider $objectProvider | |
) { | |
$this->eventDispatcher = $eventDispatcher; | |
} | |
public function getFieldList(string $object): array | |
{ | |
if (!isset($this->fieldList[$object])) { | |
$this->fieldList[$object] = $this->fieldModel->getFieldListWithProperties($object); | |
} | |
return $this->fieldList[$object]; | |
} | |
public function getNormalizedFieldType(string $type): string | |
{ | |
return match ($type) { | |
'boolean' => NormalizedValueDAO::BOOLEAN_TYPE, | |
'date', 'datetime', 'time' => NormalizedValueDAO::DATETIME_TYPE, | |
'number' => NormalizedValueDAO::FLOAT_TYPE, | |
'select' => NormalizedValueDAO::SELECT_TYPE, | |
'multiselect' => NormalizedValueDAO::MULTISELECT_TYPE, | |
default => NormalizedValueDAO::STRING_TYPE, | |
}; | |
} | |
/** | |
* @throws ObjectNotSupportedException | |
*/ | |
public function getFieldObjectName(string $objectName): string | |
{ | |
try { | |
return $this->objectProvider->getObjectByName($objectName)->getEntityName(); | |
} catch (ObjectNotFoundException) { | |
// Throwing different exception to keep BC. | |
throw new ObjectNotSupportedException(MauticSyncDataExchange::NAME, $objectName); | |
} | |
} | |
public function getFieldChangeObject(array $fieldChange): FieldDAO | |
{ | |
$changeTimestamp = new \DateTimeImmutable($fieldChange['modified_at'], new \DateTimeZone('UTC')); | |
$columnType = $fieldChange['column_type']; | |
$columnValue = $fieldChange['column_value']; | |
$newValue = $this->variableExpresserHelper->decodeVariable(new EncodedValueDAO($columnType, $columnValue)); | |
$reportFieldDAO = new FieldDAO($fieldChange['column_name'], $newValue); | |
$reportFieldDAO->setChangeDateTime($changeTimestamp); | |
return $reportFieldDAO; | |
} | |
public function getSyncFields(string $objectName): array | |
{ | |
if (isset($this->syncFields[$objectName])) { | |
return $this->syncFields[$objectName]; | |
} | |
$this->syncFields[$objectName] = $this->fieldModel->getFieldList( | |
false, | |
true, | |
[ | |
'isPublished' => true, | |
'object' => $objectName, | |
] | |
); | |
// Dispatch event to add possibility to add field from some listener | |
$event = new MauticSyncFieldsLoadEvent($objectName, $this->syncFields[$objectName]); | |
$event = $this->eventDispatcher->dispatch($event, IntegrationEvents::INTEGRATION_MAUTIC_SYNC_FIELDS_LOAD); | |
$this->syncFields[$event->getObjectName()] = $event->getFields(); | |
// Add ID as a read only field | |
$this->syncFields[$objectName]['mautic_internal_id'] = $this->translator->trans('mautic.core.id'); | |
if (Contact::NAME !== $objectName) { | |
uksort($this->syncFields[$objectName], 'strnatcmp'); | |
return $this->syncFields[$objectName]; | |
} | |
// Mautic contacts have "pseudo" fields such as channel do not contact, timeline, etc. | |
$channels = $this->channelListHelper->getFeatureChannels([LeadModel::CHANNEL_FEATURE], true); | |
foreach ($channels as $label => $channel) { | |
$this->syncFields[$objectName]['mautic_internal_dnc_'.$channel] = $this->translator->trans('mautic.integration.sync.channel_dnc', ['%channel%' => $label]); | |
} | |
// Add the timeline link | |
$this->syncFields[$objectName]['mautic_internal_contact_timeline'] = $this->translator->trans('mautic.integration.sync.contact_timeline'); | |
uksort($this->syncFields[$objectName], 'strnatcmp'); | |
return $this->syncFields[$objectName]; | |
} | |
/** | |
* @return mixed[] | |
*/ | |
public function getRequiredFields(string $object): array | |
{ | |
if (isset($this->requiredFieldList[$object])) { | |
return $this->requiredFieldList[$object]; | |
} | |
$requiredFields = $this->fieldModel->getFieldList( | |
false, | |
false, | |
[ | |
'isPublished' => true, | |
'isRequired' => true, | |
'object' => $object, | |
] | |
); | |
// We don't use unique identifier field for companies. | |
if ('company' === $object) { | |
$this->requiredFieldList[$object] = $requiredFields; | |
return $this->requiredFieldList[$object]; | |
} | |
$uniqueIdentifierFields = $this->fieldModel->getUniqueIdentifierFields( | |
[ | |
'isPublished' => true, | |
'object' => $object, | |
] | |
); | |
$this->requiredFieldList[$object] = array_merge($requiredFields, $uniqueIdentifierFields); | |
return $this->requiredFieldList[$object]; | |
} | |
} | |