diff --git a/application/Espo/Classes/FieldConverters/RelationshipRole.php b/application/Espo/Classes/FieldConverters/RelationshipRole.php new file mode 100644 index 0000000000..180f7ca113 --- /dev/null +++ b/application/Espo/Classes/FieldConverters/RelationshipRole.php @@ -0,0 +1,144 @@ +getName(); + + $attributeDefs = AttributeDefs::create($name) + ->withType(AttributeType::VARCHAR) + ->withNotStorable(); + + $attributeDefs = $this->addWhere($attributeDefs, $fieldDefs); + + return EntityDefs::create() + ->withAttribute($attributeDefs); + } + + private function addWhere(AttributeDefs $attributeDefs, FieldDefs $fieldDefs): AttributeDefs + { + $data = $fieldDefs->getParam('converterData'); + + if (!is_array($data)) { + throw new RuntimeException("No `converterData` in field defs."); + } + + /** @var ?string $column */ + $column = $data['column'] ?? null; + /** @var ?string $link */ + $link = $data['link'] ?? null; + /** @var ?string $relationName */ + $relationName = $data['relationName'] ?? null; + /** @var ?string $nearKey */ + $nearKey = $data['nearKey'] ?? null; + + if (!$column || !$link || !$relationName || !$nearKey) { + throw new RuntimeException("Bad `converterData`."); + } + + $midTable = ucfirst($relationName); + + return $attributeDefs->withParamsMerged([ + 'where' => [ + '=' => [ + 'leftJoins' => [$link], + 'whereClause' => ["{$link}Middle.$column" => '{value}'], + 'distinct' => true, + ], + '<>' => [ + 'whereClause' => [ + 'id!=s' => [ + 'from' => $midTable, + 'select' => [$nearKey], + 'whereClause' => [ + 'deleted' => false, + $column => '{value}', + ], + ], + ], + ], + 'IN' => [ + 'leftJoins' => [$link], + 'whereClause' => ["{$link}Middle.$column" => '{value}'], + 'distinct' => true, + ], + 'NOT IN' => [ + 'whereClause' => [ + 'id!=s' => [ + 'from' => $midTable, + 'select' => [$nearKey], + 'whereClause' => [ + 'deleted' => false, + $column => '{value}', + ], + ], + ], + ], + 'LIKE' => [ + 'leftJoins' => [$link], + 'whereClause' => ["{$link}Middle.$column*" => '{value}'], + 'distinct' => true, + ], + 'NOT LIKE' => [ + 'leftJoins' => [$link], + 'whereClause' => ["{$link}Middle.$column!*" => '{value}'], + 'distinct' => true, + ], + 'IS NULL' => [ + 'leftJoins' => [$link], + 'whereClause' => ["{$link}Middle.$column" => null], + 'distinct' => true, + ], + 'IS NOT NULL' => [ + 'whereClause' => [ + 'id!=s' => [ + 'from' => $midTable, + 'select' => [$nearKey], + 'whereClause' => [ + 'deleted' => false, + $column => null, + ], + ], + ], + ], + ], + ]); + } +} diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json index 0685bf83df..d0b3c6b1c3 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Contact.json @@ -329,78 +329,12 @@ "customizationIsSortedDisabled": true, "customizationAuditedDisabled": true, "customizationReadOnlyDisabled": true, - "where": { - "=": { - "whereClause": { - "opportunitiesMiddle.role": "{value}" - }, - "leftJoins": ["opportunities"], - "distinct": true - }, - "<>": { - "whereClause": { - "id!=s": { - "from": "ContactOpportunity", - "select": ["contactId"], - "whereClause": { - "deleted": false, - "role": "{value}" - } - } - } - }, - "IN": { - "leftJoins": ["opportunities"], - "whereClause": { - "opportunitiesMiddle.role": "{value}" - }, - "distinct": true - }, - "NOT IN": { - "whereClause": { - "id!=s": { - "from": "ContactOpportunity", - "select": ["contactId"], - "whereClause": { - "deleted": false, - "role": "{value}" - } - } - } - }, - "LIKE": { - "leftJoins": ["opportunities"], - "whereClause": { - "opportunitiesMiddle.role*": "{value}" - }, - "distinct": true - }, - "NOT LIKE": { - "leftJoins": ["opportunities"], - "whereClause": { - "opportunitiesMiddle.role!*": "{value}" - }, - "distinct": true - }, - "IS NULL": { - "leftJoins": ["opportunities"], - "whereClause": { - "opportunitiesMiddle.role": null - }, - "distinct": true - }, - "IS NOT NULL": { - "whereClause": { - "id!=s": { - "from": "ContactOpportunity", - "select": ["contactId"], - "whereClause": { - "deleted": false, - "role": null - } - } - } - } + "converterClassName": "Espo\\Classes\\FieldConverters\\RelationshipRole", + "converterData": { + "column": "role", + "link": "opportunities", + "relationName": "contactOpportunity", + "nearKey": "contactId" }, "view": "crm:views/contact/fields/opportunity-role" }, diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Opportunity.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Opportunity.json index ab295e6daf..b656ce321b 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Opportunity.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Opportunity.json @@ -231,74 +231,15 @@ "customizationIsSortedDisabled": true, "customizationAuditedDisabled": true, "customizationReadOnlyDisabled": true, - "where": { - "=": { - "leftJoins": ["contacts"], - "whereClause": { - "contactsMiddle.role": "{value}" - }, - "distinct": true - }, - "<>": { - "whereClause": { - "id!=s": { - "from": "ContactOpportunity", - "select": ["opportunityId"], - "whereClause": { - "deleted": false, - "role": "{value}" - } - } - } - }, - "IN": { - "leftJoins": ["contacts"], - "whereClause": { - "contactsMiddle.role": "{value}" - }, - "distinct": true - }, - "NOT IN": { - "whereClause": { - "id!=s": { - "from": "ContactOpportunity", - "select": ["opportunityId"], - "whereClause": { - "deleted": false, - "role": "{value}" - } - } - } - }, - "LIKE": { - "leftJoins": ["contacts"], - "whereClause": { - "contactsMiddle.role*": "{value}" - }, - "distinct": true - }, - "IS NULL": { - "leftJoins": ["contacts"], - "whereClause": { - "contactsMiddle.role": null - }, - "distinct": true - }, - "IS NOT NULL": { - "whereClause": { - "id!=s": { - "from": "ContactOpportunity", - "select": ["opportunityId"], - "whereClause": { - "deleted": false, - "role": null - } - } - } - } + "customizationOptionsDisabled": true, + "converterClassName": "Espo\\Classes\\FieldConverters\\RelationshipRole", + "converterData": { + "column": "role", + "link": "contacts", + "relationName": "contactOpportunity", + "nearKey": "opportunityId" }, - "view": "crm:views/opportunity/fields/contact-role", - "customizationOptionsDisabled": true + "view": "crm:views/opportunity/fields/contact-role" }, "createdAt": { "type": "datetime",