diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/RelateType.php b/application/Espo/Core/Formula/Functions/RecordGroup/RelateType.php new file mode 100644 index 0000000000..62d56b471f --- /dev/null +++ b/application/Espo/Core/Formula/Functions/RecordGroup/RelateType.php @@ -0,0 +1,69 @@ +addDependency('entityManager'); + } + + public function process(\StdClass $item) + { + $args = $item->value ?? []; + + if (count($args) < 4) throw new Error("Formula: record\\relate: Not enough arguments."); + + $entityType = $this->evaluate($args[0]); + $id = $this->evaluate($args[1]); + $link = $this->evaluate($item->value[2]); + $foreignId = $this->evaluate($item->value[3]); + + if (!$entityType) throw new Error("Formula record\\relate: Empty entityType."); + if (!$id) return null; + if (!$link) throw new Error("Formula record\\relate: Empty link."); + if (!$foreignId) return null; + + $em = $this->getInjection('entityManager'); + + if (!$em->hasRepository($entityType)) throw new Error("Formula: record\\relate: Repository does not exist."); + + $entity = $em->getEntity($entityType, $id); + if (!$entity) return null; + + if ($em->getRepository($entityType)->isRelated($entity, $link, $foreignId)) + return true; + + return $em->getRepository($entityType)->relate($entity, $link, $foreignId); + } +} diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/UnrelateType.php b/application/Espo/Core/Formula/Functions/RecordGroup/UnrelateType.php new file mode 100644 index 0000000000..08eb619589 --- /dev/null +++ b/application/Espo/Core/Formula/Functions/RecordGroup/UnrelateType.php @@ -0,0 +1,69 @@ +addDependency('entityManager'); + } + + public function process(\StdClass $item) + { + $args = $item->value ?? []; + + if (count($args) < 4) throw new Error("Formula: record\\unrelate: Not enough arguments."); + + $entityType = $this->evaluate($args[0]); + $id = $this->evaluate($args[1]); + $link = $this->evaluate($item->value[2]); + $foreignId = $this->evaluate($item->value[3]); + + if (!$entityType) throw new Error("Formula record\\unrelate: Empty entityType."); + if (!$id) return null; + if (!$link) throw new Error("Formula record\\unrelate: Empty link."); + if (!$foreignId) return null; + + $em = $this->getInjection('entityManager'); + + if (!$em->hasRepository($entityType)) throw new Error("Formula: record\\unrelate: Repository does not exist."); + + $entity = $em->getEntity($entityType, $id); + if (!$entity) return null; + + if (!$em->getRepository($entityType)->isRelated($entity, $link, $foreignId)) + return true; + + return $em->getRepository($entityType)->unrelate($entity, $link, $foreignId); + } +} diff --git a/tests/integration/Espo/Core/Formula/FormulaTest.php b/tests/integration/Espo/Core/Formula/FormulaTest.php index d0d9de22bb..2e8c7983e0 100644 --- a/tests/integration/Espo/Core/Formula/FormulaTest.php +++ b/tests/integration/Espo/Core/Formula/FormulaTest.php @@ -377,4 +377,44 @@ class FormulaTest extends \tests\integration\Core\BaseTestCase $result = $fm->run($script, $lead); $this->assertFalse($result); } + + public function testRecordRelate() + { + $fm = $this->getContainer()->get('formulaManager'); + $em = $this->getContainer()->get('entityManager'); + + $a = $em->createEntity('Account', [ + 'name' => '1', + ]); + $o = $em->createEntity('Opportunity', [ + 'name' => '1', + ]); + + $script = "record\\relate('Account', '".$a->id."', 'opportunities', '".$o->id."')"; + $result = $fm->run($script, $contact); + + $this->assertTrue($result); + $this->assertTrue($em->getRepository('Account')->isRelated($a, 'opportunities', $o)); + } + + public function testRecordUnrelate() + { + $fm = $this->getContainer()->get('formulaManager'); + $em = $this->getContainer()->get('entityManager'); + + $a = $em->createEntity('Account', [ + 'name' => '1', + ]); + $o = $em->createEntity('Opportunity', [ + 'name' => '1', + ]); + + $em->getRepository('Account')->relate($a, 'opportunities', $o); + + $script = "record\\unrelate('Account', '".$a->id."', 'opportunities', '".$o->id."')"; + $result = $fm->run($script, $contact); + + $this->assertTrue($result); + $this->assertFalse($em->getRepository('Account')->isRelated($a, 'opportunities', $o)); + } }