Refactor AdvowareAkte ↔ CDokumente relationship from junction table to direct n:1 relationship

- Removed CAdvowareAktenCDokumente junction table and associated service.
- Updated CDokumente entity to include foreign key cAdvowareAktenId and related fields.
- Changed relationship in CDokumente from hasMany to belongsTo.
- Updated CAdvowareAkten to reflect new direct relationship.
- Implemented CDokumente service with duplicateDocument method for document duplication.
- Refactored hooks to support new relationship and document propagation.
- Removed obsolete API routes related to the junction table.
- Added i18n translations for new fields and updated tooltips.
- Document flow and auto-linking logic enhanced for better integration with Advoware.
- Validation checks passed, and no data migration needed.
This commit is contained in:
2026-03-23 20:36:10 +01:00
parent 0b829e9dfe
commit 22665948e4
22 changed files with 689 additions and 773 deletions

View File

@@ -3,6 +3,12 @@
"dokument": "Download",
"preview": "Vorschau",
"blake3hash": "Blake3-Hash",
"cAdvowareAkten": "Advoware Akte",
"cAdvowareAktenId": "Advoware Akten-ID",
"cAdvowareAktenName": "Advoware Aktenname",
"hnr": "HNR (Advoware)",
"syncStatus": "Sync-Status",
"syncedHash": "Sync-Hash",
"contactsvmhdokumente": "Freigegebene Nutzer",
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
"vmhErstgespraechsdokumente": "Erstgespräche",
@@ -12,16 +18,13 @@
"mietobjekt2dokumente": "Mietobjekte",
"mietinkassosdokumente": "Mietinkasso",
"kndigungensdokumente": "Kündigungen",
"advowareAktens": "Advoware Akten",
"aIKnowledges": "AI Knowledge",
"advowareAktenHnr": "Advoware HNR",
"advowareAktenSyncstatus": "Advoware Sync-Status",
"advowareAktenLastSync": "Advoware Letzter Sync",
"aiKnowledgeAiDocumentId": "AI Document ID",
"aiKnowledgeSyncstatus": "AI Sync-Status",
"aiKnowledgeLastSync": "AI Letzter Sync"
},
"links": {
"cAdvowareAkten": "Advoware Akte",
"contactsvmhdokumente": "Freigegebene Nutzer",
"vmhMietverhltnisesDokumente": "Mietverhältnisse",
"vmhErstgespraechsdokumente": "Erstgespräche",
@@ -31,13 +34,24 @@
"mietobjekt2dokumente": "Mietobjekte",
"mietinkassosdokumente": "Mietinkasso",
"kndigungensdokumente": "Kündigungen",
"advowareAktens": "Advoware Akten",
"aIKnowledges": "AI Knowledge"
},
"labels": {
"Create CDokumente": "Dokument erstellen"
},
"tooltips": {
"blake3hash": "Kryptografischer Blake3-Hash der Datei (schneller und sicherer als MD5/SHA256)"
"blake3hash": "Kryptografischer Blake3-Hash der Datei (schneller und sicherer als MD5/SHA256)",
"hnr": "Hierarchische Referenznummer in Advoware",
"syncStatus": "Status der Synchronisation mit Advoware: new=neu, unclean=geändert, synced=synchronisiert, failed=Fehler, unsupported=nicht unterstützt",
"syncedHash": "Hash-Wert bei letzter erfolgreicher Synchronisation"
},
"options": {
"syncStatus": {
"new": "Neu",
"unclean": "Geändert",
"synced": "Synchronisiert",
"failed": "Fehler",
"unsupported": "Nicht unterstützt"
}
}
}

View File

@@ -2,6 +2,12 @@
"fields": {
"dokument": "Download",
"preview": "Preview",
"cAdvowareAkten": "Advoware File",
"cAdvowareAktenId": "Advoware File ID",
"cAdvowareAktenName": "Advoware File Name",
"hnr": "HNR (Advoware)",
"syncStatus": "Sync Status",
"syncedHash": "Sync Hash",
"contactsvmhdokumente": "Portal Users",
"vmhMietverhltnisesDokumente": "Tenancies",
"vmhErstgespraechsdokumente": "Initial Consultations",
@@ -12,16 +18,13 @@
"mietobjekt2dokumente": "Properties",
"mietinkassosdokumente": "Rent Collection",
"kndigungensdokumente": "Terminations",
"advowareAktens": "Advoware Akten",
"aIKnowledges": "AI Knowledge",
"advowareAktenHnr": "Advoware HNR",
"advowareAktenSyncstatus": "Advoware Sync Status",
"advowareAktenLastSync": "Advoware Last Sync",
"aiKnowledgeAiDocumentId": "AI Document ID",
"aiKnowledgeSyncstatus": "AI Sync Status",
"aiKnowledgeLastSync": "AI Last Sync"
},
"links": {
"cAdvowareAkten": "Advoware File",
"contactsvmhdokumente": "Portal Users",
"vmhMietverhltnisesDokumente": "Tenancies",
"vmhErstgespraechsdokumente": "Initial Consultations",
@@ -31,7 +34,6 @@
"mietobjekt2dokumente": "Properties",
"mietinkassosdokumente": "Rent Collection",
"kndigungensdokumente": "Terminations",
"advowareAktens": "Advoware Akten",
"aIKnowledges": "AI Knowledge"
},
"labels": {
@@ -43,6 +45,18 @@
"listForAIKnowledge": "List for AI Knowledge"
},
"tooltips": {
"blake3hash": "Cryptographic Blake3 hash of the file (faster and more secure than MD5/SHA256)"
"blake3hash": "Cryptographic Blake3 hash of the file (faster and more secure than MD5/SHA256)",
"hnr": "Hierarchical reference number in Advoware",
"syncStatus": "Sync status with Advoware: new=new, unclean=changed, synced=synchronized, failed=error, unsupported=not supported",
"syncedHash": "Hash value at last successful synchronization"
},
"options": {
"syncStatus": {
"new": "New",
"unclean": "Changed",
"synced": "Synchronized",
"failed": "Failed",
"unsupported": "Unsupported"
}
}
}

View File

@@ -108,23 +108,27 @@
"dokumenteHnr": {
"type": "int",
"notStorable": true,
"utility": true
"utility": true,
"disabled": true
},
"dokumenteSyncstatus": {
"type": "enum",
"options": ["new", "unclean", "synced", "failed"],
"notStorable": true,
"utility": true
"utility": true,
"disabled": true
},
"dokumenteLastSync": {
"type": "datetime",
"notStorable": true,
"utility": true
"utility": true,
"disabled": true
},
"dokumenteSyncedHash": {
"type": "varchar",
"notStorable": true,
"utility": true
"utility": true,
"disabled": true
},
"dokumentes": {
"type": "linkMultiple",
@@ -135,16 +139,7 @@
"importDisabled": false,
"exportDisabled": false,
"customizationDisabled": false,
"columns": {
"hnr": "advowareAktenHnr",
"syncstatus": "advowareAktenSyncstatus",
"lastSync": "advowareAktenLastSync",
"syncedHash": "advowareAktenSyncedHash"
},
"additionalAttributeList": [
"columns"
],
"view": "views/fields/link-multiple-with-columns",
"disabled": true,
"isCustom": true
}
},
@@ -202,28 +197,10 @@
},
"dokumentes": {
"type": "hasMany",
"relationName": "cAdvowareAktenDokumente",
"foreign": "advowareAktens",
"foreign": "cAdvowareAkten",
"entity": "CDokumente",
"audited": true,
"isCustom": true,
"additionalColumns": {
"hnr": {
"type": "int"
},
"syncstatus": {
"type": "varchar",
"len": 20
},
"lastSync": {
"type": "datetime"
}
},
"columnAttributeMap": {
"hnr": "dokumenteHnr",
"syncstatus": "dokumenteSyncstatus",
"lastSync": "dokumenteLastSync"
}
"isCustom": true
}
},
"collection": {

View File

@@ -1,89 +0,0 @@
{
"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
},
"syncedHash": {
"type": "varchar",
"len": 64,
"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

@@ -61,35 +61,52 @@
"isCustom": true,
"tooltip": true
},
"cAdvowareAktenId": {
"type": "varchar",
"len": 17,
"index": true,
"isCustom": true
},
"cAdvowareAktenName": {
"type": "varchar",
"isCustom": true
},
"hnr": {
"type": "int",
"tooltip": true,
"isCustom": true
},
"syncStatus": {
"type": "enum",
"options": [
"new",
"unclean",
"synced",
"failed",
"unsupported"
],
"style": {
"new": "info",
"unclean": "warning",
"synced": "success",
"failed": "danger",
"unsupported": "default"
},
"default": "new",
"tooltip": true,
"isCustom": true
},
"syncedHash": {
"type": "varchar",
"len": 64,
"tooltip": true,
"isCustom": true
},
"puls": {
"type": "link",
"entity": "CPuls",
"isCustom": true
},
"advowareAktenHnr": {
"type": "int",
"notStorable": true,
"utility": true,
"layoutAvailabilityList": [
"listForAdvowareAkten"
]
},
"advowareAktenSyncstatus": {
"type": "varchar",
"notStorable": true,
"utility": true,
"layoutAvailabilityList": [
"listForAdvowareAkten"
]
},
"advowareAktenLastSync": {
"type": "datetime",
"notStorable": true,
"utility": true,
"layoutAvailabilityList": [
"listForAdvowareAkten"
]
},
"aiKnowledgeAiDocumentId": {
"type": "varchar",
"notStorable": true,
@@ -216,18 +233,12 @@
"audited": false,
"isCustom": true
},
"advowareAktens": {
"type": "hasMany",
"relationName": "cAdvowareAktenDokumente",
"cAdvowareAkten": {
"type": "belongsTo",
"foreign": "dokumentes",
"entity": "CAdvowareAkten",
"audited": false,
"isCustom": true,
"columnAttributeMap": {
"hnr": "advowareAktenHnr",
"syncstatus": "advowareAktenSyncstatus",
"lastSync": "advowareAktenLastSync"
}
"audited": true,
"isCustom": true
},
"aIKnowledges": {
"type": "hasMany",

View File

@@ -13,20 +13,5 @@
"route": "/JunctionData/CAIKnowledge/:knowledgeId/dokumentes/:documentId",
"method": "post",
"actionClassName": "Espo\\Custom\\Api\\JunctionData\\LinkDokument"
},
{
"route": "/JunctionData/CAdvowareAkten/:akteId/dokumentes",
"method": "get",
"actionClassName": "Espo\\Custom\\Api\\JunctionData\\GetAktenDokumentes"
},
{
"route": "/JunctionData/CAdvowareAkten/:akteId/dokumentes/:documentId",
"method": "put",
"actionClassName": "Espo\\Custom\\Api\\JunctionData\\UpdateAktenJunction"
},
{
"route": "/JunctionData/CAdvowareAkten/:akteId/dokumentes/:documentId",
"method": "post",
"actionClassName": "Espo\\Custom\\Api\\JunctionData\\LinkAktenDokument"
}
]