CK-Export-Invoice-Processor / parser_polycab.py
joschetan's picture
Update parser_polycab.py
19b29e9 verified
Raw
History Blame Contribute Delete
3.45 kB
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