def create_from_oc(site_name, customer_id, oc_order=None):
    if oc_order:
        customer_id = oc_order.get('customer_id')

    success, oc_customer = oc_api.get(site_name).get_customer(customer_id)

    if not success:
        frappe.throw('Cannot get Customer from Opencart site. Error: %s' % oc_customer.get('error') or 'Unknown')

    customer_group_id = oc_customer.get('customer_group_id', '')
    doc_customer_group = customer_groups.get(site_name, customer_group_id)

    if not doc_customer_group:
        frappe.throw('Could not found Customer Group with customer_group_id "%s"' % customer_group_id)

    default_price_list = doc_customer_group.get('default_price_list')
    territory_name = territories.DEFAULT
    if oc_order:
        if oc_order.get('shipping_iso_code_3') and oc_order.get('shipping_zone_code'):
            territory_name = territories.get_by_iso_code3(oc_order.get('shipping_iso_code_3'), oc_order.get('shipping_zone_code'))
        else:
            territory_name = territories.get_by_iso_code3(oc_order.get('payment_iso_code_3'), oc_order.get('payment_zone_code'))
    # create new Customer
    params = {
        'doctype': 'Customer',
        'customer_type': 'Individual',
        'territory': territory_name,
        'customer_name': make_full_name(oc_order.get('firstname'), oc_order.get('lastname')),
        'customer_group': doc_customer_group.get('name'),
        'naming_series': 'CUST-',
        'default_price_list': default_price_list,
        'oc_guest': 0,
        'oc_is_updating': 1,
        'oc_site': site_name,
        'oc_customer_id': customer_id,
        'oc_store_id': oc_customer.get('store_id') or '',
        'oc_status': 1,
        'oc_sync_from': True,
        'oc_last_sync_from': datetime.now(),
        'oc_sync_to': True,
        'oc_last_sync_to': datetime.now(),
        'oc_firstname': oc_order.get('firstname'),
        'oc_lastname': oc_order.get('lastname'),
        'oc_telephone': oc_order.get('telephone'),
        'oc_fax': oc_order.get('fax'),
        'oc_email': oc_order.get('email')
    }
    doc_customer = frappe.get_doc(params)
    doc_customer.insert(ignore_permissions=True)

    # addresses and contacts
    addresses.create_or_update(site_name, oc_customer, doc_customer)
    contacts.create_or_update(site_name, oc_customer, doc_customer)
    if oc_order:
        # addresses and contacts
        addresses.create_or_update_from_order(site_name, doc_customer, oc_order)
        contacts.create_or_update_from_order(site_name, doc_customer, oc_order)

    return doc_customer
def create_guest_from_order(site_name, oc_order):
    doc_store = oc_stores.get(site_name, oc_order.get('store_id'))
    if doc_store:
        customer_group_name = doc_store.get('oc_customer_group')
        if customer_group_name:
            doc_customer_group = frappe.get_doc('Customer Group', customer_group_name)
            default_price_list = doc_customer_group.get('default_price_list')
            if oc_order.get('shipping_iso_code_3') and oc_order.get('shipping_zone_code'):
                territory_name = territories.get_by_iso_code3(oc_order.get('shipping_iso_code_3'), oc_order.get('shipping_zone_code'))
            else:
                territory_name = territories.get_by_iso_code3(oc_order.get('payment_iso_code_3'), oc_order.get('payment_zone_code'))
            # create new Customer
            params = {
                'doctype': 'Customer',
                'customer_type': 'Individual',
                'territory': territory_name,
                'customer_name': make_full_name(oc_order.get('firstname'), oc_order.get('lastname')),
                'customer_group': doc_customer_group.get('name'),
                'naming_series': 'CUST-',
                'default_price_list': default_price_list,
                'oc_guest': 1,
                'oc_is_updating': 1,
                'oc_site': site_name,
                'oc_customer_id': oc_order.get('customer_id'),
                'oc_store_id': oc_order.get('store_id') or '',
                'oc_status': 1,
                'oc_sync_from': True,
                'oc_last_sync_from': datetime.now(),
                'oc_sync_to': True,
                'oc_last_sync_to': datetime.now(),
                'oc_firstname': oc_order.get('firstname'),
                'oc_lastname': oc_order.get('lastname'),
                'oc_telephone': oc_order.get('telephone'),
                'oc_fax': oc_order.get('fax'),
                'oc_email': oc_order.get('email')
            }
            doc_customer = frappe.get_doc(params)
            doc_customer.insert(ignore_permissions=True)

            # addresses and contacts
            addresses.create_or_update_from_order(site_name, doc_customer, oc_order)
            contacts.create_or_update_from_order(site_name, doc_customer, oc_order)

            return doc_customer
        else:
            frappe.throw('Customer Group is not set in Opencart Store "%s"' % doc_store.get('name'))
    else:
        frappe.throw('Opencart Store with store_id "%s" does not exist' % oc_order.get('store_id'))
def update_guest_from_order(doc_customer, oc_order):
    site_name = doc_customer.get('oc_site')
    doc_store = oc_stores.get(site_name, oc_order.get('store_id'))
    if doc_store:
        customer_group_name = doc_store.get('oc_customer_group')
        if customer_group_name:
            doc_customer_group = frappe.get_doc('Customer Group', customer_group_name)
            if oc_order.get('shipping_iso_code_3') and oc_order.get('shipping_zone_code'):
                territory_name = territories.get_by_iso_code3(oc_order.get('shipping_iso_code_3'), oc_order.get('shipping_zone_code'))
            else:
                territory_name = territories.get_by_iso_code3(oc_order.get('payment_iso_code_3'), oc_order.get('payment_zone_code'))
            # create new Customer
            doc_customer.update({
                'territory': territory_name,
                'customer_name': make_full_name(oc_order.get('firstname'), oc_order.get('lastname')),
                'customer_group': doc_customer_group.get('name'),
                'oc_is_updating': 1,
                'oc_customer_id': oc_order.get('customer_id'),
                'oc_store_id': oc_order.get('store_id') or '',
                'oc_last_sync_from': datetime.now(),
                'oc_firstname': oc_order.get('firstname'),
                'oc_lastname': oc_order.get('lastname'),
                'oc_telephone': oc_order.get('telephone'),
                'oc_fax': oc_order.get('fax'),
                'oc_email': oc_order.get('email')
            })
            doc_customer.save()

            # addresses and contacts
            addresses.create_or_update_from_order(site_name, doc_customer, oc_order)
            contacts.create_or_update_from_order(site_name, doc_customer, oc_order)

            return doc_customer
        else:
            frappe.throw('Customer Group is not set in Opencart Store "%s"' % doc_store.get('name'))
    else:
        frappe.throw('Opencart Store with store_id "%s" does not exist' % oc_order.get('store_id'))