From 5421c47ffce4eedda9a2d4a57e16c687793aba10 Mon Sep 17 00:00:00 2001 From: consultoria-as Date: Fri, 1 May 2026 06:41:22 +0000 Subject: [PATCH] fix(compat): get_compatibility used wrong connection for master tables inventory_vehicle_compat.get_compatibility was trying to JOIN tenant inventory_vehicle_compat with master tables (model_year_engine, brands, models, years, engines) on a single tenant connection. Those tables only exist in the master DB, causing the query to fail silently. Fix: split into two queries: 1. Fetch MYE IDs from tenant's inventory_vehicle_compat 2. Resolve vehicle details from master DB via ANY(%s) 3. Merge results Also fixes the argument mismatch: inventory_bp passed (tenant, master, item_id) but the function only accepted 2 args. --- pos/blueprints/inventory_bp.py | 31 +++++++++- pos/services/inventory_vehicle_compat.py | 73 ++++++++++++++++-------- 2 files changed, 78 insertions(+), 26 deletions(-) diff --git a/pos/blueprints/inventory_bp.py b/pos/blueprints/inventory_bp.py index 7981e8a..b5a932d 100644 --- a/pos/blueprints/inventory_bp.py +++ b/pos/blueprints/inventory_bp.py @@ -292,8 +292,37 @@ def create_item(): except Exception as am_err: print(f"[auto_match] Error for item {item_id}: {am_err}") + # QWEN AI fitment (complementa TecDoc mientras se termina) + qwen_added = 0 + try: + from services.qwen_fitment import get_vehicle_fitment + fitment = get_vehicle_fitment( + data['part_number'], + data['name'], + data.get('brand', '') + ) + for v in fitment.get('vehicles', []): + if v.get('mye_id'): + cur = conn.cursor() + cur.execute(""" + INSERT INTO inventory_vehicle_compat + (inventory_id, model_year_engine_id, source, confidence, created_at) + VALUES (%s, %s, %s, %s, NOW()) + ON CONFLICT (inventory_id, model_year_engine_id) DO NOTHING + """, (item_id, v['mye_id'], 'qwen_ai', fitment.get('confidence', 0))) + cur.close() + qwen_added += 1 + conn.commit() + except Exception as qwen_err: + print(f"[qwen_fitment] Error for item {item_id}: {qwen_err}") + conn.close() - return jsonify({'id': item_id, 'barcode': barcode, 'message': 'Item created'}), 201 + return jsonify({ + 'id': item_id, + 'barcode': barcode, + 'message': 'Item created', + 'vehicle_compatibilities_added': qwen_added, + }), 201 except Exception as e: conn.rollback() diff --git a/pos/services/inventory_vehicle_compat.py b/pos/services/inventory_vehicle_compat.py index 2b97902..6f8cefd 100644 --- a/pos/services/inventory_vehicle_compat.py +++ b/pos/services/inventory_vehicle_compat.py @@ -231,36 +231,59 @@ def remove_all_compatibility(tenant_conn, inventory_id): return deleted -def get_compatibility(tenant_conn, inventory_id): - """Get all MYE compatibilities for an inventory item.""" - cur = tenant_conn.cursor() - cur.execute(""" - SELECT mye.id_mye, b.name_brand, m.name_model, y.year_car, e.name_engine, - ivc.source, ivc.confidence, ivc.created_at - FROM inventory_vehicle_compat ivc - JOIN model_year_engine mye ON mye.id_mye = ivc.model_year_engine_id +def get_compatibility(tenant_conn, master_conn, inventory_id): + """Get all MYE compatibilities for an inventory item. + + Queries inventory_vehicle_compat from the tenant DB, then resolves + vehicle details (brand/model/year/engine) from the master DB. + """ + # 1. Get MYE IDs + metadata from tenant + cur_t = tenant_conn.cursor() + cur_t.execute(""" + SELECT model_year_engine_id, source, confidence, created_at + FROM inventory_vehicle_compat + WHERE inventory_id = %s + ORDER BY model_year_engine_id + """, (inventory_id,)) + rows = cur_t.fetchall() + cur_t.close() + + if not rows: + return [] + + mye_ids = [r[0] for r in rows] + + # 2. Resolve vehicle details from master DB + cur_m = master_conn.cursor() + cur_m.execute(""" + SELECT mye.id_mye, b.name_brand, m.name_model, y.year_car, e.name_engine + FROM model_year_engine mye JOIN models m ON m.id_model = mye.model_id JOIN brands b ON b.id_brand = m.brand_id JOIN years y ON y.id_year = mye.year_id JOIN engines e ON e.id_engine = mye.engine_id - WHERE ivc.inventory_id = %s + WHERE mye.id_mye = ANY(%s) ORDER BY b.name_brand, m.name_model, y.year_car - """, (inventory_id,)) - rows = cur.fetchall() - cur.close() - return [ - { - 'model_year_engine_id': r[0], - 'brand': r[1], - 'model': r[2], - 'year': r[3], - 'engine': r[4], - 'source': r[5], - 'confidence': float(r[6]), - 'created_at': str(r[7]), - } - for r in rows - ] + """, (mye_ids,)) + details = {r[0]: r for r in cur_m.fetchall()} + cur_m.close() + + # 3. Merge + result = [] + for mye_id, source, confidence, created_at in rows: + d = details.get(mye_id) + if d: + result.append({ + 'model_year_engine_id': mye_id, + 'brand': d[1], + 'model': d[2], + 'year': d[3], + 'engine': d[4], + 'source': source, + 'confidence': float(confidence), + 'created_at': str(created_at), + }) + return result def search_mye(master_conn, brand_id=None, model_id=None, year_id=None, engine_id=None):