Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
88.89% covered (warning)
88.89%
24 / 27
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
StockOutputVolumeStoreService
88.89% covered (warning)
88.89%
24 / 27
0.00% covered (danger)
0.00%
0 / 1
5.03
0.00% covered (danger)
0.00%
0 / 1
 store
88.89% covered (warning)
88.89%
24 / 27
0.00% covered (danger)
0.00%
0 / 1
5.03
1<?php
2
3namespace Domain\StockIO\Services;
4
5use App\Events\ServiceProcessed;
6use App\Http\Requests\StockOutputVolumeRequest;
7use App\Models\StockIO\StockIO;
8use App\Models\StockIO\StockOutputVolume;
9use App\Models\User;
10use Illuminate\Support\Facades\DB;
11use Throwable;
12
13readonly class StockOutputVolumeStoreService
14{
15    /**
16     * @param StockOutputVolumeRequest $request
17     * @param StockIO $stockIO
18     * @param User $user
19     * @return array
20     * @throws Throwable
21     */
22    public function store(StockOutputVolumeRequest $request, StockIO $stockIO, User $user): array
23    {
24        try {
25            DB::beginTransaction();
26
27            // Recupera os volumes existentes associados ao StockIO
28            $existingVolumes = StockOutputVolume::where('stock_io_id', $stockIO->getKey())->get();
29            $existingVolumeIds = $existingVolumes->pluck('id')->toArray();
30
31            $volumes = [];
32            $newVolumeIds = []; // Para armazenar os IDs dos novos volumes que estão sendo salvos
33
34            foreach ($request->get('volumes') as $volume) {
35                if (isset($volume['id'])) {
36                    // Atualiza o volume existente
37                    $stockOutputVolume = StockOutputVolume::find($volume['id']);
38                    $stockOutputVolume->fill($volume);
39                    $newVolumeIds[] = $stockOutputVolume->id; // Adiciona o ID do volume atualizado
40                } else {
41                    // Cria um novo volume
42                    $stockOutputVolume = new StockOutputVolume();
43                    $stockOutputVolume->fill($volume);
44                    $stockOutputVolume->setAttribute('stock_io_id', $stockIO->getKey());
45                    $newVolumeIds[] = $stockOutputVolume->id; // Adiciona o ID do novo volume
46                }
47                $stockOutputVolume->save();
48                $volumes[] = $stockOutputVolume;
49            }
50
51            // Deleta os volumes que não estão mais presentes
52            $volumesToDelete = array_diff($existingVolumeIds, $newVolumeIds);
53            if (!empty($volumesToDelete)) {
54                StockOutputVolume::whereIn('id', $volumesToDelete)->delete();
55            }
56
57            //Atualiza a observação
58            $stockIO->setAttribute('observation', $request->get('observation'));
59            $stockIO->update();
60
61            DB::commit();
62        } catch (Throwable $throwable) {
63            DB::rollBack();
64            throw $throwable;
65        }
66
67        ServiceProcessed::dispatch(self::class, $user);
68        return $volumes;
69    }
70}