diff --git a/brewman/models/voucher.py b/brewman/models/voucher.py index eb320491..25bc881c 100644 --- a/brewman/models/voucher.py +++ b/brewman/models/voucher.py @@ -81,12 +81,7 @@ class Voucher(Base): ) journals = relationship("Journal", back_populates="voucher", cascade="delete, delete-orphan", cascade_backrefs=False,) - inventories = relationship( - "Inventory", - backref="voucher", - cascade="delete, delete-orphan", - cascade_backrefs=False, - ) + inventories = relationship("Inventory",back_populates="voucher",cascade="delete, delete-orphan",cascade_backrefs=False,) salary_deductions = relationship( "SalaryDeduction", backref="voucher", @@ -284,9 +279,11 @@ class Inventory(Base): tax = Column("tax", Numeric) discount = Column("discount", Numeric) + voucher = relationship("Voucher", back_populates="inventories") + def __init__( self, - id=None, + id_=None, voucher_id=None, product_id=None, batch_id=None, @@ -296,7 +293,7 @@ class Inventory(Base): discount=None, batch=None, ): - self.id = id + self.id = id_ self.voucher_id = voucher_id self.product_id = product_id self.batch_id = batch_id diff --git a/brewman/routers/reports/closing_stock.py b/brewman/routers/reports/closing_stock.py index ebe864cf..240fe6c5 100644 --- a/brewman/routers/reports/closing_stock.py +++ b/brewman/routers/reports/closing_stock.py @@ -1,4 +1,4 @@ -import datetime +from datetime import datetime, date from fastapi import APIRouter, Depends, Security, Request from sqlalchemy.orm import Session @@ -9,6 +9,7 @@ from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal from brewman.models.master import Product, CostCentre from brewman.models.voucher import Voucher, Journal, Inventory +import brewman.schemas.reports as schemas from ...core.session import ( set_period, get_start_date, @@ -27,7 +28,7 @@ def get_db() -> Session: db.close() -@router.get("") # "Closing Stock" +@router.get("", response_model=schemas.ClosingStock) def report_blank( request: Request, user: UserToken = Security(get_user, scopes=["closing-stock"]), @@ -35,19 +36,18 @@ def report_blank( return {"date": get_finish_date(request.session), "body": []} -@router.get("/{date}") +@router.get("/{date_}", response_model=schemas.ClosingStock) def report_data( - date: str, + date_: str, request: Request, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["closing-stock"]), ): - set_period(get_start_date(request.session), date, request.session) - return {"date": date, "body": build_report(date, db)} + set_period(get_start_date(request.session), date_, request.session) + return {"date": date_, "body": build_report(datetime.strptime(date_, "%d-%b-%Y").date(), db)} -def build_report(date, db): - date = datetime.datetime.strptime(date, "%d-%b-%Y") +def build_report(date_: date, db: Session): amount_sum = func.sum( Journal.debit * Inventory.quantity * Inventory.rate * (1 + Inventory.tax) ).label("amount") @@ -57,7 +57,7 @@ def build_report(date, db): .join(Product.inventories) .join(Inventory.voucher) .join(Voucher.journals) - .filter(Voucher.date <= date) + .filter(Voucher.date <= date_) .filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase()) .group_by(Product) .order_by(amount_sum.desc()) @@ -78,7 +78,7 @@ def build_report(date, db): return body -def get_opening_stock(start_date, db): +def get_opening_stock(date_: date, db: Session): opening_stock = ( db.query( func.sum( @@ -91,14 +91,14 @@ def get_opening_stock(start_date, db): .join(Journal.voucher) .join(Journal.account) .join(Voucher.inventories) - .filter(Voucher.date < start_date) + .filter(Voucher.date < date_) .filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase()) .scalar() ) return 0 if opening_stock is None else opening_stock -def get_closing_stock(finish_date, db): +def get_closing_stock(date_, db: Session): closing_stock = ( db.query( func.sum( @@ -111,7 +111,7 @@ def get_closing_stock(finish_date, db): .join(Journal.voucher) .join(Journal.account) .join(Voucher.inventories) - .filter(Voucher.date <= finish_date) + .filter(Voucher.date <= date_) .filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase()) .scalar() ) diff --git a/brewman/schemas/reports.py b/brewman/schemas/reports.py index 37bf7d39..c1b121da 100644 --- a/brewman/schemas/reports.py +++ b/brewman/schemas/reports.py @@ -147,3 +147,33 @@ class CashFlow(BaseModel): ).date() +class ClosingStockItem(BaseModel): + product: str + group: str + quantity: Decimal + amount: Decimal + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + + +class ClosingStock(BaseModel): + date_: date + body: List[ClosingStockItem] + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + json_encoders = { + date: lambda v: v.strftime("%d-%b-%Y") + } + + @validator("date_", pre=True) + def parse_date(cls, value): + return datetime.strptime( + value, + "%d-%b-%Y" + ).date() + +