Spaces:
No application file
No application file
mautic
/
app
/bundles
/IntegrationsBundle
/Sync
/SyncProcess
/Direction
/Internal
/MauticSyncProcess.php
| declare(strict_types=1); | |
| namespace Mautic\IntegrationsBundle\Sync\SyncProcess\Direction\Internal; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Mapping\MappingManualDAO; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Sync\InputOptionsDAO; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\OrderDAO; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\ReportDAO; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Sync\Request\ObjectDAO as RequestObjectDAO; | |
| use Mautic\IntegrationsBundle\Sync\DAO\Sync\Request\RequestDAO; | |
| use Mautic\IntegrationsBundle\Sync\Exception\ObjectDeletedException; | |
| use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotFoundException; | |
| use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotSupportedException; | |
| use Mautic\IntegrationsBundle\Sync\Helper\SyncDateHelper; | |
| use Mautic\IntegrationsBundle\Sync\Logger\DebugLogger; | |
| use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange; | |
| class MauticSyncProcess | |
| { | |
| private ?InputOptionsDAO $inputOptionsDAO = null; | |
| private ?MappingManualDAO $mappingManualDAO = null; | |
| private ?MauticSyncDataExchange $syncDataExchange = null; | |
| public function __construct( | |
| private SyncDateHelper $syncDateHelper, | |
| private ObjectChangeGenerator $objectChangeGenerator | |
| ) { | |
| } | |
| public function setupSync(InputOptionsDAO $inputOptionsDAO, MappingManualDAO $mappingManualDAO, MauticSyncDataExchange $syncDataExchange): void | |
| { | |
| $this->inputOptionsDAO = $inputOptionsDAO; | |
| $this->mappingManualDAO = $mappingManualDAO; | |
| $this->syncDataExchange = $syncDataExchange; | |
| } | |
| /** | |
| * @throws ObjectNotFoundException | |
| */ | |
| public function getSyncReport(int $syncIteration): ReportDAO | |
| { | |
| $internalRequestDAO = new RequestDAO($this->mappingManualDAO->getIntegration(), $syncIteration, $this->inputOptionsDAO); | |
| $mauticObjectTypes = $internalRequestDAO->getInputOptionsDAO()->getMauticObjectIds() ? | |
| $internalRequestDAO->getInputOptionsDAO()->getMauticObjectIds()->getObjectTypes() : []; | |
| $hasMauticObjectIDs = 0 < count($mauticObjectTypes); | |
| $internalObjectsNames = $this->mappingManualDAO->getInternalObjectNames(); | |
| foreach ($internalObjectsNames as $internalObjectName) { | |
| if ($hasMauticObjectIDs) { | |
| try { | |
| $internalRequestDAO->getInputOptionsDAO()->getMauticObjectIds()->getObjectIdsFor($internalObjectName); | |
| } catch (ObjectNotFoundException) { | |
| DebugLogger::log( | |
| $this->mappingManualDAO->getIntegration(), | |
| sprintf( | |
| 'Mautic to integration; skipping sync for the %s object because certain object IDs are specified for other object(s)', | |
| $internalObjectName | |
| ), | |
| __CLASS__.':'.__FUNCTION__ | |
| ); | |
| continue; | |
| } | |
| } | |
| $internalObjectFields = $this->mappingManualDAO->getInternalObjectFieldsToSyncToIntegration($internalObjectName); | |
| if (0 === count($internalObjectFields)) { | |
| // No fields configured for a sync | |
| DebugLogger::log( | |
| $this->mappingManualDAO->getIntegration(), | |
| sprintf( | |
| 'Mautic to integration; there are no fields for the %s object', | |
| $internalObjectName | |
| ), | |
| self::class.':'.__FUNCTION__ | |
| ); | |
| continue; | |
| } | |
| $objectSyncFromDateTime = $this->syncDateHelper->getSyncFromDateTime(MauticSyncDataExchange::NAME, $internalObjectName); | |
| $objectSyncToDateTime = $this->syncDateHelper->getSyncToDateTime(); | |
| DebugLogger::log( | |
| $this->mappingManualDAO->getIntegration(), | |
| sprintf( | |
| 'Mautic to integration; syncing from %s to %s for the %s object with %d fields', | |
| $objectSyncFromDateTime->format('Y-m-d H:i:s'), | |
| $objectSyncToDateTime->format('Y-m-d H:i:s'), | |
| $internalObjectName, | |
| count($internalObjectFields) | |
| ), | |
| self::class.':'.__FUNCTION__ | |
| ); | |
| $internalRequestObject = new RequestObjectDAO($internalObjectName, $objectSyncFromDateTime, $objectSyncToDateTime); | |
| foreach ($internalObjectFields as $internalObjectField) { | |
| $internalRequestObject->addField($internalObjectField); | |
| } | |
| // Set required fields for easy access; mainly for Mautic | |
| $internalRequestObject->setRequiredFields($this->mappingManualDAO->getInternalObjectRequiredFieldNames($internalObjectName)); | |
| $internalRequestDAO->addObject($internalRequestObject); | |
| } | |
| return $internalRequestDAO->shouldSync() | |
| ? $this->syncDataExchange->getSyncReport($internalRequestDAO) | |
| : | |
| new ReportDAO(MauticSyncDataExchange::NAME); | |
| } | |
| /** | |
| * @throws ObjectNotFoundException | |
| * @throws ObjectNotSupportedException | |
| */ | |
| public function getSyncOrder(ReportDAO $syncReport): OrderDAO | |
| { | |
| $syncOrder = new OrderDAO($this->syncDateHelper->getSyncDateTime(), $this->inputOptionsDAO->isFirstTimeSync(), $this->mappingManualDAO->getIntegration(), $this->inputOptionsDAO->getOptions()); | |
| $integrationObjectsNames = $this->mappingManualDAO->getIntegrationObjectNames(); | |
| foreach ($integrationObjectsNames as $integrationObjectName) { | |
| $integrationObjects = $syncReport->getObjects($integrationObjectName); | |
| $mappedInternalObjectsNames = $this->mappingManualDAO->getMappedInternalObjectsNames($integrationObjectName); | |
| DebugLogger::log( | |
| $this->mappingManualDAO->getIntegration(), | |
| sprintf( | |
| 'Integration to Mautic; found %d objects for the %s object mapped to the %s Mautic object(s)', | |
| count($integrationObjects), | |
| $integrationObjectName, | |
| implode(', ', $mappedInternalObjectsNames) | |
| ), | |
| self::class.':'.__FUNCTION__ | |
| ); | |
| foreach ($mappedInternalObjectsNames as $mappedInternalObjectName) { | |
| $objectMapping = $this->mappingManualDAO->getObjectMapping($mappedInternalObjectName, $integrationObjectName); | |
| foreach ($integrationObjects as $integrationObject) { | |
| try { | |
| $internalObject = $this->syncDataExchange->getConflictedInternalObject( | |
| $this->mappingManualDAO, | |
| $mappedInternalObjectName, | |
| $integrationObject | |
| ); | |
| $objectChange = $this->objectChangeGenerator->getSyncObjectChange( | |
| $syncReport, | |
| $this->mappingManualDAO, | |
| $objectMapping, | |
| $internalObject, | |
| $integrationObject | |
| ); | |
| if ($objectChange->shouldSync()) { | |
| $syncOrder->addObjectChange($objectChange); | |
| } | |
| } catch (ObjectDeletedException) { | |
| DebugLogger::log( | |
| $this->mappingManualDAO->getIntegration(), | |
| sprintf( | |
| 'Integration to Mautic; the %s object with ID %s is marked deleted and thus not synced', | |
| $integrationObject->getObject(), | |
| $integrationObject->getObjectId() | |
| ), | |
| self::class.':'.__FUNCTION__ | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| return $syncOrder; | |
| } | |
| } | |