Teren-app/app/Services/DecisionEvents/Handlers/ArchiveContractHandler.php
2025-10-22 23:20:04 +02:00

111 lines
5.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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,
]);
}
}
}
}