Merge pull request #19097 from prssanna/shopify
fix(Integrations): Shopify Integration
This commit is contained in:
commit
509dcd9ad0
@ -19,6 +19,7 @@ def store_request_data(order=None, event=None):
|
|||||||
dump_request_data(order, event)
|
dump_request_data(order, event)
|
||||||
|
|
||||||
def sync_sales_order(order, request_id=None):
|
def sync_sales_order(order, request_id=None):
|
||||||
|
frappe.set_user('Administrator')
|
||||||
shopify_settings = frappe.get_doc("Shopify Settings")
|
shopify_settings = frappe.get_doc("Shopify Settings")
|
||||||
frappe.flags.request_id = request_id
|
frappe.flags.request_id = request_id
|
||||||
|
|
||||||
@ -33,6 +34,7 @@ def sync_sales_order(order, request_id=None):
|
|||||||
make_shopify_log(status="Success")
|
make_shopify_log(status="Success")
|
||||||
|
|
||||||
def prepare_sales_invoice(order, request_id=None):
|
def prepare_sales_invoice(order, request_id=None):
|
||||||
|
frappe.set_user('Administrator')
|
||||||
shopify_settings = frappe.get_doc("Shopify Settings")
|
shopify_settings = frappe.get_doc("Shopify Settings")
|
||||||
frappe.flags.request_id = request_id
|
frappe.flags.request_id = request_id
|
||||||
|
|
||||||
@ -45,6 +47,7 @@ def prepare_sales_invoice(order, request_id=None):
|
|||||||
make_shopify_log(status="Error", exception=True)
|
make_shopify_log(status="Error", exception=True)
|
||||||
|
|
||||||
def prepare_delivery_note(order, request_id=None):
|
def prepare_delivery_note(order, request_id=None):
|
||||||
|
frappe.set_user('Administrator')
|
||||||
shopify_settings = frappe.get_doc("Shopify Settings")
|
shopify_settings = frappe.get_doc("Shopify Settings")
|
||||||
frappe.flags.request_id = request_id
|
frappe.flags.request_id = request_id
|
||||||
|
|
||||||
@ -137,6 +140,7 @@ def create_sales_invoice(shopify_order, shopify_settings, so):
|
|||||||
si.naming_series = shopify_settings.sales_invoice_series or "SI-Shopify-"
|
si.naming_series = shopify_settings.sales_invoice_series or "SI-Shopify-"
|
||||||
si.flags.ignore_mandatory = True
|
si.flags.ignore_mandatory = True
|
||||||
set_cost_center(si.items, shopify_settings.cost_center)
|
set_cost_center(si.items, shopify_settings.cost_center)
|
||||||
|
si.insert(ignore_mandatory=True)
|
||||||
si.submit()
|
si.submit()
|
||||||
make_payament_entry_against_sales_invoice(si, shopify_settings)
|
make_payament_entry_against_sales_invoice(si, shopify_settings)
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
@ -151,6 +155,7 @@ def make_payament_entry_against_sales_invoice(doc, shopify_settings):
|
|||||||
payemnt_entry.flags.ignore_mandatory = True
|
payemnt_entry.flags.ignore_mandatory = True
|
||||||
payemnt_entry.reference_no = doc.name
|
payemnt_entry.reference_no = doc.name
|
||||||
payemnt_entry.reference_date = nowdate()
|
payemnt_entry.reference_date = nowdate()
|
||||||
|
payemnt_entry.insert(ignore_permissions=True)
|
||||||
payemnt_entry.submit()
|
payemnt_entry.submit()
|
||||||
|
|
||||||
def create_delivery_note(shopify_order, shopify_settings, so):
|
def create_delivery_note(shopify_order, shopify_settings, so):
|
||||||
@ -168,6 +173,7 @@ def create_delivery_note(shopify_order, shopify_settings, so):
|
|||||||
dn.items = get_fulfillment_items(dn.items, fulfillment.get("line_items"), shopify_settings)
|
dn.items = get_fulfillment_items(dn.items, fulfillment.get("line_items"), shopify_settings)
|
||||||
dn.flags.ignore_mandatory = True
|
dn.flags.ignore_mandatory = True
|
||||||
dn.save()
|
dn.save()
|
||||||
|
dn.submit()
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
|
|
||||||
def get_fulfillment_items(dn_items, fulfillment_items, shopify_settings):
|
def get_fulfillment_items(dn_items, fulfillment_items, shopify_settings):
|
||||||
@ -200,7 +206,7 @@ def get_order_items(order_items, shopify_settings):
|
|||||||
"rate": shopify_item.get("price"),
|
"rate": shopify_item.get("price"),
|
||||||
"delivery_date": nowdate(),
|
"delivery_date": nowdate(),
|
||||||
"qty": shopify_item.get("quantity"),
|
"qty": shopify_item.get("quantity"),
|
||||||
"stock_uom": shopify_item.get("sku"),
|
"stock_uom": shopify_item.get("uom") or _("Nos"),
|
||||||
"warehouse": shopify_settings.warehouse
|
"warehouse": shopify_settings.warehouse
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -21,33 +21,22 @@ class ShopifySettings(Document):
|
|||||||
else:
|
else:
|
||||||
self.unregister_webhooks()
|
self.unregister_webhooks()
|
||||||
|
|
||||||
self.validate_app_type()
|
|
||||||
|
|
||||||
def validate_access_credentials(self):
|
def validate_access_credentials(self):
|
||||||
if self.app_type == "Private":
|
if not (self.get_password(raise_exception=False) and self.api_key and self.shopify_url):
|
||||||
if not (self.get_password(raise_exception=False) and self.api_key and self.shopify_url):
|
frappe.msgprint(_("Missing value for Password, API Key or Shopify URL"), raise_exception=frappe.ValidationError)
|
||||||
frappe.msgprint(_("Missing value for Password, API Key or Shopify URL"), raise_exception=frappe.ValidationError)
|
|
||||||
|
|
||||||
else:
|
|
||||||
if not (self.access_token and self.shopify_url):
|
|
||||||
frappe.msgprint(_("Access token or Shopify URL missing"), raise_exception=frappe.ValidationError)
|
|
||||||
|
|
||||||
def validate_app_type(self):
|
|
||||||
if self.app_type == "Public":
|
|
||||||
frappe.throw(_("Support for public app is deprecated. Please setup private app, for more details refer user manual"))
|
|
||||||
|
|
||||||
def register_webhooks(self):
|
def register_webhooks(self):
|
||||||
webhooks = ["orders/create", "orders/paid", "orders/fulfilled"]
|
webhooks = ["orders/create", "orders/paid", "orders/fulfilled"]
|
||||||
|
# url = get_shopify_url('admin/webhooks.json', self)
|
||||||
url = get_shopify_url('admin/webhooks.json', self)
|
|
||||||
created_webhooks = [d.method for d in self.webhooks]
|
created_webhooks = [d.method for d in self.webhooks]
|
||||||
|
url = get_shopify_url('admin/api/2019-04/webhooks.json', self)
|
||||||
|
print('url', url)
|
||||||
for method in webhooks:
|
for method in webhooks:
|
||||||
if method in created_webhooks:
|
print('method', method)
|
||||||
continue
|
|
||||||
|
|
||||||
session = get_request_session()
|
session = get_request_session()
|
||||||
|
print('session', session)
|
||||||
try:
|
try:
|
||||||
|
print(get_header(self))
|
||||||
d = session.post(url, data=json.dumps({
|
d = session.post(url, data=json.dumps({
|
||||||
"webhook": {
|
"webhook": {
|
||||||
"topic": method,
|
"topic": method,
|
||||||
@ -55,6 +44,7 @@ class ShopifySettings(Document):
|
|||||||
"format": "json"
|
"format": "json"
|
||||||
}
|
}
|
||||||
}), headers=get_header(self))
|
}), headers=get_header(self))
|
||||||
|
print('d', d.json())
|
||||||
d.raise_for_status()
|
d.raise_for_status()
|
||||||
self.update_webhook_table(method, d.json())
|
self.update_webhook_table(method, d.json())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -65,7 +55,7 @@ class ShopifySettings(Document):
|
|||||||
deleted_webhooks = []
|
deleted_webhooks = []
|
||||||
|
|
||||||
for d in self.webhooks:
|
for d in self.webhooks:
|
||||||
url = get_shopify_url('admin/webhooks/{0}.json'.format(d.webhook_id), self)
|
url = get_shopify_url('admin/api/2019-04/webhooks.json'.format(d.webhook_id), self)
|
||||||
try:
|
try:
|
||||||
res = session.delete(url, headers=get_header(self))
|
res = session.delete(url, headers=get_header(self))
|
||||||
res.raise_for_status()
|
res.raise_for_status()
|
||||||
@ -77,6 +67,7 @@ class ShopifySettings(Document):
|
|||||||
self.remove(d)
|
self.remove(d)
|
||||||
|
|
||||||
def update_webhook_table(self, method, res):
|
def update_webhook_table(self, method, res):
|
||||||
|
print('update')
|
||||||
self.append("webhooks", {
|
self.append("webhooks", {
|
||||||
"webhook_id": res['webhook']['id'],
|
"webhook_id": res['webhook']['id'],
|
||||||
"method": method
|
"method": method
|
||||||
@ -84,6 +75,7 @@ class ShopifySettings(Document):
|
|||||||
|
|
||||||
def get_shopify_url(path, settings):
|
def get_shopify_url(path, settings):
|
||||||
if settings.app_type == "Private":
|
if settings.app_type == "Private":
|
||||||
|
print(settings.api_key, settings.get_password('password'), settings.shopify_url, path)
|
||||||
return 'https://{}:{}@{}/{}'.format(settings.api_key, settings.get_password('password'), settings.shopify_url, path)
|
return 'https://{}:{}@{}/{}'.format(settings.api_key, settings.get_password('password'), settings.shopify_url, path)
|
||||||
else:
|
else:
|
||||||
return 'https://{}/{}'.format(settings.shopify_url, path)
|
return 'https://{}/{}'.format(settings.shopify_url, path)
|
||||||
@ -91,11 +83,7 @@ def get_shopify_url(path, settings):
|
|||||||
def get_header(settings):
|
def get_header(settings):
|
||||||
header = {'Content-Type': 'application/json'}
|
header = {'Content-Type': 'application/json'}
|
||||||
|
|
||||||
if settings.app_type == "Private":
|
return header;
|
||||||
return header
|
|
||||||
else:
|
|
||||||
header["X-Shopify-Access-Token"] = settings.access_token
|
|
||||||
return header
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_series():
|
def get_series():
|
||||||
|
|||||||
@ -21,7 +21,7 @@ def create_customer(shopify_customer, shopify_settings):
|
|||||||
"customer_type": _("Individual")
|
"customer_type": _("Individual")
|
||||||
})
|
})
|
||||||
customer.flags.ignore_mandatory = True
|
customer.flags.ignore_mandatory = True
|
||||||
customer.insert()
|
customer.insert(ignore_permissions=True)
|
||||||
|
|
||||||
if customer:
|
if customer:
|
||||||
create_customer_address(customer, shopify_customer)
|
create_customer_address(customer, shopify_customer)
|
||||||
|
|||||||
@ -1,13 +1,14 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
|
from erpnext import get_default_company
|
||||||
from frappe.utils import cstr, cint, get_request_session
|
from frappe.utils import cstr, cint, get_request_session
|
||||||
from erpnext.erpnext_integrations.doctype.shopify_settings.shopify_settings import get_shopify_url, get_header
|
from erpnext.erpnext_integrations.doctype.shopify_settings.shopify_settings import get_shopify_url, get_header
|
||||||
|
|
||||||
shopify_variants_attr_list = ["option1", "option2", "option3"]
|
shopify_variants_attr_list = ["option1", "option2", "option3"]
|
||||||
|
|
||||||
def sync_item_from_shopify(shopify_settings, item):
|
def sync_item_from_shopify(shopify_settings, item):
|
||||||
url = get_shopify_url("/admin/products/{0}.json".format(item.get("product_id")), shopify_settings)
|
url = get_shopify_url("admin/api/2019-04/products/{0}.json".format(item.get("product_id")), shopify_settings)
|
||||||
session = get_request_session()
|
session = get_request_session()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -107,7 +108,12 @@ def create_item(shopify_item, warehouse, has_variant=0, attributes=None,variant_
|
|||||||
"image": get_item_image(shopify_item),
|
"image": get_item_image(shopify_item),
|
||||||
"weight_uom": shopify_item.get("weight_unit"),
|
"weight_uom": shopify_item.get("weight_unit"),
|
||||||
"weight_per_unit": shopify_item.get("weight"),
|
"weight_per_unit": shopify_item.get("weight"),
|
||||||
"default_supplier": get_supplier(shopify_item)
|
"default_supplier": get_supplier(shopify_item),
|
||||||
|
"item_defaults": [
|
||||||
|
{
|
||||||
|
"company": get_default_company()
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if not is_item_exists(item_dict, attributes, variant_of=variant_of):
|
if not is_item_exists(item_dict, attributes, variant_of=variant_of):
|
||||||
@ -116,7 +122,7 @@ def create_item(shopify_item, warehouse, has_variant=0, attributes=None,variant_
|
|||||||
|
|
||||||
if not item_details:
|
if not item_details:
|
||||||
new_item = frappe.get_doc(item_dict)
|
new_item = frappe.get_doc(item_dict)
|
||||||
new_item.insert()
|
new_item.insert(ignore_permissions=True, ignore_mandatory=True)
|
||||||
name = new_item.name
|
name = new_item.name
|
||||||
|
|
||||||
if not name:
|
if not name:
|
||||||
|
|||||||
@ -40,6 +40,7 @@ class ShopifySettings(unittest.TestCase):
|
|||||||
"price_list": "_Test Price List",
|
"price_list": "_Test Price List",
|
||||||
"warehouse": "_Test Warehouse - _TC",
|
"warehouse": "_Test Warehouse - _TC",
|
||||||
"cash_bank_account": "Cash - _TC",
|
"cash_bank_account": "Cash - _TC",
|
||||||
|
"account": "Cash - _TC",
|
||||||
"customer_group": "_Test Customer Group",
|
"customer_group": "_Test Customer Group",
|
||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"taxes": [
|
"taxes": [
|
||||||
|
|||||||
@ -40,4 +40,4 @@ def get_webhook_address(connector_name, method, exclude_uri=False):
|
|||||||
|
|
||||||
server_url = '{uri.scheme}://{uri.netloc}/api/method/{endpoint}'.format(uri=urlparse(url), endpoint=endpoint)
|
server_url = '{uri.scheme}://{uri.netloc}/api/method/{endpoint}'.format(uri=urlparse(url), endpoint=endpoint)
|
||||||
|
|
||||||
return server_url
|
return server_url
|
||||||
|
|||||||
@ -638,3 +638,5 @@ erpnext.patches.v12_0.add_variant_of_in_item_attribute_table
|
|||||||
erpnext.patches.v12_0.rename_bank_account_field_in_journal_entry_account
|
erpnext.patches.v12_0.rename_bank_account_field_in_journal_entry_account
|
||||||
erpnext.patches.v12_0.create_default_energy_point_rules
|
erpnext.patches.v12_0.create_default_energy_point_rules
|
||||||
erpnext.patches.v12_0.set_produced_qty_field_in_sales_order_for_work_order
|
erpnext.patches.v12_0.set_produced_qty_field_in_sales_order_for_work_order
|
||||||
|
erpnext.patches.v12_0.generate_leave_ledger_entries
|
||||||
|
erpnext.patches.v12_0.set_default_shopify_app_type
|
||||||
|
|||||||
6
erpnext/patches/v12_0/set_default_shopify_app_type.py
Normal file
6
erpnext/patches/v12_0/set_default_shopify_app_type.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doc('erpnext_integrations', 'doctype', 'shopify_settings')
|
||||||
|
frappe.db.set_value('Shopify Settings', None, 'app_type', 'Private')
|
||||||
Loading…
x
Reference in New Issue
Block a user