From b718c0f1601ed4a03249e59f546f6ef3acc13882 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Fri, 20 Mar 2020 12:44:25 -0700 Subject: [PATCH] IMP `connector_opencart` Support orders with 'coupons' key to build up a discount product line. --- connector_opencart/components/api/opencart.py | 17 +++++++++-- connector_opencart/models/opencart/backend.py | 2 ++ connector_opencart/models/opencart/store.py | 2 ++ .../models/sale_order/importer.py | 29 +++++++++++++++++++ .../views/opencart_backend_views.xml | 2 ++ 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/connector_opencart/components/api/opencart.py b/connector_opencart/components/api/opencart.py index d1914f74..f0dfe367 100644 --- a/connector_opencart/components/api/opencart.py +++ b/connector_opencart/components/api/opencart.py @@ -5,6 +5,9 @@ import requests from urllib.parse import urlencode from json import loads, dumps +import logging +_logger = logging.getLogger(__name__) + class Opencart: @@ -37,11 +40,19 @@ class Opencart: if params: encoded_url += '?%s' % urlencode(params) headers = self.get_headers(encoded_url, method) - + _logger.debug('send_request method: %s url: %s headers: %s params: %s body: %s' % ( + method, + url, + headers, + params, + body + )) if method == 'GET': - return loads(self.session.get(url, params=params, headers=headers).text) + result_text = self.session.get(url, params=params, headers=headers).text elif method == 'PUT' or method == 'POST': - return loads(self.session.put(url, data=body, headers=headers).text) + result_text = self.session.put(url, data=body, headers=headers).text + _logger.debug('raw_text: ' + str(result_text)) + return loads(result_text) class Resource: diff --git a/connector_opencart/models/opencart/backend.py b/connector_opencart/models/opencart/backend.py index cc362ac0..46620a87 100644 --- a/connector_opencart/models/opencart/backend.py +++ b/connector_opencart/models/opencart/backend.py @@ -62,6 +62,8 @@ class OpencartBackend(models.Model): "in Odoo.", ) # payment_mode_id = fields.Many2one(comodel_name='account.payment.mode', string="Payment Mode") + coupon_product_id = fields.Many2one(comodel_name='product.product', string='Coupon Product', + help='Product to represent coupon discounts.') # New Product fields. product_categ_id = fields.Many2one(comodel_name='product.category', string='Product Category', diff --git a/connector_opencart/models/opencart/store.py b/connector_opencart/models/opencart/store.py index 31e71e39..4444b16f 100644 --- a/connector_opencart/models/opencart/store.py +++ b/connector_opencart/models/opencart/store.py @@ -50,6 +50,8 @@ class OpencartStore(models.Model): "order 36071 in Opencart, will be named 'OC-36071' " "in Odoo. (overridden from backend)", ) + coupon_product_id = fields.Many2one(comodel_name='product.product', string='Coupon Product', + help='Product to represent coupon discounts.') class OpencartStoreAdapter(Component): diff --git a/connector_opencart/models/sale_order/importer.py b/connector_opencart/models/sale_order/importer.py index f97691d9..dd8f1308 100644 --- a/connector_opencart/models/sale_order/importer.py +++ b/connector_opencart/models/sale_order/importer.py @@ -61,6 +61,34 @@ class SaleOrderImportMapper(Component): children = [('products', 'opencart_order_line_ids', 'opencart.sale.order.line'), ] + def _add_coupon_lines(self, map_record, values): + # Data from API + # 'coupons': [{'amount': '7.68', 'code': '1111'}], + record = map_record.source + + coupons = record.get('coupons') + if not coupons: + return values + + coupon_product = self.options.store.coupon_product_id or self.backend_record.coupon_product_id + if not coupon_product: + coupon_product = self.env.ref('connector_ecommerce.product_product_discount', raise_if_not_found=False) + + if not coupon_product: + raise ValueError('Coupon %s on order requires coupon product in configuration.' % (coupons, )) + for coupon in coupons: + line_builder = self.component(usage='order.line.builder') + line_builder.price_unit = -float(coupon.get('amount', 0.0)) + line_builder.product = coupon_product + # `order.line.builder` does not allow naming. + values = line_builder.get_line() + code = coupon.get('code') + if code: + values['name'] = '%s Code: %s' % (coupon_product.name, code) + line = (0, 0, values) + values['order_line'].append(line) + return values + def _add_shipping_line(self, map_record, values): record = map_record.source @@ -77,6 +105,7 @@ class SaleOrderImportMapper(Component): def finalize(self, map_record, values): values.setdefault('order_line', []) + self._add_coupon_lines(map_record, values) self._add_shipping_line(map_record, values) values.update({ 'partner_id': self.options.partner_id, diff --git a/connector_opencart/views/opencart_backend_views.xml b/connector_opencart/views/opencart_backend_views.xml index 360b9315..716dcc63 100644 --- a/connector_opencart/views/opencart_backend_views.xml +++ b/connector_opencart/views/opencart_backend_views.xml @@ -37,6 +37,7 @@ + @@ -131,6 +132,7 @@ +