barker/barker/barker/routers/reports/cashier_report.py

125 lines
4.1 KiB
Python
Raw Normal View History

import uuid
2020-06-17 04:27:41 +00:00
from datetime import datetime, timedelta, date
2020-06-17 04:27:41 +00:00
from fastapi import APIRouter, Depends, Security
from sqlalchemy import distinct
from sqlalchemy.orm import Session, joinedload
2020-06-17 04:27:41 +00:00
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
2020-06-17 04:27:41 +00:00
router = APIRouter()
2020-06-17 04:27:41 +00:00
# Dependency
def get_db() -> Session:
try:
db = SessionLocal()
yield db
finally:
db.close()
2020-06-17 04:27:41 +00:00
@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")
2019-08-19 10:28:02 +00:00
2020-06-17 04:27:41 +00:00
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()
)
2019-08-21 09:07:46 +00:00
2020-06-17 04:27:41 +00:00
return [{"id": u.id, "name": u.name} for u in users]
2019-08-19 10:28:02 +00:00
2020-06-17 04:27:41 +00:00
@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")
2019-08-19 10:28:02 +00:00
vouchers = (
2020-06-17 04:27:41 +00:00
db.query(Voucher)
.options(joinedload(Voucher.settlements, innerjoin=True).joinedload(Settlement.settle_option, innerjoin=True))
2020-06-17 04:27:41 +00:00
.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_,
)
2019-08-19 10:28:02 +00:00
.order_by(Voucher.voucher_type)
.order_by(Voucher.bill_id)
.all()
)
info = {}
2019-08-19 10:28:02 +00:00
amounts = {}
for item in vouchers:
2019-08-19 10:28:02 +00:00
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 {
2020-06-17 04:27:41 +00:00
"startDate": start_date.strftime("%d-%b-%Y"),
"finishDate": finish_date.strftime("%d-%b-%Y"),
2019-08-19 10:28:02 +00:00
"user": {"id": id_},
"amounts": [{"name": key, "amount": value} for key, value in amounts.items()],
"info": info,
2019-08-19 10:28:02 +00:00
}
2020-06-17 04:27:41 +00:00
@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": [],
}