Spaces:
No application file
No application file
File size: 5,727 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
<?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__
);
}
}
|