Big changes added events for decisions

This commit is contained in:
Simon Pocrnjič
2025-10-22 23:20:04 +02:00
parent 872b76b012
commit 67ebe4b225
36 changed files with 2240 additions and 189 deletions
@@ -0,0 +1,110 @@
<?php
namespace App\Services\DecisionEvents\Handlers;
use App\Models\ArchiveSetting;
use App\Services\Archiving\ArchiveExecutor;
use App\Services\DecisionEvents\Contracts\DecisionEventHandler;
use App\Services\DecisionEvents\DecisionEventContext;
class ArchiveContractHandler implements DecisionEventHandler
{
/**
* Config contract:
* - archive_setting_id: int (required) which ArchiveSetting to execute
* - reactivate: bool (optional) override ArchiveSetting->reactivate per run
*/
public function handle(DecisionEventContext $context, array $config = []): void
{
$activity = $context->activity;
// Require a contract_id from the activity per request requirements
$contractId = (int) ($activity->contract_id ?? 0);
if ($contractId <= 0) {
throw new \InvalidArgumentException('ArchiveContractHandler requires activity.contract_id');
}
$settingId = (int) ($config['archive_setting_id'] ?? 0);
if ($settingId <= 0) {
throw new \InvalidArgumentException('ArchiveContractHandler requires config.archive_setting_id');
}
$setting = ArchiveSetting::query()->findOrFail($settingId);
// Optionally override reactivate flag for this run
if (array_key_exists('reactivate', $config)) {
$setting->reactivate = (bool) $config['reactivate'];
}
$results = app(ArchiveExecutor::class)->executeSetting(
$setting,
['contract_id' => $contractId],
$activity->user_id ?? null,
null,
);
// If the ArchiveSetting specifies a segment, move the contract to that segment (mirror controller logic)
if (! empty($setting->segment_id)) {
try {
$segmentId = (int) $setting->segment_id;
$clientCase = $context->clientCase; // expected per context contract
$contract = $context->contract; // already loaded on context
if ($clientCase && $contract) {
\DB::transaction(function () use ($clientCase, $contract, $segmentId) {
// Ensure the segment is attached to the client case (activate if previously inactive)
$casePivot = \DB::table('client_case_segment')
->where('client_case_id', $clientCase->id)
->where('segment_id', $segmentId)
->first();
if (! $casePivot) {
\DB::table('client_case_segment')->insert([
'client_case_id' => $clientCase->id,
'segment_id' => $segmentId,
'active' => true,
'created_at' => now(),
'updated_at' => now(),
]);
} elseif (! $casePivot->active) {
\DB::table('client_case_segment')
->where('id', $casePivot->id)
->update(['active' => true, 'updated_at' => now()]);
}
// Deactivate all current active contract segments
\DB::table('contract_segment')
->where('contract_id', $contract->id)
->where('active', true)
->update(['active' => false, 'updated_at' => now()]);
// Attach or activate the target segment for this contract
$existing = \DB::table('contract_segment')
->where('contract_id', $contract->id)
->where('segment_id', $segmentId)
->first();
if ($existing) {
\DB::table('contract_segment')
->where('id', $existing->id)
->update(['active' => true, 'updated_at' => now()]);
} else {
\DB::table('contract_segment')->insert([
'contract_id' => $contract->id,
'segment_id' => $segmentId,
'active' => true,
'created_at' => now(),
'updated_at' => now(),
]);
}
});
}
} catch (\Throwable $e) {
// Do not fail the event; log warning for diagnostics
logger()->warning('ArchiveContractHandler: failed to move contract to segment', [
'error' => $e->getMessage(),
'setting_id' => $setting->id,
'segment_id' => $setting->segment_id,
'contract_id' => $contractId,
]);
}
}
}
}