From b455318f01040b9ddbfc239e25905f4064b9ad26 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 7 Nov 2019 18:20:32 +0530 Subject: [PATCH] fix(Integration): Woocommerce issues (#19487) * fix: Delivery URL returned response code 500 * fix: set default company in Woocommerce Settings * fix: remove redundant function calls * fix: make offset configurable for delivery date in sales order * fix: remove redundant code from woocommerce_settings.py * fix: import create_custom_field * fix: added ignore_mandatory for saving item, customer and sales order * fix: remove unused woocommerce_check custom field * fix: do not delete custom fields or item group when sync is disabled --- .../connectors/woocommerce_connection.py | 254 +++---- .../woocommerce_settings.json | 639 ++---------------- .../woocommerce_settings.py | 75 +- erpnext/tests/test_woocommerce.py | 1 + 4 files changed, 177 insertions(+), 792 deletions(-) diff --git a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py index 0b6ea8cc7c..28c2ab9e54 100644 --- a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py +++ b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py @@ -1,10 +1,8 @@ from __future__ import unicode_literals import frappe, base64, hashlib, hmac, json -import datetime from frappe import _ - def verify_request(): woocommerce_settings = frappe.get_doc("Woocommerce Settings") sig = base64.b64encode( @@ -30,191 +28,149 @@ def order(*args, **kwargs): frappe.log_error(error_message, "WooCommerce Error") raise - def _order(*args, **kwargs): woocommerce_settings = frappe.get_doc("Woocommerce Settings") if frappe.flags.woocomm_test_order_data: - fd = frappe.flags.woocomm_test_order_data + order = frappe.flags.woocomm_test_order_data event = "created" elif frappe.request and frappe.request.data: verify_request() - fd = json.loads(frappe.request.data) + try: + order = json.loads(frappe.request.data) + except ValueError: + #woocommerce returns 'webhook_id=value' for the first request which is not JSON + order = frappe.request.data event = frappe.get_request_header("X-Wc-Webhook-Event") else: return "success" if event == "created": - raw_billing_data = fd.get("billing") - customer_woo_com_email = raw_billing_data.get("email") - - if frappe.get_value("Customer",{"woocommerce_email": customer_woo_com_email}): - # Edit - link_customer_and_address(raw_billing_data,1) - else: - # Create - link_customer_and_address(raw_billing_data,0) - - - items_list = fd.get("line_items") - for item in items_list: - - item_woo_com_id = item.get("product_id") - - if frappe.get_value("Item",{"woocommerce_id": item_woo_com_id}): - #Edit - link_item(item,1) - else: - link_item(item,0) - - + raw_billing_data = order.get("billing") customer_name = raw_billing_data.get("first_name") + " " + raw_billing_data.get("last_name") + link_customer_and_address(raw_billing_data, customer_name) + link_items(order.get("line_items"), woocommerce_settings) + create_sales_order(order, woocommerce_settings, customer_name) - new_sales_order = frappe.new_doc("Sales Order") - new_sales_order.customer = customer_name - - created_date = fd.get("date_created").split("T") - new_sales_order.transaction_date = created_date[0] - - new_sales_order.po_no = fd.get("id") - new_sales_order.woocommerce_id = fd.get("id") - new_sales_order.naming_series = woocommerce_settings.sales_order_series or "SO-WOO-" - - placed_order_date = created_date[0] - raw_date = datetime.datetime.strptime(placed_order_date, "%Y-%m-%d") - raw_delivery_date = frappe.utils.add_to_date(raw_date,days = 7) - order_delivery_date_str = raw_delivery_date.strftime('%Y-%m-%d') - order_delivery_date = str(order_delivery_date_str) - - new_sales_order.delivery_date = order_delivery_date - default_set_company = frappe.get_doc("Global Defaults") - company = raw_billing_data.get("company") or default_set_company.default_company - found_company = frappe.get_doc("Company",{"name":company}) - company_abbr = found_company.abbr - - new_sales_order.company = company - - for item in items_list: - woocomm_item_id = item.get("product_id") - found_item = frappe.get_doc("Item",{"woocommerce_id": woocomm_item_id}) - - ordered_items_tax = item.get("total_tax") - - new_sales_order.append("items",{ - "item_code": found_item.item_code, - "item_name": found_item.item_name, - "description": found_item.item_name, - "delivery_date":order_delivery_date, - "uom": woocommerce_settings.uom or _("Nos"), - "qty": item.get("quantity"), - "rate": item.get("price"), - "warehouse": woocommerce_settings.warehouse or "Stores" + " - " + company_abbr - }) - - add_tax_details(new_sales_order,ordered_items_tax,"Ordered Item tax",0) - - # shipping_details = fd.get("shipping_lines") # used for detailed order - shipping_total = fd.get("shipping_total") - shipping_tax = fd.get("shipping_tax") - - add_tax_details(new_sales_order,shipping_tax,"Shipping Tax",1) - add_tax_details(new_sales_order,shipping_total,"Shipping Total",1) - - new_sales_order.submit() - - frappe.db.commit() - -def link_customer_and_address(raw_billing_data,customer_status): - - if customer_status == 0: - # create +def link_customer_and_address(raw_billing_data, customer_name): + customer_woo_com_email = raw_billing_data.get("email") + customer_exists = frappe.get_value("Customer", {"woocommerce_email": customer_woo_com_email}) + if not customer_exists: + # Create Customer customer = frappe.new_doc("Customer") - address = frappe.new_doc("Address") - - if customer_status == 1: - # Edit - customer_woo_com_email = raw_billing_data.get("email") - customer = frappe.get_doc("Customer",{"woocommerce_email": customer_woo_com_email}) + else: + # Edit Customer + customer = frappe.get_doc("Customer", {"woocommerce_email": customer_woo_com_email}) old_name = customer.customer_name - full_name = str(raw_billing_data.get("first_name"))+ " "+str(raw_billing_data.get("last_name")) - customer.customer_name = full_name - customer.woocommerce_email = str(raw_billing_data.get("email")) - customer.save() - frappe.db.commit() + customer.customer_name = customer_name + customer.woocommerce_email = customer_woo_com_email + customer.flags.ignore_mandatory = True + customer.save() - if customer_status == 1: - frappe.rename_doc("Customer", old_name, full_name) - address = frappe.get_doc("Address",{"woocommerce_email":customer_woo_com_email}) - customer = frappe.get_doc("Customer",{"woocommerce_email": customer_woo_com_email}) + if customer_exists: + frappe.rename_doc("Customer", old_name, customer_name) + address = frappe.get_doc("Address", {"woocommerce_email": customer_woo_com_email}) + else: + address = frappe.new_doc("Address") address.address_line1 = raw_billing_data.get("address_1", "Not Provided") address.address_line2 = raw_billing_data.get("address_2", "Not Provided") address.city = raw_billing_data.get("city", "Not Provided") - address.woocommerce_email = str(raw_billing_data.get("email")) - address.address_type = "Shipping" - address.country = frappe.get_value("Country", filters={"code":raw_billing_data.get("country", "IN").lower()}) - address.state = raw_billing_data.get("state") - address.pincode = str(raw_billing_data.get("postcode")) - address.phone = str(raw_billing_data.get("phone")) - address.email_id = str(raw_billing_data.get("email")) - + address.woocommerce_email = customer_woo_com_email + address.address_type = "Billing" + address.country = frappe.get_value("Country", {"code": raw_billing_data.get("country", "IN").lower()}) + address.state = raw_billing_data.get("state") + address.pincode = raw_billing_data.get("postcode") + address.phone = raw_billing_data.get("phone") + address.email_id = customer_woo_com_email address.append("links", { "link_doctype": "Customer", "link_name": customer.customer_name }) + address.flags.ignore_mandatory = True + address = address.save() - address.save() - frappe.db.commit() - - if customer_status == 1: - - address = frappe.get_doc("Address",{"woocommerce_email":customer_woo_com_email}) + if customer_exists: old_address_title = address.name - new_address_title = customer.customer_name+"-billing" + new_address_title = customer.customer_name + "-billing" address.address_title = customer.customer_name address.save() - frappe.rename_doc("Address",old_address_title,new_address_title) + frappe.rename_doc("Address", old_address_title, new_address_title) - frappe.db.commit() - -def link_item(item_data,item_status): - woocommerce_settings = frappe.get_doc("Woocommerce Settings") - - if item_status == 0: - #Create Item - item = frappe.new_doc("Item") - - if item_status == 1: - #Edit Item +def link_items(items_list, woocommerce_settings): + for item_data in items_list: item_woo_com_id = item_data.get("product_id") - item = frappe.get_doc("Item",{"woocommerce_id": item_woo_com_id}) - item.item_name = str(item_data.get("name")) - item.item_code = "woocommerce - " + str(item_data.get("product_id")) - item.woocommerce_id = str(item_data.get("product_id")) - item.item_group = _("WooCommerce Products") - item.stock_uom = woocommerce_settings.uom or _("Nos") - item.save() + if frappe.get_value("Item", {"woocommerce_id": item_woo_com_id}): + #Edit Item + item = frappe.get_doc("Item", {"woocommerce_id": item_woo_com_id}) + else: + #Create Item + item = frappe.new_doc("Item") + + item.item_name = item_data.get("name") + item.item_code = _("woocommerce - {0}").format(item_data.get("product_id")) + item.woocommerce_id = item_data.get("product_id") + item.item_group = _("WooCommerce Products") + item.stock_uom = woocommerce_settings.uom or _("Nos") + item.flags.ignore_mandatory = True + item.save() + +def create_sales_order(order, woocommerce_settings, customer_name): + new_sales_order = frappe.new_doc("Sales Order") + new_sales_order.customer = customer_name + + new_sales_order.po_no = new_sales_order.woocommerce_id = order.get("id") + new_sales_order.naming_series = woocommerce_settings.sales_order_series or "SO-WOO-" + + created_date = order.get("date_created").split("T") + new_sales_order.transaction_date = created_date[0] + delivery_after = woocommerce_settings.delivery_after_days or 7 + new_sales_order.delivery_date = frappe.utils.add_days(created_date[0], delivery_after) + + new_sales_order.company = woocommerce_settings.company + + set_items_in_sales_order(new_sales_order, woocommerce_settings, order) + new_sales_order.flags.ignore_mandatory = True + new_sales_order.insert() + new_sales_order.submit() + frappe.db.commit() -def add_tax_details(sales_order,price,desc,status): +def set_items_in_sales_order(new_sales_order, woocommerce_settings, order): + company_abbr = frappe.db.get_value('Company', woocommerce_settings.company, 'abbr') - woocommerce_settings = frappe.get_doc("Woocommerce Settings") + for item in order.get("line_items"): + woocomm_item_id = item.get("product_id") + found_item = frappe.get_doc("Item", {"woocommerce_id": woocomm_item_id}) - if status == 0: - # Product taxes - account_head_type = woocommerce_settings.tax_account + ordered_items_tax = item.get("total_tax") - if status == 1: - # Shipping taxes - account_head_type = woocommerce_settings.f_n_f_account + new_sales_order.append("items",{ + "item_code": found_item.item_code, + "item_name": found_item.item_name, + "description": found_item.item_name, + "delivery_date": new_sales_order.delivery_date, + "uom": woocommerce_settings.uom or _("Nos"), + "qty": item.get("quantity"), + "rate": item.get("price"), + "warehouse": woocommerce_settings.warehouse or _("Stores - {0}").format(company_abbr) + }) - sales_order.append("taxes",{ - "charge_type":"Actual", - "account_head": account_head_type, - "tax_amount": price, - "description": desc - }) + add_tax_details(new_sales_order, ordered_items_tax, "Ordered Item tax", woocommerce_settings.tax_account) + + # shipping_details = order.get("shipping_lines") # used for detailed order + + add_tax_details(new_sales_order, order.get("shipping_tax"), "Shipping Tax", woocommerce_settings.f_n_f_account) + add_tax_details(new_sales_order, order.get("shipping_total"), "Shipping Total", woocommerce_settings.f_n_f_account) + +def add_tax_details(sales_order, price, desc, tax_account_head): + sales_order.append("taxes", { + "charge_type":"Actual", + "account_head": tax_account_head, + "tax_amount": price, + "description": desc + }) diff --git a/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.json b/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.json index dd3c24dce5..956ae09cbd 100644 --- a/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.json +++ b/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.json @@ -1,694 +1,175 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, "creation": "2018-02-12 15:10:05.495713", - "custom": 0, - "docstatus": 0, "doctype": "DocType", - "document_type": "", "editable_grid": 1, "engine": "InnoDB", + "field_order": [ + "enable_sync", + "sb_00", + "woocommerce_server_url", + "secret", + "cb_00", + "api_consumer_key", + "api_consumer_secret", + "sb_accounting_details", + "tax_account", + "column_break_10", + "f_n_f_account", + "defaults_section", + "creation_user", + "warehouse", + "sales_order_series", + "column_break_14", + "company", + "delivery_after_days", + "uom", + "endpoints", + "endpoint" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, + "default": "0", "fieldname": "enable_sync", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Enable Sync", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Enable Sync" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "sb_00", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Section Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "woocommerce_server_url", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, - "label": "Woocommerce Server URL", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Woocommerce Server URL" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "secret", "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Secret", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "cb_00", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "api_consumer_key", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, - "label": "API consumer key", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "API consumer key" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "api_consumer_secret", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, - "label": "API consumer secret", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "API consumer secret" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "sb_accounting_details", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Accounting Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Accounting Details" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "tax_account", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Tax Account", - "length": 0, - "no_copy": 0, "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "column_break_10", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "f_n_f_account", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Freight and Forwarding Account", - "length": 0, - "no_copy": 0, "options": "Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "defaults_section", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Defaults", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Defaults" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "description": "The user that will be used to create Customers, Items and Sales Orders. This user should have the relevant permissions.", - "fetch_if_empty": 0, "fieldname": "creation_user", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Creation User", - "length": 0, - "no_copy": 0, "options": "User", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "This warehouse will be used to create Sale Orders. The fallback warehouse is \"Stores\".", - "fetch_if_empty": 0, + "description": "This warehouse will be used to create Sales Orders. The fallback warehouse is \"Stores\".", "fieldname": "warehouse", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Warehouse", - "length": 0, - "no_copy": 0, - "options": "Warehouse", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Warehouse" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "column_break_14", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "description": "The fallback series is \"SO-WOO-\".", - "fetch_if_empty": 0, "fieldname": "sales_order_series", "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Sales Order Series", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Sales Order Series" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "description": "This is the default UOM used for items and Sales orders. The fallback UOM is \"Nos\".", - "fetch_if_empty": 0, "fieldname": "uom", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "UOM", - "length": 0, - "no_copy": 0, - "options": "UOM", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "UOM" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "endpoints", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Endpoints", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Endpoints" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "endpoint", "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Endpoint", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 + }, + { + "description": "This company will be used to create Sales Orders.", + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company", + "reqd": 1 + }, + { + "description": "This is the default offset (days) for the Delivery Date in Sales Orders. The fallback offset is 7 days from the order placement date.", + "fieldname": "delivery_after_days", + "fieldtype": "Int", + "label": "Delivery After (Days)" } ], - "has_web_view": 0, - "hide_toolbar": 0, - "idx": 0, - "in_create": 0, - "is_submittable": 0, "issingle": 1, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2019-04-08 17:04:16.720696", + "modified": "2019-11-04 00:45:21.232096", "modified_by": "Administrator", "module": "ERPNext Integrations", "name": "Woocommerce Settings", - "name_case": "", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, "create": 1, - "delete": 0, "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, - "report": 0, "role": "System Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 } ], "quick_entry": 1, - "read_only": 0, - "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py b/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py index 055684d445..bd072f40a1 100644 --- a/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py +++ b/erpnext/erpnext_integrations/doctype/woocommerce_settings/woocommerce_settings.py @@ -8,6 +8,7 @@ from frappe import _ from frappe.utils.nestedset import get_root_of from frappe.model.document import Document from six.moves.urllib.parse import urlparse +from frappe.custom.doctype.custom_field.custom_field import create_custom_field class WoocommerceSettings(Document): def validate(self): @@ -17,75 +18,21 @@ class WoocommerceSettings(Document): def create_delete_custom_fields(self): if self.enable_sync: + custom_fields = {} # create - create_custom_field_id_and_check_status = False - create_custom_field_email_check = False - names = ["Customer-woocommerce_id","Sales Order-woocommerce_id","Item-woocommerce_id","Address-woocommerce_id"] - names_check_box = ["Customer-woocommerce_check","Sales Order-woocommerce_check","Item-woocommerce_check","Address-woocommerce_check"] - email_names = ["Customer-woocommerce_email","Address-woocommerce_email"] + for doctype in ["Customer", "Sales Order", "Item", "Address"]: + df = dict(fieldname='woocommerce_id', label='Woocommerce ID', fieldtype='Data', read_only=1, print_hide=1) + create_custom_field(doctype, df) - for i in zip(names,names_check_box): - - if not frappe.get_value("Custom Field",{"name":i[0]}) or not frappe.get_value("Custom Field",{"name":i[1]}): - create_custom_field_id_and_check_status = True - break - - - if create_custom_field_id_and_check_status: - names = ["Customer","Sales Order","Item","Address"] - for name in names: - custom = frappe.new_doc("Custom Field") - custom.dt = name - custom.label = "woocommerce_id" - custom.read_only = 1 - custom.save() - - custom = frappe.new_doc("Custom Field") - custom.dt = name - custom.label = "woocommerce_check" - custom.fieldtype = "Check" - custom.read_only = 1 - custom.save() - - for i in email_names: - - if not frappe.get_value("Custom Field",{"name":i}): - create_custom_field_email_check = True - break; - - if create_custom_field_email_check: - names = ["Customer","Address"] - for name in names: - custom = frappe.new_doc("Custom Field") - custom.dt = name - custom.label = "woocommerce_email" - custom.read_only = 1 - custom.save() - - if not frappe.get_value("Item Group",{"name": _("WooCommerce Products")}): + for doctype in ["Customer", "Address"]: + df = dict(fieldname='woocommerce_email', label='Woocommerce Email', fieldtype='Data', read_only=1, print_hide=1) + create_custom_field(doctype, df) + + if not frappe.get_value("Item Group", {"name": _("WooCommerce Products")}): item_group = frappe.new_doc("Item Group") item_group.item_group_name = _("WooCommerce Products") item_group.parent_item_group = get_root_of("Item Group") - item_group.save() - - - elif not self.enable_sync: - # delete - names = ["Customer-woocommerce_id","Sales Order-woocommerce_id","Item-woocommerce_id","Address-woocommerce_id"] - names_check_box = ["Customer-woocommerce_check","Sales Order-woocommerce_check","Item-woocommerce_check","Address-woocommerce_check"] - email_names = ["Customer-woocommerce_email","Address-woocommerce_email"] - for name in names: - frappe.delete_doc("Custom Field",name) - - for name in names_check_box: - frappe.delete_doc("Custom Field",name) - - for name in email_names: - frappe.delete_doc("Custom Field",name) - - frappe.delete_doc("Item Group", _("WooCommerce Products")) - - frappe.db.commit() + item_group.insert() def validate_settings(self): if self.enable_sync: diff --git a/erpnext/tests/test_woocommerce.py b/erpnext/tests/test_woocommerce.py index fc850d57d7..ce0f47d685 100644 --- a/erpnext/tests/test_woocommerce.py +++ b/erpnext/tests/test_woocommerce.py @@ -18,6 +18,7 @@ class TestWoocommerce(unittest.TestCase): woo_settings.api_consumer_key = "ck_fd43ff5756a6abafd95fadb6677100ce95a758a1" woo_settings.api_consumer_secret = "cs_94360a1ad7bef7fa420a40cf284f7b3e0788454e" woo_settings.enable_sync = 1 + woo_settings.company = "Woocommerce" woo_settings.tax_account = "Sales Expenses - W" woo_settings.f_n_f_account = "Expenses - W" woo_settings.creation_user = "Administrator"