Files
brewman/brewman/brewman/main.py
T
tanshu fc3cd00662 Feature: Added sale voucher to check sale import.
Chore: Frontend moved from Moment to date-fns and from dd-MMM-yyyy to ISO Date format.
2026-09-15 11:29:27 +00:00

184 lines
7.7 KiB
Python

import logging
import uvicorn
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from sqlalchemy.exc import IntegrityError, SQLAlchemyError
from starlette.middleware.sessions import SessionMiddleware
from .core.config import settings
from .db.base import reg # noqa: F401
from .db.friendly_db_error import constraint_to_friendly
from .routers import (
account,
account_types,
attendance,
attendance_report,
attendance_types,
batch,
batch_integrity,
client,
cost_centre,
credit_salary,
db_image,
db_integrity,
employee,
employee_attendance,
employee_benefit,
fingerprint,
fingerprint_report,
health,
incentive,
issue,
issue_grid,
journal,
lock_information,
login,
maintenance,
period,
product,
product_group,
purchase,
purchase_return,
rate_contract,
rebase,
recipe,
role,
sale,
sales_import,
tag,
temporal_product,
title,
transaction_import,
user,
voucher,
voucher_types,
)
from .routers.reports import (
balance_sheet,
cash_flow,
closing_stock,
daybook,
entries,
ledger,
mozimo_daily_register,
mozimo_product_register,
net_transactions,
non_contract_purchase,
product_ledger,
profit_loss,
purchase_entries,
purchases,
raw_material_cost,
reconcile,
stock_movement,
trial_balance,
)
logger = logging.getLogger(__name__)
app = FastAPI()
@app.exception_handler(SQLAlchemyError)
async def sqlalchemy_error_handler(_request: Request, exc: SQLAlchemyError) -> JSONResponse:
logger.exception("Database error", exc_info=exc) # log full details server-side
return JSONResponse(
status_code=500,
content={
"detail": "Database error\n" + str(exc),
"code": "DB_ERROR",
},
)
@app.exception_handler(IntegrityError)
async def integrity_error_handler(_request: Request, exc: IntegrityError) -> JSONResponse:
logger.exception("Integrity error", exc_info=exc) # log full details server-side
err = constraint_to_friendly(exc)
return JSONResponse(
status_code=err.status,
content={"detail": err.detail, "code": err.code, "constraint": err.constraint},
)
app.add_middleware(SessionMiddleware, secret_key=settings.MIDDLEWARE_SECRET_KEY)
app.include_router(db_image.router, prefix="/db-image", tags=["db-image"])
app.include_router(login.router, tags=["login"])
app.include_router(account.router, prefix="/api/accounts", tags=["accounts"])
app.include_router(account_types.router, prefix="/api/account-types", tags=["accounts"])
app.include_router(voucher_types.router, prefix="/api/voucher-types", tags=["accounts"])
app.include_router(attendance.router, prefix="/api/attendance", tags=["attendance"])
app.include_router(attendance_types.router, prefix="/api/attendance-types", tags=["attendance"])
app.include_router(employee_attendance.router, prefix="/api/employee-attendance", tags=["attendance"])
app.include_router(employee_attendance.router, prefix="/api/employee-attendance", tags=["attendance"])
app.include_router(attendance_report.router, prefix="/attendance-report", tags=["attendance"])
app.include_router(fingerprint_report.router, prefix="/fingerprint-report", tags=["attendance"])
app.include_router(rate_contract.router, prefix="/api/rate-contracts", tags=["products"])
app.include_router(cost_centre.router, prefix="/api/cost-centres", tags=["cost-centres"])
app.include_router(tag.router, prefix="/api/tags", tags=["tags"])
app.include_router(employee.router, prefix="/api/employees", tags=["employees"])
app.include_router(fingerprint.router, prefix="/api/fingerprint", tags=["employees"])
app.include_router(product.router, prefix="/api/products", tags=["products"])
app.include_router(temporal_product.router, prefix="/api/temporal-products", tags=["products"])
app.include_router(product_group.router, prefix="/api/product-groups", tags=["products"])
app.include_router(recipe.router, prefix="/api/recipes", tags=["products"])
app.include_router(period.router, prefix="/api/periods", tags=["periods"])
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"])
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(entries.router, prefix="/api/entries", tags=["reports"])
app.include_router(batch_integrity.router, prefix="/api/batch-integrity", tags=["reports"])
app.include_router(non_contract_purchase.router, prefix="/api/non-contract-purchase", tags=["reports"])
app.include_router(mozimo_daily_register.router, prefix="/api/mozimo-daily-register", tags=["mozimo"])
app.include_router(mozimo_product_register.router, prefix="/api/mozimo-product-register", tags=["mozimo"])
app.include_router(issue_grid.router, prefix="/api/issue-grid", tags=["vouchers"])
app.include_router(batch.router, prefix="/api/batch", tags=["vouchers"])
app.include_router(journal.router, prefix="/api/journal", tags=["vouchers"])
app.include_router(journal.router, prefix="/api/payment", tags=["vouchers"])
app.include_router(journal.router, prefix="/api/receipt", tags=["vouchers"])
app.include_router(purchase.router, prefix="/api/purchase", tags=["vouchers"])
app.include_router(purchase_return.router, prefix="/api/purchase-return", tags=["vouchers"])
app.include_router(issue.router, prefix="/api/issue", tags=["vouchers"])
app.include_router(employee_benefit.router, prefix="/api/employee-benefit", tags=["vouchers"])
app.include_router(incentive.router, prefix="/api/incentive", tags=["vouchers"])
app.include_router(credit_salary.router, prefix="/api/credit-salary", tags=["vouchers"])
app.include_router(voucher.router, prefix="/api", tags=["vouchers"])
app.include_router(transaction_import.router, prefix="/api/transaction-import", tags=["vouchers"])
app.include_router(sales_import.router, prefix="/api/sales-import", tags=["vouchers"])
app.include_router(sale.router, prefix="/api/sale", tags=["vouchers"])
app.include_router(lock_information.router, prefix="/api/lock-information", tags=["settings"])
app.include_router(maintenance.router, prefix="/api/maintenance", tags=["settings"])
app.include_router(db_integrity.router, prefix="/api/db-integrity", tags=["management"])
app.include_router(rebase.router, prefix="/api/rebase", tags=["management"])
app.include_router(title.router, prefix="/api/title")
app.include_router(health.router, prefix="/health", tags=["health"])
app.frontend("/", directory="frontend", check_dir=False)
def init() -> None:
uvicorn.run(app, host=settings.HOST, port=settings.PORT)