From 71aadd15e79a57d5cc4e84e3661deceaf2b91692 Mon Sep 17 00:00:00 2001 From: Benjamin <Benjamin@MBP-de-Benj.(none)> Date: Fri, 22 Sep 2017 16:11:16 +0200 Subject: [PATCH] add graph tresorerie --- __manifest__.py | 4 +- models/lefilament_tdb.py | 13 +- static/src/css/lefilament_tdb.css | 2 +- static/src/js/tresorerie.js | 196 ++++++++++++++++++++++++++++ static/src/xml/lefilament_treso.xml | 17 +++ views/assets.xml | 1 + views/views.xml | 7 + 7 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 static/src/js/tresorerie.js create mode 100644 static/src/xml/lefilament_treso.xml diff --git a/__manifest__.py b/__manifest__.py index 7d68de8..5672339 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -19,9 +19,9 @@ 'views/schedule.xml', 'security/lefilament_dashboard_security.xml', 'security/ir.model.access.csv', - 'data/ir_module_category.xml' + 'data/ir_module_category.xml' ], 'qweb': [ - 'static/src/xml/lefilament_tdb.xml', + 'static/src/xml/*.xml', ], } diff --git a/models/lefilament_tdb.py b/models/lefilament_tdb.py index 876e07a..6ac2736 100644 --- a/models/lefilament_tdb.py +++ b/models/lefilament_tdb.py @@ -179,5 +179,16 @@ class LeFilamentTdb(models.Model): return res - + @api.model + def tresorerie(self): + self._cr.execute("""SELECT to_char(date_trunc('month', date),'YYYY-MM') as mois, + sum(case when amount > 0 then amount else 0 end ) as entree, + sum(case when amount < 0 then amount else 0 end ) as sortie, + sum(amount) as variation + from account_bank_statement_line + group by date_trunc('month', date) + order by date_trunc('month', date);""") + tresorerie = self._cr.dictfetchall() + + return tresorerie diff --git a/static/src/css/lefilament_tdb.css b/static/src/css/lefilament_tdb.css index 1f50453..09a8f5e 100644 --- a/static/src/css/lefilament_tdb.css +++ b/static/src/css/lefilament_tdb.css @@ -28,7 +28,7 @@ /*.section-data th { background-color: #F0F0F0; } .table > tbody > tr.section-data > td, .table > tbody > tr.section-data th { border-top: 1px solid #000 !important; }*/ -.yeardashboard { background-color: #F7F7F7; padding: 20px; min-height: 100%; } +.yeardashboard { 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; } diff --git a/static/src/js/tresorerie.js b/static/src/js/tresorerie.js new file mode 100644 index 0000000..a7574c9 --- /dev/null +++ b/static/src/js/tresorerie.js @@ -0,0 +1,196 @@ +odoo.define('lefilament_tdb.tresorerie', function (require) { + "use strict"; + + var core = require('web.core'); + var formats = require('web.formats'); + var Model = require('web.Model'); + var session = require('web.session'); + var Widget = require('web.Widget'); + + var QWeb = core.qweb; + + var _t = core._t; + var _lt = core._lt; + + var TresorerieView = Widget.extend({ + template: 'Tresorerie', + + init: function() { + var result = this._super.apply(this, arguments); + return result; + }, + + willStart: function() { + var deferred = new jQuery.Deferred(); + var self = this; + this.values = {}; + + var dash_model = new Model('lefilament.dashboard'); + dash_model.call('tresorerie') + .then(function(results) { + self.values = results; + deferred.resolve(); + }); + return jQuery.when(this._super.apply(this, arguments),deferred); + }, + + start: function() { + return this.render_chart(); + }, + + render_chart: function(chart) { + self = this; + + ///////////////////////////////////////// + // Trésorerie -> Bar Chart // + ///////////////////////////////////////// + this.ctx = this.$el.find('#tresorerie')[0].getContext('2d'); + + var entree = []; + var sortie = []; + var variation = []; + var treso = []; + var labels = []; + + var tabLength = this.values.length - 1; + + _.each(this.values, function(value, key) { + if (key == 0 ) { + treso.push(value.variation); + } else { + var amount = treso[key-1] + value.variation; + treso.push(amount); + } + + }); + + for (var i = (tabLength-11); i < tabLength+1 ; i++) { + entree.push(this.values[i].entree); + sortie.push(this.values[i].sortie * (-1) ); + variation.push(this.values[i].variation); + labels.push(this.values[i].mois); + } + + console.log(treso.slice(tabLength-11, tabLength+1)); + + var datasets = [ + { label: 'Trésorerie', data: treso.slice(tabLength-11, tabLength+1), backgroundColor: 'transparent',borderColor: '#5E8ED5' }, + { label: 'Variation', data: variation, backgroundColor: 'rgba(255, 197, 98, 0.3)',borderColor: '#FFC562' }, + { label: 'Entrées', data: entree, backgroundColor: 'rgba(81, 210, 183, 0.3)', borderColor: '#51d2b7' }, + { label: 'Sorties', data: sortie, backgroundColor: 'rgba(249, 96, 117, 0.3)', borderColor: '#F96075' }, + ]; + + // var label = 'Année ' + moment(Date.now()).format('YYYY'); + + this.targetData = { + labels : labels, + datasets : datasets + }; + + + // var options = { + // legend: { + // display: false, + // }, + // layout: { + // padding: { left:0, right: 0, bottom: 20, top: 20, }, + // }, + // scales: { + // xAxes: [{ + // stacked: true, + // scaleShowLabels: false, + // display : false , + // }], + // 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: 'line', data: this.targetData, } ); + + }, + + 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() { + 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 + }) + + 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 + }) + + this.do_action(action); + }, + }); + + core.action_registry.add('lefilament_tdb.tresorerie', TresorerieView); + + +}); + diff --git a/static/src/xml/lefilament_treso.xml b/static/src/xml/lefilament_treso.xml new file mode 100644 index 0000000..936d14c --- /dev/null +++ b/static/src/xml/lefilament_treso.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<templates xml:space="preserve"> + + + <t t-name="Tresorerie"> + + <div class="card"> + <p class="card-number"> + Trésorerie sur 12 mois + </p> + <hr/> + <canvas id="tresorerie" width="auto" height="100"></canvas> + </div> + + </t> + +</templates> \ No newline at end of file diff --git a/views/assets.xml b/views/assets.xml index 393b96e..4faa4cc 100644 --- a/views/assets.xml +++ b/views/assets.xml @@ -14,6 +14,7 @@ <script type="text/javascript" src="/lefilament_tdb/static/src/lib/tableexport.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> + <script type="text/javascript" src="/lefilament_tdb/static/src/js/tresorerie.js"></script> </xpath> </template> diff --git a/views/views.xml b/views/views.xml index f914724..9a07910 100644 --- a/views/views.xml +++ b/views/views.xml @@ -21,11 +21,18 @@ <field name="tag">lefilament_tdb.dashboard_year</field> </record> + <record id="action_tresorerie" model="ir.actions.client"> + <field name="name">Trésorerie</field> + <field name="tag">lefilament_tdb.tresorerie</field> + <field name="target">new</field> + </record> + <menuitem id="lefilament_dashboard_menu" name="Dashboard" sequence="10" groups="group_dashboard"/> <menuitem id="lefilament_dashboard_report" parent="lefilament_dashboard_menu" name="Rapports" sequence="1"/> <menuitem id="lefilament_dashboard_report_month" parent="lefilament_dashboard_report" name="Mensuel" sequence="2" action="action_home_page"/> <menuitem id="lefilament_dashboard_report_year" parent="lefilament_dashboard_report" name="Annuel" sequence="1" action="action_year_page" /> + <menuitem id="lefilament_tresorerie" parent="lefilament_dashboard_report" name="Trésorerie" sequence="3" action="action_tresorerie" /> <menuitem id="lefilament_dashboard_conf" parent="lefilament_dashboard_menu" name="Configuration" sequence="10"/> <menuitem id="lefilament_dashboard_datas" parent="lefilament_dashboard_conf" name="Données" action="lefilament_dashboard_action" sequence="10"/> -- GitLab