File size: 6,886 Bytes
31f24ea
 
 
 
 
 
60b7314
31f24ea
 
 
 
 
 
 
 
 
 
 
 
 
2583519
31f24ea
60b7314
31f24ea
 
 
 
ceadcf8
31f24ea
 
 
 
 
2583519
ceadcf8
31f24ea
 
2583519
31f24ea
 
 
 
 
 
 
 
 
 
 
 
 
2583519
31f24ea
 
 
2583519
31f24ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2583519
31f24ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2583519
 
abeb5e1
2583519
abeb5e1
 
2583519
 
 
 
abeb5e1
2583519
 
 
abeb5e1
 
 
2583519
 
abeb5e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2583519
abeb5e1
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import requests
import json
import base64
from io import BytesIO
import openpyxl

WEB_APP_URL = "https://script.google.com/macros/s/AKfycbxxKu82K0V3VFn7tRlj3ddzB7Wy-iPyrupAV9tZzjBdhcXZPWFIXodJv6D03M-X_KSn/exec"

def get_val_case_insensitive(d, *keys, default=""):
    if not isinstance(d, dict):
        return default
    d_lower = {str(k).lower(): v for k, v in d.items()}
    for k in keys:
        if str(k).lower() in d_lower:
            val = d_lower[str(k).lower()]
            if val is not None:
                return str(val).strip()
    return default

def fetch_all_from_sheet():
    """गूगल शीट से JSON डेटा और टेम्पलेट्स फेच करता है[cite: 7]"""
    try:
        response = requests.get(f"{WEB_APP_URL}?action=get_data", timeout=20, allow_redirects=True)
        if response.status_code == 200:
            res_text = response.text.strip()
            if res_text.startswith("<"):
                return None
            return response.json()
    except Exception:
        pass
    return None

def clear_sheet_cache():
    """चूंकि अब Streamlit हट चुका है, यह फंक्शन कंपैटिबिलिटी के लिए खाली रखा गया है[cite: 7]"""
    pass

def push_all_to_sheet(shippers_json_payload):
    """पुराने कोड और रूल्स सेव करने के लिए कम्पाटिबल फंक्शन[cite: 7]"""
    try:
        payload = {
            "action": "save_shipper_json",
            "shippers_data": shippers_json_payload
        }
        response = requests.post(WEB_APP_URL, data=json.dumps(payload), timeout=120)
        if response.status_code == 200:
            return True
        return False
    except Exception:
        return False

def push_rules_to_sheet(shippers_json_payload):
    """केवल रूल्स (JSON) को गूगल शीट पर सेव करने के लिए[cite: 7]"""
    return push_all_to_sheet(shippers_json_payload)

def push_template_file_to_sheet(shipper_name, file_bytes):
    """टेम्पलेट फाइल को बेस64 में बदलकर गूगल शीट पर भेजता है[cite: 7]"""
    try:
        b64_str = base64.b64encode(file_bytes).decode('utf-8') if file_bytes else ""
        
        payload = {
            "action": "save_template_file",
            "shipper": shipper_name,
            "file_base64": b64_str
        }
        res = requests.post(WEB_APP_URL, data=json.dumps(payload), timeout=120)
        
        if res.status_code == 200:
            return True
        return False
    except Exception:
        return False

def load_template_bytes_from_sheet(shipper_name):
    """गूगल शीट से शिपर की Base64 फाइल को डिकोड करके बाइट्स लौटाता है[cite: 7]"""
    data = fetch_all_from_sheet()
    if not data:
        return None
    
    shippers_dict = data.get("shippers", {})
    if shipper_name in shippers_dict:
        s_data = shippers_dict[shipper_name]
        b64_str = s_data.get("file_base64", "")
        if b64_str and len(b64_str.strip()) > 0:
            try:
                clean_b64 = b64_str.lstrip("'").strip().replace(" ", "+")
                missing_padding = len(clean_b64) % 4
                if missing_padding:
                    clean_b64 += '=' * (4 - missing_padding)
                
                decoded_bytes = base64.b64decode(clean_b64)
                if decoded_bytes.startswith(b'PK'):
                    return decoded_bytes
            except Exception:
                pass
    return None

def load_template_from_sheet(shipper_name):
    raw_bytes = load_template_bytes_from_sheet(shipper_name)
    if raw_bytes:
        try:
            return openpyxl.load_workbook(BytesIO(raw_bytes))
        except Exception:
            pass
    return None

def get_detailed_shipper_rules_overview():
    """
    Google Sheet se sabhi shippers ke header rules, item table rules aur template status 
    ki poori detail fetch karke ek structured Markdown overview banata hai.
    """
    try:
        data = fetch_all_from_sheet()
        if not data or not isinstance(data, dict):
            return "❌ Google Sheet से डेटा फेच करने में असमर्थ।"
        
        shippers = data.get("shippers", {})
        if not shippers:
            return "⚠️ गूगल शीट पर कोई भी शिपर रूल्स डेटाबेस नहीं मिला।"
        
        overview_text = "📊 **Google Sheet Live Shippers & Rules Master Report**\n\n"
        
        for s_name, s_details in shippers.items():
            overview_text += f"🏢 **Shipper: {s_name}**\n"
            
            # Template Status
            has_tpl = bool(s_details.get("file_base64", ""))
            tpl_status = "✅ Uploaded & Saved" if has_tpl else "❌ Not Uploaded"
            overview_text += f"   - **Template Excel File:** {tpl_status}\n"
            overview_text += f"   - **Assigned Parser:** `{s_details.get('item_table_rule_name', 'parser_welspun')}`\n"
            
            # Header Rules Details
            mapping_rules = s_details.get("mapping_rules", {})
            overview_text += f"   - **Header Rules ({len(mapping_rules)}):**\n"
            if mapping_rules:
                for h_field, h_info in mapping_rules.items():
                    col = h_info.get('cell', 'N/A')
                    kw = h_info.get('keyword', 'N/A')
                    logic = h_info.get('logic', 'Main Invo')
                    overview_text += f"     • `{h_field}` ➡️ Cell: **{col}** | Keyword: *{kw}* | Doc: {logic}\n"
            else:
                overview_text += "     • कोई Header Rule सेट नहीं है।\n"
            
            # Item Table Rules Details
            item_rules = s_details.get("item_table_rules", {})
            overview_text += f"   - **Item Table Rules ({len(item_rules)}):**\n"
            if item_rules:
                for i_field, i_info in item_rules.items():
                    col = i_info.get('col', 'N/A')
                    rule_type = i_info.get('type', 'PDF Row')
                    rule_val = i_info.get('rule', 'N/A')
                    overview_text += f"     • `{i_field}` ➡️ Col: **{col}** | Type: {rule_type} | Rule: *{rule_val}*\n"
            else:
                overview_text += "     • कोई Item Table Rule सेट नहीं है।\n"
                
            overview_text += "\n" + "-"*50 + "\n\n"
            
        return overview_text
    except Exception as e:
        return f"Error loading detailed rules: {str(e)}"