SparePartOrderController.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\ShipSparePartOrderRequest;
  4. use App\Http\Requests\StoreSparePartOrderRequest;
  5. use App\Models\SparePart;
  6. use App\Models\SparePartOrder;
  7. use App\Models\SparePartOrdersView;
  8. use Illuminate\Http\RedirectResponse;
  9. use Illuminate\Http\Request;
  10. class SparePartOrderController extends Controller
  11. {
  12. protected array $data = [
  13. 'active' => 'spare_parts',
  14. 'title' => 'Заказы деталей',
  15. 'id' => 'spare_part_orders',
  16. 'header' => [
  17. 'id' => 'ID',
  18. 'year' => 'Год',
  19. 'article' => 'Артикул',
  20. 'source_text' => 'Источник заказа',
  21. 'status' => 'Статус',
  22. 'ordered_quantity' => 'Заказано',
  23. 'remaining_quantity' => 'Остаток',
  24. 'with_documents' => 'С документами',
  25. 'note' => 'Примечание',
  26. 'user_name' => 'Менеджер',
  27. 'created_at' => 'Дата создания',
  28. ],
  29. 'searchFields' => [
  30. 'article',
  31. 'source_text',
  32. 'note',
  33. 'user_name',
  34. ],
  35. 'routeName' => 'spare_part_orders.show',
  36. ];
  37. public function index(Request $request)
  38. {
  39. session(['gp_spare_part_orders' => $request->query()]);
  40. $model = new SparePartOrdersView();
  41. // Фильтры
  42. $this->createFilters($model, 'year', 'article', 'status', 'with_documents');
  43. $this->createRangeFilters($model, 'ordered_quantity', 'remaining_quantity');
  44. $this->createDateFilters($model, 'created_at');
  45. // Запрос
  46. $q = $model::query();
  47. // Специальная обработка фильтров из клика по каталогу
  48. if ($request->has('spare_part_id')) {
  49. $sparePart = SparePart::find($request->get('spare_part_id'));
  50. if ($sparePart) {
  51. $q->where('spare_part_id', $sparePart->id);
  52. $this->data['filter_spare_part'] = $sparePart;
  53. }
  54. }
  55. if ($request->has('with_documents')) {
  56. $withDocs = filter_var($request->get('with_documents'), FILTER_VALIDATE_BOOLEAN);
  57. $q->where('with_documents', $withDocs);
  58. }
  59. if ($request->has('status')) {
  60. $q->where('status', $request->get('status'));
  61. }
  62. if ($request->has('remaining_quantity_min')) {
  63. $q->where('remaining_quantity', '>=', $request->get('remaining_quantity_min'));
  64. }
  65. $this->acceptFilters($q, $request);
  66. $this->acceptSearch($q, $request);
  67. $this->setSortAndOrderBy($model, $request);
  68. $q->orderBy($this->data['sortBy'], $this->data['orderBy']);
  69. $this->data['spare_part_orders'] = $q->paginate(session('per_page', config('pagination.per_page')))->withQueryString();
  70. $this->data['strings'] = $this->data['spare_part_orders'];
  71. $this->data['tab'] = 'orders';
  72. return view('spare_parts.index', $this->data);
  73. }
  74. public function show(Request $request, SparePartOrder $sparePartOrder)
  75. {
  76. $this->data['previous_url'] = $request->get('previous_url');
  77. $this->data['spare_part_order'] = $sparePartOrder->load(['sparePart', 'shipments.user', 'shipments.reclamation']);
  78. $this->data['spare_parts'] = SparePart::orderBy('article')->get();
  79. return view('spare_part_orders.edit', $this->data);
  80. }
  81. public function create()
  82. {
  83. $this->data['spare_part_order'] = null;
  84. $this->data['spare_parts'] = SparePart::orderBy('article')->get();
  85. return view('spare_part_orders.edit', $this->data);
  86. }
  87. public function store(StoreSparePartOrderRequest $request): RedirectResponse
  88. {
  89. $data = $request->validated();
  90. $data['user_id'] = auth()->id();
  91. SparePartOrder::create($data);
  92. $previous_url = $request->get('previous_url') ?? route('spare_part_orders.index', session('gp_spare_part_orders'));
  93. return redirect()->to($previous_url)->with(['success' => 'Заказ детали успешно создан!']);
  94. }
  95. public function update(StoreSparePartOrderRequest $request, SparePartOrder $sparePartOrder): RedirectResponse
  96. {
  97. $sparePartOrder->update($request->validated());
  98. $previous_url = $request->get('previous_url') ?? route('spare_part_orders.index', session('gp_spare_part_orders'));
  99. return redirect()->to($previous_url)->with(['success' => 'Заказ детали успешно обновлён!']);
  100. }
  101. public function destroy(SparePartOrder $sparePartOrder): RedirectResponse
  102. {
  103. $sparePartOrder->delete();
  104. return redirect()->route('spare_part_orders.index', session('gp_spare_part_orders'))
  105. ->with(['success' => 'Заказ детали успешно удалён!']);
  106. }
  107. public function ship(ShipSparePartOrderRequest $request, SparePartOrder $sparePartOrder): RedirectResponse
  108. {
  109. $validated = $request->validated();
  110. if ($validated['quantity'] > $sparePartOrder->remaining_quantity) {
  111. return redirect()->route('spare_part_orders.show', $sparePartOrder)
  112. ->with(['error' => 'Количество отгрузки превышает остаток!']);
  113. }
  114. $success = $sparePartOrder->shipQuantity(
  115. $validated['quantity'],
  116. $validated['note'],
  117. null,
  118. auth()->id()
  119. );
  120. if ($success) {
  121. return redirect()->route('spare_part_orders.show', $sparePartOrder)
  122. ->with(['success' => 'Отгрузка успешно выполнена!']);
  123. } else {
  124. return redirect()->route('spare_part_orders.show', $sparePartOrder)
  125. ->with(['error' => 'Ошибка отгрузки!']);
  126. }
  127. }
  128. public function setInStock(SparePartOrder $sparePartOrder): RedirectResponse
  129. {
  130. $sparePartOrder->update(['status' => SparePartOrder::STATUS_IN_STOCK]);
  131. return redirect()->route('spare_part_orders.show', $sparePartOrder)
  132. ->with(['success' => 'Статус изменён на "На складе"!']);
  133. }
  134. }