Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
36 / 36
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
SignatureStatusSynchronizer
100.00% covered (success)
100.00%
36 / 36
100.00% covered (success)
100.00%
2 / 2
11
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 sync
100.00% covered (success)
100.00%
35 / 35
100.00% covered (success)
100.00%
1 / 1
10
1<?php
2
3declare(strict_types=1);
4
5namespace ImovelZapAi\Signatures\Application\Services;
6
7use ImovelZapAi\Documents\Infrastructure\Persistence\Eloquent\BusinessDocumentModel;
8use ImovelZapAi\Signatures\Domain\Enums\SignatureAuditEvent;
9use ImovelZapAi\Signatures\Domain\Enums\SignatureRequestStatus;
10use ImovelZapAi\Signatures\Domain\Enums\SignerStatus;
11use ImovelZapAi\Signatures\Infrastructure\Persistence\Eloquent\SignatureRequestModel;
12
13final class SignatureStatusSynchronizer
14{
15    public function __construct(private readonly SignatureAuditWriter $audit) {}
16
17    public function sync(SignatureRequestModel $request): void
18    {
19        $request->loadMissing('signers', 'document');
20
21        $total = $request->signers->count();
22        $signedCount = $request->signers->where('status', SignerStatus::Signed)->count();
23
24        if (! in_array($request->status, [
25            SignatureRequestStatus::Cancelled,
26            SignatureRequestStatus::Expired,
27            SignatureRequestStatus::Signed,
28        ], true)) {
29            if ($total > 0 && $signedCount === $total) {
30                if ($request->status !== SignatureRequestStatus::Signed) {
31                    $request->forceFill([
32                        'status' => SignatureRequestStatus::Signed,
33                        'completed_at' => now(),
34                    ])->save();
35
36                    $this->audit->write(
37                        $request->tenant_id,
38                        $request->id,
39                        SignatureAuditEvent::Completed,
40                        message: 'Todas as assinaturas concluĂ­das.',
41                    );
42                }
43            } elseif ($signedCount > 0) {
44                if ($request->status !== SignatureRequestStatus::PartiallySigned) {
45                    $request->forceFill(['status' => SignatureRequestStatus::PartiallySigned])->save();
46                }
47            } elseif (in_array($request->status, [
48                SignatureRequestStatus::AwaitingSignatures,
49                SignatureRequestStatus::PartiallySigned,
50            ], true) && $signedCount === 0) {
51                $request->forceFill(['status' => SignatureRequestStatus::AwaitingSignatures])->save();
52            }
53        }
54
55        if ($request->business_document_id !== null) {
56            BusinessDocumentModel::query()
57                ->whereKey($request->business_document_id)
58                ->update([
59                    'signature_status' => $request->fresh()->status->value,
60                    'signature_request_id' => $request->id,
61                ]);
62        }
63    }
64}