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