diff --git a/app/config/__init__.py b/app/config/__init__.py index ac8027a..592fac9 100644 --- a/app/config/__init__.py +++ b/app/config/__init__.py @@ -5,3 +5,5 @@ class TaskEnv: CLN_AUDIT_FACTOR = 'audit_factor' CLN_AUDIT_PROGRAM = 'audit_program' CLN_BILL_DELAY = 'bill_delay' + CLN_CONTRACT = 'contract' + diff --git a/app/models/contract.py b/app/models/contract.py new file mode 100644 index 0000000..c079729 --- /dev/null +++ b/app/models/contract.py @@ -0,0 +1,56 @@ +import uuid +from datetime import datetime +from typing import Optional, List, Literal + +import pydantic +from pydantic import Field + +from core.models.base import BaseModel + +class AddendumModel(pydantic.BaseModel): + id: Optional[uuid.UUID] = Field(description="کد شناسایی الحاقیه") + number: Optional[str] = Field(description="شماره الحاقیه") + amount: Optional[int] = Field(description=' مبلغ الحاقیه') + description: Optional[str] = Field(description='توضیحات') + end_date: Optional[datetime] = Field(description='تاریخ پایان الحاقیه') + created_at: Optional[datetime] = Field(description='تاریخ ایجاد رکورد') + updated_at: Optional[datetime] = Field(description='تاریخ آخرین بروزرسانی رکورد') + user_id: Optional[uuid.UUID] = Field(description='کد شناسایی کاربر در این فیلد قرار می گیرد') + +class ExtensionModel(pydantic.BaseModel): + id: Optional[uuid.UUID] = Field(description="کد شناسایی الحاقیه") + created_at: Optional[datetime] = Field(description='تاریخ ایجاد رکورد') + updated_at: Optional[datetime] = Field(description='تاریخ آخرین بروزرسانی رکورد') + user_id: Optional[uuid.UUID] = Field(description='کد شناسایی کاربر در این فیلد قرار می گیرد') + day_to_end: Optional[int] = Field(description='میزان روز مانده به پایان قرارداد') + description: Optional[str] = Field(description='توضیحات') + status:Optional[str] = Field(description='وضعیت تمدید پیمان') + +class ContractModel(BaseModel): + id: Optional[uuid.UUID] = Field(alias='_id') + project_id: uuid.UUID = Field(description='کد شناسایی پروژ') + state: str = Field(description='استان در این فیلد قرار می گیرد') + city: str = Field(description='شهر در این فیلد قرار می گیرد') + project_code: Optional[str] = Field(description='کد در این فیلد قرار می گیرد') + description: Optional[str] = Field(description='شرح قرارداد') + number: Optional[str] = Field(description="شماره قرارداد") + type:Optional[str] = Field(description=' نوع قرارداد') + amount:Optional[int] = Field(description='مبلغ اولیه قرارداد') + date_contract:Optional[datetime] = Field(description='تاریخ عقد قرارداد') + end_date:Optional[datetime] = Field(description='تاریخ پایان قرارداد') + notif_date:Optional[datetime] = Field(description='تاریخ ابلاغ قرارداد') + name_employer:Optional[str] = Field(description='نام کارفرما') + name_consultant:Optional[str] = Field(description='نام مشاور') + collection:Optional[List[str]] = Field(description=""" + 'ژئوتکنیک','طرح توجیحی','طراحی','نظارت کارگاهی','نظارت عالیه' + """) + addendum:Optional[List[AddendumModel]] = Field(description='الحاقیه') + nature:Optional[str] = Field(description=""" +  طراحی +  نظارت +  برونسپاری + """) + basic_fee : Optional[int] = Field(description='حق الزحمه مبنا') + meter : Optional[str] = Field(description='متراژ پروژه') + extension : Optional[List[ExtensionModel]] = Field(description='وضعیت تمدید قرارداد') + diff --git a/app/repositories/contract.py b/app/repositories/contract.py new file mode 100644 index 0000000..00c5fb7 --- /dev/null +++ b/app/repositories/contract.py @@ -0,0 +1,63 @@ +import uuid + +from pymongo import ReturnDocument + +from app.config import TaskEnv +from app.models.contract import ContractModel, AddendumModel, ExtensionModel +from core.repositories.base import BaseRepository +from core.service.mongo_db import use_collection +from core.utils import get_time + + +class ContractRepository(BaseRepository): + def __init__(self): + super().__init__(collection=TaskEnv.CLN_CONTRACT, model=ContractModel) + + async def create_add(self,_id:uuid.UUID,_inp:AddendumModel): + _inp.id = uuid.uuid4() + _inp.created_at = get_time() + _inp.updated_at = get_time() + contract = await use_collection(TaskEnv.CLN_CONTRACT).find_one_and_update( + {"_id":_id}, + {"$push":{"addendum":_inp.dict()}},return_document=ReturnDocument.AFTER + ) + return contract + + async def update_add(self,_id:uuid.UUID,_inp:AddendumModel): + _inp.updated_at = get_time() + result = await use_collection(TaskEnv.CLN_CONTRACT).find_one_and_update( + {"_id": _id,'addendum.id':_inp.id}, + { + "$set":{ + 'addendum.$.number':_inp.number, + 'addendum.$.amount':_inp.amount, + 'addendum.$.description':_inp.description, + 'addendum.$.end_date':_inp.end_date, + 'addendum.$.updated_at':_inp.updated_at, + } + },return_document=ReturnDocument.AFTER) + return result + + async def create_extension(self, _id: uuid.UUID, _inp:ExtensionModel): + _inp.id = uuid.uuid4() + _inp.created_at = get_time() + _inp.updated_at = get_time() + contract = await use_collection(TaskEnv.CLN_CONTRACT).find_one_and_update( + {"_id": _id}, + {"$push": {"extension": _inp.dict()}}, return_document=ReturnDocument.AFTER + ) + return contract + + async def update_extention(self, _id: uuid.UUID, _inp:ExtensionModel): + _inp.updated_at = get_time() + result = await use_collection(TaskEnv.CLN_CONTRACT).find_one_and_update( + {"_id": _id,'extension.id':_inp.id}, + { + "$set":{ + 'extension.$.updated_at':_inp.updated_at, + 'extension.$.day_to_end':_inp.day_to_end, + 'extension.$.description':_inp.description, + 'extension.$.status':_inp.status + } + },return_document=ReturnDocument.AFTER) + return result diff --git a/app/urls/__init__.py b/app/urls/__init__.py index 7641888..170e923 100644 --- a/app/urls/__init__.py +++ b/app/urls/__init__.py @@ -7,3 +7,4 @@ from .price_audit import * from .factor_audit import * from .program_audit import * from .bill_delay import * +from .contract import * diff --git a/app/urls/contract.py b/app/urls/contract.py new file mode 100644 index 0000000..f189acf --- /dev/null +++ b/app/urls/contract.py @@ -0,0 +1,63 @@ +from uuid import UUID + +from fastapi import Body + +from app.models.contract import ContractModel, AddendumModel, ExtensionModel +from app.repositories.contract import ContractRepository +from core.app import app +from core.utils.router import generate_router, shrink +from core.utils.table_engine import TableEngineExport, TableEngineRequestType + +ThisModel = ContractModel +router_base_url = 'contract' +_tag_base = [router_base_url] +router = generate_router(router_base_url, auth_dependencies=False, version='v2') +repo = ContractRepository() + +@router.post('/add/create', response_model=ContractModel, tags=_tag_base) +@shrink(repo.create_add) +def create_add(contract_id: UUID,coding: AddendumModel = Body(...)): + pass + +@router.put('/add/update', response_model=ContractModel, tags=_tag_base) +@shrink(repo.update_add) +def update_add(contract_id: UUID,coding: AddendumModel = Body(...)): + pass + +@router.post('/extension/create', response_model=ContractModel, tags=_tag_base) +@shrink(repo.create_extension) +def create_extension(contract_id: UUID,coding: ExtensionModel = Body(...)): + pass + +@router.put('/extension/create', response_model=ContractModel, tags=_tag_base) +@shrink(repo.update_extention) +def update_extention(contract_id: UUID,coding: ExtensionModel = Body(...)): + pass + +@router.post('/create', response_model=ContractModel, tags=_tag_base) +@shrink(repo.create) +def create(coding: ContractModel = Body(...)): + pass + + +@router.put('/{_id}', response_model=ContractModel, tags=_tag_base) +@shrink(repo.update) +def update(_id: UUID, coding: ContractModel = Body(...)): + pass + +@router.get('/{_id}', response_model=ThisModel, tags=_tag_base) +@shrink(repo.get) +def get(_id: UUID): + pass + +@router.delete('/{_id}', response_model=ThisModel, tags=_tag_base) +@shrink(repo.delete) +def delete(_id: UUID): + pass + +@router.post('', response_model=TableEngineExport[ThisModel], tags=_tag_base) +@shrink(repo.fetch) +def fetch(body: TableEngineRequestType = Body(...)): + pass + +app.include_router(router) \ No newline at end of file