| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <?php
- declare(strict_types=1);
- namespace App\Http\Controllers;
- use App\Http\Requests\SaveProductionOrderDeliveryRequest;
- use App\Models\ProductionOrder;
- use App\Models\ProductionOrderDelivery;
- use App\Services\ProductionOrderPlanningService;
- use Carbon\CarbonImmutable;
- use Carbon\CarbonInterface;
- use Illuminate\Contracts\View\View;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- class ProductionOrderDeliveryController extends Controller
- {
- public function index(Request $request): View
- {
- $validated = $request->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),
- ));
- }
- }
|