2020-10-27 11:29:24 +00:00
|
|
|
import uuid
|
|
|
|
|
2021-04-02 01:28:38 +00:00
|
|
|
from datetime import date, datetime, time, timedelta
|
2020-06-17 04:27:41 +00:00
|
|
|
|
2021-04-06 03:20:37 +00:00
|
|
|
from fastapi import APIRouter, Cookie, Depends, Security
|
2021-04-09 04:01:36 +00:00
|
|
|
from sqlalchemy import func, or_, select
|
2020-06-17 04:27:41 +00:00
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
2020-10-11 15:23:43 +00:00
|
|
|
from ...core.config import settings
|
2020-06-17 04:27:41 +00:00
|
|
|
from ...core.security import get_current_active_user as get_user
|
2021-04-09 04:01:36 +00:00
|
|
|
from ...db.session import SessionFuture
|
2021-03-17 04:09:56 +00:00
|
|
|
from ...models.inventory import Inventory
|
|
|
|
from ...models.kot import Kot
|
2023-03-18 17:50:11 +00:00
|
|
|
from ...models.product import Product
|
2021-03-17 04:09:56 +00:00
|
|
|
from ...models.product_version import ProductVersion
|
|
|
|
from ...models.sale_category import SaleCategory
|
|
|
|
from ...models.settle_option import SettleOption
|
|
|
|
from ...models.settlement import Settlement
|
|
|
|
from ...models.voucher import Voucher
|
|
|
|
from ...models.voucher_type import VoucherType
|
2020-10-27 06:43:17 +00:00
|
|
|
from ...printing.sale_report import print_sale_report
|
|
|
|
from ...schemas.sale_report import SaleReport, SaleReportItem
|
2020-12-21 05:48:58 +00:00
|
|
|
from ...schemas.user import UserLink
|
|
|
|
from ...schemas.user_token import UserToken
|
2021-04-06 03:20:37 +00:00
|
|
|
from . import check_audit_permission, report_finish_date, report_start_date
|
2020-10-11 05:26:29 +00:00
|
|
|
from .tax_report import get_tax
|
|
|
|
|
2020-06-17 04:27:41 +00:00
|
|
|
|
|
|
|
router = APIRouter()
|
2019-06-13 19:02:34 +00:00
|
|
|
|
2019-08-20 17:32:17 +00:00
|
|
|
|
2020-10-27 06:43:17 +00:00
|
|
|
@router.get("", response_model=SaleReport)
|
2021-06-26 03:19:26 +00:00
|
|
|
def get_sale_report(
|
2020-11-11 04:39:07 +00:00
|
|
|
start_date: date = Depends(report_start_date),
|
|
|
|
finish_date: date = Depends(report_finish_date),
|
2020-06-17 04:27:41 +00:00
|
|
|
user: UserToken = Security(get_user, scopes=["sale-report"]),
|
2020-10-27 06:43:17 +00:00
|
|
|
) -> SaleReport:
|
2021-04-06 03:20:37 +00:00
|
|
|
check_audit_permission(start_date, user.permissions)
|
2021-04-09 04:01:36 +00:00
|
|
|
with SessionFuture() as db:
|
|
|
|
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),
|
|
|
|
)
|
2019-08-20 17:32:17 +00:00
|
|
|
|
|
|
|
|
2022-06-21 03:11:57 +00:00
|
|
|
def get_sale(s: date, f: date, db: Session) -> list[SaleReportItem]:
|
2021-06-26 03:19:26 +00:00
|
|
|
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
|
|
|
|
)
|
2020-06-17 04:27:41 +00:00
|
|
|
|
2020-11-10 06:17:25 +00:00
|
|
|
day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day")
|
2021-04-09 04:01:36 +00:00
|
|
|
list_ = db.execute(
|
|
|
|
select(SaleCategory.name, func.sum(Inventory.net))
|
2019-08-20 17:32:17 +00:00
|
|
|
.join(Inventory.kot)
|
|
|
|
.join(Kot.voucher)
|
|
|
|
.join(Inventory.product)
|
2023-03-18 17:50:11 +00:00
|
|
|
.join(Product.versions)
|
2020-11-10 06:17:25 +00:00
|
|
|
.join(ProductVersion.sale_category)
|
2021-04-09 04:01:36 +00:00
|
|
|
.where(
|
2019-08-20 17:32:17 +00:00
|
|
|
Voucher.date >= start_date,
|
|
|
|
Voucher.date <= finish_date,
|
2020-12-15 16:45:51 +00:00
|
|
|
Voucher.voucher_type == VoucherType.REGULAR_BILL,
|
2022-04-26 03:17:55 +00:00
|
|
|
~Voucher.settlements.any(Settlement.settled == SettleOption.UNSETTLED()),
|
2020-11-10 06:17:25 +00:00
|
|
|
or_(
|
|
|
|
ProductVersion.valid_from == None, # noqa: E711
|
|
|
|
ProductVersion.valid_from <= day,
|
|
|
|
),
|
|
|
|
or_(
|
2020-11-12 07:02:16 +00:00
|
|
|
ProductVersion.valid_till == None, # noqa: E711
|
2020-11-10 06:17:25 +00:00
|
|
|
ProductVersion.valid_till >= day,
|
|
|
|
),
|
2019-08-20 17:32:17 +00:00
|
|
|
)
|
|
|
|
.group_by(SaleCategory.name)
|
|
|
|
.order_by(SaleCategory.name)
|
2021-04-09 04:01:36 +00:00
|
|
|
).all()
|
2017-03-14 12:56:57 +00:00
|
|
|
total = 0
|
|
|
|
info = []
|
2019-08-20 17:32:17 +00:00
|
|
|
for gt, am in list_:
|
2017-03-14 12:56:57 +00:00
|
|
|
total += am
|
2020-10-27 06:43:17 +00:00
|
|
|
info.append(SaleReportItem(name=gt, amount=am))
|
|
|
|
return info + [SaleReportItem(name="Total Settled", amount=total)]
|
2019-08-20 17:32:17 +00:00
|
|
|
|
|
|
|
|
2022-06-21 03:11:57 +00:00
|
|
|
def get_settlements(s: date, f: date, db: Session) -> list[SaleReportItem]:
|
2021-06-26 03:19:26 +00:00
|
|
|
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
|
|
|
|
)
|
2020-06-17 04:27:41 +00:00
|
|
|
|
2021-04-09 04:01:36 +00:00
|
|
|
list_ = db.execute(
|
|
|
|
select(SettleOption.name, func.sum(Settlement.amount))
|
2019-08-20 17:32:17 +00:00
|
|
|
.join(Voucher.settlements)
|
|
|
|
.join(Settlement.settle_option)
|
2021-04-09 04:01:36 +00:00
|
|
|
.where(Voucher.date >= start_date, Voucher.date <= finish_date)
|
2019-08-20 17:32:17 +00:00
|
|
|
.group_by(SettleOption.name)
|
|
|
|
.order_by(SettleOption.name)
|
2021-04-09 04:01:36 +00:00
|
|
|
).all()
|
2017-03-14 12:56:57 +00:00
|
|
|
total = 0
|
|
|
|
info = []
|
2019-08-20 17:32:17 +00:00
|
|
|
for gt, am in list_:
|
2017-03-14 12:56:57 +00:00
|
|
|
total += am
|
2020-10-27 06:43:17 +00:00
|
|
|
info.append(SaleReportItem(name=gt, amount=am))
|
|
|
|
return info + [SaleReportItem(name="Total", amount=total)]
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/print", response_model=bool)
|
|
|
|
def print_report(
|
2020-11-11 04:39:07 +00:00
|
|
|
start_date: date = Depends(report_start_date),
|
|
|
|
finish_date: date = Depends(report_finish_date),
|
2020-10-27 11:29:24 +00:00
|
|
|
device_id: uuid.UUID = Cookie(None),
|
2021-06-13 13:09:55 +00:00
|
|
|
user: UserToken = Security(get_user, scopes=["sale-report"]),
|
2020-10-27 06:43:17 +00:00
|
|
|
) -> bool:
|
2021-04-06 03:20:37 +00:00
|
|
|
check_audit_permission(start_date, user.permissions)
|
2021-04-09 04:01:36 +00:00
|
|
|
with SessionFuture() as db:
|
|
|
|
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
|