"""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")