Fix: Reports should now take the Timezone Offset into consideration

This commit is contained in:
Amritanshu Agrawal 2021-06-26 08:49:26 +05:30
parent 77dad64eab
commit da9d58025c
7 changed files with 65 additions and 23 deletions

View File

@ -6,11 +6,19 @@ from fastapi import HTTPException, status
def report_start_date(s: str = None) -> date: 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: 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]): def check_audit_permission(start_date: date, user_permissions: List[str]):

View File

@ -1,4 +1,4 @@
from datetime import date, timedelta from datetime import date, datetime, time, timedelta
from operator import or_ from operator import or_
from fastapi import APIRouter, Depends, Security from fastapi import APIRouter, Depends, Security
@ -26,6 +26,12 @@ def beer_consumption(
user: UserToken = Security(get_user, scopes=["beer-sale-report"]), user: UserToken = Security(get_user, scopes=["beer-sale-report"]),
): ):
check_audit_permission(start_date, user.permissions) 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") 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") sum_ = func.sum(Inventory.quantity * ProductVersion.quantity).label("sum")
with SessionFuture() as db: with SessionFuture() as db:
@ -35,8 +41,8 @@ def beer_consumption(
.join(Kot.inventories) .join(Kot.inventories)
.join(Inventory.product) .join(Inventory.product)
.where( .where(
day >= start_date, day >= s,
day <= finish_date, day <= f,
or_( or_(
ProductVersion.valid_from == None, # noqa: E711 ProductVersion.valid_from == None, # noqa: E711
ProductVersion.valid_from <= day, ProductVersion.valid_from <= day,

View File

@ -1,4 +1,4 @@
from datetime import date, timedelta from datetime import date, datetime, time, timedelta
from typing import List from typing import List
from fastapi import APIRouter, Depends, Security from fastapi import APIRouter, Depends, Security
@ -37,8 +37,12 @@ def bill_details(
def settlements(s: date, f: date, db: Session) -> List[BillSettlementItem]: def settlements(s: date, f: date, db: Session) -> List[BillSettlementItem]:
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) start_date = datetime.combine(s, time()) + timedelta(
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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 = ( vouchers = (
db.execute( db.execute(
select(Voucher) 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]: def reprints(s: date, f: date, db: Session) -> List[BillSettlementItem]:
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) start_date = datetime.combine(s, time()) + timedelta(
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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 [ return [
BillSettlementItem( BillSettlementItem(
date=item.date, date=item.date,

View File

@ -41,8 +41,12 @@ def discount_report(
def get_discount_report(s: date, f: date, db: Session) -> List[DiscountReportItem]: 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) start_date = datetime.combine(s, time()) + timedelta(
finish_date = datetime.combine(f, time()) + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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") 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") amount = func.sum(Inventory.quantity * Inventory.effective_price * Inventory.discount).label("Amount")

View File

@ -1,4 +1,4 @@
from datetime import date, timedelta from datetime import date, datetime, time, timedelta
from fastapi import APIRouter, Depends, Security from fastapi import APIRouter, Depends, Security
from sqlalchemy import func, or_, select 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): def product_sale_report(s: date, f: date, db: Session):
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) start_date = datetime.combine(s, time()) + timedelta(
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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") day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day")
list_ = db.execute( list_ = db.execute(

View File

@ -30,7 +30,7 @@ router = APIRouter()
@router.get("", response_model=SaleReport) @router.get("", response_model=SaleReport)
def get_sale_analysis( def get_sale_report(
start_date: date = Depends(report_start_date), start_date: date = Depends(report_start_date),
finish_date: date = Depends(report_finish_date), finish_date: date = Depends(report_finish_date),
user: UserToken = Security(get_user, scopes=["sale-report"]), 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]: def get_sale(s: date, f: date, db: Session) -> List[SaleReportItem]:
start_date = datetime.combine(s, time()) + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) start_date = datetime.combine(s, time()) + timedelta(
finish_date = datetime.combine(f, time()) + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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") day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day")
list_ = db.execute( 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]: def get_settlements(s: date, f: date, db: Session) -> List[SaleReportItem]:
start_date = datetime.combine(s, time()) + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) start_date = datetime.combine(s, time()) + timedelta(
finish_date = datetime.combine(f, time()) + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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( list_ = db.execute(
select(SettleOption.name, func.sum(Settlement.amount)) select(SettleOption.name, func.sum(Settlement.amount))

View File

@ -1,4 +1,4 @@
from datetime import date, timedelta from datetime import date, datetime, time, timedelta
from typing import List from typing import List
from fastapi import APIRouter, Depends, Security 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]: def get_tax(s: date, f: date, db: Session) -> List[TaxReportItem]:
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES) start_date = datetime.combine(s, time()) + timedelta(
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES) 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( amounts = db.execute(
select( select(