'catalog', 'title' => 'Каталог', 'id' => 'products', 'header' => [ 'image' => 'Картинка', 'id' => 'ID', 'article' => 'Артикул', 'nomenclature_number' => 'Номер номенклатуры', 'manufacturer' => 'Производитель', 'unit' => 'Ед. изм.', 'name_tz' => 'Наименование ТЗ', 'type_tz' => 'Тип по ТЗ', 'type' => 'Тип', 'manufacturer_name' => 'Наименование производителя', 'sizes' => 'Размеры', 'product_price' => 'Цена товара', 'installation_price' => 'Цена установки', 'total_price' => 'Итоговая цена', 'note' => 'Примечания', 'created_at' => 'Дата создания', 'certificate_id' => 'Сертификат', 'passport_name' => 'Наименование по паспорту', 'statement_name' => 'Наименование в ведомости', 'service_life' => 'Срок службы', 'certificate_number' => 'Номер сертификата', 'certificate_date' => 'Дата сертификата', 'certificate_issuer' => 'Орган сертификации', 'certificate_type' => 'Вид сертификации', ], 'searchFields' => [ 'nomenclature_number', 'article', 'name_tz', 'manufacturer_name', 'note', ], ]; public function index(Request $request) { session(['gp_catalog' => $request->query()]); $model = new Product; // fill filters $this->createFilters($model, 'type_tz', 'type', 'certificate_id'); $this->createRangeFilters($model, 'nomenclature_number', 'product_price', 'installation_price', 'total_price'); $this->createDateFilters($model, 'certificate_date', 'created_at'); // create request $q = $model::query(); $this->acceptFilters($q, $request); $this->acceptSearch($q, $request); $this->setSortAndOrderBy($model, $request); $q->orderBy($this->data['sortBy'], $this->data['orderBy']); $this->data['products'] = $q->paginate(session('per_page', config('pagination.per_page')))->withQueryString(); return view('catalog.index', $this->data); } public function show(Request $request, Product $product) { $this->data['previous_url'] = $request->get('previous_url'); $this->data['product'] = $product; return view('catalog.edit', $this->data); } public function create() { $this->data['product'] = null; return view('catalog.edit', $this->data); } public function store(StoreProductRequest $request) { Product::create($request->validated()); $previous_url = $request->get('previous_url') ?? route('catalog.index', session('gp_catalog')); return redirect()->to($previous_url); } public function update(StoreProductRequest $request, Product $product) { $product->update($request->validated()); $previous_url = $request->get('previous_url') ?? route('catalog.index', session('gp_catalog')); return redirect()->to($previous_url); } public function delete(Product $product) { $product->delete(); return redirect()->route('catalog.index', session('gp_catalog')); } /** * @param Request $request * @return RedirectResponse */ public function import(Request $request) { // validate data $request->validate([ 'import_file' => 'file', ]); // load and save file $path = Str::random(2) . '/' . Str::uuid() . '.' .$request->file('import_file')->getClientOriginalExtension(); Storage::disk('upload')->put($path, $request->file('import_file')->getContent()); // dispatch job ImportCatalog::dispatch($path, year(), $request->user()->id); Log::info('ImportCatalog job created!'); return redirect()->route('catalog.index', session('gp_catalog'))->with(['success' => 'Задача импорта успешно создана!']); } public function export(Request $request) { $request->validate([ 'withFilter' => 'nullable', 'filters' => 'nullable|array', ]); // load and save file $filters = ($request->withFilter) ? $request->filters ?? [] : []; // dispatch job ExportCatalog::dispatch($filters , $request->user()->id); Log::info('ExportCatalog job created!'); return redirect()->route('catalog.index', session('gp_catalog'))->with(['success' => 'Задача экспорта успешно создана!']); } /** * ajax * @param Request $request * @return array */ public function search(Request $request): array { $s = $request->get('s'); $searchFields = $this->data['searchFields']; $ret = []; if($s) { $result = Product::query()->where(function ($query) use ($searchFields, $s) { foreach ($searchFields as $searchField) { $query->orWhere($searchField, 'LIKE', '%' . $s . '%'); } }); foreach ($result->get() as $p) { $ret[$p->id] = $p->common_name; } } return $ret; } public function uploadCertificate(Request $request, Product $product, FileService $fileService) { $data = $request->validate([ 'certificate' => 'file', ]); $f = $fileService->saveUploadedFile('products/' . $product->id . '/certificate', $data['certificate']); $product->update(['certificate_id' => $f->id]); return redirect()->route('catalog.show', ['product' => $product, 'previous_url' => $request->get('previous_url')]); } public function deleteCertificate(Request $request, Product $product, File $file) { $product->update(['certificate_id' => null]); Storage::disk('public')->delete($file->path); $file->delete(); return redirect()->route('catalog.show', ['product' => $product, 'previous_url' => $request->get('previous_url')]); } }