ProductionOrderInstallationController.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Http\Controllers;
  4. use App\Http\Requests\SaveProductionOrderInstallationRequest;
  5. use App\Models\ProductionOrder;
  6. use App\Models\ProductionOrderInstallation;
  7. use App\Services\ProductionOrderPlanningService;
  8. use Illuminate\Http\RedirectResponse;
  9. use Illuminate\Http\Request;
  10. class ProductionOrderInstallationController extends Controller
  11. {
  12. public function store(
  13. SaveProductionOrderInstallationRequest $request,
  14. ProductionOrder $productionOrder,
  15. ProductionOrderPlanningService $service,
  16. ): RedirectResponse {
  17. $service->createInstallation($productionOrder, $request->validated(), $request->user());
  18. return $this->redirectToOrder($request, $productionOrder)
  19. ->with('success', 'Монтаж добавлен.');
  20. }
  21. public function update(
  22. SaveProductionOrderInstallationRequest $request,
  23. ProductionOrder $productionOrder,
  24. ProductionOrderInstallation $installation,
  25. ProductionOrderPlanningService $service,
  26. ): RedirectResponse {
  27. $this->assertBelongsToOrder($productionOrder, $installation);
  28. $service->updateInstallation($installation, $request->validated(), $request->user());
  29. return $this->redirectToOrder($request, $productionOrder)
  30. ->with('success', 'Монтаж обновлён.');
  31. }
  32. public function destroy(
  33. Request $request,
  34. ProductionOrder $productionOrder,
  35. ProductionOrderInstallation $installation,
  36. ProductionOrderPlanningService $service,
  37. ): RedirectResponse {
  38. $this->assertBelongsToOrder($productionOrder, $installation);
  39. $service->deleteInstallation($installation);
  40. return $this->redirectToOrder($request, $productionOrder)
  41. ->with('success', 'Монтаж удалён.');
  42. }
  43. private function assertBelongsToOrder(
  44. ProductionOrder $order,
  45. ProductionOrderInstallation $installation,
  46. ): void {
  47. abort_unless($installation->production_order_id === $order->id, 404);
  48. }
  49. private function redirectToOrder(Request $request, ProductionOrder $order): RedirectResponse
  50. {
  51. return redirect()->route('schedule.orders.show', $this->withNav(
  52. ['productionOrder' => $order],
  53. $this->resolveNavToken($request),
  54. ));
  55. }
  56. }