'product_sku', 'title' => 'МАФ', 'id' => 'product_sku', 'header' => [ 'product-image' => 'Картинка', 'id' => 'ID', 'district_name' => 'Округ', 'area_name' => 'Район', 'object_address' => 'Адрес площадки', 'order_number' => 'Номер заказа МАФ', 'status' => 'Статус', 'rfid' => 'RFID', 'factory_number' => 'Номер фабрики', 'manufacture_date' => 'Дата производства', 'statement_number' => 'Номер ведомости', 'statement_date' => 'Дата ведомости', 'upd_number' => 'Номер УПД', 'nomenclature_number' => 'Номер номенклатуры', 'article' => 'Артикул', 'name_tz' => 'Наименование ТЗ', 'type_tz' => 'Тип по ТЗ', 'type' => 'Тип', 'manufacturer_name' => 'Наименование производителя', 'comment' => 'Примечания', 'passport_name' => 'Паспорт', ], 'searchFields' => [ 'rfid', 'factory_number', 'statement_number', 'upd_number', 'object_address', 'nomenclature_number', 'article', ], ]; public function index(Request $request) { session(['gp_product_sku' => $request->all()]); $nav = $this->startNavigationContext($request); $model = new MafView; $fil = array_keys($this->data['header']); unset($fil[0]); $this->createFilters($model, ...$fil); $this->createDateFilters($model, 'manufacture_date', 'statement_date'); $this->data['ranges'] = []; $q = $model::query(); $this->acceptFilters($q, $request); $this->acceptSearch($q, $request); $this->setSortAndOrderBy($model, $request); $this->applyStableSorting($q); // dump($q->toRawSql()); $this->data['products_sku'] = $q->paginate($this->data['per_page'])->withQueryString(); $this->data['nav'] = $nav; $this->data['maf_registry_files'] = $request->user()?->hasRole([Role::ADMIN, Role::ASSISTANT_HEAD]) ? File::query() ->with('user:id,name') ->where('path', 'like', 'export/maf-registry/%') ->latest() ->limit(20) ->get() : collect(); return view('products_sku.index', $this->data); } public function update(ProductSKUStoreRequest $request, ProductSKU $product_sku) { $nav = $this->resolveNavToken($request); $url = $this->navigationParentUrl( $nav, route('product_sku.index', session('gp_product_sku')) ); $product_sku->update($request->validated()); app(OrderPaymentStatusService::class)->markPaidIfAllMafsHavePaymentData($product_sku->order_id); return redirect($url); } public function inlineUpdate(Request $request, ProductSKU $product_sku): JsonResponse { $validated = $request->validate([ 'field' => ['required', 'string', 'in:rfid,factory_number,manufacture_date,statement_number,statement_date,upd_number'], 'value' => ['nullable', 'string', 'max:255'], ]); $field = $validated['field']; abort_unless($request->user()?->canUpdateField('maf', $field), 403); $rules = in_array($field, ['manufacture_date', 'statement_date'], true) ? ['value' => ['nullable', 'date']] : ['value' => ['nullable', 'string', 'max:255']]; $data = $request->validate($rules); $value = $data['value'] ?? null; if ($value === '') { $value = null; } $product_sku->update([$field => $value]); app(OrderPaymentStatusService::class)->markPaidIfAllMafsHavePaymentData($product_sku->order_id); return response()->json([ 'field' => $field, 'value' => $product_sku->{$field}, 'human_value' => str_ends_with($field, '_date') && $product_sku->{$field} ? DateHelper::getHumanDate($product_sku->{$field}, true) : $product_sku->{$field}, ]); } public function show(Request $request, int $product_sku) { $this->data['product_sku'] = ProductSKU::query()->withoutGlobalScope(\App\Models\Scopes\YearScope::class)->find($product_sku); $nav = $this->resolveNavToken($request); $this->rememberNavigation($request, $nav); $this->data['nav'] = $nav; $this->data['back_url'] = $this->navigationBackUrl( $request, $nav, route('product_sku.index', session('gp_product_sku')) ); return view('products_sku.edit', $this->data); } public function uploadPassport(Request $request, ProductSKU $product_sku, FileService $fileService) { abort_unless($request->user()?->hasPermission('maf.passports.upload'), 403); $data = $request->validate([ 'passport' => 'file', ]); try { $f = $fileService->saveUploadedFile('maf/' . $product_sku->id . '/passport', $data['passport']); $product_sku->update(['passport_id' => $f->id]); } catch (Throwable $e) { report($e); return redirect()->back() ->with(['error' => 'Ошибка загрузки паспорта. Проверьте имя файла и повторите попытку.']); } return redirect()->back() ->with(['success' => 'Паспорт успешно загружен!']); } public function deletePassport(Request $request, ProductSKU $product_sku, File $file) { $product_sku->update(['passport_id' => null]); Storage::disk('public')->delete($file->path); $file->delete(); return $this->redirectToProductSkuShow($request, $product_sku); } public function exportMaf(Request $request) { $request->validate([ 'withFilter' => 'nullable', 'filters' => 'nullable|array', 's' => 'nullable|string', ]); $filters = []; if ($request->boolean('withFilter')) { $filters = $request->filters ?? []; if ($request->filled('s')) { $filters['s'] = $request->string('s')->toString(); } } $filters['year'] = (int) $request->session()->get('year', date('Y')); ExportMafJob::dispatch($request->user()->id, $filters); return redirect()->route('product_sku.index', session('gp_product_sku'))->with(['success' => 'Задача экспорта успешно создана!']); } public function exportMafRegistry(Request $request) { abort_unless($request->user()?->hasRole([Role::ADMIN, Role::ASSISTANT_HEAD]), 403); $validated = $request->validate([ 'upd_number' => 'required|string|max:255', ]); ExportMafRegistryJob::dispatch( $request->user()->id, trim($validated['upd_number']), (int) $request->session()->get('year', date('Y')) ); return redirect() ->route('product_sku.index', session('gp_product_sku')) ->with(['success' => 'Задача формирования реестра на оплату успешно создана!']); } public function importMaf() { } private function redirectToProductSkuShow(Request $request, ProductSKU $productSku) { $nav = $this->resolveNavToken($request); return redirect()->route('product_sku.show', $this->withNav(['product_sku' => $productSku], $nav)); } }