Spaces:
No application file
No application file
mautic
/
app
/bundles
/IntegrationsBundle
/Sync
/SyncProcess
/Direction
/Integration
/IntegrationSyncProcess.php
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Sync\SyncProcess\Direction\Integration; | |
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\Helper\MappingHelper; | |
use Mautic\IntegrationsBundle\Sync\Helper\SyncDateHelper; | |
use Mautic\IntegrationsBundle\Sync\Logger\DebugLogger; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange; | |
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\SyncDataExchangeInterface; | |
class IntegrationSyncProcess | |
{ | |
private ?InputOptionsDAO $inputOptionsDAO = null; | |
private ?MappingManualDAO $mappingManualDAO = null; | |
private ?SyncDataExchangeInterface $syncDataExchange = null; | |
public function __construct( | |
private SyncDateHelper $syncDateHelper, | |
private MappingHelper $mappingHelper, | |
private ObjectChangeGenerator $objectChangeGenerator | |
) { | |
} | |
public function setupSync(InputOptionsDAO $inputOptionsDAO, MappingManualDAO $mappingManualDAO, SyncDataExchangeInterface $syncDataExchange): void | |
{ | |
$this->inputOptionsDAO = $inputOptionsDAO; | |
$this->mappingManualDAO = $mappingManualDAO; | |
$this->syncDataExchange = $syncDataExchange; | |
} | |
/** | |
* @throws ObjectNotFoundException | |
*/ | |
public function getSyncReport(int $syncIteration): ReportDAO | |
{ | |
$integrationRequestDAO = new RequestDAO(MauticSyncDataExchange::NAME, $syncIteration, $this->inputOptionsDAO); | |
$integrationObjectsNames = $this->mappingManualDAO->getIntegrationObjectNames(); | |
$mauticObjectTypes = $integrationRequestDAO->getInputOptionsDAO()->getMauticObjectIds() ? | |
$integrationRequestDAO->getInputOptionsDAO()->getMauticObjectIds()->getObjectTypes() : []; | |
$hasMauticObjectIDs = 0 < count($mauticObjectTypes); | |
foreach ($integrationObjectsNames as $integrationObjectName) { | |
if ($hasMauticObjectIDs) { | |
$mappedInternalObjectsNames = []; | |
try { | |
$mappedInternalObjectsNames = $this->mappingManualDAO->getMappedInternalObjectsNames($integrationObjectName); | |
} catch (ObjectNotFoundException) { | |
} | |
if (1 > count(array_intersect($mauticObjectTypes, $mappedInternalObjectsNames))) { | |
DebugLogger::log( | |
$this->mappingManualDAO->getIntegration(), | |
sprintf( | |
'Integration to Mautic; skipping sync for the %s object because object IDs have been explicitly specified for other objects', | |
$integrationObjectName | |
), | |
__CLASS__.':'.__FUNCTION__ | |
); | |
continue; | |
} | |
} | |
$integrationObjectFields = $this->mappingManualDAO->getIntegrationObjectFieldsToSyncToMautic($integrationObjectName); | |
if (0 === count($integrationObjectFields)) { | |
// No fields configured for a sync | |
DebugLogger::log( | |
$this->mappingManualDAO->getIntegration(), | |
sprintf( | |
'Integration to Mautic; there are no fields for the %s object', | |
$integrationObjectName | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
continue; | |
} | |
$objectSyncFromDateTime = $this->syncDateHelper->getSyncFromDateTime($this->mappingManualDAO->getIntegration(), $integrationObjectName); | |
$objectSyncToDateTime = $this->syncDateHelper->getSyncToDateTime(); | |
DebugLogger::log( | |
$this->mappingManualDAO->getIntegration(), | |
sprintf( | |
'Integration to Mautic; 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'), | |
$integrationObjectName, | |
count($integrationObjectFields) | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
$integrationRequestObject = new RequestObjectDAO( | |
$integrationObjectName, | |
$objectSyncFromDateTime, | |
$objectSyncToDateTime | |
); | |
foreach ($integrationObjectFields as $integrationObjectField) { | |
$integrationRequestObject->addField($integrationObjectField); | |
} | |
$integrationRequestObject->setRequiredFields($this->mappingManualDAO->getIntegrationObjectRequiredFieldNames($integrationObjectName)); | |
$integrationRequestDAO->addObject($integrationRequestObject); | |
} | |
return $integrationRequestDAO->shouldSync() | |
? $this->syncDataExchange->getSyncReport($integrationRequestDAO) | |
: | |
new ReportDAO($this->mappingManualDAO->getIntegration()); | |
} | |
/** | |
* @throws ObjectNotFoundException | |
*/ | |
public function getSyncOrder(ReportDAO $syncReport): OrderDAO | |
{ | |
$syncOrder = new OrderDAO($this->syncDateHelper->getSyncDateTime(), $this->inputOptionsDAO->isFirstTimeSync(), $this->mappingManualDAO->getIntegration(), $this->inputOptionsDAO->getOptions()); | |
$internalObjectNames = $this->mappingManualDAO->getInternalObjectNames(); | |
foreach ($internalObjectNames as $internalObjectName) { | |
$internalObjects = $syncReport->getObjects($internalObjectName); | |
$mappedIntegrationObjectNames = $this->mappingManualDAO->getMappedIntegrationObjectsNames($internalObjectName); | |
foreach ($mappedIntegrationObjectNames as $mappedIntegrationObjectName) { | |
$objectMapping = $this->mappingManualDAO->getObjectMapping($internalObjectName, $mappedIntegrationObjectName); | |
DebugLogger::log( | |
$this->mappingManualDAO->getIntegration(), | |
sprintf( | |
'Mautic to integration; syncing %d objects for the %s object mapped to the %s integration object', | |
count($internalObjects), | |
$internalObjectName, | |
$mappedIntegrationObjectName | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
foreach ($internalObjects as $internalObject) { | |
try { | |
$integrationObject = $this->mappingHelper->findIntegrationObject( | |
$this->mappingManualDAO->getIntegration(), | |
$mappedIntegrationObjectName, | |
$internalObject | |
); | |
$objectChange = $this->objectChangeGenerator->getSyncObjectChange( | |
$syncReport, | |
$this->mappingManualDAO, | |
$objectMapping, | |
$internalObject, | |
$integrationObject | |
); | |
if ($objectChange->shouldSync()) { | |
$syncOrder->addObjectChange($objectChange); | |
} | |
} catch (ObjectDeletedException) { | |
DebugLogger::log( | |
$this->mappingManualDAO->getIntegration(), | |
sprintf( | |
"Mautic to integration; Mautic's %s:%s object was deleted from the integration so don't try to sync", | |
$internalObject->getObject(), | |
$internalObject->getObjectId() | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
continue; | |
} | |
} | |
} | |
} | |
return $syncOrder; | |
} | |
} | |