Enhance EspoCRM entities and layouts with new relationships, fields, and troubleshooting sections; update README.md for clarity and add new layout files for CAdressen and CBeteiligte.

This commit is contained in:
2026-01-20 13:33:36 +01:00
parent 627a47aa44
commit dfc8b952e9
23 changed files with 536 additions and 19 deletions

121
README.md
View File

@@ -75,6 +75,11 @@ Alle Dateien sind im JSON-Format. Die KI muss gültiges JSON parsen und schreibe
Links: Beziehungen (belongsTo für 1:1, hasMany für 1:N, etc.). Links: Beziehungen (belongsTo für 1:1, hasMany für 1:N, etc.).
Collection: Für Listen-Views (Sortierung, Filter). Collection: Für Listen-Views (Sortierung, Filter).
Auslösen: Hinzufügen eines Felds triggert bei Rebuild eine Datenbankänderung (neue Spalte in der Tabelle). Beziehungen erstellen Middle-Tables bei Many-to-Many. Auslösen: Hinzufügen eines Felds triggert bei Rebuild eine Datenbankänderung (neue Spalte in der Tabelle). Beziehungen erstellen Middle-Tables bei Many-to-Many.
**WICHTIG - Bidirektionale Relationships**: Bei hasMany-Relationships (z. B. viele Contacts zu einer Entität) müssen **beide Seiten** definiert werden:
- In Entität A: Link mit `relationName` und `foreign` (zeigt auf Link-Namen in Entität B)
- In Entität B (z. B. Contact): Link mit **derselben** `relationName` und `foreign` (zeigt auf Link-Namen in Entität A)
- Beispiel: `CVmhMietverhltnis` hat Link `contactsMietverhltnis` mit relationName `cVmhMietverhltnisContact`; `Contact` hat Link `cVmhMietverhltnisesContact` mit derselben relationName und foreign `contactsMietverhltnis`.
- Fehlt eine Seite, gibt EspoCRM 404-Fehler "Link does not exist" zurück.
docs.espocrm.com docs.espocrm.com
clientDefs/{EntityType}.json (Format-Beispiel): clientDefs/{EntityType}.json (Format-Beispiel):
@@ -169,7 +174,7 @@ Zukünftige Ziele:
- Die KI soll über APIs/Webhooks angebunden werden, ohne EspoCRMs Core zu modifizieren, um Stabilität zu wahren. - Die KI soll über APIs/Webhooks angebunden werden, ohne EspoCRMs Core zu modifizieren, um Stabilität zu wahren.
- **Erweiterte Features**: Mehrsprachigkeit, Mandanten-Isolation für mehrere Kanzlei-Teams, Integration mit externen Systemen (z. B. Gerichts-APIs, Buchhaltung). - **Erweiterte Features**: Mehrsprachigkeit, Mandanten-Isolation für mehrere Kanzlei-Teams, Integration mit externen Systemen (z. B. Gerichts-APIs, Buchhaltung).
Die KI kann diese Ziele unterstützen, indem sie JSON-Strukturen analysiert, Änderungen vorschlägt (z. B. neue Felder für Compliance) und Workflows modelliert. Das System soll skalierbar, GDPR-konform und benutzerfreundlich sein, um die Effizienz in der Rechtsbranche zu steigern. Die KI kann diese Ziele unterstützen, indem sie JSON-Strukturen analysiert, Änderungen vorschlägt (z. B. neue Felder für Compliance) und Workflows modelliert. Das System soll skalierbar und benutzerfreundlich sein, um die Effizienz in der Rechtsbranche zu steigern.
6. Bearbeitung von Entitäten und Layouts 6. Bearbeitung von Entitäten und Layouts
@@ -221,3 +226,117 @@ Um die Entwicklung und Wartung zu erleichtern, wurden benutzerdefinierte Scripts
- Sichere Backups vor Lösch- oder Edit-Operationen. - Sichere Backups vor Lösch- oder Edit-Operationen.
- Für komplexe Änderungen die EspoCRM-UI verwenden. - Für komplexe Änderungen die EspoCRM-UI verwenden.
- Execute simuliert nur einfache Aktionen; für vollständige Ausführung EspoCRM-API nutzen. - Execute simuliert nur einfache Aktionen; für vollständige Ausführung EspoCRM-API nutzen.
## 8. Troubleshooting
### 404-Fehler "Link does not exist"
- **Symptom**: HTTP 404-Fehler in Logs: "Link does not exist" beim Versuch, eine Relationship anzuzeigen oder zu verknüpfen.
- **Ursache**: Bei hasMany-Relationships fehlt die Definition auf einer Seite der Beziehung. EspoCRM benötigt bidirektionale Link-Definitionen.
- **Lösung**:
- Prüfe beide entityDefs-Dateien (z.B. `CBeteiligte.json` UND `Contact.json`).
- Stelle sicher, dass beide Seiten den Link mit derselben `relationName` definieren.
- Das `foreign`-Attribut muss jeweils auf den Link-Namen der Gegenseite zeigen.
- Beispiel:
```json
// In CBeteiligte.json:
"contactsBeteiligte": {
"type": "hasMany",
"relationName": "cBeteiligteContact",
"foreign": "cBeteiligteContact",
"entity": "Contact"
}
// In Contact.json:
"cBeteiligteContact": {
"type": "hasMany",
"relationName": "cBeteiligteContact",
"foreign": "contactsBeteiligte",
"entity": "CBeteiligte"
}
```
- Nach Korrektur: `docker exec espocrm php /var/www/html/command.php Rebuild` ausführen.
### 500-Fehler bei Layout-Änderungen
- **Symptom**: HTTP 500-Fehler beim Versuch, Layouts in der EspoCRM-UI zu bearbeiten (z.B. "Permission denied for custom/Espo/Custom/Resources/layouts/...").
- **Ursache**: Das `custom/`-Verzeichnis gehört `root:root`, aber der EspoCRM-Container läuft als `www-data`-User, der keine Schreibrechte hat.
- **Lösung**:
- Führe auf dem Host aus: `chown -R www-data:www-data /var/lib/docker/volumes/vmh-espocrm_espocrm/_data/custom`
- Dies gibt `www-data` Schreibrechte für Custom-Dateien.
- **Prävention**: Stelle sicher, dass neue Custom-Dateien mit korrekten Berechtigungen erstellt werden (z.B. via Docker-Container als `www-data`).
### Allgemeine Tipps
- Nach Änderungen immer `docker exec espocrm php /var/www/html/command.php Rebuild` ausführen.
- Logs prüfen: `tail -n 100 /var/lib/docker/volumes/vmh-espocrm_espocrm/_data/data/logs/espo-YYYY-MM-DD.log`
- Bei Relationship-Problemen: Logs nach "404" und "Link does not exist" durchsuchen: `tail -n 500 /var/lib/docker/volumes/vmh-espocrm_espocrm/_data/data/logs/espo-$(date +%Y-%m-%d).log | grep -A 3 "404\|Link does not exist"`
- Bei DB-Problemen: Custom-Scripts wie `workflow_manager.php` verwenden.
## 9. Portal-Freigabe-System
Um Entitäten für Portalnutzer (Contact-Entität) freizugeben, wurde ein konsistentes Freigabe-System implementiert:
### Implementierte Portal-Relationships:
- **CVmhMietverhltnis** → `contactsMietverhltnis` (relationName: `cVmhMietverhltnisContact`)
- **CBeteiligte** → `contactsBeteiligte` (relationName: `cBeteiligteContact`)
- **CMietobjekt** → `contactsMietobjekt` (relationName: `cMietobjektContactPortal`)
- **CAdressen** → `contactsAdressen` (relationName: `cAdressenContact`)
- **CVmhRumungsklage** → `contactsRumungsklage` (relationName: `cVmhRumungsklageContact`)
### Pattern für neue Portal-Relationships:
1. **entityDefs der Hauptentität** (z.B. `CBeteiligte.json`):
```json
"contactsBeteiligte": {
"type": "hasMany",
"relationName": "cBeteiligteContact",
"foreign": "cBeteiligteContact",
"entity": "Contact",
"audited": false,
"isCustom": true
}
```
2. **entityDefs von Contact** (`Contact.json`):
```json
"cBeteiligteContact": {
"type": "hasMany",
"relationName": "cBeteiligteContact",
"foreign": "contactsBeteiligte",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
}
```
3. **clientDefs der Hauptentität** (`CBeteiligte.json`):
```json
"relationshipPanels": {
"contactsBeteiligte": {
"layout": null,
"selectPrimaryFilterName": "portalUsers"
}
}
```
4. **bottomPanelsDetail Layout** (Tab-Ansicht):
```json
{
"_tabBreak_0": {
"index": 0,
"tabBreak": true,
"tabLabel": "Freigabe für"
},
"contactsBeteiligte": {
"dynamicLogicVisible": null,
"style": "warning",
"dynamicLogicStyled": null,
"sticked": true,
"index": 1
}
}
```
### Wichtige Hinweise:
- `selectPrimaryFilterName: "portalUsers"` filtert automatisch auf Portal-User
- Tab "Freigabe für" sollte immer der erste Tab im Bottom-Panel sein (index: 0)
- Style "warning" hebt das Panel visuell hervor
- Nach Änderungen immer Rebuild durchführen und beide Seiten der Relationship definieren

View File

@@ -1,5 +1,8 @@
{ {
"labels": { "labels": {
"Create CAdressen": "Adressen erstellen" "Create CAdressen": "Adressen erstellen"
},
"fields": {
"isActive": "Aktiv"
} }
} }

View File

@@ -4,7 +4,12 @@
}, },
"links": { "links": {
"calls": "Anrufe", "calls": "Anrufe",
"tasks": "Aufgaben" "tasks": "Aufgaben",
"vmhvermieterbeteiligte": "Vermieter",
"vmhmieterbeteiligte": "Mieter",
"vmhMietverhltnisesSonstigeBesitzer": "Sonstige Bewohner",
"vmhRumungsklagesKlaeger": "Kläger",
"vmhRumungsklagesBeklagte": "Beklagte"
}, },
"labels": { "labels": {
"Create CBeteiligte": "Beteiligte erstellen" "Create CBeteiligte": "Beteiligte erstellen"

View File

@@ -1,4 +1,7 @@
{ {
"fields": {
"portalUser": "Portalnutzer"
},
"links": { "links": {
"calls": "Anrufe", "calls": "Anrufe",
"tasks": "Aufgaben" "tasks": "Aufgaben"

View File

@@ -8,6 +8,7 @@
"adresseCountry": "Adresse Country", "adresseCountry": "Adresse Country",
"adressePostalCode": "Adresse Postal Code", "adressePostalCode": "Adresse Postal Code",
"adresseMap": "Adresse Map", "adresseMap": "Adresse Map",
"isActive": "Active",
"autoapplymietverhaltnisportaluser": "Portalnutzer von Mietverhältnis übernehmen", "autoapplymietverhaltnisportaluser": "Portalnutzer von Mietverhältnis übernehmen",
"advowareindexid": "Advoware_index_id" "advowareindexid": "Advoware_index_id"
}, },

View File

@@ -0,0 +1,31 @@
{
"_delimiter_": {
"disabled": true
},
"activities": {
"disabled": true
},
"history": {
"disabled": true
},
"_tabBreak_0": {
"index": 0,
"tabBreak": true,
"tabLabel": "Freigegebene Nutzer"
},
"contactsAdressen": {
"dynamicLogicVisible": null,
"style": "warning",
"dynamicLogicStyled": null,
"sticked": true,
"index": 1
},
"_tabBreak_1": {
"index": 2,
"tabBreak": true,
"tabLabel": "Beteiligte"
},
"beteiligte": {
"index": 3
}
}

View File

@@ -0,0 +1,24 @@
[
{
"rows": [
[
{
"name": "name"
},
{
"name": "isActive"
}
],
[
{
"name": "adresse"
},
{
"name": "adresseMap"
}
]
],
"style": "default",
"label": "Overview"
}
]

View File

@@ -8,10 +8,57 @@
"history": { "history": {
"disabled": true "disabled": true
}, },
"_tabBreak_0": {
"index": 0,
"tabBreak": true,
"tabLabel": "Freigegebene Nutzer"
},
"contactsBeteiligte": {
"dynamicLogicVisible": null,
"style": "warning",
"dynamicLogicStyled": null,
"sticked": true,
"index": 1
},
"_tabBreak_1": {
"index": 2,
"tabBreak": true,
"tabLabel": "Mietverhältnisse"
},
"vmhvermieterbeteiligte": { "vmhvermieterbeteiligte": {
"index": 0 "index": 3
},
"vmhmieterbeteiligte": {
"index": 4
},
"vmhMietverhltnisesSonstigeBesitzer": {
"index": 5
},
"_tabBreak_2": {
"index": 6,
"tabBreak": true,
"tabLabel": "Adressen"
}, },
"adressens": { "adressens": {
"index": 1 "index": 7
},
"_tabBreak_3": {
"index": 8,
"tabBreak": true,
"tabLabel": "Räumungsklagen"
},
"vmhRumungsklagesKlaeger": {
"index": 9
},
"vmhRumungsklagesBeklagte": {
"index": 10
},
"_tabBreak_4": {
"index": 11,
"tabBreak": true,
"tabLabel": "Dokumente"
},
"dokumentesBeteiligte": {
"index": 12
} }
} }

View File

@@ -0,0 +1,28 @@
[
{
"name": "name",
"width": 20,
"link": true
},
{
"name": "adresseStreet",
"width": 25
},
{
"name": "adresseCity",
"width": 20
},
{
"name": "adresseCountry",
"width": 15
},
{
"name": "isActive",
"width": 10
},
{
"name": "createdAt",
"width": 10,
"align": "right"
}
]

View File

@@ -2,10 +2,40 @@
"_delimiter_": { "_delimiter_": {
"disabled": true "disabled": true
}, },
"_tabBreak_1": {
"index": 0,
"tabBreak": true,
"tabLabel": "Freigegebene Nutzer"
},
"contactsMietobjekt": {
"dynamicLogicVisible": null,
"style": "warning",
"dynamicLogicStyled": null,
"sticked": true,
"index": 1
},
"_tabBreak_2": {
"index": 2,
"tabBreak": true,
"tabLabel": "Kontakte"
},
"contact2mietobjekt": { "contact2mietobjekt": {
"index": 0 "index": 3
},
"_tabBreak_3": {
"index": 4,
"tabBreak": true,
"tabLabel": "Mietverhältnisse"
}, },
"vmhMietverhltnises2Mietobjekt": { "vmhMietverhltnises2Mietobjekt": {
"index": 1 "index": 5
},
"_tabBreak_4": {
"index": 6,
"tabBreak": true,
"tabLabel": "Dokumente"
},
"dokumentesMietobjekt": {
"index": 7
} }
} }

View File

@@ -11,7 +11,7 @@
"_tabBreak_2": { "_tabBreak_2": {
"index": 0, "index": 0,
"tabBreak": true, "tabBreak": true,
"tabLabel": "Mandantenportal" "tabLabel": "Freigegebene Nutzer"
}, },
"contactsMietverhltnis": { "contactsMietverhltnis": {
"dynamicLogicVisible": null, "dynamicLogicVisible": null,

View File

@@ -8,21 +8,57 @@
"history": { "history": {
"disabled": true "disabled": true
}, },
"_tabBreak_1": { "_tabBreak_0": {
"index": 0, "index": 0,
"tabBreak": true, "tabBreak": true,
"tabLabel": "Allgemein" "tabLabel": "Freigegebene Nutzer"
}, },
"stream": { "contactsRumungsklage": {
"sticked": false, "dynamicLogicVisible": null,
"style": "warning",
"dynamicLogicStyled": null,
"sticked": true,
"index": 1 "index": 1
}, },
"_tabBreak_0": { "_tabBreak_1": {
"index": 2, "index": 2,
"tabBreak": true, "tabBreak": true,
"tabLabel": "Kläger"
},
"klaeger": {
"index": 3
},
"_tabBreak_2": {
"index": 4,
"tabBreak": true,
"tabLabel": "Beklagte"
},
"beklagte": {
"index": 5
},
"_tabBreak_3": {
"index": 6,
"tabBreak": true,
"tabLabel": "Mietverhältnisse"
},
"vmhMietverhltnises": {
"index": 7
},
"_tabBreak_4": {
"index": 8,
"tabBreak": true,
"tabLabel": "Dokumente" "tabLabel": "Dokumente"
}, },
"dokumentesvmhraumungsklage": { "dokumentesvmhraumungsklage": {
"index": 3 "index": 9
},
"_tabBreak_5": {
"index": 10,
"tabBreak": true,
"tabLabel": "Stream"
},
"stream": {
"sticked": false,
"index": 11
} }
} }

View File

@@ -8,6 +8,18 @@
"beteiligte": { "beteiligte": {
"layout": null, "layout": null,
"selectPrimaryFilterName": null "selectPrimaryFilterName": null
},
"contactsAdressen": {
"layout": null,
"selectPrimaryFilterName": "portalUsers"
} }
},
"detailActionList": [
{
"label": "View Map",
"action": "viewMap",
"acl": "read"
} }
],
"addressField": "adresse"
} }

View File

@@ -38,15 +38,18 @@
"relationshipPanels": { "relationshipPanels": {
"vmhvermieterbeteiligte": { "vmhvermieterbeteiligte": {
"layout": null, "layout": null,
"selectPrimaryFilterName": null "selectPrimaryFilterName": null,
"title": "Vermieter"
}, },
"vmhmieterbeteiligte": { "vmhmieterbeteiligte": {
"layout": null, "layout": null,
"selectPrimaryFilterName": null "selectPrimaryFilterName": null,
"title": "Mieter"
}, },
"vmhMietverhltnisesSonstigeBesitzer": { "vmhMietverhltnisesSonstigeBesitzer": {
"layout": null, "layout": null,
"selectPrimaryFilterName": null "selectPrimaryFilterName": null,
"title": "Sonstige Bewohner"
}, },
"adressens": { "adressens": {
"layout": null, "layout": null,
@@ -55,6 +58,24 @@
"calls1": { "calls1": {
"layout": null, "layout": null,
"selectPrimaryFilterName": "planned" "selectPrimaryFilterName": "planned"
},
"contactsBeteiligte": {
"layout": null,
"selectPrimaryFilterName": "portalUsers"
},
"vmhRumungsklagesKlaeger": {
"layout": null,
"selectPrimaryFilterName": null,
"title": "Kläger"
},
"vmhRumungsklagesBeklagte": {
"layout": null,
"selectPrimaryFilterName": null,
"title": "Beklagte"
},
"dokumentesBeteiligte": {
"layout": null,
"selectPrimaryFilterName": null
} }
} }
} }

View File

@@ -13,6 +13,14 @@
"contact2mietobjekt": { "contact2mietobjekt": {
"layout": null, "layout": null,
"selectPrimaryFilterName": "portalUsers" "selectPrimaryFilterName": "portalUsers"
},
"contactsMietobjekt": {
"layout": null,
"selectPrimaryFilterName": "portalUsers"
},
"dokumentesMietobjekt": {
"layout": null,
"selectPrimaryFilterName": null
} }
} }
} }

View File

@@ -50,6 +50,22 @@
"dokumentesvmhraumungsklage": { "dokumentesvmhraumungsklage": {
"layout": "listRaeumungsKl", "layout": "listRaeumungsKl",
"selectPrimaryFilterName": null "selectPrimaryFilterName": null
},
"contactsRumungsklage": {
"layout": null,
"selectPrimaryFilterName": "portalUsers"
},
"klaeger": {
"layout": null,
"selectPrimaryFilterName": null
},
"beklagte": {
"layout": null,
"selectPrimaryFilterName": null
},
"vmhMietverhltnises": {
"layout": null,
"selectPrimaryFilterName": null
} }
}, },
"kanbanViewMode": false, "kanbanViewMode": false,

View File

@@ -45,6 +45,11 @@
"type": "address", "type": "address",
"isCustom": true "isCustom": true
}, },
"isActive": {
"type": "bool",
"default": true,
"isCustom": true
},
"autoapplymietverhaltnisportaluser": { "autoapplymietverhaltnisportaluser": {
"notNull": true, "notNull": true,
"type": "bool", "type": "bool",
@@ -84,6 +89,14 @@
"entity": "CBeteiligte", "entity": "CBeteiligte",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"contactsAdressen": {
"type": "hasMany",
"relationName": "cAdressenContact",
"foreign": "cAdressenContact",
"entity": "Contact",
"audited": false,
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -169,6 +169,38 @@
"entity": "Call", "entity": "Call",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"contactsBeteiligte": {
"type": "hasMany",
"relationName": "cBeteiligteContact",
"foreign": "cBeteiligteContact",
"entity": "Contact",
"audited": false,
"isCustom": true
},
"vmhRumungsklagesKlaeger": {
"type": "hasMany",
"relationName": "cBeteiligteVmhRumungsklageKlaeger",
"foreign": "klaeger",
"entity": "CVmhRumungsklage",
"audited": false,
"isCustom": true
},
"vmhRumungsklagesBeklagte": {
"type": "hasMany",
"relationName": "cBeteiligteVmhRumungsklageBeklagte",
"foreign": "beklagte",
"entity": "CVmhRumungsklage",
"audited": false,
"isCustom": true
},
"dokumentesBeteiligte": {
"type": "hasMany",
"relationName": "cBeteiligteDokumente",
"foreign": "beteiligte2dokumente",
"entity": "CDokumente",
"audited": false,
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -135,6 +135,22 @@
"entity": "CVmhRumungsklage", "entity": "CVmhRumungsklage",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"beteiligte2dokumente": {
"type": "hasMany",
"relationName": "cBeteiligteDokumente",
"foreign": "dokumentesBeteiligte",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
},
"mietobjekt2dokumente": {
"type": "hasMany",
"relationName": "cMietobjektDokumente",
"foreign": "dokumentesMietobjekt",
"entity": "CMietobjekt",
"audited": false,
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -106,6 +106,22 @@
"entity": "Contact", "entity": "Contact",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"contactsMietobjekt": {
"type": "hasMany",
"relationName": "cMietobjektContactPortal",
"foreign": "cMietobjekteContactPortal",
"entity": "Contact",
"audited": false,
"isCustom": true
},
"dokumentesMietobjekt": {
"type": "hasMany",
"relationName": "cMietobjektDokumente",
"foreign": "mietobjekt2dokumente",
"entity": "CDokumente",
"audited": false,
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -129,6 +129,30 @@
"entity": "CDokumente", "entity": "CDokumente",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"contactsRumungsklage": {
"type": "hasMany",
"relationName": "cVmhRumungsklageContact",
"foreign": "cVmhRumungsklageContact",
"entity": "Contact",
"audited": false,
"isCustom": true
},
"klaeger": {
"type": "hasMany",
"relationName": "cBeteiligteVmhRumungsklageKlaeger",
"foreign": "vmhRumungsklagesKlaeger",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
},
"beklagte": {
"type": "hasMany",
"relationName": "cBeteiligteVmhRumungsklageBeklagte",
"foreign": "vmhRumungsklagesBeklagte",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -53,6 +53,38 @@
"entity": "CMietobjekt", "entity": "CMietobjekt",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"cBeteiligteContact": {
"type": "hasMany",
"relationName": "cBeteiligteContact",
"foreign": "contactsBeteiligte",
"entity": "CBeteiligte",
"audited": false,
"isCustom": true
},
"cMietobjekteContactPortal": {
"type": "hasMany",
"relationName": "cMietobjektContactPortal",
"foreign": "contactsMietobjekt",
"entity": "CMietobjekt",
"audited": false,
"isCustom": true
},
"cAdressenContact": {
"type": "hasMany",
"relationName": "cAdressenContact",
"foreign": "contactsAdressen",
"entity": "CAdressen",
"audited": false,
"isCustom": true
},
"cVmhRumungsklageContact": {
"type": "hasMany",
"relationName": "cVmhRumungsklageContact",
"foreign": "contactsRumungsklage",
"entity": "CVmhRumungsklage",
"audited": false,
"isCustom": true
} }
}, },
"fields": { "fields": {

View File

@@ -349,8 +349,8 @@ return [
0 => 'youtube.com', 0 => 'youtube.com',
1 => 'google.com' 1 => 'google.com'
], ],
'cacheTimestamp' => 1768843902, 'cacheTimestamp' => 1768912371,
'microtime' => 1768843902.115102, 'microtime' => 1768912371.141233,
'siteUrl' => 'https://crm.bitbylaw.com', 'siteUrl' => 'https://crm.bitbylaw.com',
'fullTextSearchMinLength' => 4, 'fullTextSearchMinLength' => 4,
'appTimestamp' => 1768843902, 'appTimestamp' => 1768843902,