| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- namespace App\Services;
- use App\Models\ClassPackage;
- use App\Models\ClassPackageUnit;
- use App\Models\IrrecusableProposalUnit;
- use App\Models\IrrecusableProposalUnitProduct;
- use App\Models\PavaoProposalUnit;
- use App\Models\PavaoProposalUnitProduct;
- use Illuminate\Database\Eloquent\Collection;
- class ClassPackageUnitService
- {
- public function __construct(
- protected ProposalPricingService $pricingService,
- ) {}
- private const EAGER_LOAD = [
- 'pavaoProposalUnit.products.product',
- 'irrecusableProposalUnit.products.product',
- ];
- public function getByUnit(int $unitId): Collection
- {
- return ClassPackageUnit::with(self::EAGER_LOAD)
- ->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;
- }
- }
|