Spaces:
Running on Zero
Running on Zero
| 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 |