diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 56bc8e3fa7b..0f42739e899 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -1360,6 +1360,8 @@ class AccountInvoice(models.Model): values['type'] = TYPE2REFUND[invoice['type']] values['date_invoice'] = date_invoice or fields.Date.context_today(invoice) + if values.get('date_due', False) and values['date_invoice'] > values['date_due']: + values['date_due'] = values['date_invoice'] values['state'] = 'draft' values['number'] = False values['origin'] = invoice.number diff --git a/addons/l10n_be_intrastat/wizard/xml_decl.py b/addons/l10n_be_intrastat/wizard/xml_decl.py index d27f677d431..86f3bda9f57 100644 --- a/addons/l10n_be_intrastat/wizard/xml_decl.py +++ b/addons/l10n_be_intrastat/wizard/xml_decl.py @@ -4,9 +4,11 @@ import base64 from xml.etree import ElementTree as ET from collections import namedtuple +from functools import partial from odoo import api, exceptions, fields, models, _ from odoo.tools.pycompat import text_type +from odoo.tools import float_round, float_is_zero INTRASTAT_XMLNS = 'http://www.onegate.eu/2010-01-01' @@ -103,7 +105,16 @@ class XmlDeclaration(models.TransientModel): 'res_id': self.id, } + def _get_rounding_digits(self): + """A hook to not break behavior + Allows to programmatically set with what precision + the price, weight and values will be rounded""" + return 0 + def _build_intrastat_line(self, numlgn, item, linekey, amounts, dispatchmode, extendedmode): + round_digits = self._get_rounding_digits() + _round = partial(float_round, precision_digits=round_digits) + self._set_Dim(item, 'EXSEQCODE', text_type(numlgn)) self._set_Dim(item, 'EXTRF', text_type(linekey.EXTRF)) self._set_Dim(item, 'EXCNT', text_type(linekey.EXCNT)) @@ -113,9 +124,9 @@ class XmlDeclaration(models.TransientModel): if extendedmode: self._set_Dim(item, 'EXTPC', text_type(linekey.EXTPC)) self._set_Dim(item, 'EXDELTRM', text_type(linekey.EXDELTRM)) - self._set_Dim(item, 'EXTXVAL', text_type(round(amounts[0], 0)).replace(".", ",")) - self._set_Dim(item, 'EXWEIGHT', text_type(round(amounts[1], 0)).replace(".", ",")) - self._set_Dim(item, 'EXUNITS', text_type(round(amounts[2], 0)).replace(".", ",")) + self._set_Dim(item, 'EXTXVAL', text_type(_round(amounts[0], 0)).replace(".", ",")) + self._set_Dim(item, 'EXWEIGHT', text_type(_round(amounts[1], 0)).replace(".", ",")) + self._set_Dim(item, 'EXUNITS', text_type(_round(amounts[2], 0)).replace(".", ",")) def _get_intrastat_linekey(self, declcode, inv_line, dispatchmode, extendedmode): IntrastatRegion = self.env['l10n_be_intrastat.region'] @@ -297,7 +308,7 @@ class XmlDeclaration(models.TransientModel): numlgn = 0 for linekey in entries: amounts = entries[linekey] - if round(amounts[0], 0) == 0: + if float_is_zero(amounts[0], precision_digits=self._get_rounding_digits()): continue numlgn += 1 item = ET.SubElement(datas, 'Item') diff --git a/addons/l10n_be_intrastat_2019/models/account_intrastat_report.py b/addons/l10n_be_intrastat_2019/models/account_intrastat_report.py index 51cf8c4ae56..887bc86fe4a 100644 --- a/addons/l10n_be_intrastat_2019/models/account_intrastat_report.py +++ b/addons/l10n_be_intrastat_2019/models/account_intrastat_report.py @@ -12,6 +12,15 @@ class XmlDeclaration(models.TransientModel): """ _inherit = "l10n_be_intrastat_xml.xml_decl" + def _get_rounding_digits(self): + """ + @override + + https://www.nbb.be/doc/dq/f_pdf_ex/nieuwsbriefintrastat_n28_2018_fr.pdf + Chapter 3 + """ + return 2 + def _build_intrastat_line(self, numlgn, item, linekey, amounts, dispatchmode, extendedmode): super(XmlDeclaration, self)._build_intrastat_line(numlgn, item, linekey, amounts, dispatchmode, extendedmode) if dispatchmode: diff --git a/addons/payment/controllers/portal.py b/addons/payment/controllers/portal.py index 6f13400356b..d9e4826120d 100644 --- a/addons/payment/controllers/portal.py +++ b/addons/payment/controllers/portal.py @@ -141,7 +141,7 @@ class WebsitePayment(http.Controller): tx_id = int(kw.get('tx_id', 0)) or request.session.pop('website_payment_tx_id', 0) if tx_id: tx = request.env['payment.transaction'].browse(tx_id) - if tx.state == 'done': + if tx.state in ['done', 'authorized']: status = 'success' message = tx.acquirer_id.done_msg elif tx.state == 'pending': diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index e6c3bca27cd..24652a9a29f 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -577,6 +577,9 @@ class WebsiteSale(http.Controller): new_values['team_id'] = request.website.salesteam_id and request.website.salesteam_id.id new_values['user_id'] = request.website.salesperson_id and request.website.salesperson_id.id + if mode[0] == 'new': + new_values['company_id'] = request.website.company_id.id + lang = request.lang if request.lang in request.website.mapped('language_ids.code') else None if lang: new_values['lang'] = lang diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py index d677a98cf88..57e3d0cda62 100644 --- a/addons/website_sale/models/website.py +++ b/addons/website_sale/models/website.py @@ -280,7 +280,7 @@ class Website(models.Model): if code_pricelist: pricelist_id = code_pricelist.id update_pricelist = True - elif code is not None and sale_order.pricelist_id.code: + elif code is not None and sale_order.pricelist_id.code and code != sale_order.pricelist_id.code: # code is not None when user removes code and click on "Apply" pricelist_id = partner.property_product_pricelist.id update_pricelist = True