From 4eeeb4f172c10f2a8e190fb9afcf440ddaaf5d34 Mon Sep 17 00:00:00 2001 From: Thomas Carlier Date: Tue, 17 Sep 2019 08:53:31 +0000 Subject: [PATCH] [ADD] hr_expense : add the ability to install OCR module - if checked in settings, OCR can be used to get infos from the attached receipt image - set default product to EXP_GEN when created from picture - use "register_as_main attachment" when expenses are created from receipt images - Add the upload button to the kanban view to see it immediately in the mobile version and use it to create expenses from pictures. (with or without OCR installed) closes odoo/odoo#39559 Related: odoo/enterprise#6493 Signed-off-by: Florian Daloze (fda) --- addons/hr_expense/models/__init__.py | 1 + addons/hr_expense/models/hr_expense.py | 12 +++++++++--- addons/hr_expense/models/res_company.py | 14 ++++++++++++++ addons/hr_expense/models/res_config_settings.py | 4 ++++ addons/hr_expense/static/src/js/upload_mixin.js | 5 ++++- addons/hr_expense/views/hr_expense_views.xml | 4 ++-- .../views/res_config_settings_views.xml | 15 +++++++++++++++ 7 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 addons/hr_expense/models/res_company.py diff --git a/addons/hr_expense/models/__init__.py b/addons/hr_expense/models/__init__.py index af1e04d2dd2..4b256421e3b 100644 --- a/addons/hr_expense/models/__init__.py +++ b/addons/hr_expense/models/__init__.py @@ -7,3 +7,4 @@ from . import hr_expense from . import product_template from . import res_config_settings from . import account_journal_dashboard +from . import res_company diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index f2037823216..07fa8835927 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -181,15 +181,21 @@ class HrExpense(models.Model): if any(attachment.res_id or attachment.res_model != 'hr.expense' for attachment in attachments): raise UserError(_("Invalid attachments!")) + product = self.env['product.product'].search([('default_code', '=', 'EXP_GEN')]) + for attachment in attachments: expense = self.env['hr.expense'].create({ 'name': attachment.name.split('.')[0], 'unit_amount': 0, + 'product_id': product.id }) - attachment.write({'res_id': expense.id}) - expense.message_post(body=_('Uploaded Attachment'), attachment_ids=[attachment.id]) + expense.message_post(body=_('Uploaded Attachment')) + attachment.write({ + 'res_model': 'hr.expense', + 'res_id': expense.id, + }) + attachment.register_as_main_attachment() expenses += expense - if len(expenses) == 1: return { 'name': _('Generated Expense'), diff --git a/addons/hr_expense/models/res_company.py b/addons/hr_expense/models/res_company.py new file mode 100644 index 00000000000..7c2549f47bf --- /dev/null +++ b/addons/hr_expense/models/res_company.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + expense_extract_show_ocr_option_selection = fields.Selection([ + ('no_send', 'Do not digitalize bills'), + ('manual_send', "Digitalize bills on demand only"), + ('auto_send', 'Digitalize all bills automatically')], string="Send mode on expense attachments", + required=True, default='auto_send') diff --git a/addons/hr_expense/models/res_config_settings.py b/addons/hr_expense/models/res_config_settings.py index 1dfe455cad9..17d290531fb 100644 --- a/addons/hr_expense/models/res_config_settings.py +++ b/addons/hr_expense/models/res_config_settings.py @@ -11,6 +11,10 @@ class ResConfigSettings(models.TransientModel): config_parameter='hr_expense.use_mailgateway') module_hr_payroll_expense = fields.Boolean(string='Reimburse Expenses in Payslip') + module_hr_expense_extract = fields.Boolean(string='Send bills to OCR to generate expenses') + expense_extract_show_ocr_option_selection = fields.Selection(related='company_id.expense_extract_show_ocr_option_selection', + string='Expense processing option', readonly=False) + @api.model def get_values(self): diff --git a/addons/hr_expense/static/src/js/upload_mixin.js b/addons/hr_expense/static/src/js/upload_mixin.js index c94df1c6616..4f6660c8039 100644 --- a/addons/hr_expense/static/src/js/upload_mixin.js +++ b/addons/hr_expense/static/src/js/upload_mixin.js @@ -2,6 +2,7 @@ odoo.define('hr_expense.documents.upload.mixin', function (require) { "use strict"; var core = require('web.core'); +var config = require('web.config'); var _t = core._t; var qweb = core.qweb; @@ -43,11 +44,13 @@ var DocumentUploadMixin = { if (!attachent_ids.length) { return self.do_notify(_t("Error"), _t("An error occurred during the upload")); } + var myContext = this.initialState.context + myContext['isMobile'] = config.device.isMobile return this._rpc({ model: 'hr.expense', method: 'create_expense_from_attachments', args: ["", attachent_ids, this.viewType], - context: this.initialState.context, + context: myContext, }).then(function(result) { self.do_action(result); }); diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml index 3b830ee613c..5393460bdd9 100644 --- a/addons/hr_expense/views/hr_expense_views.xml +++ b/addons/hr_expense/views/hr_expense_views.xml @@ -70,8 +70,8 @@