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
diff --git a/erpnext/erpnext_integrations/connectors/woocommerce_connection.py b/erpnext/erpnext_integrations/connectors/woocommerce_connection.py
index 0b6ea8c..28c2ab9 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 @@
 		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 dd3c24d..956ae09 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 055684d..bd072f4 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.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 @@
 
 	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 fc850d5..ce0f47d 100644
--- a/erpnext/tests/test_woocommerce.py
+++ b/erpnext/tests/test_woocommerce.py
@@ -18,6 +18,7 @@
 			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"