import json, re, urllib.request from google.oauth2.credentials import Credentials from googleapiclient.discovery import build # 1. Load credentials with open('/root/.hermes/google_token.json') as f: token_data = json.load(f) creds = Credentials.from_authorized_user_info(token_data) service = build('sheets', 'v4', credentials=creds) spreadsheet_id = '1yNVqn5LcgARSwvpIJdWbg8lCELwki6Rl0bxNrJ5RKUA' # 2. Fetch KFC generic menu headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} req = urllib.request.Request('https://api.kfcvietnam.com.vn/menu/kfcvn-generic-menu', headers=headers) with urllib.request.urlopen(req) as resp: data = json.loads(resp.read().decode('utf-8')) subcats = data['categories'][0]['categories'] base_prices = { 'gà rán': 37000, 'miếng gà': 37000, 'gà quay': 43000, 'gà tương tỏi': 42000, 'gà mắm tỏi': 40000, 'burger gà yo': 30000, 'burger tôm': 45000, 'burger zinger': 56000, 'burger gà quay': 56000, 'mì ý xúc xích gà': 38000, 'mì ý xúc xích': 38000, 'mì ý gà viên': 43000, 'mì ý gà rán': 68000, 'cơm gà rán': 49000, 'cơm gà quay': 54000, 'khoai tây chiên (vừa)': 20000, 'khoai tây chiên vừa': 20000, 'khoai tây chiên (lớn)': 30000, 'khoai tây chiên (đại)': 40000, 'khoai tây nghiền (vừa)': 13000, 'khoai tây nghiền vừa': 13000, 'khoai tây nghiền (lớn)': 23000, 'bắp cải trộn (lớn)': 23000, 'bắp cải trộn (vừa)': 13000, 'bánh trứng': 20000, 'gà viên (vừa)': 40000, 'gà viên popcorn (vừa)': 40000, 'tender': 14000, 'pepsi (tiêu chuẩn)': 13000, 'pepsi tiêu chuẩn': 13000, 'pepsi (vừa)': 17000, 'pepsi vừa': 17000, 'pepsi (đại)': 20000, 'pepsi đại': 20000, 'súp rong biển': 20000, 'cơm gà nanban': 40000 } def guess_value(item_str): item_str = item_str.lower() for k, v in base_prices.items(): if k in item_str: return v if 'pepsi' in item_str: return 13000 if 'khoai tây' in item_str: return 20000 if 'burger' in item_str: return 30000 if 'cơm' in item_str: return 49000 if 'mì ý' in item_str: return 38000 if 'gà' in item_str: return 37000 return 0 header = ["STT", "Danh Mục", "Tên Sản Phẩm", "Phân Loại", "Giá Bán (VND)", "Giá Gốc Niêm Yết (VND)", "Tiết Kiệm (%)", "Mô Tả Thành Phần", "Định Giá Chi Tiết Từng Món Trong Combo (VND)"] rows = [header] stt = 1 for sc in subcats: cname = sc.get('name') for p in sc.get('products') or []: for it in p.get('items') or []: price = int(it.get('price', 0)) if price == 0: continue strike = int(it.get('strikePrice', 0)) vname = '' for dn in it.get('dname', []): if dn.get('lang') == 'vn': vname = dn.get('value').strip() if not vname: vname = it.get('name') vdesc = '' for ds in it.get('description', []): if ds.get('lang') == 'vn': vdesc = ds.get('value').strip() is_combo = any(k in vname for k in ["Combo", "Deal", "Xô"]) or "+" in vdesc loai = "Combo" if is_combo else "Món Đơn" discount = f"{((strike - price)/strike * 100):.1f}%" if strike > price else "0%" breakdown_str = "" if is_combo and vdesc: parts = re.split(r'\s*\+\s*', vdesc) total_est = 0 part_vals = [] for part in parts: qty = 1 m = re.match(r'^(\d+)\s+(.+)', part.strip()) if m: qty = int(m.group(1)) part_name = m.group(2) else: part_name = part.strip() val = guess_value(part_name) total_est += qty * val part_vals.append((qty, part_name, val)) bd = [] for qty, pname, val in part_vals: if total_est > 0: alloc = (val * price) / total_est bd.append(f"{pname}: {alloc:,.0f} VND/món (Số lượng {qty})") else: bd.append(f"{pname} (SL: {qty})") breakdown_str = "; ".join(bd) elif not is_combo: breakdown_str = f"Món đơn tiêu chuẩn: {price:,.0f} VND" rows.append([ stt, cname, vname, loai, price, strike, discount, vdesc, breakdown_str ]) stt += 1 # Clear and write Tab 1 body = {'values': rows} service.spreadsheets().values().update( spreadsheetId=spreadsheet_id, range="Sheet1!A1:I300", valueInputOption="USER_ENTERED", body=body ).execute() # Tab 2: Optimization Comparison tab2_rows = [ ["BẢNG SO SÁNH CÁC PHƯƠNG ÁN ĐẶT MÓN (YÊU CẦU: 5 GÀ RÁN, 2 BÁNH TRỨNG, 1 COMBO CƠM GÀ QUAY, 1 KHOAI NGHIỀN VỪA, 1 BẮP CẢI LỚN, >=1 NƯỚC NGỌT)"], ["Phương Án", "Chi Tiết Đặt Hàng", "Tổng Chi Phí (VND)", "Món Nhận Được", "Đánh Giá Ưu Điểm / Nhược Điểm"], [ "Phương Án 1 (Tối Ưu Nhất)", "1 Xô Zòn Zã 159K (159.000) + 2 Bánh Trứng lẻ (40.000) + 1 Combo Cơm Gà Quay Solo (59.000) + 1 Khoai Nghiền Vừa (13.000) + 1 Bắp Cải Trộn Lớn (23.000)", 294000, "5 Miếng Gà Rán, 2 Bánh Trứng, 1 Cơm Gà Quay, 1 Khoai Nghiền Vừa, 1 Bắp Cải Trộn Lớn, 1 Pepsi Tiêu Chuẩn", "Tối ưu chi phí tuyệt đối (tiết kiệm nhất), đúng chính xác 100% số lượng các món theo yêu cầu đặt ra." ], [ "Phương Án 2 (Dùng Deal 129K Yay)", "1 Deal 129K Yay (129.000) + 2 Miếng Gà Rán lẻ (74.000) + 1 Combo Cơm Gà Quay Solo (59.000) + 1 Khoai Nghiền Vừa (13.000) + 1 Bắp Cải Trộn Lớn (23.000)", 298000, "5 Miếng Gà Rán, 2 Bánh Trứng, 1 Cơm Gà Quay, 1 Khoai Nghiền Vừa, 1 Bắp Cải Trộn Lớn, 1 Pepsi Tiêu Chuẩn", "Chi phí cao hơn Phương Án 1 đúng 4.000 VND do combo 129k chiết khấu thấp hơn xô 159k." ], [ "Phương Án 3 (Dùng Deal 99K Yay)", "1 Deal 99K Yay (99.000) + 1 Phần 3 Miếng Gà Rán lẻ (105.000) + 1 Combo Cơm Gà Quay Solo (59.000) + 1 Khoai Nghiền Vừa (13.000) + 1 Bắp Cải Trộn Lớn (23.000)", 299000, "5 Miếng Gà Rán, 2 Bánh Trứng, 1 Cơm Gà Quay, 1 Khoai Nghiền Vừa, 1 Bắp Cải Trộn Lớn, 1 Pepsi Tiêu Chuẩn", "Chi phí cao hơn Phương Án 1 đúng 5.000 VND." ], [ "Phương Án 4 (Mua Lẻ Hoàn Toàn)", "1 Phần 3 Miếng Gà (105.000) + 2 Miếng Gà lẻ (74.000) + 2 Bánh Trứng (40.000) + 1 Cơm Gà Quay lẻ (54.000) + 1 Pepsi TC (13.000) + 1 Khoai Nghiền Vừa (13.000) + 1 Bắp Cải Trộn Lớn (23.000)", 322000, "5 Miếng Gà Rán, 2 Bánh Trứng, 1 Cơm Gà Quay, 1 Khoai Nghiền Vừa, 1 Bắp Cải Trộn Lớn, 1 Pepsi Tiêu Chuẩn", "Không tận dụng bất kỳ ưu đãi combo nào, lãng phí 28.000 VND (đắt hơn 9.5% so với phương án tối ưu)." ] ] # Add tab 2 if not exists try: service.spreadsheets().batchUpdate( spreadsheetId=spreadsheet_id, body={'requests': [{'addSheet': {'properties': {'title': 'PhanTich_ToiUu_DonHang'}}}]} ).execute() except Exception as e: pass service.spreadsheets().values().update( spreadsheetId=spreadsheet_id, range="PhanTich_ToiUu_DonHang!A1:E10", valueInputOption="USER_ENTERED", body={'values': tab2_rows} ).execute() print("Successfully updated both tabs in Google Sheet!")