orders.blade.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="row mb-3 align-items-center">
  4. <div class="col-md-4"><h3 class="mb-0">Заказы склада</h3></div>
  5. <div class="col-md-8 text-md-end">
  6. @if(hasPermission('stock.orders.manage'))
  7. <button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#stockOrderSetInStockModal">
  8. <i class="bi bi-box-seam"></i> Весь заказ на складе
  9. </button>
  10. @endif
  11. @if(hasPermission('stock.orders.import'))
  12. <button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#stockImportModal">
  13. <i class="bi bi-upload"></i> Импорт
  14. </button>
  15. @endif
  16. @if(hasPermission('stock.orders.manage'))
  17. <button class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#stockOrderCreateModal">
  18. <i class="bi bi-plus-lg"></i> Добавить
  19. </button>
  20. @endif
  21. </div>
  22. </div>
  23. <ul class="nav nav-tabs mb-3">
  24. <li class="nav-item"><a class="nav-link" href="{{ route('stock.index') }}">Наличие</a></li>
  25. <li class="nav-item"><a class="nav-link active" href="{{ route('stock.orders') }}">Заказы</a></li>
  26. </ul>
  27. <form method="GET" action="{{ route('stock.orders') }}" class="d-flex flex-wrap gap-2 mb-3">
  28. <input type="search" name="search" value="{{ $search }}" class="form-control form-control-sm"
  29. style="max-width: 420px" placeholder="Номер заказа, артикул, наименование">
  30. <select name="status" class="form-select form-select-sm" style="max-width: 180px">
  31. <option value="">Все статусы</option>
  32. @foreach($statuses as $value => $label)<option value="{{ $value }}" @selected($status === $value)>{{ $label }}</option>@endforeach
  33. </select>
  34. <button class="btn btn-sm btn-outline-primary" type="submit"><i class="bi bi-search"></i> Найти</button>
  35. @if($search !== '' || $status !== '')<a class="btn btn-sm btn-outline-secondary" href="{{ route('stock.orders') }}">Сбросить</a>@endif
  36. </form>
  37. <div class="table-responsive">
  38. <table class="table table-sm table-bordered table-hover align-middle">
  39. <thead class="table-light">
  40. <tr>
  41. @include('stock.partials.column-header', ['name' => 'order_number', 'title' => '№ заказа'])
  42. @include('stock.partials.column-header', ['name' => 'item_article', 'title' => 'Артикул / наименование'])
  43. @include('stock.partials.column-header', ['name' => 'status_name', 'title' => 'Статус'])
  44. @include('stock.partials.column-header', ['name' => 'ordered_quantity', 'title' => 'Заказано', 'class' => 'text-end'])
  45. @include('stock.partials.column-header', ['name' => 'reserved_quantity', 'title' => 'Бронь', 'class' => 'text-end'])
  46. @include('stock.partials.column-header', ['name' => 'free_quantity', 'title' => 'Остаток', 'class' => 'text-end'])
  47. @include('stock.partials.column-header', ['name' => 'note', 'title' => 'Примечание'])
  48. @include('stock.partials.column-header', ['name' => 'created_at', 'title' => 'Добавлен'])
  49. <th></th>
  50. </tr>
  51. </thead>
  52. <tbody>
  53. @forelse($orders as $order)
  54. <tr>
  55. <td>{{ $order->order_number }}</td>
  56. <td><a href="{{ route('stock.show', $order->item) }}">{{ $order->item->article }}</a><div class="small text-muted">{{ $order->item->calculator_name }}</div></td>
  57. <td>{{ $order->status_name }}</td>
  58. <td class="text-end">{{ $order->ordered_quantity }}</td>
  59. <td class="text-end">{{ $order->reserved_quantity }}</td>
  60. <td class="text-end fw-semibold">{{ $order->free_quantity }}</td>
  61. <td>{{ $order->note }}</td>
  62. <td class="text-nowrap">{{ $order->created_at?->format('d.m.Y H:i') }}</td>
  63. <td class="text-nowrap">
  64. @if(hasPermission('stock.orders.manage'))
  65. <button type="button" class="btn btn-sm btn-outline-primary" data-bs-toggle="modal"
  66. data-bs-target="#stockOrderEdit{{ $order->id }}" title="Редактировать"><i class="bi bi-pencil"></i></button>
  67. <form action="{{ route('stock.orders.destroy', $order) }}" method="POST" class="d-inline"
  68. onsubmit="return confirm('Удалить складской заказ?')">
  69. @csrf @method('DELETE')
  70. <button class="btn btn-sm btn-outline-danger" title="Удалить"><i class="bi bi-trash"></i></button>
  71. </form>
  72. @endif
  73. </td>
  74. </tr>
  75. @empty
  76. <tr><td colspan="9" class="text-center text-muted py-4">Заказы не найдены.</td></tr>
  77. @endforelse
  78. </tbody>
  79. </table>
  80. </div>
  81. @include('partials.pagination', ['items' => $orders])
  82. @if(hasPermission('stock.orders.manage'))
  83. <div class="modal fade" id="stockOrderSetInStockModal" tabindex="-1" aria-hidden="true">
  84. <div class="modal-dialog"><div class="modal-content">
  85. <div class="modal-header"><h5 class="modal-title">Отметить весь заказ как «На складе»</h5><button class="btn-close" data-bs-dismiss="modal"></button></div>
  86. <form action="{{ route('stock.orders.set-in-stock') }}" method="POST">
  87. @csrf
  88. <div class="modal-body">
  89. <label for="bulk_order_number" class="form-label small">Номер заказа</label>
  90. <select id="bulk_order_number" name="bulk_order_number" class="form-select form-select-sm @error('bulk_order_number') is-invalid @enderror" required>
  91. <option value="">Выберите номер заказа</option>
  92. @foreach($orderedOrderNumbers as $orderNumber)
  93. <option value="{{ $orderNumber }}" @selected(old('bulk_order_number') === $orderNumber)>{{ $orderNumber }}</option>
  94. @endforeach
  95. </select>
  96. <div class="form-text">Доступны только номера с позициями в статусе «Заказан».</div>
  97. @error('bulk_order_number')<div class="invalid-feedback">{{ $message }}</div>@enderror
  98. </div>
  99. <div class="modal-footer"><button class="btn btn-sm btn-secondary" type="button" data-bs-dismiss="modal">Отмена</button><button class="btn btn-sm btn-primary" @disabled($orderedOrderNumbers->isEmpty())>На склад</button></div>
  100. </form>
  101. </div></div>
  102. </div>
  103. <div class="modal fade" id="stockOrderCreateModal" tabindex="-1" aria-hidden="true">
  104. <div class="modal-dialog"><div class="modal-content">
  105. <div class="modal-header"><h5 class="modal-title">Новый складской заказ</h5><button class="btn-close" data-bs-dismiss="modal"></button></div>
  106. <form action="{{ route('stock.orders.store') }}" method="POST">
  107. @csrf
  108. <div class="modal-body">@include('stock.partials.order-form', ['order' => null])</div>
  109. <div class="modal-footer"><button class="btn btn-sm btn-secondary" type="button" data-bs-dismiss="modal">Отмена</button><button class="btn btn-sm btn-primary">Создать</button></div>
  110. </form>
  111. </div></div>
  112. </div>
  113. @foreach($orders as $order)
  114. <div class="modal fade" id="stockOrderEdit{{ $order->id }}" tabindex="-1" aria-hidden="true">
  115. <div class="modal-dialog"><div class="modal-content">
  116. <div class="modal-header"><h5 class="modal-title">Заказ {{ $order->order_number }}</h5><button class="btn-close" data-bs-dismiss="modal"></button></div>
  117. <form action="{{ route('stock.orders.update', $order) }}" method="POST">
  118. @csrf @method('PUT')
  119. <div class="modal-body">@include('stock.partials.order-form', ['order' => $order])</div>
  120. <div class="modal-footer"><button class="btn btn-sm btn-secondary" type="button" data-bs-dismiss="modal">Отмена</button><button class="btn btn-sm btn-primary">Сохранить</button></div>
  121. </form>
  122. </div></div>
  123. </div>
  124. @endforeach
  125. @endif
  126. @if(hasPermission('stock.orders.import'))
  127. <div class="modal fade" id="stockImportModal" tabindex="-1" aria-hidden="true">
  128. <div class="modal-dialog"><div class="modal-content">
  129. <div class="modal-header"><h5 class="modal-title">Импорт складских заказов</h5><button class="btn-close" data-bs-dismiss="modal"></button></div>
  130. <form action="{{ route('stock.orders.import') }}" method="POST" enctype="multipart/form-data">
  131. @csrf
  132. <div class="modal-body">
  133. <p class="small text-muted">XLSX: Номер заказа, Артикул, Статус, Кол-во заказано, Примечание. Повторная строка обновляет заказ по номеру и артикулу.</p>
  134. <input class="form-control form-control-sm" type="file" name="import_file" accept=".xlsx" required>
  135. </div>
  136. <div class="modal-footer"><button class="btn btn-sm btn-secondary" type="button" data-bs-dismiss="modal">Отмена</button><button class="btn btn-sm btn-primary">Импортировать</button></div>
  137. </form>
  138. </div></div>
  139. </div>
  140. @endif
  141. @endsection