diff --git a/addons/account/views/account_payment_view.xml b/addons/account/views/account_payment_view.xml index 9f9e49ecd05..60c8c95c8d3 100644 --- a/addons/account/views/account_payment_view.xml +++ b/addons/account/views/account_payment_view.xml @@ -146,7 +146,7 @@ account.payment form tree,form,graph - {'default_payment_type': 'inbound'} + {'default_payment_type': 'inbound', 'default_partner_type': 'customer'} [('partner_type', '=', 'customer')] @@ -164,7 +164,7 @@ account.payment form tree,form,graph - {'default_payment_type': 'outbound'} + {'default_payment_type': 'outbound', 'default_partner_type': 'supplier'} [('partner_type', '=', 'supplier')] diff --git a/addons/auth_oauth/models/res_config.py b/addons/auth_oauth/models/res_config.py index 39c72880a38..20784bd9d18 100644 --- a/addons/auth_oauth/models/res_config.py +++ b/addons/auth_oauth/models/res_config.py @@ -32,7 +32,7 @@ class BaseConfigSettings(models.TransientModel): @api.model def get_oauth_providers(self, fields): - google_provider = self.env.ref('auth_oauth.provider_google') + google_provider = self.env.ref('auth_oauth.provider_google', False) return { 'auth_oauth_google_enabled': google_provider.enabled, 'auth_oauth_google_client_id': google_provider.client_id, @@ -42,7 +42,7 @@ class BaseConfigSettings(models.TransientModel): @api.multi def set_oauth_providers(self): self.ensure_one() - google_provider = self.env.ref('auth_oauth.provider_google') + google_provider = self.env.ref('auth_oauth.provider_google', False) rg = { 'enabled': self.auth_oauth_google_enabled, 'client_id': self.auth_oauth_google_client_id, diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 5ea52c874e2..be4e5903de7 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -247,13 +247,19 @@ class Lead(models.Model): team_id = self.env['crm.team']._get_default_team_id(user_id=user_id) return {'team_id': team_id} - @api.constrains('user_id') @api.onchange('user_id') def _onchange_user_id(self): """ When changing the user, also set a team_id or restrict team id to the ones user_id is member of. """ values = self._onchange_user_values(self.user_id.id) self.update(values) + @api.constrains('user_id') + def _valid_team(self): + if self.user_id: + values = self.with_context(team_id=self.team_id.id)._onchange_user_values(self.user_id.id) + if values: + self.update(values) + @api.onchange('state_id') def _onchange_state(self): if self.state_id: diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index facef9e2f6f..5c03e56c495 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -473,9 +473,12 @@ class HrExpenseSheet(models.Model): self.department_id = self.employee_id.department_id @api.one - @api.depends('expense_line_ids', 'expense_line_ids.total_amount') + @api.depends('expense_line_ids', 'expense_line_ids.total_amount', 'expense_line_ids.currency_id') def _compute_amount(self): - self.total_amount = sum(self.expense_line_ids.mapped('total_amount')) + if len(self.expense_line_ids.mapped('currency_id')) < 2: + self.total_amount = sum(self.expense_line_ids.mapped('total_amount')) + else: + self.total_amount = 0.0 # FIXME: A 4 command is missing to explicitly declare the one2many relation # between the sheet and the lines when using 'default_expense_line_ids':[ids] diff --git a/addons/hr_expense/report/report_expense_sheet.xml b/addons/hr_expense/report/report_expense_sheet.xml index e033d7920c1..f2fb3575005 100644 --- a/addons/hr_expense/report/report_expense_sheet.xml +++ b/addons/hr_expense/report/report_expense_sheet.xml @@ -71,26 +71,27 @@ + t-options='{"widget": "monetary", "display_currency": line.currency_id}'/> - - - - - Total - - - - - + + + + + + Total + + + + + + - - + Certified honest and conform,(Date and signature). @@ -110,4 +111,4 @@ 'Expenses'+'-'+(object.employee_id.name)+'-'+(object.name) - \ No newline at end of file + diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml index ce312ad307d..594748935bf 100644 --- a/addons/hr_expense/views/hr_expense_views.xml +++ b/addons/hr_expense/views/hr_expense_views.xml @@ -459,6 +459,7 @@ + diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index d3291053fb5..1eefb33f88f 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -610,11 +610,11 @@ class PosOrder(models.Model): 'location_id': location_id, 'location_dest_id': destination_id, } - pos_qty = any([x.qty > 0 for x in order.lines]) + pos_qty = any([x.qty > 0 for x in order.lines if x.product_id.type in ['product', 'consu']]) if pos_qty: order_picking = Picking.create(picking_vals.copy()) order_picking.message_post(body=message) - neg_qty = any([x.qty < 0 for x in order.lines]) + neg_qty = any([x.qty < 0 for x in order.lines if x.product_id.type in ['product', 'consu']]) if neg_qty: return_vals = picking_vals.copy() return_vals.update({ diff --git a/addons/sale_margin/report/sale_report.py b/addons/sale_margin/report/sale_report.py index 5bfcaaacf34..f69a0e2c023 100644 --- a/addons/sale_margin/report/sale_report.py +++ b/addons/sale_margin/report/sale_report.py @@ -10,4 +10,4 @@ class SaleReport(models.Model): margin = fields.Float('Margin') def _select(self): - return super(SaleReport, self)._select() + ", SUM(l.margin) AS margin" + return super(SaleReport, self)._select() + ", SUM(l.margin / COALESCE(cr.rate, 1.0)) AS margin" diff --git a/addons/stock/security/stock_security.xml b/addons/stock/security/stock_security.xml index a825375bd1b..5ef72718132 100644 --- a/addons/stock/security/stock_security.xml +++ b/addons/stock/security/stock_security.xml @@ -148,5 +148,12 @@ ['|', ('picking_id.message_partner_ids','in',[user.partner_id.id]), ('picking_id.partner_id.id','=',user.partner_id.id)] + + + stock_location_route multi-company + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index 27d85778431..d22a4095d1a 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -154,7 +154,7 @@ var FormController = BasicController.extend({ callback: this._deleteRecords.bind(this, [this.handle]), }); } - if (this.is_action_enabled('create')) { + if (this.is_action_enabled('create') && this.is_action_enabled('duplicate')) { otherItems.push({ label: _t('Duplicate'), callback: this._onDuplicateRecord.bind(this), diff --git a/odoo/addons/base/ir/ir_model_view.xml b/odoo/addons/base/ir/ir_model_view.xml index ad4307b9e76..5e04ac92eda 100644 --- a/odoo/addons/base/ir/ir_model_view.xml +++ b/odoo/addons/base/ir/ir_model_view.xml @@ -218,7 +218,7 @@ ir.model.fields - + @@ -327,7 +327,7 @@ ir.model.fields - + diff --git a/odoo/addons/base/res/res_company.py b/odoo/addons/base/res/res_company.py index 18fbd6a0a3e..9f240f314fa 100644 --- a/odoo/addons/base/res/res_company.py +++ b/odoo/addons/base/res/res_company.py @@ -13,6 +13,19 @@ class Company(models.Model): _description = 'Companies' _order = 'sequence, name' + @api.multi + def copy(self, default=None): + """ + Duplicating a company without specifying a partner duplicate the partner + """ + self.ensure_one() + default = dict(default or {}) + if not default.get('name') and not default.get('partner_id'): + copy_partner = self.partner_id.copy() + default['partner_id'] = copy_partner.id + default['name'] = copy_partner.name + return super(Company, self).copy(default) + _header = """
Certified honest and conform,(Date and signature).