Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.65% covered (success)
95.65%
22 / 23
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
CancelSignatureRequestAction
95.65% covered (success)
95.65%
22 / 23
50.00% covered (danger)
50.00%
1 / 2
4
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 execute
95.45% covered (success)
95.45%
21 / 22
0.00% covered (danger)
0.00%
0 / 1
3
1<?php
2
3declare(strict_types=1);
4
5namespace ImovelZapAi\Signatures\Application\Actions;
6
7use App\Models\User;
8use Illuminate\Support\Facades\DB;
9use ImovelZapAi\Signatures\Application\Services\SignatureAuditWriter;
10use ImovelZapAi\Signatures\Application\Services\SignatureProviderRegistry;
11use ImovelZapAi\Signatures\Application\Services\SignatureStatusSynchronizer;
12use ImovelZapAi\Signatures\Domain\Enums\SignatureAuditEvent;
13use ImovelZapAi\Signatures\Domain\Enums\SignatureRequestStatus;
14use ImovelZapAi\Signatures\Domain\Events\SignatureCancelled;
15use ImovelZapAi\Signatures\Domain\Exceptions\SignatureException;
16use ImovelZapAi\Signatures\Infrastructure\Persistence\Eloquent\SignatureRequestModel;
17
18final class CancelSignatureRequestAction
19{
20    public function __construct(
21        private readonly SignatureProviderRegistry $providers,
22        private readonly SignatureAuditWriter $audit,
23        private readonly SignatureStatusSynchronizer $sync,
24    ) {}
25
26    public function execute(SignatureRequestModel $request, User $actor, ?string $reason = null): SignatureRequestModel
27    {
28        if (! $request->isOpen()) {
29            throw SignatureException::invalidState('solicitação já encerrada.');
30        }
31
32        return DB::transaction(function () use ($request, $actor, $reason): SignatureRequestModel {
33            $provider = $this->providers->get($request->provider);
34            $provider->cancel($request);
35
36            $request->forceFill([
37                'status' => SignatureRequestStatus::Cancelled,
38                'cancelled_at' => now(),
39            ])->save();
40
41            $this->audit->write(
42                $request->tenant_id,
43                $request->id,
44                SignatureAuditEvent::Cancelled,
45                actorType: 'broker',
46                actorUserId: (int) $actor->id,
47                payload: ['reason' => $reason],
48                message: $reason ?: 'Solicitação de assinatura cancelada.',
49            );
50
51            SignatureCancelled::dispatch($request->tenant_id, $request->id);
52
53            $this->sync->sync($request);
54
55            return $request->fresh(['signers', 'document']);
56        });
57    }
58}