BF-WAB / test_updated_warehouse.py
SamiKoen's picture
Upload 7 files
4fa4ebe verified
#!/usr/bin/env python3
import requests
import xml.etree.ElementTree as ET
def get_warehouse_stock(product_name):
"""B2B API'den mağaza stok bilgilerini çek - Final Updated Version"""
try:
import re
warehouse_url = 'https://video.trek-turkey.com/bizimhesap-warehouse-xml.php'
response = requests.get(warehouse_url, verify=False, timeout=15)
if response.status_code != 200:
return None
root = ET.fromstring(response.content)
# Turkish character normalization function
turkish_map = {'ı': 'i', 'ğ': 'g', 'ü': 'u', 'ş': 's', 'ö': 'o', 'ç': 'c', 'İ': 'i', 'I': 'i'}
def normalize_turkish(text):
import unicodedata
text = unicodedata.normalize('NFD', text)
text = ''.join(char for char in text if unicodedata.category(char) != 'Mn')
for tr_char, en_char in turkish_map.items():
text = text.replace(tr_char, en_char)
return text
# Normalize search product name
search_name = normalize_turkish(product_name.lower().strip())
search_name = search_name.replace('(2026)', '').replace('(2025)', '').replace(' gen 3', '').replace(' gen', '').strip()
search_words = search_name.split()
best_matches = []
exact_matches = []
variant_matches = []
candidates = []
# Check if this is a size/color specific query (like "M Turuncu")
is_size_color_query = (len(search_words) <= 3 and
any(word in ['s', 'm', 'l', 'xl', 'xs', 'small', 'medium', 'large',
'turuncu', 'siyah', 'beyaz', 'mavi', 'kirmizi', 'yesil',
'orange', 'black', 'white', 'blue', 'red', 'green']
for word in search_words))
# İlk geçiş: Variant alanında beden/renk araması
if is_size_color_query:
for product in root.findall('Product'):
product_name_elem = product.find('ProductName')
variant_elem = product.find('Variant')
if product_name_elem is not None and product_name_elem.text:
xml_product_name = product_name_elem.text.strip()
# Variant field check
if variant_elem is not None and variant_elem.text:
variant_text = normalize_turkish(variant_elem.text.lower().replace('-', ' '))
# Check if all search words are in variant field
if all(word in variant_text for word in search_words):
variant_matches.append((product, xml_product_name, variant_text))
if variant_matches:
candidates = variant_matches
else:
# Fallback to normal product name search
is_size_color_query = False
# İkinci geçiş: Normal ürün adı tam eşleşmeleri (variant match yoksa)
if not is_size_color_query or not candidates:
for product in root.findall('Product'):
product_name_elem = product.find('ProductName')
if product_name_elem is not None and product_name_elem.text:
xml_product_name = product_name_elem.text.strip()
normalized_xml = normalize_turkish(xml_product_name.lower())
normalized_xml = normalized_xml.replace('(2026)', '').replace('(2025)', '').replace(' gen 3', '').replace(' gen', '').strip()
xml_words = normalized_xml.split()
# Tam eşleşme kontrolü - ilk iki kelime tam aynı olmalı
if len(search_words) >= 2 and len(xml_words) >= 2:
search_key = f"{search_words[0]} {search_words[1]}"
xml_key = f"{xml_words[0]} {xml_words[1]}"
if search_key == xml_key:
exact_matches.append((product, xml_product_name, normalized_xml))
# Eğer variant match varsa onu kullan, yoksa exact matches kullan
if not candidates:
candidates = exact_matches if exact_matches else []
# Eğer hala bir match yoksa, fuzzy matching yap
if not candidates:
for product in root.findall('Product'):
product_name_elem = product.find('ProductName')
if product_name_elem is not None and product_name_elem.text:
xml_product_name = product_name_elem.text.strip()
normalized_xml = normalize_turkish(xml_product_name.lower())
normalized_xml = normalized_xml.replace('(2026)', '').replace('(2025)', '').replace(' gen 3', '').replace(' gen', '').strip()
xml_words = normalized_xml.split()
# Ortak kelime sayısını hesapla
common_words = set(search_words) & set(xml_words)
# En az 2 ortak kelime olmalı VE ilk kelime aynı olmalı (marka kontrolü)
if (len(common_words) >= 2 and
len(search_words) > 0 and len(xml_words) > 0 and
search_words[0] == xml_words[0]):
best_matches.append((product, xml_product_name, normalized_xml, len(common_words)))
# En çok ortak kelimeye sahip olanları seç
if best_matches:
max_common = max(match[3] for match in best_matches)
candidates = [(match[0], match[1], match[2]) for match in best_matches if match[3] == max_common]
# Stok bilgilerini topla ve tekrarları önle
warehouse_stock_map = {} # warehouse_name -> total_stock
for product, xml_name, _ in candidates:
warehouses = product.find('Warehouses')
if warehouses is not None:
for warehouse in warehouses.findall('Warehouse'):
name_elem = warehouse.find('Name')
stock_elem = warehouse.find('Stock')
if name_elem is not None and stock_elem is not None:
warehouse_name = name_elem.text if name_elem.text else "Bilinmeyen"
try:
stock_count = int(stock_elem.text) if stock_elem.text else 0
if stock_count > 0:
# Aynı mağaza için stokları topla
if warehouse_name in warehouse_stock_map:
warehouse_stock_map[warehouse_name] += stock_count
else:
warehouse_stock_map[warehouse_name] = stock_count
except (ValueError, TypeError):
pass
if warehouse_stock_map:
# Mağaza stoklarını liste halinde döndür
all_warehouse_info = []
for warehouse_name, total_stock in warehouse_stock_map.items():
all_warehouse_info.append(f"{warehouse_name}: {total_stock} adet")
return all_warehouse_info
else:
return ["Hiçbir mağazada stokta bulunmuyor"]
except Exception as e:
print(f"Mağaza stok bilgisi çekme hatası: {e}")
return None
if __name__ == "__main__":
test_cases = [
"M Turuncu",
"Marlin 6 M Turuncu",
"L Siyah"
]
for test_case in test_cases:
print(f"\n=== Testing: {test_case} ===")
result = get_warehouse_stock(test_case)
if result:
print("Sonuç:")
for item in result:
print(f" • {item}")
else:
print("Sonuç bulunamadı")
print("-" * 50)