// © 2019 Le Filament (<http://www.le-filament.com>) // License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). odoo.define('lefilament_tdb.dashboard_year', function (require) { "use strict"; var core = require('web.core'); var session = require('web.session'); var AbstractAction = require('web.AbstractAction'); var QWeb = core.qweb; var YearDashboardView = AbstractAction.extend({ template: 'YearDashboard', events: { 'click #facture': function(e) { var fiscalyear = e.target.dataset.fiscalyear; this.facture(fiscalyear); }, 'click #facture_non_encaisse': function() { this.facture_non_encaisse(); }, 'click #commandes': function() { this.commandes(); }, 'click #pipe_link': function(e) { var fiscalyearnext = e.target.dataset.fiscalyearnext; this.pipe(fiscalyearnext); }, 'click #pipe_n1_link': function(e) { var fiscalyearnext = e.target.dataset.fiscalyearnext; this.pipe_n1(fiscalyearnext); }, 'click #fournisseur_link': function() { this.fournisseur(); }, 'click #releve': function() { this.releve(); }, }, init: function() { var result = this._super.apply(this, arguments); return result; }, willStart: function() { var deferred = new jQuery.Deferred(); var self = this; this.values = {}; this.progess = 0; var invoice_view_id = this._rpc({ model: 'ir.model.data', method: 'xmlid_to_res_id', args: ['account.invoice_form'], }).then(function(results) { self.invoice_view_id = results; }); var pipe_view_id = this._rpc({ model: 'ir.model.data', method: 'xmlid_to_res_id', args: ['crm.crm_case_form_view_oppor'], }).then(function(results) { self.pipe_view_id = results; }); this._rpc({ model: 'lefilament.dashboard', method: 'retrieve_datas_dashboard', args: [], }) .then(function(results) { self.values = results; self.pfact2 = (self.values.facture); self.pcomm2 = (self.values.commandes); self.ppipe2_win = (self.values.pipe_win); self.ppipe2_to_win = (self.values.pipe_to_win); if (self.values.target > 0) { self.pfact = (self.values.facture / self.values.target * 100).toFixed(0); self.pcomm = (self.values.commandes / self.values.target * 100).toFixed(0); self.ppipe_win = (self.values.pipe_win / self.values.target * 100).toFixed(0); self.ppipe_to_win = (self.values.pipe_to_win / self.values.target * 100).toFixed(0); self.ptarg = 100-self.pfact-self.pcomm-self.ppipe_win-self.ppipe_to_win; self.ptarg2 = self.values.target -self.pfact2-self.pcomm2-self.ppipe2_to_win-self.ppipe2_win; self.total = ((self.values.facture + self.values.commandes + self.values.pipe_win) / self.values.target * 100).toFixed(0); } else { self.pfact = 'n/a'; self.pcomm = 'n/a'; self.ppipe_win = 'n/a'; self.ppipe_to_win = 'n/a'; self.ptarg = 'n/a'; self.ptarg2 = 'n/a'; self.total = 'n/a'; } self.total2 = self.pfact2 + self.pcomm2 + self.ppipe2_win self.target = self.values.target deferred.resolve(); }); return jQuery.when(this._super.apply(this, arguments),deferred); }, start: function() { return this.render_chart(); }, render_chart: function(chart) { self = this; ///////////////////////////////////////// // Etat d'avancement -> Bar Chart // ///////////////////////////////////////// this.ctx = this.$el.find('#target')[0].getContext('2d'); var ptarg = this.ptarg; var max_xaxis = 100; if (this.ptarg < 0 ) { ptarg = 0; max_xaxis = 100 - this.ptarg; } var dataset_stacked = [ { label: 'Facturé', data: [this.pfact], backgroundColor: '#8ED8A2', }, { label: 'Commandes', data: [this.pcomm], backgroundColor: '#F6DCA2', }, { label: 'Gagné', data: [this.ppipe_win], backgroundColor: '#F6CCA2', }, { label: 'Pipe', data: [this.ppipe_to_win], backgroundColor: '#F6ACA2', }, { label: 'To Do', data: [ptarg], backgroundColor: '#eee', }, ]; var label = 'Année ' + moment(Date.now()).format('YYYY'); this.targetData = { labels : [label], datasets : dataset_stacked }; var options = { responsive: true, legend: { display: false, }, layout: { padding: { left:0, right: 0, bottom: 20, top: 20, }, }, scales: { xAxes: [{ stacked: true, scaleShowLabels: false, display : true , ticks: { max: max_xaxis, stepSize: 25, fontSize: 9, fontColor: '#999', callback: function(value, index, values) { return value + '%'; }, }, gridLines: { zeroLineColor: 'rgba(0, 0, 0, 0.1)', drawBorder: false, tickMarkLength: 2, }, }], yAxes: [{ stacked: true, scaleShowLabels: false, display : false , }] }, tooltips: { backgroundColor: 'rgba(255,255,255,0.8)', titleFontStyle: 'normal', titleFontColor: '#999', bodyFontColor: '#777', callbacks: { label: function(tooltipItems, data) { return (tooltipItems.xLabel * self.target / 100000).toLocaleString('fr', { maximumFractionDigits: 2 }) + ' K€'; } } }, responsive: true, } var myLineChart = new Chart(this.ctx, { type: 'horizontalBar', data: this.targetData, options } ); }, render_monetary: function(value) { value = value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' €'; return value; }, render_keur: function(value) { value = (value/ 1000).toLocaleString('fr', { maximumFractionDigits: 0 }) + ' K€'; return value; }, render_percent: function(value) { value = value.toLocaleString('fr', { maximumFractionDigits: 1 }) + ' %'; return value; }, render_date: function(value) { var dateFormat = new Date(value); var new_value = moment(dateFormat).format('Do MMM YYYY'); return new_value; }, render_monetary_color: function(value) { if (value >= 0) value = '<span class="positive">'+value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' €</span>'; else value = '<span class="negative">'+value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' €</span>'; return value; }, facture: function(fiscalyear) { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'account.invoice', view_type: 'form', view_mode: 'tree,form', views: [[false, 'list'], [false, 'pivot'], [false, 'graph'], [self.invoice_view_id, 'form']], domain: [['state','in',['open','paid']],['type','in',['out_invoice', 'out_refund']],['date_invoice','>=',fiscalyear]], target:'current', name: 'Facturé', context: context }) this.do_action(action); }, commandes: function() { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'sale.order', view_type: 'form', view_mode: 'tree,form', views: [[false, 'list'], [false, 'form']], domain: [['invoice_status','=','to invoice']], target:'current', name: 'Commandes en cours', context: context }) this.do_action(action); }, pipe: function(fiscalyearnext) { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'crm.lead', view_type: 'form', view_mode: 'tree,form', views: [[false, 'kanban'], [false, 'list'], [this.pipe_view_id, 'form']], domain: ['|',['date_deadline','<=', fiscalyearnext],['date_deadline','=', null], ['type','=','opportunity'] ], target:'current', name: 'Pipe', context: context }) this.do_action(action); }, pipe_n1: function(fiscalyearnext) { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'crm.lead', view_type: 'form', view_mode: 'kanban,tree,form', views: [[false, 'kanban'], [false, 'list'], [this.pipe_view_id, 'form']], domain: [['type','=','opportunity'],['date_deadline','>', fiscalyearnext]], target:'current', name: 'Pipe', context: context }) this.do_action(action); }, facture_non_encaisse: function() { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'account.invoice', view_type: 'form', view_mode: 'tree,form', views: [[false, 'list'], [false, 'pivot'], [false, 'graph'], [self.invoice_view_id, 'form']], domain: [['state','=','open'],['type','=','out_invoice']], target:'current', name: 'Factures en cours', context: context }) this.do_action(action); }, fournisseur: function() { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'account.invoice', view_type: 'form', view_mode: 'tree,form', views: [[false, 'list'], [false, 'form']], domain: [['state','=','open'],['type','=','in_invoice']], target:'current', name: 'Factures fournisseurs en cours', context: context }) this.do_action(action); }, releve: function() { var self = this; var context = { 'user_id': session.uid, } var action = ({ type: 'ir.actions.act_window', res_model: 'account.bank.statement', view_type: 'form', view_mode: 'tree,form', views: [[false, 'list'], [false, 'form']], target:'current', name: 'Relevés en cours', context: context }) this.do_action(action); }, }); core.action_registry.add('lefilament_tdb.dashboard_year', YearDashboardView); });