InhabitantClassificationService.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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('description')->get();
  12. }
  13. public function getSelectList(): Collection
  14. {
  15. return InhabitantClassification::orderBy('description')
  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. private function propagateToAllUnits(InhabitantClassification $parent): void
  50. {
  51. $existingUnitIds = UnitInhabitantClassification::where('acronym', $parent->acronym)
  52. ->pluck('unit_id');
  53. Unit::whereNotIn('id', $existingUnitIds)
  54. ->each(function (Unit $unit) use ($parent) {
  55. UnitInhabitantClassification::create([
  56. 'unit_id' => $unit->id,
  57. 'description' => $parent->description,
  58. 'acronym' => $parent->acronym,
  59. ]);
  60. });
  61. }
  62. private function propagateUpdateToUnits(InhabitantClassification $parent, string $oldDescription, string $oldAcronym): void
  63. {
  64. // Update copies that were in sync with the old parent values
  65. UnitInhabitantClassification::where('acronym', $oldAcronym)
  66. ->where('description', $oldDescription)
  67. ->update([
  68. 'description' => $parent->description,
  69. 'acronym' => $parent->acronym,
  70. ]);
  71. // Create copies for units that have no record for either the old or new acronym
  72. $coveredUnitIds = UnitInhabitantClassification::whereIn('acronym', array_unique([$parent->acronym, $oldAcronym]))
  73. ->pluck('unit_id')
  74. ->unique();
  75. Unit::whereNotIn('id', $coveredUnitIds)
  76. ->each(function (Unit $unit) use ($parent) {
  77. UnitInhabitantClassification::create([
  78. 'unit_id' => $unit->id,
  79. 'description' => $parent->description,
  80. 'acronym' => $parent->acronym,
  81. ]);
  82. });
  83. }
  84. }