import os from fpdf import FPDF import config def generate_uplatnica(order_id: int, payer_name: str, payer_address: str, amount: float) -> str: """ Generate a PDF 'Nalog za uplatu' (Uplatnica) for Montenegro. Dimensions: 210x99 mm. """ pdf = FPDF(orientation='L', unit='mm', format=(99, 210)) pdf.set_margins(10, 8, 10) pdf.add_page() # Fonts pdf.set_font("helvetica", 'B', 12) # Outer border (optional but helps when printing on A4) pdf.rect(5, 5, 200, 89) # Title pdf.set_font("helvetica", 'B', 11) pdf.cell(0, 5, "NALOG ZA UPLATU", align="C", new_x="LMARGIN", new_y="NEXT") pdf.ln(5) # Left Block (UPLATILAC, SVRHA PLACANJA, PRIMALAC) pdf.set_font("helvetica", 'B', 7) pdf.set_xy(10, 20) pdf.cell(85, 4, "uplatilac") pdf.set_font("helvetica", '', 10) pdf.set_xy(10, 24) pdf.rect(10, 24, 85, 14) pdf.multi_cell(85, 5, f"{payer_name}\n{payer_address}") pdf.set_font("helvetica", 'B', 7) pdf.set_xy(10, 40) pdf.cell(85, 4, "svrha placanja") pdf.set_font("helvetica", '', 10) pdf.set_xy(10, 44) pdf.rect(10, 44, 85, 14) pdf.multi_cell(85, 5, f"Usluge 3D stampe - Narudzba #{order_id}") pdf.set_font("helvetica", 'B', 7) pdf.set_xy(10, 60) pdf.cell(85, 4, "primalac") pdf.set_font("helvetica", '', 10) pdf.set_xy(10, 64) pdf.rect(10, 64, 85, 14) pdf.multi_cell(85, 6, config.COMPANY_NAME) # Right Block # Sifra, Valuta, Iznos pdf.set_font("helvetica", 'B', 7) pdf.set_xy(105, 20) pdf.cell(15, 4, "sifra", align="C") pdf.set_xy(125, 20) pdf.cell(15, 4, "valuta", align="C") pdf.set_xy(150, 20) pdf.cell(45, 4, "iznos", align="C") pdf.set_font("helvetica", 'B', 10) pdf.rect(105, 24, 15, 7) pdf.rect(125, 24, 15, 7) pdf.rect(145, 24, 50, 7) pdf.set_xy(105, 25) pdf.cell(15, 5, "00", align="C") # Sifra placanja pdf.set_xy(125, 25) pdf.cell(15, 5, "EUR", align="C") pdf.set_xy(145, 25) pdf.cell(50, 5, f"= {amount:.2f}", align="R") # Racun posiljaoca (left empty usually for cash deposits) pdf.set_font("helvetica", 'B', 7) pdf.set_xy(105, 34) pdf.cell(60, 4, "racun posiljaoca") pdf.rect(105, 38, 90, 7) # Racun primaoca pdf.set_xy(105, 48) pdf.cell(60, 4, "racun primaoca") pdf.rect(105, 52, 90, 7) pdf.set_font("helvetica", 'B', 11) pdf.set_xy(105, 52) pdf.cell(90, 7, config.ZIRO_RACUN, align="C") # Model and Poziv na broj odobrenja pdf.set_font("helvetica", 'B', 7) pdf.set_xy(105, 62) pdf.cell(15, 4, "model") pdf.set_xy(125, 62) pdf.cell(70, 4, "poziv na broj (odobrenja)") pdf.rect(105, 66, 15, 7) pdf.rect(125, 66, 70, 7) pdf.set_font("helvetica", 'B', 10) pdf.set_xy(105, 67) pdf.cell(15, 5, "00", align="C") pdf.set_xy(125, 67) pdf.cell(70, 5, str(order_id), align="C") # Signature pdf.set_font("helvetica", 'B', 7) pdf.set_xy(10, 84) pdf.cell(40, 4, "potpis uplatioca", align="C") pdf.line(10, 84, 50, 84) # Stamp & signature recipient pdf.set_xy(155, 84) pdf.cell(40, 4, "potpis i pecat primaoca", align="C") pdf.line(155, 84, 195, 84) # Save file pdf_dir = os.path.join(config.UPLOAD_DIR, "invoices") if not os.path.exists(pdf_dir): os.makedirs(pdf_dir) filename = f"uplatnica_order_{order_id}.pdf" filepath = os.path.join(pdf_dir, filename) pdf.output(filepath) return os.path.join("uploads", "invoices", filename).replace("\\", "/")