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; } }