Compare commits

...

2 Commits

Author SHA1 Message Date
641e5c0a91 Update cache timestamps and microtime values in configuration and state files 2026-03-10 12:24:35 +01:00
3470dba301 Add junction entities and ACL for CAICollection, CAdvowareAkten, and CPulsTeam
- Introduced new junction entities: CAICollectionCDokumente, CAdvowareAktenCDokumente, and CPulsTeamZuordnung.
- Implemented respective controllers and services for handling CRUD operations.
- Added metadata definitions for new entities, including fields, links, and indexes.
- Created language files for English and German translations for the new entities.
- Developed a script to set ACL permissions for the new junction entities across existing roles.
- Updated existing entity definitions to include new relationships and fields related to Advoware and AI Collections.
2026-03-10 00:10:57 +01:00
34 changed files with 920 additions and 18 deletions

View File

@@ -0,0 +1,23 @@
<?php
namespace Espo\Custom\Controllers;
use Espo\Core\Controllers\Record;
/**
* Junction Controller: CAICollection ↔ CDokumente
*
* Provides REST API access to the junction table with additionalColumns:
* - xaifileid: XAI external file ID
* - syncStatus: Sync state tracking
*/
class CAICollectionCDokumente extends Record
{
// Inherits all CRUD operations from Record controller
//
// Available endpoints:
// GET /api/v1/CAICollectionCDokumente
// GET /api/v1/CAICollectionCDokumente/{id}
// POST /api/v1/CAICollectionCDokumente
// PUT /api/v1/CAICollectionCDokumente/{id}
// DELETE /api/v1/CAICollectionCDokumente/{id}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace Espo\Custom\Controllers;
use Espo\Core\Controllers\Record;
/**
* Junction Controller: CAdvowareAkten ↔ CDokumente
*
* Provides REST API access to the junction table with additionalColumns:
* - hnr: Advoware HNR reference
* - syncStatus: Sync state tracking
*/
class CAdvowareAktenCDokumente extends Record
{
// Inherits all CRUD operations from Record controller
//
// Available endpoints:
// GET /api/v1/CAdvowareAktenCDokumente
// GET /api/v1/CAdvowareAktenCDokumente/{id}
// POST /api/v1/CAdvowareAktenCDokumente
// PUT /api/v1/CAdvowareAktenCDokumente/{id}
// DELETE /api/v1/CAdvowareAktenCDokumente/{id}
}

View File

@@ -1,7 +1,17 @@
{ {
"fields": {
"cAdvowareAkte": "Advoware-Akte",
"cAdvowareAkteId": "Advoware-Akte ID",
"cAdvowareAkteName": "Advoware-Akte Name"
},
"links": { "links": {
"meetings": "Termine",
"calls": "Anrufe", "calls": "Anrufe",
"tasks": "Aufgaben" "tasks": "Aufgaben",
"cDokumente": "Dokumente",
"cAdvowareAkte": "Advoware-Akte",
"cmietinkassos": "Mietinkassos",
"cvmhRumungsklages": "Räumungsklagen"
}, },
"labels": { "labels": {
"Create CAICollection": "AI Collection erstellen" "Create CAICollection": "AI Collection erstellen"

View File

@@ -0,0 +1,31 @@
{
"labels": {
"Create CAICollectionCDokumente": "AI-Collection-Dokument-Verknüpfung erstellen",
"CAICollectionCDokumente": "AI-Collection-Dokument-Verknüpfungen"
},
"fields": {
"cAICollection": "AI-Collection",
"cAICollectionId": "AI-Collection ID",
"cDokumente": "Dokument",
"cDokumenteId": "Dokument ID",
"xaifileid": "XAI File ID",
"syncStatus": "Sync-Status",
"deleted": "Gelöscht"
},
"links": {
"cAICollection": "AI-Collection",
"cDokumente": "Dokument"
},
"options": {
"syncStatus": {
"new": "Neu",
"changed": "Geändert",
"synced": "Synchronisiert",
"deleted": "Gelöscht"
}
},
"tooltips": {
"xaifileid": "Externe XAI File ID für dieses Dokument",
"syncStatus": "Synchronisierungsstatus mit XAI"
}
}

View File

@@ -1,7 +1,12 @@
{ {
"links": { "links": {
"meetings": "Termine",
"calls": "Anrufe", "calls": "Anrufe",
"tasks": "Aufgaben" "tasks": "Aufgaben",
"cDokumente": "Dokumente",
"cAICollection": "AI Collection",
"cmietinkassos": "Mietinkassos",
"cvmhRumungsklages": "Räumungsklagen"
}, },
"labels": { "labels": {
"Create CAdvowareAkten": "Advoware Akte erstellen" "Create CAdvowareAkten": "Advoware Akte erstellen"

View File

@@ -0,0 +1,31 @@
{
"labels": {
"Create CAdvowareAktenCDokumente": "Advoware-Dokument-Verknüpfung erstellen",
"CAdvowareAktenCDokumente": "Advoware-Dokument-Verknüpfungen"
},
"fields": {
"cAdvowareAkten": "Advoware-Akte",
"cAdvowareAktenId": "Advoware-Akte ID",
"cDokumente": "Dokument",
"cDokumenteId": "Dokument ID",
"hnr": "HNR",
"syncStatus": "Sync-Status",
"deleted": "Gelöscht"
},
"links": {
"cAdvowareAkten": "Advoware-Akte",
"cDokumente": "Dokument"
},
"options": {
"syncStatus": {
"new": "Neu",
"changed": "Geändert",
"synced": "Synchronisiert",
"deleted": "Gelöscht"
}
},
"tooltips": {
"hnr": "Advoware HNR Referenz für dieses Dokument",
"syncStatus": "Synchronisierungsstatus mit Advoware"
}
}

View File

@@ -31,7 +31,9 @@
"beteiligte2dokumente": "Beteiligte", "beteiligte2dokumente": "Beteiligte",
"mietobjekt2dokumente": "Mietobjekte", "mietobjekt2dokumente": "Mietobjekte",
"mietinkassosdokumente": "Mietinkasso", "mietinkassosdokumente": "Mietinkasso",
"kndigungensdokumente": "Kündigungen" "kndigungensdokumente": "Kündigungen",
"cAICollections": "AI Collections",
"cAdvowareAkten": "Advoware-Akten"
}, },
"labels": { "labels": {
"Create CDokumente": "Dokument erstellen" "Create CDokumente": "Dokument erstellen"

View File

@@ -17,7 +17,13 @@
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz", "anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)", "freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
"collaborators": "Mitarbeiter", "collaborators": "Mitarbeiter",
"vmhVermietersMIK": "Vermieter" "vmhVermietersMIK": "Vermieter",
"cAdvowareAkte": "Advoware-Akte",
"cAdvowareAkteId": "Advoware-Akte ID",
"cAdvowareAkteName": "Advoware-Akte Name",
"cAICollection": "AI Collection",
"cAICollectionId": "AI Collection ID",
"cAICollectionName": "AI Collection Name"
}, },
"links": { "links": {
"meetings": "Termine", "meetings": "Termine",
@@ -31,7 +37,9 @@
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)", "freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
"collaborators": "Mitarbeiter", "collaborators": "Mitarbeiter",
"vmhVermietersMIK": "Vermieter", "vmhVermietersMIK": "Vermieter",
"pulse": "Pulse" "pulse": "Pulse",
"cAdvowareAkte": "Advoware-Akte",
"cAICollection": "AI Collection"
}, },
"labels": { "labels": {
"Create CMietinkasso": "Mietinkasso erstellen" "Create CMietinkasso": "Mietinkasso erstellen"

View File

@@ -0,0 +1,27 @@
{
"labels": {
"Create CPulsTeamZuordnung": "Puls-Team-Zuordnung erstellen",
"CPulsTeamZuordnung": "Puls-Team-Zuordnungen"
},
"fields": {
"puls": "Puls",
"pulsId": "Puls ID",
"team": "Team",
"teamId": "Team ID",
"aktiv": "Aktiv",
"abgeschlossen": "Abgeschlossen",
"prioritaet": "Priorität"
},
"links": {
"puls": "Puls",
"team": "Team"
},
"options": {
"prioritaet": {
"Niedrig": "Niedrig",
"Normal": "Normal",
"Hoch": "Hoch",
"Dringend": "Dringend"
}
}
}

View File

@@ -19,7 +19,13 @@
"anwaltskosten1Instanz": "Anwaltskosten 1. Instanz", "anwaltskosten1Instanz": "Anwaltskosten 1. Instanz",
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)", "freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
"collaborators": "Mitarbeiter", "collaborators": "Mitarbeiter",
"vmhVermietersRKL": "Vermieter" "vmhVermietersRKL": "Vermieter",
"cAdvowareAkte": "Advoware-Akte",
"cAdvowareAkteId": "Advoware-Akte ID",
"cAdvowareAkteName": "Advoware-Akte Name",
"cAICollection": "AI Collection",
"cAICollectionId": "AI Collection ID",
"cAICollectionName": "AI Collection Name"
}, },
"links": { "links": {
"meetings": "Termine", "meetings": "Termine",
@@ -33,7 +39,9 @@
"freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)", "freigeschalteteNutzer": "Freigeschaltete Nutzer (veraltet)",
"collaborators": "Mitarbeiter", "collaborators": "Mitarbeiter",
"vmhVermietersRKL": "Vermieter", "vmhVermietersRKL": "Vermieter",
"pulse": "Pulse" "pulse": "Pulse",
"cAdvowareAkte": "Advoware-Akte",
"cAICollection": "AI Collection"
}, },
"labels": { "labels": {
"Create CVmhRumungsklage": "Räumungsklage erstellen" "Create CVmhRumungsklage": "Räumungsklage erstellen"

View File

@@ -1,10 +1,17 @@
{ {
"fields": { "fields": {
"cAdvowareAkte": "Advoware File",
"cAdvowareAkteId": "Advoware File ID",
"cAdvowareAkteName": "Advoware File Name"
}, },
"links": { "links": {
"meetings": "Meetings", "meetings": "Meetings",
"calls": "Calls", "calls": "Calls",
"tasks": "Tasks" "tasks": "Tasks",
"cDokumente": "Documents",
"cAdvowareAkte": "Advoware File",
"cmietinkassos": "Mietinkassos",
"cvmhRumungsklages": "Räumungsklagen"
}, },
"labels": { "labels": {
"Create CAICollection": "Create AI Collection" "Create CAICollection": "Create AI Collection"

View File

@@ -0,0 +1,31 @@
{
"labels": {
"Create CAICollectionCDokumente": "Create AI Collection Document Link",
"CAICollectionCDokumente": "AI Collection Document Links"
},
"fields": {
"cAICollection": "AI Collection",
"cAICollectionId": "AI Collection ID",
"cDokumente": "Document",
"cDokumenteId": "Document ID",
"xaifileid": "XAI File ID",
"syncStatus": "Sync Status",
"deleted": "Deleted"
},
"links": {
"cAICollection": "AI Collection",
"cDokumente": "Document"
},
"options": {
"syncStatus": {
"new": "New",
"changed": "Changed",
"synced": "Synced",
"deleted": "Deleted"
}
},
"tooltips": {
"xaifileid": "External XAI file ID for this document",
"syncStatus": "Synchronization status with XAI"
}
}

View File

@@ -4,7 +4,11 @@
"links": { "links": {
"meetings": "Meetings", "meetings": "Meetings",
"calls": "Calls", "calls": "Calls",
"tasks": "Tasks" "tasks": "Tasks",
"cDokumente": "Documents",
"cAICollection": "AI Collection",
"cmietinkassos": "Mietinkassos",
"cvmhRumungsklages": "Räumungsklagen"
}, },
"labels": { "labels": {
"Create CAdvowareAkten": "Create Advoware Akte" "Create CAdvowareAkten": "Create Advoware Akte"

View File

@@ -0,0 +1,31 @@
{
"labels": {
"Create CAdvowareAktenCDokumente": "Create Advoware Document Link",
"CAdvowareAktenCDokumente": "Advoware Document Links"
},
"fields": {
"cAdvowareAkten": "Advoware File",
"cAdvowareAktenId": "Advoware File ID",
"cDokumente": "Document",
"cDokumenteId": "Document ID",
"hnr": "HNR",
"syncStatus": "Sync Status",
"deleted": "Deleted"
},
"links": {
"cAdvowareAkten": "Advoware File",
"cDokumente": "Document"
},
"options": {
"syncStatus": {
"new": "New",
"changed": "Changed",
"synced": "Synced",
"deleted": "Deleted"
}
},
"tooltips": {
"hnr": "Advoware HNR reference for this document",
"syncStatus": "Synchronization status with Advoware"
}
}

View File

@@ -31,7 +31,9 @@
"beteiligte2dokumente": "Parties", "beteiligte2dokumente": "Parties",
"mietobjekt2dokumente": "Properties", "mietobjekt2dokumente": "Properties",
"mietinkassosdokumente": "Rent Collection", "mietinkassosdokumente": "Rent Collection",
"kndigungensdokumente": "Terminations" "kndigungensdokumente": "Terminations",
"cAICollections": "AI Collections",
"cAdvowareAkten": "Advoware Files"
}, },
"labels": { "labels": {
"Create CDokumente": "Create Dokument" "Create CDokumente": "Create Dokument"

View File

@@ -17,7 +17,13 @@
"anwaltskosten1Instanz": "Attorney Fees 1st Instance", "anwaltskosten1Instanz": "Attorney Fees 1st Instance",
"freigeschalteteNutzer": "Activated Users (deprecated)", "freigeschalteteNutzer": "Activated Users (deprecated)",
"collaborators": "Collaborators", "collaborators": "Collaborators",
"vmhVermietersMIK": "Landlord" "vmhVermietersMIK": "Landlord",
"cAdvowareAkte": "Advoware File",
"cAdvowareAkteId": "Advoware File ID",
"cAdvowareAkteName": "Advoware File Name",
"cAICollection": "AI Collection",
"cAICollectionId": "AI Collection ID",
"cAICollectionName": "AI Collection Name"
}, },
"links": { "links": {
"meetings": "Meetings", "meetings": "Meetings",
@@ -31,7 +37,9 @@
"freigeschalteteNutzer": "Activated Users (deprecated)", "freigeschalteteNutzer": "Activated Users (deprecated)",
"collaborators": "Collaborators", "collaborators": "Collaborators",
"vmhVermietersMIK": "Landlord", "vmhVermietersMIK": "Landlord",
"pulse": "Pulses" "pulse": "Pulses",
"cAdvowareAkte": "Advoware File",
"cAICollection": "AI Collection"
}, },
"labels": { "labels": {
"Create CMietinkasso": "Create Mietinkasso" "Create CMietinkasso": "Create Mietinkasso"

View File

@@ -0,0 +1,27 @@
{
"labels": {
"Create CPulsTeamZuordnung": "Create Puls Team Assignment",
"CPulsTeamZuordnung": "Puls Team Assignments"
},
"fields": {
"puls": "Puls",
"pulsId": "Puls ID",
"team": "Team",
"teamId": "Team ID",
"aktiv": "Active",
"abgeschlossen": "Completed",
"prioritaet": "Priority"
},
"links": {
"puls": "Puls",
"team": "Team"
},
"options": {
"prioritaet": {
"Niedrig": "Low",
"Normal": "Normal",
"Hoch": "High",
"Dringend": "Urgent"
}
}
}

View File

@@ -12,7 +12,13 @@
"kuendigungsservice": "Termination Service", "kuendigungsservice": "Termination Service",
"aussergerichtlicheGebuehren13": "Out-of-Court Fees 1.3", "aussergerichtlicheGebuehren13": "Out-of-Court Fees 1.3",
"gerichtskosten1Instanz": "Court Costs 1st Instance", "gerichtskosten1Instanz": "Court Costs 1st Instance",
"anwaltskosten1Instanz": "Attorney Fees 1st Instance" "anwaltskosten1Instanz": "Attorney Fees 1st Instance",
"cAdvowareAkte": "Advoware File",
"cAdvowareAkteId": "Advoware File ID",
"cAdvowareAkteName": "Advoware File Name",
"cAICollection": "AI Collection",
"cAICollectionId": "AI Collection ID",
"cAICollectionName": "AI Collection Name"
}, },
"links": { "links": {
"meetings": "Meetings", "meetings": "Meetings",
@@ -26,7 +32,9 @@
"beklagte": "Defendant", "beklagte": "Defendant",
"klaeger": "Plaintiff", "klaeger": "Plaintiff",
"contactsRumungsklage": "Portal Users", "contactsRumungsklage": "Portal Users",
"pulse": "Pulses" "pulse": "Pulses",
"cAdvowareAkte": "Advoware File",
"cAICollection": "AI Collection"
}, },
"labels": { "labels": {
"Create CVmhRumungsklage": "Create Räumungsklage" "Create CVmhRumungsklage": "Create Räumungsklage"

View File

@@ -75,6 +75,42 @@
"entity": "Email", "entity": "Email",
"foreign": "parent", "foreign": "parent",
"layoutRelationshipsDisabled": true "layoutRelationshipsDisabled": true
},
"cDokumente": {
"type": "hasMany",
"entity": "CDokumente",
"foreign": "cAICollections",
"relationName": "cAICollectionCDokumente",
"additionalColumns": {
"xaifileid": {
"type": "varchar",
"len": 255
},
"syncStatus": {
"type": "varchar",
"len": 50,
"default": "new"
}
},
"isCustom": true
},
"cAdvowareAkte": {
"type": "belongsTo",
"entity": "CAdvowareAkten",
"foreign": "cAICollection",
"isCustom": true
},
"cmietinkassos": {
"type": "hasMany",
"entity": "CMietinkasso",
"foreign": "cAICollection",
"isCustom": true
},
"cvmhRumungsklages": {
"type": "hasMany",
"entity": "CVmhRumungsklage",
"foreign": "cAICollection",
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -0,0 +1,87 @@
{
"fields": {
"id": {
"type": "id",
"dbType": "bigint",
"autoincrement": true
},
"cAICollection": {
"type": "link"
},
"cAICollectionId": {
"type": "varchar",
"len": 17,
"index": true
},
"cDokumente": {
"type": "link"
},
"cDokumenteId": {
"type": "varchar",
"len": 17,
"index": true
},
"xaifileid": {
"type": "varchar",
"len": 255,
"isCustom": true,
"tooltip": true,
"copyToClipboard": true
},
"syncStatus": {
"type": "enum",
"required": false,
"options": [
"new",
"changed",
"synced",
"deleted"
],
"style": {
"new": "info",
"changed": "warning",
"synced": "success",
"deleted": "danger"
},
"default": "new",
"isCustom": true,
"tooltip": true
},
"deleted": {
"type": "bool",
"default": false
}
},
"links": {
"cAICollection": {
"type": "belongsTo",
"entity": "CAICollection"
},
"cDokumente": {
"type": "belongsTo",
"entity": "CDokumente"
}
},
"collection": {
"orderBy": "id",
"order": "desc"
},
"indexes": {
"cAICollectionId": {
"columns": ["cAICollectionId"]
},
"cDokumenteId": {
"columns": ["cDokumenteId"]
},
"xaifileid": {
"columns": ["xaifileid"]
},
"syncStatus": {
"columns": ["syncStatus"]
},
"uniqueRelation": {
"type": "unique",
"columns": ["cAICollectionId", "cDokumenteId", "deleted"]
}
}
}

View File

@@ -75,6 +75,42 @@
"entity": "Email", "entity": "Email",
"foreign": "parent", "foreign": "parent",
"layoutRelationshipsDisabled": true "layoutRelationshipsDisabled": true
},
"cDokumente": {
"type": "hasMany",
"entity": "CDokumente",
"foreign": "cAdvowareAkten",
"relationName": "cAdvowareAktenCDokumente",
"additionalColumns": {
"hnr": {
"type": "varchar",
"len": 255
},
"syncStatus": {
"type": "varchar",
"len": 50,
"default": "new"
}
},
"isCustom": true
},
"cAICollection": {
"type": "hasOne",
"entity": "CAICollection",
"foreign": "cAdvowareAkte",
"isCustom": true
},
"cmietinkassos": {
"type": "hasMany",
"entity": "CMietinkasso",
"foreign": "cAdvowareAkte",
"isCustom": true
},
"cvmhRumungsklages": {
"type": "hasMany",
"entity": "CVmhRumungsklage",
"foreign": "cAdvowareAkte",
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -0,0 +1,83 @@
{
"fields": {
"id": {
"type": "id",
"dbType": "bigint",
"autoincrement": true
},
"cAdvowareAkten": {
"type": "link"
},
"cAdvowareAktenId": {
"type": "varchar",
"len": 17,
"index": true
},
"cDokumente": {
"type": "link"
},
"cDokumenteId": {
"type": "varchar",
"len": 17,
"index": true
},
"hnr": {
"type": "varchar",
"len": 255,
"isCustom": true,
"tooltip": true
},
"syncStatus": {
"type": "enum",
"required": false,
"options": [
"new",
"changed",
"synced",
"deleted"
],
"style": {
"new": "info",
"changed": "warning",
"synced": "success",
"deleted": "danger"
},
"default": "new",
"isCustom": true,
"tooltip": true
},
"deleted": {
"type": "bool",
"default": false
}
},
"links": {
"cAdvowareAkten": {
"type": "belongsTo",
"entity": "CAdvowareAkten"
},
"cDokumente": {
"type": "belongsTo",
"entity": "CDokumente"
}
},
"collection": {
"orderBy": "id",
"order": "desc"
},
"indexes": {
"cAdvowareAktenId": {
"columns": ["cAdvowareAktenId"]
},
"cDokumenteId": {
"columns": ["cDokumenteId"]
},
"syncStatus": {
"columns": ["syncStatus"]
},
"uniqueRelation": {
"type": "unique",
"columns": ["cAdvowareAktenId", "cDokumenteId", "deleted"]
}
}
}

View File

@@ -263,6 +263,42 @@
"entity": "CMietobjekt", "entity": "CMietobjekt",
"audited": false, "audited": false,
"isCustom": true "isCustom": true
},
"cAICollections": {
"type": "hasMany",
"entity": "CAICollection",
"foreign": "cDokumente",
"relationName": "cAICollectionCDokumente",
"additionalColumns": {
"xaifileid": {
"type": "varchar",
"len": 255
},
"syncStatus": {
"type": "varchar",
"len": 50,
"default": "new"
}
},
"isCustom": true
},
"cAdvowareAkten": {
"type": "hasMany",
"entity": "CAdvowareAkten",
"foreign": "cDokumente",
"relationName": "cAdvowareAktenCDokumente",
"additionalColumns": {
"hnr": {
"type": "varchar",
"len": 255
},
"syncStatus": {
"type": "varchar",
"len": 50,
"default": "new"
}
},
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -128,6 +128,24 @@
"required": false, "required": false,
"default": 0, "default": 0,
"isCustom": true "isCustom": true
},
"cAdvowareAkteId": {
"type": "varchar",
"len": 17,
"isCustom": true
},
"cAdvowareAkteName": {
"type": "varchar",
"isCustom": true
},
"cAICollectionId": {
"type": "varchar",
"len": 17,
"isCustom": true
},
"cAICollectionName": {
"type": "varchar",
"isCustom": true
} }
}, },
"links": { "links": {
@@ -234,7 +252,19 @@
"type": "hasMany", "type": "hasMany",
"entity": "CPuls", "entity": "CPuls",
"foreign": "parent", "foreign": "parent",
"isCustom": true } "isCustom": true },
"cAdvowareAkte": {
"type": "belongsTo",
"entity": "CAdvowareAkten",
"foreign": "cmietinkassos",
"isCustom": true
},
"cAICollection": {
"type": "belongsTo",
"entity": "CAICollection",
"foreign": "cmietinkassos",
"isCustom": true
}
}, },
"collection": { "collection": {
"orderBy": "createdAt", "orderBy": "createdAt",

View File

@@ -0,0 +1,68 @@
{
"fields": {
"puls": {
"type": "link"
},
"pulsId": {
"type": "varchar",
"len": 17
},
"team": {
"type": "link"
},
"teamId": {
"type": "varchar",
"len": 17
},
"aktiv": {
"type": "bool",
"default": true
},
"abgeschlossen": {
"type": "bool",
"default": false
},
"prioritaet": {
"type": "enum",
"options": ["Niedrig", "Normal", "Hoch", "Dringend"],
"default": "Normal"
},
"createdAt": {
"type": "datetime",
"readOnly": true
},
"modifiedAt": {
"type": "datetime",
"readOnly": true
}
},
"links": {
"puls": {
"type": "belongsTo",
"entity": "CPuls",
"foreign": "teamZuordnungen"
},
"team": {
"type": "belongsTo",
"entity": "Team"
}
},
"collection": {
"orderBy": "createdAt",
"order": "desc"
},
"indexes": {
"pulsId": {
"columns": ["pulsId"]
},
"teamId": {
"columns": ["teamId"]
},
"aktiv": {
"columns": ["aktiv"]
},
"abgeschlossen": {
"columns": ["abgeschlossen"]
}
}
}

View File

@@ -136,6 +136,24 @@
"required": false, "required": false,
"default": 0, "default": 0,
"isCustom": true "isCustom": true
},
"cAdvowareAkteId": {
"type": "varchar",
"len": 17,
"isCustom": true
},
"cAdvowareAkteName": {
"type": "varchar",
"isCustom": true
},
"cAICollectionId": {
"type": "varchar",
"len": 17,
"isCustom": true
},
"cAICollectionName": {
"type": "varchar",
"isCustom": true
} }
}, },
"links": { "links": {
@@ -244,6 +262,18 @@
"entity": "CPuls", "entity": "CPuls",
"foreign": "parent", "foreign": "parent",
"isCustom": true "isCustom": true
},
"cAdvowareAkte": {
"type": "belongsTo",
"entity": "CAdvowareAkten",
"foreign": "cvmhRumungsklages",
"isCustom": true
},
"cAICollection": {
"type": "belongsTo",
"entity": "CAICollection",
"foreign": "cvmhRumungsklages",
"isCustom": true
} }
}, },
"collection": { "collection": {

View File

@@ -0,0 +1,10 @@
{
"entity": true,
"type": "Base",
"module": "Custom",
"object": true,
"isCustom": true,
"tab": false,
"acl": true,
"disabled": false
}

View File

@@ -0,0 +1,10 @@
{
"entity": true,
"type": "Base",
"module": "Custom",
"object": true,
"isCustom": true,
"tab": false,
"acl": true,
"disabled": false
}

View File

@@ -0,0 +1,10 @@
{
"entity": true,
"type": "Base",
"module": "Custom",
"object": true,
"isCustom": true,
"tab": false,
"acl": true,
"disabled": false
}

View File

@@ -0,0 +1,14 @@
<?php
namespace Espo\Custom\Services;
use Espo\Services\Record;
/**
* Junction Service: CAICollection ↔ CDokumente
*
* Handles business logic for the junction table.
*/
class CAICollectionCDokumente extends Record
{
// Standard CRUD logic inherited from Record service
}

View File

@@ -0,0 +1,14 @@
<?php
namespace Espo\Custom\Services;
use Espo\Services\Record;
/**
* Junction Service: CAdvowareAkten ↔ CDokumente
*
* Handles business logic for the junction table.
*/
class CAdvowareAktenCDokumente extends Record
{
// Standard CRUD logic inherited from Record service
}

View File

@@ -0,0 +1,152 @@
#!/usr/bin/env php
<?php
/**
* ACL-Berechtigungen für neue Junction Entities setzen
*
* Dieses Skript fügt ACL-Berechtigungen für die folgenden Entities hinzu:
* - CAdvowareAktenCDokumente
* - CAICollectionCDokumente
* - CPulsTeamZuordnung
*
* Usage: php custom/scripts/set_junction_acl.php
*/
// Lade EspoCRM Config
$configFile = 'data/config-internal.php';
if (!file_exists($configFile)) {
die("❌ Config-Datei nicht gefunden: {$configFile}\n");
}
$config = include $configFile;
$db = $config['database'];
try {
// Datenbankverbindung
$pdo = new PDO(
"mysql:host={$db['host']};dbname={$db['dbname']}",
$db['user'],
$db['password']
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "================================================================\n";
echo " ACL-Berechtigungen für Junction Entities setzen\n";
echo "================================================================\n\n";
// Entities, für die ACL-Berechtigungen gesetzt werden sollen
$entities = [
'CAdvowareAktenCDokumente' => 'Advoware-Dokumente Junction',
'CAICollectionCDokumente' => 'AI Collection-Dokumente Junction',
'CPulsTeamZuordnung' => 'Puls-Team-Zuordnung'
];
// Hole alle Rollen
$stmt = $pdo->query("SELECT id, name, data FROM role WHERE deleted = 0");
$roles = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Gefundene Rollen: " . count($roles) . "\n\n";
$updatedCount = 0;
foreach ($roles as $role) {
$roleName = $role['name'];
$roleId = $role['id'];
$data = json_decode($role['data'], true);
// Prüfe ob ACL-Daten existieren
if (!isset($data['table'])) {
$data['table'] = [];
}
$hasChanges = false;
// Füge ACL für jede Entity hinzu
foreach ($entities as $entity => $description) {
if (!isset($data['table'][$entity])) {
// Setze Standard-Berechtigungen basierend auf der Rolle
if (stripos($roleName, 'admin') !== false) {
// Administrator: Volle Rechte
$data['table'][$entity] = [
'create' => 'yes',
'read' => 'all',
'edit' => 'all',
'delete' => 'all'
];
} else {
// Andere Rollen: Leserechte
$data['table'][$entity] = [
'create' => 'yes',
'read' => 'own',
'edit' => 'own',
'delete' => 'no'
];
}
$hasChanges = true;
echo "{$entity} zu Rolle '{$roleName}' hinzugefügt\n";
}
}
// Speichere nur wenn Änderungen vorgenommen wurden
if ($hasChanges) {
$jsonData = json_encode($data, JSON_UNESCAPED_UNICODE);
$updateStmt = $pdo->prepare("UPDATE role SET data = :data WHERE id = :id");
$updateStmt->execute([
':data' => $jsonData,
':id' => $roleId
]);
$updatedCount++;
echo " → Rolle '{$roleName}' aktualisiert\n\n";
}
}
echo "================================================================\n";
echo " ZUSAMMENFASSUNG\n";
echo "================================================================\n\n";
echo "{$updatedCount} von " . count($roles) . " Rollen aktualisiert\n\n";
if ($updatedCount > 0) {
echo "Hinweis: Cache muss geleert werden!\n";
echo "Führe aus: python3 custom/scripts/validate_and_rebuild.py\n\n";
} else {
echo " Keine Änderungen notwendig - alle Rollen haben bereits ACL für diese Entities\n\n";
}
// Zeige ACL-Status
echo "================================================================\n";
echo " ACL-STATUS PRO ROLLE\n";
echo "================================================================\n\n";
foreach ($roles as $role) {
$roleName = $role['name'];
$data = json_decode($role['data'], true);
echo "Rolle: {$roleName}\n";
echo str_repeat("-", 60) . "\n";
foreach ($entities as $entity => $description) {
if (isset($data['table'][$entity])) {
$acl = $data['table'][$entity];
echo sprintf(
" %-30s C:%-4s R:%-4s E:%-4s D:%-4s\n",
$entity,
$acl['create'] ?? 'no',
$acl['read'] ?? 'no',
$acl['edit'] ?? 'no',
$acl['delete'] ?? 'no'
);
} else {
echo " {$entity}: ⚠ KEINE ACL\n";
}
}
echo "\n";
}
} catch (PDOException $e) {
echo "❌ Datenbankfehler: " . $e->getMessage() . "\n";
exit(1);
} catch (Exception $e) {
echo "❌ Fehler: " . $e->getMessage() . "\n";
exit(1);
}
echo "✅ Erfolgreich abgeschlossen\n";

View File

@@ -360,7 +360,7 @@ return [
0 => 'youtube.com', 0 => 'youtube.com',
1 => 'google.com' 1 => 'google.com'
], ],
'microtime' => 1773097042.742692, 'microtime' => 1773141794.293915,
'siteUrl' => 'https://crm.bitbylaw.com', 'siteUrl' => 'https://crm.bitbylaw.com',
'fullTextSearchMinLength' => 4, 'fullTextSearchMinLength' => 4,
'webSocketUrl' => 'ws://api.bitbylaw.com:5000/espocrm/ws', 'webSocketUrl' => 'ws://api.bitbylaw.com:5000/espocrm/ws',

View File

@@ -1,7 +1,7 @@
<?php <?php
return [ return [
'cacheTimestamp' => 1773097042, 'cacheTimestamp' => 1773141794,
'microtimeState' => 1773097042.98789, 'microtimeState' => 1773141794.444418,
'currencyRates' => [ 'currencyRates' => [
'EUR' => 1.0 'EUR' => 1.0
], ],