alirezaaminzadeh's picture
Upload folder using huggingface_hub
af24ae8 verified
Raw
History Blame Contribute Delete
2.37 kB
"""Export extracted invoices to JSON and Excel formats."""
from __future__ import annotations
import json
from io import BytesIO
from pathlib import Path
from typing import Any
import pandas as pd
from docflow.models import ExtractedInvoice, ValidationReport
def to_json(invoice: ExtractedInvoice, validation: ValidationReport | None = None) -> str:
payload: dict[str, Any] = {
"invoice": invoice.to_export_dict(),
"validation": validation.model_dump() if validation else None,
}
return json.dumps(payload, ensure_ascii=False, indent=2)
def to_excel_bytes(invoice: ExtractedInvoice, validation: ValidationReport | None = None) -> bytes:
buffer = BytesIO()
summary = pd.DataFrame(
[
{"Field": "Vendor", "Value": invoice.vendor_name},
{"Field": "Tax ID", "Value": invoice.vendor_tax_id},
{"Field": "Invoice #", "Value": invoice.invoice_number},
{"Field": "Date (Jalali)", "Value": invoice.invoice_date_jalali},
{"Field": "Buyer", "Value": invoice.buyer_name},
{"Field": "Subtotal", "Value": invoice.subtotal},
{"Field": "Tax", "Value": invoice.tax_amount},
{"Field": "Total", "Value": invoice.total_amount},
{"Field": "Currency", "Value": invoice.currency},
{"Field": "Confidence", "Value": invoice.confidence},
]
)
items = pd.DataFrame([item.model_dump() for item in invoice.line_items])
if items.empty:
items = pd.DataFrame(columns=["description", "quantity", "unit_price", "total", "confidence"])
validation_df = pd.DataFrame()
if validation and validation.issues:
validation_df = pd.DataFrame([i.model_dump() for i in validation.issues])
with pd.ExcelWriter(buffer, engine="openpyxl") as writer:
summary.to_excel(writer, sheet_name="Summary", index=False)
items.to_excel(writer, sheet_name="Line Items", index=False)
if not validation_df.empty:
validation_df.to_excel(writer, sheet_name="Validation", index=False)
buffer.seek(0)
return buffer.read()
def save_json(path: str | Path, invoice: ExtractedInvoice, validation: ValidationReport | None = None) -> None:
Path(path).write_text(to_json(invoice, validation), encoding="utf-8")