From b43c03c14a8f9ce050815928fd1e373b974f4b77 Mon Sep 17 00:00:00 2001 From: GichanaMayaka Date: Thu, 1 Aug 2024 14:26:36 +0300 Subject: [PATCH] chore(background tasks): Changed how submission of stock info happens. Changed the submission of stock information from submitting when records are inserted to the Stock Ledger to a general background task, that executes, by default, evey 4 mins (configurable) --- kenya_compliance/hooks.py | 15 +++------- .../kenya_compliance/apis/apis.py | 4 ++- .../apis/remote_response_status_handlers.py | 8 ++++-- .../background_tasks/tasks.py | 9 +++--- .../navari_kra_etims_settings.js | 7 +---- .../overrides/server/stock_ledger_entry.py | 28 ------------------- kenya_compliance/kenya_compliance/utils.py | 3 +- 7 files changed, 21 insertions(+), 53 deletions(-) diff --git a/kenya_compliance/hooks.py b/kenya_compliance/hooks.py index 66697d6..42a8ef2 100644 --- a/kenya_compliance/hooks.py +++ b/kenya_compliance/hooks.py @@ -260,12 +260,6 @@ "kenya_compliance.kenya_compliance.overrides.server.shared_overrides.validate" ], }, - "Stock Ledger Entry": { - "on_update": [ - "kenya_compliance.kenya_compliance.overrides.server.stock_ledger_entry.on_update", - "kenya_compliance.kenya_compliance.overrides.server.stock_ledger_entry.inventory_submit", - ] - }, "Purchase Invoice": { "on_submit": [ "kenya_compliance.kenya_compliance.overrides.server.purchase_invoice.on_submit" @@ -282,18 +276,17 @@ # --------------- scheduler_events = { - # "all": [ - # "kenya_compliance.tasks.all" - # ], + "all": [ + "kenya_compliance.kenya_compliance.background_tasks.tasks.send_stock_information", + "kenya_compliance.kenya_compliance.background_tasks.tasks.send_item_inventory_information", + ], # "daily": [ # "kenya_compliance.tasks.daily" # ], "hourly": [ "kenya_compliance.kenya_compliance.background_tasks.tasks.send_sales_invoices_information", "kenya_compliance.kenya_compliance.background_tasks.tasks.send_pos_invoices_information", - "kenya_compliance.kenya_compliance.background_tasks.tasks.send_stock_information", "kenya_compliance.kenya_compliance.background_tasks.tasks.send_purchase_information", - "kenya_compliance.kenya_compliance.background_tasks.tasks.send_item_inventory_information", "kenya_compliance.kenya_compliance.background_tasks.tasks.refresh_notices", ], # "weekly": [ diff --git a/kenya_compliance/kenya_compliance/apis/apis.py b/kenya_compliance/kenya_compliance/apis/apis.py index 4cc2f97..cd51ea9 100644 --- a/kenya_compliance/kenya_compliance/apis/apis.py +++ b/kenya_compliance/kenya_compliance/apis/apis.py @@ -462,7 +462,9 @@ def submit_inventory(request_data: str) -> None: endpoints_builder.headers = headers endpoints_builder.url = url endpoints_builder.payload = payload - endpoints_builder.success_callback = submit_inventory_on_success + endpoints_builder.success_callback = partial( + submit_inventory_on_success, document_name=data["name"] + ) endpoints_builder.error_callback = on_error frappe.enqueue( diff --git a/kenya_compliance/kenya_compliance/apis/remote_response_status_handlers.py b/kenya_compliance/kenya_compliance/apis/remote_response_status_handlers.py index 67bb43c..263423e 100644 --- a/kenya_compliance/kenya_compliance/apis/remote_response_status_handlers.py +++ b/kenya_compliance/kenya_compliance/apis/remote_response_status_handlers.py @@ -114,8 +114,12 @@ def imported_item_submission_on_success(response: dict, document_name: str) -> N frappe.db.set_value("Item", document_name, {"custom_imported_item_submitted": 1}) -def submit_inventory_on_success(response: dict) -> None: - return None +def submit_inventory_on_success(response: dict, document_name: str) -> None: + frappe.db.set_value( + "Stock Ledger Entry", + document_name, + {"custom_inventory_submitted_successfully": 1}, + ) def sales_information_submission_on_success( diff --git a/kenya_compliance/kenya_compliance/background_tasks/tasks.py b/kenya_compliance/kenya_compliance/background_tasks/tasks.py index 06481d7..1a6e2d0 100644 --- a/kenya_compliance/kenya_compliance/background_tasks/tasks.py +++ b/kenya_compliance/kenya_compliance/background_tasks/tasks.py @@ -14,6 +14,7 @@ TAXATION_TYPE_DOCTYPE_NAME, UNIT_OF_QUANTITY_DOCTYPE_NAME, ) +from ..overrides.server.stock_ledger_entry import on_update from ..utils import build_headers, get_route_path, get_server_url endpoints_builder = EndpointsBuilder() @@ -72,8 +73,6 @@ def send_pos_invoices_information() -> None: def send_stock_information() -> None: - from ..overrides.server.stock_ledger_entry import on_update - all_stock_ledger_entries: list[Document] = frappe.get_all( "Stock Ledger Entry", {"docstatus": 1, "custom_submitted_successfully": 0}, @@ -119,9 +118,10 @@ def send_item_inventory_information() -> None: from ..apis.apis import submit_inventory query = """ - SELECT sle.name, + SELECT sle.name as name, sle.owner, sle.custom_submitted_successfully, + sle.custom_inventory_submitted_successfully, qty_after_transaction as residual_qty, sle.warehouse, w.custom_branch as branch_id, @@ -130,7 +130,8 @@ def send_item_inventory_information() -> None: FROM `tabStock Ledger Entry` sle INNER JOIN tabItem i ON sle.item_code = i.item_code INNER JOIN tabWarehouse w ON sle.warehouse = w.name - WHERE sle.custom_submitted_successfully = '0' + WHERE sle.custom_submitted_successfully = '1' + AND sle.custom_inventory_submitted_successfully = '0' ORDER BY sle.creation DESC; """ diff --git a/kenya_compliance/kenya_compliance/doctype/navari_kra_etims_settings/navari_kra_etims_settings.js b/kenya_compliance/kenya_compliance/doctype/navari_kra_etims_settings/navari_kra_etims_settings.js index 7a79cec..692eecc 100644 --- a/kenya_compliance/kenya_compliance/doctype/navari_kra_etims_settings/navari_kra_etims_settings.js +++ b/kenya_compliance/kenya_compliance/doctype/navari_kra_etims_settings/navari_kra_etims_settings.js @@ -54,12 +54,7 @@ frappe.ui.form.on('Navari KRA eTims Settings', { frappe.call({ method: 'kenya_compliance.kenya_compliance.background_tasks.tasks.get_item_classification_codes', - args: { - request_data: { - name: frm.doc.name, - company_name: companyName, - }, - }, + args: {}, callback: (response) => {}, error: (error) => { // Error Handling is Defered to the Server diff --git a/kenya_compliance/kenya_compliance/overrides/server/stock_ledger_entry.py b/kenya_compliance/kenya_compliance/overrides/server/stock_ledger_entry.py index e6f5f7d..8505411 100644 --- a/kenya_compliance/kenya_compliance/overrides/server/stock_ledger_entry.py +++ b/kenya_compliance/kenya_compliance/overrides/server/stock_ledger_entry.py @@ -1,4 +1,3 @@ -import json from functools import partial from hashlib import sha256 from typing import Literal @@ -8,7 +7,6 @@ from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_data from ...apis.api_builder import EndpointsBuilder -from ...apis.apis import submit_inventory from ...apis.remote_response_status_handlers import ( on_error, stock_mvt_submission_on_success, @@ -23,32 +21,6 @@ endpoints_builder = EndpointsBuilder() -def inventory_submit(doc: Document, method: str | None = None) -> None: - residual_qty = frappe.db.sql( - f""" - SELECT item_code, warehouse, actual_qty - FROM tabBin - WHERE item_code = '{doc.item_code}' - AND warehouse = '{doc.warehouse}' - LIMIT 1; - """, - as_dict=True, - ) - - request_data = { - "company": frappe.defaults.get_user_default("Company"), - "name": doc.name, - "item_code": frappe.get_value( - "Item", {"item_code": doc.item_code}, ["custom_item_code_etims"] - ), - "owner": doc.owner, - "branch_id": get_warehouse_branch_id(doc.warehouse), - "residual_qty": residual_qty[0].actual_qty, - } - - submit_inventory(json.dumps(request_data)) - - def on_update(doc: Document, method: str | None = None) -> None: company_name = doc.company all_items = frappe.db.get_all( diff --git a/kenya_compliance/kenya_compliance/utils.py b/kenya_compliance/kenya_compliance/utils.py index e2b5b34..edbde3a 100644 --- a/kenya_compliance/kenya_compliance/utils.py +++ b/kenya_compliance/kenya_compliance/utils.py @@ -72,7 +72,8 @@ async def make_post_request( """ # TODO: Refactor to a more efficient handling of creation of the session object # as described in documentation - async with aiohttp.ClientSession(timeout=ClientTimeout(1200)) as session: + async with aiohttp.ClientSession(timeout=ClientTimeout(1800)) as session: + # Timeout of 1800 or 30 mins, especially for fetching Item classification async with session.post(url, json=data, headers=headers) as response: return await response.json()