Spaces:
Running on Zero
Running on Zero
File size: 7,525 Bytes
31f24ea a8bf002 31f24ea a8bf002 31f24ea a8bf002 | 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 | import re
import pdfplumber
from io import BytesIO
from openpyxl.styles import Alignment
from pdf_engine import apply_value_replacement, extract_header_value
def extract_all_commodities_from_text(pdf_text):
commodities = []
pattern = r'(\d{8})\s*[:\-]\s*(.+)'
matches = re.findall(pattern, pdf_text)
for hsn, desc in matches:
full_desc = f"{hsn}: {desc.strip()}"
commodities.append(full_desc)
return commodities
def extract_vapi_welspun_items(pdf_lines, pdf_text=""):
parsed_items = []
box_commodities = []
if pdf_text:
box_commodities = extract_all_commodities_from_text(pdf_text)
parsed_items.append({"dbk_sr": "", "hs_code": "", "description_text": "", "net_wt": "", "qty": "", "rate": "", "amount_usd": "", "amount_inr": "", "igst_per": "5.00", "igst_amt": "", "sqmtr": "", "box_commodities": box_commodities})
return parsed_items
def map_vapi_welspun_items_to_excel_dynamic(ws, parsed_items, 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=""):
curr_row = start_excel_row
overall_sr = start_overall_sr
pdf_text_upper = str(pdf_text).upper()
pdf_lines = str(pdf_text).split("\n")
l_keywords = [k.strip().upper() for k in str(lut_kws).split(",") if k.strip()]
p_keywords = [k.strip().upper() for k in str(paid_kws).split(",") if k.strip()]
matched_lut = any(kw.replace("NO.", "").replace(".", "").strip() in pdf_text_upper for kw in l_keywords if kw.strip())
matched_paid = any(kw.replace(".", "").strip() in pdf_text_upper for kw in p_keywords if kw.strip())
v_column_value = "LUT" if matched_lut else ("P" if matched_paid else "LUT")
max_rows = len(parsed_items)
first_item = parsed_items[0] if parsed_items else {}
all_comms = first_item.get("box_commodities", [])
for item_idx in range(max_rows):
item_sr_no = item_idx + 1
item = parsed_items[item_idx] if item_idx < len(parsed_items) else {}
ws[f"G{curr_row}"] = inv_sr_no
ws[f"H{curr_row}"] = item_sr_no
ws[f"V{curr_row}"] = v_column_value
ws[f"I{curr_row}"] = default_invoice_no
if default_invoice_date and not "ROSC" in str(default_invoice_date):
ws[f"J{curr_row}"] = default_invoice_date
if all_comms:
cell_ref_bs = f"BS{curr_row}"
if item_idx < len(all_comms):
ws[cell_ref_bs] = all_comms[item_idx]
else:
ws[cell_ref_bs] = ""
ws[cell_ref_bs].alignment = Alignment(wrap_text=True)
for field_name, r_info in item_rules.items():
col_letter = r_info.get("col", "").strip().upper()
rule_type_raw = str(r_info.get("type", "PDF Row Item")).strip()
rule_val = str(r_info.get("rule", "")).strip()
if not col_letter or col_letter in ["V", "BR", "BS", "S", "J"]:
continue
if "extract" in rule_type_raw.lower() or "box" in rule_type_raw.lower() or "header" in rule_type_raw.lower() or col_letter in ["BW", "BY"]:
extracted_val = extract_header_value(pdf_lines, pdf_text, rule_val, "📦 Extract Inside Box (डब्बे के अंदर का टेक्स्ट)", "Exact Word", "", "None", field_label=field_name)
if not extracted_val or not extracted_val.strip():
extracted_val = extract_header_value(pdf_lines, pdf_text, rule_val, "Right (आगे)", "Exact Word", "", "None", field_label=field_name)
if extracted_val and "\n" in str(extracted_val):
lines = [l.strip() for l in str(extracted_val).split("\n") if l.strip()]
ws[f"{col_letter}{curr_row}"] = lines[item_idx] if item_idx < len(lines) else ""
else:
ws[f"{col_letter}{curr_row}"] = extracted_val if item_idx == 0 else ""
for field_name, r_info in item_rules.items():
col_letter = r_info.get("col", "").strip().upper()
rule_type_raw = str(r_info.get("type", "PDF Row Item")).strip()
rule_val = str(r_info.get("rule", "")).strip()
rule_val_lower = rule_val.lower()
if not col_letter or col_letter in ["V", "I", "J", "G", "BR", "BS", "M"]:
continue
if "extract" in rule_type_raw.lower() or "box" in rule_type_raw.lower() or "header" in rule_type_raw.lower():
continue
cell_ref = f"{col_letter}{curr_row}"
raw_val = ""
clean_rule_val = rule_val_lower.replace("col_", "").strip()
if clean_rule_val.isdigit() and col_letter in ["K", "S", "BU"]:
col_idx = int(clean_rule_val)
raw_val = item.get(f"col_{col_idx}", "")
if col_letter == "S":
raw_val = f"{raw_val}B" if raw_val and not str(raw_val).upper().endswith("B") else raw_val
elif col_letter == "K" or "hs" in rule_val_lower or "ritc" in rule_val_lower:
raw_val = item.get("hs_code", "")
elif col_letter == "BU" or "desc" in rule_val_lower:
raw_val = item.get("description_text", "")
elif col_letter == "S" or "dbk" in rule_val_lower:
dbk = item.get("dbk_sr", "")
raw_val = f"{dbk}B" if dbk and not dbk.upper().endswith("B") else dbk
elif col_letter == "AB" or "wt" in rule_val_lower or "weight" in rule_val_lower:
raw_val = item.get("net_wt", "")
elif col_letter == "N" or "qty" in rule_val_lower or "quantity" in rule_val_lower:
raw_val = item.get("qty", "")
elif col_letter == "P" or "rate" in rule_val_lower:
raw_val = item.get("rate", "")
elif col_letter == "Q" or ("amount" in rule_val_lower and "usd" in rule_val_lower):
raw_val = item.get("amount_usd", "")
elif col_letter == "W" or "taxable" in rule_val_lower or "inr" in rule_val_lower:
raw_val = item.get("amount_inr", "")
elif col_letter == "X" or "igst%" in rule_val_lower or "igst per" in rule_val_lower:
raw_val = item.get("igst_per", "5.00")
elif col_letter == "Y" or "igst amount" in rule_val_lower:
raw_val = item.get("igst_amt", "")
elif col_letter == "Z" or "sqmtr" in rule_val_lower:
raw_val = item.get("sqmtr", "")
else:
if clean_rule_val.isdigit():
col_idx = int(clean_rule_val)
raw_val = item.get(f"col_{col_idx}", "")
if "=" in rule_val:
raw_val = apply_value_replacement(str(raw_val), rule_val)
try:
if col_letter in ["S", "K", "BU"]:
ws[cell_ref] = str(raw_val).replace("\n", " ")
else:
clean_num = str(raw_val).replace(",", "").replace("\n", "").strip()
ws[cell_ref] = float(clean_num) if clean_num else 0.0
except:
ws[cell_ref] = raw_val
curr_row += 1
overall_sr += 1
return ws, overall_sr, curr_row |