diff --git a/application/Espo/Core/Action/Actions/Merge/Merger.php b/application/Espo/Core/Action/Actions/Merge/Merger.php index 605fca61ac..9b50d074d2 100644 --- a/application/Espo/Core/Action/Actions/Merge/Merger.php +++ b/application/Espo/Core/Action/Actions/Merge/Merger.php @@ -269,6 +269,10 @@ class Merger $columnAttributeMap = $this->getLinkColumnAttributeMap($entityType, $link); + if ($link === 'meetings') { + echo $sourceEntity->getId() ; + } + $collection = $this->entityManager ->getRelation($sourceEntity, $link) ->find(); diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/Global.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/Global.json index 5522f79f6c..2588f73282 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/Global.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/Global.json @@ -112,7 +112,9 @@ "account": "Account", "opportunity": "Opportunity", "contact": "Contact", - "parent": "Parent" + "parent": "Parent", + "meetingsChildren": "Meetings Children", + "callsChildren": "Calls Children" }, "options": { "reminderTypes": { diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json index c58edbf66d..11edbd5980 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json @@ -648,6 +648,20 @@ "status": "acceptanceStatus" } }, + "meetingsChildren": { + "type": "hasChildren", + "entity": "Meeting", + "foreign": "parent", + "readOnly": true, + "customizationDisabled": true + }, + "callsChildren": { + "type": "hasChildren", + "entity": "Call", + "foreign": "parent", + "readOnly": true, + "customizationDisabled": true + }, "tasks": { "type": "hasChildren", "entity": "Task", diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json index 43e73b7482..e728f0dd68 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Lead.json @@ -310,6 +310,20 @@ "status": "acceptanceStatus" } }, + "meetingsChildren": { + "type": "hasChildren", + "entity": "Meeting", + "foreign": "parent", + "readOnly": true, + "customizationDisabled": true + }, + "callsChildren": { + "type": "hasChildren", + "entity": "Call", + "foreign": "parent", + "readOnly": true, + "customizationDisabled": true + }, "tasks": { "type": "hasChildren", "entity": "Task", diff --git a/tests/integration/Espo/Tools/Merge/MergeTest.php b/tests/integration/Espo/Tools/Merge/MergeTest.php new file mode 100644 index 0000000000..ba98e7a84d --- /dev/null +++ b/tests/integration/Espo/Tools/Merge/MergeTest.php @@ -0,0 +1,79 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace tests\integration\Espo\Tools\Merge; + +use Espo\Core\Action\Actions\Merge\Merger; +use Espo\Core\Action\Params; +use Espo\Core\Field\DateTimeOptional; +use Espo\Modules\Crm\Entities\Lead; +use Espo\Modules\Crm\Entities\Meeting; +use tests\integration\Core\BaseTestCase; + +class MergeTest extends BaseTestCase +{ + /** + * @noinspection PhpUnhandledExceptionInspection + */ + public function testMerge(): void + { + $em = $this->getEntityManager(); + + $lead1 = $em->getRepositoryByClass(Lead::class)->getNew(); + $lead1->setLastName('L 1'); + $em->saveEntity($lead1); + + $lead2 = $em->getRepositoryByClass(Lead::class)->getNew(); + $lead2->setLastName('L 2'); + $em->saveEntity($lead2); + + $meeting = $em->getRepositoryByClass(Meeting::class)->getNew(); + $meeting->setParent($lead2); + $meeting->setName('M'); + $meeting->setDateStart(DateTimeOptional::createNow()); + $em->saveEntity($meeting); + + $merger = $this->getInjectableFactory()->create(Merger::class); + + $merger->process( + params: new Params(Lead::ENTITY_TYPE, $lead1->getId()), + sourceIdList: [$lead2->getId()], + data: (object) [], + ); + + $em->refreshEntity($meeting); + + $this->assertEquals($lead1->getId(), $meeting->getParent()?->getId()); + $this->assertEquals(Lead::ENTITY_TYPE, $meeting->getParent()?->getEntityType()); + + $this->assertNull( + $em->getEntityById(Lead::ENTITY_TYPE, $lead2->getId()) + ); + } +}