Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
InvoiceActivetyLogResource
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 2
600
0.00% covered (danger)
0.00%
0 / 1
 toArray
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 processDetails
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 1
552
1<?php
2
3namespace Domain\Invoice\Resources;
4
5use App\Models\Invoice\Invoice;
6use App\Models\Invoice\InvoiceItem;
7use App\Models\Invoice\InvoiceVerification;
8use App\Models\PurchaseOrder\PurchaseOrderInvoiceItem;
9use App\Models\PurchaseOrder\PurchaseOrderItem;
10use App\Models\User;
11use Domain\Invoice\Enums\InvoiceActivetyLogOperationEnum;
12use Domain\PurchaseOrder\Resources\PurchaseOrderInvoiceItemResource;
13use Domain\User\Resources\UserResource;
14use Illuminate\Http\Request;
15use Illuminate\Http\Resources\Json\JsonResource;
16
17class InvoiceActivetyLogResource extends JsonResource
18{
19    /**
20     * @property int $id
21     * @property Invoice $invoice_id
22     * @property int $entity_id
23     * @property string $entity_type
24     * @property InvoiceActivetyLogOperationEnum $operation
25     * @property User $user_id
26     * @property array $detail
27     * @property string $observation
28     */
29    public function toArray(Request $request): array
30    {
31        $details = $this->processDetails();
32
33        return [
34            'id'          => $this->id,
35            'invoice'     => $this->invoice_id,
36            'entity_id'   => $this->entity_id,
37            'entity_type' => $this->entity_type,
38            'operation'   => $this->operation,
39            'detail'      => $details,
40            'observation' => $this->observation,
41            'user'        => UserResource::make($this->whenLoaded('user')),
42            'created_at'  => (string) $this->created_at
43        ];
44    }
45
46    private function processDetails()
47    {
48        switch ($this->entity_type) {
49            case Invoice::class:
50                $detail  = json_decode($this->detail);
51
52                if (!is_object($detail) || !isset($detail->id)) {
53                    return $detail;
54                }
55
56                $invoice = Invoice::find($detail->id);
57
58                if (!$invoice) {
59                    return $detail;
60                }
61
62                $invoice->load('integration');
63
64                return InvoiceResource::make($invoice);
65
66            case InvoiceItem::class:
67                $details = json_decode($this->detail);
68
69                if(is_array($details)){
70                    $resourceArray = [];
71
72                    foreach($details as $detail){
73                        $detail = json_decode($detail);
74
75                        if (!is_object($detail) || !isset($detail->id)) {
76                            return $details;
77                        }
78
79                        $invoiceItem = InvoiceItem::find($detail->id);
80
81                        if (!$invoiceItem) {
82                            return $detail;
83                        }
84
85                        $invoiceItem->load([
86                            'integration',
87                            'unitMeasurement'
88                        ]);
89
90                        array_push($resourceArray, InvoiceItemResource::make($invoiceItem));
91                    }
92
93                    return $resourceArray;
94                } else {
95                    if (!is_object($details) || !isset($details->id)) {
96                        return $details;
97                    }
98
99                    $invoiceItem = InvoiceItem::find($details->id);
100
101                    if (!$invoiceItem) {
102                        return $details;
103                    }
104
105                    $invoiceItem->load([
106                        'integration',
107                        'unitMeasurement'
108                    ]);
109
110                    return InvoiceItemResource::make($invoiceItem);
111                }
112
113            case InvoiceVerification::class:
114                $detail = json_decode($this->detail);
115
116                if (!is_object($detail) || !isset($detail->id)) {
117                    return $detail;
118                }
119
120                $invoiceVerification = InvoiceVerification::find($detail->id);
121
122                if (!$invoiceVerification) {
123                    return $detail;
124                }
125
126                $invoiceVerification->load([
127                    'invoiceItem.integration',
128                    'invoiceItem.unitMeasurement',
129                    'invoiceItem.purchaseOrderInvoiceItem',
130                    'invoiceItem.purchaseOrderInvoiceItem.purchaseOrderItem.integration',
131                    'invoiceItem.purchaseOrderInvoiceItem.purchaseOrderItem.product.unitMeasurement',
132                    'invoiceItem.purchaseOrderInvoiceItem.purchaseOrderItem.purchaseOrder.integration',
133                    'invoiceItem.purchaseOrderInvoiceItem.purchaseOrderItem.purchaseOrder.supplier.integration',
134                ]);
135
136                return InvoiceVerificationResource::make($invoiceVerification);
137
138            case PurchaseOrderInvoiceItem::class:
139                $detail = json_decode($this->detail);
140
141                if (!is_object($detail) || !isset($detail->id)) {
142                    return $detail;
143                }
144
145                $purchaseOrderInvoiceItem = PurchaseOrderInvoiceItem::find($detail->id);
146
147                if ($purchaseOrderInvoiceItem) {
148                    $purchaseOrderInvoiceItem->load([
149                        'invoiceItem.integration',
150                        'invoiceItem.unitMeasurement',
151                        'purchaseOrderItem.integration',
152                        'purchaseOrderItem.product.unitMeasurement',
153                        'purchaseOrderItem.purchaseOrder.integration',
154                        'purchaseOrderItem.purchaseOrder.supplier.integration',
155                    ]);
156
157                    return PurchaseOrderInvoiceItemResource::make($purchaseOrderInvoiceItem);
158                }
159
160                // Se não existe mais no banco, passa o próprio detail (com ids dos vínculos) pro resource
161                return PurchaseOrderInvoiceItemResource::make($detail);
162            default:
163                return json_decode($this->detail);
164        }
165    }
166}