barker/barker/barker/printing/cashier_report.py

58 lines
2.1 KiB
Python

import asyncio
import locale
import uuid
from datetime import datetime, timedelta
from arq import ArqRedis, create_pool
from barker.schemas.cashier_report import CashierReport
from sqlalchemy import select
from sqlalchemy.orm import Session
from ..core.arq import settings as redis_settings
from ..core.config import 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.execute(select(Device.section_id).where(Device.id == device_id)).scalar_one()
printer = db.execute(
select(Printer)
.join(SectionPrinter.printer)
.where(SectionPrinter.section_id == section_id)
.where(SectionPrinter.sale_category_id == None) # noqa: E711
).scalar_one()
loop = asyncio.new_event_loop()
redis: ArqRedis = loop.run_until_complete(create_pool(redis_settings))
loop.run_until_complete(
redis.enqueue_job(
"sent_to_printer", data, printer.address, printer.cut_code, _queue_name=f"barker:print:{printer.name}"
)
)
loop.close()
def design_cashier_report(report: CashierReport):
now = datetime.now() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)
s = f"{report.cashier.name} Checkout By {report.user.name} @ {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