Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/adapters/api/v1/opening_balance.py

171 lines
7.5 KiB
Python
Executable file

from __future__ import annotations
from typing import Any, Dict, Optional
from fastapi import APIRouter, Depends, Body, Request, Query
from sqlalchemy.orm import Session
from adapters.db.session import get_db
from app.core.auth_dependency import get_current_user, AuthContext
from app.core.permissions import require_business_management_dep, require_business_permission_dep
from app.core.responses import success_response, format_datetime_fields
from app.services.opening_balance_service import (
get_opening_balance,
upsert_opening_balance,
post_opening_balance,
preview_opening_balance,
unpost_opening_balance,
)
from app.services.person_opening_balance_service import get_person_opening_balance_eligibility
from app.services.product_opening_balance_service import get_product_opening_balance_eligibility
from app.core.permissions import has_business_permission_for_business
router = APIRouter(tags=["opening_balance"], prefix="")
@router.get(
"/businesses/{business_id}/opening-balance",
summary="دریافت تراز افتتاحیه",
description="خواندن سند تراز افتتاحیه برای سال مالی مشخص (یا سال جاری در صورت عدم ارسال)",
)
async def get_opening_balance_endpoint(
request: Request,
business_id: int,
fiscal_year_id: Optional[int] = None,
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "view")),
):
result = get_opening_balance(db, business_id, fiscal_year_id)
return success_response(data=format_datetime_fields(result, request), request=request, message="OPENING_BALANCE_FETCHED")
@router.get(
"/businesses/{business_id}/opening-balance/person-line-eligibility",
summary="وضعیت ثبت مانده افتتاحیه شخص",
description="بررسی امکان نمایش/ثبت مانده افتتاحیه در فرم افزودن شخص",
)
async def get_person_opening_balance_eligibility_endpoint(
request: Request,
business_id: int,
fiscal_year_id: Optional[int] = Query(None, description="شناسه سال مالی (در غیر این صورت سال جاری)"),
person_id: Optional[int] = Query(None, description="شناسه شخص (برای فرم ویرایش)"),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "view")),
):
can_edit = has_business_permission_for_business(ctx, db, business_id, "opening_balance", "edit")
result = get_person_opening_balance_eligibility(
db,
business_id,
fiscal_year_id,
can_edit_opening_balance=can_edit,
person_id=person_id,
)
return success_response(
data=format_datetime_fields(result, request),
request=request,
message="PERSON_OPENING_BALANCE_ELIGIBILITY",
)
@router.get(
"/businesses/{business_id}/opening-balance/product-line-eligibility",
summary="وضعیت ثبت تعداد اولیه کالا",
description="بررسی امکان نمایش/ثبت تعداد اولیه در فرم افزودن یا ویرایش کالا",
)
async def get_product_opening_balance_eligibility_endpoint(
request: Request,
business_id: int,
fiscal_year_id: Optional[int] = Query(None, description="شناسه سال مالی (در غیر این صورت سال جاری)"),
product_id: Optional[int] = Query(None, description="شناسه کالا (برای فرم ویرایش)"),
warehouse_id: Optional[int] = Query(None, description="شناسه انبار (برای یافتن خط موجود)"),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "view")),
):
can_edit = has_business_permission_for_business(ctx, db, business_id, "opening_balance", "edit")
result = get_product_opening_balance_eligibility(
db,
business_id,
fiscal_year_id,
can_edit_opening_balance=can_edit,
product_id=product_id,
warehouse_id=warehouse_id,
)
return success_response(
data=format_datetime_fields(result, request),
request=request,
message="PRODUCT_OPENING_BALANCE_ELIGIBILITY",
)
@router.put(
"/businesses/{business_id}/opening-balance",
summary="ذخیره/به‌روزرسانی تراز افتتاحیه",
description="ایجاد یا بروزرسانی سند تراز افتتاحیه برای سال مالی مشخص",
)
async def upsert_opening_balance_endpoint(
request: Request,
business_id: int,
body: Dict[str, Any] = Body(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "edit")),
):
created = upsert_opening_balance(db, business_id, ctx.get_user_id(), body)
return success_response(data=format_datetime_fields(created, request), request=request, message="OPENING_BALANCE_SAVED")
@router.post(
"/businesses/{business_id}/opening-balance/preview",
summary="پیش‌نمایش تراز افتتاحیه",
description="پیش‌نمایش تراز افتتاحیه بدون ذخیره",
)
async def preview_opening_balance_endpoint(
request: Request,
business_id: int,
body: Dict[str, Any] = Body(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "edit")),
):
preview = preview_opening_balance(db, business_id, body)
return success_response(data=format_datetime_fields(preview, request), request=request, message="OPENING_BALANCE_PREVIEWED")
@router.post(
"/businesses/{business_id}/opening-balance/post",
summary="نهایی‌سازی تراز افتتاحیه",
description="قفل کردن و علامت‌گذاری سند تراز افتتاحیه به عنوان نهایی",
)
async def post_opening_balance_endpoint(
request: Request,
business_id: int,
fiscal_year_id: Optional[int] = Query(None, description="شناسه سال مالی (در غیر این صورت سال جاری)"),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "edit")),
):
posted = post_opening_balance(db, business_id, ctx.get_user_id(), fiscal_year_id)
return success_response(data=format_datetime_fields(posted, request), request=request, message="OPENING_BALANCE_POSTED")
@router.post(
"/businesses/{business_id}/opening-balance/unpost",
summary="لغو نهایی‌سازی تراز افتتاحیه",
description="فقط در صورتی مجاز است که در همان سال مالی به‌جز سند افتتاحیه، سند دیگری ثبت نشده باشد",
)
async def unpost_opening_balance_endpoint(
request: Request,
business_id: int,
fiscal_year_id: Optional[int] = Query(None, description="شناسه سال مالی (در غیر این صورت سال جاری)"),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
_: None = Depends(require_business_permission_dep("opening_balance", "edit")),
):
data = unpost_opening_balance(db, business_id, ctx.get_user_id(), fiscal_year_id, request=request)
return success_response(data=format_datetime_fields(data, request), request=request, message="OPENING_BALANCE_UNPOSTED")