From 1740b94e2302c727b6a74ab6c7899919d6bec270 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Sun, 1 Dec 2019 11:08:39 -0800 Subject: [PATCH 1/2] FIX `hr_expense_vendor` don't crash when posting expense sheet with multiple expense lines and references --- hr_expense_vendor/models/hr_expense.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hr_expense_vendor/models/hr_expense.py b/hr_expense_vendor/models/hr_expense.py index f30ae71d..9a2a54bf 100644 --- a/hr_expense_vendor/models/hr_expense.py +++ b/hr_expense_vendor/models/hr_expense.py @@ -15,7 +15,7 @@ class HRExpense(models.Model): raise ValidationError('You must have an assigned vendor to process a Company Paid Expense') move_line_values = move_line_values_by_expense[expense.id] for line_values in move_line_values: - new_name = expense.name.split('\n')[0][:64] + (' - ' + str(self.reference) if self.reference else '') + new_name = expense.name.split('\n')[0][:64] + (' - ' + str(expense.reference) if expense.reference else '') line_values['name'] = new_name[:64] line_values['partner_id'] = expense.vendor_id.id return move_line_values_by_expense From cbacd46a381c7fe75758e5b5bf3f77aaf68c5173 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Wed, 4 Dec 2019 10:26:24 -0800 Subject: [PATCH 2/2] IMP `connector_opencart` Add shipping price, and enable scheduled action and exceptions. Additionally, attempt to "unescape" the product name values. --- connector_opencart/__manifest__.py | 1 + .../data/connector_opencart_data.xml | 27 +++-------------- .../models/sale_order/importer.py | 30 +++++++++++-------- 3 files changed, 23 insertions(+), 35 deletions(-) diff --git a/connector_opencart/__manifest__.py b/connector_opencart/__manifest__.py index ce265249..750f30c6 100644 --- a/connector_opencart/__manifest__.py +++ b/connector_opencart/__manifest__.py @@ -17,6 +17,7 @@ 'license': 'AGPL-3', 'website': 'https://hibou.io', 'data': [ + 'data/connector_opencart_data.xml', 'security/ir.model.access.csv', 'views/delivery_views.xml', 'views/opencart_backend_views.xml', diff --git a/connector_opencart/data/connector_opencart_data.xml b/connector_opencart/data/connector_opencart_data.xml index fef62b5b..b575ec5d 100644 --- a/connector_opencart/data/connector_opencart_data.xml +++ b/connector_opencart/data/connector_opencart_data.xml @@ -4,13 +4,13 @@ Opencart - Import Sales Orders - + code 1 - days + hours -1 - + model._scheduler_import_sale_orders() @@ -27,26 +27,7 @@ Check your taxes and fiscal positions configuration and correct them if necessar 30 sale.order sale - if sale.opencart_bind_ids and abs(sale.amount_total - sale.opencart_bind_ids[0].total_amount) >= 0.01: - failed = True - - - - - Total Tax Amount differs from Opencart - The tax amount computed in Odoo doesn't match with the tax amount in Opencart. - -Cause: -The taxes are probably different between Odoo and Opencart. A fiscal position could have changed the final price. - -Resolution: -Check your taxes and fiscal positions configuration and correct them if necessary. - 30 - sale.order - sale - # By default, a cent of difference for the tax amount is allowed, feel free to customise it in your own module -if sale.opencart_bind_ids and abs(sale.amount_tax - sale.opencart_bind_ids[0].total_amount_tax) > 0.01: - failed = True + failed = sale.opencart_bind_ids and abs(sale.amount_total - sale.opencart_bind_ids[0].total_amount) >= 0.01 diff --git a/connector_opencart/models/sale_order/importer.py b/connector_opencart/models/sale_order/importer.py index 42813627..0ff32f0d 100644 --- a/connector_opencart/models/sale_order/importer.py +++ b/connector_opencart/models/sale_order/importer.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from copy import deepcopy, copy +from html import unescape from odoo import fields, _ from odoo.addons.component.core import Component @@ -65,14 +66,14 @@ class SaleOrderImportMapper(Component): record = map_record.source line_builder = self.component(usage='order.line.builder.shipping') - line_builder.price_unit = 0.0 + line_builder.price_unit = record.get('shipping_exclude_tax', 0.0) if values.get('carrier_id'): carrier = self.env['delivery.carrier'].browse(values['carrier_id']) line_builder.product = carrier.product_id + line = (0, 0, line_builder.get_line()) + values['order_line'].append(line) - line = (0, 0, line_builder.get_line()) - values['order_line'].append(line) return values def finalize(self, map_record, values): @@ -120,9 +121,8 @@ class SaleOrderImportMapper(Component): [('name', '=', record_method)], limit=1, ) - assert method, ("method %s should exist because the import fails " - "in SaleOrderImporter._before_import when it is " - " missing" % record_method) + if not method: + raise ValueError('Payment Mode named "%s", cannot be found.' % (record_method, )) return {'payment_mode_id': method.id} @mapping @@ -138,8 +138,11 @@ class SaleOrderImportMapper(Component): return {'warehouse_id': warehouse.id} @mapping - def shipping_method(self, record): - method = record['shipping_method'] or '' + def shipping_code(self, record): + method = record.get('shipping_code') or record.get('shipping_method') + if not method: + return {'carrier_id': False} + carrier_domain = [('opencart_code', '=', method.strip())] company = self.options.store.company_id or self.backend_record.company_id if company: @@ -148,8 +151,8 @@ class SaleOrderImportMapper(Component): ] carrier = self.env['delivery.carrier'].search(carrier_domain, limit=1) if not carrier: - raise ValueError('Delivery Carrier for methodCode "%s", cannot be found.' % (method, )) - return {'carrier_id': carrier.id, 'shipping_method_code': method} + raise ValueError('Delivery Carrier for method Code "%s", cannot be found.' % (method, )) + return {'carrier_id': carrier.id} @mapping def company_id(self, record): @@ -328,7 +331,6 @@ class SaleOrderLineImportMapper(Component): direct = [('quantity', 'product_uom_qty'), ('price', 'price_unit'), - ('name', 'name'), ('order_product_id', 'external_id'), ] @@ -340,13 +342,17 @@ class SaleOrderLineImportMapper(Component): reference = record['model'] values = { 'default_code': reference, - 'name': record.get('name', reference), + 'name': unescape(record.get('name', reference)), # unknown if other fields, but have observed " in product names 'type': 'product', 'list_price': record.get('price', 0.0), 'categ_id': self.backend_record.product_categ_id.id, } return self._finalize_product_values(record, values) + @mapping + def name(self, record): + return unescape(record['name']) + @mapping def product_id(self, record): reference = record['model']