54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import asyncio
|
|
import locale
|
|
import uuid
|
|
|
|
from datetime import datetime
|
|
|
|
from arq import ArqRedis, create_pool
|
|
from barker.schemas.cashier_report import CashierReport
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ..core.arq import settings as redis_settings
|
|
from ..models.device import Device
|
|
from ..models.printer import Printer
|
|
from ..models.section_printer import SectionPrinter
|
|
from . import currency_format
|
|
|
|
|
|
def print_cashier_report(report: CashierReport, device_id: uuid.UUID, db: Session):
|
|
locale.setlocale(locale.LC_MONETARY, "en_IN")
|
|
data = design_cashier_report(report)
|
|
section_id = db.query(Device.section_id).filter(Device.id == device_id).scalar()
|
|
printer = (
|
|
db.query(Printer)
|
|
.join(SectionPrinter.printer)
|
|
.filter(SectionPrinter.section_id == section_id)
|
|
.filter(SectionPrinter.menu_category_id == None) # noqa: E711
|
|
.first()
|
|
)
|
|
|
|
redis: ArqRedis = asyncio.run(create_pool(redis_settings))
|
|
asyncio.run(
|
|
redis.enqueue_job(
|
|
"sent_to_printer", data, printer.address, "\x1dV\x41\x03", _queue_name=f"barker:print:{printer.name}"
|
|
)
|
|
)
|
|
|
|
|
|
def design_cashier_report(report: CashierReport):
|
|
s = f"{report.cashier.name} Checkout By {report.user.name} @ {datetime.now():%d-%b-%Y %H:%M}".center(42)
|
|
s += "\n\r" + "-" * 42
|
|
s += "\n\r" f"{report.start_date:%d-%b-%Y} To {report.finish_date:%d-%b-%Y}".center(42)
|
|
s += "\n\r" + "-" * 42
|
|
for item in report.amounts:
|
|
s += f"\n\r{item.name} : {currency_format(item.amount): >26}"
|
|
s += "\n\r" + "=" * 42
|
|
s += f"\n\rActive Cashiers : {report.cashiers}"
|
|
for so, it in report.info.items():
|
|
s += f"\n\r" f"--- {so} ".ljust(42, "-")
|
|
for i in it:
|
|
s += f"\n\r{i.date} {i.bill_id} {i.customer}"
|
|
s += f"\n\rAmount: {currency_format(i.amount):9}"
|
|
s += "\n\r" + "-" * 42
|
|
return s
|