get(); } public function getSelectList(): Collection { return InhabitantClassification::orderBy('description') ->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 { // Update copies that were in sync with the old parent values UnitInhabitantClassification::where('acronym', $oldAcronym) ->where('description', $oldDescription) ->update([ 'description' => $parent->description, 'acronym' => $parent->acronym, ]); // Create copies for units that have no record for either the old or new acronym $coveredUnitIds = UnitInhabitantClassification::whereIn('acronym', array_unique([$parent->acronym, $oldAcronym])) ->pluck('unit_id') ->unique(); Unit::whereNotIn('id', $coveredUnitIds) ->each(function (Unit $unit) use ($parent) { UnitInhabitantClassification::create([ 'unit_id' => $unit->id, 'description' => $parent->description, 'acronym' => $parent->acronym, ]); }); } }