Files
bin/espocrm-custom/custom/Espo/Custom/Resources/metadata/entityDefs/Opportunity.json
mkt e61af83d25 Make custom Tags relation filterable on all four entities
Expose the custom many-to-many CTag "Tags" relation as a linkMultiple
field (cTags) so it can be added to the list-view Search Filters, and
build the full Tags setup on Lead from scratch in parity with the others.

Opportunity / Contact / Account (relation already existed):
- add fields.cTags (linkMultiple) to entityDefs
- add cTags to the Search-Filters layout (Opportunity appended, preserving
  cAccount1; Contact/Account get a full filters.json incl. cTags)

Lead (built from scratch):
- create Lead<->CTag many-to-many relation via EntityManager (relationName
  cLeadTag, join table c_lead_tag); link normalized to cTags to mirror the
  other three (API auto-prefix had produced cCTags)
- add cTags field, de_DE/en_US labels, clientDefs panel polish (create:false,
  unlink-only row actions), bottomPanelsDetail entry, and filters.json
- CTag side: links.interessenten label de "Interessenten" / en "Leads"

Verified via API/DB: cTags linkMultiple present on all four scopes; Lead
link/CTag.interessenten resolve; Any of / All of / None of filters execute
and return correct results end-to-end; existing data intact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 16:31:30 +02:00

173 lines
4.1 KiB
JSON

{
"fields": {
"stage": {
"options": [
"Interessant",
"Abgelehnt",
"Angefragt",
"Agentur prüft",
"Kunde prüft",
"Identifiziert",
"Brief versendet",
"Anruf-Wiedervorlage",
"Angerufen",
"Ersttermin vereinbart",
"Ersttermin durchgeführt",
"Angebot",
"Verhandlung",
"Unterschriftsreif",
"Gewonnen",
"In Durchführung",
"Abgeschl. / Bestandsk.",
"Verloren",
"Ghosted"
],
"default": "Interessant",
"probabilityMap": {
"Interessant": 5,
"Abgelehnt": 0,
"Angefragt": 15,
"Agentur prüft": 20,
"Kunde prüft": 30,
"Identifiziert": 5,
"Brief versendet": 8,
"Anruf-Wiedervorlage": 10,
"Angerufen": 12,
"Ersttermin vereinbart": 20,
"Ersttermin durchgeführt": 30,
"Angebot": 40,
"Verhandlung": 60,
"Unterschriftsreif": 80,
"Gewonnen": 100,
"In Durchführung": 100,
"Abgeschl. / Bestandsk.": 100,
"Verloren": 0,
"Ghosted": 0
},
"style": {
"Interessant": null,
"Abgelehnt": "info",
"Angefragt": null,
"Agentur prüft": null,
"Kunde prüft": null,
"Identifiziert": null,
"Brief versendet": "warning",
"Anruf-Wiedervorlage": "warning",
"Angerufen": "warning",
"Ersttermin vereinbart": "warning",
"Ersttermin durchgeführt": "warning",
"Angebot": null,
"Verhandlung": null,
"Unterschriftsreif": null,
"Gewonnen": "success",
"In Durchführung": "primary",
"Abgeschl. / Bestandsk.": "info",
"Verloren": "danger",
"Ghosted": "info"
}
},
"cLeadQuelle": {
"type": "enum",
"required": true,
"options": [
"Inbound Agentur",
"Inbound Plattform-Lead",
"Aktive Plattform-Suche",
"Aktive Akquise",
"Empfehlung / Netzwerk",
"Sonstiges"
],
"style": {
"Inbound Agentur": null,
"Inbound Plattform-Lead": null,
"Aktive Plattform-Suche": null,
"Aktive Akquise": null,
"Empfehlung / Netzwerk": null,
"Sonstiges": null
},
"default": "Inbound Agentur",
"maxLength": 100,
"isCustom": true,
"displayAsLabel": true
},
"cVerlustgrund": {
"type": "enum",
"options": [
"Agentur Absage",
"Kunde Absage",
"Keine Einigung",
"Eigene Absage",
"Sonstiges",
"Agentur Ghosted",
"Kunde Ghosted"
],
"style": {
"Agentur Absage": null,
"Kunde Absage": null,
"Keine Einigung": null,
"Eigene Absage": null,
"Sonstiges": null,
"Agentur Ghosted": null,
"Kunde Ghosted": null
},
"default": "Kunde Absage",
"maxLength": 100,
"isCustom": true
},
"cProjektlink": {
"type": "url",
"isCustom": true
},
"cVerguetungsmodell": {
"type": "enum",
"options": [
"Agentur Honorar",
"Direkt Festpreis",
"Direkt Honorar",
"Direkt Nutzenbasiert"
],
"style": {
"Agentur Honorar": null,
"Direkt Festpreis": null,
"Direkt Honorar": null,
"Direkt Nutzenbasiert": null
},
"default": "Agentur Honorar",
"displayAsLabel": true,
"maxLength": 100,
"isCustom": true
},
"cAccount1": {
"type": "link"
},
"amount": {
"required": false
},
"closeDate": {
"required": false
},
"cTags": {
"type": "linkMultiple",
"view": "views/fields/link-multiple",
"isCustom": true
}
},
"links": {
"cAccount1": {
"type": "belongsTo",
"foreign": "cAgentur",
"entity": "Account",
"audited": false,
"isCustom": true
},
"cTags": {
"type": "hasMany",
"relationName": "cOpportunityTag",
"foreign": "verkaufschancen",
"entity": "CTag",
"audited": false,
"isCustom": true
}
}
}