| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- 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("\\", "/")
|