File size: 6,768 Bytes
4fa4ebe |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
#!/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 - İyileştirilmiş versiyon"""
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()
print(f"DEBUG: Aranan ürün: '{product_name}' -> normalize: '{search_name}' -> kelimeler: {search_words}")
best_matches = []
exact_matches = []
# İlk geçiş: Tam eşleşmeleri bul
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))
print(f"DEBUG: TAM EŞLEŞME bulundu: '{xml_product_name}'")
# Eğer tam eşleşme varsa, sadece onları kullan
candidates = exact_matches if exact_matches else []
# Eğer tam eşleşme yoksa, fuzzy matching yap
if not candidates:
print("DEBUG: Tam eşleşme yok, fuzzy matching yapılıyor...")
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)))
print(f"DEBUG: FUZZY EŞLEŞME: '{xml_product_name}' (ortak: {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]
print(f"DEBUG: Toplam {len(candidates)} aday ürün bulundu")
# 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
print(f"DEBUG: STOK BULUNDU - {warehouse_name}: {stock_count} adet ({xml_name})")
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:
print("DEBUG: Hiçbir mağazada stok bulunamadı")
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 the function with different inputs
test_cases = [
"MARLIN 6 (2026)",
"Marlin 6"
]
for test_case in test_cases:
print(f"=== Testing: {test_case} ===")
result = get_warehouse_stock(test_case)
print(f"Result: {result}")
print() |