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,)
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

View File

@ -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()
)

View File

@ -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()