Closing Stock Done!!

This commit is contained in:
tanshu 2020-05-14 12:18:45 +05:30
parent a4b9fb7408
commit 01cf6c2da1
3 changed files with 48 additions and 21 deletions

View File

@ -81,12 +81,7 @@ class Voucher(Base):
) )
journals = relationship("Journal", back_populates="voucher", cascade="delete, delete-orphan", cascade_backrefs=False,) journals = relationship("Journal", back_populates="voucher", cascade="delete, delete-orphan", cascade_backrefs=False,)
inventories = relationship( inventories = relationship("Inventory",back_populates="voucher",cascade="delete, delete-orphan",cascade_backrefs=False,)
"Inventory",
backref="voucher",
cascade="delete, delete-orphan",
cascade_backrefs=False,
)
salary_deductions = relationship( salary_deductions = relationship(
"SalaryDeduction", "SalaryDeduction",
backref="voucher", backref="voucher",
@ -284,9 +279,11 @@ class Inventory(Base):
tax = Column("tax", Numeric) tax = Column("tax", Numeric)
discount = Column("discount", Numeric) discount = Column("discount", Numeric)
voucher = relationship("Voucher", back_populates="inventories")
def __init__( def __init__(
self, self,
id=None, id_=None,
voucher_id=None, voucher_id=None,
product_id=None, product_id=None,
batch_id=None, batch_id=None,
@ -296,7 +293,7 @@ class Inventory(Base):
discount=None, discount=None,
batch=None, batch=None,
): ):
self.id = id self.id = id_
self.voucher_id = voucher_id self.voucher_id = voucher_id
self.product_id = product_id self.product_id = product_id
self.batch_id = batch_id self.batch_id = batch_id

View File

@ -1,4 +1,4 @@
import datetime from datetime import datetime, date
from fastapi import APIRouter, Depends, Security, Request from fastapi import APIRouter, Depends, Security, Request
from sqlalchemy.orm import Session 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 ...db.session import SessionLocal
from brewman.models.master import Product, CostCentre from brewman.models.master import Product, CostCentre
from brewman.models.voucher import Voucher, Journal, Inventory from brewman.models.voucher import Voucher, Journal, Inventory
import brewman.schemas.reports as schemas
from ...core.session import ( from ...core.session import (
set_period, set_period,
get_start_date, get_start_date,
@ -27,7 +28,7 @@ def get_db() -> Session:
db.close() db.close()
@router.get("") # "Closing Stock" @router.get("", response_model=schemas.ClosingStock)
def report_blank( def report_blank(
request: Request, request: Request,
user: UserToken = Security(get_user, scopes=["closing-stock"]), user: UserToken = Security(get_user, scopes=["closing-stock"]),
@ -35,19 +36,18 @@ def report_blank(
return {"date": get_finish_date(request.session), "body": []} return {"date": get_finish_date(request.session), "body": []}
@router.get("/{date}") @router.get("/{date_}", response_model=schemas.ClosingStock)
def report_data( def report_data(
date: str, date_: str,
request: Request, request: Request,
db: Session = Depends(get_db), db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["closing-stock"]), user: UserToken = Security(get_user, scopes=["closing-stock"]),
): ):
set_period(get_start_date(request.session), date, request.session) set_period(get_start_date(request.session), date_, request.session)
return {"date": date, "body": build_report(date, db)} return {"date": date_, "body": build_report(datetime.strptime(date_, "%d-%b-%Y").date(), db)}
def build_report(date, db): def build_report(date_: date, db: Session):
date = datetime.datetime.strptime(date, "%d-%b-%Y")
amount_sum = func.sum( amount_sum = func.sum(
Journal.debit * Inventory.quantity * Inventory.rate * (1 + Inventory.tax) Journal.debit * Inventory.quantity * Inventory.rate * (1 + Inventory.tax)
).label("amount") ).label("amount")
@ -57,7 +57,7 @@ def build_report(date, db):
.join(Product.inventories) .join(Product.inventories)
.join(Inventory.voucher) .join(Inventory.voucher)
.join(Voucher.journals) .join(Voucher.journals)
.filter(Voucher.date <= date) .filter(Voucher.date <= date_)
.filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase()) .filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase())
.group_by(Product) .group_by(Product)
.order_by(amount_sum.desc()) .order_by(amount_sum.desc())
@ -78,7 +78,7 @@ def build_report(date, db):
return body return body
def get_opening_stock(start_date, db): def get_opening_stock(date_: date, db: Session):
opening_stock = ( opening_stock = (
db.query( db.query(
func.sum( func.sum(
@ -91,14 +91,14 @@ def get_opening_stock(start_date, db):
.join(Journal.voucher) .join(Journal.voucher)
.join(Journal.account) .join(Journal.account)
.join(Voucher.inventories) .join(Voucher.inventories)
.filter(Voucher.date < start_date) .filter(Voucher.date < date_)
.filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase()) .filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase())
.scalar() .scalar()
) )
return 0 if opening_stock is None else opening_stock 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 = ( closing_stock = (
db.query( db.query(
func.sum( func.sum(
@ -111,7 +111,7 @@ def get_closing_stock(finish_date, db):
.join(Journal.voucher) .join(Journal.voucher)
.join(Journal.account) .join(Journal.account)
.join(Voucher.inventories) .join(Voucher.inventories)
.filter(Voucher.date <= finish_date) .filter(Voucher.date <= date_)
.filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase()) .filter(Journal.cost_centre_id == CostCentre.cost_centre_purchase())
.scalar() .scalar()
) )

View File

@ -147,3 +147,33 @@ class CashFlow(BaseModel):
).date() ).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()