Spaces:
No application file
No application file
mautic
/
app
/bundles
/IntegrationsBundle
/Sync
/SyncProcess
/Direction
/Integration
/ObjectChangeGenerator.php
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Sync\SyncProcess\Direction\Integration; | |
use Mautic\IntegrationsBundle\Exception\InvalidValueException; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\FieldMappingDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\MappingManualDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\ObjectMappingDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\FieldDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\ObjectChangeDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\ObjectDAO as ReportObjectDAO; | |
use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\ReportDAO; | |
use Mautic\IntegrationsBundle\Sync\Exception\FieldNotFoundException; | |
use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotFoundException; | |
use Mautic\IntegrationsBundle\Sync\Logger\DebugLogger; | |
use Mautic\IntegrationsBundle\Sync\SyncProcess\Direction\Helper\ValueHelper; | |
class ObjectChangeGenerator | |
{ | |
public function __construct( | |
private ValueHelper $valueHelper | |
) { | |
} | |
/** | |
* @return ObjectChangeDAO | |
* | |
* @throws ObjectNotFoundException | |
*/ | |
public function getSyncObjectChange( | |
ReportDAO $syncReport, | |
MappingManualDAO $mappingManual, | |
ObjectMappingDAO $objectMapping, | |
ReportObjectDAO $internalObject, | |
ReportObjectDAO $integrationObject | |
) { | |
$objectChange = new ObjectChangeDAO( | |
$mappingManual->getIntegration(), | |
$integrationObject->getObject(), | |
$integrationObject->getObjectId(), | |
$internalObject->getObject(), | |
$internalObject->getObjectId() | |
); | |
if ($integrationObject->getObjectId()) { | |
DebugLogger::log( | |
$mappingManual->getIntegration(), | |
sprintf( | |
"Mautic to integration; found a match between the integration %s:%s object and Mautic's %s:%s object", | |
$integrationObject->getObject(), | |
(string) $integrationObject->getObjectId(), | |
$internalObject->getObject(), | |
(string) $internalObject->getObjectId() | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
} else { | |
DebugLogger::log( | |
$mappingManual->getIntegration(), | |
sprintf( | |
'Mautic to integration: no match found for %s:%s', | |
$internalObject->getObject(), | |
(string) $internalObject->getObjectId() | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
} | |
/** @var FieldMappingDAO[] $fieldMappings */ | |
$fieldMappings = $objectMapping->getFieldMappings(); | |
foreach ($fieldMappings as $fieldMappingDAO) { | |
$this->addFieldToObjectChange($fieldMappingDAO, $syncReport, $mappingManual, $internalObject, $integrationObject, $objectChange); | |
} | |
// Set the change date/time from the object so that we can update last sync date based on this | |
$objectChange->setChangeDateTime($internalObject->getChangeDateTime()); | |
return $objectChange; | |
} | |
/** | |
* @throws ObjectNotFoundException | |
*/ | |
private function addFieldToObjectChange( | |
FieldMappingDAO $fieldMappingDAO, | |
ReportDAO $syncReport, | |
MappingManualDAO $mappingManual, | |
ReportObjectDAO $internalObject, | |
ReportObjectDAO $integrationObject, | |
ObjectChangeDAO $objectChange | |
): void { | |
// Skip adding fields for the push process that should sync to Mautic only. | |
if (ObjectMappingDAO::SYNC_TO_MAUTIC === $fieldMappingDAO->getSyncDirection()) { | |
DebugLogger::log( | |
$mappingManual->getIntegration(), | |
sprintf( | |
"Mautic to integration; the %s object's field %s was skipped because it's configured to sync to Mautic", | |
$integrationObject->getObject(), | |
$fieldMappingDAO->getIntegrationField() | |
), | |
__CLASS__.':'.__FUNCTION__ | |
); | |
return; | |
} | |
try { | |
$fieldState = $internalObject->getField($fieldMappingDAO->getInternalField())->getState(); | |
$internalInformationChangeRequest = $syncReport->getInformationChangeRequest( | |
$internalObject->getObject(), | |
$internalObject->getObjectId(), | |
$fieldMappingDAO->getInternalField() | |
); | |
} catch (FieldNotFoundException) { | |
return; | |
} | |
try { | |
$newValue = $this->valueHelper->getValueForIntegration( | |
$internalInformationChangeRequest->getNewValue(), | |
$fieldState, | |
$fieldMappingDAO->getSyncDirection() | |
); | |
} catch (InvalidValueException) { | |
return; // Field has to be skipped | |
} | |
// Note: bidirectional conflicts were handled by Internal\ObjectChangeGenerator | |
$objectChange->addField( | |
new FieldDAO($fieldMappingDAO->getIntegrationField(), $newValue), | |
$fieldState | |
); | |
// ObjectMappingDAO::SYNC_TO_INTEGRATION | |
// ObjectMappingDAO::SYNC_BIDIRECTIONALLY | |
DebugLogger::log( | |
$mappingManual->getIntegration(), | |
sprintf( | |
"Mautic to integration; syncing %s object's %s field %s with a value of %s", | |
$integrationObject->getObject(), | |
$fieldState, | |
$fieldMappingDAO->getIntegrationField(), | |
var_export($newValue->getNormalizedValue(), true) | |
), | |
self::class.':'.__FUNCTION__ | |
); | |
} | |
} | |