edit.blade.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. @extends('layouts.app')
  2. @section('content')
  3. <div class="px-3">
  4. <h4 class="mb-4">{{ $contractor ? 'Редактирование подрядчика' : 'Добавление подрядчика' }}</h4>
  5. @if(session('success'))
  6. <div class="alert alert-success alert-dismissible fade show" role="alert">
  7. {{ session('success') }}
  8. <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
  9. </div>
  10. @endif
  11. @if(session('contractor_import_errors'))
  12. <div class="alert alert-warning alert-dismissible fade show" role="alert">
  13. <div class="fw-bold mb-1">Ошибки импорта:</div>
  14. @foreach(session('contractor_import_errors') as $error)
  15. <div>{{ $error }}</div>
  16. @endforeach
  17. <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
  18. </div>
  19. @endif
  20. @if($errors->any())
  21. <div class="alert alert-danger alert-dismissible fade show" role="alert">
  22. @foreach($errors->all() as $error)
  23. <div>{{ $error }}</div>
  24. @endforeach
  25. <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
  26. </div>
  27. @endif
  28. <ul class="nav nav-tabs mb-3" role="tablist">
  29. <li class="nav-item" role="presentation">
  30. <button class="nav-link active" id="contractor-main-tab" data-bs-toggle="tab" data-bs-target="#contractor-main-pane" type="button" role="tab">
  31. Карточка
  32. </button>
  33. </li>
  34. @if($contractor)
  35. <li class="nav-item" role="presentation">
  36. <button class="nav-link" id="contractor-prices-tab" data-bs-toggle="tab" data-bs-target="#contractor-prices-pane" type="button" role="tab">
  37. Цены монтажа
  38. </button>
  39. </li>
  40. @endif
  41. </ul>
  42. <div class="tab-content">
  43. <div class="tab-pane fade show active" id="contractor-main-pane" role="tabpanel" aria-labelledby="contractor-main-tab">
  44. <div class="col-xxl-7 offset-xxl-1">
  45. <form action="{{ $contractor ? route('contractors.update', $contractor) : route('contractors.store') }}" method="post">
  46. @csrf
  47. @include('partials.input', ['name' => 'name', 'title' => 'Наименование подрядчика', 'required' => true, 'value' => $contractor->name ?? ''])
  48. @include('partials.input', ['name' => 'legal_name', 'title' => 'Юридическое имя', 'required' => true, 'value' => $contractor->legal_name ?? ''])
  49. @include('partials.input', ['name' => 'contract_number', 'title' => '№ договора', 'required' => true, 'value' => $contractor->contract_number ?? ''])
  50. @include('partials.input', ['name' => 'contract_date', 'title' => 'Дата договора', 'type' => 'date', 'required' => true, 'value' => optional($contractor?->contract_date)->format('Y-m-d')])
  51. @include('partials.input', ['name' => 'director_name', 'title' => 'ФИО руководителя', 'required' => true, 'value' => $contractor->director_name ?? ''])
  52. @include('partials.select', ['name' => 'organization_form', 'title' => 'Форма организации', 'required' => true, 'options' => $organizationForms, 'value' => $contractor->organization_form ?? null, 'first_empty' => true])
  53. @include('partials.select', ['name' => 'tax_rate', 'title' => 'Налог', 'required' => true, 'options' => $taxRates, 'value' => $contractor->tax_rate ?? null, 'first_empty' => true])
  54. @include('partials.textarea', ['name' => 'contract_header', 'title' => 'Шапка в договоре', 'required' => true, 'size' => 8, 'value' => $contractor->contract_header ?? ''])
  55. <div class="row mb-3">
  56. <div class="offset-md-4 col-md-8">
  57. <input type="hidden" name="hidden" value="0">
  58. <input type="checkbox" class="form-check-input" id="hidden" name="hidden" value="1" @checked(old('hidden', $contractor->hidden ?? false))>
  59. <label for="hidden" class="form-check-label">Скрыть из выпадающих списков</label>
  60. </div>
  61. </div>
  62. @include('partials.submit', ['name' => 'Сохранить', 'back_url' => $back_url ?? route('contractors.index')])
  63. </form>
  64. </div>
  65. </div>
  66. @if($contractor)
  67. <div class="tab-pane fade" id="contractor-prices-pane" role="tabpanel" aria-labelledby="contractor-prices-tab">
  68. <div class="row mb-3 align-items-end">
  69. <div class="col-md-3">
  70. <div class="text-muted small">
  71. Год каталога: <strong>{{ $catalogYear }}</strong>
  72. </div>
  73. </div>
  74. <div class="col-md-9 text-md-end mt-3 mt-md-0">
  75. <form action="{{ route('contractors.prices.export', $contractor) }}" method="post" class="d-inline">
  76. @csrf
  77. <button type="submit" class="btn btn-sm btn-outline-success">Экспортировать</button>
  78. </form>
  79. <button type="button" class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#importPricesModal">
  80. Импортировать/обновить цены
  81. </button>
  82. </div>
  83. </div>
  84. <div class="table-responsive">
  85. <table class="table table-sm table-bordered align-middle">
  86. <thead class="table-primary">
  87. <tr>
  88. <th>Картинка МАФ</th>
  89. <th>Артикул МАФ</th>
  90. <th>Номер номенклатуры</th>
  91. <th>Наименование по спецификации</th>
  92. <th>Цена монтажа</th>
  93. <th>Статус</th>
  94. <th></th>
  95. </tr>
  96. </thead>
  97. <tbody>
  98. @foreach($priceRows as $row)
  99. @php
  100. $product = $row['product'];
  101. $price = $row['price'];
  102. @endphp
  103. <tr>
  104. <td style="width: 120px">
  105. @if($product->image)
  106. <img src="{{ $product->image }}" alt="" class="img-thumbnail maf-img">
  107. @endif
  108. </td>
  109. <td>{{ $product->article }}</td>
  110. <td>{{ $product->nomenclature_number }}</td>
  111. <td>{{ $price?->name_in_spec }}</td>
  112. <td>{{ $price?->price_txt ?? '0.00₽' }}</td>
  113. <td>
  114. @if($row['available'])
  115. <span class="badge text-bg-success">Доступен</span>
  116. @else
  117. <span class="badge text-bg-warning">МАФ недоступен</span>
  118. @endif
  119. </td>
  120. <td class="text-end">
  121. <button
  122. type="button"
  123. class="btn btn-sm btn-outline-primary edit-price"
  124. data-bs-toggle="modal"
  125. data-bs-target="#editPriceModal"
  126. data-product-id="{{ $product->id }}"
  127. data-article="{{ $product->article }}"
  128. data-name="{{ e($price?->name_in_spec ?? '') }}"
  129. data-price="{{ $price?->price ?? 0 }}"
  130. >
  131. Изменить
  132. </button>
  133. </td>
  134. </tr>
  135. @endforeach
  136. </tbody>
  137. </table>
  138. </div>
  139. <div class="modal fade" id="editPriceModal" tabindex="-1" aria-labelledby="editPriceModalLabel" aria-hidden="true">
  140. <div class="modal-dialog">
  141. <div class="modal-content">
  142. <div class="modal-header">
  143. <h1 class="modal-title fs-5" id="editPriceModalLabel">Цена монтажа</h1>
  144. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
  145. </div>
  146. <div class="modal-body">
  147. <form action="{{ route('contractors.prices.update', $contractor) }}" method="post">
  148. @csrf
  149. <input type="hidden" name="product_id" id="price_product_id">
  150. <div class="mb-2 small text-muted" id="price_article"></div>
  151. @include('partials.input', ['name' => 'name_in_spec', 'title' => 'Наименование по спецификации'])
  152. @include('partials.input', ['name' => 'price', 'title' => 'Цена монтажа', 'type' => 'number', 'min' => '0'])
  153. @include('partials.submit', ['name' => 'Сохранить'])
  154. </form>
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. <div class="modal fade" id="importPricesModal" tabindex="-1" aria-labelledby="importPricesModalLabel" aria-hidden="true">
  160. <div class="modal-dialog">
  161. <div class="modal-content">
  162. <div class="modal-header">
  163. <h1 class="modal-title fs-5" id="importPricesModalLabel">Импорт цен монтажа</h1>
  164. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
  165. </div>
  166. <div class="modal-body">
  167. <form action="{{ route('contractors.prices.import', $contractor) }}" method="post" enctype="multipart/form-data">
  168. @csrf
  169. <p class="text-muted small">
  170. Файл должен содержать колонки: Картинка МАФ, Артикул МАФ, Номер номенклатуры, Наименование по спецификации, Цена монтажа.
  171. </p>
  172. @include('partials.input', ['name' => 'import_file', 'type' => 'file', 'title' => 'XLSX файл', 'required' => true])
  173. @include('partials.submit', ['name' => 'Импорт'])
  174. </form>
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. @endif
  181. </div>
  182. </div>
  183. @endsection
  184. @push('scripts')
  185. <script type="module">
  186. $('.edit-price').on('click', function () {
  187. $('#price_product_id').val($(this).data('product-id'));
  188. $('#price_article').text('Артикул: ' + $(this).data('article'));
  189. $('#name_in_spec').val($(this).data('name'));
  190. $('#price').val($(this).data('price'));
  191. });
  192. </script>
  193. @endpush