InhabitantClassificationService.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. namespace App\Services;
  3. use App\Models\InhabitantClassification;
  4. use App\Models\Unit;
  5. use App\Models\UnitInhabitantClassification;
  6. use Illuminate\Database\Eloquent\Collection;
  7. class InhabitantClassificationService
  8. {
  9. public function getAll(): Collection
  10. {
  11. return InhabitantClassification::orderBy('id')->get();
  12. }
  13. public function getSelectList(): Collection
  14. {
  15. return InhabitantClassification::orderBy('id')
  16. ->get(['id', 'description', 'acronym']);
  17. }
  18. public function findById(int $id): ?InhabitantClassification
  19. {
  20. return InhabitantClassification::find($id);
  21. }
  22. public function create(array $data): InhabitantClassification
  23. {
  24. $model = InhabitantClassification::create($data);
  25. $this->propagateToAllUnits($model);
  26. return $model;
  27. }
  28. public function update(int $id, array $data): ?InhabitantClassification
  29. {
  30. $model = $this->findById($id);
  31. if (!$model) {
  32. return null;
  33. }
  34. $oldDescription = $model->description;
  35. $oldAcronym = $model->acronym;
  36. $model->update($data);
  37. $updated = $model->fresh();
  38. $this->propagateUpdateToUnits($updated, $oldDescription, $oldAcronym);
  39. return $updated;
  40. }
  41. public function delete(int $id): bool
  42. {
  43. $model = $this->findById($id);
  44. if (!$model) {
  45. return false;
  46. }
  47. return $model->delete();
  48. }
  49. //
  50. private function propagateToAllUnits(InhabitantClassification $parent): void
  51. {
  52. $existingUnitIds = UnitInhabitantClassification::where('acronym', $parent->acronym)
  53. ->pluck('unit_id');
  54. Unit::whereNotIn('id', $existingUnitIds)
  55. ->each(function (Unit $unit) use ($parent) {
  56. UnitInhabitantClassification::create([
  57. 'unit_id' => $unit->id,
  58. 'description' => $parent->description,
  59. 'acronym' => $parent->acronym,
  60. ]);
  61. });
  62. }
  63. private function propagateUpdateToUnits(InhabitantClassification $parent, string $oldDescription, string $oldAcronym): void
  64. {
  65. // propaga a atualizacao para as classificacoes de unidades que tenham a mesma descricao e sigla antigas
  66. UnitInhabitantClassification::where('acronym', $oldAcronym)
  67. ->where('description', $oldDescription)
  68. ->update([
  69. 'description' => $parent->description,
  70. 'acronym' => $parent->acronym,
  71. ]);
  72. $coveredUnitIds = UnitInhabitantClassification::whereIn('acronym', array_unique([$parent->acronym, $oldAcronym]))
  73. ->pluck('unit_id')
  74. ->unique();
  75. // garante que todas as unidades tenham a classificacao atualizada, criando para as que ainda nao tem
  76. Unit::whereNotIn('id', $coveredUnitIds)
  77. ->each(function (Unit $unit) use ($parent) {
  78. UnitInhabitantClassification::create([
  79. 'unit_id' => $unit->id,
  80. 'description' => $parent->description,
  81. 'acronym' => $parent->acronym,
  82. ]);
  83. });
  84. }
  85. }