import traceback from db import db from utils.list_utils import chunks, range_chunks from workers.base_worker import BaseWorker from workers.ccp.repository import CCPImportRepository from models.prs_purchase_order import PRSPurchaseOrder, PRSPurchaseOrderStatus from projects.repositories.projects_repository import ProjectsRepository class CCPPurchaseOrdersWorker(BaseWorker): worker_name = "CCPPurchaseOrdersWorker" repository = CCPImportRepository() projects_repository = ProjectsRepository() def should_log_exceptions(self): return True def execute(self, *args): new_providers = self.repository.get_new_providers() for chunk in chunks(new_providers, 500): db.session.bulk_save_objects(list(map(lambda x: self.repository.create_provider_with_name(x), chunk))) db.session.commit() raw_purchase_orders_count = self.repository.get_raw_ccp_purchase_order_count() self.logger.info("CCP POs import", f"Importing {raw_purchase_orders_count} POs...") po_per_iteration = 50000 try: for chunk in range_chunks(range(0, raw_purchase_orders_count), po_per_iteration): projects_ids = set() purchase_orders = [] raw_purchase_orders = self.repository.get_raw_ccp_purchase_order(po_per_iteration, chunk.start) for raw_purchase_order in raw_purchase_orders: po = self.__map_purchase_order(raw_purchase_order) if po.id is None or db.session.is_modified(po): projects_ids.add(raw_purchase_order.project_id) purchase_orders.append(po) db.session.bulk_save_objects(purchase_orders) self.projects_repository.touch_projects_last_edit(list(projects_ids)) db.session.commit() except Exception as error: self.logger.error("CCP POs import error", f"{error}\n{traceback.format_exc()}") return self.logger.success("CCP POs import", "Finished!") def __map_purchase_order(self, raw_purchase_order): po = ( raw_purchase_order.PRSPurchaseOrder or PRSPurchaseOrder() ) po.name = f"{raw_purchase_order.name} | PO {raw_purchase_order.po_num}" po.po_number = raw_purchase_order.po_num po.po_line_item = raw_purchase_order.po_line_item po.project_id = raw_purchase_order.project_id po.group_id = raw_purchase_order.budget_group_id po.category_id = raw_purchase_order.budget_category_id po.status = PRSPurchaseOrderStatus.map_from_str(raw_purchase_order.po_status).value po.total_amount = raw_purchase_order.po_total po.paid_amount = raw_purchase_order.po_total_paid po.created_date = raw_purchase_order.po_created_on po.last_modified_date = raw_purchase_order.po_modified_on po.provider_id = raw_purchase_order.provider_id po.is_under_uncommited_blanket = False po.total_amount_currency = raw_purchase_order.po_total_currency po.paid_amount_currency = raw_purchase_order.po_total_paid_currency return po