| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- <?php
- declare(strict_types=1);
- namespace App\Services;
- use App\Enums\ProductionOrderActivityType;
- use App\Models\ProductionOrder;
- use App\Models\ProductionOrderDelivery;
- use App\Models\ProductionOrderInstallation;
- use App\Models\Schedule;
- use App\Models\User;
- use Illuminate\Support\Facades\DB;
- class ProductionOrderPlanningService
- {
- /** @param array<string, mixed> $data */
- public function createDelivery(ProductionOrder $order, array $data, User $actor): ProductionOrderDelivery
- {
- return DB::transaction(function () use ($order, $data, $actor): ProductionOrderDelivery {
- unset($data['nav']);
- $delivery = $order->deliveries()->create($data + [
- 'created_by' => $actor->id,
- 'updated_by' => $actor->id,
- ]);
- $order->activities()->create([
- 'type' => ProductionOrderActivityType::DeliveryScheduled,
- 'user_id' => $actor->id,
- 'delivery_id' => $delivery->id,
- 'message' => 'Заказ добавлен в график доставок.',
- ]);
- return $delivery;
- });
- }
- /** @param array<string, mixed> $data */
- public function updateDelivery(ProductionOrderDelivery $delivery, array $data, User $actor): void
- {
- unset($data['nav']);
- $delivery->update($data + ['updated_by' => $actor->id]);
- }
- public function deleteDelivery(ProductionOrderDelivery $delivery): void
- {
- $delivery->delete();
- }
- /** @param array<string, mixed> $data */
- public function createInstallation(ProductionOrder $order, array $data, User $actor): ProductionOrderInstallation
- {
- return DB::transaction(function () use ($order, $data, $actor): ProductionOrderInstallation {
- unset($data['nav']);
- $installation = $order->installations()->create($data + [
- 'created_by' => $actor->id,
- 'updated_by' => $actor->id,
- ]);
- $order->activities()->create([
- 'type' => ProductionOrderActivityType::InstallationScheduled,
- 'user_id' => $actor->id,
- 'installation_id' => $installation->id,
- 'message' => 'Заказ добавлен в график монтажей.',
- ]);
- $this->syncInstallationSchedules($installation);
- return $installation;
- });
- }
- /** @param array<string, mixed> $data */
- public function updateInstallation(ProductionOrderInstallation $installation, array $data, User $actor): void
- {
- DB::transaction(function () use ($installation, $data, $actor): void {
- unset($data['nav']);
- $installation->update($data + ['updated_by' => $actor->id]);
- $this->syncInstallationSchedules($installation);
- });
- }
- public function deleteInstallation(ProductionOrderInstallation $installation): void
- {
- DB::transaction(function () use ($installation): void {
- $installation->schedules()->delete();
- $installation->delete();
- });
- }
- private function syncInstallationSchedules(ProductionOrderInstallation $installation): void
- {
- $installation->schedules()->delete();
- $order = $installation->productionOrder()->with('items.catalogItem')->firstOrFail();
- $equipment = $order->items
- ->groupBy('common_catalog_item_id')
- ->map(static function ($items): string {
- $article = $items->first()->catalogItem?->article ?? 'Без артикула';
- return $article.' - '.$items->count();
- })
- ->implode("\r\n");
- for ($offset = 0; $offset < $installation->installation_days; $offset++) {
- Schedule::query()->create([
- 'production_order_installation_id' => $installation->id,
- 'address_code' => $order->order_number,
- 'source' => Schedule::SOURCE_PRODUCTION_ORDER,
- 'installation_date' => $installation->installation_date->addDays($offset)->toDateString(),
- 'manual' => false,
- 'district_id' => null,
- 'area_id' => null,
- 'object_address' => $order->object_address,
- 'object_type' => $order->executionTypeLabel(),
- 'mafs' => $equipment,
- 'mafs_count' => $order->items->count(),
- 'brigadier_id' => $installation->brigadier_id,
- 'comment' => $installation->note,
- ]);
- }
- }
- }
|