edit.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="container-fluid">
  4. <div class="row">
  5. <div class="col-12">
  6. <h2>{{ $spare_part ? 'Редактирование запчасти' : 'Создание запчасти' }}</h2>
  7. @if($spare_part && hasRole('admin'))
  8. <div class="mb-3">
  9. <label class="form-label">Загрузить изображение</label>
  10. <form action="{{ route('spare_parts.upload_image', $spare_part) }}"
  11. method="POST"
  12. enctype="multipart/form-data"
  13. id="imageUploadForm">
  14. @csrf
  15. <input type="file" name="image" class="form-control" accept="image/*">
  16. <button type="submit" class="btn btn-sm btn-primary mt-2">Загрузить</button>
  17. </form>
  18. </div>
  19. @endif
  20. <form action="{{ $spare_part ? route('spare_parts.update', $spare_part) : route('spare_parts.store') }}"
  21. method="POST">
  22. @csrf
  23. @if($spare_part)
  24. @method('PUT')
  25. @endif
  26. <input type="hidden" name="previous_url" value="{{ $previous_url ?? url()->previous() }}">
  27. <div class="row">
  28. {{-- Левая колонка --}}
  29. <div class="col-md-6">
  30. @if($spare_part && $spare_part->image)
  31. <div class="mb-3">
  32. <img src="{{ $spare_part->image }}" alt="{{ $spare_part->article }}" class="img-fluid" style="max-width: 200px;">
  33. </div>
  34. @endif
  35. <div class="mb-3">
  36. <label for="article" class="form-label">Артикул <span class="text-danger">*</span></label>
  37. <input type="text"
  38. class="form-control"
  39. id="article"
  40. name="article"
  41. value="{{ old('article', $spare_part->article ?? '') }}"
  42. {{ hasRole('admin') ? '' : 'readonly' }}
  43. required>
  44. </div>
  45. <div class="mb-3">
  46. <label for="used_in_maf" class="form-label">Где используется</label>
  47. <input type="text"
  48. class="form-control"
  49. id="used_in_maf"
  50. name="used_in_maf"
  51. value="{{ old('used_in_maf', $spare_part->used_in_maf ?? '') }}"
  52. {{ hasRole('admin') ? '' : 'readonly' }}>
  53. </div>
  54. <div class="mb-3">
  55. <label for="note" class="form-label">Примечание</label>
  56. <textarea class="form-control"
  57. id="note"
  58. name="note"
  59. rows="3"
  60. {{ hasRole('admin') ? '' : 'readonly' }}>{{ old('note', $spare_part->note ?? '') }}</textarea>
  61. </div>
  62. </div>
  63. {{-- Правая колонка --}}
  64. <div class="col-md-6">
  65. @if(hasRole('admin'))
  66. <div class="mb-3">
  67. <label for="purchase_price" class="form-label">Цена закупки (руб.)</label>
  68. <input type="number"
  69. class="form-control"
  70. id="purchase_price"
  71. name="purchase_price"
  72. step="0.01"
  73. value="{{ old('purchase_price', $spare_part->purchase_price ?? '') }}">
  74. </div>
  75. @endif
  76. <div class="mb-3">
  77. <label for="customer_price" class="form-label">Цена для заказчика (руб.)</label>
  78. <input type="number"
  79. class="form-control"
  80. id="customer_price"
  81. name="customer_price"
  82. step="0.01"
  83. value="{{ old('customer_price', $spare_part->customer_price ?? '') }}"
  84. {{ hasRole('admin') ? '' : 'readonly' }}>
  85. </div>
  86. <div class="mb-3">
  87. <label for="expertise_price" class="form-label">Цена экспертизы (руб.)</label>
  88. <input type="number"
  89. class="form-control"
  90. id="expertise_price"
  91. name="expertise_price"
  92. step="0.01"
  93. value="{{ old('expertise_price', $spare_part->expertise_price ?? '') }}"
  94. {{ hasRole('admin') ? '' : 'readonly' }}>
  95. </div>
  96. <div class="mb-3">
  97. <label for="tsn_number" class="form-label">№ по ТСН</label>
  98. <input type="text"
  99. class="form-control"
  100. id="tsn_number"
  101. name="tsn_number"
  102. value="{{ old('tsn_number', $spare_part->tsn_number ?? '') }}"
  103. {{ hasRole('admin') ? '' : 'readonly' }}>
  104. <div class="form-text" id="tsn_number_hint"></div>
  105. </div>
  106. <div class="mb-3" id="tsn_description_block" style="display: none;">
  107. <label for="tsn_number_description" class="form-label">Расшифровка № по ТСН</label>
  108. <input type="text"
  109. class="form-control"
  110. id="tsn_number_description"
  111. name="tsn_number_description"
  112. placeholder="Введите расшифровку для нового номера"
  113. {{ hasRole('admin') ? '' : 'readonly' }}>
  114. <div class="form-text text-muted">Расшифровка будет сохранена в справочник при сохранении запчасти</div>
  115. </div>
  116. <div class="mb-3">
  117. <label for="pricing_code" class="form-label">Шифр расценки</label>
  118. <input type="text"
  119. class="form-control"
  120. id="pricing_code"
  121. name="pricing_code"
  122. value="{{ old('pricing_code', $spare_part->pricing_code ?? '') }}"
  123. {{ hasRole('admin') ? '' : 'readonly' }}>
  124. <div class="form-text" id="pricing_code_hint"></div>
  125. </div>
  126. <div class="mb-3" id="pricing_code_description_block" style="display: none;">
  127. <label for="pricing_code_description" class="form-label">Расшифровка шифра расценки</label>
  128. <input type="text"
  129. class="form-control"
  130. id="pricing_code_description"
  131. name="pricing_code_description"
  132. placeholder="Введите расшифровку для нового шифра"
  133. {{ hasRole('admin') ? '' : 'readonly' }}>
  134. <div class="form-text text-muted">Расшифровка будет сохранена в справочник при сохранении запчасти</div>
  135. </div>
  136. <div class="mb-3">
  137. <label for="min_stock" class="form-label">Минимальный остаток</label>
  138. <input type="number"
  139. class="form-control"
  140. id="min_stock"
  141. name="min_stock"
  142. value="{{ old('min_stock', $spare_part->min_stock ?? 0) }}"
  143. {{ hasRole('admin') ? '' : 'readonly' }}>
  144. </div>
  145. </div>
  146. </div>
  147. <div class="row">
  148. <div class="col-12">
  149. @if(hasRole('admin'))
  150. <button type="submit" class="btn btn-success">Сохранить</button>
  151. @endif
  152. <a href="{{ $previous_url ?? route('spare_parts.index') }}" class="btn btn-secondary">Назад</a>
  153. @if($spare_part && hasRole('admin'))
  154. <button type="button" class="btn btn-danger float-end" data-bs-toggle="modal" data-bs-target="#deleteModal">
  155. Удалить
  156. </button>
  157. @endif
  158. </div>
  159. </div>
  160. </form>
  161. </div>
  162. </div>
  163. </div>
  164. @if($spare_part && hasRole('admin'))
  165. {{-- Модальное окно удаления --}}
  166. <div class="modal fade" id="deleteModal" tabindex="-1">
  167. <div class="modal-dialog">
  168. <div class="modal-content">
  169. <div class="modal-header">
  170. <h5 class="modal-title">Подтверждение удаления</h5>
  171. <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
  172. </div>
  173. <div class="modal-body">
  174. Вы действительно хотите удалить запчасть "{{ $spare_part->article }}"?
  175. </div>
  176. <div class="modal-footer">
  177. <form action="{{ route('spare_parts.destroy', $spare_part) }}" method="POST">
  178. @csrf
  179. @method('DELETE')
  180. <button type="submit" class="btn btn-danger">Удалить</button>
  181. <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
  182. </form>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. @endif
  188. @push('scripts')
  189. <script>
  190. $(document).ready(function() {
  191. @if(hasRole('admin'))
  192. // Автозаполнение для № по ТСН
  193. $('#tsn_number').on('input', function() {
  194. const code = $(this).val().trim();
  195. if (code.length > 0) {
  196. $.get('{{ route('pricing_codes.get_description') }}', {
  197. type: 'tsn_number',
  198. code: code
  199. }, function(data) {
  200. if (data.description) {
  201. $('#tsn_number_hint').html('<i class="bi bi-info-circle text-success"></i> ' + data.description).removeClass('text-danger').addClass('text-success');
  202. $('#tsn_description_block').hide();
  203. $('#tsn_number_description').val('');
  204. } else {
  205. $('#tsn_number_hint').html('<i class="bi bi-exclamation-triangle text-warning"></i> Расшифровка не найдена').removeClass('text-success').addClass('text-warning');
  206. $('#tsn_description_block').show();
  207. }
  208. });
  209. } else {
  210. $('#tsn_number_hint').text('');
  211. $('#tsn_description_block').hide();
  212. }
  213. });
  214. // Автозаполнение для шифра расценки
  215. $('#pricing_code').on('input', function() {
  216. const code = $(this).val().trim();
  217. if (code.length > 0) {
  218. $.get('{{ route('pricing_codes.get_description') }}', {
  219. type: 'pricing_code',
  220. code: code
  221. }, function(data) {
  222. if (data.description) {
  223. $('#pricing_code_hint').html('<i class="bi bi-info-circle text-success"></i> ' + data.description).removeClass('text-danger').addClass('text-success');
  224. $('#pricing_code_description_block').hide();
  225. $('#pricing_code_description').val('');
  226. } else {
  227. $('#pricing_code_hint').html('<i class="bi bi-exclamation-triangle text-warning"></i> Расшифровка не найдена').removeClass('text-success').addClass('text-warning');
  228. $('#pricing_code_description_block').show();
  229. }
  230. });
  231. } else {
  232. $('#pricing_code_hint').text('');
  233. $('#pricing_code_description_block').hide();
  234. }
  235. });
  236. // Триггер при загрузке страницы
  237. $('#tsn_number').trigger('input');
  238. $('#pricing_code').trigger('input');
  239. @endif
  240. });
  241. </script>
  242. @endpush
  243. @endsection