import uuid from datetime import date, datetime, time, timedelta from fastapi import APIRouter, Cookie, Depends, Security from sqlalchemy import func, or_, select from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionFuture from ...models.inventory import Inventory from ...models.kot import Kot from ...models.product import Product from ...models.product_version import ProductVersion from ...models.sale_category import SaleCategory from ...models.voucher import Voucher from ...models.voucher_type import VoucherType from ...printing.discount_report import print_discount_report from ...schemas.discount_report import DiscountReport, DiscountReportItem from ...schemas.user_token import UserToken from . import check_audit_permission, report_finish_date, report_start_date router = APIRouter() @router.get("", response_model=DiscountReport) def discount_report( start_date: date = Depends(report_start_date), finish_date: date = Depends(report_finish_date), user: UserToken = Security(get_user, scopes=["discount-report"]), ) -> DiscountReport: check_audit_permission(start_date, user.permissions) with SessionFuture() as db: return DiscountReport( startDate=start_date, finishDate=finish_date, amounts=get_discount_report(start_date, finish_date, db), ) def get_discount_report(s: date, f: date, db: Session) -> list[DiscountReportItem]: start_date = datetime.combine(s, time()) + timedelta( minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES ) finish_date = datetime.combine(f, time()) + timedelta( days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES ) day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day") amount = func.sum(Inventory.quantity * Inventory.effective_price * Inventory.discount).label("Amount") list_ = db.execute( select(SaleCategory.name, amount) .join(Voucher.kots) .join(Kot.inventories) .join(Inventory.product) .join(Product.versions) .join(ProductVersion.sale_category) .where( Inventory.discount != 0, Voucher.date >= start_date, Voucher.date <= finish_date, or_( ProductVersion.valid_from == None, # noqa: E711 ProductVersion.valid_from <= day, ), or_( ProductVersion.valid_till == None, # noqa: E711 ProductVersion.valid_till >= day, ), Voucher.voucher_type.in_([VoucherType.REGULAR_BILL, VoucherType.KOT]), ) .group_by(SaleCategory.name) .order_by(SaleCategory.name) ).all() return [DiscountReportItem(name=pg, amount=amt) for pg, amt in list_] @router.get("/print", response_model=bool) def print_report( start_date: date = Depends(report_start_date), finish_date: date = Depends(report_finish_date), device_id: uuid.UUID = Cookie(None), user: UserToken = Security(get_user, scopes=["discount-report"]), ) -> bool: check_audit_permission(start_date, user.permissions) with SessionFuture() as db: report = DiscountReport( startDate=start_date, finishDate=finish_date, amounts=get_discount_report(start_date, finish_date, db), ) print_discount_report(report, device_id, db) return True