Add smart model fallback for out-of-stock products
Browse files- When searching for a generic product (e.g., "marlin 4"), show newer models with stock
- Prioritize models by year/generation (2026/GEN 3 > 2025/GEN 2 > 2024/GEN)
- If older model is out of stock, automatically suggest the newer available model
- Example: "marlin 4" now shows MARLIN 4 GEN 3 (2026) when original is out of stock
This ensures customers always see available products instead of "out of stock" messages
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <[email protected]>
- combined_api_search.py +51 -0
combined_api_search.py
CHANGED
@@ -376,6 +376,57 @@ def get_warehouse_stock_combined_api(query):
|
|
376 |
if not results:
|
377 |
return ["Ürün bulunamadı"]
|
378 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
379 |
# Önce ana ürünleri filtrele
|
380 |
main_products = []
|
381 |
variant_products = []
|
|
|
376 |
if not results:
|
377 |
return ["Ürün bulunamadı"]
|
378 |
|
379 |
+
# Akıllı model geçişi - eski model stokta yoksa yeni modeli öner
|
380 |
+
# Örn: "marlin 4" arandığında MARLIN 4 yoksa MARLIN 4 GEN 3'ü göster
|
381 |
+
query_normalized = normalize_turkish(query.upper())
|
382 |
+
|
383 |
+
# Genel ürün adı aranıyorsa (model numarası yok)
|
384 |
+
if not any(year in query_normalized for year in ['GEN', '2024', '2025', '2026', '(20']):
|
385 |
+
# Stokta olan modelleri kontrol et
|
386 |
+
stocked_alternatives = []
|
387 |
+
|
388 |
+
for product in results:
|
389 |
+
name_normalized = normalize_turkish(product['name'].upper())
|
390 |
+
# Ana ürün adıyla eşleşiyor mu?
|
391 |
+
if query_normalized in name_normalized:
|
392 |
+
# Ana ürün mü?
|
393 |
+
if is_main_product(product['name']):
|
394 |
+
# Stokta mı veya varyantları var mı?
|
395 |
+
if product['stock_found'] and product['total_stock'] > 0:
|
396 |
+
stocked_alternatives.append(product)
|
397 |
+
else:
|
398 |
+
# Ana ürün stokta yok, varyantları kontrol et
|
399 |
+
has_stocked_variants = False
|
400 |
+
for variant in results:
|
401 |
+
if (product['name'].upper() in variant['name'].upper() and
|
402 |
+
variant['stock_found'] and
|
403 |
+
variant['total_stock'] > 0 and
|
404 |
+
not is_main_product(variant['name'])):
|
405 |
+
has_stocked_variants = True
|
406 |
+
break
|
407 |
+
if has_stocked_variants:
|
408 |
+
stocked_alternatives.append(product)
|
409 |
+
|
410 |
+
# Eğer alternatifler varsa, en yenisini seç (genelde GEN 3, 2026 vs.)
|
411 |
+
if stocked_alternatives:
|
412 |
+
# Model yılı/versiyonu olanları öncelikle
|
413 |
+
def get_model_priority(product):
|
414 |
+
name = product['name'].upper()
|
415 |
+
if '2026' in name or 'GEN 3' in name:
|
416 |
+
return 3
|
417 |
+
elif '2025' in name or 'GEN 2' in name:
|
418 |
+
return 2
|
419 |
+
elif '2024' in name or 'GEN' in name:
|
420 |
+
return 1
|
421 |
+
else:
|
422 |
+
return 0
|
423 |
+
|
424 |
+
stocked_alternatives.sort(key=lambda x: get_model_priority(x), reverse=True)
|
425 |
+
|
426 |
+
# En yeni modeli öncelikle kullan
|
427 |
+
if stocked_alternatives:
|
428 |
+
results = [stocked_alternatives[0]] + [r for r in results if r != stocked_alternatives[0]]
|
429 |
+
|
430 |
# Önce ana ürünleri filtrele
|
431 |
main_products = []
|
432 |
variant_products = []
|