208 lines
8.9 KiB
Python
208 lines
8.9 KiB
Python
"""
|
|
Schema Models برای اسناد حسابداری (Documents)
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Optional, List, Any, Dict
|
|
from decimal import Decimal
|
|
from datetime import date, datetime
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class DocumentListFilters(BaseModel):
|
|
"""فیلترهای لیست اسناد"""
|
|
document_type: Optional[str] = Field(default=None, description="نوع سند")
|
|
fiscal_year_id: Optional[int] = Field(default=None, description="شناسه سال مالی")
|
|
from_date: Optional[str] = Field(default=None, description="از تاریخ (ISO format)")
|
|
to_date: Optional[str] = Field(default=None, description="تا تاریخ (ISO format)")
|
|
currency_id: Optional[int] = Field(default=None, description="شناسه ارز")
|
|
is_proforma: Optional[bool] = Field(default=None, description="پیشفاکتور یا قطعی")
|
|
search: Optional[str] = Field(default=None, description="جستجو در کد سند و توضیحات")
|
|
sort_by: Optional[str] = Field(default="document_date", description="فیلد مرتبسازی")
|
|
sort_desc: bool = Field(default=True, description="ترتیب نزولی")
|
|
take: int = Field(default=50, ge=1, le=1000, description="تعداد رکورد")
|
|
skip: int = Field(default=0, ge=0, description="تعداد رکورد صرفنظر شده")
|
|
|
|
|
|
class DocumentLineResponse(BaseModel):
|
|
"""پاسخ خط سند"""
|
|
id: int
|
|
document_id: int
|
|
account_id: Optional[int] = None
|
|
person_id: Optional[int] = None
|
|
product_id: Optional[int] = None
|
|
bank_account_id: Optional[int] = None
|
|
cash_register_id: Optional[int] = None
|
|
petty_cash_id: Optional[int] = None
|
|
check_id: Optional[int] = None
|
|
quantity: Optional[float] = None
|
|
debit: float
|
|
credit: float
|
|
description: Optional[str] = None
|
|
extra_info: Optional[Dict[str, Any]] = None
|
|
|
|
# اطلاعات مرتبط
|
|
account_code: Optional[str] = None
|
|
account_name: Optional[str] = None
|
|
person_name: Optional[str] = None
|
|
product_name: Optional[str] = None
|
|
bank_account_name: Optional[str] = None
|
|
cash_register_name: Optional[str] = None
|
|
petty_cash_name: Optional[str] = None
|
|
check_number: Optional[str] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DocumentSummaryResponse(BaseModel):
|
|
"""پاسخ خلاصه سند (برای لیست)"""
|
|
id: int
|
|
code: str
|
|
business_id: int
|
|
fiscal_year_id: int
|
|
currency_id: int
|
|
created_by_user_id: int
|
|
registered_at: datetime
|
|
document_date: date
|
|
document_type: str
|
|
is_proforma: bool
|
|
description: Optional[str] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
# اطلاعات مرتبط
|
|
business_title: Optional[str] = None
|
|
fiscal_year_title: Optional[str] = None
|
|
currency_code: Optional[str] = None
|
|
currency_symbol: Optional[str] = None
|
|
created_by_name: Optional[str] = None
|
|
|
|
# محاسبات
|
|
total_debit: float
|
|
total_credit: float
|
|
lines_count: int
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DocumentDetailResponse(BaseModel):
|
|
"""پاسخ جزئیات کامل سند (با سطرها)"""
|
|
id: int
|
|
code: str
|
|
business_id: int
|
|
fiscal_year_id: int
|
|
currency_id: int
|
|
created_by_user_id: int
|
|
registered_at: datetime
|
|
document_date: date
|
|
document_type: str
|
|
is_proforma: bool
|
|
description: Optional[str] = None
|
|
extra_info: Optional[Dict[str, Any]] = None
|
|
developer_settings: Optional[Dict[str, Any]] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
# اطلاعات مرتبط
|
|
business_title: Optional[str] = None
|
|
fiscal_year_title: Optional[str] = None
|
|
currency_code: Optional[str] = None
|
|
currency_symbol: Optional[str] = None
|
|
created_by_name: Optional[str] = None
|
|
|
|
# سطرهای سند
|
|
lines: List[DocumentLineResponse]
|
|
|
|
# محاسبات
|
|
total_debit: float
|
|
total_credit: float
|
|
lines_count: int
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class DocumentDeleteResponse(BaseModel):
|
|
"""پاسخ حذف سند"""
|
|
deleted: bool
|
|
document_id: int
|
|
|
|
|
|
class BulkDeleteRequest(BaseModel):
|
|
"""درخواست حذف گروهی"""
|
|
document_ids: List[int] = Field(..., description="لیست شناسههای سند")
|
|
|
|
|
|
class BulkDeleteResponse(BaseModel):
|
|
"""پاسخ حذف گروهی"""
|
|
deleted_count: int
|
|
total_requested: int
|
|
errors: List[Dict[str, Any]]
|
|
skipped_auto_documents: List[Dict[str, Any]]
|
|
|
|
|
|
class DocumentTypesSummaryResponse(BaseModel):
|
|
"""پاسخ خلاصه آماری انواع اسناد"""
|
|
summary: Dict[str, int]
|
|
total: int
|
|
|
|
|
|
class DocumentLineCreate(BaseModel):
|
|
"""درخواست ایجاد یک سطر سند"""
|
|
account_id: int = Field(..., description="شناسه حساب (الزامی)")
|
|
person_id: Optional[int] = Field(default=None, description="شناسه شخص (تفضیل)")
|
|
product_id: Optional[int] = Field(default=None, description="شناسه کالا (تفضیل)")
|
|
bank_account_id: Optional[int] = Field(default=None, description="شناسه حساب بانکی (تفضیل)")
|
|
cash_register_id: Optional[int] = Field(default=None, description="شناسه صندوق (تفضیل)")
|
|
petty_cash_id: Optional[int] = Field(default=None, description="شناسه تنخواه (تفضیل)")
|
|
check_id: Optional[int] = Field(default=None, description="شناسه چک (تفضیل)")
|
|
quantity: Optional[float] = Field(default=None, description="مقدار/تعداد")
|
|
debit: float = Field(default=0, ge=0, description="بدهکار")
|
|
credit: float = Field(default=0, ge=0, description="بستانکار")
|
|
description: Optional[str] = Field(default=None, max_length=500, description="توضیحات سطر")
|
|
extra_info: Optional[Dict[str, Any]] = Field(default=None, description="اطلاعات اضافی")
|
|
|
|
|
|
class DocumentLineUpdate(BaseModel):
|
|
"""درخواست ویرایش یک سطر سند"""
|
|
id: Optional[int] = Field(default=None, description="شناسه سطر (برای ویرایش)")
|
|
account_id: int = Field(..., description="شناسه حساب (الزامی)")
|
|
person_id: Optional[int] = Field(default=None, description="شناسه شخص (تفضیل)")
|
|
product_id: Optional[int] = Field(default=None, description="شناسه کالا (تفضیل)")
|
|
bank_account_id: Optional[int] = Field(default=None, description="شناسه حساب بانکی (تفضیل)")
|
|
cash_register_id: Optional[int] = Field(default=None, description="شناسه صندوق (تفضیل)")
|
|
petty_cash_id: Optional[int] = Field(default=None, description="شناسه تنخواه (تفضیل)")
|
|
check_id: Optional[int] = Field(default=None, description="شناسه چک (تفضیل)")
|
|
quantity: Optional[float] = Field(default=None, description="مقدار/تعداد")
|
|
debit: float = Field(default=0, ge=0, description="بدهکار")
|
|
credit: float = Field(default=0, ge=0, description="بستانکار")
|
|
description: Optional[str] = Field(default=None, max_length=500, description="توضیحات سطر")
|
|
extra_info: Optional[Dict[str, Any]] = Field(default=None, description="اطلاعات اضافی")
|
|
|
|
|
|
class CreateManualDocumentRequest(BaseModel):
|
|
"""درخواست ایجاد سند حسابداری دستی"""
|
|
code: Optional[str] = Field(default=None, max_length=50, description="کد سند (اختیاری - خودکار)")
|
|
document_date: date = Field(..., description="تاریخ سند")
|
|
fiscal_year_id: Optional[int] = Field(default=None, description="شناسه سال مالی (اختیاری - از header)")
|
|
currency_id: int = Field(..., description="شناسه ارز")
|
|
is_proforma: bool = Field(default=False, description="پیشفاکتور یا قطعی")
|
|
description: Optional[str] = Field(default=None, max_length=1000, description="توضیحات سند")
|
|
lines: List[DocumentLineCreate] = Field(..., min_items=2, description="سطرهای سند (حداقل 2)")
|
|
extra_info: Optional[Dict[str, Any]] = Field(default=None, description="اطلاعات اضافی")
|
|
|
|
|
|
class UpdateManualDocumentRequest(BaseModel):
|
|
"""درخواست ویرایش سند حسابداری دستی"""
|
|
code: Optional[str] = Field(default=None, max_length=50, description="کد سند")
|
|
document_date: Optional[date] = Field(default=None, description="تاریخ سند")
|
|
currency_id: Optional[int] = Field(default=None, description="شناسه ارز")
|
|
is_proforma: Optional[bool] = Field(default=None, description="پیشفاکتور یا قطعی")
|
|
description: Optional[str] = Field(default=None, max_length=1000, description="توضیحات سند")
|
|
lines: Optional[List[DocumentLineUpdate]] = Field(default=None, min_items=2, description="سطرهای سند")
|
|
extra_info: Optional[Dict[str, Any]] = Field(default=None, description="اطلاعات اضافی")
|
|
|