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:
121
README.md
121
README.md
@@ -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.).
|
||||
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.
|
||||
**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
|
||||
|
||||
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.
|
||||
- **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
|
||||
|
||||
@@ -221,3 +226,117 @@ Um die Entwicklung und Wartung zu erleichtern, wurden benutzerdefinierte Scripts
|
||||
- Sichere Backups vor Lösch- oder Edit-Operationen.
|
||||
- Für komplexe Änderungen die EspoCRM-UI verwenden.
|
||||
- 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
|
||||
Reference in New Issue
Block a user