| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- @extends('layouts.app')
- @section('content')
- @php
- $hasCatalogFilters = collect(request()->filters ?? [])
- ->filter(fn ($value) => $value !== null && $value !== '')
- ->isNotEmpty() || filled(request()->s) || filled(request()->sortBy) || filled(request()->order);
- @endphp
- <div class="px-3">
- <h4 class="mb-4">{{ $contractor ? 'Редактирование подрядчика' : 'Добавление подрядчика' }}</h4>
- @if(session('success'))
- <div class="alert alert-success alert-dismissible fade show" role="alert">
- {{ session('success') }}
- <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
- </div>
- @endif
- @if(session('contractor_import_errors'))
- <div class="alert alert-warning alert-dismissible fade show" role="alert">
- <div class="fw-bold mb-1">Ошибки импорта:</div>
- @foreach(session('contractor_import_errors') as $error)
- <div>{{ $error }}</div>
- @endforeach
- <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
- </div>
- @endif
- @if($errors->any())
- <div class="alert alert-danger alert-dismissible fade show" role="alert">
- @foreach($errors->all() as $error)
- <div>{{ $error }}</div>
- @endforeach
- <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
- </div>
- @endif
- <ul class="nav nav-tabs mb-3" role="tablist">
- <li class="nav-item" role="presentation">
- <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">
- Карточка
- </button>
- </li>
- @if($contractor)
- <li class="nav-item" role="presentation">
- <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">
- Цены монтажа
- @if($hasCatalogFilters)
- <span class="badge text-bg-primary ms-1">фильтр</span>
- @endif
- </button>
- </li>
- @endif
- </ul>
- <div class="tab-content">
- <div class="tab-pane fade @unless($hasCatalogFilters) show active @endunless" id="contractor-main-pane" role="tabpanel" aria-labelledby="contractor-main-tab">
- <div class="col-xxl-7 offset-xxl-1">
- <form action="{{ $contractor ? route('contractors.update', $contractor) : route('contractors.store') }}" method="post">
- @csrf
- @include('partials.input', ['name' => 'name', 'title' => 'Наименование подрядчика', 'required' => true, 'value' => $contractor->name ?? ''])
- @include('partials.input', ['name' => 'legal_name', 'title' => 'Юридическое имя', 'required' => true, 'value' => $contractor->legal_name ?? ''])
- @include('partials.input', ['name' => 'contract_number', 'title' => '№ договора', 'required' => true, 'value' => $contractor->contract_number ?? ''])
- @include('partials.input', ['name' => 'contract_date', 'title' => 'Дата договора', 'type' => 'date', 'required' => true, 'value' => optional($contractor?->contract_date)->format('Y-m-d')])
- @include('partials.input', ['name' => 'director_name', 'title' => 'ФИО руководителя', 'required' => true, 'value' => $contractor->director_name ?? ''])
- @include('partials.select', ['name' => 'organization_form', 'title' => 'Форма организации', 'required' => true, 'options' => $organizationForms, 'value' => $contractor->organization_form ?? null, 'first_empty' => true])
- @include('partials.select', ['name' => 'tax_rate', 'title' => 'Налог', 'required' => true, 'options' => $taxRates, 'value' => $contractor->tax_rate ?? null, 'first_empty' => true])
- @include('partials.textarea', ['name' => 'contract_header', 'title' => 'Шапка в договоре', 'required' => true, 'size' => 8, 'value' => $contractor->contract_header ?? ''])
- <div class="row mb-3">
- <div class="offset-md-4 col-md-8">
- <input type="hidden" name="hidden" value="0">
- <input type="checkbox" class="form-check-input" id="hidden" name="hidden" value="1" @checked(old('hidden', $contractor->hidden ?? false))>
- <label for="hidden" class="form-check-label">Скрыть из выпадающих списков</label>
- </div>
- </div>
- @include('partials.submit', ['name' => 'Сохранить', 'back_url' => $back_url ?? route('contractors.index')])
- </form>
- </div>
- </div>
- @if($contractor)
- <div class="tab-pane fade @if($hasCatalogFilters) show active @endif" id="contractor-prices-pane" role="tabpanel" aria-labelledby="contractor-prices-tab">
- <div class="row mb-3 align-items-end">
- <div class="col-md-3">
- <div class="text-muted small">
- Год каталога: <strong>{{ $catalogYear }}</strong>
- </div>
- </div>
- <div class="col-md-9 text-md-end mt-3 mt-md-0">
- <form action="{{ route('contractors.prices.export', $contractor) }}" method="post" class="d-inline">
- @csrf
- <button type="submit" class="btn btn-sm btn-outline-success">Экспортировать</button>
- </form>
- <button type="button" class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#importPricesModal">
- Импортировать/обновить цены
- </button>
- </div>
- </div>
- @include('partials.table', [
- 'id' => 'contractor_prices',
- 'header' => $priceHeader,
- 'strings' => $priceRows,
- 'searchFields' => $priceSearchFields,
- 'sortBy' => $priceSortBy,
- 'orderBy' => $priceOrderBy,
- 'filters' => $priceFilters,
- 'ranges' => $priceRanges,
- 'dates' => [],
- 'enableColumnFilters' => true,
- 'nav' => $nav ?? null,
- ])
- <div class="modal fade" id="editPriceModal" tabindex="-1" aria-labelledby="editPriceModalLabel" aria-hidden="true">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <h1 class="modal-title fs-5" id="editPriceModalLabel">Цена монтажа</h1>
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
- </div>
- <div class="modal-body">
- <form action="{{ route('contractors.prices.update', $contractor) }}" method="post">
- @csrf
- <input type="hidden" name="product_id" id="price_product_id">
- @if($nav ?? null)
- <input type="hidden" name="nav" value="{{ $nav }}">
- @endif
- @if(request()->s)
- <input type="hidden" name="s" value="{{ request()->s }}">
- @endif
- @if(request()->sortBy)
- <input type="hidden" name="sortBy" value="{{ request()->sortBy }}">
- @endif
- @if(request()->order)
- <input type="hidden" name="order" value="{{ request()->order }}">
- @endif
- @foreach(request()->filters ?? [] as $filterName => $filterValue)
- @if($filterValue !== null && $filterValue !== '')
- <input type="hidden" name="filters[{{ $filterName }}]" value="{{ $filterValue }}">
- @endif
- @endforeach
- <div class="mb-2 small text-muted" id="price_article"></div>
- @include('partials.input', ['name' => 'name_in_spec', 'title' => 'Наименование по спецификации'])
- @include('partials.input', ['name' => 'price', 'title' => 'Цена монтажа', 'type' => 'number', 'min' => '0'])
- @include('partials.submit', ['name' => 'Сохранить'])
- </form>
- </div>
- </div>
- </div>
- </div>
- <div class="modal fade" id="importPricesModal" tabindex="-1" aria-labelledby="importPricesModalLabel" aria-hidden="true">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <h1 class="modal-title fs-5" id="importPricesModalLabel">Импорт цен монтажа</h1>
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
- </div>
- <div class="modal-body">
- <form action="{{ route('contractors.prices.import', $contractor) }}" method="post" enctype="multipart/form-data">
- @csrf
- <p class="text-muted small">
- Файл должен содержать колонки: Картинка МАФ, Артикул МАФ, Номер номенклатуры, Наименование по спецификации, Цена монтажа.
- </p>
- @include('partials.input', ['name' => 'import_file', 'type' => 'file', 'title' => 'XLSX файл', 'required' => true])
- @include('partials.submit', ['name' => 'Импорт'])
- </form>
- </div>
- </div>
- </div>
- </div>
- </div>
- @endif
- </div>
- </div>
- @endsection
- @push('scripts')
- <script type="module">
- $('.edit-price').on('click', function () {
- $('#price_product_id').val($(this).data('product-id'));
- $('#price_article').text('Артикул: ' + $(this).data('article'));
- $('#name_in_spec').val($(this).data('name'));
- $('#price').val($(this).data('price'));
- });
- </script>
- @endpush
|