feat: print receipt
This commit is contained in:
71
print/print_receipt.py
Normal file
71
print/print_receipt.py
Normal 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.")
|
||||
13
print/receipt_template.txt
Normal file
13
print/receipt_template.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
{big_title}
|
||||
{header}
|
||||
{line}
|
||||
{customer_block}
|
||||
{line}
|
||||
{items}
|
||||
{line}
|
||||
{totals}
|
||||
{line}
|
||||
{payment}
|
||||
{line_break}
|
||||
{footer_time}
|
||||
{blanks}
|
||||
Reference in New Issue
Block a user