edit.blade.php 12 KB

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