125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
import uuid
|
|
from datetime import datetime, timedelta, date
|
|
|
|
from fastapi import APIRouter, Depends, Security
|
|
from sqlalchemy import distinct
|
|
from sqlalchemy.orm import Session, joinedload
|
|
|
|
from ...core.config import settings
|
|
from ...models import Voucher, Settlement, User
|
|
from ...schemas.auth import UserToken
|
|
from ...core.security import get_current_active_user as get_user
|
|
from ...db.session import SessionLocal
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
# Dependency
|
|
def get_db() -> Session:
|
|
try:
|
|
db = SessionLocal()
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
@router.get("/active")
|
|
def active_cashiers(
|
|
s: str = None,
|
|
f: str = None,
|
|
db: Session = Depends(get_db),
|
|
user: UserToken = Security(get_user, scopes=["cashier-report"]),
|
|
):
|
|
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 ValueError("Accounts Audit")
|
|
|
|
users = (
|
|
db.query(User)
|
|
.filter(
|
|
User.id.in_(
|
|
db.query(distinct(Voucher.user_id)).filter(
|
|
Voucher.date >= start_date + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES),
|
|
Voucher.date <= finish_date + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES),
|
|
)
|
|
)
|
|
)
|
|
.order_by(User.name)
|
|
.all()
|
|
)
|
|
|
|
return [{"id": u.id, "name": u.name} for u in users]
|
|
|
|
|
|
@router.get("/{id_}")
|
|
def show_id(
|
|
id_: uuid.UUID,
|
|
s: str = None,
|
|
f: str = None,
|
|
db: Session = Depends(get_db),
|
|
user: UserToken = Security(get_user, scopes=["cashier-report"]),
|
|
):
|
|
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 ValueError("Accounts Audit")
|
|
|
|
vouchers = (
|
|
db.query(Voucher)
|
|
.options(joinedload(Voucher.settlements, innerjoin=True).joinedload(Settlement.settle_option, innerjoin=True))
|
|
.filter(
|
|
Voucher.date >= start_date + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES),
|
|
Voucher.date <= finish_date + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES),
|
|
Voucher.user_id == id_,
|
|
)
|
|
.order_by(Voucher.voucher_type)
|
|
.order_by(Voucher.bill_id)
|
|
.all()
|
|
)
|
|
|
|
info = {}
|
|
amounts = {}
|
|
for item in vouchers:
|
|
for so in (so for so in item.settlements if so.settle_option.show_in_choices):
|
|
if so.settled not in info:
|
|
info[so.settled] = []
|
|
amounts[so.settle_option.name] = 0
|
|
info[so.settled].append(
|
|
{
|
|
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
|
|
"billId": item.full_bill_id,
|
|
"customer": item.customer.name if item.customer is not None else "",
|
|
"amount": so.amount,
|
|
}
|
|
)
|
|
amounts[so.settle_option.name] += so.amount
|
|
return {
|
|
"startDate": start_date.strftime("%d-%b-%Y"),
|
|
"finishDate": finish_date.strftime("%d-%b-%Y"),
|
|
"user": {"id": id_},
|
|
"amounts": [{"name": key, "amount": value} for key, value in amounts.items()],
|
|
"info": info,
|
|
}
|
|
|
|
|
|
@router.get("")
|
|
def show_blank(
|
|
s: str = None,
|
|
f: str = None,
|
|
db: Session = Depends(get_db),
|
|
user: UserToken = Security(get_user, scopes=["cashier-report"]),
|
|
):
|
|
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 ValueError("Accounts Audit")
|
|
|
|
return {
|
|
"startDate": start_date.strftime("%d-%b-%Y"),
|
|
"finishDate": finish_date.strftime("%d-%b-%Y"),
|
|
"user": {"id": ""},
|
|
"amounts": [],
|
|
"info": [],
|
|
}
|