Closing Stock Done!!
This commit is contained in:
parent
a4b9fb7408
commit
01cf6c2da1
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
)
|
)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue