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:
2026-05-01 06:41:22 +00:00
parent 2e80ba7400
commit 5421c47ffc
2 changed files with 78 additions and 26 deletions

View File

@@ -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):