import datetime import uuid import pydantic from pydantic import Field from typing import Optional, List, Literal from core.models.base import BaseModel class UpdateSts(pydantic.BaseModel): sts: Literal[1, 2, 3, 4,5] = Field(description=""" """) reason_stop: Optional[str] = Field(description="دلیل موقف کردن پروژه در این فیلد قرار می گیرد") class Budget(pydantic.BaseModel): year:str=Field("سال بودجه") amount:int=Field("مبلغ بودجه") class BaseMonitor(pydantic.BaseModel): type:int = Field(description=""" 1.عالیه 2. عالیه وکارگاه 3.یکپارچه """) date_delivery_land:Optional[datetime.datetime] =Field(description=" تاریخ تحویل زمین") date_building_permit:Optional[datetime.datetime] = Field(description=" تاریخ صدور پروانه ساختمانی") date_expire_permit:Optional[datetime.datetime] = Field(description="تاریخ پایان اعتبار پروانه ساختمانی") budget:Optional[List[Budget]] class AddTFPercent(pydantic.BaseModel): amount:int = Field(description="مبلغ") percent:int = Field(description="درصد") date:datetime.datetime = Field(description="تاریخ ابلاغ") class Adding(pydantic.BaseModel): row:int = Field(description="ردیف") amount:int = Field(description="مبلغ") date:datetime.datetime = Field(description="تاریخ الحاقیه") class DetailMonitor(pydantic.BaseModel): type:Optional[int] = Field(description=""" 1.فهرست بهایی 2.سرجمع 3.سایر """) date_create_project:Optional[datetime.datetime] = Field(description="تاریخ شروع پروژه") date_end_project:Optional[datetime.datetime] = Field(description="تاریخ پایان پروژه") date_legal_project:Optional[datetime.datetime] = Field(description="آخرین تاریخ مجاز") first_time:Optional[int] = Field(description="مدت اولیه پیمان") extend_time:Optional[int] = Field(description="میزان تمدید پیمان") date_estimate_complete :Optional[datetime.datetime] = Field(description="تاریخ پیش بینی اتمام") first_amount:Optional[int] = Field(description="مبلغ اولیه پیمان") base_amount_year:Optional[str] = Field(description="فهرست بهای پایه") add_25_percent:Optional[List[AddTFPercent]] = Field(description="افزایش تا 25 درصد پیمان") adding:Optional[List[Adding]] = Field(description="الحاقیه") class AgentMonitor(pydantic.BaseModel): workshop_consultant: Optional[str] = Field(description=" نام مشاور نظارت کارگاهی") designer:Optional[str] = Field(description="نام مشاور طراح") designer_phone:Optional[str] = Field(description="شماره تماس مشاور طراح") constractor:Optional[str] = Field(description=" نام پیمانکار") constractor_phone:Optional[str] = Field(description="شماره تماس پیمانکار") supervisor:Optional[str] = Field(description="نام سرناظر") supervisor_phone:Optional[str] = Field(description=" شماره تماس سر ناظر") supervisor_building:Optional[str] = Field(description="نام ناظر ابنیه") supervisor_building_phone:Optional[str] = Field(description=" شماره تماس ابنیه") supervisor_mechanic:Optional[str] = Field(description="نام ناظر مکانیک") supervisor_mechanic_phone:Optional[str] = Field(description=" شماره تماس مکانیک") supervisor_electricity:Optional[str] = Field(description=" نام ناظر برق") supervisor_electricity_phone:Optional[str] = Field(description=" شماره تماس ناظر برق") project_manager:Optional[str] = Field(description=" نام مدیر پروژه") project_manager_phone:Optional[str] = Field(description="شماره تماس مدیر پروژه") supervisor_workshop:Optional[str] = Field(description=" نام سرپرست کارگاه") supervisor_workshop_phone:Optional[str] = Field(description="شماره تماس سرپرست کارگاه") class StatusBranch(pydantic.BaseModel): electricity:bool = Field(description="برق") water:bool = Field(description="آب") wastewater:bool = Field(description="فاضلاب") gas:bool = Field(description="گاز") phone:bool = Field(description="تلفن و فیبر نوری") class Monitor(pydantic.BaseModel): code: Optional[str] = Field(description='کد در این فیلد قرار می گیرد') base_information:Optional[BaseMonitor] = Field(description="اطلاعات پایه") detail:Optional[DetailMonitor] = Field(description="مشخصات پیمان") agent:Optional[AgentMonitor] = Field(description="عوامل پروژه") status_branch:Optional[StatusBranch] = Field(description="وضعیت انشعابات") has_design:bool=Field(default=True,description='آیا این پروژه طراحی دارد؟') sts: Optional[Literal[1, 2, 3, 4, 5]] = Field(default=1, description=""" 1.شروع نشده 2.جاری 3.متوقف 4.تحویل موقت 5.خاتمه یافته """) reason_sts: Optional[str] = Field(description="دلیل موقف کردن پروژه در این فیلد قرار می گیرد") class Design(pydantic.BaseModel): code: Optional[str] = Field(description='کد در این فیلد قرار می گیرد') title: str = Field(description='عنوان در این فیلد قرار می گیرد') state: str = Field(description='استان در این فیلد قرار می گیرد') city: str = Field(description='شهر در این فیلد قرار می گیرد') nature_id: int = Field(description='کد شناسایی ماهبت در این فیلد قرار می گیرد') nature: str = Field(description='ماهبت در این فیلد قرار می گیرد') type_id: int = Field(description='کد شناسایی نوع پروژه در این فیلد قرار می گیرد') type: str = Field(description='نوع پروژه در این فیلد قرار می گیرد') budget_id: int = Field(description='کد شناسایی دسته بودچه در این فیلد قرار می گیرد') budget: str = Field(description='دسته بودجه در این فیلد قرار می گیرد') date_send: Optional[datetime.datetime] = Field(description='تاریخ ابالغ/ارجاع') letter: Optional[str] = Field(description='شماره نامه') land_area:Optional[str] = Field(description="مساحت زمین") building_infrastructure:Optional[int] = Field(description="زیربنای ساختمان") site_area:Optional[str] = Field(description="مساحت محوطه") designer:Optional[List[str]] = Field(description="نام طراح") status_agreement:Optional[str] = Field(description="وضعیت موافقتنامه") description:Optional[str] = Field(description="توضیحات") sts:Optional[Literal[1,2,3,4]] = Field(default=1,description=""" 1.شروع نشده 2.جاری 3.متوقف 4.خاتمه یافته """) reason_stop : Optional[str] = Field(description="دلیل موقف کردن پروژه در این فیلد قرار می گیرد") class ProjectModel(BaseModel): id: Optional[uuid.UUID] = Field(alias='_id') user_id: Optional[int] = Field(description='کد شناسایی کاربر در این فیلد قرار می گیرد') sts: Optional[Literal[1,2]] = Field(default=1,description=""" 1.جاری 2.حذف شده """) counter: Optional[int] = Field(description='شمارنده در این فیلد قرار می گیرد') lat:Optional[str]= Field(description='مقدار عرض جغرافیایی در این فیلد قرار می گیرد') lang:Optional[str]= Field(description='مقدار طول جغرافیایی در این فیلد قرار می گیرد') address:Optional[str] = Field(description="آدرس پروژه") monitor:Optional[Monitor] = Field(description="فیلدهای نظارت") design:Design = Field(description='فیلدهای طراحی') has_monitor:Optional[bool] = Field(default=False,description='آیا طراحی دارد؟') all_delay_day: Optional[int] = Field(description='جمع روزهای دارای تاخیر') class ProjectSts(BaseModel): id: Optional[uuid.UUID] = Field(alias='_id') project_id: Optional[uuid.UUID] = Field(description="کد شناسایی پروژه در این فیلد قرار می گیرد") type: Optional[Literal['design','monitor']] = Field(description="نوع پروژه در این فیلد قرار می گیرد") sts: Optional[int] = Field(description='وضعیت مورد نظر در این فیلد قرار می گیرد') description:Optional[str] = Field(description='توضیحات وضعیت در این فیلد قرار می گیرد') class ProjectPriceReport(BaseModel): id: Optional[uuid.UUID] = Field(alias='_id') project_id: Optional[uuid.UUID] = Field(description="کد شناسایی پروژه در این فیلد قرار می گیرد") amount_status: Optional[int] = Field(description='مبلغ صورت وضعیت') amount_adjust: Optional[int] = Field(description='مبلغ تعدیل') first_amount: Optional[int] = Field(description=' مبلغ اولیه پیمان') class ProjectStatusAgreement(BaseModel): id: Optional[uuid.UUID] = Field(alias='_id') project_id: Optional[uuid.UUID] = Field(description="کد شناسایی پروژه در این فیلد قرار می گیرد") status:str