ProductionOrderInstallationController.php 2.7 KB

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