File size: 3,448 Bytes
31f24ea
 
 
 
 
 
 
 
 
 
 
 
 
19b29e9
31f24ea
 
 
 
 
19b29e9
31f24ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19b29e9
31f24ea
 
19b29e9
 
31f24ea
 
 
 
19b29e9
 
 
31f24ea
 
19b29e9
31f24ea
 
 
 
 
19b29e9
31f24ea
 
 
 
 
 
 
 
 
 
 
19b29e9
31f24ea
 
 
19b29e9
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
import re

def format_date_ddmmyyyy(date_str):
    if not date_str:
        return ""
    date_str = str(date_str).strip()
    m1 = re.search(r'(\d{1,2})[\.\/\-](\d{1,2})[\.\/\-](\d{4})', date_str)
    if m1:
        d, m, y = m1.groups()
        return f"{int(d):02d}/{int(m):02d}/{y}"
    return date_str

def extract_invoice_details_from_text(pdf_text):
    inv_no, inv_date = "", ""
    if not pdf_text:
        return inv_no, inv_date
    m_inv = re.search(r'(?:INVOICE\s*NO\.?\s*&\s*DATE|INVOICE\s*NO\.?)\s*[\r\n]+\s*([A-Z0-9\-]{8,25})', pdf_text, re.IGNORECASE)
    if m_inv:
        inv_no = m_inv.group(1).strip()
    m_date = re.search(r'(?:DTD\.?|DATE\s*[:\.]?)\s*(\d{1,2}[\.\/\-]\d{1,2}[\.\/\-]\d{2,4})', pdf_text, re.IGNORECASE)
    if m_date:
        inv_date = m_date.group(1).strip()
    return inv_no, inv_date

def extract_polycab_items(pdf_lines, pdf_text=""):
    parsed_items = []
    current_hs = ""
    for line in pdf_lines:
        line_str = line.strip()
        hs_match = re.search(r'\b\d{8}\b', line_str)
        if hs_match:
            current_hs = hs_match.group(0)
        if "METER" in line_str or re.search(r'\d+\.\d{2}', line_str):
            nums = re.findall(r'[\d,]+\.\d{2,3}', line_str)
            if nums:
                item_data = {
                    "hs_code": current_hs,
                    "description_text": line_str,
                    "nums": nums,
                    "dbk_found": ""
                }
                parsed_items.append(item_data)
    return parsed_items

def map_polycab_items_to_excel_dynamic(ws, parsed_items, resolved_item_rules, inv_sr_no=1, start_overall_sr=1, start_excel_row=2, default_invoice_no="", default_invoice_date="", pdf_text="", lut_kws="", paid_kws="", parser_rule=""):
    current_row = start_excel_row
    overall_sr = start_overall_sr
    inv_no, inv_date = default_invoice_no, default_invoice_date
    if not inv_no or not inv_date:
        ext_no, ext_date = extract_invoice_details_from_text(pdf_text)
        if not inv_no: inv_no = ext_no
        if not inv_date: inv_date = ext_date
    formatted_date = format_date_ddmmyyyy(inv_date)

    for idx, item in enumerate(parsed_items):
        item_sr = idx + 1
        ws[f"F{current_row}"] = overall_sr
        ws[f"G{current_row}"] = inv_sr_no
        ws[f"H{current_row}"] = item_sr
        if inv_no and "EXPORTER" not in str(inv_no).upper():
            ws[f"I{current_row}"] = inv_no
            ws[f"J{current_row}"] = formatted_date

        for field_name, rule_info in resolved_item_rules.items():
            col = rule_info.get("col", "K").upper()
            r_type = rule_info.get("type", "")
            r_val = rule_info.get("rule", "")
            if col in ["I", "J"]: continue
            cell_target = f"{col}{current_row}"
            val_to_write = ""
            field_name_lower = field_name.lower()
            if "description" in field_name_lower:
                val_to_write = item.get("description_text", "")
            elif "hs" in field_name_lower or "ritc" in field_name_lower:
                val_to_write = item.get("hs_code", "")
            elif r_type == "Constant Text":
                val_to_write = r_val
            else:
                nums = item.get("nums", [])
                val_to_write = nums[0] if nums else r_val
            ws[cell_target] = val_to_write
        current_row += 1
        overall_sr += 1
    return ws, overall_sr, current_row