From da9d58025c034a43682ec3521434f68d05dae743 Mon Sep 17 00:00:00 2001 From: tanshu Date: Sat, 26 Jun 2021 08:49:26 +0530 Subject: [PATCH] Fix: Reports should now take the Timezone Offset into consideration --- barker/barker/routers/reports/__init__.py | 12 ++++++++++-- .../barker/routers/reports/beer_sale_report.py | 12 +++++++++--- .../routers/reports/bill_settlement_report.py | 18 +++++++++++++----- .../barker/routers/reports/discount_report.py | 8 ++++++-- .../routers/reports/product_sale_report.py | 10 +++++++--- barker/barker/routers/reports/sale_report.py | 18 +++++++++++++----- barker/barker/routers/reports/tax_report.py | 10 +++++++--- 7 files changed, 65 insertions(+), 23 deletions(-) diff --git a/barker/barker/routers/reports/__init__.py b/barker/barker/routers/reports/__init__.py index 3220071..3bc27e0 100644 --- a/barker/barker/routers/reports/__init__.py +++ b/barker/barker/routers/reports/__init__.py @@ -6,11 +6,19 @@ from fastapi import HTTPException, status def report_start_date(s: str = None) -> date: - return date.today() if s is None else datetime.strptime(s, "%d-%b-%Y").date() + return ( + (datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() + if s is None + else datetime.strptime(s, "%d-%b-%Y").date() + ) def report_finish_date(f: str = None) -> date: - return date.today() if f is None else datetime.strptime(f, "%d-%b-%Y").date() + return ( + (datetime.utcnow() + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() + if f is None + else datetime.strptime(f, "%d-%b-%Y").date() + ) def check_audit_permission(start_date: date, user_permissions: List[str]): diff --git a/barker/barker/routers/reports/beer_sale_report.py b/barker/barker/routers/reports/beer_sale_report.py index 00d414b..2bc0a41 100644 --- a/barker/barker/routers/reports/beer_sale_report.py +++ b/barker/barker/routers/reports/beer_sale_report.py @@ -1,4 +1,4 @@ -from datetime import date, timedelta +from datetime import date, datetime, time, timedelta from operator import or_ from fastapi import APIRouter, Depends, Security @@ -26,6 +26,12 @@ def beer_consumption( user: UserToken = Security(get_user, scopes=["beer-sale-report"]), ): check_audit_permission(start_date, user.permissions) + s = datetime.combine(start_date, time()) + timedelta( + minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES + ) + f = datetime.combine(finish_date, time()) + timedelta( + days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES + ) day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day") sum_ = func.sum(Inventory.quantity * ProductVersion.quantity).label("sum") with SessionFuture() as db: @@ -35,8 +41,8 @@ def beer_consumption( .join(Kot.inventories) .join(Inventory.product) .where( - day >= start_date, - day <= finish_date, + day >= s, + day <= f, or_( ProductVersion.valid_from == None, # noqa: E711 ProductVersion.valid_from <= day, diff --git a/barker/barker/routers/reports/bill_settlement_report.py b/barker/barker/routers/reports/bill_settlement_report.py index c95b63e..b8f2c9d 100644 --- a/barker/barker/routers/reports/bill_settlement_report.py +++ b/barker/barker/routers/reports/bill_settlement_report.py @@ -1,4 +1,4 @@ -from datetime import date, timedelta +from datetime import date, datetime, time, timedelta from typing import List from fastapi import APIRouter, Depends, Security @@ -37,8 +37,12 @@ def bill_details( def settlements(s: date, f: date, db: Session) -> List[BillSettlementItem]: - start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) - finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) + 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 + ) vouchers = ( db.execute( select(Voucher) @@ -76,8 +80,12 @@ def settlements(s: date, f: date, db: Session) -> List[BillSettlementItem]: def reprints(s: date, f: date, db: Session) -> List[BillSettlementItem]: - start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) - finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) + 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 + ) return [ BillSettlementItem( date=item.date, diff --git a/barker/barker/routers/reports/discount_report.py b/barker/barker/routers/reports/discount_report.py index 8f831db..414eb7d 100644 --- a/barker/barker/routers/reports/discount_report.py +++ b/barker/barker/routers/reports/discount_report.py @@ -41,8 +41,12 @@ def discount_report( def get_discount_report(s: date, f: date, db: Session) -> List[DiscountReportItem]: - start_date = datetime.combine(s, time()) + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) - finish_date = datetime.combine(f, time()) + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) + 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 + ) day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day") amount = func.sum(Inventory.quantity * Inventory.effective_price * Inventory.discount).label("Amount") diff --git a/barker/barker/routers/reports/product_sale_report.py b/barker/barker/routers/reports/product_sale_report.py index eb3ddbb..c763fa4 100644 --- a/barker/barker/routers/reports/product_sale_report.py +++ b/barker/barker/routers/reports/product_sale_report.py @@ -1,4 +1,4 @@ -from datetime import date, timedelta +from datetime import date, datetime, time, timedelta from fastapi import APIRouter, Depends, Security from sqlalchemy import func, or_, select @@ -38,8 +38,12 @@ def product_sale_report_view( def product_sale_report(s: date, f: date, db: Session): - start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) - finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) + 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 + ) day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day") list_ = db.execute( diff --git a/barker/barker/routers/reports/sale_report.py b/barker/barker/routers/reports/sale_report.py index 793bb81..303e579 100644 --- a/barker/barker/routers/reports/sale_report.py +++ b/barker/barker/routers/reports/sale_report.py @@ -30,7 +30,7 @@ router = APIRouter() @router.get("", response_model=SaleReport) -def get_sale_analysis( +def get_sale_report( start_date: date = Depends(report_start_date), finish_date: date = Depends(report_finish_date), user: UserToken = Security(get_user, scopes=["sale-report"]), @@ -52,8 +52,12 @@ def get_sale_analysis( def get_sale(s: date, f: date, db: Session) -> List[SaleReportItem]: - start_date = datetime.combine(s, time()) + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) - finish_date = datetime.combine(f, time()) + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) + 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 + ) day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day") list_ = db.execute( @@ -87,8 +91,12 @@ def get_sale(s: date, f: date, db: Session) -> List[SaleReportItem]: def get_settlements(s: date, f: date, db: Session) -> List[SaleReportItem]: - start_date = datetime.combine(s, time()) + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) - finish_date = datetime.combine(f, time()) + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) + 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 + ) list_ = db.execute( select(SettleOption.name, func.sum(Settlement.amount)) diff --git a/barker/barker/routers/reports/tax_report.py b/barker/barker/routers/reports/tax_report.py index 7564a48..5c1453e 100644 --- a/barker/barker/routers/reports/tax_report.py +++ b/barker/barker/routers/reports/tax_report.py @@ -1,4 +1,4 @@ -from datetime import date, timedelta +from datetime import date, datetime, time, timedelta from typing import List from fastapi import APIRouter, Depends, Security @@ -37,8 +37,12 @@ def get_tax_report( 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) + 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 + ) amounts = db.execute( select(