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 from core.utils.table_engine import TableEngineRequestType, TableEngineExport from typing import TypeVar from core.utils.te import NewTableEngine T = TypeVar('T') 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 async def get_list(self,project_id:uuid.UUID): contract = await use_collection(TaskEnv.CLN_CONTRACT).find( {"project_id": project_id} ).to_list(None) return contract async def fetch_report(self, _input: TableEngineRequestType): query = await NewTableEngine.mongo( query_class=use_collection(TaskEnv.CLN_CONTRACT), soft_deleted=True, model=ContractModel, return_query=True, inputs=_input.te) \ .to_dict() print(query) if query: count = await use_collection(TaskEnv.CLN_CONTRACT).aggregate([ {'$match':query['query']}, {'$group': {"_id": None, 'count': {'$sum': 1},'sum':{"$sum":"$amount"}}} ]).to_list(None) return count[0] else: return []