Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
73.33% covered (warning)
73.33%
22 / 30
57.14% covered (warning)
57.14%
4 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
AddressOrderGroupProcessOrderService
73.33% covered (warning)
73.33%
22 / 30
57.14% covered (warning)
57.14%
4 / 7
13.29
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 __destruct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 store
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 update
60.00% covered (warning)
60.00%
3 / 5
0.00% covered (danger)
0.00%
0 / 1
3.58
 delete
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 incrementOrders
62.50% covered (warning)
62.50%
5 / 8
0.00% covered (danger)
0.00%
0 / 1
2.21
 decrementOrders
62.50% covered (warning)
62.50%
5 / 8
0.00% covered (danger)
0.00%
0 / 1
2.21
1<?php
2
3namespace Domain\Address\Services;
4
5use App\Events\ServiceProcessed;
6use App\Jobs\CheckAddressOrderGroupHealthJob;
7use App\Models\Address\AddressOrderGroup;
8use App\Models\Team\Team;
9use App\Models\User;
10use Illuminate\Database\Eloquent\Builder;
11
12class AddressOrderGroupProcessOrderService
13{
14    private Builder $builder;
15    private AddressOrderGroup $addressOrderGroup;
16    private Team $team;
17
18    /**
19     * @param AddressOrderGroup $addressOrderGroup
20     * @param User $user
21     */
22    public function __construct(AddressOrderGroup $addressOrderGroup, User $user)
23    {
24        $this->team = $addressOrderGroup->team;
25        $this->builder = AddressOrderGroup::query()
26            ->where('id', '!=', $addressOrderGroup->getKey())
27            ->where('team_id', $this->team->getKey());
28
29        ServiceProcessed::dispatch(self::class, $user);
30        $this->addressOrderGroup = $addressOrderGroup;
31    }
32
33    public function __destruct()
34    {
35        CheckAddressOrderGroupHealthJob::dispatch($this->team->getKey())->onQueue('low');
36    }
37
38    /**
39     * @return void
40     */
41    public function store(): void
42    {
43        $this->incrementOrders();
44    }
45
46    /**
47     * @param int $currentOrder
48     * @return void
49     */
50    public function update(int $currentOrder): void
51    {
52        $newOrder = $this->addressOrderGroup->getAttribute('order');
53
54        if ($newOrder < $currentOrder) {
55            $this->incrementOrders($currentOrder);
56        }
57
58        if ($newOrder > $currentOrder) {
59            $this->decrementOrders($currentOrder);
60        }
61    }
62
63    /**
64     * @return void
65     */
66    public function delete(): void
67    {
68        $this->decrementOrders();
69    }
70
71    /**
72     * @param int|null $endOrder
73     * @return void
74     */
75    private function incrementOrders(?int $endOrder = null): void
76    {
77        $order = $this->addressOrderGroup->getAttribute('order');
78        if (is_null($endOrder)) {
79            $this->builder
80                ->where('order', '>=', $order)
81                ->increment('order');
82        } else {
83            $this->builder
84                ->whereBetween('order', [$order, $endOrder - 1])
85                ->increment('order');
86        }
87    }
88
89    /**
90     * @param int|null $startOrder
91     * @return void
92     */
93    private function decrementOrders(?int $startOrder = null): void
94    {
95        $newOrder = $this->addressOrderGroup->getAttribute('order');
96        if (is_null($startOrder)) {
97            $this->builder
98                ->where('order', '>', $newOrder)
99                ->decrement('order');
100        } else {
101            $this->builder
102                ->whereBetween('order', [$startOrder + 1, $newOrder])
103                ->decrement('order');
104        }
105    }
106}