where('unit_id', $unitId) ->where('visible', true) ->orderBy('name') ->get(); } public function getAllByUnit(int $unitId): Collection { return ClassPackageUnit::with(self::EAGER_LOAD) ->where('unit_id', $unitId) ->orderBy('name') ->get(); } public function findByIdForUnit(int $id, int $unitId): ClassPackageUnit { return ClassPackageUnit::with(self::EAGER_LOAD) ->where('unit_id', $unitId) ->findOrFail($id); } public function create(array $data): ClassPackageUnit { $pavao = array_key_exists('pavao', $data) ? $data['pavao'] : null; $irrecusavel = array_key_exists('irrecusavel', $data) ? $data['irrecusavel'] : null; unset($data['pavao'], $data['irrecusavel']); $packageUnit = ClassPackageUnit::create($data); if ($pavao !== null) { $this->pricingService->upsert(PavaoProposalUnit::class, PavaoProposalUnitProduct::class, 'class_package_unit_id', $packageUnit->id, $pavao); } if ($irrecusavel !== null) { $this->pricingService->upsert(IrrecusableProposalUnit::class, IrrecusableProposalUnitProduct::class, 'class_package_unit_id', $packageUnit->id, $irrecusavel, withCondition: true); } return $packageUnit->load(self::EAGER_LOAD); } public function update(int $id, int $unitId, array $data): ClassPackageUnit { $packageUnit = $this->findByIdForUnit($id, $unitId); $pavaoProvided = array_key_exists('pavao', $data); $irrecusavelProvided = array_key_exists('irrecusavel', $data); $pavao = $data['pavao'] ?? null; $irrecusavel = $data['irrecusavel'] ?? null; unset($data['pavao'], $data['irrecusavel']); $packageUnit->update($data); // Edits here only affect this unit's own copy — never propagate up to the base package. if ($pavaoProvided) { if ($pavao !== null) { $this->pricingService->upsert(PavaoProposalUnit::class, PavaoProposalUnitProduct::class, 'class_package_unit_id', $packageUnit->id, $pavao); } else { $this->pricingService->deleteFor(PavaoProposalUnit::class, 'class_package_unit_id', $packageUnit->id); } } if ($irrecusavelProvided) { if ($irrecusavel !== null) { $this->pricingService->upsert(IrrecusableProposalUnit::class, IrrecusableProposalUnitProduct::class, 'class_package_unit_id', $packageUnit->id, $irrecusavel, withCondition: true); } else { $this->pricingService->deleteFor(IrrecusableProposalUnit::class, 'class_package_unit_id', $packageUnit->id); } } return $packageUnit->fresh(self::EAGER_LOAD); } public function toggleVisibility(int $id, int $unitId): ClassPackageUnit { $packageUnit = $this->findByIdForUnit($id, $unitId); $packageUnit->update(['visible' => !$packageUnit->visible]); return $packageUnit->fresh(); } public function delete(int $id, int $unitId): bool { $packageUnit = $this->findByIdForUnit($id, $unitId); return $packageUnit->delete(); } public function replicateFromBasePackage(int $unitId, ClassPackage $basePackage): ClassPackageUnit { $packageUnit = ClassPackageUnit::create([ 'unit_id' => $unitId, 'class_package_id' => $basePackage->id, 'name' => $basePackage->name, 'quantity_classes' => $basePackage->quantity_classes, 'class_duration_minutes' => $basePackage->class_duration_minutes, 'weekday' => $basePackage->weekday, 'start_time' => $basePackage->start_time, 'second_weekday' => $basePackage->second_weekday, 'second_start_time' => $basePackage->second_start_time, 'visible' => true, ]); $this->pricingService->cloneToUnit( $basePackage->pavaoProposal, PavaoProposalUnit::class, PavaoProposalUnitProduct::class, 'class_package_unit_id', $packageUnit->id, 'pavao_proposal_id', ); $this->pricingService->cloneToUnit( $basePackage->irrecusableProposal, IrrecusableProposalUnit::class, IrrecusableProposalUnitProduct::class, 'class_package_unit_id', $packageUnit->id, 'irrecusable_proposal_id', withCondition: true, ); return $packageUnit; } }