diff --git a/models/lefilament_tdb.py b/models/lefilament_tdb.py index dca371dfc4baa439ca8a8fe81c0eb10f9a54a8e4..124fb8d889d71c1e80643593db03239171ae7e96 100644 --- a/models/lefilament_tdb.py +++ b/models/lefilament_tdb.py @@ -104,6 +104,8 @@ class LeFilamentTdb(models.Model): 'facture': 0, 'commandes': 0, 'pipe': 0, + 'pipe_win': 0, + 'pipe_to_win': 0, 'tresorerie': 0, 'entree': 0, 'sortie': 0, @@ -111,6 +113,7 @@ class LeFilamentTdb(models.Model): 'target': 100000, 'cca': 0, 'capital': 0, + 'date_maj': 0, } cr.execute(""" SELECT @@ -118,6 +121,9 @@ class LeFilamentTdb(models.Model): (select sum(amount_untaxed) from account_invoice where state!='draft' and type='out_invoice' and date >= date_trunc('year', current_date) ) as facture, (select sum(residual_company_signed) from account_invoice where state!='draft' and type='out_invoice' ) as a_encaisser, (select sum(planned_revenue*probability/100) from crm_lead where active=True) as pipe, + (select sum(planned_revenue*probability/100) from crm_lead where active=True and probability=100) as pipe_win, + (select sum(planned_revenue*probability/100) from crm_lead where active=True and probability!=100) as pipe_to_win, + (select date from account_bank_statement ORDER BY ID DESC LIMIT 1) as date_maj, (select sum(amount) from account_bank_statement_line ) as tresorerie, (select sum(amount) from account_bank_statement_line where amount > 0 and date >= date_trunc('year', current_date) ) as entree, (select sum(amount) from account_bank_statement_line where amount < 0 and date >= date_trunc('year', current_date) ) as sortie, @@ -135,7 +141,10 @@ class LeFilamentTdb(models.Model): res['facture'] =+ datas[0]['facture'] res['a_encaisser'] =+ datas[0]['a_encaisser'] res['pipe'] =+ datas[0]['pipe'] + res['pipe_win'] =+ datas[0]['pipe_win'] + res['pipe_to_win'] =+ datas[0]['pipe_to_win'] res['tresorerie'] =+ datas[0]['tresorerie'] + res['date_maj'] = datas[0]['date_maj'] res['entree'] =+ datas[0]['entree'] res['sortie'] =+ datas[0]['sortie'] res['variation'] =+ datas[0]['variation'] diff --git a/static/src/css/lefilament_tdb.css b/static/src/css/lefilament_tdb.css index d40e13c12315e9be4526da3fad1f0f1d05dcd4e9..cc0c993e7d49ef0fa331f02263c2fc2cf46b32ac 100644 --- a/static/src/css/lefilament_tdb.css +++ b/static/src/css/lefilament_tdb.css @@ -31,11 +31,18 @@ .yeardashboard { background-color: #F7F7F7; padding: 20px; min-height: 100%; } .yeardashboard h3 { margin: 10px 15px; font-size: 20px; font-weight: 400; border-bottom: 1px solid #ddd; color: #5E6975; } .card { background-color: #fff; color: #73879C; padding: 20px; margin: 10px 0; } +.card a { color: inherit; } .card-half { float: left; width: 50%; } .card-header { margin: 0!important; } +p.card-maj { margin: 0px; font-size: 10px; font-style: italic; font-weight: 300; } .card-number { font-size: 30px; font-weight: 300; margin: 0!important; font-family: "Helvetica Neue", Helvetica, "Open Sans", Arial, sans-serif; } +.card-tab { background-color: #fff; color: #73879C; padding: 20px; margin: 0px 0 10px; } .tresorerie .card-number { font-size: 20px; font-weight: 300; } +.nav-tabs > li > a { border-radius: 0; } +.dashboard-tab .nav-tabs { margin-top: 10px; border-bottom: none; } +.dashboard-tab .nav-tabs > li > a { border: none!important; color: #aaa;} + .ca_target { font-size: 18px; } .btn-tdb { border: 1px solid #eee; border-radius: 0; font-size: 11px; padding: 6px 10px; text-transform: none; } diff --git a/static/src/js/dashboard_year.js b/static/src/js/dashboard_year.js index 05c1ebd8755b01b8f59ba9f134ba4b0c07a5cbc6..9bc5bff92f55663f0e11156606362d8610f3b21e 100644 --- a/static/src/js/dashboard_year.js +++ b/static/src/js/dashboard_year.js @@ -15,7 +15,15 @@ odoo.define('lefilament_tdb.dashboard_year', function (require) { template: 'YearDashboard', events: { - 'click .card': function() { this.mychart.reflow(); }, + 'click .card': function() { + this.mychart.reflow(); + }, + 'click #facture_non_encaisse': function() { + this.facture(); + }, + 'click #commandes': function() { + this.commandes(); + }, }, init: function() { @@ -39,7 +47,8 @@ odoo.define('lefilament_tdb.dashboard_year', function (require) { }, start: function() { - this.render_chart(); + // session.on("request", this, this.render_chart); + return this.render_chart(); }, render_chart: function(chart) { @@ -47,63 +56,18 @@ odoo.define('lefilament_tdb.dashboard_year', function (require) { var pfact = (this.values.facture / this.values.target * 100).toFixed(0); var pcomm = (this.values.commandes / this.values.target * 100).toFixed(0); - var ppipe = (this.values.pipe / this.values.target * 100).toFixed(0); - var ptarg = 100-pfact-pcomm-ppipe; + var ppipe_win = (this.values.pipe_win / this.values.target * 100).toFixed(0); + var ppipe_to_win = (this.values.pipe_to_win / this.values.target * 100).toFixed(0); + var ptarg = 100-pfact-pcomm-ppipe_win-ppipe_to_win; var pfact2 = (this.values.facture); var pcomm2 = (this.values.commandes); - var ppipe2 = (this.values.pipe); - var ptarg2 = this.values.target -pfact2-pcomm2-ppipe2; - - // ctx = this.$el.find('#progressbar')[0]; - // this.chart = this.$el.find('#myChart')[0].getContext('2d'); - - // var bar = new ProgressBar.Circle(ctx, { - // color: '#43B160', - // easing: 'easeInOut', - // strokeWidth: 5, - // trailWidth: 1, - // step: function(state, circle) { - // value = self.progress*100 - // circle.setText( - // '<span class="ca_target">'+ - // self.values.target.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' € </span><br />' - // +'facturé '+ pfact + ' %<br />' - // +'commandes '+ pcomm + ' %<br />' - // +'pipe '+ ppipe + ' %' - // ); - // }, - // }); - // bar.text.style.fontFamily = '"Helvetica Neue", Helvetica, sans-serif'; - // bar.text.style.fontSize = '12px'; - // bar.text.style.color = '#73879C'; - // bar.text.style.textAlign = 'center'; - // bar.animate(self.progress); - - // var pieData = { - // datasets: [{ - // label: '% C.A', - // data: [pfact, pcomm, ppipe, ptarg], - // backgroundColor: ['#43B160', '#EDA35A', '#ED6A5A', '#f0f0f0'], - // borderColor: ['#43B160', '#EDA35A', '#ED6A5A', '#fff'], - // borderWidth: 2, - // }], - // labels: [' Facturé ', ' Commandes ', " Pipe ", " To Do "] - // }; - - // var myDoughnutChart = new Chart( this.chart, { - // type: 'doughnut', - // data: pieData, - // options: { - // cutoutPercentage: 90, - // responsive: true, - // legend: { display: false, }, - // tooltips: { backgroundColor: "rgba(255,255,255,0.8)", bodyFontSize: 14, bodyFontColor: '#73879C', bodyFontStyle: '300',xPadding: 10, yPadding: 10, displayColors: false, }, - // } - // }); + var ppipe2_win = (this.values.pipe_win); + var ppipe2_to_win = (this.values.pipe_to_win); + var ptarg2 = this.values.target -pfact2-pcomm2-ppipe2_to_win-ppipe2_win; hchart = this.$el.find('#hchart')[0]; - Highcharts.setOptions({ colors: ['#8ED8A2', '#F6CCA2', '#F6ACA2', '#f8f8f8'], }); + Highcharts.setOptions({ colors: ['#8ED8A2', '#F6DCA2', '#F6CCA2', '#F6ACA2', '#eee'], }); this.mychart = new Highcharts.chart({ chart: { @@ -116,11 +80,12 @@ odoo.define('lefilament_tdb.dashboard_year', function (require) { self.values.target.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' € </span><br />' +'facturé '+ pfact + ' %<br />' +'commandes '+ pcomm + ' %<br />' - +'pipe '+ ppipe + ' %', + +'gagné '+ ppipe_win + ' %<br />' + +'pipe '+ ppipe_to_win + ' %', align: 'center', verticalAlign: 'middle', style: { 'color': '#73879C', 'font-size': '11px' }, - y: -3, + y: -20, }, plotOptions: { pie: { @@ -150,17 +115,24 @@ odoo.define('lefilament_tdb.dashboard_year', function (require) { series: [{ type: 'pie', innerSize: '85%', - data: [ ['Facturé', pfact2], ['Commandes', pcomm2], ['Pipe', ppipe2], ['To Do', ptarg2], ], + data: [ ['Facturé', pfact2], ['Commandes', pcomm2], ['Gagné', ppipe2_win], ['Pipe', ppipe2_to_win], ['To Do', ptarg2], ], slicedOffset: 0, }], }); + + this.mychart.reflow(); }, render_monetary: function(value) { value = value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' €'; 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>'; @@ -170,26 +142,48 @@ odoo.define('lefilament_tdb.dashboard_year', function (require) { return value; }, - target_clicked: function(ev){ - var self = this; - id = this.session.uid; - - var context = { - 'user_id': self.session.uid, - } - var action = ({ - type: 'ir.actions.act_window', - res_model: 'res.company', - res_id: id, - view_type: 'form', - view_mode: 'form', - views: [[false, 'form']], - target:'current', - context: context - }) - this.do_action(action); + facture: function() { + var self = this; + var context = { 'user_id': this.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','=','out_invoice']], + target:'current', + name: 'Factures en cours', + context: context + }) + + console.log(context); + console.log(action); + + this.do_action(action); + }, + commandes: function() { + var self = this; + var context = { 'user_id': this.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 + }) + + console.log(context); + console.log(action); + + this.do_action(action); }, - }); core.action_registry.add('lefilament_tdb.dashboard_year', YearDashboardView); diff --git a/static/src/xml/lefilament_tdb.xml b/static/src/xml/lefilament_tdb.xml index f6673e899d9f21ab7de2adaa1d5aa6fc9b1bed84..28a2f78f996cea49e3a69b2afeccb9421ffc0f2d 100644 --- a/static/src/xml/lefilament_tdb.xml +++ b/static/src/xml/lefilament_tdb.xml @@ -95,7 +95,9 @@ <div class="card"> <p class="card-header">Commandes en cours</p> <p class="card-number"> - <t t-esc="widget.render_monetary(widget.values.commandes)"></t> + <a id="commandes"> + <t t-esc="widget.render_monetary(widget.values.commandes)"></t> + </a> </p> </div> </div> @@ -107,14 +109,6 @@ </p> </div> </div> - <div class="col-xs-12"> - <div class="card"> - <p class="card-header">Facturé non encaissé</p> - <p class="card-number"> - <t t-esc="widget.render_monetary(widget.values.a_encaisser)"></t> - </p> - </div> - </div> </div> <!-- COLONNE 2 --> <div class="col-xs-6 col-sm-4"> @@ -131,6 +125,7 @@ <div class="col-xs-12"> <div class="card"> <p class="card-header">Trésorerie</p> + <p class="card-maj">Denière mise à jour le <t t-esc="widget.render_date(widget.values.date_maj)"></t></p> <p class="card-number"> <strong><t t-esc="widget.render_monetary(widget.values.tresorerie)"></t></strong> </p> @@ -138,27 +133,38 @@ </div> <div class="col-xs-12"> <div class="card"> - <div class="card-half"> - <p class="card-header">Encaissé</p> + <p class="card-header">Facturé non encaissé</p> + <p class="card-number"> + <t t-esc="widget.render_monetary(widget.values.a_encaisser)"></t> + </p> + </div> + </div> + <div class="col-xs-12 dashboard-tab"> + <ul class="nav nav-tabs" id="myTab2"> + <li class="active"><a data-toggle="tab" href="#variation">Variation</a></li> + <li><a data-toggle="tab" href="#e_s">Entrées/Sorties</a></li> + </ul> + <div class="tab-content card-tab" id="myTab2Content"> + <div id="variation" class="tab-pane fade active in"> <p class="card-number"> - <t t-esc="widget.render_monetary(widget.values.entree)"></t> + <t t-raw="widget.render_monetary_color(widget.values.variation)"></t> </p> </div> - <div class="card-half"> - <p class="card-header">Sorties</p> - <p class="card-number"> - <t t-esc="widget.render_monetary(widget.values.sortie)"></t> - </p> + <div id="e_s" class="tab-pane fade"> + <div class="card-half"> + <p class="card-header">Encaissé</p> + <p class="card-number"> + <t t-esc="widget.render_monetary(widget.values.entree)"></t> + </p> + </div> + <div class="card-half"> + <p class="card-header">Sorties</p> + <p class="card-number"> + <t t-esc="widget.render_monetary(widget.values.sortie)"></t> + </p> + </div> + <div class="clearfix"></div> </div> - <div class="clearfix"></div> - </div> - </div> - <div class="col-xs-12"> - <div class="card"> - <p class="card-header">Variation</p> - <p class="card-number"> - <t t-raw="widget.render_monetary_color(widget.values.variation)"></t> - </p> </div> </div> <div class="col-xs-12"> diff --git a/views/assets.xml b/views/assets.xml index dcddddb23e864e240fcc6617206d4a53e0a4c52a..8b412281788b2d9b8db652a974e5b925743084f0 100644 --- a/views/assets.xml +++ b/views/assets.xml @@ -8,11 +8,9 @@ <link href="/lefilament_tdb/static/src/css/lefilament_tdb.css" rel="stylesheet" /> <script type="text/javascript" src="/lefilament_tdb/static/src/lib/highcharts.js"></script> - <script type="text/javascript" src="/lefilament_tdb/static/src/lib/chart.js"></script> <script type="text/javascript" src="/lefilament_tdb/static/src/lib/xlsx.core.min.js"></script> <script type="text/javascript" src="/lefilament_tdb/static/src/lib/FileSaver.min.js"></script> <script type="text/javascript" src="/lefilament_tdb/static/src/lib/tableexport.js"></script> - <script type="text/javascript" src="/lefilament_tdb/static/src/lib/progressBar.js"></script> <script type="text/javascript" src="/lefilament_tdb/static/src/js/lefilament_tdb.js"></script> <script type="text/javascript" src="/lefilament_tdb/static/src/js/dashboard_year.js"></script>