diff --git a/brewman/routers/reports/purchases.py b/brewman/routers/reports/purchases.py index 2db3d3d7..4e5d1b8d 100644 --- a/brewman/routers/reports/purchases.py +++ b/brewman/routers/reports/purchases.py @@ -10,6 +10,7 @@ from ...db.session import SessionLocal from brewman.models.master import CostCentre, Product from brewman.models.voucher import Voucher, Journal, Inventory, VoucherType +import brewman.schemas.reports as schemas from ...core.session import ( set_period, get_start_date, @@ -28,20 +29,19 @@ def get_db() -> Session: db.close() -@router.get("/api/purchases") +@router.get("", response_model=schemas.Purchases) def report_blank( - request: Request, - user: UserToken = Security(get_user, scopes=["purchases"]), + request: Request, user: UserToken = Security(get_user, scopes=["purchases"]), ): - return { - "startDate": get_start_date(request.session), - "finishDate": get_finish_date(request.session), - "body": [], - "footer": {}, - } + return schemas.Purchases( + startDate=get_start_date(request.session), + finishDate=get_finish_date(request.session), + body=[], + footer=None, + ) -@router.get("/{start}/{finish}") +@router.get("/{start}/{finish}", response_model=schemas.Purchases) def report_data( start: str, finish: str, @@ -51,12 +51,9 @@ def report_data( ): body, footer = build_report(start, finish, db) set_period(start, finish, request.session) - return { - "startDate": start, - "finishDate": finish, - "body": body, - "footer": footer, - } + return schemas.Purchases( + startDate=start, finishDate=finish, body=body, footer=footer, + ) def build_report(start_date, finish_date, db): @@ -83,12 +80,17 @@ def build_report(start_date, finish_date, db): for product, quantity, amount in query: rate = amount / quantity if quantity != 0 else 0 total_amount += amount - row = { - "name": product.full_name, - "quantity": quantity, - "rate": rate, - "amount": amount, - "url": "", # request.route_url("product_ledger_id", id=product.id, _query={"startDate": start_date, "finishDate": finish_date},), - } + row = schemas.PurchasesItem( + name=product.full_name, + quantity=quantity, + rate=rate, + amount=amount, + url=["/", "product-ledger", str(product.id)], + ) body.append(row) - return body, {"name": "Total", "amount": total_amount} + return ( + body, + schemas.PurchasesItem( + name="Total", quantity=0, rate=0, url=[], amount=total_amount + ), + ) diff --git a/brewman/schemas/reports.py b/brewman/schemas/reports.py index 2d4dff22..40a78542 100644 --- a/brewman/schemas/reports.py +++ b/brewman/schemas/reports.py @@ -421,3 +421,47 @@ class PurchaseEntries(BaseModel): value, "%d-%b-%Y" ).date() + + +class PurchasesItem(BaseModel): + name: str + quantity: Decimal + rate: Decimal + amount: Decimal + url: List[str] + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Purchases(BaseModel): + start_date: date + finish_date: date + body: List[PurchasesItem] + footer: Optional[PurchasesItem] + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + json_encoders = { + date: lambda v: v.strftime("%d-%b-%Y") + } + + @validator("start_date", pre=True) + def parse_start_date(cls, value): + if isinstance(value, date): + return value + return datetime.strptime( + value, + "%d-%b-%Y" + ).date() + + @validator("finish_date", pre=True) + def parse_finish_date(cls, value): + if isinstance(value, date): + return value + return datetime.strptime( + value, + "%d-%b-%Y" + ).date() diff --git a/overlord/src/app/purchases/purchases.component.html b/overlord/src/app/purchases/purchases.component.html index 6c5926bd..2317b5ca 100644 --- a/overlord/src/app/purchases/purchases.component.html +++ b/overlord/src/app/purchases/purchases.component.html @@ -26,9 +26,9 @@ Product - {{row.name}} + {{row.name}} - {{info.footer.name}} + {{info.footer?.name}} @@ -37,7 +37,7 @@ Quantity {{row.quantity | number:'1.2-2'}} - {{info.footer.quantity | number:'1.2-2'}} + {{info.footer?.quantity | number:'1.2-2'}} @@ -46,7 +46,7 @@ Rate {{row.rate | currency:'INR'}} - {{info.footer.rate | currency:'INR'}} + {{info.footer?.rate | currency:'INR'}} @@ -55,7 +55,7 @@ Amount {{row.amount | currency:'INR'}} - {{info.footer.amount | currency:'INR'}} + {{info.footer?.amount | currency:'INR'}} diff --git a/overlord/src/app/purchases/purchases.ts b/overlord/src/app/purchases/purchases.ts index 447b3584..9170700b 100644 --- a/overlord/src/app/purchases/purchases.ts +++ b/overlord/src/app/purchases/purchases.ts @@ -4,7 +4,7 @@ export class PurchasesItem { quantity: number; rate: number; amount: number; - url: string; + url: string[]; } export class Purchases {