72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
from datetime import date, timedelta
|
|
from typing import List
|
|
|
|
from fastapi import APIRouter, Depends, Security
|
|
from sqlalchemy import func
|
|
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.inventory import Inventory
|
|
from ...models.kot import Kot
|
|
from ...models.tax import Tax
|
|
from ...models.voucher import Voucher
|
|
from ...models.voucher_type import VoucherType
|
|
from ...schemas.tax_report import TaxReport, TaxReportItem
|
|
from ...schemas.user_token import UserToken
|
|
from . import check_audit_permission, report_finish_date, report_start_date
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
# Dependency
|
|
def get_db() -> Session:
|
|
try:
|
|
db = SessionLocal()
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
@router.get("", response_model=TaxReport)
|
|
def get_tax_report(
|
|
start_date: date = Depends(report_start_date),
|
|
finish_date: date = Depends(report_finish_date),
|
|
db: Session = Depends(get_db),
|
|
user: UserToken = Security(get_user, scopes=["tax-report"]),
|
|
) -> TaxReport:
|
|
check_audit_permission(start_date, user.permissions)
|
|
return TaxReport(
|
|
startDate=start_date.strftime("%d-%b-%Y"),
|
|
finishDate=finish_date.strftime("%d-%b-%Y"),
|
|
amounts=get_tax(start_date, finish_date, db),
|
|
)
|
|
|
|
|
|
def get_tax(s: date, f: date, db: Session) -> List[TaxReportItem]:
|
|
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)
|
|
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES)
|
|
|
|
amounts = (
|
|
db.query(
|
|
Tax.name,
|
|
Inventory.tax_rate,
|
|
func.coalesce(func.sum(Inventory.net), 0),
|
|
func.coalesce(func.sum(Inventory.tax_amount), 0),
|
|
)
|
|
.join(Voucher.kots)
|
|
.join(Kot.inventories)
|
|
.join(Inventory.tax)
|
|
.filter(
|
|
Voucher.date >= start_date,
|
|
Voucher.date <= finish_date,
|
|
Voucher.voucher_type == VoucherType.REGULAR_BILL,
|
|
)
|
|
.group_by(Tax.name, Inventory.tax_rate)
|
|
.order_by(Tax.name, Inventory.tax_rate)
|
|
.all()
|
|
)
|
|
return [TaxReportItem(name=f"{i[0]} - {i[1]:.2%}", taxRate=i[1], saleAmount=i[2], amount=i[3]) for i in amounts]
|