diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index f724ef8dcd3..79c539dcacf 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -1533,6 +1533,15 @@ class AccountPartialReconcile(models.Model): partial_reconciles._compute_partial_lines() return move_lines, partial_reconciles + def _get_tax_cash_basis_base_account(self, line, tax): + ''' Get the account of lines that will contain the base amount of taxes. + + :param line: An account.move.line record + :param tax: An account.tax record + :return: An account record + ''' + return line.account_id + def create_tax_cash_basis_entry(self, percentage_before_rec): self.ensure_one() move_date = self.debit_move_id.date @@ -1590,11 +1599,12 @@ class AccountPartialReconcile(models.Model): newly_created_move = self._create_tax_basis_move() #create cash basis entry for the base for tax in line.tax_ids: + account_id = self._get_tax_cash_basis_base_account(line, tax) self.env['account.move.line'].with_context(check_move_validity=False).create({ 'name': line.name, 'debit': rounded_amt > 0 and rounded_amt or 0.0, 'credit': rounded_amt < 0 and abs(rounded_amt) or 0.0, - 'account_id': line.account_id.id, + 'account_id': account_id.id, 'tax_exigible': True, 'tax_ids': [(6, 0, [tax.id])], 'move_id': newly_created_move.id, @@ -1606,7 +1616,7 @@ class AccountPartialReconcile(models.Model): 'name': line.name, 'credit': rounded_amt > 0 and rounded_amt or 0.0, 'debit': rounded_amt < 0 and abs(rounded_amt) or 0.0, - 'account_id': line.account_id.id, + 'account_id': account_id.id, 'tax_exigible': True, 'move_id': newly_created_move.id, 'currency_id': line.currency_id.id, diff --git a/addons/google_calendar/models/google_calendar.py b/addons/google_calendar/models/google_calendar.py index 710b0ddaab9..5caeaf87e89 100644 --- a/addons/google_calendar/models/google_calendar.py +++ b/addons/google_calendar/models/google_calendar.py @@ -922,7 +922,7 @@ class GoogleCalendar(models.AbstractModel): def get_minTime(self): number_of_week = self.env['ir.config_parameter'].sudo().get_param('calendar.week_synchro', default=13) - return datetime.now() - timedelta(weeks=number_of_week) + return datetime.now() - timedelta(weeks=int(number_of_week)) def get_need_synchro_attendee(self): return self.env['ir.config_parameter'].sudo().get_param('calendar.block_synchro_attendee', default=True) diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index 023ade1b359..cbcab281e5a 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -426,13 +426,7 @@ class HrExpenseSheet(models.Model): @api.model def create(self, vals): - # Add the followers at creation, so they can be notified - if vals.get('employee_id'): - employee = self.env['hr.employee'].browse(vals['employee_id']) - users = self._get_users_to_subscribe(employee=employee) - self.env.user - vals['message_follower_ids'] = [] - for partner in users.mapped('partner_id'): - vals['message_follower_ids'] += self.env['mail.followers']._add_follower_command(self._name, [], {partner.id: None}, {})[0] + self._create_set_followers(vals) sheet = super(HrExpenseSheet, self).create(vals) self.check_consistency() return sheet @@ -484,6 +478,20 @@ class HrExpenseSheet(models.Model): users = self._get_users_to_subscribe() self.message_subscribe_users(user_ids=users.ids) + @api.model + def _create_set_followers(self, values): + # Add the followers at creation, so they can be notified + employee_id = values.get('employee_id') + if not employee_id: + return + + employee = self.env['hr.employee'].browse(employee_id) + users = self._get_users_to_subscribe(employee=employee) - self.env.user + values['message_follower_ids'] = [] + MailFollowers = self.env['mail.followers'] + for partner in users.mapped('partner_id'): + values['message_follower_ids'] += MailFollowers._add_follower_command(self._name, [], {partner.id: None}, {})[0] + @api.onchange('employee_id') def _onchange_employee_id(self): self.address_id = self.employee_id.address_home_id diff --git a/addons/l10n_ca/data/account_chart_template_after_data.xml b/addons/l10n_ca/data/account_chart_template_after_data.xml index a3c1e720b18..6216f65899b 100644 --- a/addons/l10n_ca/data/account_chart_template_after_data.xml +++ b/addons/l10n_ca/data/account_chart_template_after_data.xml @@ -8,7 +8,7 @@ - + diff --git a/addons/l10n_ca/data/l10n_ca_chart_data.xml b/addons/l10n_ca/data/l10n_ca_chart_data.xml index 0a463374290..8610079a78f 100644 --- a/addons/l10n_ca/data/l10n_ca_chart_data.xml +++ b/addons/l10n_ca/data/l10n_ca_chart_data.xml @@ -217,7 +217,7 @@ 2171 - + Stock Received But Not Billed diff --git a/addons/l10n_fr_fec/wizard/account_fr_fec.py b/addons/l10n_fr_fec/wizard/account_fr_fec.py index 215ed49cb4e..5b5bcc0fc88 100644 --- a/addons/l10n_fr_fec/wizard/account_fr_fec.py +++ b/addons/l10n_fr_fec/wizard/account_fr_fec.py @@ -5,10 +5,12 @@ import base64 import csv +from datetime import datetime import StringIO from odoo import api, fields, models, _ from odoo.exceptions import Warning +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT class AccountFrFec(models.TransientModel): @@ -33,7 +35,7 @@ class AccountFrFec(models.TransientModel): SELECT 'OUV' AS JournalCode, 'Balance initiale' AS JournalLib, - 'Balance initiale PL' AS EcritureNum, + 'OUVERTURE/' || %s AS EcritureNum, %s AS EcritureDate, '120/129' AS CompteNum, 'Benefice (perte) reporte(e)' AS CompteLib, @@ -67,8 +69,10 @@ class AccountFrFec(models.TransientModel): ''' company = self.env.user.company_id formatted_date_from = self.date_from.replace('-', '') + date_from = datetime.strptime(self.date_from, DEFAULT_SERVER_DATE_FORMAT) + formatted_date_year = date_from.year self._cr.execute( - sql_query, (formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id)) + sql_query, (formatted_date_year, formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id)) listrow = [] row = self._cr.fetchone() listrow = list(row) @@ -130,7 +134,7 @@ class AccountFrFec(models.TransientModel): SELECT 'OUV' AS JournalCode, 'Balance initiale' AS JournalLib, - 'Balance initiale ' || MIN(aa.name) AS EcritureNum, + 'OUVERTURE/' || %s AS EcritureNum, %s AS EcritureDate, MIN(aa.code) AS CompteNum, replace(MIN(aa.name), '|', '/') AS CompteLib, @@ -170,8 +174,10 @@ class AccountFrFec(models.TransientModel): HAVING sum(aml.balance) != 0 ''' formatted_date_from = self.date_from.replace('-', '') + date_from = datetime.strptime(self.date_from, DEFAULT_SERVER_DATE_FORMAT) + formatted_date_year = date_from.year self._cr.execute( - sql_query, (formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id)) + sql_query, (formatted_date_year, formatted_date_from, formatted_date_from, formatted_date_from, self.date_from, company.id)) for row in self._cr.fetchall(): listrow = list(row) diff --git a/addons/mrp/models/stock_move.py b/addons/mrp/models/stock_move.py index 12e036bb2d5..21be5d5b4ba 100644 --- a/addons/mrp/models/stock_move.py +++ b/addons/mrp/models/stock_move.py @@ -161,7 +161,7 @@ class StockMove(models.Model): def create_lots(self): lots = self.env['stock.move.lots'] for move in self: - unlink_move_lots = move.move_lot_ids.filtered(lambda x : (x.quantity_done == 0) and not x.workorder_id) + unlink_move_lots = move.move_lot_ids.filtered(lambda x : (x.quantity_done == 0) and x.done_wo) unlink_move_lots.sudo().unlink() group_new_quant = {} old_move_lot = {} diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 6d3199f4a18..8fece8eb81f 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -858,14 +858,11 @@ class SaleOrderLine(models.Model): if self.order_id.pricelist_id.discount_policy == 'with_discount': return product.with_context(pricelist=self.order_id.pricelist_id.id).price final_price, rule_id = self.order_id.pricelist_id.get_product_price_rule(self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id) - pricelist_item = self.env['product.pricelist.item'].browse(rule_id) - if pricelist_item.base == 'pricelist': - base_price, rule_id = pricelist_item.base_pricelist_id.get_product_price_rule(self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id) - base_price = pricelist_item.base_pricelist_id.currency_id.compute(base_price, self.order_id.pricelist_id.currency_id) - else: - base_price = product[pricelist_item.base] if pricelist_item else product.lst_price - base_price = product.currency_id.compute(base_price, self.order_id.pricelist_id.currency_id) - # negative discounts (= surcharge) are included in the display price (= unit price) + context_partner = dict(self.env.context, partner_id=self.order_id.partner_id.id, date=self.order_id.date_order) + base_price, currency_id = self.with_context(context_partner)._get_real_price_currency(self.product_id, rule_id, self.product_uom_qty, self.product_uom, self.order_id.pricelist_id.id) + if currency_id != self.order_id.pricelist_id.currency_id.id: + base_price = self.env['res.currency'].browse(currency_id).with_context(context_partner).compute(base_price, self.order_id.pricelist_id.currency_id) + # negative discounts (= surcharge) are included in the display price return max(base_price, final_price) @api.multi @@ -1008,11 +1005,10 @@ class SaleOrderLine(models.Model): price, rule_id = self.order_id.pricelist_id.with_context(pricelist_context).get_product_price_rule(self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id) new_list_price, currency_id = self.with_context(context_partner)._get_real_price_currency(self.product_id, rule_id, self.product_uom_qty, self.product_uom, self.order_id.pricelist_id.id) - new_list_price = self.env['account.tax']._fix_tax_included_price_company(new_list_price, self.product_id.taxes_id, self.tax_id, self.company_id) if new_list_price != 0: - if self.product_id.company_id and self.order_id.pricelist_id.currency_id != self.product_id.company_id.currency_id: - # new_list_price is in company's currency while price in pricelist currency + if self.order_id.pricelist_id.currency_id.id != currency_id: + # we need new_list_price in the same currency as price, which is in the SO's pricelist's currency new_list_price = self.env['res.currency'].browse(currency_id).with_context(context_partner).compute(new_list_price, self.order_id.pricelist_id.currency_id) discount = (new_list_price - price) / new_list_price * 100 if discount > 0: diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js index 5ab4aca782c..3c063ba60dc 100644 --- a/addons/website/static/src/js/website.js +++ b/addons/website/static/src/js/website.js @@ -218,7 +218,7 @@ odoo.define('website.website', function (require) { init_kanban(this); }); - $('.js_website_submit_form').on('submit', function () { + $('body').on('submit', '.js_website_submit_form', function() { var $buttons = $(this).find('button[type="submit"], a.a-submit'); _.each($buttons, function (btn) { $(btn).attr('data-loading-text', ' ' + $(btn).text()).button('loading'); diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js index cb531d0035a..2038494a3e5 100644 --- a/addons/website_event/static/src/js/website_event.js +++ b/addons/website_event/static/src/js/website_event.js @@ -13,6 +13,7 @@ var EventRegistrationForm = Widget.extend({ .off('click') .removeClass('a-submit') .click(function (ev) { + $(this).attr('disabled', true); self.on_click(ev); }); }); @@ -28,7 +29,8 @@ var EventRegistrationForm = Widget.extend({ }); return ajax.jsonRpc($form.attr('action'), 'call', post).then(function (modal) { var $modal = $(modal); - $modal.appendTo($form).modal(); + $modal.find('.modal-body > div').removeClass('container'); // retrocompatibility - REMOVE ME in master / saas-19 + $modal.after($form).modal(); $modal.on('click', '.js_goto_event', function () { $modal.modal('hide'); }); diff --git a/addons/website_event/views/website_event_templates.xml b/addons/website_event/views/website_event_templates.xml index 2004ed074ea..80738d60c30 100644 --- a/addons/website_event/views/website_event_templates.xml +++ b/addons/website_event/views/website_event_templates.xml @@ -466,7 +466,7 @@