| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- <?php
- namespace App\Services;
- use App\Models\InhabitantClassification;
- use App\Models\Unit;
- use App\Models\UnitInhabitantClassification;
- use Illuminate\Database\Eloquent\Collection;
- class InhabitantClassificationService
- {
- public function getAll(): Collection
- {
- return InhabitantClassification::orderBy('id')->get();
- }
- public function getSelectList(): Collection
- {
- return InhabitantClassification::orderBy('id')
- ->get(['id', 'description', 'acronym']);
- }
- public function findById(int $id): ?InhabitantClassification
- {
- return InhabitantClassification::find($id);
- }
- public function create(array $data): InhabitantClassification
- {
- $model = InhabitantClassification::create($data);
- $this->propagateToAllUnits($model);
- return $model;
- }
- public function update(int $id, array $data): ?InhabitantClassification
- {
- $model = $this->findById($id);
- if (!$model) {
- return null;
- }
- $oldDescription = $model->description;
- $oldAcronym = $model->acronym;
- $model->update($data);
- $updated = $model->fresh();
- $this->propagateUpdateToUnits($updated, $oldDescription, $oldAcronym);
- return $updated;
- }
- public function delete(int $id): bool
- {
- $model = $this->findById($id);
- if (!$model) {
- return false;
- }
- return $model->delete();
- }
- //
- private function propagateToAllUnits(InhabitantClassification $parent): void
- {
- $existingUnitIds = UnitInhabitantClassification::where('acronym', $parent->acronym)
- ->pluck('unit_id');
- Unit::whereNotIn('id', $existingUnitIds)
- ->each(function (Unit $unit) use ($parent) {
- UnitInhabitantClassification::create([
- 'unit_id' => $unit->id,
- 'description' => $parent->description,
- 'acronym' => $parent->acronym,
- ]);
- });
- }
- private function propagateUpdateToUnits(InhabitantClassification $parent, string $oldDescription, string $oldAcronym): void
- {
- // propaga a atualizacao para as classificacoes de unidades que tenham a mesma descricao e sigla antigas
- UnitInhabitantClassification::where('acronym', $oldAcronym)
- ->where('description', $oldDescription)
- ->update([
- 'description' => $parent->description,
- 'acronym' => $parent->acronym,
- ]);
- $coveredUnitIds = UnitInhabitantClassification::whereIn('acronym', array_unique([$parent->acronym, $oldAcronym]))
- ->pluck('unit_id')
- ->unique();
- // garante que todas as unidades tenham a classificacao atualizada, criando para as que ainda nao tem
- Unit::whereNotIn('id', $coveredUnitIds)
- ->each(function (Unit $unit) use ($parent) {
- UnitInhabitantClassification::create([
- 'unit_id' => $unit->id,
- 'description' => $parent->description,
- 'acronym' => $parent->acronym,
- ]);
- });
- }
- }
|