validate([ 'week' => ['nullable', 'date'], ]); $weekStart = CarbonImmutable::parse($validated['week'] ?? now()) ->startOfWeek(CarbonInterface::MONDAY); $weekEnd = $weekStart->endOfWeek(CarbonInterface::SUNDAY); $days = collect(range(0, 6))->mapWithKeys(static function (int $offset) use ($weekStart): array { $date = $weekStart->addDays($offset); return [$date->toDateString() => $date]; }); $deliveries = ProductionOrderDelivery::query() ->whereBetween('delivery_date', [$weekStart->toDateString(), $weekEnd->toDateString()]) ->with(['productionOrder', 'driver']) ->orderBy('delivery_date') ->orderBy('delivery_time') ->orderBy('id') ->get() ->groupBy(fn (ProductionOrderDelivery $delivery): string => $delivery->delivery_date->toDateString()); $nav = $this->startNavigationContext($request); return view('production_order_deliveries.index', [ 'active' => 'schedule_deliveries', 'title' => 'График доставок', 'days' => $days, 'deliveries' => $deliveries, 'weekStart' => $weekStart, 'weekEnd' => $weekEnd, 'previousWeek' => $weekStart->subWeek()->toDateString(), 'nextWeek' => $weekStart->addWeek()->toDateString(), 'nav' => $nav, ]); } public function store( SaveProductionOrderDeliveryRequest $request, ProductionOrder $productionOrder, ProductionOrderPlanningService $service, ): RedirectResponse { $service->createDelivery($productionOrder, $request->validated(), $request->user()); return $this->redirectToOrder($request, $productionOrder) ->with('success', 'Доставка добавлена.'); } public function update( SaveProductionOrderDeliveryRequest $request, ProductionOrder $productionOrder, ProductionOrderDelivery $delivery, ProductionOrderPlanningService $service, ): RedirectResponse { $this->assertBelongsToOrder($productionOrder, $delivery); $service->updateDelivery($delivery, $request->validated(), $request->user()); return $this->redirectToOrder($request, $productionOrder) ->with('success', 'Доставка обновлена.'); } public function destroy( Request $request, ProductionOrder $productionOrder, ProductionOrderDelivery $delivery, ProductionOrderPlanningService $service, ): RedirectResponse { $this->assertBelongsToOrder($productionOrder, $delivery); $service->deleteDelivery($delivery); return $this->redirectToOrder($request, $productionOrder) ->with('success', 'Доставка удалена.'); } private function assertBelongsToOrder( ProductionOrder $order, ProductionOrderDelivery $delivery, ): void { abort_unless($delivery->production_order_id === $order->id, 404); } private function redirectToOrder(Request $request, ProductionOrder $order): RedirectResponse { return redirect()->route('schedule.orders.show', $this->withNav( ['productionOrder' => $order], $this->resolveNavToken($request), )); } }