changes to import added activity entity
This commit is contained in:
@@ -25,6 +25,11 @@ class ImportSimulationService
|
||||
*/
|
||||
private ?int $clientId = null;
|
||||
|
||||
/**
|
||||
* History import mode flag (from template meta).
|
||||
*/
|
||||
private bool $historyImport = false;
|
||||
|
||||
/**
|
||||
* Public entry: simulate import applying mappings to first $limit rows.
|
||||
* Keeps existing machine keys for backward compatibility, but adds Slovenian
|
||||
@@ -79,6 +84,7 @@ public function simulate(Import $import, int $limit = 100, bool $verbose = false
|
||||
$simRows = [];
|
||||
// Determine keyref behavior for contract.reference from mappings/template
|
||||
$tplMeta = optional($import->template)->meta ?? [];
|
||||
$this->historyImport = (bool) ($tplMeta['history_import'] ?? false);
|
||||
$contractKeyModeTpl = $tplMeta['contract_key_mode'] ?? null; // e.g. 'reference'
|
||||
$contractRefMode = $this->mappingModeForImport($import, 'contract.reference'); // e.g. 'keyref'
|
||||
foreach ($rows as $idx => $rawValues) {
|
||||
@@ -489,6 +495,38 @@ public function simulate(Import $import, int $limit = 100, bool $verbose = false
|
||||
}
|
||||
}
|
||||
|
||||
// History import: auto-ensure account placeholder when contract exists but no account mapping
|
||||
if ($this->historyImport && $existingContract && isset($rowEntities['contract']['id']) && ! isset($rowEntities['account'])) {
|
||||
if (! isset($summaries['account'])) {
|
||||
$summaries['account'] = [
|
||||
'root' => 'account',
|
||||
'total_rows' => 0,
|
||||
'create' => 0,
|
||||
'update' => 0,
|
||||
'missing_ref' => 0,
|
||||
'invalid' => 0,
|
||||
'duplicate' => 0,
|
||||
'duplicate_db' => 0,
|
||||
];
|
||||
}
|
||||
$summaries['account']['total_rows']++;
|
||||
$summaries['account']['update']++;
|
||||
$ref = $rowEntities['contract']['reference'] ?? null;
|
||||
if ($ref === null || $ref === '') {
|
||||
$ref = 'HIST-'.$rowEntities['contract']['id'];
|
||||
}
|
||||
$rowEntities['account'] = [
|
||||
'reference' => $ref,
|
||||
'exists' => true,
|
||||
'id' => null,
|
||||
'balance_before' => 0,
|
||||
'balance_after' => 0,
|
||||
'action' => 'implicit_history',
|
||||
'action_label' => $translatedActions['implicit'] ?? 'posredno',
|
||||
'history_zeroed' => true,
|
||||
];
|
||||
}
|
||||
|
||||
// Payment (affects account balance; may create implicit account)
|
||||
if (isset($entityRoots['payment'])) {
|
||||
// Inject inferred account if none mapped explicitly
|
||||
@@ -891,7 +929,7 @@ private function simulateContract(callable $val, array $summaries, array $cache,
|
||||
'client_case_id' => $contract?->client_case_id,
|
||||
'active' => $contract?->active,
|
||||
'deleted_at' => $contract?->deleted_at,
|
||||
'action' => $contract ? 'update' : ($reference ? 'create' : 'skip'),
|
||||
'action' => $contract ? ($this->historyImport ? 'skipped_history' : 'update') : ($reference ? 'create' : 'skip'),
|
||||
];
|
||||
$summaries['contract']['total_rows']++;
|
||||
if (! $reference) {
|
||||
@@ -902,6 +940,11 @@ private function simulateContract(callable $val, array $summaries, array $cache,
|
||||
$summaries['contract']['create']++;
|
||||
}
|
||||
|
||||
if ($this->historyImport && $contract) {
|
||||
$entity['history_reuse'] = true;
|
||||
$entity['message'] = 'Existing contract reused (history import)';
|
||||
}
|
||||
|
||||
return [$entity, $summaries, $cache];
|
||||
}
|
||||
|
||||
@@ -931,7 +974,7 @@ private function simulateAccount(callable $val, array $summaries, array $cache,
|
||||
'exists' => (bool) $account,
|
||||
'balance_before' => $account?->balance_amount,
|
||||
'balance_after' => $account?->balance_amount,
|
||||
'action' => $account ? 'update' : ($reference ? 'create' : 'skip'),
|
||||
'action' => $account ? ($this->historyImport ? 'skipped_history' : 'update') : ($reference ? 'create' : 'skip'),
|
||||
];
|
||||
|
||||
// Direct balance override support.
|
||||
@@ -940,7 +983,7 @@ private function simulateAccount(callable $val, array $summaries, array $cache,
|
||||
$rawIncoming = $val('account.balance_amount')
|
||||
?? $val('accounts.balance_amount')
|
||||
?? $val('account.balance');
|
||||
if ($rawIncoming !== null && $rawIncoming !== '') {
|
||||
if (! $this->historyImport && $rawIncoming !== null && $rawIncoming !== '') {
|
||||
$rawStr = (string) $rawIncoming;
|
||||
// Remove currency symbols and non numeric punctuation except , . -
|
||||
$clean = preg_replace('/[^0-9,\.\-]+/', '', $rawStr) ?? '';
|
||||
@@ -974,6 +1017,19 @@ private function simulateAccount(callable $val, array $summaries, array $cache,
|
||||
$summaries['account']['create']++;
|
||||
}
|
||||
|
||||
if ($this->historyImport) {
|
||||
// History imports keep balances unchanged and do not update accounts
|
||||
$entity['balance_after'] = $account?->balance_amount ?? 0;
|
||||
$entity['balance_before'] = $account?->balance_amount ?? 0;
|
||||
if ($account) {
|
||||
$entity['message'] = 'Existing account left unchanged (history import)';
|
||||
} else {
|
||||
$entity['balance_after'] = 0;
|
||||
$entity['balance_before'] = 0;
|
||||
$entity['history_zeroed'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
return [$entity, $summaries, $cache];
|
||||
}
|
||||
|
||||
@@ -1210,6 +1266,10 @@ private function simulateGenericRoot(
|
||||
$reference = $val('phone.nu');
|
||||
} elseif ($root === 'email') {
|
||||
$reference = $val('email.value');
|
||||
} elseif ($root === 'activity') {
|
||||
$noteRef = $val('activity.note');
|
||||
$dueRef = $val('activity.due_date');
|
||||
$reference = $noteRef || $dueRef ? trim((string) ($dueRef ?? '')).($noteRef ? ' | '.$noteRef : '') : null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1253,6 +1313,13 @@ private function simulateGenericRoot(
|
||||
$entity['description'] = $val('case_object.description') ?? null;
|
||||
$entity['type'] = $val('case_object.type') ?? null;
|
||||
break;
|
||||
case 'activity':
|
||||
$entity['note'] = $val('activity.note') ?? null;
|
||||
$entity['due_date'] = $val('activity.due_date') ?? null;
|
||||
$entity['amount'] = $val('activity.amount') ?? null;
|
||||
$entity['action_id'] = $val('activity.action_id') ?? null;
|
||||
$entity['decision_id'] = $val('activity.decision_id') ?? null;
|
||||
break;
|
||||
}
|
||||
|
||||
if ($verbose) {
|
||||
@@ -1367,6 +1434,16 @@ private function genericIdentityCandidates(string $root, callable $val): array
|
||||
$ids[] = 'name:'.mb_strtolower(trim((string) $name));
|
||||
}
|
||||
|
||||
return $ids;
|
||||
case 'activity':
|
||||
$note = $val('activity.note');
|
||||
$due = $val('activity.due_date');
|
||||
$contractRef = $val('contract.reference');
|
||||
$ids = [];
|
||||
if ($note || $due) {
|
||||
$ids[] = 'activity:'.mb_strtolower(trim((string) ($note ?? ''))).'|'.mb_strtolower(trim((string) ($due ?? ''))).'|'.mb_strtolower(trim((string) ($contractRef ?? '')));
|
||||
}
|
||||
|
||||
return $ids;
|
||||
default:
|
||||
return [];
|
||||
@@ -1426,6 +1503,20 @@ private function loadExistingGenericIdentities(string $root): array
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'activity':
|
||||
foreach (\App\Models\Activity::query()->get(['note', 'due_date', 'contract_id', 'client_case_id']) as $rec) {
|
||||
$note = mb_strtolower(trim((string) ($rec->note ?? '')));
|
||||
$due = $rec->due_date ? mb_strtolower(trim((string) $rec->due_date)) : '';
|
||||
$contractRef = null;
|
||||
if ($rec->contract_id) {
|
||||
$contractRef = Contract::where('id', $rec->contract_id)->value('reference');
|
||||
}
|
||||
$key = 'activity:'.$note.'|'.$due.'|'.mb_strtolower(trim((string) ($contractRef ?? '')));
|
||||
if (trim($key, 'activity:|') !== '') {
|
||||
$set[$key] = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} catch (\Throwable) {
|
||||
// swallow and return what we have
|
||||
@@ -1730,6 +1821,8 @@ private function actionTranslations(): array
|
||||
'skip' => 'preskoči',
|
||||
'implicit' => 'posredno',
|
||||
'reactivate' => 'reaktiviraj',
|
||||
'skipped_history' => 'preskoči (zgodovina)',
|
||||
'implicit_history' => 'posredno (zgodovina)',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user