diff --git a/api_events/events/decision_book/decision_book_decision_book_items.py b/api_events/events/decision_book/decision_book_decision_book_items.py index be69753..0a9dc49 100644 --- a/api_events/events/decision_book/decision_book_decision_book_items.py +++ b/api_events/events/decision_book/decision_book_decision_book_items.py @@ -310,7 +310,6 @@ class DecisionBookDecisionBookItemsCreateEventMethods(MethodToEvent): service_id=related_service.id, build_living_space_id=project_leader.id, ) - project_person = BuildDecisionBookProjectPerson.find_or_create( build_decision_book_project_id=book_project_created.id, build_decision_book_project_uu_id=str(book_project_created.uu_id), @@ -318,8 +317,12 @@ class DecisionBookDecisionBookItemsCreateEventMethods(MethodToEvent): living_space_uu_id=str(project_leader.uu_id), ) project_person.save_and_confirm() + book_project_created.update( + project_response_living_space_id=project_leader.id, + project_response_living_space_uu_id=str(project_leader.uu_id), + ) + book_project_created.save() return book_project_created - elif data_info_type.key == "BDT-S": raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, diff --git a/api_events/events/decision_book/project_decision_book.py b/api_events/events/decision_book/project_decision_book.py index 55362e1..e4b3060 100644 --- a/api_events/events/decision_book/project_decision_book.py +++ b/api_events/events/decision_book/project_decision_book.py @@ -157,7 +157,6 @@ class ProjectDecisionBookUpdateEventMethods(MethodToEvent): message="Living space not found", data={}, ) - occupant_type = OccupantTypes.filter_by_one( occupant_category_type="PRJ", occupant_code="PRJ-LDR", @@ -170,11 +169,10 @@ class ProjectDecisionBookUpdateEventMethods(MethodToEvent): message=f"{token_dict.selected_occupant.occupant_type_uu_id} occupant type is not allowed, only PRJ-LDR occupant type is allowed", data={}, ) - decision_book_project_person = BuildDecisionBookProjectPerson.filter_one( - BuildDecisionBookProjects.build_decision_book_project_uu_id - == data.get("build_decision_book_project_uu_id"), - BuildDecisionBookProjects.living_space_id + BuildDecisionBookProjectPerson.build_decision_book_project_uu_id + == data.build_decision_book_project_uu_id, + BuildDecisionBookProjectPerson.living_space_id == token_dict.selected_occupant.living_space_id, ).data if not decision_book_project_person: @@ -237,6 +235,7 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent): data={}, ) occupant_type = OccupantTypes.filter_by_one( + system=True, occupant_category_type="PRJ", occupant_code="PRJ-LDR", id=living_space.occupant_type, @@ -248,15 +247,14 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent): message=f"{token_dict.selected_occupant.occupant_type_uu_id} occupant type is not allowed, only PRJ-LDR occupant type is allowed", data={}, ) - decision_book_project_person = BuildDecisionBookProjectPerson.filter_one( - BuildDecisionBookProjects.build_decision_book_project_uu_id - == data.get("build_decision_book_project_uu_id"), - BuildDecisionBookProjects.living_space_id + BuildDecisionBookProjectPerson.build_decision_book_project_uu_id + == data.build_decision_book_project_uu_id, + BuildDecisionBookProjectPerson.living_space_id == token_dict.selected_occupant.living_space_id, ).data if not decision_book_project_person: - raise BuildDecisionBookProjects.raise_http_exception( + raise BuildDecisionBookProjectPerson.raise_http_exception( status_code="HTTP_404_NOT_FOUND", error_case="NOT_FOUND", message="This project is not allowed for this occupant", @@ -275,7 +273,6 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent): ) data_dict = data.excluded_dump() data_dict["is_completed"] = True - data_dict["status_id"] = 1 # is completed status build_parts_list = BuildParts.filter_all( BuildParts.human_livable == True, @@ -288,13 +285,12 @@ class ProjectDecisionBookApprovalEventMethods(MethodToEvent): ).data book_payment_dict = dict( - payment_plan_time_periods=str(), build_decision_book_item_id=decision_book_project_item.id, build_decision_book_item_uu_id=str(decision_book_project_item.uu_id), currency=decision_book_project.currency, ) payment_type = ApiEnumDropdown.get_debit_search(search_debit="DT-D") - for final_price in data.final_price_list: + for final_price in data.final_price_list or []: for build_part_single in build_parts_list: local_date = BuildDecisionBookPayments.client_arrow.get( str(final_price["date"]) diff --git a/api_events/events/decision_book/project_decision_book_items.py b/api_events/events/decision_book/project_decision_book_items.py index c620ed1..fed0c03 100644 --- a/api_events/events/decision_book/project_decision_book_items.py +++ b/api_events/events/decision_book/project_decision_book_items.py @@ -14,6 +14,7 @@ from api_validations.validations_request import ( from api_events.events.abstract_class import MethodToEvent, ActionsSchema from api_objects.auth.token_objects import EmployeeTokenObject, OccupantTokenObject from api_validations.core_response import AlchemyJsonResponse +from databases.sql_models.building.decision_book import BuildDecisionBookProjects class BuildDecisionBookProjectItemsListEventMethods(MethodToEvent): @@ -47,17 +48,36 @@ class BuildDecisionBookProjectItemsCreateEventMethods(MethodToEvent): @staticmethod def build_decision_book_project_items_create( - requester: Union[EmployeeTokenObject, OccupantTokenObject], - decision_book_project_items: InsertBuildDecisionBookProjectItems, + token_dict: Union[EmployeeTokenObject, OccupantTokenObject], + data: InsertBuildDecisionBookProjectItems, ): - response = BuildDecisionBookProjectItems.create_item( - requester=requester, - decision_book_project_items=decision_book_project_items, - ) - return AlchemyJsonResponse( - message="Build Decision Book Project Items Create", - result=response, - ) + if isinstance(token_dict, EmployeeTokenObject): + raise BuildDecisionBookProjectItems.raise_http_exception( + status_code="HTTP_403_FORBIDDEN", + error_case="UNAUTHORIZED", + message=f"No permission to create decision book project items", + data={}, + ) + elif isinstance(token_dict, OccupantTokenObject): + book_project = BuildDecisionBookProjects.filter_one( + BuildDecisionBookProjects.uu_id == data.build_decision_book_project_uu_id, + BuildDecisionBookProjects.project_response_living_space_id == token_dict.selected_occupant.living_space_id + ).data + if not book_project: + raise BuildDecisionBookProjectItems.raise_http_exception( + status_code="HTTP_404_NOT_FOUND", + error_case="NOT_FOUND", + message=f"This user can not create project item for this project uu_id : {data.build_decision_book_project_uu_id}", + data={}, + ) + data_dict = data.excluded_dump() + data_dict["build_decision_book_project_id"] = book_project.id + created_project_item = BuildDecisionBookProjectItems.find_or_create(**data_dict) + created_project_item.save_and_confirm() + return AlchemyJsonResponse( + message="Build Decision Book Project Items Create", + result=created_project_item.get_dict(), + ) class BuildDecisionBookProjectItemsUpdateEventMethods(MethodToEvent): diff --git a/api_validations/validations_request/project_decision_book.py b/api_validations/validations_request/project_decision_book.py index 55b2c50..b3d6120 100644 --- a/api_validations/validations_request/project_decision_book.py +++ b/api_validations/validations_request/project_decision_book.py @@ -77,8 +77,9 @@ class UpdateBuildDecisionBookProjects(PydanticBaseModel): class ApprovalsBuildDecisionBookProjects(PydanticBaseModel): build_decision_book_project_uu_id: str - final_price_list: list[dict] # {"date": "2021-01-01", "price": 1000} project_stop_date: str + status_code: Optional[int] = None + final_price_list: Optional[list[dict]] = None # {"date": "2021-01-01", "price": 1000} class InsertBuildDecisionBookProjectItemDebits(PydanticBaseModel): diff --git a/databases/sql_models/building/decision_book.py b/databases/sql_models/building/decision_book.py index 9fed54d..3cf3f99 100644 --- a/databases/sql_models/building/decision_book.py +++ b/databases/sql_models/building/decision_book.py @@ -1018,7 +1018,6 @@ class BuildDecisionBookProjects(CrudCollection): project_start_date: Mapped[TIMESTAMP] = mapped_column( TIMESTAMP, nullable=False, comment="Project Start Date" ) - project_stop_date: Mapped[TIMESTAMP] = mapped_column( TIMESTAMP, server_default="2099-12-31 23:59:59" ) @@ -1031,7 +1030,7 @@ class BuildDecisionBookProjects(CrudCollection): is_completed: Mapped[bool] = mapped_column( Boolean, server_default="0", comment="Project is Completed" ) - status_id: Mapped[int] = mapped_column(SmallInteger, nullable=True) + status_code: Mapped[int] = mapped_column(SmallInteger, nullable=True) resp_company_fix_wage: Mapped[float] = mapped_column( Numeric(10, 2), server_default="0" ) @@ -1040,7 +1039,7 @@ class BuildDecisionBookProjects(CrudCollection): meeting_date: Mapped[TIMESTAMP] = mapped_column( TIMESTAMP, server_default="1900-01-01 00:00:00", index=True ) - currency: Mapped[float] = mapped_column(String(8), server_default="TRY") + currency: Mapped[str] = mapped_column(String(8), server_default="TRY") bid_price: Mapped[float] = mapped_column(Numeric(16, 4), server_default="0") approved_price: Mapped[float] = mapped_column(Numeric(16, 4), server_default="0") final_price: Mapped[float] = mapped_column(Numeric(16, 4), server_default="0") @@ -1057,7 +1056,7 @@ class BuildDecisionBookProjects(CrudCollection): build_decision_book_uu_id: Mapped[str] = mapped_column( String, nullable=True, comment="Decision Book UUID" ) - build_decision_book_item_id = mapped_column( + build_decision_book_item_id: Mapped[int] = mapped_column( ForeignKey("build_decision_book_items.id"), nullable=False ) build_decision_book_item_uu_id: Mapped[str] = mapped_column( diff --git a/service_app/routers/decision_book/project_decision_book/router.py b/service_app/routers/decision_book/project_decision_book/router.py index dc047da..4f28138 100644 --- a/service_app/routers/decision_book/project_decision_book/router.py +++ b/service_app/routers/decision_book/project_decision_book/router.py @@ -51,7 +51,7 @@ def build_decision_book_project_people_update( @build_decision_book_project_route.post( - path="/approval/{build_decision_book_project_id}", + path="/approval", summary="Approval people from Build Decision Book Project People with given auth levels", ) def build_decision_book_project_invite_approval( diff --git a/service_app_test/test_application/migrate_old_data/decision_book_project.py b/service_app_test/test_application/migrate_old_data/decision_book_project.py index cd06411..240dd31 100644 --- a/service_app_test/test_application/migrate_old_data/decision_book_project.py +++ b/service_app_test/test_application/migrate_old_data/decision_book_project.py @@ -28,8 +28,9 @@ def generate_approval_project_item(**kwargs): "build_decision_book_project_uu_id": kwargs.get( "build_decision_book_project_uu_id", None ), - "final_price_list": kwargs.get("final_price_list", []), + "final_price_list": kwargs.get("final_price_list", None), "project_stop_date": kwargs.get("project_stop_date", None), + "status_code": kwargs.get("status_code", None), } @@ -43,7 +44,7 @@ def generate_insert_project_item(**kwargs): } -def create_decision_book_items(requester, insert_project_item): +def create_decision_book_project_items(requester, insert_project_item): response = requester.post( endpoint="/build/decision_book/project/items/create", data=insert_project_item ) @@ -66,3 +67,16 @@ def approve_build_decision_book_project_approval(requester, approval_project_ite ) print("text", response.text) print("json", response.json()) + + +def list_decision_book_project(requester, project_no): + response = requester.post( + endpoint="/build/decision_book/project/list", + data={"query": {"project_no": project_no}}, + ) + print("text", response.text) + print("json", response.json()) + response_json = response.json() + # project = response_json["data"][0]["uu_id"] + project = response_json["data"][0] + return project diff --git a/service_app_test/test_application/migrate_old_data/runner.py b/service_app_test/test_application/migrate_old_data/runner.py index f7340ff..214bff0 100644 --- a/service_app_test/test_application/migrate_old_data/runner.py +++ b/service_app_test/test_application/migrate_old_data/runner.py @@ -1,3 +1,5 @@ +import json + import arrow from service_app_test.bases import RequestToApi @@ -30,10 +32,11 @@ from service_app_test.test_application.migrate_old_data.accounts import ( from service_app_test.test_application.migrate_old_data.decision_book_project import ( approve_build_decision_book_project_approval, update_decision_book_project, - create_decision_book_items, + create_decision_book_project_items, generate_insert_project_item, generate_update_project_item, generate_approval_project_item, + list_decision_book_project, ) local_api = RequestToApi() @@ -42,8 +45,13 @@ local_api.overwrite_base_url(base_url=LocalAPI.base_url) both_apis = BothAPIS() both_apis.local_api = local_api -password_token = "" -password_token_occ = "" + +def decode_as_json_indent(data): + return json.dumps(json.loads(json.dumps(data)), indent=2) + + +password_token = "FGS095it2IBP3gIp5glaG6u9tQy1KEPzKnBYE1fvGJSGvGUhwaGgxE-56yZAxUQnW-a_J91twOFKTWTc0ue4GZq10vY7fK2cZBsR9bUDJMCHZZZGpFYbsE6pLyaDs-1_K8v5hbggSmpXNFfafMmujuXxqvSzdLQa5hcg9qepHBOvgTbL28wGRHx9w-Fcb7bL" +password_token_occ = "kM9vHcWZVVF38IyNxMk6XMlCc8FCc_P1D-0D2u-Er5FrcQzvswSjJe9Lu9QnhJ5fJw5WqC45UYxopme_aCX6YDfZfQ3wQ9RP4Ak5YYTWBZbtwKGXTomlpYCQJghy0RC-1-Q9ATNEgcjYXqU2P9UjjdS9JNvhUawT0R38wXap-Mum6oazjqiKow41SUebnZ-H" login_data = { "domain": "evyos.com.tr", "access_key": "karatay.berkay.sup@evyos.com.tr", @@ -59,15 +67,28 @@ login_creds_occupant = { "password_token": password_token_occ, } selection_list = [ - # "523dbcd3-fe87-4208-86c2-da45204dfafc", - # "24aed2e5-bca0-4657-a056-badf9b3aa81c", + "d9ffa716-331c-48fc-83b2-47bf31289b3e", + "afebb7f8-9f62-4703-b11c-ee8f14fe73b7", ] -manager_token = "" -people_uu_id = "" -list_of_attendees = [] +manager_token = "g0Z1YYjh2WqFfoI3MdJ9wrfXAHeL6f7UatEkySzOK0dFX6CH1sXgjQ" +people_uu_id = "2c8781f6-c1bc-432d-bb0c-9f5247ecc750" +list_of_attendees = [ +"_Ky6UyaoatH5CZEQHZ1gdoj_7HDxSJ2DgBwq6hSXbCKR-WG8E9DPuQ", +"KhdJF7XP6ni_qdIRXSByGHKez8oTSbmzOAZxdi2A_iy-oOW6-VbfPA", +"vn01wNh5moTiNzw2qOvT4h5eqgCQ10jmN3OK659NN-ekriFSmVju_Q", +"EMsteygK4Myingptlpi_sr7Xu0Wsrl7xpQD-ukVY4GBjv6NJakpQ4Q", +"26p4QD1CofK6-Pk_VyDOB2Xstdv_sx88kh4kResWg4TuCuAy7tAT-A", +"2FgntLgLfFM20d32-gOwaHu44Vk_fDlpOh8IvS8gahiW-V0Dv0qLWg", +"TwC_dNuT6Iln0NFinEuvxbnjmb_HwcS8qWg-097gjc8pHTQ1p0nTGA", +"Yn35HP9TJonn9PTFpsq1lH3w-x-zHjTWymBeP6v4XPcwJP_aMj8JsQ", +"C2DbYn1jcocKwjQ8gvJ_jCU0IGAmbJB3JgHj-N_OTu1jNtmhVrW7aQ", +"TT5-9a_JVSf_WBAcN1sAfUyV45J2e7J1NoVGe3BcrrlAI1GNoU2_rw", +"ED4H5zpmxpLXX5rO6eoTb7wIa2x1v0YbNwsFh-iAohWh7fDyhvq_BQ", +] +constant = "Toplantı sonucunda araştırmalar tamamlandı, katılımcılara e-posta gönderildi. Onaylayan sayısı yeterli olmadığı için karar alınamadı ve proje iptal edildi ve sonlandırıldı." -assign_people_to_create_item = -1 +assign_people_to_create_item = 4 if assign_people_to_create_item == -1: local_api.selected_object = local_api.login_via_email_and_password( login_data=login_data, is_password_valid=False @@ -290,31 +311,111 @@ elif assign_people_to_create_item == 3: requester=both_apis.local_api, ) elif assign_people_to_create_item == 4: - # project_lead_creds_occupant = { - # "domain": "evyos.com.tr", - # "access_key": "", - # "password": "string", - # "remember_me": False, - # "password_token": "", - # } local_api.selected_object = local_api.login_via_email_and_password( login_data=login_creds_occupant, is_password_valid=True, selection_list=selection_list, ) - response = both_apis.local_api.post( - endpoint="/build/decision_book/project/list", - data={"query": {"project_no": "BDT-R_2024_1"}}, - ) - print("text", response.text) - print("json", response.json()) - response_json = response.json() - project_uu_id = response_json["data"][0]["uu_id"] - print("project_uu_id", project_uu_id) - exit() + # for i in range(8): + # index = i + 1 + # print("index", index) + # if index in [1, 7, 8]: + # continue + # project_no = f"BDT-R_2024_{index}" + # project = list_decision_book_project( + # requester=both_apis.local_api, project_no=project_no + # ) + # print("project", decode_as_json_indent(project)) + # project_uu_id = project["uu_id"] + # + # insert_project_item = generate_insert_project_item( + # **{ + # "build_decision_book_project_uu_id": project_uu_id, + # "item_header": "Toplantı sonrası alınan kararlar", + # "item_comment": constant, + # } + # ) + # create_decision_book_project_items( + # insert_project_item=insert_project_item, requester=both_apis.local_api + # ) + # approve_project_item = { + # "build_decision_book_project_uu_id": project_uu_id, + # "project_stop_date": "2024-12-01", + # "status_code": 9 + # } + # approve_build_decision_book_project_approval( + # approval_project_item=generate_approval_project_item(**approve_project_item), + # requester=both_apis.local_api, + # ) + # + # project = list_decision_book_project( + # requester=both_apis.local_api, project_no=project_no + # ) + # print("project", decode_as_json_indent(project)) - selected_decision_book_uu_id = list_decision_books(requester=both_apis.local_api)[ - "data" - ][0]["uu_id"] - print("select_company_uu_id", local_api.selected_object) + project_no = f"BDT-R_2024_7" + project = list_decision_book_project( + requester=both_apis.local_api, project_no=project_no + ) + print("project", decode_as_json_indent(project)) + project_uu_id = project["uu_id"] + + approve_project_item = lambda final_price_list : { + "build_decision_book_project_uu_id": project_uu_id, + "project_stop_date": "2024-12-01", + "final_price_list": final_price_list, + "status_code": 9 + } + approve_project_dict = approve_project_item( + [{"date": "2024-11-03", "price": 585.00}] + ) + insert_project_item = generate_insert_project_item( + **{ + "build_decision_book_project_uu_id": project_uu_id, + "item_header": "Toplantı sonrası alınan kararlar", + "item_comment": "Bina çalışmaları sonucunda 7020 ₺ lik maliyet çıkmıştır.", + } + ) + create_decision_book_project_items( + insert_project_item=insert_project_item, requester=both_apis.local_api + ) + approve_build_decision_book_project_approval( + approval_project_item=generate_approval_project_item(**approve_project_dict), + requester=both_apis.local_api, + ) + + project = list_decision_book_project( + requester=both_apis.local_api, project_no=project_no + ) + print("project", decode_as_json_indent(project)) + + project_no = f"BDT-R_2024_8" + project = list_decision_book_project( + requester=both_apis.local_api, project_no=project_no + ) + print("project", decode_as_json_indent(project)) + project_uu_id = project["uu_id"] + + approve_project_dict = approve_project_item( + [{"date": "2024-12-01", "price": 600.25}, {"date": "2025-01-01", "price": 600.50}] + ) + insert_project_item = generate_insert_project_item( + **{ + "build_decision_book_project_uu_id": project_uu_id, + "item_header": "Toplantı sonrası alınan kararlar", + "item_comment": "Bina çalışmaları sonucunda 12500 ₺ lik maliyet çıkmıştır.", + } + ) + create_decision_book_project_items( + insert_project_item=insert_project_item, requester=both_apis.local_api + ) + approve_build_decision_book_project_approval( + approval_project_item=generate_approval_project_item(**approve_project_dict), + requester=both_apis.local_api, + ) + + project = list_decision_book_project( + requester=both_apis.local_api, project_no=project_no + ) + print("project", decode_as_json_indent(project))