$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' => sprintf( 'Назначена доставка на %s, водитель %s.', $delivery->delivery_date->format('d.m.Y'), $delivery->driver()->value('name') ?? '—', ), ]); return $delivery; }); } /** @param array $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 $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' => sprintf( 'Назначен монтаж на %s, бригадир %s.', $installation->installation_date->format('d.m.Y'), $installation->brigadier()->value('name') ?? '—', ), ]); $this->syncInstallationSchedules($installation); return $installation; }); } /** @param array $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, ]); } } }