ProductionOrderDeliveryController.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Http\Controllers;
  4. use App\Http\Requests\SaveProductionOrderDeliveryRequest;
  5. use App\Models\ProductionOrder;
  6. use App\Models\ProductionOrderDelivery;
  7. use App\Services\ProductionOrderPlanningService;
  8. use Carbon\CarbonImmutable;
  9. use Carbon\CarbonInterface;
  10. use Illuminate\Contracts\View\View;
  11. use Illuminate\Http\RedirectResponse;
  12. use Illuminate\Http\Request;
  13. class ProductionOrderDeliveryController extends Controller
  14. {
  15. public function index(Request $request): View
  16. {
  17. $validated = $request->validate([
  18. 'week' => ['nullable', 'date'],
  19. ]);
  20. $weekStart = CarbonImmutable::parse($validated['week'] ?? now())
  21. ->startOfWeek(CarbonInterface::MONDAY);
  22. $weekEnd = $weekStart->endOfWeek(CarbonInterface::SUNDAY);
  23. $days = collect(range(0, 6))->mapWithKeys(static function (int $offset) use ($weekStart): array {
  24. $date = $weekStart->addDays($offset);
  25. return [$date->toDateString() => $date];
  26. });
  27. $deliveries = ProductionOrderDelivery::query()
  28. ->whereBetween('delivery_date', [$weekStart->toDateString(), $weekEnd->toDateString()])
  29. ->with(['productionOrder', 'driver'])
  30. ->orderBy('delivery_date')
  31. ->orderBy('delivery_time')
  32. ->orderBy('id')
  33. ->get()
  34. ->groupBy(fn (ProductionOrderDelivery $delivery): string => $delivery->delivery_date->toDateString());
  35. $nav = $this->startNavigationContext($request);
  36. return view('production_order_deliveries.index', [
  37. 'active' => 'schedule_deliveries',
  38. 'title' => 'График доставок',
  39. 'days' => $days,
  40. 'deliveries' => $deliveries,
  41. 'weekStart' => $weekStart,
  42. 'weekEnd' => $weekEnd,
  43. 'previousWeek' => $weekStart->subWeek()->toDateString(),
  44. 'nextWeek' => $weekStart->addWeek()->toDateString(),
  45. 'nav' => $nav,
  46. ]);
  47. }
  48. public function store(
  49. SaveProductionOrderDeliveryRequest $request,
  50. ProductionOrder $productionOrder,
  51. ProductionOrderPlanningService $service,
  52. ): RedirectResponse {
  53. $service->createDelivery($productionOrder, $request->validated(), $request->user());
  54. return $this->redirectToOrder($request, $productionOrder)
  55. ->with('success', 'Доставка добавлена.');
  56. }
  57. public function update(
  58. SaveProductionOrderDeliveryRequest $request,
  59. ProductionOrder $productionOrder,
  60. ProductionOrderDelivery $delivery,
  61. ProductionOrderPlanningService $service,
  62. ): RedirectResponse {
  63. $this->assertBelongsToOrder($productionOrder, $delivery);
  64. $service->updateDelivery($delivery, $request->validated(), $request->user());
  65. return $this->redirectToOrder($request, $productionOrder)
  66. ->with('success', 'Доставка обновлена.');
  67. }
  68. public function destroy(
  69. Request $request,
  70. ProductionOrder $productionOrder,
  71. ProductionOrderDelivery $delivery,
  72. ProductionOrderPlanningService $service,
  73. ): RedirectResponse {
  74. $this->assertBelongsToOrder($productionOrder, $delivery);
  75. $service->deleteDelivery($delivery);
  76. return $this->redirectToOrder($request, $productionOrder)
  77. ->with('success', 'Доставка удалена.');
  78. }
  79. private function assertBelongsToOrder(
  80. ProductionOrder $order,
  81. ProductionOrderDelivery $delivery,
  82. ): void {
  83. abort_unless($delivery->production_order_id === $order->id, 404);
  84. }
  85. private function redirectToOrder(Request $request, ProductionOrder $order): RedirectResponse
  86. {
  87. return redirect()->route('schedule.orders.show', $this->withNav(
  88. ['productionOrder' => $order],
  89. $this->resolveNavToken($request),
  90. ));
  91. }
  92. }