orderBy('created_at', 'desc') ->paginate($perPage); } public function findById(int $id): ?FranchiseeTbr { return FranchiseeTbr::with([ 'franchisee', 'contract', 'inhabitantClassification', 'royaltiesBracket', 'fnmBracket', 'maintenanceBracket', ])->find($id); } public function createWithBrackets(array $data): FranchiseeTbr { return DB::transaction(function () use ($data) { $franchiseeId = $data['franchisee_id']; $royaltyBrackets = $this->copyBaseBrackets(RoyaltiesBaseBracket::class, FranchiseeRoyaltiesBracket::class, $franchiseeId); $fnmBrackets = $this->copyBaseBrackets(FnmBaseBracket::class, FranchiseeFnmBracket::class, $franchiseeId); $maintenanceBrackets = $this->copyBaseBrackets(MaintenanceBaseBracket::class, FranchiseeMaintenanceBracket::class, $franchiseeId); return FranchiseeTbr::create(array_merge($data, [ 'franchisee_royalties_bracket_id' => $royaltyBrackets->first()?->id, 'franchisee_fnm_bracket_id' => $fnmBrackets->first()?->id, 'franchisee_maintenance_bracket_id' => $maintenanceBrackets->first()?->id, ])); }); } public function update(int $id, array $data): ?FranchiseeTbr { $model = $this->findById($id); if (!$model) { return null; } $model->update($data); return $model->fresh(); } public function delete(int $id): bool { $model = $this->findById($id); if (!$model) { return false; } return $model->delete(); } private function copyBaseBrackets(string $baseClass, string $franchiseeClass, int $franchiseeId): \Illuminate\Database\Eloquent\Collection { $baseBrackets = $baseClass::orderBy('start_month')->get(); $copied = $baseBrackets->map(fn ($base) => $franchiseeClass::create([ 'franchisee_id' => $franchiseeId, 'description' => $base->description, 'start_month' => $base->start_month, 'end_month' => $base->end_month, 'percentage' => $base->percentage, ])); return $copied; } }