diff --git a/addons/account/__init__.py b/addons/account/__init__.py index 866c39de02e..86d81923e02 100644 --- a/addons/account/__init__.py +++ b/addons/account/__init__.py @@ -45,6 +45,8 @@ def _auto_install_l10n(cr, registry): 'PL', 'PT', 'RO', 'SI', 'TR', 'UK', 'VE', 'VN' ]: module_list.append('base_vat') + if country_code == 'MX': + module_list.append('l10n_mx_edi') # European countries will be using SEPA europe = env.ref('base.europe', raise_if_not_found=False) diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 2974c2119c9..9a8887ebeb0 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -743,7 +743,7 @@ class AccountInvoice(models.Model): # Subscribe internal users on the newly created bill partners = self.env['res.partner'].browse(seen_partner_ids) is_internal = lambda p: (p.user_ids and - all(p.user_ids.mapped(lambda u: u.user_has_groups('base.group_user')))) + all(p.user_ids.mapped(lambda u: u.has_group('base.group_user')))) partners_to_subscribe = partners.filtered(is_internal) if partners_to_subscribe: invoice.message_subscribe([p.id for p in partners_to_subscribe]) diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py index dfc2b605790..034cdab484d 100644 --- a/addons/account/models/account_payment.py +++ b/addons/account/models/account_payment.py @@ -87,6 +87,16 @@ class account_abstract_payment(models.AbstractModel): # Check all invoices have the same currency if any(inv.currency_id != invoices[0].currency_id for inv in invoices): raise UserError(_("In order to pay multiple invoices at once, they must use the same currency.")) + # Check if, in batch payments, there are not negative invoices and positive invoices + dtype = invoices[0].type + for inv in invoices[1:]: + if inv.type != dtype: + if ((dtype == 'in_refund' and inv.type == 'in_invoice') or + (dtype == 'in_invoice' and inv.type == 'in_refund')): + raise UserError(_("You cannot register payments for vendor bills and supplier refunds at the same time.")) + if ((dtype == 'out_refund' and inv.type == 'out_invoice') or + (dtype == 'out_invoice' and inv.type == 'out_refund')): + raise UserError(_("You cannot register payments for customer invoices and credit notes at the same time.")) # Look if we are mixin multiple commercial_partner or customer invoices with vendor bills multi = any(inv.commercial_partner_id != invoices[0].commercial_partner_id diff --git a/addons/account/models/res_users.py b/addons/account/models/res_users.py index ab85e359d22..8030423e74d 100644 --- a/addons/account/models/res_users.py +++ b/addons/account/models/res_users.py @@ -14,8 +14,8 @@ class Users(models.Model): super(Users, self)._check_one_user_type() users_with_both_groups = self.filtered(lambda user: - user.user_has_groups('account.group_show_line_subtotals_tax_included') and - user.user_has_groups('account.group_show_line_subtotals_tax_excluded') + user.has_group('account.group_show_line_subtotals_tax_included') and + user.has_group('account.group_show_line_subtotals_tax_excluded') ) if users_with_both_groups: names = ", ".join(users_with_both_groups.mapped('name')) diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml index b7ec99e56c0..648dc59f1c3 100644 --- a/addons/account/security/account_security.xml +++ b/addons/account/security/account_security.xml @@ -59,6 +59,17 @@ + + account.analytic.line.billing.user + + [(1, '=', 1)] + + + + + + + diff --git a/addons/account/static/src/scss/account_journal_dashboard.scss b/addons/account/static/src/scss/account_journal_dashboard.scss index 1bff7ba9057..12826641bcf 100644 --- a/addons/account/static/src/scss/account_journal_dashboard.scss +++ b/addons/account/static/src/scss/account_journal_dashboard.scss @@ -36,6 +36,15 @@ width: 450px; } } + .o_kanban_group { + &:not(.o_column_folded) { + width: 450px + 2*$o-kanban-group-padding; + + @include media-breakpoint-down(sm) { + width: 100%; + } + } + } } // Style for the widget "dashboard_graph" diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml index 858a7cf58df..30303fdb6ee 100644 --- a/addons/account/views/account_portal_templates.xml +++ b/addons/account/views/account_portal_templates.xml @@ -83,7 +83,7 @@
- +

diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index cffc8f00fd5..dbf6c2fec53 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -44,7 +44,7 @@ class AuthSignupHome(Home): lang=user_sudo.lang, auth_login=werkzeug.url_encode({'auth_login': user_sudo.email}), ).send_mail(user_sudo.id, force_send=True) - return super(AuthSignupHome, self).web_login(*args, **kw) + return self.web_login(*args, **kw) except UserError as e: qcontext['error'] = e.name or e.value except (SignupError, AssertionError) as e: @@ -69,7 +69,7 @@ class AuthSignupHome(Home): try: if qcontext.get('token'): self.do_signup(qcontext) - return super(AuthSignupHome, self).web_login(*args, **kw) + return self.web_login(*args, **kw) else: login = qcontext.get('login') assert login, _("No login provided.") diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py index 128594cc824..9d650a4b6fb 100644 --- a/addons/base_import_module/models/ir_module.py +++ b/addons/base_import_module/models/ir_module.py @@ -38,6 +38,8 @@ class IrModule(models.Model): installed_mods = [m.name for m in known_mods if m.state == 'installed'] terp = load_information_from_description_file(module, mod_path=path) + if not terp: + return False values = self.get_values_from_terp(terp) if 'version' in terp: values['latest_version'] = terp['version'] @@ -133,8 +135,8 @@ class IrModule(models.Model): try: # assert mod_name.startswith('theme_') path = opj(module_dir, mod_name) - self._import_module(mod_name, path, force=force) - success.append(mod_name) + if self._import_module(mod_name, path, force=force): + success.append(mod_name) except Exception as e: _logger.exception('Error while importing module') errors[mod_name] = exception_to_unicode(e) diff --git a/addons/base_setup/data/base_setup_data.xml b/addons/base_setup/data/base_setup_data.xml index 6499d00add4..e0d02590384 100644 --- a/addons/base_setup/data/base_setup_data.xml +++ b/addons/base_setup/data/base_setup_data.xml @@ -1,7 +1,7 @@ - + base_setup.show_effect True diff --git a/addons/board/static/src/js/add_to_board_menu.js b/addons/board/static/src/js/add_to_board_menu.js index fb6b469d5ab..ab56287b752 100644 --- a/addons/board/static/src/js/add_to_board_menu.js +++ b/addons/board/static/src/js/add_to_board_menu.js @@ -86,12 +86,18 @@ var AddToBoardMenu = Widget.extend({ var context = new Context(this.action.context); context.add(searchQuery.context); context.add({ - group_by: pyUtils.eval('groupbys', searchQuery.groupBys || []) + group_by: searchQuery.groupBy, + orderedBy: searchQuery.orderedBy, }); this.trigger_up('get_controller_query_params', { - callback: function (controllerContext) { - context.add(controllerContext); + callback: function (controllerQueryParams) { + var queryContext = controllerQueryParams.context; + var allContext = _.extend( + _.omit(controllerQueryParams, ['context']), + queryContext + ); + context.add(allContext); } }); diff --git a/addons/board/static/src/js/board_view.js b/addons/board/static/src/js/board_view.js index bcfc892213d..9a4970c7092 100644 --- a/addons/board/static/src/js/board_view.js +++ b/addons/board/static/src/js/board_view.js @@ -272,7 +272,8 @@ var BoardRenderer = FormRenderer.extend({ searchQuery: { context: context, domain: domain, - groupBy: context.group_by || [], + groupBy: typeof context.group_by === 'string' && context.group_by ? [context.group_by] : context.group_by || [], + orderedBy: context.orderedBy || [], }, withControlPanel: false, }); diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js index 62dcb1f851c..bb0663e1468 100644 --- a/addons/board/static/tests/dashboard_tests.js +++ b/addons/board/static/tests/dashboard_tests.js @@ -109,7 +109,7 @@ QUnit.test('display the no content helper', function (assert) { }); QUnit.test('basic functionality, with one sub action', function (assert) { - assert.expect(25); + assert.expect(26); var form = createView({ View: BoardView, @@ -118,7 +118,7 @@ QUnit.test('basic functionality, with one sub action', function (assert) { arch: '
' + '' + '' + - '' + + '' + '' + '' + '
', @@ -132,6 +132,12 @@ QUnit.test('basic functionality, with one sub action', function (assert) { } if (route === '/web/dataset/search_read') { assert.deepEqual(args.domain, [['foo', '!=', 'False']], "the domain should be passed"); + assert.deepEqual(args.context.orderedBy, [{ + 'name': 'foo', + 'asc': true, + }], + 'orderedBy is present in the search read when specified on the custom action' + ); } if (route === '/web/view/edit_custom') { assert.step('edit custom'); @@ -686,7 +692,19 @@ QUnit.test('dashboard intercepts custom events triggered by sub controllers', fu }); QUnit.test('save actions to dashboard', function (assert) { - assert.expect(3); + assert.expect(6); + + testUtils.patch(ListController, { + getOwnedQueryParams: function () { + var result = this._super.apply(this, arguments); + result.context = { + 'fire': 'on the bayou', + } + return result; + } + }); + + this.data['partner'].fields.foo.sortable = true; var actionManager = createActionManager({ data: this.data, @@ -696,6 +714,16 @@ QUnit.test('save actions to dashboard', function (assert) { }, mockRPC: function (route, args) { if (route === '/board/add_to_dashboard') { + assert.deepEqual(args.context_to_save.group_by, ['foo'], + 'The group_by should have been saved'); + assert.deepEqual(args.context_to_save.orderedBy, + [{ + name: 'foo', + asc: true, + }], + 'The orderedBy should have been saved'); + assert.strictEqual(args.context_to_save.fire, 'on the bayou', + 'The context of a controller should be passed and flattened'); assert.strictEqual(args.action_id, 1, "should save the correct action"); assert.strictEqual(args.view_mode, 'list', @@ -716,12 +744,22 @@ QUnit.test('save actions to dashboard', function (assert) { assert.containsOnce(actionManager, '.o_list_view', "should display the list view"); + // Sort the list + testUtils.dom.click($('.o_column_sortable')); + + // Group It + testUtils.dom.click($('.o_search_options .o_dropdown button:contains(Group By)')); + testUtils.dom.click($('.o_search_options .o_group_by_menu button')); + testUtils.dom.click($('.o_search_options .o_group_by_menu button.o_apply_group')); + // add this action to dashboard testUtils.dom.click($('.o_search_options .o_dropdown button:contains(Favorites)')); testUtils.dom.click($('.o_add_to_board.o_menu_header')); testUtils.fields.editInput($('input.o_add_to_board_input'), 'a name'); testUtils.dom.click($('.o_add_to_board_confirm_button')); + testUtils.unpatch(ListController); + actionManager.destroy(); }); @@ -911,6 +949,44 @@ QUnit.test("Dashboard should use correct groupby", function (assert) { form.destroy(); }); +QUnit.test("Dashboard should use correct groupby when defined as a string of one field", function (assert) { + assert.expect(1); + var form = createView({ + View: BoardView, + model: 'board', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '
', + mockRPC: function (route, args) { + if (args.method === 'read_group') { + assert.deepEqual(args.kwargs.groupby, ['bar'], + 'user defined groupby should have precedence on action groupby'); + } + if (route === '/web/action/load') { + return $.when({ + res_model: 'partner', + context: { + group_by: 'some_field', + }, + views: [[4, 'list']], + }); + } + return this._super.apply(this, arguments); + }, + archs: { + 'partner,4,list': + '', + }, + }); + + form.destroy(); +}); + QUnit.test('click on a cell of pivot view inside dashboard', function (assert) { assert.expect(3); diff --git a/addons/calendar/data/mail_data.xml b/addons/calendar/data/mail_data.xml index a4e2fa46907..bd44813d08f 100644 --- a/addons/calendar/data/mail_data.xml +++ b/addons/calendar/data/mail_data.xml @@ -8,6 +8,7 @@ ${object.event_id.user_id.email or ''} ${('' if object.partner_id and object.partner_id.email and object.partner_id.email==object.email else object.email|safe)} ${object.partner_id and object.partner_id.email and object.partner_id.email==object.email and object.partner_id.id or False } + ${object.partner_id.lang}
% set colors = {'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00', 'declined': 'red'} @@ -91,6 +92,7 @@ ${object.event_id.user_id.email or ''} ${('' if object.partner_id and object.partner_id.email and object.partner_id.email==object.email else object.email|safe)} ${object.partner_id and object.partner_id.email and object.partner_id.email==object.email and object.partner_id.id or False } + ${object.partner_id.lang}
% set colors = {'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00', 'declined': 'red'} @@ -174,6 +176,7 @@ ${object.event_id.user_id.email or ''} ${('' if object.partner_id and object.partner_id.email and object.partner_id.email==object.email else object.email|safe)} ${object.partner_id and object.partner_id.email and object.partner_id.email==object.email and object.partner_id.id or False } + ${object.partner_id.lang}
% set colors = {'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00', 'declined': 'red'} diff --git a/addons/calendar/models/mail_message.py b/addons/calendar/models/mail_message.py index cd8ed5d89ae..143bea2d135 100644 --- a/addons/calendar/models/mail_message.py +++ b/addons/calendar/models/mail_message.py @@ -26,6 +26,7 @@ class Message(models.Model): def _find_allowed_model_wise(self, doc_model, doc_dict): if doc_model == 'calendar.event': order = self._context.get('order', self.env[doc_model]._order) - for virtual_id in self.env[doc_model].browse(doc_dict).get_recurrent_ids([], order=order): + records = self.env[doc_model].search([('id', 'in', list(doc_dict))]) + for virtual_id in records.get_recurrent_ids([], order=order): doc_dict.setdefault(virtual_id, doc_dict[get_real_ids(virtual_id)]) return super(Message, self)._find_allowed_model_wise(doc_model, doc_dict) diff --git a/addons/crm/data/crm_data.xml b/addons/crm/data/crm_data.xml index 006c982c03d..0ee888fea90 100644 --- a/addons/crm/data/crm_data.xml +++ b/addons/crm/data/crm_data.xml @@ -1,15 +1,15 @@ - + - + - + diff --git a/addons/crm/data/crm_demo.xml b/addons/crm/data/crm_demo.xml index d57758c9106..de433c3afeb 100644 --- a/addons/crm/data/crm_demo.xml +++ b/addons/crm/data/crm_demo.xml @@ -5,7 +5,7 @@ - + sales diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index 8eb988d8447..0b8c849b5b1 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -102,9 +102,15 @@ class SaleOrder(models.Model): taxes_ids = self.fiscal_position_id.map_tax(taxes, carrier.product_id, self.partner_id).ids # Create the sales order line + carrier_with_partner_lang = carrier.with_context(lang=self.partner_id.lang) + if carrier_with_partner_lang.product_id.description_sale: + so_description = '%s: %s' % (carrier_with_partner_lang.name, + carrier_with_partner_lang.product_id.description_sale) + else: + so_description = carrier_with_partner_lang.name values = { 'order_id': self.id, - 'name': carrier.with_context(lang=self.partner_id.lang).name, + 'name': so_description, 'product_uom_qty': 1, 'product_uom': carrier.product_id.uom_id.id, 'product_id': carrier.product_id.id, diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml index 28702c4eb54..bb0c0db852e 100644 --- a/addons/delivery/views/delivery_view.xml +++ b/addons/delivery/views/delivery_view.xml @@ -94,7 +94,7 @@
- + diff --git a/addons/delivery/wizard/choose_delivery_carrier.py b/addons/delivery/wizard/choose_delivery_carrier.py index 454190a101e..c7bac396c61 100644 --- a/addons/delivery/wizard/choose_delivery_carrier.py +++ b/addons/delivery/wizard/choose_delivery_carrier.py @@ -53,7 +53,7 @@ class ChooseDeliveryCarrier(models.TransientModel): def _compute_available_carrier(self): carriers = self.env['delivery.carrier'].search([]) for rec in self: - rec.available_carrier_ids = carriers.available_carriers(rec.partner_id) if rec.partner_id else carriers + rec.available_carrier_ids = carriers.available_carriers(rec.order_id.partner_shipping_id) if rec.partner_id else carriers def update_price(self): vals = self.carrier_id.rate_shipment(self.order_id) diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index fac1730bead..52017208adc 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -42,11 +42,11 @@ class SaleOrderLine(models.Model): registrations linked to this line. This method update existing registrations and create new one for missing one. """ Registration = self.env['event.registration'].sudo() - registrations = Registration.search([('sale_order_line_id', 'in', self.ids), ('state', '!=', 'cancel')]) + registrations = Registration.search([('sale_order_line_id', 'in', self.ids)]) for so_line in self.filtered('event_id'): existing_registrations = registrations.filtered(lambda self: self.sale_order_line_id.id == so_line.id) if confirm: - existing_registrations.filtered(lambda self: self.state != 'open').confirm_registration() + existing_registrations.filtered(lambda self: self.state not in ['open', 'cancel']).confirm_registration() if cancel_to_draft: existing_registrations.filtered(lambda self: self.state == 'cancel').do_draft() diff --git a/addons/hr/views/hr_views.xml b/addons/hr/views/hr_views.xml index 9f71be2a9c4..50f34fed24e 100644 --- a/addons/hr/views/hr_views.xml +++ b/addons/hr/views/hr_views.xml @@ -304,6 +304,13 @@ + + + + diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index 2666a9d01ad..13a35b10f5a 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -369,7 +369,7 @@ class HrExpense(models.Model): # get move line values move_line_values = move_line_values_by_expense.get(expense.id) move_line_dst = move_line_values[-1] - total_amount = abs(move_line_dst['debit']) + total_amount = move_line_dst['debit'] or -move_line_dst['credit'] total_amount_currency = move_line_dst['amount_currency'] # create one more move line, a counterline for the total on payable account diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index 70ec1a7ed7c..14f5ba17901 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -335,19 +335,22 @@ class HolidaysRequest(models.Model): @api.onchange('holiday_type') def _onchange_type(self): - if self.holiday_type == 'employee' and not self.employee_id: - self.employee_id = self.env.user.employee_ids[:1].id + if self.holiday_type == 'employee': + if not self.employee_id: + self.employee_id = self.env.user.employee_ids[:1].id self.mode_company_id = False self.category_id = False - elif self.holiday_type == 'company' and not self.mode_company_id: + elif self.holiday_type == 'company': self.employee_id = False - self.mode_company_id = self.env.user.company_id.id + if not self.mode_company_id: + self.mode_company_id = self.env.user.company_id.id self.category_id = False - elif self.holiday_type == 'department' and not self.department_id: + elif self.holiday_type == 'department': self.employee_id = False self.mode_company_id = False - self.department_id = self.env.user.employee_ids[:1].department_id.id self.category_id = False + if not self.department_id: + self.department_id = self.env.user.employee_ids[:1].department_id.id elif self.holiday_type == 'category': self.employee_id = False self.mode_company_id = False @@ -800,8 +803,9 @@ class HolidaysRequest(models.Model): responsible = self.env.user if self.validation_type == 'hr' or (self.validation_type == 'both' and self.state == 'validate1'): + company = self.department_id.company_id if self.holiday_type == 'department' else self.employee_id.company_id responsible = self.env['res.users'].search([ - ('company_id', '=', self.employee_id.company_id.id), + ('company_id', '=', company.id), ('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id) ], limit=1) elif self.state == 'confirm' or (self.state == 'validate' and self.validation_type == 'no_validation'): diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py index 62b33e5c83e..6fe2d32bc2e 100644 --- a/addons/hr_holidays/models/hr_leave_allocation.py +++ b/addons/hr_holidays/models/hr_leave_allocation.py @@ -244,16 +244,26 @@ class HolidaysAllocation(models.Model): @api.onchange('holiday_type') def _onchange_type(self): - if self.holiday_type == 'employee' and not self.employee_id: - if self.env.user.employee_ids: - self.employee_id = self.env.user.employee_ids[0] + if self.holiday_type == 'employee': + if not self.employee_id: + self.employee_id = self.env.user.employee_ids[:1].id + self.mode_company_id = False + self.category_id = False + elif self.holiday_type == 'company': + self.employee_id = False + if not self.mode_company_id: + self.mode_company_id = self.env.user.company_id.id + self.category_id = False elif self.holiday_type == 'department': - if self.env.user.employee_ids: - self.department_id = self.department_id or self.env.user.employee_ids[0].department_id - self.employee_id = None - else: - self.employee_id = None - self.department_id = None + self.employee_id = False + self.mode_company_id = False + self.category_id = False + if not self.department_id: + self.department_id = self.env.user.employee_ids[:1].department_id.id + elif self.holiday_type == 'category': + self.employee_id = False + self.mode_company_id = False + self.department_id = False @api.onchange('employee_id') def _onchange_employee(self): diff --git a/addons/hr_holidays/tests/test_leave_requests.py b/addons/hr_holidays/tests/test_leave_requests.py index 67d468b0a44..9f32d96e6c6 100644 --- a/addons/hr_holidays/tests/test_leave_requests.py +++ b/addons/hr_holidays/tests/test_leave_requests.py @@ -6,6 +6,7 @@ from dateutil.relativedelta import relativedelta from odoo import fields from odoo.exceptions import ValidationError from odoo.tools import mute_logger +from odoo.tests.common import Form from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase @@ -150,3 +151,25 @@ class TestLeaveRequests(TestHrHolidaysBase): 'date_to': fields.Datetime.from_string('2017-07-11 19:00:00'), 'number_of_days': 1, }) + + @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') + def test_department_leave(self): + """ Create a department leave """ + self.employee_hrmanager.write({'department_id': self.hr_dept.id}) + self.assertFalse(self.env['hr.leave'].search([('employee_id', 'in', self.hr_dept.member_ids.ids)])) + leave_form = Form(self.env['hr.leave'].sudo(self.user_hrmanager)) + leave_form.holiday_status_id = self.holidays_type_1 + leave_form.holiday_type = 'department' + leave_form.department_id = self.hr_dept + leave = leave_form.save() + leave.action_approve() + member_ids = self.hr_dept.member_ids.ids + self.assertEqual(self.env['hr.leave'].search_count([('employee_id', 'in', member_ids)]), len(member_ids), "Leave should be created for members of department") + + @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') + def test_allocation_request(self): + """ Create an allocation request """ + # employee should be set to current user + allocation_form = Form(self.env['hr.leave.allocation'].sudo(self.user_employee)) + allocation_form.holiday_status_id = self.holidays_type_1 + allocation = allocation_form.save() diff --git a/addons/hw_screen/static/src/js/worker.js b/addons/hw_screen/static/src/js/worker.js index 4031e85cf52..5949ab39cef 100644 --- a/addons/hw_screen/static/src/js/worker.js +++ b/addons/hw_screen/static/src/js/worker.js @@ -9,7 +9,7 @@ function longpolling() { $.ajax({ type: 'POST', - url: 'http://'+window.location.host+'/point_of_sale/get_serialized_order', + url: window.location.origin+'/point_of_sale/get_serialized_order', dataType: 'json', beforeSend: function(xhr){xhr.setRequestHeader('Content-Type', 'application/json');}, data: JSON.stringify({jsonrpc: '2.0'}), @@ -47,14 +47,17 @@ foreign_js(); } } - }, - - complete: function(jqXHR,err) { if (!stop_longpolling) { longpolling(); } }, + error: function (jqXHR, status, err) { + if (!stop_longpolling) { + setTimeout(longpolling, 5000); + } + }, + timeout: 30000, }); }; diff --git a/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml b/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml index 9a6e0fbd180..3b5aa088694 100644 --- a/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml +++ b/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml @@ -188,7 +188,7 @@ result = bool(contract.ip) code -result = - categories.GROSSIP * contract.ip_wage_rate / 100.0 +result = - categories.BASIC * contract.ip_wage_rate / 100.0 @@ -530,7 +530,7 @@ result = -contract.car_atn 172 python result = bool(contract.ip) - result = categories.GROSSIP * contract.ip_wage_rate / 100.0 + result = categories.BASIC * contract.ip_wage_rate / 100.0 @@ -542,7 +542,7 @@ result = -contract.car_atn result = bool(contract.ip) tax_rate = 0.15 -ip_amount = categories.GROSSIP * contract.ip_wage_rate / 100.0 +ip_amount = categories.BASIC * contract.ip_wage_rate / 100.0 if ip_amount >= 0.0 and ip_amount <= 15660: tax_rate = tax_rate / 2.0 elif ip_amount > 15660 and ip_amount <=31320: diff --git a/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml b/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml index fc3c38f8c34..166b85499b2 100644 --- a/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml +++ b/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml @@ -16,7 +16,7 @@
Configure Default Values for Belgian Advantages
- > +