Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ShippingPackagingQueryBuilder
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 2
272
0.00% covered (danger)
0.00%
0 / 1
 visibleTo
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
30
 search
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2
3namespace Domain\ShippingPackaging\QueryBuilders;
4
5use App\Models\StockIO\StockIO;
6use App\Models\User;
7use Domain\ShippingPackaging\DTOs\ShippingPackagingSearchDTO;
8use Domain\ShippingPackaging\Enums\ShippingPackagingTypeEnum;
9use Illuminate\Database\Eloquent\Builder;
10
11class ShippingPackagingQueryBuilder extends Builder
12{
13    public function visibleTo(User $user): static
14    {
15        if ($user->isMaster() || $user->isPacker() || $user->isInvoicer()) {
16            return $this;
17        }
18
19        if ($user->isSeparator()) {
20            $this->where(function (Builder $query) use ($user) {
21                $query->where(function (Builder $query) use ($user) {
22                    $query->where('type', ShippingPackagingTypeEnum::SEPARATION->value)
23                        ->where('responsible_id', $user->getKey());
24                })->orWhere(function (Builder $query) use ($user) {
25                    $query->where('type', ShippingPackagingTypeEnum::EXPEDITION->value)
26                        ->whereIn('team_id', $user->teams->pluck('id'));
27                });
28            });
29        } else {
30            $this->whereHas('team', function (Builder $query) use ($user) {
31                $query->whereIn('id', $user->teams->pluck('id'));
32            });
33        }
34
35        return $this;
36    }
37
38    public function search(ShippingPackagingSearchDTO $searchDTO): static
39    {
40
41        if ($searchDTO->codcli || $searchDTO->numpfa || $searchDTO->numane) {
42            $this->whereHas('shippingPackagingProduct', function (Builder $query) use ($searchDTO) {
43                $query->whereHas('pickedItem', function (Builder $query) use ($searchDTO) {
44                    $query->whereHas('stockIOProduct', function (Builder $query) use ($searchDTO) {
45                        $query->whereHas('stockIO', function (Builder $query) use ($searchDTO) {
46                            $query->whereHas('integration', function (Builder $query) use ($searchDTO) {
47                                if ($searchDTO->codcli) {
48                                    $query->where('parameters->CODCLI', $searchDTO->codcli);
49                                }
50                                if ($searchDTO->numpfa) {
51                                    $query->where('parameters->NUMPFA', $searchDTO->numpfa);
52                                }
53                                if ($searchDTO->numane) {
54                                    $query->where('parameters->NUMANE', $searchDTO->numane);
55                                }
56                            });
57                        });
58                    });
59                });
60            });
61        }
62
63        if ($searchDTO->createdAt) {
64            $this->whereBetween('created_at', [
65                $searchDTO->createdAt[0]->startOfDay(),
66                $searchDTO->createdAt[1]->endOfDay(),
67            ]);
68        }
69
70        if (count($searchDTO->status) > 0) {
71            $this->whereIn('status', $searchDTO->status);
72        }
73
74        if (count($searchDTO->type) > 0) {
75            $this->whereIn('type', $searchDTO->type);
76        }
77
78        if ($searchDTO->id) {
79            $this->where('id', $searchDTO->id);
80        }
81
82        return $this;
83    }
84}