|
@@ -4,6 +4,10 @@
|
|
|
|
|
|
|
|
use App\Models\ClassPackage;
|
|
use App\Models\ClassPackage;
|
|
|
use App\Models\ClassPackageUnit;
|
|
use App\Models\ClassPackageUnit;
|
|
|
|
|
+use App\Models\IrrecusableProposal;
|
|
|
|
|
+use App\Models\IrrecusableProposalProduct;
|
|
|
|
|
+use App\Models\PavaoProposal;
|
|
|
|
|
+use App\Models\PavaoProposalProduct;
|
|
|
use App\Models\Unit;
|
|
use App\Models\Unit;
|
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\DB;
|
|
@@ -12,6 +16,7 @@ class ClassPackageService
|
|
|
{
|
|
{
|
|
|
public function __construct(
|
|
public function __construct(
|
|
|
protected ClassPackageUnitService $unitService,
|
|
protected ClassPackageUnitService $unitService,
|
|
|
|
|
+ protected ProposalPricingService $pricingService,
|
|
|
) {}
|
|
) {}
|
|
|
|
|
|
|
|
public function getAll(): Collection
|
|
public function getAll(): Collection
|
|
@@ -21,7 +26,7 @@ public function getAll(): Collection
|
|
|
|
|
|
|
|
public function findById(int $id): ?ClassPackage
|
|
public function findById(int $id): ?ClassPackage
|
|
|
{
|
|
{
|
|
|
- return ClassPackage::with(['products', 'unitPackages', 'groups'])->find($id);
|
|
|
|
|
|
|
+ return ClassPackage::with(['products', 'unitPackages', 'groups', 'pavaoProposal.products.product', 'irrecusableProposal.products.product'])->find($id);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function create(array $data): ClassPackage
|
|
public function create(array $data): ClassPackage
|
|
@@ -29,7 +34,9 @@ public function create(array $data): ClassPackage
|
|
|
$materials = $data['materials'] ?? [];
|
|
$materials = $data['materials'] ?? [];
|
|
|
$unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
$unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
|
$groupIds = $data['group_ids'] ?? [];
|
|
$groupIds = $data['group_ids'] ?? [];
|
|
|
- unset($data['materials'], $data['unit_visibilities'], $data['group_ids']);
|
|
|
|
|
|
|
+ $pavao = $data['pavao'] ?? [];
|
|
|
|
|
+ $irrecusavel = $data['irrecusavel'] ?? [];
|
|
|
|
|
+ unset($data['materials'], $data['unit_visibilities'], $data['group_ids'], $data['pavao'], $data['irrecusavel']);
|
|
|
|
|
|
|
|
$data['contract_material_value'] = $this->calcMaterialValue($materials);
|
|
$data['contract_material_value'] = $this->calcMaterialValue($materials);
|
|
|
|
|
|
|
@@ -37,8 +44,11 @@ public function create(array $data): ClassPackage
|
|
|
|
|
|
|
|
$this->syncMaterials($package, $materials);
|
|
$this->syncMaterials($package, $materials);
|
|
|
|
|
|
|
|
|
|
+ $this->pricingService->upsert(PavaoProposal::class, PavaoProposalProduct::class, 'class_package_id', $package->id, $pavao);
|
|
|
|
|
+ $this->pricingService->upsert(IrrecusableProposal::class, IrrecusableProposalProduct::class, 'class_package_id', $package->id, $irrecusavel, withCondition: true);
|
|
|
|
|
+
|
|
|
// Replicate to all units (all start visible = true)
|
|
// Replicate to all units (all start visible = true)
|
|
|
- $this->replicateToAllUnits($package->load('products'));
|
|
|
|
|
|
|
+ $this->replicateToAllUnits($package->load(['products', 'pavaoProposal.products', 'irrecusableProposal.products']));
|
|
|
|
|
|
|
|
// Sync selected groups
|
|
// Sync selected groups
|
|
|
if (!empty($groupIds)) {
|
|
if (!empty($groupIds)) {
|
|
@@ -48,7 +58,7 @@ public function create(array $data): ClassPackage
|
|
|
// Apply visibility overrides
|
|
// Apply visibility overrides
|
|
|
$this->applyVisibilityOverrides($package, $unitVisibilities, $groupIds);
|
|
$this->applyVisibilityOverrides($package, $unitVisibilities, $groupIds);
|
|
|
|
|
|
|
|
- return $package->load(['products', 'unitPackages', 'groups']);
|
|
|
|
|
|
|
+ return $package->load(['products', 'unitPackages', 'groups', 'pavaoProposal.products.product', 'irrecusableProposal.products.product']);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function update(int $id, array $data): ?ClassPackage
|
|
public function update(int $id, array $data): ?ClassPackage
|
|
@@ -59,7 +69,9 @@ public function update(int $id, array $data): ?ClassPackage
|
|
|
$materials = $data['materials'] ?? null;
|
|
$materials = $data['materials'] ?? null;
|
|
|
$unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
$unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
|
$groupIds = array_key_exists('group_ids', $data) ? ($data['group_ids'] ?? []) : null;
|
|
$groupIds = array_key_exists('group_ids', $data) ? ($data['group_ids'] ?? []) : null;
|
|
|
- unset($data['materials'], $data['unit_visibilities'], $data['group_ids']);
|
|
|
|
|
|
|
+ $pavao = $data['pavao'] ?? null;
|
|
|
|
|
+ $irrecusavel = $data['irrecusavel'] ?? null;
|
|
|
|
|
+ unset($data['materials'], $data['unit_visibilities'], $data['group_ids'], $data['pavao'], $data['irrecusavel']);
|
|
|
|
|
|
|
|
if ($materials !== null) {
|
|
if ($materials !== null) {
|
|
|
$data['contract_material_value'] = $this->calcMaterialValue($materials);
|
|
$data['contract_material_value'] = $this->calcMaterialValue($materials);
|
|
@@ -84,6 +96,15 @@ public function update(int $id, array $data): ?ClassPackage
|
|
|
$this->syncUnitPackageProducts($package->load('products'));
|
|
$this->syncUnitPackageProducts($package->load('products'));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Pavão/Irrecusável updates never propagate to already-cloned unit copies.
|
|
|
|
|
+ if ($pavao !== null) {
|
|
|
|
|
+ $this->pricingService->upsert(PavaoProposal::class, PavaoProposalProduct::class, 'class_package_id', $package->id, $pavao);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($irrecusavel !== null) {
|
|
|
|
|
+ $this->pricingService->upsert(IrrecusableProposal::class, IrrecusableProposalProduct::class, 'class_package_id', $package->id, $irrecusavel, withCondition: true);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if ($groupIds !== null) {
|
|
if ($groupIds !== null) {
|
|
|
$package->groups()->sync($groupIds);
|
|
$package->groups()->sync($groupIds);
|
|
|
}
|
|
}
|
|
@@ -95,7 +116,7 @@ public function update(int $id, array $data): ?ClassPackage
|
|
|
$this->applyVisibilityOverrides($package, $unitVisibilities, $currentGroupIds);
|
|
$this->applyVisibilityOverrides($package, $unitVisibilities, $currentGroupIds);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return $package->fresh(['products', 'unitPackages', 'groups']);
|
|
|
|
|
|
|
+ return $package->fresh(['products', 'unitPackages', 'groups', 'pavaoProposal.products.product', 'irrecusableProposal.products.product']);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function delete(int $id): bool
|
|
public function delete(int $id): bool
|