From ab8f5ec95d41fdab501cb4c5b5b8e0218f337942 Mon Sep 17 00:00:00 2001 From: fda-odoo Date: Tue, 31 Oct 2017 17:32:46 +0100 Subject: [PATCH 1/3] [IMP] hr_expense: change tours text, labels, search field - subscribe responsibles of an expense to followers of that expense - hr_expense requires sale_expense instead of sale_management - remove one tour step and change texts of some others - remove header from expense line wizard - add tax field in form view for expense - change the display name of some fields and other titles. - remove the expense report and improve search bar for expenses in report. --- addons/hr_expense/__manifest__.py | 2 +- addons/hr_expense/models/hr_expense.py | 20 ++++-- .../hr_expense/models/res_config_settings.py | 2 +- addons/hr_expense/static/src/js/tour.js | 11 +--- addons/hr_expense/views/hr_expense_views.xml | 66 +++++++++++-------- .../views/res_config_settings_views.xml | 4 +- 6 files changed, 60 insertions(+), 45 deletions(-) diff --git a/addons/hr_expense/__manifest__.py b/addons/hr_expense/__manifest__.py index d1f3ab98f1d..ac6f28bc91e 100644 --- a/addons/hr_expense/__manifest__.py +++ b/addons/hr_expense/__manifest__.py @@ -3,7 +3,7 @@ { - 'name': 'Expense Tracker', + 'name': 'Expenses', 'version': '2.0', 'category': 'Human Resources', 'sequence': 95, diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index d5b238664ac..e07c10f46ac 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -29,8 +29,8 @@ class HrExpense(models.Model): def _default_account_id(self): return self.env['ir.property'].get('property_account_expense_categ_id', 'product.category') - name = fields.Char("Expense Description", readonly=True, required=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}) - date = fields.Date("Expense Date", readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=fields.Date.context_today) + name = fields.Char(string='Description', readonly=True, required=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}) + date = fields.Date(readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=fields.Date.context_today, string="Date") employee_id = fields.Many2one('hr.employee', string="Employee", required=True, readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=_default_employee_id) product_id = fields.Many2one('product.product', string='Product', readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, domain=[('can_be_expensed', '=', True)], required=True) product_uom_id = fields.Many2one('product.uom', string='Unit of Measure', required=True, readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=_default_product_uom_id) @@ -49,8 +49,8 @@ class HrExpense(models.Model): payment_mode = fields.Selection([ ("own_account", "Employee (to reimburse)"), ("company_account", "Company") - ], default='own_account', states={'done': [('readonly', True)], 'post': [('readonly', True)], 'submitted': [('readonly', True)]}, string="Payment By") - attachment_number = fields.Integer("Number of Attachments", compute='_compute_attachment_number') + ], default='own_account', states={'done': [('readonly', True)], 'post': [('readonly', True)], 'submitted': [('readonly', True)]}, string="Paid By") + attachment_number = fields.Integer('Number of Attachments', compute='_compute_attachment_number') state = fields.Selection([ ('draft', 'To Submit'), ('reported', 'Reported'), @@ -161,6 +161,7 @@ class HrExpense(models.Model): if len(self.mapped('employee_id')) != 1: raise UserError(_("You cannot report expenses for different employees in the same report!")) return { + 'name': _('New Expense Report'), 'type': 'ir.actions.act_window', 'view_mode': 'form', 'res_model': 'hr.expense.sheet', @@ -470,7 +471,7 @@ class HrExpenseSheet(models.Model): ], string='Status', index=True, readonly=True, track_visibility='onchange', copy=False, default='submit', required=True, help='Expense Report State') employee_id = fields.Many2one('hr.employee', string="Employee", required=True, readonly=True, states={'submit': [('readonly', False)]}, default=lambda self: self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)) address_id = fields.Many2one('res.partner', string="Employee Home Address") - payment_mode = fields.Selection([("own_account", "Employee (to reimburse)"), ("company_account", "Company")], related='expense_line_ids.payment_mode', default='own_account', readonly=True, string="Payment By") + payment_mode = fields.Selection([("own_account", "Employee (to reimburse)"), ("company_account", "Company")], related='expense_line_ids.payment_mode', default='own_account', readonly=True, string="Paid By") responsible_id = fields.Many2one('res.users', 'Validation By', readonly=True, copy=False, states={'submit': [('readonly', False)]}) total_amount = fields.Monetary('Total Amount', currency_field='currency_id', compute='_compute_amount', store=True, digits=dp.get_precision('Account')) company_id = fields.Many2one('res.company', string='Company', readonly=True, states={'submit': [('readonly', False)]}, default=lambda self: self.env.user.company_id) @@ -529,6 +530,8 @@ class HrExpenseSheet(models.Model): res = super(HrExpenseSheet, self).write(vals) if vals.get('employee_id'): self._add_followers() + if vals.get('responsible_id'): + self.message_subscribe([self.responsible_id.partner_id.id]) return res @api.multi @@ -583,6 +586,10 @@ class HrExpenseSheet(models.Model): 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] + + if vals.get('responsible_id') and vals.get('responsible_id') != vals.get('employee_id'): + resp_partner = self.env['res.users'].browse(vals['responsible_id']) + values['message_follower_ids'] += MailFollowers._add_follower_command(self._name, [], {resp_partner.partner_id.id: None}, {})[0] # -------------------------------------------- # Actions @@ -633,7 +640,8 @@ class HrExpenseSheet(models.Model): def approve_expense_sheets(self): if not self.user_has_groups('hr_expense.group_hr_expense_user'): raise UserError(_("Only HR Officers can approve expenses")) - self.write({'state': 'approve', 'responsible_id': self.env.user.id}) + responsible = self.responsible_id.id or self.env.user.id + self.write({'state': 'approve', 'responsible_id': responsible}) @api.multi def paid_expense_sheets(self): diff --git a/addons/hr_expense/models/res_config_settings.py b/addons/hr_expense/models/res_config_settings.py index a142834e17a..c07d364dd7d 100644 --- a/addons/hr_expense/models/res_config_settings.py +++ b/addons/hr_expense/models/res_config_settings.py @@ -9,7 +9,7 @@ class ResConfigSettings(models.TransientModel): expense_alias_prefix = fields.Char('Default Alias Name for Expenses') use_mailgateway = fields.Boolean(string='Let your employees record expenses by email', config_parameter='hr_expense.use_mailgateway') - module_sale_management = fields.Boolean(string="Customer Billing") + module_sale_expense = fields.Boolean(string="Customer Billing") @api.model def get_values(self): diff --git a/addons/hr_expense/static/src/js/tour.js b/addons/hr_expense/static/src/js/tour.js index 14bc3ae7873..2c757c5e62e 100644 --- a/addons/hr_expense/static/src/js/tour.js +++ b/addons/hr_expense/static/src/js/tour.js @@ -13,22 +13,17 @@ tour.register('hr_expense_tour' , [tour.STEPS.MENU_MORE, { trigger: '.o_app[data-menu-xmlid="hr_expense.menu_hr_expense_root"], .oe_menu_toggler[data-menu-xmlid="hr_expense.menu_hr_expense_root"]', - content: _t("Go to the expense to attach a receipt."), + content: _t("Want to manage your expenses? It starts here."), position: 'bottom', }, { trigger: '.o_list_button_add', extra_trigger: ".o_expense_tree", - content: _t('

Click here to create your first expense and add it under here.

'), + content: _t('

Let’s start by creating your first expense.

'), position: 'bottom' -}, { - trigger: ".o_required_modifier input", - extra_trigger: ".o_expense_form", - content: _t("Write the name of the product, or select an existing one."), - position: "top", }, { trigger: '.o_form_button_save', extra_trigger: ".o_expense_form", - content: _t("

Once your Expense is ready, you can save it.

"), + content: _t("

Once your Expense report is ready, you can save it and wait for the approval from your manager.

"), position: 'bottom', }, { trigger: '.o_expense_form .o_chatter_button_new_message', diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml index 7ad72b2ffd7..6c15c9bdda9 100644 --- a/addons/hr_expense/views/hr_expense_views.xml +++ b/addons/hr_expense/views/hr_expense_views.xml @@ -21,26 +21,13 @@ - - hr.expense.form + + hr.expense.view.form hr.expense - +
-
-
-
- -
- +
@@ -174,9 +187,9 @@ - + - + @@ -361,7 +374,7 @@ form graph,pivot { - 'search_default_uncancelled': 1, + 'search_default_approved': 1, } diff --git a/addons/sale_expense/views/hr_expense_views.xml b/addons/sale_expense/views/hr_expense_views.xml index 007e017595c..8af3d92c768 100644 --- a/addons/sale_expense/views/hr_expense_views.xml +++ b/addons/sale_expense/views/hr_expense_views.xml @@ -3,7 +3,7 @@ hr.expense.form.inherit.sale.expense hr.expense - + From 8cf946a83820fc06fcef88d1759bfc81a0be495d Mon Sep 17 00:00:00 2001 From: fda-odoo Date: Thu, 25 Jan 2018 14:19:33 +0100 Subject: [PATCH 3/3] [IMP] hr_expense: rename responsible_id to user_id As user_id is a magical field, we rename responsible_id to user_id to notify him when he is assigned to an expense sheet. The other option is to rewrite the mail template "message_user_assigned" and to adapt mail_thread.py to accept other field than user_id, but this task is let for later. --- addons/hr_expense/models/hr_expense.py | 14 +++++++------- addons/hr_expense/report/hr_expense_report.xml | 2 +- addons/hr_expense/views/hr_expense_views.xml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index 0d50cf95af8..39d062820a9 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -475,7 +475,7 @@ class HrExpenseSheet(models.Model): employee_id = fields.Many2one('hr.employee', string="Employee", required=True, readonly=True, states={'submit': [('readonly', False)]}, default=lambda self: self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)) address_id = fields.Many2one('res.partner', string="Employee Home Address") payment_mode = fields.Selection([("own_account", "Employee (to reimburse)"), ("company_account", "Company")], related='expense_line_ids.payment_mode', default='own_account', readonly=True, string="Paid By") - responsible_id = fields.Many2one('res.users', 'Manager', readonly=True, copy=False, states={'submit': [('readonly', False)]}, track_visibility='onchange') + user_id = fields.Many2one('res.users', 'Manager', readonly=True, copy=False, states={'submit': [('readonly', False)]}, track_visibility='onchange', oldname='responsible_id') total_amount = fields.Monetary('Total Amount', currency_field='currency_id', compute='_compute_amount', store=True, digits=dp.get_precision('Account')) company_id = fields.Many2one('res.company', string='Company', readonly=True, states={'submit': [('readonly', False)]}, default=lambda self: self.env.user.company_id) currency_id = fields.Many2one('res.currency', string='Currency', readonly=True, states={'submit': [('readonly', False)]}, default=lambda self: self.env.user.company_id.currency_id) @@ -506,7 +506,7 @@ class HrExpenseSheet(models.Model): def _onchange_employee_id(self): self.address_id = self.employee_id.address_home_id self.department_id = self.employee_id.department_id - self.responsible_id = self.employee_id.expense_manager_id + self.user_id = self.employee_id.expense_manager_id @api.multi @api.constrains('expense_line_ids') @@ -558,7 +558,7 @@ class HrExpenseSheet(models.Model): return 'hr_expense.mt_expense_refused' elif 'state' in init_values and self.state == 'done': return 'hr_expense.mt_expense_paid' - elif 'responsible_id' in init_values: + elif 'user_id' in init_values: return 'hr_expense.mt_expense_responsible' return super(HrExpenseSheet, self)._track_subtype(init_values) @@ -591,8 +591,8 @@ class HrExpenseSheet(models.Model): for partner in users.mapped('partner_id'): values['message_follower_ids'] += MailFollowers._add_follower_command(self._name, [], {partner.id: None}, {})[0] - if values.get('responsible_id') and values.get('responsible_id') != values.get('employee_id'): - resp_partner = self.env['res.users'].browse(values['responsible_id']) + if values.get('user_id') and values.get('user_id') != employee.user_id.id: + resp_partner = self.env['res.users'].browse(values['user_id']) values['message_follower_ids'] += MailFollowers._add_follower_command(self._name, [], {resp_partner.partner_id.id: None}, {})[0] # -------------------------------------------- @@ -644,8 +644,8 @@ class HrExpenseSheet(models.Model): def approve_expense_sheets(self): if not self.user_has_groups('hr_expense.group_hr_expense_user'): raise UserError(_("Only HR Officers can approve expenses")) - responsible = self.responsible_id.id or self.env.user.id - self.write({'state': 'approve', 'responsible_id': responsible}) + responsible_id = self.user_id.id or self.env.user.id + self.write({'state': 'approve', 'user_id': responsible_id}) @api.multi def paid_expense_sheets(self): diff --git a/addons/hr_expense/report/hr_expense_report.xml b/addons/hr_expense/report/hr_expense_report.xml index 375616a8f42..46d6fe80a49 100644 --- a/addons/hr_expense/report/hr_expense_report.xml +++ b/addons/hr_expense/report/hr_expense_report.xml @@ -22,7 +22,7 @@
Validated By: -

+

Payment By: diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml index e18e85ddacc..b42cdacb93d 100644 --- a/addons/hr_expense/views/hr_expense_views.xml +++ b/addons/hr_expense/views/hr_expense_views.xml @@ -429,7 +429,7 @@ - +