|
|
@@ -2,124 +2,133 @@ 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)
|
|
|
+from fpdf import FPDF
|
|
|
+import os
|
|
|
+import config
|
|
|
+
|
|
|
+
|
|
|
+def format_amount(amount):
|
|
|
+ return f"{amount:.2f}".replace(".", ",")
|
|
|
+
|
|
|
+
|
|
|
+def generate_uplatnica(order_id, payer_name, payer_address, amount):
|
|
|
+ pdf = FPDF(orientation='P', unit='mm', format='A4')
|
|
|
+ pdf.set_auto_page_break(False)
|
|
|
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.set_font("helvetica", size=7)
|
|
|
+
|
|
|
+ # === UPLATNICA AREA (top of A4) ===
|
|
|
+ pdf.rect(0, 0, 210, 99)
|
|
|
+
|
|
|
+ # Vertical divider
|
|
|
+ pdf.line(105, 0, 105, 99)
|
|
|
+
|
|
|
+ # ===== TOP OPTIONS =====
|
|
|
+ labels = ["Hitnost", "Prenos", "Uplata", "Isplata"]
|
|
|
+ start_x = 110
|
|
|
+ step = 22
|
|
|
+
|
|
|
+ for i, label in enumerate(labels):
|
|
|
+ x = start_x + i * step
|
|
|
+ pdf.set_xy(x, 2)
|
|
|
+ pdf.cell(14, 4, label)
|
|
|
+
|
|
|
+ pdf.rect(x + 14, 2, 4, 4)
|
|
|
+
|
|
|
+ if label == "Uplata":
|
|
|
+ pdf.line(x + 14, 2, x + 18, 6)
|
|
|
+ pdf.line(x + 18, 2, x + 14, 6)
|
|
|
+
|
|
|
+ # ===== LEFT =====
|
|
|
+ pdf.set_font("helvetica", "B", 8)
|
|
|
+ pdf.set_xy(5, 5)
|
|
|
+ pdf.cell(95, 5, "NALOG PLATIOCA", align="C")
|
|
|
+
|
|
|
+ pdf.rect(5, 12, 95, 14)
|
|
|
+ pdf.set_font("helvetica", size=9)
|
|
|
+ pdf.set_xy(7, 14)
|
|
|
+ pdf.cell(90, 4, payer_name[:40])
|
|
|
+ pdf.set_xy(7, 18)
|
|
|
+ pdf.cell(90, 4, payer_address[:40])
|
|
|
+
|
|
|
+ pdf.set_font("helvetica", size=6)
|
|
|
+ pdf.set_xy(5, 26)
|
|
|
+ pdf.cell(95, 4, "(Naziv platioca)", align="C")
|
|
|
+
|
|
|
+ pdf.rect(5, 30, 95, 14)
|
|
|
+ pdf.set_font("helvetica", size=9)
|
|
|
+ pdf.set_xy(7, 32)
|
|
|
+ pdf.cell(90, 4, "Usluge 3D stampe")
|
|
|
+ pdf.set_xy(7, 36)
|
|
|
+ pdf.cell(90, 4, f"Narudzba {order_id}")
|
|
|
+
|
|
|
+ pdf.set_font("helvetica", size=6)
|
|
|
+ pdf.set_xy(5, 44)
|
|
|
+ pdf.cell(95, 4, "(Svrha placanja)", align="C")
|
|
|
+
|
|
|
+ pdf.rect(5, 48, 95, 14)
|
|
|
+ pdf.set_font("helvetica", size=9)
|
|
|
+ pdf.set_xy(7, 50)
|
|
|
+ pdf.cell(90, 4, config.COMPANY_NAME[:40])
|
|
|
+
|
|
|
+ pdf.set_font("helvetica", size=6)
|
|
|
+ pdf.set_xy(5, 62)
|
|
|
+ pdf.cell(95, 4, "(Naziv primaoca)", align="C")
|
|
|
+
|
|
|
+ pdf.line(5, 90, 100, 90)
|
|
|
+ pdf.set_xy(5, 90)
|
|
|
+ pdf.cell(95, 4, "(Potpis platioca)", align="C")
|
|
|
+
|
|
|
+ # ===== RIGHT =====
|
|
|
+ pdf.rect(110, 12, 95, 8)
|
|
|
+
|
|
|
+ pdf.set_font("helvetica", size=7)
|
|
|
+ pdf.set_xy(110, 22)
|
|
|
+ pdf.cell(10, 4, "EUR")
|
|
|
+
|
|
|
+ pdf.rect(120, 22, 50, 10)
|
|
|
+ pdf.rect(175, 22, 30, 10)
|
|
|
+
|
|
|
+ pdf.set_font("helvetica", "B", 11)
|
|
|
+ pdf.set_xy(120, 24)
|
|
|
+ pdf.cell(50, 6, format_amount(amount), align="C")
|
|
|
+
|
|
|
+ pdf.set_xy(175, 24)
|
|
|
+ pdf.cell(30, 6, "121", align="C")
|
|
|
+
|
|
|
+ pdf.set_font("helvetica", size=6)
|
|
|
+ pdf.set_xy(120, 32)
|
|
|
+ pdf.cell(50, 4, "(Iznos)", align="C")
|
|
|
+
|
|
|
+ pdf.set_xy(175, 32)
|
|
|
+ pdf.cell(30, 4, "(Sifra)", align="C")
|
|
|
+
|
|
|
+ pdf.rect(110, 36, 95, 10)
|
|
|
+ pdf.set_font("helvetica", size=10)
|
|
|
+ pdf.set_xy(110, 38)
|
|
|
+ pdf.cell(95, 6, config.ZIRO_RACUN, align="C")
|
|
|
+
|
|
|
+ pdf.rect(110, 50, 20, 8)
|
|
|
+ pdf.rect(135, 50, 70, 8)
|
|
|
+
|
|
|
+ pdf.set_xy(110, 52)
|
|
|
+ pdf.cell(20, 4, "00", align="C")
|
|
|
+ pdf.set_xy(135, 52)
|
|
|
+ pdf.cell(70, 4, str(order_id), align="C")
|
|
|
+
|
|
|
+ pdf.line(110, 90, 205, 90)
|
|
|
+ pdf.set_xy(110, 90)
|
|
|
+ pdf.cell(95, 4, "(Potpis primaoca)", align="C")
|
|
|
+
|
|
|
+ # ===== SAVE =====
|
|
|
+
|
|
|
+
|
|
|
pdf_dir = os.path.join(config.UPLOAD_DIR, "invoices")
|
|
|
- if not os.path.exists(pdf_dir):
|
|
|
- os.makedirs(pdf_dir)
|
|
|
-
|
|
|
+ os.makedirs(pdf_dir, exist_ok=True)
|
|
|
+
|
|
|
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("\\", "/")
|