diff --git a/brewman/main.py b/brewman/main.py index 548f827d..89d35653 100644 --- a/brewman/main.py +++ b/brewman/main.py @@ -31,6 +31,9 @@ from .routers.reports import ( purchases, raw_material_cost, reconcile, + stock_movement, + trial_balance, + unposted, ) from .db.base_class import Base from .config import Settings as settings @@ -86,6 +89,9 @@ app.include_router(purchase_entries.router, prefix="/api/purchase-entries", tags app.include_router(purchases.router, prefix="/api/purchases", tags=["reports"]) app.include_router(raw_material_cost.router, prefix="/api/raw-material-cost", tags=["reports"]) app.include_router(reconcile.router, prefix="/api/reconcile", tags=["reports"]) +app.include_router(stock_movement.router, prefix="/api/stock-movement", tags=["reports"]) +app.include_router(trial_balance.router, prefix="/api/trial-balance", tags=["reports"]) +app.include_router(unposted.router, prefix="/api/unposted", tags=["reports"]) def init(): diff --git a/brewman/routers/reports/stock_movement.py b/brewman/routers/reports/stock_movement.py index a2970f3a..ec2dd91b 100644 --- a/brewman/routers/reports/stock_movement.py +++ b/brewman/routers/reports/stock_movement.py @@ -1,7 +1,12 @@ import datetime +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func +from ...schemas.auth import UserToken +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, VoucherType, Inventory from brewman.routers.services.session import ( @@ -10,36 +15,50 @@ from brewman.routers.services.session import ( session_period_finish, ) -from fastapi import APIRouter - router = APIRouter() -@router.get("/api/stock-movement") # "Stock Movement" -def report_blank(request): +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.get("") +def report_blank( + request: Request, + user: UserToken = Security(get_user, scopes=["stock-movement"]), +): return { - "startDate": session_period_start(request), - "finishDate": session_period_finish(request), + "startDate": session_period_start(request.session), + "finishDate": session_period_finish(request.session), "body": [], } -@router.get("/api/stock-movement", request_param=["s", "f"], permission="Stock Movement") -def report_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - body = build_stock_movement(start_date, finish_date, request.dbsession) - session_period_set( start_date, finish_date, request) - return {"startDate": start_date, "finishDate": finish_date, "body": body} +@router.get("/{start}/{finish}") +def report_data( + start: str, + finish: str, + request: Request, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["stock-movement"]), +): + body = build_stock_movement(start, finish, db) + session_period_set( start, finish, request.session) + return {"startDate": start, "finishDate": finish, "body": body} -def build_stock_movement(start_date, finish_date, dbsession): +def build_stock_movement(start_date, finish_date, db): start_date = datetime.datetime.strptime(start_date, "%d-%b-%Y") finish_date = datetime.datetime.strptime(finish_date, "%d-%b-%Y") dict_ = {} quantity_sum = func.sum(Journal.debit * Inventory.quantity).label("quantity") openings = ( - dbsession.query(Product, quantity_sum) + db.query(Product, quantity_sum) .join(Product.inventories) .join(Inventory.voucher) .join(Voucher.journals) @@ -56,7 +75,7 @@ def build_stock_movement(start_date, finish_date, dbsession): "opening": quantity, } purchases = ( - dbsession.query(Product, quantity_sum) + db.query(Product, quantity_sum) .join(Product.inventories) .join(Inventory.voucher) .join(Voucher.journals) @@ -78,7 +97,7 @@ def build_stock_movement(start_date, finish_date, dbsession): "purchase": quantity, } issues = ( - dbsession.query(Product, quantity_sum) + db.query(Product, quantity_sum) .join(Product.inventories) .join(Inventory.voucher) .join(Voucher.journals) diff --git a/brewman/routers/reports/trial_balance.py b/brewman/routers/reports/trial_balance.py index 6bef95df..9123c059 100644 --- a/brewman/routers/reports/trial_balance.py +++ b/brewman/routers/reports/trial_balance.py @@ -1,7 +1,12 @@ import datetime +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func +from ...schemas.auth import UserToken +from ...core.security import get_current_active_user as get_user +from ...db.session import SessionLocal from brewman.models.master import AccountBase from brewman.models.voucher import Voucher, Journal, VoucherType from brewman.routers.services.session import ( @@ -10,28 +15,42 @@ from brewman.routers.services.session import ( session_period_finish, ) -from fastapi import APIRouter - router = APIRouter() -@router.get("/api/trial-balance") # "Trial Balance" -def report_blank(request): - return {"date": session_period_finish(request), "body": []} +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() -@router.get("/api/trial-balance/{date}") # "Trial Balance" -def report_data(request): - date = request.matchdict.get("date", None) - session_period_set(session_period_start(request), date, request) - return {"date": date, "body": build_report(date, request.dbsession)} +@router.get("") +def report_blank( + request: Request, + user: UserToken = Security(get_user, scopes=["trial-balance"]), +): + return {"date": session_period_finish(request.session), "body": []} -def build_report(date, dbsession): +@router.get("/{date}") +def report_data( + date: str, + request: Request, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["trial-balance"]), +): + session_period_set(session_period_start(request.session), date, request.session) + return {"date": date, "body": build_report(date, db)} + + +def build_report(date, db): date = datetime.datetime.strptime(date, "%d-%b-%Y") amount_sum = func.sum(Journal.amount * Journal.debit).label("amount") query = ( - dbsession.query(AccountBase, amount_sum) + db.query(AccountBase, amount_sum) .join(Journal.voucher) .join(Journal.account) .filter(Voucher.date <= date) diff --git a/brewman/routers/reports/unposted.py b/brewman/routers/reports/unposted.py index 51ba3050..8a6ddc95 100644 --- a/brewman/routers/reports/unposted.py +++ b/brewman/routers/reports/unposted.py @@ -1,23 +1,37 @@ -from sqlalchemy.orm import joinedload_all +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import joinedload_all, Session +from ...schemas.auth import UserToken +from ...core.security import get_current_active_user as get_user +from ...db.session import SessionLocal from brewman.models.voucher import Voucher, Journal, VoucherType -from brewman.routers.services.voucher import get_edit_url - -from fastapi import APIRouter router = APIRouter() -@router.get("/api/unposted") # "Post Vouchers" -def report_data(request): - return build_report(request) +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() -def build_report(request): +@router.get("") +def report_data( + request: Request, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["post-vouchers"]), +): + return build_report(db) + + +def build_report(db: Session): body = [] query = ( - request.dbsession.query(Voucher) + db.query(Voucher) .options(joinedload_all(Voucher.journals, Journal.account, innerjoin=True)) .filter(Voucher.posted == False) .filter(Voucher.type != VoucherType.by_name("Issue").id) @@ -44,7 +58,7 @@ def build_report(request): body.append( { "date": voucher.date.strftime("%d-%b-%Y"), - "Url": get_edit_url(voucher, request), + "Url": "", # get_edit_url(voucher, request), "voucherType": VoucherType.by_id(voucher.type).name, "narration": voucher.narration, "isPosted": voucher.posted, diff --git a/overlord/src/app/stock-movement/stock-movement.service.ts b/overlord/src/app/stock-movement/stock-movement.service.ts index c7a7ea40..c71db0bf 100644 --- a/overlord/src/app/stock-movement/stock-movement.service.ts +++ b/overlord/src/app/stock-movement/stock-movement.service.ts @@ -21,14 +21,9 @@ export class StockMovementService { } list(startDate: string, finishDate): Observable { - const options = {params: new HttpParams()}; - if (startDate !== null) { - options.params = options.params.set('s', startDate); - } - if (finishDate !== null) { - options.params = options.params.set('f', finishDate); - } - return >this.http.get(url, options) + startDate = startDate ? `/${startDate}` : ''; + finishDate = finishDate ? `/${finishDate}` : ''; + return >this.http.get(`${url}${startDate}${finishDate}`) .pipe( catchError(this.log.handleError(serviceName, 'list')) );