authorizeAexAccess('aex.listings.view'); $business = $this->aexUtil->getBusiness(); if (! $business) { abort(404); } $term = $request->get('term', ''); if (strlen($term) < 2) { return response()->json([]); } return response()->json( $this->catalogMatchService->searchCatalog($business, $term, $request->get('type')) ); } public function discover($listingId) { $this->authorizeAexAccess('aex.listings.update'); $business = $this->aexUtil->getBusiness(); $listing = Listing::where('business_id', $business->id)->findOrFail($listingId); try { $matches = $this->catalogMatchService->discoverMatches($business, $listing, true); } catch (\Throwable $e) { return redirect()->back()->with('status', $e->getMessage()); } return redirect() ->action([ListingController::class, 'show'], [$listing->id]) ->with('status', __('assetexchange::lang.catalog_discovered', ['count' => $matches->count()])); } public function confirm($matchId) { $this->authorizeAexAccess('aex.listings.update'); $business = $this->aexUtil->getBusiness(); $match = CatalogMatch::where('business_id', $business->id)->findOrFail($matchId); try { $this->catalogMatchService->confirmMatch($business, $match, auth()->user()); } catch (\Throwable $e) { return redirect()->back()->with('status', $e->getMessage()); } return redirect() ->action([ListingController::class, 'show'], [$match->listing_id]) ->with('status', __('assetexchange::lang.catalog_match_confirmed')); } public function manualLink(Request $request, $listingId) { $this->authorizeAexAccess('aex.listings.update'); $business = $this->aexUtil->getBusiness(); $listing = Listing::where('business_id', $business->id)->findOrFail($listingId); $data = $request->validate([ 'catalog_type' => 'required|in:ie_line_template,ie_item_master,ie_installed_asset,maintenance_equipment', 'catalog_id' => 'required|integer|min:1', 'catalog_label' => 'nullable|string|max:255', ]); $match = CatalogMatch::create([ 'business_id' => $business->id, 'listing_id' => $listing->id, 'catalog_type' => $data['catalog_type'], 'catalog_id' => $data['catalog_id'], 'catalog_label' => $data['catalog_label'] ?? ('#'.$data['catalog_id']), 'match_score' => 100, 'match_reason' => 'انتخاب دستی توسط کارشناس', 'status' => 'suggested', ]); $this->catalogMatchService->confirmMatch($business, $match, auth()->user()); return redirect() ->action([ListingController::class, 'show'], [$listing->id]) ->with('status', __('assetexchange::lang.catalog_linked')); } }