Files
barker/barker/barker/routers/reports/sale_report.py
T
tanshu de235f3d9e Product should now be fixed.
Need to allow later editing now.
2020-11-10 11:47:25 +05:30

156 lines
5.1 KiB
Python

import uuid
from datetime import date, datetime, timedelta
from typing import List
from fastapi import APIRouter, Cookie, Depends, HTTPException, Security, status
from sqlalchemy import func, or_
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 SessionLocal
from ...models import (
Inventory,
Kot,
ProductVersion,
SaleCategory,
Settlement,
SettleOption,
Voucher,
VoucherType,
)
from ...printing.sale_report import print_sale_report
from ...schemas.auth import UserLink, UserToken
from ...schemas.sale_report import SaleReport, SaleReportItem
from .tax_report import get_tax
router = APIRouter()
# Dependency
def get_db() -> Session:
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.get("", response_model=SaleReport)
def get_sale_analysis(
s: str = None,
f: str = None,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["sale-report"]),
) -> SaleReport:
start_date = date.today() if s is None else datetime.strptime(s, "%d-%b-%Y").date()
finish_date = date.today() if f is None else datetime.strptime(f, "%d-%b-%Y").date()
if (date.today() - start_date).days > 5 and "accounts-audit" not in user.permissions:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Accounts Audit",
)
return SaleReport(
startDate=start_date,
finishDate=finish_date,
amounts=(
get_sale(start_date, finish_date, db)
+ [SaleReportItem(name="--", amount=0)]
+ get_settlements(start_date, finish_date, db)
+ [SaleReportItem(name="--", amount=0)]
+ [SaleReportItem(name=i.name, amount=i.amount) for i in get_tax(start_date, finish_date, db)]
),
user=UserLink(id=user.id_, name=user.name),
)
def get_sale(s: date, f: date, db: Session) -> List[SaleReportItem]:
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES)
day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day")
list_ = (
db.query(SaleCategory.name, func.sum(Inventory.net))
.join(Inventory.kot)
.join(Kot.voucher)
.join(Inventory.product)
.join(ProductVersion.sale_category)
.filter(
Voucher.date >= start_date,
Voucher.date <= finish_date,
Voucher.voucher_type == VoucherType.REGULAR_BILL.value,
or_(
ProductVersion.valid_from == None, # noqa: E711
ProductVersion.valid_from <= day,
),
or_(
ProductVersion.valid_till == None, # noqa: FE711
ProductVersion.valid_till >= day,
),
)
.group_by(SaleCategory.name)
.order_by(SaleCategory.name)
.all()
)
total = 0
info = []
for gt, am in list_:
total += am
info.append(SaleReportItem(name=gt, amount=am))
return info + [SaleReportItem(name="Total Settled", amount=total)]
def get_settlements(s: date, f: date, db: Session) -> List[SaleReportItem]:
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES)
list_ = (
db.query(SettleOption.name, func.sum(Settlement.amount))
.join(Voucher.settlements)
.join(Settlement.settle_option)
.filter(Voucher.date >= start_date, Voucher.date <= finish_date)
.group_by(SettleOption.name)
.order_by(SettleOption.name)
.all()
)
total = 0
info = []
for gt, am in list_:
total += am
info.append(SaleReportItem(name=gt, amount=am))
return info + [SaleReportItem(name="Total", amount=total)]
@router.get("/print", response_model=bool)
def print_report(
s: str = None,
f: str = None,
device_id: uuid.UUID = Cookie(None),
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["discount-report"]),
) -> bool:
start_date = date.today() if s is None else datetime.strptime(s, "%d-%b-%Y").date()
finish_date = date.today() if f is None else datetime.strptime(f, "%d-%b-%Y").date()
if (date.today() - start_date).days > 5 and "accounts-audit" not in user.permissions:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Accounts Audit",
)
report = SaleReport(
startDate=start_date,
finishDate=finish_date,
amounts=(
get_sale(start_date, finish_date, db)
+ [SaleReportItem(name="--", amount=0)]
+ get_settlements(start_date, finish_date, db)
+ [SaleReportItem(name="--", amount=0)]
+ [SaleReportItem(name=i.name, amount=i.amount) for i in get_tax(start_date, finish_date, db)]
),
user=UserLink(id=user.id_, name=user.name),
)
print_sale_report(report, device_id, db)
return True