Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ConcludeConferenceInvoiceService
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 3
132
0.00% covered (danger)
0.00%
0 / 1
 conclude
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
20
 processActivetyLog
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 processStatusVerification
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3namespace Domain\Invoice\Services;
4
5use App\Events\ServiceProcessed;
6use App\Models\Invoice\Invoice;
7use App\Models\Invoice\InvoiceVerification;
8use App\Models\User;
9use Domain\Invoice\DTOs\StoreInvoiceActivityLogDTO;
10use Domain\Invoice\Enums\InvoiceActivetyLogOperationEnum;
11use Domain\Invoice\Enums\InvoiceStatusEnum;
12use Domain\Invoice\Enums\InvoiceVerificationsStatusEnum;
13use Domain\Invoice\Enums\VerificationStatusInvoiceEnum;
14use Domain\Invoice\Exceptions\InvoiceReleasedException;
15use Illuminate\Database\Eloquent\Builder;
16use Illuminate\Support\Facades\DB;
17use Throwable;
18
19readonly class ConcludeConferenceInvoiceService
20{
21    /**
22     * @param Invoice $invoice
23     * @param User $user
24     * @throws Throwable
25     */
26    public function conclude(Invoice $invoice, User $user): void
27    {
28        try {
29            DB::beginTransaction();
30
31            if($invoice->isConclude()){
32                throw new InvoiceReleasedException(__('Invoice has already been conclude'));
33            }
34
35            $this->processStatusVerification($invoice, $user);
36
37            if($invoice->getAttribute('verification_status') == VerificationStatusInvoiceEnum::WITHOUT_DISAGREEMENT){
38                $invoiceOld = $invoice->getAttributes();
39
40                $invoice->setAttribute('status', InvoiceStatusEnum::CONCLUDED);
41                $invoice->save();
42
43                $this->processActivetyLog($invoice, $user, $invoiceOld, Invoice::class, $invoice->getKey());
44            }
45
46            DB::commit();
47        } catch (Throwable $exception) {
48            DB::rollBack();
49            throw $exception;
50        }
51
52        ServiceProcessed::dispatch(self::class, $user);
53    }
54
55    /**
56     * @param Invoice $invoice
57     * @param User $user
58     * @param array $details,
59     * @param string $entityType,
60     * @param int $entityID
61     */
62    private function processActivetyLog(Invoice $invoice, User $user, array $details, string $entityType, int $entityID)
63    {
64        $invoiceActivityLogDTO = new StoreInvoiceActivityLogDTO([
65            'entity_type' => $entityType,
66            'entity_id'   => $entityID,
67            'operation'   => InvoiceActivetyLogOperationEnum::UPDATE,
68            'user'        => $user,
69            'detail'      => json_encode($details),
70            'observation' => 'ConcluĂ­da conferĂȘncia da nota fiscal.'
71        ]);
72
73        (new InvoiceActivityLogStoreService())->store($invoiceActivityLogDTO, $invoice, $user);
74    }
75
76    /**
77     * @param Invoice $invoice
78     */
79    private function processStatusVerification(Invoice $invoice, User $user)
80    {
81        $invoiceVerificationsWithout = InvoiceVerification::query()
82            ->join('invoice_items', 'invoice_verifications.invoice_item_id', '=', 'invoice_items.id')
83            ->whereRaw('invoice_items.amount = invoice_verifications.invoice_item_amount')
84            ->where('invoice_verifications.invoice_id', $invoice->getKey())
85            ->select('invoice_verifications.*')
86            ->get();
87
88        if (!$invoiceVerificationsWithout->isEmpty()){
89            foreach ($invoiceVerificationsWithout as $invoiceVerification)
90            {
91                $invoiceVerificationOld = $invoiceVerification->getAttributes();
92
93                $invoiceVerification->setAttribute('status', InvoiceVerificationsStatusEnum::WITHOUT_DISAGREEMENT);
94                $invoiceVerification->save();
95
96                $this->processActivetyLog($invoice, $user, $invoiceVerificationOld, InvoiceVerification::class, $invoiceVerification->getKey());
97            }
98
99            $invoiceOld = $invoice->getAttributes();
100
101            $invoice->setAttribute('verification_status', VerificationStatusInvoiceEnum::WITHOUT_DISAGREEMENT);
102            $invoice->save();
103
104            $this->processActivetyLog($invoice, $user, $invoiceOld, Invoice::class, $invoice->getKey());
105        }
106
107        $invoiceVerificationsWith = InvoiceVerification::query()
108            ->leftJoin('invoice_items', 'invoice_verifications.invoice_item_id', '=', 'invoice_items.id')
109            ->where(function (Builder $query) use ($invoice) {
110                $query->whereRaw('invoice_items.amount <> invoice_verifications.invoice_item_amount')
111                      ->orWhere('invoice_verifications.status', InvoiceVerificationsStatusEnum::ADDITIONAL_ITEM);
112            })
113            ->where('invoice_verifications.invoice_id', $invoice->getKey())
114            ->select('invoice_verifications.*')
115            ->get();
116
117        if (!$invoiceVerificationsWith->isEmpty()){
118            foreach ($invoiceVerificationsWith as $invoiceVerification)
119            {
120                if($invoiceVerification->status <> InvoiceVerificationsStatusEnum::ADDITIONAL_ITEM){
121
122                    $invoiceVerificationOld = $invoiceVerification->getAttributes();
123
124                    $invoiceVerification->setAttribute('status', InvoiceVerificationsStatusEnum::WITH_DISAGREEMENT);
125                    $invoiceVerification->save();
126
127                    $this->processActivetyLog($invoice, $user, $invoiceVerificationOld, InvoiceVerification::class, $invoiceVerification->getKey());
128                }
129            }
130
131            $invoiceOld = $invoice->getAttributes();
132
133            $invoice->setAttribute('verification_status', VerificationStatusInvoiceEnum::WITH_DISAGREEMENT);
134            $invoice->save();
135
136            $this->processActivetyLog($invoice, $user, $invoiceOld, Invoice::class, $invoice->getKey());
137        }
138    }
139}