diff --git a/brewman/main.py b/brewman/main.py index d1ce3325..548f827d 100644 --- a/brewman/main.py +++ b/brewman/main.py @@ -18,7 +18,20 @@ from .routers import ( login, ) from .routers.auth import client, user, role -from .routers.reports import ledger, balance_sheet, profit_loss, closing_stock +from .routers.reports import ( + ledger, + balance_sheet, + profit_loss, + closing_stock, + cash_flow, + daybook, + net_transactions, + product_ledger, + purchase_entries, + purchases, + raw_material_cost, + reconcile, +) from .db.base_class import Base from .config import Settings as settings from .db.session import engine @@ -60,10 +73,19 @@ app.include_router(recipe.router, prefix="/api/recipes", tags=["products"]) app.include_router(client.router, prefix="/api/clients", tags=["clients"]) app.include_router(role.router, prefix="/api/roles", tags=["users"]) app.include_router(user.router, prefix="/api/users", tags=["users"]) + app.include_router(ledger.router, prefix="/api/ledger", tags=["reports"]) app.include_router(balance_sheet.router, prefix="/api/balance-sheet", tags=["reports"]) app.include_router(profit_loss.router, prefix="/api/profit-loss", tags=["reports"]) app.include_router(closing_stock.router, prefix="/api/closing-stock", tags=["reports"]) +app.include_router(cash_flow.router, prefix="/api/cash-flow", tags=["reports"]) +app.include_router(daybook.router, prefix="/api/daybook", tags=["reports"]) +app.include_router(net_transactions.router, prefix="/api/net-transactions", tags=["reports"]) +app.include_router(product_ledger.router, prefix="/api/product-ledger", tags=["reports"]) +app.include_router(purchase_entries.router, prefix="/api/purchase-entries", tags=["reports"]) +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"]) def init(): diff --git a/brewman/routers/reports/cash_flow.py b/brewman/routers/reports/cash_flow.py index 982ca211..92d3122b 100644 --- a/brewman/routers/reports/cash_flow.py +++ b/brewman/routers/reports/cash_flow.py @@ -1,8 +1,13 @@ import datetime +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import Session from sqlalchemy.orm.util import aliased from sqlalchemy.sql.expression import func, desc +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, AccountType from brewman.models.voucher import Voucher, Journal, VoucherType from brewman.routers.services.session import ( @@ -11,57 +16,75 @@ from brewman.routers.services.session import ( session_period_finish, ) -from fastapi import APIRouter - router = APIRouter() -@router.get("/api/cash-flow") # "Cash Flow" -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=["cash-flow"]), +): return { - "startDate": session_period_start(request), - "finishDate": session_period_finish(request), + "startDate": session_period_start(request.session), + "finishDate": session_period_finish(request.session), "body": [], "footer": {}, } -@router.get("/api/cash-flow", request_param=["s", "f"], permission="Cash Flow") -def report_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - body, footer = build_report(start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/data") +def report_data( + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["cash-flow"]), +): + body, footer = build_report(s, f, db) + session_period_set(s, f, request.session) return { - "startDate": start_date, - "finishDate": finish_date, + "startDate": s, + "finishDate": f, "body": body, "footer": footer, } -@router.get("/api/cash-flow/{id}", request_param=["s", "f"], permission="Cash Flow") -def get_cash_flow_id(request): - id_ = request.matchdict["id"] - start_date = request.GET["s"] - finish_date = request.GET["f"] - details, footer = build_report_id(int(id_), start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/{id_}") +def report_id( + id_: int, + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["cash-flow"]), +): + details, footer = build_report_id(id_, s, f, db) + session_period_set(s, f, request.session) return { - "startDate": start_date, - "finishDate": finish_date, + "startDate": s, + "finishDate": f, "body": {"details": details}, "footer": footer, } -def build_report(start_date, finish_date, request): +def build_report(start_date, finish_date, db): sub_voucher = aliased(Voucher) sub_journal = aliased(Journal) sub_account = aliased(AccountBase) sub_query = ( - request.dbsession.query(sub_voucher.id) + db.query(sub_voucher.id) .join(sub_journal, sub_voucher.journals) .join(sub_account, sub_journal.account) .filter(sub_account.type == AccountType.by_name("Cash").id) @@ -71,7 +94,7 @@ def build_report(start_date, finish_date, request): ) query = ( - request.dbsession.query(AccountBase.type, func.sum(Journal.signed_amount)) + db.query(AccountBase.type, func.sum(Journal.signed_amount)) .join(Journal, Voucher.journals) .join(AccountBase, Journal.account) .filter(Voucher.id.in_(sub_query)) @@ -89,17 +112,13 @@ def build_report(start_date, finish_date, request): cf[lt.cash_flow_classification.lower()].append( { "name": lt.name, - "url": request.route_url( - "cash_flow_id", - id=str(lt.id), - _query={"startDate": start_date, "finishDate": finish_date}, - ), + "url": "", # request.route_url("cash_flow_id", id=str(lt.id), _query={"startDate": start_date, "finishDate": finish_date},), "amount": amount * -1, } ) opening = ( - request.dbsession.query(func.sum(Journal.amount * Journal.debit)) + db.query(func.sum(Journal.amount * Journal.debit)) .join(Journal.voucher) .join(Journal.account) .filter(Voucher.date < start_date) @@ -109,7 +128,7 @@ def build_report(start_date, finish_date, request): ) closing = ( - request.dbsession.query(func.sum(Journal.amount * Journal.debit)) + db.query(func.sum(Journal.amount * Journal.debit)) .join(Journal.voucher) .join(Journal.account) .filter(Voucher.date <= finish_date) @@ -134,14 +153,14 @@ def build_report(start_date, finish_date, request): ) -def build_report_id(account_type, start_date, finish_date, request): +def build_report_id(account_type, start_date, finish_date, db): details = [] sub_voucher = aliased(Voucher) sub_journal = aliased(Journal) sub_account = aliased(AccountBase) sub_query = ( - request.dbsession.query(sub_voucher.id) + db.query(sub_voucher.id) .join(sub_journal, sub_voucher.journals) .join(sub_account, sub_journal.account) .filter(sub_account.type == AccountType.by_name("Cash").id) @@ -151,7 +170,7 @@ def build_report_id(account_type, start_date, finish_date, request): ) query = ( - request.dbsession.query(AccountBase, func.sum(Journal.signed_amount)) + db.query(AccountBase, func.sum(Journal.signed_amount)) .join(Journal, Voucher.journals) .join(AccountBase, Journal.account) .filter(Voucher.id.in_(sub_query)) @@ -167,11 +186,7 @@ def build_report_id(account_type, start_date, finish_date, request): details.append( { "name": account.name, - "url": request.route_url( - "ledger_id", - id=account.id, - _query={"startDate": start_date, "finishDate": finish_date}, - ), + "url": "", # request.route_url("ledger_id", id=account.id, _query={"startDate": start_date, "finishDate": finish_date},), "amount": amount * -1, } ) diff --git a/brewman/routers/reports/daybook.py b/brewman/routers/reports/daybook.py index 5203e96c..ea26f644 100644 --- a/brewman/routers/reports/daybook.py +++ b/brewman/routers/reports/daybook.py @@ -1,43 +1,60 @@ import datetime -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.session import ( session_period_set, session_period_start, session_period_finish, ) -from brewman.routers.services.voucher import get_edit_url - -from fastapi import APIRouter router = APIRouter() -@router.get("/api/daybook") # "Daybook" -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=["daybook"]), +): 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/daybook", request_param=["s", "f"], permission="Daybook") -def report_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - body = build_report(start_date, finish_date, request) - 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=["daybook"]), +): + body = build_report(start, finish, db) + session_period_set(start, finish, request.session) + return {"startDate": start, "finishDate": finish, "body": body} -def build_report(start_date, finish_date, request): +def build_report(start_date, finish_date, db): body = [] query = ( - request.dbsession.query(Voucher) + db.query(Voucher) .options(joinedload_all(Voucher.journals, Journal.account, innerjoin=True)) .filter(Voucher.date >= datetime.datetime.strptime(start_date, "%d-%b-%Y")) .filter(Voucher.date <= datetime.datetime.strptime(finish_date, "%d-%b-%Y")) @@ -66,7 +83,7 @@ def build_report(start_date, finish_date, request): { "id": voucher.id, "date": voucher.date.strftime("%d-%b-%Y"), - "url": get_edit_url(voucher, request), + "url": "", # get_edit_url(voucher, request), "type": VoucherType.by_id(voucher.type).name, "narration": voucher.narration, "posted": voucher.posted, diff --git a/brewman/routers/reports/ledger.py b/brewman/routers/reports/ledger.py index 09b33524..08bd08db 100644 --- a/brewman/routers/reports/ledger.py +++ b/brewman/routers/reports/ledger.py @@ -51,7 +51,6 @@ def show_data( user: UserToken = Security(get_user, scopes=["ledger"]), ): account = db.query(AccountBase).filter(AccountBase.id == id_).first() - start_date = s if s is not None else session_period_start(request.session) finish_date = f if f is not None else session_period_finish(request.session) body = build_report(account.id, start_date, finish_date, db) diff --git a/brewman/routers/reports/net_transactions.py b/brewman/routers/reports/net_transactions.py index 00b7ec6d..20bdb09a 100644 --- a/brewman/routers/reports/net_transactions.py +++ b/brewman/routers/reports/net_transactions.py @@ -1,8 +1,13 @@ import datetime + +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func, desc +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 ( session_period_set, @@ -10,33 +15,47 @@ from brewman.routers.services.session import ( session_period_finish, ) -from fastapi import APIRouter - router = APIRouter() -@router.get("/api/net-transactions") # "Net Transactions" -def show_blank(request): +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.get("") +def show_blank( + request: Request, + user: UserToken = Security(get_user, scopes=["net-transactions"]), +): 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/net-transactions", request_param=["s", "f"], permission="Net Transactions") -def show_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - session_period_set(start_date, finish_date, request) +@router.get("/{start}/{finish}") +def show_data( + start: str, + finish: str, + request: Request, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["net-transactions"]), +): + session_period_set(start, finish, request.session) return { - "startDate": start_date, - "finishDate": finish_date, - "body": build_report(start_date, finish_date, request.dbsession), + "startDate": start, + "finishDate": finish, + "body": build_report(start, finish, db), } -def build_report(start_date, finish_date, dbsession): +def build_report(start_date, finish_date, db): if not isinstance(start_date, datetime.datetime): start_date = datetime.datetime.strptime(start_date, "%d-%b-%Y") if not isinstance(finish_date, datetime.datetime): @@ -44,7 +63,7 @@ def build_report(start_date, finish_date, dbsession): 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 >= start_date) diff --git a/brewman/routers/reports/product_ledger.py b/brewman/routers/reports/product_ledger.py index 59d9d99a..7bbca967 100644 --- a/brewman/routers/reports/product_ledger.py +++ b/brewman/routers/reports/product_ledger.py @@ -1,43 +1,60 @@ import datetime +import uuid -from sqlalchemy.orm import joinedload +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import joinedload, 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.validation_exception import ValidationError from brewman.models.voucher import Voucher, Journal, VoucherType, Inventory -from brewman.routers import to_uuid from brewman.routers.services.session import ( session_period_set, session_period_start, session_period_finish, ) -from brewman.routers.services.voucher import get_edit_url -from fastapi import APIRouter router = APIRouter() -@router.get("/api/product-ledger") # "Product Ledger" -def show_blank(request): +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.get("") +def show_blank( + request: Request, + user: UserToken = Security(get_user, scopes=["product-ledger"]), +): return { - "startDate": session_period_start(request), - "finishDate": session_period_finish(request), + "startDate": session_period_start(request.session), + "finishDate": session_period_finish(request.session), "product": None, "body": [], } -@router.get("/api/product-ledger/{id}") # "Product Ledger" -def show_data(request): - id_ = to_uuid(request.matchdict["id"]) - if id_ is None: - raise ValidationError("Invalid Product") - product = request.dbsession.query(Product).filter(Product.id == id_).first() - start_date = request.GET.get("s", session_period_start(request)) - finish_date = request.GET.get("f", session_period_finish(request)) - body = build_report(product.id, start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/{id}") +def show_data( + id_: uuid.UUID, + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["product-ledger"]), +): + product = db.query(Product).filter(Product.id == id_).first() + start_date = s if s is not None else session_period_start(request.session) + finish_date = f if f is not None else session_period_finish(request.session) + body = build_report(product.id, start_date, finish_date, db) + session_period_set(start_date, finish_date, request.session) return { "startDate": start_date, "finishDate": finish_date, @@ -46,15 +63,15 @@ def show_data(request): } -def build_report(product_id, start_date, finish_date, request): +def build_report(product_id, start_date, finish_date, db): body = [] running_total_q, running_total_a, opening = opening_balance( - product_id, start_date, request.dbsession + product_id, start_date, db ) body.append(opening) query = ( - request.dbsession.query(Voucher, Inventory, Journal) + db.query(Voucher, Inventory, Journal) .options( joinedload(Journal.account, innerjoin=True), joinedload(Journal.cost_centre, innerjoin=True), @@ -90,7 +107,7 @@ def build_report(product_id, start_date, finish_date, request): "id": row.Voucher.id, "date": row.Voucher.date.strftime("%d-%b-%Y"), "name": name, - "url": get_edit_url(row.Voucher, request), + "url": "", # get_edit_url(row.Voucher, request), "type": VoucherType.by_id(row.Voucher.type).name, "narration": row.Voucher.narration, "posted": row.Voucher.posted @@ -107,9 +124,9 @@ def build_report(product_id, start_date, finish_date, request): return body -def opening_balance(product_id, start_date, dbsession): +def opening_balance(product_id, start_date, db): quantity, amount = ( - dbsession.query( + db.query( func.sum(Inventory.quantity * Journal.debit), func.sum(Inventory.amount * Journal.debit), ) diff --git a/brewman/routers/reports/profit_loss.py b/brewman/routers/reports/profit_loss.py index 7c46c602..a496392e 100644 --- a/brewman/routers/reports/profit_loss.py +++ b/brewman/routers/reports/profit_loss.py @@ -7,7 +7,6 @@ from sqlalchemy.sql.expression import func, desc 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 AccountType, AccountBase from brewman.models.voucher import Voucher, Journal, VoucherType from brewman.routers.reports.closing_stock import get_opening_stock, get_closing_stock diff --git a/brewman/routers/reports/purchase_entries.py b/brewman/routers/reports/purchase_entries.py index ea38db49..269629cb 100644 --- a/brewman/routers/reports/purchase_entries.py +++ b/brewman/routers/reports/purchase_entries.py @@ -1,42 +1,61 @@ import datetime +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import 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, VoucherType from brewman.routers.services.session import ( session_period_set, session_period_start, session_period_finish, ) -from brewman.routers.services.voucher import get_edit_url - -from fastapi import APIRouter router = APIRouter() -@router.get("/api/purchase-entries") # "Purchase Entries" -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=["purchase-entries"]), +): 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/purchase-entries", request_param=["s", "f"], permission="Purchase Entries") -def report_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - body = build_report(start_date, finish_date, request) - 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=["net-transactions"]), +): + body = build_report(start, finish, db) + session_period_set(start, finish, request.session) + return {"startDate": start, "finishDate": finish, "body": body} -def build_report(start_date, finish_date, request): +def build_report(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") body = [] query = ( - request.dbsession.query(Voucher) + db.query(Voucher) .filter(Voucher.date >= start_date) .filter(Voucher.date <= finish_date) .filter(Voucher.type == VoucherType.by_name("Purchase").id) @@ -51,7 +70,7 @@ def build_report(start_date, finish_date, request): row = { "date": voucher.date.strftime("%d-%b-%Y"), "supplier": journal.account.name, - "url": get_edit_url(voucher, request), + "url": "", # get_edit_url(voucher, request), "products": [], "product": item.product.full_name, "quantity": item.quantity, diff --git a/brewman/routers/reports/purchases.py b/brewman/routers/reports/purchases.py index b48295c9..c50c9fdd 100644 --- a/brewman/routers/reports/purchases.py +++ b/brewman/routers/reports/purchases.py @@ -1,7 +1,13 @@ import datetime +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func, desc +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 CostCentre, Product from brewman.models.voucher import Voucher, Journal, Inventory, VoucherType from brewman.routers.services.session import ( @@ -10,43 +16,57 @@ from brewman.routers.services.session import ( session_period_finish, ) -from fastapi import APIRouter - router = APIRouter() -@router.get("/api/purchases") # "Purchases" -def report_blank(request): +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.get("/api/purchases") +def report_blank( + request: Request, + user: UserToken = Security(get_user, scopes=["purchases"]), +): return { - "startDate": session_period_start(request), - "finishDate": session_period_finish(request), + "startDate": session_period_start(request.session), + "finishDate": session_period_finish(request.session), "body": [], "footer": {}, } -@router.get("/api/purchases", request_param=["s", "f"], permission="Purchases") -def report_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - body, footer = build_report(start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/{start}/{finish}") +def report_data( + start: str, + finish: str, + request: Request, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["purchases"]), +): + body, footer = build_report(start, finish, db) + session_period_set(start, finish, request.session) return { - "startDate": start_date, - "finishDate": finish_date, + "startDate": start, + "finishDate": finish, "body": body, "footer": footer, } -def build_report(start_date, finish_date, request): +def build_report(start_date, finish_date, db): body = [] quantity_sum = func.sum(Journal.debit * Inventory.quantity).label("quantity") amount_sum = func.sum( Journal.debit * Inventory.quantity * Inventory.rate * (1 + Inventory.tax) ).label("amount") query = ( - request.dbsession.query(Product, quantity_sum, amount_sum) + db.query(Product, quantity_sum, amount_sum) .join(Product.inventories) .join(Inventory.voucher) .join(Voucher.journals) @@ -68,11 +88,7 @@ def build_report(start_date, finish_date, request): "quantity": quantity, "rate": rate, "amount": amount, - "url": request.route_url( - "product_ledger_id", - id=product.id, - _query={"startDate": start_date, "finishDate": finish_date}, - ), + "url": "", # request.route_url("product_ledger_id", id=product.id, _query={"startDate": start_date, "finishDate": finish_date},), } body.append(row) return body, {"name": "Total", "amount": total_amount} diff --git a/brewman/routers/reports/raw_material_cost.py b/brewman/routers/reports/raw_material_cost.py index ff883b41..fdb96276 100644 --- a/brewman/routers/reports/raw_material_cost.py +++ b/brewman/routers/reports/raw_material_cost.py @@ -1,8 +1,13 @@ import datetime import uuid +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func, case +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, CostCentre, Product, ProductGroup from brewman.models.voucher import Voucher, Journal, Inventory from brewman.routers.services.session import ( @@ -11,51 +16,69 @@ from brewman.routers.services.session import ( session_period_finish, ) -from fastapi import APIRouter - router = APIRouter() -@router.get("/api/raw-material-cost") # "Raw Material Cost" -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=["raw-material-cost"]), +): return { - "startDate": session_period_start(request), - "finishDate": session_period_finish(request), + "startDate": session_period_start(request.session), + "finishDate": session_period_finish(request.session), "body": [], "footer": {}, } -@router.get("/api/raw-material-cost", request_param=["s", "f"], permission="Raw Material Cost") -def report_data(request): - start_date = request.GET["s"] - finish_date = request.GET["f"] - body, footer = build_report(start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/data") +def report_data( + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["raw-material-cost"]), +): + body, footer = build_report(s, f, db) + session_period_set(s, f, request.session) return { - "startDate": start_date, - "finishDate": finish_date, + "startDate": s, + "finishDate": f, "body": body, "footer": footer, } -@router.get("/api/raw-material-cost/{id}", request_param=["s", "f"], permission="Raw Material Cost") -def report_id(request): - id_ = request.matchdict["id"] - start_date = request.GET["s"] - finish_date = request.GET["f"] - body = build_report_id(uuid.UUID(id_), start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/{id_}") +def report_id( + id_: uuid.UUID, + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["raw-material-cost"]), +): + body = build_report_id(id_, s, f, db) + session_period_set(s, f, request.session) return { "id": id_, - "startDate": start_date, - "finishDate": finish_date, + "startDate": s, + "finishDate": f, "body": body, } -def build_report(start_date, finish_date, request): +def build_report(start_date, finish_date, db): body = [] sum_issue = func.sum( case([(AccountBase.type == 2, Journal.signed_amount)], else_=0) @@ -65,7 +88,7 @@ def build_report(start_date, finish_date, request): ).label("sale") query = ( - request.dbsession.query(CostCentre, sum_issue, sum_sale) + db.query(CostCentre, sum_issue, sum_sale) .join(CostCentre.journals) .join(Journal.voucher) .join(Journal.account) @@ -90,11 +113,7 @@ def build_report(start_date, finish_date, request): "issue": issue, "sale": sale, "rmc": rmc, - "url": request.route_url( - "raw_material_cost_id", - id=str(cost_centre.id), - _query={"startDate": start_date, "finishDate": finish_date}, - ), + "url": "", # request.route_url("raw_material_cost_id",id=str(cost_centre.id),_query={"startDate": start_date, "finishDate": finish_date},), } ) @@ -102,13 +121,13 @@ def build_report(start_date, finish_date, request): return body, {"name": "Total", "issue": issues, "sale": sales, "rmc": rmc} -def build_report_id(cost_centre_id, start_date, finish_date, request): +def build_report_id(cost_centre_id, start_date, finish_date, db): sum_quantity = func.sum(Inventory.quantity * Journal.debit).label("quantity") sum_net = func.sum(Inventory.rate * Inventory.quantity * Journal.debit).label("net") sum_gross = func.sum(Inventory.amount * Journal.debit).label("gross") query = ( - request.dbsession.query(Product, sum_quantity, sum_net, sum_gross) + db.query(Product, sum_quantity, sum_net, sum_gross) .join(Product.inventories) .join(Inventory.voucher) .join(Voucher.journals) diff --git a/brewman/routers/reports/reconcile.py b/brewman/routers/reports/reconcile.py index c00e3e7f..cba2430e 100644 --- a/brewman/routers/reports/reconcile.py +++ b/brewman/routers/reports/reconcile.py @@ -1,8 +1,14 @@ import datetime import uuid -from sqlalchemy.orm import joinedload_all + + +from fastapi import APIRouter, Depends, Security, Request +from sqlalchemy.orm import joinedload_all, Session from sqlalchemy.sql.expression import func, or_, and_ +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,34 +16,46 @@ from brewman.routers.services.session import ( session_period_start, session_period_finish, ) -from brewman.routers.services.voucher import get_edit_url - -from fastapi import APIRouter router = APIRouter() -@router.get("/api/reconcile") # "Reconcile" -def show_blank(request): +# Dependency +def get_db() -> Session: + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.get("") +def show_blank( + request: Request, + user: UserToken = Security(get_user, scopes=["reconcile"]), +): return { - "startDate": session_period_start(request), - "finishDate": session_period_finish(request), + "startDate": session_period_start(request.session), + "finishDate": session_period_finish(request.session), "account": None, "body": [], } -@router.get("/api/reconcile/{id}") # "Reconcile" -def show_data(request): - account = ( - request.dbsession.query(AccountBase) - .filter(AccountBase.id == uuid.UUID(request.matchdict["id"])) - .first() - ) - start_date = request.GET.get("s", session_period_start(request)) - finish_date = request.GET.get("f", session_period_finish(request)) - body = build_report(account.id, start_date, finish_date, request) - session_period_set(start_date, finish_date, request) +@router.get("/{id_}") +def show_data( + id_: uuid.UUID, + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["reconcile"]), +): + account = db.query(AccountBase).filter(AccountBase.id == id_).first() + start_date = s if s is not None else session_period_start(request.session) + finish_date = f if f is not None else session_period_finish(request.session) + body = build_report(account.id, start_date, finish_date, db) + session_period_set(start_date, finish_date, request.session) return { "startDate": start_date, "finishDate": finish_date, @@ -46,12 +64,12 @@ def show_data(request): } -def build_report(account_id, start_date, finish_date, request): - opening = opening_balance(account_id, start_date, request.dbsession) +def build_report(account_id, start_date, finish_date, db): + opening = opening_balance(account_id, start_date, db) body = [opening] query = ( - request.dbsession.query(Voucher) + db.query(Voucher) .options(joinedload_all(Voucher.journals, Journal.account, innerjoin=True)) .filter(Voucher.journals.any(Journal.account_id == account_id)) .filter( @@ -95,7 +113,7 @@ def build_report(account_id, start_date, finish_date, request): "id": voucher.id, "date": voucher.date.strftime("%d-%b-%Y"), "name": name, - "url": get_edit_url(voucher, request), + "url": "", # get_edit_url(voucher, request), "type": VoucherType.by_id(voucher.type).name, "narration": voucher.narration, "debit": debit, @@ -107,9 +125,9 @@ def build_report(account_id, start_date, finish_date, request): return body -def opening_balance(account_id, start_date, dbsession): +def opening_balance(account_id, start_date, db): opening = ( - dbsession.query(func.sum(Journal.amount * Journal.debit)) + db.query(func.sum(Journal.amount * Journal.debit)) .join(Journal.voucher) .filter( Voucher.reconcile_date < datetime.datetime.strptime(start_date, "%d-%b-%Y") @@ -140,33 +158,37 @@ def opening_balance(account_id, start_date, dbsession): } -@router.post("/api/reconcile/{id}") # "Reconcile" -def save(request): - account = ( - request.dbsession.query(AccountBase) - .filter(AccountBase.id == uuid.UUID(request.matchdict["id"])) - .first() - ) - start_date = request.GET.get("s", session_period_start(request)) - finish_date = request.GET.get("f", session_period_finish(request)) - for item in request.json_body["body"]: - if "id" not in item or item["id"] is None: - continue - - voucher = ( - request.dbsession.query(Voucher) - .filter(Voucher.id == uuid.UUID(item["id"])) - .first() - ) - is_reconciled = item["isReconciled"] - reconcile_date = datetime.datetime.strptime(item["reconcileDate"], "%d-%b-%Y") - voucher.is_reconciled = is_reconciled - voucher.reconcile_date = reconcile_date - transaction.commit() - body = build_report(account.id, start_date, finish_date, request) - return { - "startDate": start_date, - "finishDate": finish_date, - "account": {"id": account.id, "name": account.name}, - "body": body - } +@router.post("/{id_}") +def save( + id_: uuid.UUID, + request: Request, + s: str = None, + f: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["reconcile"]), +): + account = db.query(AccountBase).filter(AccountBase.id == id_).first() + start_date = s if s is not None else session_period_start(request.session) + finish_date = f if f is not None else session_period_finish(request.session) + raise Exception("not fixed") + # for item in request.json_body["body"]: + # if "id" not in item or item["id"] is None: + # continue + # + # voucher = ( + # request.dbsession.query(Voucher) + # .filter(Voucher.id == uuid.UUID(item["id"])) + # .first() + # ) + # is_reconciled = item["isReconciled"] + # reconcile_date = datetime.datetime.strptime(item["reconcileDate"], "%d-%b-%Y") + # voucher.is_reconciled = is_reconciled + # voucher.reconcile_date = reconcile_date + # transaction.commit() + # body = build_report(account.id, start_date, finish_date, request) + # return { + # "startDate": start_date, + # "finishDate": finish_date, + # "account": {"id": account.id, "name": account.name}, + # "body": body + # } diff --git a/overlord/src/app/cash-flow/cash-flow.service.ts b/overlord/src/app/cash-flow/cash-flow.service.ts index bfcf9504..6ba21e8e 100644 --- a/overlord/src/app/cash-flow/cash-flow.service.ts +++ b/overlord/src/app/cash-flow/cash-flow.service.ts @@ -21,7 +21,6 @@ export class CashFlowService { } list(id: string, startDate: string, finishDate: string): Observable<CashFlow> { - const listUrl = (id === null) ? url : `${url}/${id}`; const options = {params: new HttpParams()}; if (startDate !== null) { options.params = options.params.set('s', startDate); @@ -29,6 +28,7 @@ export class CashFlowService { if (finishDate !== null) { options.params = options.params.set('f', finishDate); } + const listUrl = (id === null) ? ( (startDate || finishDate) ? `${url}/data` : url) : `${url}/${id}`; return <Observable<CashFlow>>this.http.get<CashFlow>(listUrl, options) .pipe( catchError(this.log.handleError(serviceName, 'list')) diff --git a/overlord/src/app/daybook/daybook.service.ts b/overlord/src/app/daybook/daybook.service.ts index f840ad95..1172ffae 100644 --- a/overlord/src/app/daybook/daybook.service.ts +++ b/overlord/src/app/daybook/daybook.service.ts @@ -21,14 +21,9 @@ export class DaybookService { } list(startDate: string, finishDate): Observable<Daybook> { - 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 <Observable<Daybook>>this.http.get<Daybook>(url, options) + startDate = startDate ? `/${startDate}` : ''; + finishDate = finishDate ? `/${finishDate}` : ''; + return <Observable<Daybook>>this.http.get<Daybook>(`${url}${startDate}${finishDate}`) .pipe( catchError(this.log.handleError(serviceName, 'list')) ); diff --git a/overlord/src/app/net-transactions/net-transactions.service.ts b/overlord/src/app/net-transactions/net-transactions.service.ts index c80b527a..67c400c1 100644 --- a/overlord/src/app/net-transactions/net-transactions.service.ts +++ b/overlord/src/app/net-transactions/net-transactions.service.ts @@ -21,14 +21,9 @@ export class NetTransactionsService { } list(startDate: string, finishDate): Observable<NetTransactions> { - 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 <Observable<NetTransactions>>this.http.get<NetTransactions>(url, options) + startDate = startDate ? `/${startDate}` : ''; + finishDate = finishDate ? `/${finishDate}` : ''; + return <Observable<NetTransactions>>this.http.get<NetTransactions>(`${url}${startDate}${finishDate}`) .pipe( catchError(this.log.handleError(serviceName, 'list')) ); diff --git a/overlord/src/app/purchase-entries/purchase-entries.service.ts b/overlord/src/app/purchase-entries/purchase-entries.service.ts index 96ae7ee5..ec7057bf 100644 --- a/overlord/src/app/purchase-entries/purchase-entries.service.ts +++ b/overlord/src/app/purchase-entries/purchase-entries.service.ts @@ -21,14 +21,9 @@ export class PurchaseEntriesService { } list(startDate: string, finishDate): Observable<PurchaseEntries> { - 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 <Observable<PurchaseEntries>>this.http.get<PurchaseEntries>(url, options) + startDate = startDate ? `/${startDate}` : ''; + finishDate = finishDate ? `/${finishDate}` : ''; + return <Observable<PurchaseEntries>>this.http.get<PurchaseEntries>(`${url}${startDate}${finishDate}`) .pipe( catchError(this.log.handleError(serviceName, 'list')) ); diff --git a/overlord/src/app/purchases/purchases.service.ts b/overlord/src/app/purchases/purchases.service.ts index 84271d94..41e348a7 100644 --- a/overlord/src/app/purchases/purchases.service.ts +++ b/overlord/src/app/purchases/purchases.service.ts @@ -21,14 +21,9 @@ export class PurchasesService { } list(startDate: string, finishDate): Observable<Purchases> { - 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 <Observable<Purchases>>this.http.get<Purchases>(url, options) + startDate = startDate ? `/${startDate}` : ''; + finishDate = finishDate ? `/${finishDate}` : ''; + return <Observable<Purchases>>this.http.get<Purchases>(`${url}${startDate}${finishDate}`) .pipe( catchError(this.log.handleError(serviceName, 'list')) );