import asyncio import locale import uuid from datetime import datetime, timedelta from arq import ArqRedis, create_pool 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 ..schemas.sale_report import SaleReport from . import currency_format def print_sale_report(report: SaleReport, device_id: uuid.UUID, db: Session): locale.setlocale(locale.LC_MONETARY, "en_IN") data = design_sale_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.menu_category_id == None) # noqa: E711 ).scalar_one() redis: ArqRedis = asyncio.run(create_pool(redis_settings)) asyncio.run( redis.enqueue_job( "sent_to_printer", data, printer.address, printer.cut_code, _queue_name=f"barker:print:{printer.name}" ) ) def design_sale_report(report: SaleReport): now = datetime.now() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) s = f"{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: <29.29} {currency_format(item.amount): >12}" s += "\n\r" + "=" * 42 return s