From deec150bfd5d53781059a943c9c685bc9bfab3b6 Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Thu, 5 Dec 2024 13:22:58 +0530 Subject: [PATCH 1/9] fix: fetch hsn code from shopify --- .../shopify_setting/shopify_setting.json | 9 +++++++- ecommerce_integrations/shopify/product.py | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json index 01722169b..35d5c5fd7 100644 --- a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json +++ b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json @@ -48,6 +48,7 @@ "upload_variants_as_items", "inventory_sync_section", "warehouse", + "default_item_group", "update_erpnext_stock_levels_to_shopify", "inventory_sync_frequency", "fetch_shopify_locations", @@ -387,12 +388,18 @@ "fieldtype": "Link", "label": "Default Shipping Charges Account", "options": "Account" + }, + { + "fieldname": "default_item_group", + "fieldtype": "Link", + "label": "Default item group", + "options": "Item Group" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-10-24 10:38:49.247431", + "modified": "2024-12-04 19:41:20.719756", "modified_by": "Administrator", "module": "shopify", "name": "Shopify Setting", diff --git a/ecommerce_integrations/shopify/product.py b/ecommerce_integrations/shopify/product.py index 92c31f467..aa1b55793 100644 --- a/ecommerce_integrations/shopify/product.py +++ b/ecommerce_integrations/shopify/product.py @@ -1,6 +1,7 @@ from typing import Optional import frappe +import shopify from frappe import _, msgprint from frappe.utils import cint, cstr from frappe.utils.nestedset import get_root_of @@ -58,6 +59,8 @@ def sync_product(self): if not self.is_synced(): shopify_product = Product.find(self.product_id) product_dict = shopify_product.to_dict() + product_dict = self._update_hsn_sac_code(product_dict) + self._get_item_group(product_dict.get("product_type")) self._make_item(product_dict) def _make_item(self, product_dict): @@ -137,6 +140,7 @@ def _create_item(self, product_dict, warehouse, has_variant=0, attributes=None, "weight_uom": WEIGHT_TO_ERPNEXT_UOM_MAP[product_dict.get("weight_unit")], "weight_per_unit": product_dict.get("weight"), "default_supplier": self._get_supplier(product_dict), + "gst_hsn_code": product_dict.get("gst_hsn_code"), } integration_item_code = product_dict["id"] # shopify product_id @@ -174,6 +178,7 @@ def _create_item_variants(self, product_dict, warehouse, attributes): "item_price": variant.get("price"), "weight_unit": variant.get("weight_unit"), "weight": variant.get("weight"), + "gst_hsn_code": product_dict.get("gst_hsn_code"), } for i, variant_attr in enumerate(SHOPIFY_VARIANTS_ATTR_LIST): @@ -187,6 +192,22 @@ def _create_item_variants(self, product_dict, warehouse, attributes): ) self._create_item(shopify_item_variant, warehouse, 0, attributes, template_item.name) + def _update_hsn_sac_code(self, product_dict): + try: + for variant in product_dict.get("variants"): + if variant.get("inventory_item_id"): + inventory_item = shopify.InventoryItem.find(variant.get("inventory_item_id")) + if inventory_item.harmonized_system_code: + product_dict["gst_hsn_code"] = inventory_item.harmonized_system_code + break + except Exception: + frappe.log_error(title="_update_hsn_sac_code", message=frappe.get_traceback()) + if not (product_dict.get("gst_hsn_code")) and self.setting.default_item_group: + product_dict["gst_hsn_code"] = frappe.db.get_value( + "Item Group", self.setting.default_item_group, "gst_hsn_code" + ) + return product_dict + def _get_attribute_value(self, variant_attr_val, attribute): attribute_value = frappe.db.sql( """select attribute_value from `tabItem Attribute Value` From 482fddefca36da5d96b735746a535ad5fce11402 Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Thu, 5 Dec 2024 18:48:05 +0530 Subject: [PATCH 2/9] fix: update without default item group --- .../shopify/doctype/shopify_setting/shopify_setting.json | 9 +-------- ecommerce_integrations/shopify/product.py | 7 +------ 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json index 35d5c5fd7..01722169b 100644 --- a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json +++ b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json @@ -48,7 +48,6 @@ "upload_variants_as_items", "inventory_sync_section", "warehouse", - "default_item_group", "update_erpnext_stock_levels_to_shopify", "inventory_sync_frequency", "fetch_shopify_locations", @@ -388,18 +387,12 @@ "fieldtype": "Link", "label": "Default Shipping Charges Account", "options": "Account" - }, - { - "fieldname": "default_item_group", - "fieldtype": "Link", - "label": "Default item group", - "options": "Item Group" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2024-12-04 19:41:20.719756", + "modified": "2023-10-24 10:38:49.247431", "modified_by": "Administrator", "module": "shopify", "name": "Shopify Setting", diff --git a/ecommerce_integrations/shopify/product.py b/ecommerce_integrations/shopify/product.py index aa1b55793..e876cc3f7 100644 --- a/ecommerce_integrations/shopify/product.py +++ b/ecommerce_integrations/shopify/product.py @@ -60,7 +60,6 @@ def sync_product(self): shopify_product = Product.find(self.product_id) product_dict = shopify_product.to_dict() product_dict = self._update_hsn_sac_code(product_dict) - self._get_item_group(product_dict.get("product_type")) self._make_item(product_dict) def _make_item(self, product_dict): @@ -197,15 +196,11 @@ def _update_hsn_sac_code(self, product_dict): for variant in product_dict.get("variants"): if variant.get("inventory_item_id"): inventory_item = shopify.InventoryItem.find(variant.get("inventory_item_id")) - if inventory_item.harmonized_system_code: + if hasattr(inventory_item, "harmonized_system_code"): product_dict["gst_hsn_code"] = inventory_item.harmonized_system_code break except Exception: frappe.log_error(title="_update_hsn_sac_code", message=frappe.get_traceback()) - if not (product_dict.get("gst_hsn_code")) and self.setting.default_item_group: - product_dict["gst_hsn_code"] = frappe.db.get_value( - "Item Group", self.setting.default_item_group, "gst_hsn_code" - ) return product_dict def _get_attribute_value(self, variant_attr_val, attribute): From 3ec901fc6f62106b5055019779813a5928914225 Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 11:26:55 +0530 Subject: [PATCH 3/9] feat: add new Doctype to import item group first --- .../__init__.py | 0 .../item_group_hsn_sac_code_mapping.json | 39 +++++++++++++++++++ .../item_group_hsn_sac_code_mapping.py | 9 +++++ 3 files changed, 48 insertions(+) create mode 100644 ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/__init__.py create mode 100644 ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json create mode 100644 ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py diff --git a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/__init__.py b/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json b/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json new file mode 100644 index 000000000..752adc118 --- /dev/null +++ b/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json @@ -0,0 +1,39 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2024-12-06 14:05:51.822550", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "item_group", + "hsnsac_code" + ], + "fields": [ + { + "fieldname": "item_group", + "fieldtype": "Link", + "in_list_view": 1, + "label": " Item Group", + "options": "Item Group" + }, + { + "fieldname": "hsnsac_code", + "fieldtype": "Data", + "in_list_view": 1, + "label": "HSN/SAC Code" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2024-12-06 16:01:12.105446", + "modified_by": "Administrator", + "module": "shopify", + "name": "Item Group HSN SAC Code Mapping", + "owner": "Administrator", + "permissions": [], + "sort_field": "creation", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py b/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py new file mode 100644 index 000000000..67d2a0106 --- /dev/null +++ b/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ItemGroupHSNSACCodeMapping(Document): + pass From 06d10626bd455dc6ce811722983c6e9dc6a5033e Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 11:49:23 +0530 Subject: [PATCH 4/9] feat: add custom button to get the item group first --- .../shopify_setting/shopify_setting.js | 8 +++ .../shopify_setting/shopify_setting.json | 9 ++- .../shopify_import_products.py | 39 ++++++++++- ecommerce_integrations/shopify/product.py | 70 +++++++++++++++++-- 4 files changed, 118 insertions(+), 8 deletions(-) diff --git a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.js b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.js index 45be645ac..6ba67be41 100644 --- a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.js +++ b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.js @@ -26,6 +26,9 @@ frappe.ui.form.on("Shopify Setting", { }, refresh: function (frm) { + frm.add_custom_button(__("Import Item Group"), function () { + frm.trigger("shopify_import_item_group"); + }); frm.add_custom_button(__("Import Products"), function () { frappe.set_route("shopify-import-products"); }); @@ -96,4 +99,9 @@ frappe.ui.form.on("Shopify Setting", { frm.set_query("default_sales_tax_account", tax_query); frm.set_query("default_shipping_charges_account", tax_query); }, + shopify_import_item_group: function (frm) { + frappe.call({ + method: "ecommerce_integrations.shopify.page.shopify_import_products.shopify_import_products.import_all_product_groups", + }); + }, }); diff --git a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json index 01722169b..df4f0aa14 100644 --- a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json +++ b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json @@ -52,6 +52,7 @@ "inventory_sync_frequency", "fetch_shopify_locations", "shopify_warehouse_mapping", + "item_group_hsn_sac_code_mapping", "sync_old_orders_section", "sync_old_orders", "column_break_45", @@ -387,12 +388,18 @@ "fieldtype": "Link", "label": "Default Shipping Charges Account", "options": "Account" + }, + { + "fieldname": "item_group_hsn_sac_code_mapping", + "fieldtype": "Table", + "label": "Item Group HSN SAC Code Mapping", + "options": "Item Group HSN SAC Code Mapping" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-10-24 10:38:49.247431", + "modified": "2024-12-06 16:06:02.733525", "modified_by": "Administrator", "module": "shopify", "name": "Shopify Setting", diff --git a/ecommerce_integrations/shopify/page/shopify_import_products/shopify_import_products.py b/ecommerce_integrations/shopify/page/shopify_import_products/shopify_import_products.py index e30a102e9..1614ae511 100644 --- a/ecommerce_integrations/shopify/page/shopify_import_products/shopify_import_products.py +++ b/ecommerce_integrations/shopify/page/shopify_import_products/shopify_import_products.py @@ -6,12 +6,14 @@ from ecommerce_integrations.ecommerce_integrations.doctype.ecommerce_item import ecommerce_item from ecommerce_integrations.shopify.connection import temp_shopify_session -from ecommerce_integrations.shopify.constants import MODULE_NAME +from ecommerce_integrations.shopify.constants import MODULE_NAME, SETTING_DOCTYPE from ecommerce_integrations.shopify.product import ShopifyProduct # constants SYNC_JOB_NAME = "shopify.job.sync.all.products" REALTIME_KEY = "shopify.key.sync.all.products" +SYNC_PRODUCT_GROUP_JOB_NAME = "shopify.job.sync.all.product.groups" +SYNC_PRODUCT_GROUP_REALTIME_KEY = "shopify.key.sync.all.product.groups" @frappe.whitelist() @@ -126,6 +128,41 @@ def import_all_products(): ) +@frappe.whitelist() +def import_all_product_groups(): + frappe.enqueue( + queue_sync_all_product_groups, + queue="long", + job_name=SYNC_PRODUCT_GROUP_JOB_NAME, + key=SYNC_PRODUCT_GROUP_REALTIME_KEY, + ) + + +def queue_sync_all_product_groups(*args, **kwargs): + _sync = True + collection = _fetch_products_from_shopify(limit=100) + savepoint = "shopify_product_groups_sync" + setting = frappe.get_doc(SETTING_DOCTYPE) + while _sync: + for product in collection: + try: + frappe.db.savepoint(savepoint) + shopify_product = ShopifyProduct(product.id, setting=setting) + shopify_product.sync_product(sync_product_group=True) + except Exception: + frappe.log_error(title="queue_sync_all_product_groups", message=frappe.get_traceback()) + frappe.db.rollback(save_point=savepoint) + continue + + if collection.has_next_page(): + frappe.db.commit() # prevents too many write request error + collection = _fetch_products_from_shopify(from_=collection.next_page_url) + else: + _sync = False + setting.save() + return True + + def queue_sync_all_products(*args, **kwargs): start_time = process_time() diff --git a/ecommerce_integrations/shopify/product.py b/ecommerce_integrations/shopify/product.py index e876cc3f7..773f08ee5 100644 --- a/ecommerce_integrations/shopify/product.py +++ b/ecommerce_integrations/shopify/product.py @@ -27,12 +27,13 @@ def __init__( variant_id: str | None = None, sku: str | None = None, has_variants: int | None = 0, + setting: object | None = None, ): self.product_id = str(product_id) self.variant_id = str(variant_id) if variant_id else None self.sku = str(sku) if sku else None self.has_variants = has_variants - self.setting = frappe.get_doc(SETTING_DOCTYPE) + self.setting = setting if setting else frappe.get_doc(SETTING_DOCTYPE) if not self.setting.is_enabled(): frappe.throw(_("Can not create Shopify product when integration is disabled.")) @@ -55,12 +56,22 @@ def get_erpnext_item(self): ) @temp_shopify_session - def sync_product(self): - if not self.is_synced(): + def sync_product(self, sync_product_group=False): + if not self.is_synced() or sync_product_group: shopify_product = Product.find(self.product_id) product_dict = shopify_product.to_dict() product_dict = self._update_hsn_sac_code(product_dict) - self._make_item(product_dict) + if sync_product_group: + self._sync_product_group(product_dict) + else: + self._make_item(product_dict) + + def _sync_product_group(self, product_dict): + self._get_item_group( + product_type=product_dict.get("product_type"), + sync_product_group=True, + hsnsac_code=product_dict.get("gst_hsn_code"), + ) def _make_item(self, product_dict): _add_weight_details(product_dict) @@ -129,7 +140,9 @@ def _create_item(self, product_dict, warehouse, has_variant=0, attributes=None, "item_code": cstr(product_dict.get("item_code")) or cstr(product_dict.get("id")), "item_name": product_dict.get("title", "").strip(), "description": product_dict.get("body_html") or product_dict.get("title"), - "item_group": self._get_item_group(product_dict.get("product_type")), + "item_group": self._get_item_group( + product_dict.get("product_type"), hsnsac_code=product_dict.get("gst_hsn_code") + ), "has_variants": has_variant, "attributes": attributes or [], "stock_uom": product_dict.get("uom") or _("Nos"), @@ -201,6 +214,19 @@ def _update_hsn_sac_code(self, product_dict): break except Exception: frappe.log_error(title="_update_hsn_sac_code", message=frappe.get_traceback()) + if not (product_dict.get("gst_hsn_code")): + hsnsac_code = frappe.db.get_value( + "Item Group HSN SAC Code Mapping", + { + "parent": SETTING_DOCTYPE, + "item_group": product_dict.get("product_type"), + "hsnsac_code": ["is", "set"], + }, + "hsnsac_code", + ) + if hsnsac_code: + product_dict["gst_hsn_code"] = hsnsac_code + return product_dict def _get_attribute_value(self, variant_attr_val, attribute): @@ -212,13 +238,14 @@ def _get_attribute_value(self, variant_attr_val, attribute): ) return attribute_value[0][0] if len(attribute_value) > 0 else cint(variant_attr_val) - def _get_item_group(self, product_type=None): + def _get_item_group(self, product_type=None, hsnsac_code=None, sync_product_group=False): parent_item_group = get_root_of("Item Group") if not product_type: return parent_item_group if frappe.db.get_value("Item Group", product_type, "name"): + self._sync_item_group_hsn_sac_code(sync_product_group, product_type, hsnsac_code, False) return product_type item_group = frappe.get_doc( { @@ -226,10 +253,41 @@ def _get_item_group(self, product_type=None): "item_group_name": product_type, "parent_item_group": parent_item_group, "is_group": "No", + "gst_hsn_code": hsnsac_code, } ).insert() + self._sync_item_group_hsn_sac_code(sync_product_group, item_group, hsnsac_code) return item_group.name + def _update_hsn_code_in_item_group(self, product_type, hsnsac_code): + try: + if not (frappe.db.get_value("Item Group", product_type, "gst_hsn_code")) and hsnsac_code: + frappe.db.set_value("Item Group", product_type, "gst_hsn_code", hsnsac_code) + except Exception: + frappe.log_error(title="_update_hsn_code_in_item_group", message=frappe.get_traceback()) + + def _update_in_item_group_mapping(self, sync_product_group, product_type, hsnsac_code): + has_value_flag = False + for row in self.setting.item_group_hsn_sac_code_mapping: + if row.get("item_group") == product_type: + if hsnsac_code and row.get("hsnsac_code") != hsnsac_code: + row["hsnsac_code"] = hsnsac_code + has_value_flag = True + break + if not has_value_flag: + self._sync_item_group_hsn_sac_code(sync_product_group, product_type, hsnsac_code) + + def _sync_item_group_hsn_sac_code(self, sync_product_group, item_group, hsnsac_code=None, is_new=True): + if sync_product_group: + if is_new: + self.setting.append( + "item_group_hsn_sac_code_mapping", + {"item_group": item_group.name, "hsnsac_code": hsnsac_code}, + ) + else: + self._update_hsn_code_in_item_group(item_group, hsnsac_code) + self._update_in_item_group_mapping(sync_product_group, item_group, hsnsac_code) + def _get_supplier(self, product_dict): if product_dict.get("vendor"): supplier = frappe.db.sql( From 081a04354a1fd6b7f35564769f99aa41a560e7d7 Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 16:51:12 +0530 Subject: [PATCH 5/9] test: verify item group syncing to map HSN codes --- ecommerce_integrations/shopify/tests/test_product.py | 10 ++++++++++ ecommerce_integrations/shopify/tests/utils.py | 1 + 2 files changed, 11 insertions(+) diff --git a/ecommerce_integrations/shopify/tests/test_product.py b/ecommerce_integrations/shopify/tests/test_product.py index 78d04d240..c51366fc4 100644 --- a/ecommerce_integrations/shopify/tests/test_product.py +++ b/ecommerce_integrations/shopify/tests/test_product.py @@ -1,8 +1,11 @@ # Copyright (c) 2021, Frappe and Contributors # See LICENSE +import json + import frappe +from ecommerce_integrations.shopify.constants import SETTING_DOCTYPE from ecommerce_integrations.shopify.product import ShopifyProduct from .utils import TestCase @@ -25,6 +28,13 @@ def test_sync_single_product(self): ecommerce_item_exists = frappe.db.exists("Ecommerce Item", {"erpnext_item_code": item.name}) self.assertTrue(bool(ecommerce_item_exists)) + def test_sync_item_group(self): + self.fake("products/6704435495065", body=self.load_fixture("variant_product")) + product = ShopifyProduct(product_id="6704435495065") + product.sync_product(sync_product_group=1) + self.assertEqual(frappe.get_last_doc("Item Group").name, "shirt") + self.assertEqual(product.setting.shopify_item_group_hsn_mapping[0].item_group, "shirt") + def test_sync_product_with_variants(self): self.fake("products/6704435495065", body=self.load_fixture("variant_product")) diff --git a/ecommerce_integrations/shopify/tests/utils.py b/ecommerce_integrations/shopify/tests/utils.py index 8cc246c7d..cbaad18ae 100644 --- a/ecommerce_integrations/shopify/tests/utils.py +++ b/ecommerce_integrations/shopify/tests/utils.py @@ -77,6 +77,7 @@ def setUpClass(cls): "erpnext_warehouse": "_Test Warehouse 2 - _TC", }, ], + "shopify_item_group_hsn_mapping": [], } ).save(ignore_permissions=True) From 4c1964ea39cfa4d18932d33a1997401857fa0705 Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 16:51:38 +0530 Subject: [PATCH 6/9] chore: update table to Shopify Item Group HSN Mapping --- .../__init__.py | 0 .../shopify_item_group_hsn_mapping.json} | 2 +- .../shopify_item_group_hsn_mapping.py} | 2 +- .../doctype/shopify_setting/shopify_setting.json | 10 +++++----- ecommerce_integrations/shopify/product.py | 14 +++++++------- 5 files changed, 14 insertions(+), 14 deletions(-) rename ecommerce_integrations/shopify/doctype/{item_group_hsn_sac_code_mapping => shopify_item_group_hsn_mapping}/__init__.py (100%) rename ecommerce_integrations/shopify/doctype/{item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json => shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.json} (94%) rename ecommerce_integrations/shopify/doctype/{item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py => shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.py} (78%) diff --git a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/__init__.py b/ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/__init__.py similarity index 100% rename from ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/__init__.py rename to ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/__init__.py diff --git a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json b/ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.json similarity index 94% rename from ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json rename to ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.json index 752adc118..f99725152 100644 --- a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.json +++ b/ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.json @@ -30,7 +30,7 @@ "modified": "2024-12-06 16:01:12.105446", "modified_by": "Administrator", "module": "shopify", - "name": "Item Group HSN SAC Code Mapping", + "name": "Shopify Item Group HSN Mapping", "owner": "Administrator", "permissions": [], "sort_field": "creation", diff --git a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py b/ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.py similarity index 78% rename from ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py rename to ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.py index 67d2a0106..777ee6a66 100644 --- a/ecommerce_integrations/shopify/doctype/item_group_hsn_sac_code_mapping/item_group_hsn_sac_code_mapping.py +++ b/ecommerce_integrations/shopify/doctype/shopify_item_group_hsn_mapping/shopify_item_group_hsn_mapping.py @@ -5,5 +5,5 @@ from frappe.model.document import Document -class ItemGroupHSNSACCodeMapping(Document): +class ShopifyItemGroupHSNMapping(Document): pass diff --git a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json index df4f0aa14..29a974909 100644 --- a/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json +++ b/ecommerce_integrations/shopify/doctype/shopify_setting/shopify_setting.json @@ -52,7 +52,7 @@ "inventory_sync_frequency", "fetch_shopify_locations", "shopify_warehouse_mapping", - "item_group_hsn_sac_code_mapping", + "shopify_item_group_hsn_mapping", "sync_old_orders_section", "sync_old_orders", "column_break_45", @@ -390,16 +390,16 @@ "options": "Account" }, { - "fieldname": "item_group_hsn_sac_code_mapping", + "fieldname": "shopify_item_group_hsn_mapping", "fieldtype": "Table", - "label": "Item Group HSN SAC Code Mapping", - "options": "Item Group HSN SAC Code Mapping" + "label": "Shopify Item Group HSN Mapping", + "options": "Shopify Item Group HSN Mapping" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2024-12-06 16:06:02.733525", + "modified": "2024-12-10 16:31:44.145714", "modified_by": "Administrator", "module": "shopify", "name": "Shopify Setting", diff --git a/ecommerce_integrations/shopify/product.py b/ecommerce_integrations/shopify/product.py index 773f08ee5..dccc835a4 100644 --- a/ecommerce_integrations/shopify/product.py +++ b/ecommerce_integrations/shopify/product.py @@ -164,9 +164,9 @@ def _create_item(self, product_dict, warehouse, has_variant=0, attributes=None, ): ecommerce_item.create_ecommerce_item( MODULE_NAME, - integration_item_code, + str(integration_item_code), item_dict, - variant_id=variant_id, + variant_id=str(variant_id), sku=sku, variant_of=variant_of, has_variants=has_variant, @@ -216,7 +216,7 @@ def _update_hsn_sac_code(self, product_dict): frappe.log_error(title="_update_hsn_sac_code", message=frappe.get_traceback()) if not (product_dict.get("gst_hsn_code")): hsnsac_code = frappe.db.get_value( - "Item Group HSN SAC Code Mapping", + "Shopify Item Group HSN Mapping", { "parent": SETTING_DOCTYPE, "item_group": product_dict.get("product_type"), @@ -256,7 +256,7 @@ def _get_item_group(self, product_type=None, hsnsac_code=None, sync_product_grou "gst_hsn_code": hsnsac_code, } ).insert() - self._sync_item_group_hsn_sac_code(sync_product_group, item_group, hsnsac_code) + self._sync_item_group_hsn_sac_code(sync_product_group, product_type, hsnsac_code) return item_group.name def _update_hsn_code_in_item_group(self, product_type, hsnsac_code): @@ -268,7 +268,7 @@ def _update_hsn_code_in_item_group(self, product_type, hsnsac_code): def _update_in_item_group_mapping(self, sync_product_group, product_type, hsnsac_code): has_value_flag = False - for row in self.setting.item_group_hsn_sac_code_mapping: + for row in self.setting.shopify_item_group_hsn_mapping: if row.get("item_group") == product_type: if hsnsac_code and row.get("hsnsac_code") != hsnsac_code: row["hsnsac_code"] = hsnsac_code @@ -281,8 +281,8 @@ def _sync_item_group_hsn_sac_code(self, sync_product_group, item_group, hsnsac_c if sync_product_group: if is_new: self.setting.append( - "item_group_hsn_sac_code_mapping", - {"item_group": item_group.name, "hsnsac_code": hsnsac_code}, + "shopify_item_group_hsn_mapping", + {"item_group": item_group, "hsnsac_code": hsnsac_code}, ) else: self._update_hsn_code_in_item_group(item_group, hsnsac_code) From 3b76668e3a084a3b320c34d12a4e87de11184c31 Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 17:03:41 +0530 Subject: [PATCH 7/9] fix: remove unnecessary import --- ecommerce_integrations/shopify/tests/test_product.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ecommerce_integrations/shopify/tests/test_product.py b/ecommerce_integrations/shopify/tests/test_product.py index c51366fc4..3a7bf52a9 100644 --- a/ecommerce_integrations/shopify/tests/test_product.py +++ b/ecommerce_integrations/shopify/tests/test_product.py @@ -1,7 +1,6 @@ # Copyright (c) 2021, Frappe and Contributors # See LICENSE -import json import frappe From ee8066d0f35db5ea9cad38afb3c36dfd894cc9de Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 17:06:36 +0530 Subject: [PATCH 8/9] fix: remove unwanted lines --- ecommerce_integrations/shopify/tests/test_product.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ecommerce_integrations/shopify/tests/test_product.py b/ecommerce_integrations/shopify/tests/test_product.py index 3a7bf52a9..435663fdf 100644 --- a/ecommerce_integrations/shopify/tests/test_product.py +++ b/ecommerce_integrations/shopify/tests/test_product.py @@ -1,7 +1,6 @@ # Copyright (c) 2021, Frappe and Contributors # See LICENSE - import frappe from ecommerce_integrations.shopify.constants import SETTING_DOCTYPE From 529d5ba7e01329d646028fba52e9c74f00512cef Mon Sep 17 00:00:00 2001 From: DHINESH00 <18csa09@karpagamtech.ac.in> Date: Tue, 10 Dec 2024 20:14:35 +0530 Subject: [PATCH 9/9] refactor: database queries to use QueryBuilder/get_list --- ecommerce_integrations/shopify/product.py | 33 +++++++++++++---------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/ecommerce_integrations/shopify/product.py b/ecommerce_integrations/shopify/product.py index dccc835a4..1bfbb8131 100644 --- a/ecommerce_integrations/shopify/product.py +++ b/ecommerce_integrations/shopify/product.py @@ -3,6 +3,7 @@ import frappe import shopify from frappe import _, msgprint +from frappe.query_builder import DocType from frappe.utils import cint, cstr from frappe.utils.nestedset import get_root_of from shopify.resources import Product, Variant @@ -230,11 +231,12 @@ def _update_hsn_sac_code(self, product_dict): return product_dict def _get_attribute_value(self, variant_attr_val, attribute): - attribute_value = frappe.db.sql( - """select attribute_value from `tabItem Attribute Value` - where parent = %s and (abbr = %s or attribute_value = %s)""", - (attribute["attribute"], variant_attr_val, variant_attr_val), - as_list=1, + attribute_value = frappe.db.get_all( + "Item Attribute Value", + filters={"parent": attribute["attribute"]}, + or_filters={"abbr": variant_attr_val, "attribute_value": variant_attr_val}, + fields=["attribute_value"], + as_list=True, ) return attribute_value[0][0] if len(attribute_value) > 0 else cint(variant_attr_val) @@ -264,14 +266,14 @@ def _update_hsn_code_in_item_group(self, product_type, hsnsac_code): if not (frappe.db.get_value("Item Group", product_type, "gst_hsn_code")) and hsnsac_code: frappe.db.set_value("Item Group", product_type, "gst_hsn_code", hsnsac_code) except Exception: - frappe.log_error(title="_update_hsn_code_in_item_group", message=frappe.get_traceback()) + pass def _update_in_item_group_mapping(self, sync_product_group, product_type, hsnsac_code): has_value_flag = False for row in self.setting.shopify_item_group_hsn_mapping: if row.get("item_group") == product_type: if hsnsac_code and row.get("hsnsac_code") != hsnsac_code: - row["hsnsac_code"] = hsnsac_code + row.hsnsac_code = hsnsac_code has_value_flag = True break if not has_value_flag: @@ -290,13 +292,16 @@ def _sync_item_group_hsn_sac_code(self, sync_product_group, item_group, hsnsac_c def _get_supplier(self, product_dict): if product_dict.get("vendor"): - supplier = frappe.db.sql( - f"""select name from tabSupplier - where name = %s or {SUPPLIER_ID_FIELD} = %s """, - (product_dict.get("vendor"), product_dict.get("vendor").lower()), - as_list=1, - ) - + Supplier = DocType("Supplier") + + supplier = ( + frappe.qb.from_(Supplier) + .select(Supplier.name) + .where( + (Supplier.name == product_dict.get("vendor")) + | (Supplier[SUPPLIER_ID_FIELD] == product_dict.get("vendor").lower()) + ) + ).run(as_list=True) if supplier: return product_dict.get("vendor") supplier = frappe.get_doc(