Skip to content
Extraits de code Groupes Projets
Valider 292017e7 rédigé par Benjamin's avatar Benjamin
Parcourir les fichiers

[init] initialisation du module

parent
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
# -*- coding: utf-8 -*-
import models
# -*- coding: utf-8 -*-
{
'name': "Le Filament - Tableau de Bord",
'summary': """
Rapports Le Filament""",
'description': """
Tableaux de Bord Le Filament
""",
'author': "LE FILAMENT",
'category': 'dashboard',
'website': "http://www.le-filament.com",
'version': '0.1',
'depends': ['base','crm','account'],
'data': [
'views/assets.xml',
'views/views.xml',
'views/schedule.xml',
'security/lefilament_dashboard_security.xml',
'security/ir.model.access.csv',
],
'qweb': [
'static/src/xml/lefilament_tdb.xml',
],
}
\ No newline at end of file
# -*- coding: utf-8 -*-
import lefilament_tdb
# -*- coding: utf-8 -*-
from openerp import models, fields, api
from openerp import tools
from datetime import datetime
class LeFilamentTdb(models.Model):
""" SAPOVAL DASHBOARD """
_name = "lefilament.dashboard"
_description = "Le Filament Dashboard"
_order = "date_tdb desc"
name = fields.Char( 'Mois', compute='get_month')
date_tdb = fields.Date( 'Date', required=True, default=datetime.today().strftime('%Y-%m-%d'),)
ca_mois = fields.Float( 'Facturé', compute="dashboard_values", store=True)
cmd_mois = fields.Float( 'Commandes', compute="dashboard_values", store=True)
pipe_mois = fields.Float( 'Pipe', compute="dashboard_values", store=True )
treso = fields.Float( 'Trésorerie', compute="dashboard_values", store=True )
variation = fields.Float( 'Variation', compute="dashboard_values", store=True )
charges = fields.Float( 'Décaissé', compute="dashboard_values", store=True )
encaisse = fields.Float( 'Encaissé', compute="dashboard_values", store=True )
runway = fields.Float( 'Runway', compute="runway_value", )
@api.multi
@api.depends('date_tdb')
def dashboard_values(self):
for record in self:
if record.date_tdb :
date_tdb = datetime.strptime(record.date_tdb, '%Y-%m-%d')
############## CA ################
# CA TOTAL
self.env.cr.execute("select sum(amount_untaxed) from account_invoice where state!='draft' and type='out_invoice' and date >= date_trunc('month', %s) and date < date_trunc('month', %s + interval '1' month);", (date_tdb, date_tdb) )
ca_mois = self.env.cr.fetchone()[0]
############## COMMANDES ################
# TOTAL
self.env.cr.execute("select sum(amount_untaxed) from sale_order where invoice_status!='no' and date_order >= date_trunc('month', %s) and date_order < date_trunc('month', %s + interval '1' month);", (date_tdb, date_tdb) )
cmd_mois = self.env.cr.fetchone()[0]
############## PIPE ################
# TOTAL
self.env.cr.execute("select sum(planned_revenue*probability/100) from crm_lead where active=True;")
pipe = self.env.cr.fetchone()[0]
############## TRESO ################
# Trésorerie
self.env.cr.execute("select sum(amount) from account_bank_statement_line where date < date_trunc('month', %s + interval '1' month);", (date_tdb, ) )
treso_total = self.env.cr.fetchone()[0]
# CHARGES
self.env.cr.execute("select sum(amount) from account_bank_statement_line where amount < 0 and date >= date_trunc('month', %s) and date < date_trunc('month', %s + interval '1' month);", (date_tdb, date_tdb) )
charges = self.env.cr.fetchone()[0]
# ENCAISSE
self.env.cr.execute("select sum(amount) from account_bank_statement_line where amount > 0 and date >= date_trunc('month', %s) and date < date_trunc('month', %s + interval '1' month);", (date_tdb, date_tdb) )
encaisse = self.env.cr.fetchone()[0]
if not encaisse:
encaisse = 0
if not charges:
charges = 0
record.ca_mois = ca_mois
record.cmd_mois = cmd_mois
record.pipe_mois = pipe
record.treso = treso_total
record.charges = charges * (-1.0)
record.encaisse = encaisse
record.variation = encaisse + charges
@api.multi
@api.depends('charges','treso')
def runway_value(self):
for record in self:
if record.charges :
record.runway = record.treso / record.charges
@api.one
def get_month(self):
months = ['Janv', 'Fév', 'Mars', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sept', 'Oct', 'Nov', 'Dec']
date_tdb = self.date_tdb
month = int(date_tdb[5:7])
year = date_tdb[2:4]
self.name = months[month-1] + " " + year
@api.model
def new_data(self):
self.create({ 'date_tdb': str(datetime.now()) })
def retrieve_datas_dashboard(self, cr, uid, context=None):
res = {
'facture': 0,
'commandes': 0,
'pipe': 0,
'tresorerie': 0,
'entree': 0,
'sortie': 0,
'variation': 0,
'target': 100000,
}
cr.execute("""
SELECT
(select count(*) from account_invoice) as id,
(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(planned_revenue*probability/100) from crm_lead where active=True) as pipe,
(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,
(select sum(amount) from account_bank_statement_line where date >= date_trunc('year', current_date) ) as variation,
(select sum(price_subtotal-qty_invoiced*price_unit) from sale_order_line where invoice_status='to invoice') as commandes; """)
datas = cr.dictfetchall()
res['facture'] =+ datas[0]['facture']
res['pipe'] =+ datas[0]['pipe']
res['tresorerie'] =+ datas[0]['tresorerie']
res['entree'] =+ datas[0]['entree']
res['sortie'] =+ datas[0]['sortie']
res['variation'] =+ datas[0]['variation']
res['commandes'] =+ datas[0]['commandes']
return res
class LeFilamentData(models.Model):
_name = "lefilament.dashboard.data"
_auto = False
_description = "Donnees Annuelles"
facture = fields.Float("Facturé")
pipe = fields.Float("Pipe")
tresorerie = fields.Float("Trésorerie")
commandes = fields.Float("Commandes en cours")
entree = fields.Float("Entrées")
sortie = fields.Float("Sorties")
variation = fields.Float("Variation")
def init(self, cr):
tools.drop_view_if_exists(cr, 'lefilament_dashboard_data')
cr.execute("""
CREATE OR REPLACE VIEW lefilament_dashboard_data AS (
select
(select count(*) from account_invoice) as id,
(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(planned_revenue*probability/100) from crm_lead where active=True) as pipe,
(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,
(select sum(amount) from account_bank_statement_line where date >= date_trunc('year', current_date) ) as variation,
(select sum(price_subtotal-qty_invoiced*price_unit) from sale_order_line where invoice_status='to invoice') as commandes); """)
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_lefilament_dashboard_group_user,lefilament.dashboard.user,model_lefilament_dashboard,group_dashboard,1,1,1,1
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<!-- Définition des groupes utilisateurs -->
<record id="group_dashboard" model="res.groups">
<field name="name">Voir les tableaux de bord</field>
<field name="category_id" ref="base.module_category_dashboard"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
</record>
</data>
</odoo>
\ No newline at end of file
static/description/icon.png

8,95 ko

.content { width: calc(100% - 190px); padding: 10px 25px; }
.content h3 { font-size: 20px; margin: 20px 0; }
.tableau { overflow: auto; margin-left: 150px; font-size: 11px; margin-top: 30px; }
.table-sapoval { font-family: "Helvetica Neue", Helvetica, "Open Sans"; }
.table-sapoval > thead > tr > th:first-child,
.table-sapoval > tbody > tr > th:first-child { position: absolute; left: 25px; width: 150px; }
.table-sapoval > thead > tr > th,
.table-sapoval > tbody > tr > th,
.table-sapoval > tbody > tr > td { min-width: 100px; line-height: 1.15em; border-right: thin solid #f0f0f0; }
.table-sapoval > thead > tr > th { border: 0; }
.table-sapoval > thead > tr > th { background-color: #fff; text-transform: uppercase; font-weight: 300; }
.table-sapoval tr:nth-child(even),
.table-sapoval tr:nth-child(even) { background-color: #F0F0F0; }
.table-sapoval > thead > tr:nth-child(even) th,
.table-sapoval > tbody > tr:nth-child(even) th { background-color: #F0F0F0; }
.positive { color: #2ECC71; }
.negative { color: #E74C3C; }
.section-data { font-weight: 700; }
/*.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 h3 { margin: 10px 30px; font-size: 20px; font-weight: 400; border-bottom: 1px solid #ddd; color: #5E6975; }
.card { background-color: #fff; color: #73879C; padding: 20px; margin: 10px; }
.card-header { margin: 0!important; }
.card-number { font-size: 30px; font-weight: 300; margin: 0!important; font-family: "Helvetica Neue", Helvetica, "Open Sans", Arial, sans-serif; }
.tresorerie .card-number { font-size: 20px; font-weight: 300; }
\ No newline at end of file
odoo.define('lefilament_tdb.dashboard_year', function (require) {
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 YearDashboardView = Widget.extend({
template: 'YearDashboard',
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
new Model('lefilament.dashboard')
.call('retrieve_datas_dashboard', [])
.then(function(results) {
self.values = results;
self.progress = results.facture / results.target;
deferred.resolve();
});
return jQuery.when(this._super.apply(this, arguments),deferred);
},
start: function() {
self = this;
ctx = this.$el.find('#progressbar')[0];
var bar = new ProgressBar.Circle(ctx, {
color: '#ED6A5A', //FFEA82
easing: 'easeInOut',
strokeWidth: 5,
trailWidth: 1,
step: function(state, circle) {
value = self.progress*100
circle.setText(
self.values.target.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' € <br />'
+value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' %');
}
});
bar.text.style.fontFamily = '"Raleway", Helvetica, sans-serif';
bar.text.style.fontSize = '2rem';
bar.text.style.color = '#73879C';
this.$el.find('.progressbar-text').css('opacity',self.progress)
bar.text.style.textAlign = 'center';
bar.animate(self.progress);
},
render_monetary: function(value) {
value = value.toLocaleString('fr', { maximumFractionDigits: 0 }) + '';
return 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;
},
});
core.action_registry.add('lefilament_tdb.dashboard_year', YearDashboardView);
});
odoo.define('lefilament_tdb.dashboard', function(require) {
var core = require('web.core');
var data = require('web.data');
var Widget = require('web.Widget');
var model = require('web.Model');
var form_common = require('web.form_common');
var session = require('web.session');
var formats = require('web.formats');
var _t = core._t;
var QWeb = core.qweb;
var LeFilamentDashboard = Widget.extend({
template: 'Dashboard',
init: function() {
var result = this._super.apply(this, arguments);
return result;
},
willStart: function() {
var deferred = new jQuery.Deferred();
var self = this;
this.request = {};
new data.Query(new model("lefilament.dashboard"), [])
.order_by("-date_tdb")
.limit(12)
.all()
.then(function(results) {
self.request = results;
deferred.resolve();
});
return jQuery.when(this._super.apply(this, arguments),deferred);
},
start: function() {
},
render_monetary: function(value) {
value = value.toLocaleString('fr', { maximumFractionDigits: 0 }) + '';
return value;
},
render_monetary_color: function(value) {
if (value >= 0)
value = '<td class="positive">+ '+value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' €</td>';
else
value = '<td class="negative">'+value.toLocaleString('fr', { maximumFractionDigits: 0 }) + ' €</td>';
return value;
},
render_percent: function(value) {
value = value.toLocaleString('fr', { maximumFractionDigits: 1 }) + ' %';
return value;
},
render_decimal: function(value) {
value = value.toLocaleString('fr', { maximumFractionDigits: 2 });
return value;
},
});
core.action_registry.add('lefilament_tdb.dashboard', LeFilamentDashboard);
});
\ No newline at end of file
Ce diff est replié.
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="Dashboard">
<div class="content">
<h3>Tableau de Bord</h3>
<div class="tableau">
<table class="table table-sapoval" id="dataTable">
<thead>
<tr>
<th>Mois</th>
<th t-foreach="widget.request" t-as="t">
<t t-esc="t.name"/>
</th>
</tr>
</thead>
<tbody>
<tr id="ca" class="section-data">
<th>Facturé</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_monetary(t['ca_mois'])"></t>
</td>
</tr>
<tr id="cmd">
<th>Commandes</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_monetary(t['cmd_mois'])"></t>
</td>
</tr>
<tr id="pipe">
<th>Pipeline</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_monetary(t['pipe_mois'])"></t>
</td>
</tr>
<tr class="section-data">
<th>Trésorerie</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_monetary(t['treso'])"></t>
</td>
</tr>
<tr>
<th>Variation</th>
<t t-foreach="widget.request" t-as="t">
<t t-raw="widget.render_monetary_color(t['variation'])"></t>
</t>
</tr>
<tr>
<th>Encaissé</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_monetary(t['encaisse'])"></t>
</td>
</tr>
<tr>
<th>Décaissé</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_monetary(t['charges'])"></t>
</td>
</tr>
<tr>
<th>Runway</th>
<td t-foreach="widget.request" t-as="t">
<t t-esc="widget.render_decimal(t['runway'])"></t>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</t>
<t t-name="YearDashboard">
<div class="yeardashboard">
<div class="row">
<!-- COLONNE 1 -->
<div class="col-xs-6 col-sm-4">
<h3>En Cours</h3>
<div class="col-xs-12">
<div class="card">
<p class="card-header">Facturé</p>
<p class="card-number">
<t t-esc="widget.render_monetary(widget.values.facture)"></t>
</p>
</div>
</div>
<div class="col-xs-12">
<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>
</p>
</div>
</div>
<div class="col-xs-12">
<div class="card">
<p class="card-header">Pipe</p>
<p class="card-number">
<t t-esc="widget.render_monetary(widget.values.pipe)"></t>
</p>
</div>
</div>
</div>
<!-- COLONNE 2 -->
<div class="col-xs-6 col-sm-4">
<h3>Objectif</h3>
<div class="col-xs-12">
<div class="card">
<div id="progressbar"></div>
</div>
</div>
</div>
<!-- COLONNE 3 -->
<div class="col-xs-6 col-sm-4 tresorerie">
<h3>Trésorerie</h3>
<div class="col-xs-12">
<div class="card">
<p class="card-header">Trésorerie</p>
<p class="card-number">
<strong><t t-esc="widget.render_monetary(widget.values.tresorerie)"></t></strong>
</p>
</div>
</div>
<div class="col-xs-12">
<div class="card">
<p class="card-header">Encaissé</p>
<p class="card-number">
<t t-esc="widget.render_monetary(widget.values.entree)"></t>
</p>
</div>
</div>
<div class="col-xs-12">
<div class="card">
<p class="card-header">Sorties</p>
<p class="card-number">
<t t-esc="widget.render_monetary(widget.values.sortie)"></t>
</p>
</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>
</div>
</div>
</t>
</templates>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="lefilament_tdb_assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link href="/lefilament_tdb/static/src/css/lefilament_tdb.css" rel="stylesheet" />
<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>
</xpath>
</template>
</data>
</openerp>
\ No newline at end of file
<openerp>
<data noupdate="1">
<record id="ir_cron_sapova_tdb" model="ir.cron">
<field name="name">Tableau de Bord - Le Filament</field>
<field name="active" eval="True" />
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">months</field>
<field name="numbercall">-1</field>
<field name="doal">1</field>
<field name="nextcall" >2017-01-31 23:10:00</field>
<field name="model" eval="'lefilament.dashboard'" />
<field name="function" eval="'new_data'" />
<field name="args" eval="" />
<field name="priority" eval="5" />
</record>
</data>
</openerp>
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<act_window id="lefilament_dashboard_action" name="Dashboard - Le Filament" res_model="lefilament.dashboard" view_mode="tree,graph,form,pivot" />
<record id="action_home_page" model="ir.actions.client">
<field name="name">Dashboard - Le Filament</field>
<field name="tag">lefilament_tdb.dashboard</field>
</record>
<record id="action_year_page" model="ir.actions.client">
<field name="name">Rapport Annuel</field>
<field name="tag">lefilament_tdb.dashboard_year</field>
</record>
<menuitem id="lefilament_dashboard_menu" name="Dashboard" sequence="10"/>
<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_dashboard_datas" parent="lefilament_dashboard_menu" name="Données" action="lefilament_dashboard_action" sequence="10"/>
<record id="lefilament_dashboard_tree" model="ir.ui.view">
<field name="name">Le Filament Dashboard Treeview</field>
<field name="model">lefilament.dashboard</field>
<field name="arch" type="xml">
<tree string="Liste des Mois" editable='top'>
<field name="date_tdb" widget="date" />
<field name="name" />
<field name="ca_mois" />
<field name="pipe_mois" />
<field name="treso" />
<field name="variation" />
<field name="charges" />
<field name="encaisse" />
<field name="runway" />
</tree>
</field>
</record>
<record model="ir.ui.view" id="lefilament_dashboard_pivot">
<field name="name">Le Filament Dashboard Pivot</field>
<field name="model">lefilament.dashboard</field>
<field name="type">pivot</field>
<field name="arch" type="xml">
<graph string="TDB Le Filament">
<field name="ca_mois" type="measure" />
<field name="pipe_mois" type="measure" />
<field name="date_tdb" type="row" />
</graph>
</field>
</record>
<record model="ir.ui.view" id="lefilament_dashboard_graph">
<field name="name">Le Filament Dashboard Graph</field>
<field name="model">lefilament.dashboard</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="TDB Le Filament">
<field name="ca_mois" type="measure" />
<field name="date_tdb" type="col" />
</graph>
</field>
</record>
<!-- <record id="lefilament_dashboard_data" model="ir.ui.view">
<field name="name">Le Filament Dashboard Data</field>
<field name="model">lefilament.dashboard.data</field>
<field name="type">pivot</field>
<field name="arch" type="xml">
<pivot class="test_pivot">
<field name="facture" type="measure" />
<field name="commandes" type="measure" />
<field name="pipe" type="measure" />
<field name="tresorerie" type="measure" />
<field name="entree" type="measure" />
<field name="sortie" type="measure" />
<field name="variation" type="measure" />
</pivot>
</field>
</record> -->
</data>
</openerp>
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter