import json import uuid from uuid import UUID import requests from dateutil.relativedelta import relativedelta from fastapi import HTTPException from app.config import TaskEnv from app.models.project import ProjectModel, UpdateSts, ProjectSts, Design, ProjectStatusAgreement from core.repositories.base import BaseRepository from core.service.mongo_db import use_collection from core.utils.table_engine import TableEngineRequestType, TableEngineExport from core.utils.te import NewTableEngine from typing import TypeVar, List COLLECTION = "project" T = TypeVar('T') class ProjectRepository(BaseRepository[ProjectModel]): def __init__(self): super().__init__(collection=COLLECTION, model=ProjectModel) def create_code(self,coding:ProjectModel): code = str(coding.counter) print("code1",code) if len(code) < 4: code = code.rjust(4, '0') print("code2", code) code = coding.design.nature + coding.design.type + code return code async def create_report_price(self, _inp: ProjectModel): if _inp.monitor and _inp.monitor.detail and _inp.monitor.detail.first_amount: price = { '_id': uuid.uuid4(), 'project_id': _inp.id, 'first_amount': _inp.monitor.detail.first_amount } await use_collection(TaskEnv.CLN_PROJECT_PRICE_REPORT).insert_one(price) return True async def update_report_price(self,update:ProjectModel): if update.monitor and update.monitor.detail and update.monitor.detail.first_amount: price = await use_collection(TaskEnv.CLN_PROJECT_PRICE_REPORT).find_one({'project_id': update.id}) if not price: price = { '_id': uuid.uuid4(), 'project_id': update.id, 'first_amount': update.monitor.detail.first_amount } await use_collection(TaskEnv.CLN_PROJECT_PRICE_REPORT).insert_one(price) else: await use_collection(TaskEnv.CLN_PROJECT_PRICE_REPORT).update_one({'project_id': update.id}, {'$set':{'first_amount': update.monitor.detail.first_amount}}) return True async def create(self,coding:ProjectModel): coding.counter = 1 last_project = await use_collection(COLLECTION).find({}).sort("$natural",-1).to_list(None) if last_project: coding.counter = last_project[0]["counter"]+1 code = self.create_code(coding) coding.design.code = 'D'+code coding.init_id().cu_at() if coding.monitor: coding.monitor.code = 'S'+code coding.has_monitor = True await self.create_report_price(coding) if coding.monitor.detail.date_create_project and coding.monitor.detail.first_time: date_create = coding.monitor.detail.date_create_project months = int(coding.monitor.detail.first_time) coding.date_delay = date_create + relativedelta(months=months) else: coding.has_monitor = False await use_collection(COLLECTION).insert_one(coding.mongo_dict()) if coding.design.status_agreement: _model=ProjectStatusAgreement( project_id= coding.id, status= coding.design.status_agreement ).init_id().cu_at() await use_collection(TaskEnv.CLN_PROJECT_AGREEMENT).insert_one(_model.mongo_dict()) return await self.get(coding.id) async def update(self, _id: UUID, update: ProjectModel): old_project = await use_collection(COLLECTION).find_one({"_id":_id}) old_project = ProjectModel(**old_project) if update.monitor and not old_project.monitor: code = self.create_code(update) update.monitor.code = 'S'+code if update.design.nature != old_project.design.nature or update.design.type != old_project.design.type : code = self.create_code(update) update.design.code = 'D' + code if update.monitor: update.monitor.code = 'S' + code if update.monitor: update.has_monitor = True await self.update_report_price(update) update.u_at() await use_collection(COLLECTION).update_one({"_id":_id},{"$set":update.mongo_dict()}) if old_project.design.status_agreement != update.design.status_agreement: _model = ProjectStatusAgreement( project_id=_id, status=update.design.status_agreement ).init_id().cu_at() await use_collection(TaskEnv.CLN_PROJECT_AGREEMENT).insert_one(_model.mongo_dict()) return await self.get(_id) async def update_design_sts(self, _id: UUID, update: UpdateSts): old_project = await use_collection(COLLECTION).find_one({"_id":_id}) if not old_project: raise HTTPException(status_code=400,detail='این پروژه وجود ندارد') await use_collection(COLLECTION).update_one({"_id":_id},{"$set":{ 'design.sts':update.sts,'design.reason_stop':update.reason_stop }}) sts_class = ProjectSts( project_id= _id, type = 'design', sts= update.sts, description= update.reason_stop ).init_id().cu_at() await use_collection(TaskEnv.CLN_PROJECT_STS).insert_one(sts_class.mongo_dict()) return await self.get(_id) async def update_monitor_sts(self, _id: UUID, update: UpdateSts): old_project = await use_collection(COLLECTION).find_one({"_id":_id}) if not old_project: raise HTTPException(status_code=400,detail='این پروژه وجود ندارد') await use_collection(COLLECTION).update_one({"_id":_id},{"$set":{ 'monitor.sts':update.sts,'monitor.reason_sts':update.reason_stop }}) sts_class = ProjectSts( project_id= _id, type = 'monitor', sts= update.sts, description= update.reason_stop ).init_id().cu_at() await use_collection(TaskEnv.CLN_PROJECT_STS).insert_one(sts_class.mongo_dict()) return await self.get(_id) async def delete(self, _id: UUID): old_project = await use_collection(COLLECTION).find_one({"_id":_id}) if not old_project: raise HTTPException(status_code=400,detail='این پروژه وجود ندارد') await use_collection(COLLECTION).update_one({"_id":_id},{"$set":{ 'sts':2, }}) return True async def restore(self, _id: UUID): old_project = await use_collection(COLLECTION).find_one({"_id":_id}) if not old_project: raise HTTPException(status_code=400,detail='این پروژه وجود ندارد') await use_collection(COLLECTION).update_one({"_id":_id},{"$set":{ 'sts':1, }}) return True async def list_project_design(self): project = await use_collection(COLLECTION).find({'monitor':{"$exists":0}}).to_list(None) return project async def list_project_monitor(self): project = await use_collection(COLLECTION).find({'monitor':{"$exists":1}}).to_list(None) return project async def list_sts_design(self,_id:uuid.UUID): sts_project = await use_collection(TaskEnv.CLN_PROJECT_STS).find({ "project_id":_id, "type":"design" }).to_list(None) return sts_project async def list_sts_monitor(self,_id:uuid.UUID): sts_project = await use_collection(TaskEnv.CLN_PROJECT_STS).find({ "project_id":_id, "type":"monitor" }).to_list(None) return sts_project async def list_project(self): project = await use_collection(TaskEnv.CLN_PROJECT).find({}).to_list(None) return project async def set_sts_two_for_monitor(self,project_id:uuid.UUID): project = await use_collection(TaskEnv.CLN_PROJECT).find_one({"_id": project_id}) if not ('sts' in project['monitor'] and project['monitor']['sts'] > 1): await use_collection(TaskEnv.CLN_PROJECT).update_one( {'_id': project_id}, {"$set":{"monitor.sts": 2}}) sts_class = ProjectSts( project_id=project_id, type='monitor', sts=2 ).init_id().cu_at() await use_collection(TaskEnv.CLN_PROJECT_STS).insert_one(sts_class.mongo_dict()) return True async def fetch_delete(self, _input: TableEngineRequestType) -> TableEngineExport[T]: return await NewTableEngine.mongo( query_class=use_collection(self.COLLECTION), soft_deleted=True, model=self.MODEL, search_cols=['name'], extra_filter=[{'sts':2}], inputs=_input.te) \ .to_dict() async def fetch(self, _input: TableEngineRequestType) -> TableEngineExport[T]: return await NewTableEngine.mongo( query_class=use_collection(self.COLLECTION), soft_deleted=True, model=self.MODEL, search_cols=['name'], extra_filter=[{'sts': 1}], inputs=_input.te) \ .to_dict() async def get_all(self): url = 'http://api.khanesaziceco.ir/api/api/project/table' headers = {'authorization':'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9hcGkua2hhbmVzYXppY2Vjby5pclwvYXBpXC9hdXRoXC9sb2dpbiIsImlhdCI6MTcyOTg4MTc2OCwiZXhwIjoxNzMyNDczNzY4LCJuYmYiOjE3Mjk4ODE3NjgsImp0aSI6IjRiUGQ0dW1Wc2ZBSnNFUzUiLCJzdWIiOjEzNiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.LsinrL84iKAd4HaTHmsaDCALXJPwMLegNpeFhlJL0aY'} data = {"page": 1, "limit": 400, "sort":"_id" } res = requests.post(url,data=json.dumps(data), headers=headers) a = res.json() print(a['rows'][0]) obj = [] for i in a['rows']: _set= ProjectModel( sts=1, counter=i['id'], design= Design(**i) ).init_id().cu_at() obj.append(_set.mongo_dict()) print() # await use_collection(TaskEnv.CLN_PROJECT).insert_many(obj) return res.json() async def create_project_price(self): projects = await use_collection(TaskEnv.CLN_PROJECT).find({'monitor.detail.first_amount':{'$exists':1}}).to_list(None) for project in projects: sum_status = 0 sum_adjust = 0 status = await use_collection(TaskEnv.CLN_FINANCIAL_STATUS).find({'project_id':project['_id'],'amount':{'$exists':1}}).to_list(None) if status: for i in status: sum_status += i['amount'] adjust = await use_collection(TaskEnv.CLN_FINANCIAL_ADJUST).find({'project_id':project['_id'],'amount':{'$exists':1}}).to_list(None) if adjust: for i in adjust: sum_adjust += i['amount'] price = { '_id': uuid.uuid4(), 'project_id': project['_id'], 'first_amount': project['monitor']['detail']['first_amount'], 'amount_status':sum_status, 'amount_adjust':sum_adjust } await use_collection(TaskEnv.CLN_PROJECT_PRICE_REPORT).insert_one(price)