From b2414b118d3e82ff06de7fafc5c8aae50207ad7f Mon Sep 17 00:00:00 2001 From: jbm-odoo Date: Tue, 18 Feb 2020 16:29:19 +0000 Subject: [PATCH] [IMP] hr_expense: Add dashboard for My Expenses closes odoo/odoo#45659 Taskid: 2198487 Signed-off-by: Yannick Tivisse (yti) --- addons/hr_expense/__manifest__.py | 1 + addons/hr_expense/models/hr_expense.py | 31 +++++++ .../static/src/js/documents_upload.js | 40 --------- .../hr_expense/static/src/js/expense_views.js | 85 +++++++++++++++++++ .../static/src/scss/hr_expense.scss | 23 +++++ .../static/src/xml/expense_dashboard.xml | 20 +++++ addons/hr_expense/views/assets.xml | 5 +- addons/hr_expense/views/hr_expense_views.xml | 16 +++- 8 files changed, 179 insertions(+), 42 deletions(-) delete mode 100644 addons/hr_expense/static/src/js/documents_upload.js create mode 100644 addons/hr_expense/static/src/js/expense_views.js create mode 100644 addons/hr_expense/static/src/scss/hr_expense.scss create mode 100644 addons/hr_expense/static/src/xml/expense_dashboard.xml diff --git a/addons/hr_expense/__manifest__.py b/addons/hr_expense/__manifest__.py index 428ec51806d..ef508c96143 100644 --- a/addons/hr_expense/__manifest__.py +++ b/addons/hr_expense/__manifest__.py @@ -46,6 +46,7 @@ This module also uses analytic accounting and is compatible with the invoice on 'demo': ['data/hr_expense_demo.xml'], 'qweb': [ "static/src/xml/documents_upload_views.xml", + "static/src/xml/expense_dashboard.xml", ], 'installable': True, 'application': True, diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index c97361868bf..1f77dcdc4d4 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -504,6 +504,37 @@ class HrExpense(models.Model): self.sheet_id.message_post_with_view('hr_expense.hr_expense_template_refuse_reason', values={'reason': reason, 'is_sheet': False, 'name': self.name}) + @api.model + def get_expense_dashbord(self): + if not self.env.user.employee_ids: + return + expenses = self.read_group( + [ + ('employee_id', 'in', self.env.user.employee_ids.ids), + ('payment_mode', '=', 'own_account'), + ('state', 'in', ['draft', 'reported', 'approved']) + ], ['total_amount', 'currency_id', 'state'], ['state', 'currency_id'], lazy=False) + expense_state = { + 'draft': { + 'description': _('to report'), + 'amount': list(), + }, + 'reported': { + 'description': _('under validation'), + 'amount': list(), + }, + 'approved': { + 'description': _('to be reimbursed'), + 'amount': list(), + } + } + for expense in expenses: + state = expense['state'] + currency = expense['currency_id'][0] + amount = expense['total_amount'] + expense_state[state]['amount'].append((currency, amount)) + return expense_state + # ---------------------------------------- # Mail Thread # ---------------------------------------- diff --git a/addons/hr_expense/static/src/js/documents_upload.js b/addons/hr_expense/static/src/js/documents_upload.js deleted file mode 100644 index 515c34bb013..00000000000 --- a/addons/hr_expense/static/src/js/documents_upload.js +++ /dev/null @@ -1,40 +0,0 @@ -odoo.define('hr_expense.expenses.tree', function (require) { -"use strict"; - var DocumentUploadMixin = require('hr_expense.documents.upload.mixin'); - var KanbanController = require('web.KanbanController'); - var KanbanView = require('web.KanbanView'); - var ListController = require('web.ListController'); - var ListView = require('web.ListView'); - var viewRegistry = require('web.view_registry'); - - var ExpensesListController = ListController.extend(DocumentUploadMixin, { - buttons_template: 'ExpensesListView.buttons', - events: _.extend({}, ListController.prototype.events, { - 'click .o_button_upload_expense': '_onUpload', - 'change .o_expense_documents_upload .o_form_binary_form': '_onAddAttachment', - }), - }); - - var ExpensesListView = ListView.extend({ - config: _.extend({}, ListView.prototype.config, { - Controller: ExpensesListController, - }), - }); - - var ExpensesKanbanController = KanbanController.extend(DocumentUploadMixin, { - buttons_template: 'ExpensesKanbanView.buttons', - events: _.extend({}, KanbanController.prototype.events, { - 'click .o_button_upload_expense': '_onUpload', - 'change .o_expense_documents_upload .o_form_binary_form': '_onAddAttachment', - }), - }); - - var ExpensesKanbanView = KanbanView.extend({ - config: _.extend({}, KanbanView.prototype.config, { - Controller: ExpensesKanbanController, - }), - }); - - viewRegistry.add('hr_expense_tree', ExpensesListView); - viewRegistry.add('hr_expense_kanban', ExpensesKanbanView); -}); diff --git a/addons/hr_expense/static/src/js/expense_views.js b/addons/hr_expense/static/src/js/expense_views.js new file mode 100644 index 00000000000..4a5c72c8a73 --- /dev/null +++ b/addons/hr_expense/static/src/js/expense_views.js @@ -0,0 +1,85 @@ +odoo.define('hr_expense.expenses.tree', function (require) { +"use strict"; + var DocumentUploadMixin = require('hr_expense.documents.upload.mixin'); + var KanbanController = require('web.KanbanController'); + var KanbanView = require('web.KanbanView'); + var ListController = require('web.ListController'); + var ListView = require('web.ListView'); + var viewRegistry = require('web.view_registry'); + var core = require('web.core'); + var ListRenderer = require('web.ListRenderer'); + var session = require('web.session'); + + var QWeb = core.qweb; + + var ExpensesListController = ListController.extend(DocumentUploadMixin, { + buttons_template: 'ExpensesListView.buttons', + events: _.extend({}, ListController.prototype.events, { + 'click .o_button_upload_expense': '_onUpload', + 'change .o_expense_documents_upload .o_form_binary_form': '_onAddAttachment', + }), + }); + + var ExpenseListRenderer = ListRenderer.extend({ + _render: function () { + var self = this; + return this._super.apply(this, arguments).then(function () { + return self._rpc({ + model: 'hr.expense', + method: 'get_expense_dashbord', + context: self.context, + }); + }).then(function (result) { + self.$el.parent().find('.o_expense_container').remove(); + var elem = QWeb.render('hr_expense.dashboard_list_header', { + expenses: result, + render_monetary_field: self.render_monetary_field, + }); + self.$el.before(elem); + }); + }, + render_monetary_field: function (value, currency_id) { + value = value.toFixed(2); + var currency = session.get_currency(currency_id); + if (currency) { + if (currency.position === "after") { + value += currency.symbol; + } else { + value = currency.symbol + value; + } + } + return value; + } + }); + + var ExpensesListViewDashboardUpload = ListView.extend({ + config: _.extend({}, ListView.prototype.config, { + Renderer: ExpenseListRenderer, + Controller: ExpensesListController, + }), + }); + + var ExpensesListViewDashboard = ListView.extend({ + config: _.extend({}, ListView.prototype.config, { + Renderer: ExpenseListRenderer, + }), + }); + + var ExpensesKanbanController = KanbanController.extend(DocumentUploadMixin, { + buttons_template: 'ExpensesKanbanView.buttons', + events: _.extend({}, KanbanController.prototype.events, { + 'click .o_button_upload_expense': '_onUpload', + 'change .o_expense_documents_upload .o_form_binary_form': '_onAddAttachment', + }), + }); + + var ExpensesKanbanView = KanbanView.extend({ + config: _.extend({}, KanbanView.prototype.config, { + Controller: ExpensesKanbanController, + }), + }); + + viewRegistry.add('hr_expense_tree_dashboard_upload', ExpensesListViewDashboardUpload); + viewRegistry.add('hr_expense_tree_dashboard', ExpensesListViewDashboard); + viewRegistry.add('hr_expense_kanban', ExpensesKanbanView); +}); diff --git a/addons/hr_expense/static/src/scss/hr_expense.scss b/addons/hr_expense/static/src/scss/hr_expense.scss new file mode 100644 index 00000000000..7ea3c3d8e51 --- /dev/null +++ b/addons/hr_expense/static/src/scss/hr_expense.scss @@ -0,0 +1,23 @@ +.o_content { + .o_expense_card { + border-bottom: 1px solid darken($o-control-panel-background-color, 20%); + border-right: 1px solid darken($o-control-panel-background-color, 20%); + text-align: center; + padding: 10px; + .content_center { + margin-top: auto; + margin-bottom: auto; + } + div { + line-height: 1; + } + } + + .o_expense_card_last { + border-right: 0px; + } + + .o_expense_purple { + color: $o-enterprise-color; + } +} diff --git a/addons/hr_expense/static/src/xml/expense_dashboard.xml b/addons/hr_expense/static/src/xml/expense_dashboard.xml new file mode 100644 index 00000000000..ad357a501ad --- /dev/null +++ b/addons/hr_expense/static/src/xml/expense_dashboard.xml @@ -0,0 +1,20 @@ + + + + +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+
+
diff --git a/addons/hr_expense/views/assets.xml b/addons/hr_expense/views/assets.xml index 7d0872f858f..90c4c0011a9 100644 --- a/addons/hr_expense/views/assets.xml +++ b/addons/hr_expense/views/assets.xml @@ -3,9 +3,12 @@