feat: print receipt

This commit is contained in:
Viet An
2026-06-25 09:51:45 +07:00
parent 07151bf78e
commit 61fc829a91
6 changed files with 178 additions and 7 deletions

71
print/print_receipt.py Normal file
View File

@@ -0,0 +1,71 @@
import sys
import json
from datetime import datetime
from escpos.printer import Win32Raw
LINE_WIDTH = 48 # 80mm paper
def safe_float(v):
return float(v) if v is not None else 0.0
def money(n):
return f"{int(safe_float(n)):,}"
def space_between(left, right, width=LINE_WIDTH):
space = max(1, width - len(str(left)) - len(str(right)))
return f"{left}{' ' * space}{right}"
def print_receipt(data, printer_name="XP-80C"):
p = Win32Raw(printer_name=printer_name)
# Big bold header
p.set(align='center', bold=True, double_height=True, double_width=True)
p.text("ERP\n")
p.set(align='center', bold=False, normal_textsize=True)
p.text(f"Invoice: {data['code']}\n")
p.text(f"{data['ordered_at'][:10]}\n")
p.text("-" * LINE_WIDTH + "\n")
p.set(align='left')
p.text(f"Customer: {data['customer_name']}\n")
p.text(f"Phone: {data['customer_phone']}\n")
p.text(f"Address: {data['shipping_address']}\n")
p.text("-" * LINE_WIDTH + "\n")
for item in data['items']:
p.text(f"{item['name']}\n")
p.text(f" {item['variant']}\n")
p.text(space_between("", money(item['price'])) + "\n")
p.text("-" * LINE_WIDTH + "\n")
p.text(space_between("Subtotal:", money(data['product_amount'])) + "\n")
if safe_float(data['shipping_fee']) > 0:
p.text(space_between("Shipping:", money(data['shipping_fee'])) + "\n")
if safe_float(data['discount_amount']) > 0:
p.text(space_between("Discount:", f"-{money(data['discount_amount'])}") + "\n")
p.set(bold=True)
p.text(space_between("TOTAL:", money(data['final_amount']) + " VND") + "\n")
p.set(bold=False)
p.text("-" * LINE_WIDTH + "\n")
if safe_float(data['cash_amount']) > 0:
p.text(space_between("Cash:", money(data['cash_amount'])) + "\n")
if safe_float(data['transfer_amount']) > 0:
p.text(space_between("Transfer:", money(data['transfer_amount'])) + "\n")
p.text("\n\n")
p.set(align='center')
now_str = datetime.now().strftime("%H:%M %d/%m/%Y")
p.text(f"{now_str}\n")
p.text("\n" * 3)
p.cut()
if __name__ == "__main__":
data = json.loads(sys.argv[1])
print_receipt(data)
print("Sent to printer.")

View File

@@ -0,0 +1,13 @@
{big_title}
{header}
{line}
{customer_block}
{line}
{items}
{line}
{totals}
{line}
{payment}
{line_break}
{footer_time}
{blanks}