uplatnica_generator.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import os
  2. from fpdf import FPDF
  3. import config
  4. def generate_uplatnica(order_id: int, payer_name: str, payer_address: str, amount: float) -> str:
  5. """
  6. Generate a PDF 'Nalog za uplatu' (Uplatnica) for Montenegro.
  7. Dimensions: 210x99 mm.
  8. """
  9. pdf = FPDF(orientation='L', unit='mm', format=(99, 210))
  10. pdf.set_margins(10, 8, 10)
  11. pdf.add_page()
  12. # Fonts
  13. pdf.set_font("helvetica", 'B', 12)
  14. # Outer border (optional but helps when printing on A4)
  15. pdf.rect(5, 5, 200, 89)
  16. # Title
  17. pdf.set_font("helvetica", 'B', 11)
  18. pdf.cell(0, 5, "NALOG ZA UPLATU", align="C", new_x="LMARGIN", new_y="NEXT")
  19. pdf.ln(5)
  20. # Left Block (UPLATILAC, SVRHA PLACANJA, PRIMALAC)
  21. pdf.set_font("helvetica", 'B', 7)
  22. pdf.set_xy(10, 20)
  23. pdf.cell(85, 4, "uplatilac")
  24. pdf.set_font("helvetica", '', 10)
  25. pdf.set_xy(10, 24)
  26. pdf.rect(10, 24, 85, 14)
  27. pdf.multi_cell(85, 5, f"{payer_name}\n{payer_address}")
  28. pdf.set_font("helvetica", 'B', 7)
  29. pdf.set_xy(10, 40)
  30. pdf.cell(85, 4, "svrha placanja")
  31. pdf.set_font("helvetica", '', 10)
  32. pdf.set_xy(10, 44)
  33. pdf.rect(10, 44, 85, 14)
  34. pdf.multi_cell(85, 5, f"Usluge 3D stampe - Narudzba #{order_id}")
  35. pdf.set_font("helvetica", 'B', 7)
  36. pdf.set_xy(10, 60)
  37. pdf.cell(85, 4, "primalac")
  38. pdf.set_font("helvetica", '', 10)
  39. pdf.set_xy(10, 64)
  40. pdf.rect(10, 64, 85, 14)
  41. pdf.multi_cell(85, 6, config.COMPANY_NAME)
  42. # Right Block
  43. # Sifra, Valuta, Iznos
  44. pdf.set_font("helvetica", 'B', 7)
  45. pdf.set_xy(105, 20)
  46. pdf.cell(15, 4, "sifra", align="C")
  47. pdf.set_xy(125, 20)
  48. pdf.cell(15, 4, "valuta", align="C")
  49. pdf.set_xy(150, 20)
  50. pdf.cell(45, 4, "iznos", align="C")
  51. pdf.set_font("helvetica", 'B', 10)
  52. pdf.rect(105, 24, 15, 7)
  53. pdf.rect(125, 24, 15, 7)
  54. pdf.rect(145, 24, 50, 7)
  55. pdf.set_xy(105, 25)
  56. pdf.cell(15, 5, "00", align="C") # Sifra placanja
  57. pdf.set_xy(125, 25)
  58. pdf.cell(15, 5, "EUR", align="C")
  59. pdf.set_xy(145, 25)
  60. pdf.cell(50, 5, f"= {amount:.2f}", align="R")
  61. # Racun posiljaoca (left empty usually for cash deposits)
  62. pdf.set_font("helvetica", 'B', 7)
  63. pdf.set_xy(105, 34)
  64. pdf.cell(60, 4, "racun posiljaoca")
  65. pdf.rect(105, 38, 90, 7)
  66. # Racun primaoca
  67. pdf.set_xy(105, 48)
  68. pdf.cell(60, 4, "racun primaoca")
  69. pdf.rect(105, 52, 90, 7)
  70. pdf.set_font("helvetica", 'B', 11)
  71. pdf.set_xy(105, 52)
  72. pdf.cell(90, 7, config.ZIRO_RACUN, align="C")
  73. # Model and Poziv na broj odobrenja
  74. pdf.set_font("helvetica", 'B', 7)
  75. pdf.set_xy(105, 62)
  76. pdf.cell(15, 4, "model")
  77. pdf.set_xy(125, 62)
  78. pdf.cell(70, 4, "poziv na broj (odobrenja)")
  79. pdf.rect(105, 66, 15, 7)
  80. pdf.rect(125, 66, 70, 7)
  81. pdf.set_font("helvetica", 'B', 10)
  82. pdf.set_xy(105, 67)
  83. pdf.cell(15, 5, "00", align="C")
  84. pdf.set_xy(125, 67)
  85. pdf.cell(70, 5, str(order_id), align="C")
  86. # Signature
  87. pdf.set_font("helvetica", 'B', 7)
  88. pdf.set_xy(10, 84)
  89. pdf.cell(40, 4, "potpis uplatioca", align="C")
  90. pdf.line(10, 84, 50, 84)
  91. # Stamp & signature recipient
  92. pdf.set_xy(155, 84)
  93. pdf.cell(40, 4, "potpis i pecat primaoca", align="C")
  94. pdf.line(155, 84, 195, 84)
  95. # Save file
  96. pdf_dir = os.path.join(config.UPLOAD_DIR, "invoices")
  97. if not os.path.exists(pdf_dir):
  98. os.makedirs(pdf_dir)
  99. filename = f"uplatnica_order_{order_id}.pdf"
  100. filepath = os.path.join(pdf_dir, filename)
  101. pdf.output(filepath)
  102. return os.path.join("uploads", "invoices", filename).replace("\\", "/")