Add AdvowareAkte and AIKnowledge creation for Kündigungen; synchronize between Kündigungen and Räumungsklagen; update localization and metadata files
This commit is contained in:
@@ -12,21 +12,20 @@ use Espo\Core\Utils\File\Manager as FileManager;
|
||||
*/
|
||||
class CDokumente extends Record
|
||||
{
|
||||
private FileStorageManager $fileStorageManager;
|
||||
private FileManager $fileManager;
|
||||
|
||||
/**
|
||||
* Inject additional dependencies via setter methods
|
||||
* EspoCRM DI will automatically call these
|
||||
* Get FileStorageManager from container on-demand
|
||||
*/
|
||||
public function injectFileStorageManager(FileStorageManager $fileStorageManager): void
|
||||
private function getFileStorageManager(): FileStorageManager
|
||||
{
|
||||
$this->fileStorageManager = $fileStorageManager;
|
||||
return $this->injectableFactory->create(FileStorageManager::class);
|
||||
}
|
||||
|
||||
public function injectFileManager(FileManager $fileManager): void
|
||||
/**
|
||||
* Get FileManager from container on-demand
|
||||
*/
|
||||
private function getFileManager(): FileManager
|
||||
{
|
||||
$this->fileManager = $fileManager;
|
||||
return $this->injectableFactory->create(FileManager::class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -120,14 +119,14 @@ class CDokumente extends Record
|
||||
private function duplicateAttachment(Entity $sourceAttachment): Entity
|
||||
{
|
||||
// 1. Get source file path
|
||||
$sourceFilePath = $this->fileStorageManager->getLocalFilePath($sourceAttachment);
|
||||
$sourceFilePath = $this->getFileStorageManager()->getLocalFilePath($sourceAttachment);
|
||||
|
||||
if (!file_exists($sourceFilePath)) {
|
||||
throw new \RuntimeException('Source file not found: ' . $sourceFilePath);
|
||||
}
|
||||
|
||||
// 2. Read source file content
|
||||
$fileContent = $this->fileManager->getContents($sourceFilePath);
|
||||
$fileContent = $this->getFileManager()->getContents($sourceFilePath);
|
||||
|
||||
// 3. Create new attachment entity
|
||||
$newAttachment = $this->entityManager->getEntity('Attachment');
|
||||
@@ -142,7 +141,7 @@ class CDokumente extends Record
|
||||
$this->entityManager->saveEntity($newAttachment);
|
||||
|
||||
// 4. Write file content to new location
|
||||
$this->fileStorageManager->putContents($newAttachment, $fileContent);
|
||||
$this->getFileStorageManager()->putContents($newAttachment, $fileContent);
|
||||
|
||||
// 5. Return new attachment
|
||||
return $newAttachment;
|
||||
|
||||
@@ -129,6 +129,9 @@ class CVmhMietverhltnis extends \Espo\Services\Record
|
||||
->relate($bewohner);
|
||||
}
|
||||
|
||||
// 9c. Create AdvowareAkte and AIKnowledge (BEFORE document duplication!)
|
||||
$this->createAdvowareAkteAndAIKnowledge($mietinkasso, $mietinkassoRepo);
|
||||
|
||||
// 10. Copy all documents from Mietverhältnis, Mietobjekt and Beteiligte
|
||||
// Get CDokumente service for duplication
|
||||
$dokumenteService = $this->injectableFactory->create(\Espo\Custom\Services\CDokumente::class);
|
||||
@@ -367,6 +370,68 @@ class CVmhMietverhltnis extends \Espo\Services\Record
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create AdvowareAkte and AIKnowledge for Mietinkasso
|
||||
*
|
||||
* @param object $mietinkasso The created Mietinkasso entity
|
||||
* @param object $mietinkassoRepo Repository for relations
|
||||
*/
|
||||
private function createAdvowareAkteAndAIKnowledge($mietinkasso, $mietinkassoRepo): void
|
||||
{
|
||||
// 1. Create AdvowareAkte
|
||||
$aktennummer = time(); // Simple timestamp-based generation
|
||||
$aktenzeichen = 'AZ-' . date('Y-m-d-His');
|
||||
|
||||
$advowareAkteData = [
|
||||
'name' => 'Advoware Akte - ' . $mietinkasso->get('name'),
|
||||
'aktennummer' => $aktennummer,
|
||||
'aktenzeichen' => $aktenzeichen,
|
||||
'syncStatus' => 'unclean',
|
||||
'assignedUserId' => $mietinkasso->get('assignedUserId')
|
||||
];
|
||||
|
||||
// Copy teams
|
||||
$teamsIds = $mietinkasso->getLinkMultipleIdList('teams');
|
||||
if (!empty($teamsIds)) {
|
||||
$advowareAkteData['teamsIds'] = $teamsIds;
|
||||
}
|
||||
|
||||
$advowareAkte = $this->entityManager->createEntity('CAdvowareAkten', $advowareAkteData);
|
||||
|
||||
if ($advowareAkte) {
|
||||
// Link AdvowareAkte to Mietinkasso (hasOne relationship - set field directly)
|
||||
$mietinkasso->set('advowareAktenId', $advowareAkte->getId());
|
||||
$this->entityManager->saveEntity($mietinkasso);
|
||||
$GLOBALS['log']->info("CVmhMietverhltnis: Created and linked AdvowareAkte for Mietinkasso: {$advowareAkte->getId()}");
|
||||
} else {
|
||||
$GLOBALS['log']->error('CVmhMietverhltnis: Failed to create AdvowareAkte for Mietinkasso');
|
||||
}
|
||||
|
||||
// 2. Create AIKnowledge
|
||||
$aiKnowledgeData = [
|
||||
'name' => 'AI Knowledge - ' . $mietinkasso->get('name'),
|
||||
'aktivierungsstatus' => 'deactivated',
|
||||
'syncStatus' => 'unclean',
|
||||
'assignedUserId' => $mietinkasso->get('assignedUserId')
|
||||
];
|
||||
|
||||
// Copy teams
|
||||
if (!empty($teamsIds)) {
|
||||
$aiKnowledgeData['teamsIds'] = $teamsIds;
|
||||
}
|
||||
|
||||
$aiKnowledge = $this->entityManager->createEntity('CAIKnowledge', $aiKnowledgeData);
|
||||
|
||||
if ($aiKnowledge) {
|
||||
// Link AIKnowledge to Mietinkasso (hasOne relationship - set field directly)
|
||||
$mietinkasso->set('aIKnowledgeId', $aiKnowledge->getId());
|
||||
$this->entityManager->saveEntity($mietinkasso);
|
||||
$GLOBALS['log']->info("CVmhMietverhltnis: Created and linked AIKnowledge for Mietinkasso: {$aiKnowledge->getId()}");
|
||||
} else {
|
||||
$GLOBALS['log']->error('CVmhMietverhltnis: Failed to create AIKnowledge for Mietinkasso');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Log action to source entity stream
|
||||
*
|
||||
|
||||
@@ -264,7 +264,14 @@ class CVmhRumungsklage extends \Espo\Services\Record
|
||||
->relate($beklagter);
|
||||
}
|
||||
|
||||
// 7. Collect all documents from Mietverhältnisse, Kündigungen, Mietobjekte and Beteiligte
|
||||
// 7. Create or link AdvowareAkte and AIKnowledge (BEFORE document duplication!)
|
||||
$this->createOrLinkAdvowareAkteAndAIKnowledge(
|
||||
$raeumungsklage,
|
||||
$alleKuendigungen,
|
||||
$raeumungsklagenRepo
|
||||
);
|
||||
|
||||
// 8. Collect all documents from Mietverhältnisse, Kündigungen, Mietobjekte and Beteiligte
|
||||
$alleLinkedDokumente = [];
|
||||
|
||||
// Get CDokumente service for duplication
|
||||
@@ -391,6 +398,128 @@ class CVmhRumungsklage extends \Espo\Services\Record
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create or link AdvowareAkte and create AIKnowledge for Räumungsklage
|
||||
*
|
||||
* @param object $raeumungsklage The created Räumungsklage entity
|
||||
* @param array $alleKuendigungen All related Kündigungen
|
||||
* @param object $raeumungsklagenRepo Repository for relations
|
||||
*/
|
||||
private function createOrLinkAdvowareAkteAndAIKnowledge(
|
||||
$raeumungsklage,
|
||||
array $alleKuendigungen,
|
||||
$raeumungsklagenRepo
|
||||
): void {
|
||||
$advowareAkte = null;
|
||||
|
||||
// 1. Check if any Kündigung has an existing AdvowareAkte (belongsTo relationship - get via field)
|
||||
foreach ($alleKuendigungen as $kuendigung) {
|
||||
$existingAkteId = $kuendigung->get('advowareAktenId');
|
||||
|
||||
if ($existingAkteId) {
|
||||
$existingAkte = $this->entityManager->getEntity('CAdvowareAkten', $existingAkteId);
|
||||
if ($existingAkte) {
|
||||
$advowareAkte = $existingAkte;
|
||||
$GLOBALS['log']->info("CVmhRumungsklage: Using existing AdvowareAkte from Kündigung: {$existingAkte->getId()}");
|
||||
break; // Use first found Akte
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. If no existing Akte found, create new one
|
||||
if (!$advowareAkte) {
|
||||
// Collect Aktennummer and Aktenzeichen from Kündigungen
|
||||
$aktennummer = null;
|
||||
$aktenzeichen = null;
|
||||
|
||||
foreach ($alleKuendigungen as $kuendigung) {
|
||||
if (!$aktennummer && $kuendigung->get('aktennr')) {
|
||||
$aktennummer = $kuendigung->get('aktennr');
|
||||
}
|
||||
if (!$aktenzeichen && $kuendigung->get('advowareAktenzeichen')) {
|
||||
$aktenzeichen = $kuendigung->get('advowareAktenzeichen');
|
||||
}
|
||||
if ($aktennummer && $aktenzeichen) {
|
||||
break; // Found both
|
||||
}
|
||||
}
|
||||
|
||||
// Generate if not found
|
||||
if (!$aktennummer) {
|
||||
$aktennummer = time(); // Simple timestamp-based generation
|
||||
}
|
||||
if (!$aktenzeichen) {
|
||||
$aktenzeichen = 'AZ-' . date('Y-m-d-His');
|
||||
}
|
||||
|
||||
// Create new AdvowareAkte
|
||||
$advowareAkteData = [
|
||||
'name' => 'Advoware Akte - ' . $raeumungsklage->get('name'),
|
||||
'aktennummer' => $aktennummer,
|
||||
'aktenzeichen' => $aktenzeichen,
|
||||
'syncStatus' => 'unclean',
|
||||
'assignedUserId' => $raeumungsklage->get('assignedUserId')
|
||||
];
|
||||
|
||||
// Copy teams
|
||||
$teamsIds = $raeumungsklage->getLinkMultipleIdList('teams');
|
||||
if (!empty($teamsIds)) {
|
||||
$advowareAkteData['teamsIds'] = $teamsIds;
|
||||
}
|
||||
|
||||
$advowareAkte = $this->entityManager->createEntity('CAdvowareAkten', $advowareAkteData);
|
||||
|
||||
if ($advowareAkte) {
|
||||
$GLOBALS['log']->info("CVmhRumungsklage: Created new AdvowareAkte: {$advowareAkte->getId()}");
|
||||
|
||||
// Link new Akte to ALL Kündigungen (belongsTo relationship - set field directly)
|
||||
foreach ($alleKuendigungen as $kuendigung) {
|
||||
try {
|
||||
$kuendigung->set('advowareAktenId', $advowareAkte->getId());
|
||||
$this->entityManager->saveEntity($kuendigung);
|
||||
$GLOBALS['log']->info("CVmhRumungsklage: Linked new AdvowareAkte to Kündigung: {$kuendigung->getId()}");
|
||||
} catch (\Exception $e) {
|
||||
$GLOBALS['log']->warning("CVmhRumungsklage: Could not link AdvowareAkte to Kündigung: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$GLOBALS['log']->error('CVmhRumungsklage: Failed to create AdvowareAkte');
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Link AdvowareAkte to Räumungsklage (hasOne relationship - set field directly)
|
||||
if ($advowareAkte) {
|
||||
$raeumungsklage->set('advowareAktenId', $advowareAkte->getId());
|
||||
$this->entityManager->saveEntity($raeumungsklage);
|
||||
$GLOBALS['log']->info("CVmhRumungsklage: Linked AdvowareAkte to Räumungsklage");
|
||||
}
|
||||
|
||||
// 4. Create AIKnowledge
|
||||
$aiKnowledgeData = [
|
||||
'name' => 'AI Knowledge - ' . $raeumungsklage->get('name'),
|
||||
'aktivierungsstatus' => 'deactivated',
|
||||
'syncStatus' => 'unclean',
|
||||
'assignedUserId' => $raeumungsklage->get('assignedUserId')
|
||||
];
|
||||
|
||||
// Copy teams
|
||||
$teamsIds = $raeumungsklage->getLinkMultipleIdList('teams');
|
||||
if (!empty($teamsIds)) {
|
||||
$aiKnowledgeData['teamsIds'] = $teamsIds;
|
||||
}
|
||||
|
||||
$aiKnowledge = $this->entityManager->createEntity('CAIKnowledge', $aiKnowledgeData);
|
||||
|
||||
if ($aiKnowledge) {
|
||||
// Link AIKnowledge to Räumungsklage (hasOne relationship - set field directly)
|
||||
$raeumungsklage->set('aIKnowledgeId', $aiKnowledge->getId());
|
||||
$this->entityManager->saveEntity($raeumungsklage);
|
||||
$GLOBALS['log']->info("CVmhRumungsklage: Created and linked AIKnowledge: {$aiKnowledge->getId()}");
|
||||
} else {
|
||||
$GLOBALS['log']->error('CVmhRumungsklage: Failed to create AIKnowledge');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Log Räumungsklage creation to source entity stream
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user