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.
This commit is contained in:
@@ -292,8 +292,37 @@ def create_item():
|
|||||||
except Exception as am_err:
|
except Exception as am_err:
|
||||||
print(f"[auto_match] Error for item {item_id}: {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()
|
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:
|
except Exception as e:
|
||||||
conn.rollback()
|
conn.rollback()
|
||||||
|
|||||||
@@ -231,36 +231,59 @@ def remove_all_compatibility(tenant_conn, inventory_id):
|
|||||||
return deleted
|
return deleted
|
||||||
|
|
||||||
|
|
||||||
def get_compatibility(tenant_conn, inventory_id):
|
def get_compatibility(tenant_conn, master_conn, inventory_id):
|
||||||
"""Get all MYE compatibilities for an inventory item."""
|
"""Get all MYE compatibilities for an inventory item.
|
||||||
cur = tenant_conn.cursor()
|
|
||||||
cur.execute("""
|
Queries inventory_vehicle_compat from the tenant DB, then resolves
|
||||||
SELECT mye.id_mye, b.name_brand, m.name_model, y.year_car, e.name_engine,
|
vehicle details (brand/model/year/engine) from the master DB.
|
||||||
ivc.source, ivc.confidence, ivc.created_at
|
"""
|
||||||
FROM inventory_vehicle_compat ivc
|
# 1. Get MYE IDs + metadata from tenant
|
||||||
JOIN model_year_engine mye ON mye.id_mye = ivc.model_year_engine_id
|
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 models m ON m.id_model = mye.model_id
|
||||||
JOIN brands b ON b.id_brand = m.brand_id
|
JOIN brands b ON b.id_brand = m.brand_id
|
||||||
JOIN years y ON y.id_year = mye.year_id
|
JOIN years y ON y.id_year = mye.year_id
|
||||||
JOIN engines e ON e.id_engine = mye.engine_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
|
ORDER BY b.name_brand, m.name_model, y.year_car
|
||||||
""", (inventory_id,))
|
""", (mye_ids,))
|
||||||
rows = cur.fetchall()
|
details = {r[0]: r for r in cur_m.fetchall()}
|
||||||
cur.close()
|
cur_m.close()
|
||||||
return [
|
|
||||||
{
|
# 3. Merge
|
||||||
'model_year_engine_id': r[0],
|
result = []
|
||||||
'brand': r[1],
|
for mye_id, source, confidence, created_at in rows:
|
||||||
'model': r[2],
|
d = details.get(mye_id)
|
||||||
'year': r[3],
|
if d:
|
||||||
'engine': r[4],
|
result.append({
|
||||||
'source': r[5],
|
'model_year_engine_id': mye_id,
|
||||||
'confidence': float(r[6]),
|
'brand': d[1],
|
||||||
'created_at': str(r[7]),
|
'model': d[2],
|
||||||
}
|
'year': d[3],
|
||||||
for r in rows
|
'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):
|
def search_mye(master_conn, brand_id=None, model_id=None, year_id=None, engine_id=None):
|
||||||
|
|||||||
Reference in New Issue
Block a user