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 <noreply@anthropic.com>
- 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 = []
|