|
@@ -15,19 +15,23 @@ public function getAll(): Collection
|
|
|
|
|
|
|
|
public function findById(int $id): ?ClassPackage
|
|
public function findById(int $id): ?ClassPackage
|
|
|
{
|
|
{
|
|
|
- return ClassPackage::with('units')->find($id);
|
|
|
|
|
|
|
+ return ClassPackage::with(['units', 'products'])->find($id);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function create(array $data): ClassPackage
|
|
public function create(array $data): ClassPackage
|
|
|
{
|
|
{
|
|
|
$unitVisibilities = $data['unit_visibilities'] ?? [];
|
|
$unitVisibilities = $data['unit_visibilities'] ?? [];
|
|
|
- unset($data['unit_visibilities']);
|
|
|
|
|
|
|
+ $materials = $data['materials'] ?? [];
|
|
|
|
|
+ unset($data['unit_visibilities'], $data['materials']);
|
|
|
|
|
+
|
|
|
|
|
+ $data['contract_material_value'] = $this->calcMaterialValue($materials);
|
|
|
|
|
|
|
|
$package = ClassPackage::create($data);
|
|
$package = ClassPackage::create($data);
|
|
|
|
|
|
|
|
$this->syncUnitVisibilities($package, $unitVisibilities);
|
|
$this->syncUnitVisibilities($package, $unitVisibilities);
|
|
|
|
|
+ $this->syncMaterials($package, $materials);
|
|
|
|
|
|
|
|
- return $package->load('units');
|
|
|
|
|
|
|
+ return $package->load(['units', 'products']);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function update(int $id, array $data): ?ClassPackage
|
|
public function update(int $id, array $data): ?ClassPackage
|
|
@@ -36,7 +40,12 @@ public function update(int $id, array $data): ?ClassPackage
|
|
|
if (!$package) return null;
|
|
if (!$package) return null;
|
|
|
|
|
|
|
|
$unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
$unitVisibilities = $data['unit_visibilities'] ?? null;
|
|
|
- unset($data['unit_visibilities']);
|
|
|
|
|
|
|
+ $materials = $data['materials'] ?? null;
|
|
|
|
|
+ unset($data['unit_visibilities'], $data['materials']);
|
|
|
|
|
+
|
|
|
|
|
+ if ($materials !== null) {
|
|
|
|
|
+ $data['contract_material_value'] = $this->calcMaterialValue($materials);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
$package->update($data);
|
|
$package->update($data);
|
|
|
|
|
|
|
@@ -44,7 +53,11 @@ public function update(int $id, array $data): ?ClassPackage
|
|
|
$this->syncUnitVisibilities($package, $unitVisibilities);
|
|
$this->syncUnitVisibilities($package, $unitVisibilities);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return $package->fresh('units');
|
|
|
|
|
|
|
+ if ($materials !== null) {
|
|
|
|
|
+ $this->syncMaterials($package, $materials);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return $package->fresh(['units', 'products']);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function delete(int $id): bool
|
|
public function delete(int $id): bool
|
|
@@ -58,7 +71,7 @@ public function delete(int $id): bool
|
|
|
public function getAllUnitsWithVisibility(int $packageId): \Illuminate\Support\Collection
|
|
public function getAllUnitsWithVisibility(int $packageId): \Illuminate\Support\Collection
|
|
|
{
|
|
{
|
|
|
$allUnits = Unit::orderBy('fantasy_name')->get(['id', 'fantasy_name']);
|
|
$allUnits = Unit::orderBy('fantasy_name')->get(['id', 'fantasy_name']);
|
|
|
- $package = ClassPackage::with('units')->find($packageId);
|
|
|
|
|
|
|
+ $package = ClassPackage::with('units')->find($packageId);
|
|
|
|
|
|
|
|
$visibilityMap = $package
|
|
$visibilityMap = $package
|
|
|
? $package->units->keyBy('id')
|
|
? $package->units->keyBy('id')
|
|
@@ -81,4 +94,21 @@ private function syncUnitVisibilities(ClassPackage $package, array $unitVisibili
|
|
|
}
|
|
}
|
|
|
$package->units()->sync($syncData);
|
|
$package->units()->sync($syncData);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private function syncMaterials(ClassPackage $package, array $materials): void
|
|
|
|
|
+ {
|
|
|
|
|
+ $syncData = [];
|
|
|
|
|
+ foreach ($materials as $m) {
|
|
|
|
|
+ $syncData[$m['product_id']] = [
|
|
|
|
|
+ 'quantity' => $m['quantity'],
|
|
|
|
|
+ 'price' => $m['price'],
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ $package->products()->sync($syncData);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private function calcMaterialValue(array $materials): float
|
|
|
|
|
+ {
|
|
|
|
|
+ return array_reduce($materials, fn($carry, $m) => $carry + ($m['quantity'] * $m['price']), 0.0);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|