#!/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)