Ajout graphiques CA par groupes

This commit is contained in:
thienan
2021-06-15 15:40:25 +02:00
parent 19cc99d7ff
commit 6902e04e54
7 changed files with 524 additions and 489 deletions

View File

@@ -1,2 +1,3 @@
{ {
"html.validate.scripts": false
} }

View File

@@ -1,60 +1,60 @@
Metadata-Version: 2.1 Metadata-Version: 2.1
Name: mondumas Name: mondumas
Version: 1.0 Version: 1.0
Summary: mondumas Summary: mondumas
Home-page: UNKNOWN Home-page: UNKNOWN
Author: Author:
Author-email: Author-email:
License: UNKNOWN License: UNKNOWN
Keywords: web wsgi bfg pylons pyramid Keywords: web wsgi bfg pylons pyramid
Platform: UNKNOWN Platform: UNKNOWN
Classifier: Programming Language :: Python Classifier: Programming Language :: Python
Classifier: Framework :: Pyramid Classifier: Framework :: Pyramid
Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Provides-Extra: testing Provides-Extra: testing
# README # # README #
Cette application web permet aux collaborateurs de l'entreprise Dumas : Cette application web permet aux collaborateurs de l'entreprise Dumas :
- de consulter et de gérer les dossiers des clients depuis leur tablette - de consulter et de gérer les dossiers des clients depuis leur tablette
- de créer un rapport de fuite et le faire signer par le client - de créer un rapport de fuite et le faire signer par le client
Elle est développée avec les composants open source suivants : Elle est développée avec les composants open source suivants :
## Backend ## Backend
- [Python](https://www.python.org/downloads/) 3.7 - [Python](https://www.python.org/downloads/) 3.7
- [Pyramid web framework](https://trypyramid.com/) 1.10 - [Pyramid web framework](https://trypyramid.com/) 1.10
- [MySQL server](https://mysql.com/) 5.7 sur Windows Server 2008 R2 Standard - [MySQL server](https://mysql.com/) 5.7 sur Windows Server 2008 R2 Standard
- [Apache web server](https://apache.org/) 2.4 sur Debian GNU/Linux 9 (stretch) - [Apache web server](https://apache.org/) 2.4 sur Debian GNU/Linux 9 (stretch)
## Frontend ## Frontend
- [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7 - [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7
- [Jquery](https://jquery.com/download/) for JavaScript 3.2.1 - [Jquery](https://jquery.com/download/) for JavaScript 3.2.1
- Chameleon templates - Chameleon templates
- [FormValidation](https://formvalidation.io/) form validator 0.7.0 - [FormValidation](https://formvalidation.io/) form validator 0.7.0
## Jquery Plugins ## Jquery Plugins
- [DataTables](https://datatables.net/) 1.10.20 - [DataTables](https://datatables.net/) 1.10.20
- [Fullcalendar](https://fullcalendar.io/) 3.9.0 - [Fullcalendar](https://fullcalendar.io/) 3.9.0
- [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4 - [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4
- [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1 - [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1
- [jSignature](https://willowsystems.github.io/jSignature) - [jSignature](https://willowsystems.github.io/jSignature)
- [less.js](http://lesscss.org/) 3.11.1 - [less.js](http://lesscss.org/) 3.11.1
- [moment.js](https://momentjs.com/) with-locales.min.js - [moment.js](https://momentjs.com/) with-locales.min.js
[Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
0.0 0.0
--- ---
- Initial version - Initial version

View File

@@ -25,6 +25,7 @@ mondumas/models/default.py
mondumas/models/devis.py mondumas/models/devis.py
mondumas/models/dossier.py mondumas/models/dossier.py
mondumas/models/parametres.py mondumas/models/parametres.py
mondumas/models/stats.py
mondumas/models/utils.py mondumas/models/utils.py
mondumas/scripts/__init__.py mondumas/scripts/__init__.py
mondumas/views/__init__.py mondumas/views/__init__.py
@@ -34,4 +35,5 @@ mondumas/views/devis.py
mondumas/views/dossier.py mondumas/views/dossier.py
mondumas/views/notfound.py mondumas/views/notfound.py
mondumas/views/parametres.py mondumas/views/parametres.py
mondumas/views/stats.py
mondumas/views/utils.py mondumas/views/utils.py

View File

@@ -1,61 +1,78 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from sqlalchemy import text from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import ( from sqlalchemy.orm import (
scoped_session, scoped_session,
sessionmaker, sessionmaker,
) )
from zope.sqlalchemy import ( from zope.sqlalchemy import (
ZopeTransactionExtension, ZopeTransactionExtension,
mark_changed mark_changed
) )
from datetime import * from datetime import *
import dateutil.relativedelta from dateutil.relativedelta import *
import transaction import dateutil.relativedelta
import transaction
def execute_query(request, query, params):
"""Execute query and mark session as changed""" def execute_query(request, query, params):
request.dbsession.execute(query, params) """Execute query and mark session as changed"""
mark_changed(request.dbsession) request.dbsession.execute(query, params)
transaction.commit() mark_changed(request.dbsession)
transaction.commit()
def get_stats_dd(request, societe):
def get_stats_dd(request, societe):
query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
SUM(IF(status = '', 1, 0)) AS A_traiter, query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
SUM(IF(status = 'Devis', 1, 0)) AS Devis, SUM(IF(status = '', 1, 0)) AS A_traiter,
SUM(IF(status = 'Commandé', 1, 0)) AS Commande, SUM(IF(status = 'Devis', 1, 0)) AS Devis,
SUM(IF(status = 'Facturé', 1, 0)) AS Facture, SUM(IF(status = 'Commandé', 1, 0)) AS Commande,
SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart, SUM(IF(status = 'Facturé', 1, 0)) AS Facture,
SUM(IF(status = 'Réglée', 1, 0)) AS Regle SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart,
FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;""" SUM(IF(status = 'Réglée', 1, 0)) AS Regle
results = request.dbsession.execute(query, {'societe': societe}).fetchall() FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;"""
return results results = request.dbsession.execute(query, {'societe': societe}).fetchall()
return results
def get_stats_delais(request, societe, datedeb, datefin, groupe, id_chart):
# lire les examens sur 12 mois glissants par moniteur def get_stats_delais(request, societe, datedeb, datefin, groupe, id_chart):
query = """SELECT * FROM stats_delais # lire les examens sur 12 mois glissants par moniteur
WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;""" query = """SELECT * FROM stats_delais
results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"), WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;"""
'datefin': datefin.strftime("%Y%m"), 'groupe': groupe}) results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"),
return results.fetchall() 'datefin': datefin.strftime("%Y%m"), 'groupe': groupe})
return results.fetchall()
def get_stats_delai_groupe(request, societe, datedeb, datefin):
query = """SELECT group2, group2_lib FROM stats_delais def get_stats_delai_groupe(request, societe, datedeb, datefin):
WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;""" query = """SELECT group2, group2_lib FROM stats_delais
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")}) WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;"""
return results.fetchall() results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")})
return results.fetchall()
def get_ca_groupe_12m(request, societe):
def get_ca_groupe_12m(request, societe, datedeb, datefin):
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
DATE_FORMAT(date, "%M") as mois, query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca, DATE_FORMAT(date, "%M") as mois,
sum(IF(groupe = 'AXA', 1, 0)) AS AXA_nb, DATE_FORMAT(date, "%M %Y") as date,
SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca,
FROM bddevfac.facture SUM(IF(groupe = 'AXA', 1, 0)) AS AXA_nb,
WHERE societe='PE' and date >= "2020/07/01" and date <= "2021/06/30" GROUP BY yymm;""" SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF_ca,
results = request.dbsession.execute(query, {'societe': societe}).fetchall() SUM(IF(groupe = 'MAIF', 1, 0)) AS MAIF_nb
return results FROM bddevfac.facture
WHERE societe=:societe and date >= :datedeb and date <= :datefin GROUP BY yymm;"""
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")})
return results.fetchall()
def get_ca_groupe_3y(request, societe, datedeb):
date2 = datedeb + relativedelta(years=-1)
date3 = datedeb + relativedelta(years=-2)
query = """SELECT groupe,
SUM(IF (date_format(date, '%Y') = :date_n-2, TOTALHT, 0)) as Annee1,
SUM(IF (date_format(date, '%Y') = :date_n-1, TOTALHT, 0)) as Annee2,
SUM(IF (date_format(date, '%Y') = :date_n, TOTALHT, 0)) as Annee3
FROM bddevfac.facture
WHERE societe=:societe GROUP BY groupe;"""
results = request.dbsession.execute(query, {'societe': societe, 'date_n': date3.strftime("%Y"), 'date_n-1': date2.strftime("%Y"), 'date_n': datedeb.strftime("%Y")})
return results.fetchall()

View File

@@ -1,96 +1,89 @@
<metal:block use-macro="main_template"> <metal:block use-macro="main_template">
<div metal:fill-slot="content"> <div metal:fill-slot="content">
<br /> <br />
<div class="row"> <div class="row">
<form method="POST" id="frm" class="form-horizontal"> <form method="POST" id="frm" class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-2">Societe</label> <label class="control-label col-sm-2">Societe</label>
<div class="col-sm-4"> <div class="col-sm-4">
<select class="form-control" id="societe" name="societe" onChange="$('#frm').submit()"> <select class="form-control" id="societe" name="societe" onChange="$('#frm').submit()">
<tal:block tal:repeat="item societes"> <tal:block tal:repeat="item societes">
<option value="${item}" tal:attributes="selected societe==item and 'selected' or None"> ${item}</option> <option value="${item}" tal:attributes="selected societe==item and 'selected' or None"> ${item}</option>
</tal:block> </tal:block>
</select> </select>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<div class="row"> <div class="row">
<!-- graphique 1ER CONTACT --> <!-- Histogramme CA sur 12 mois par groupe -->
<div id="barChart_annee1" style="width: 100%; height: 500px;"></div> <div id="chart_ca_12m" style="width: 100%; height: 500px;"></div>
</div> </div>
<div class="row">
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <!-- camembert 1 -->
<script type="text/javascript"> <div class="col-sm-4">
google.charts.load("current", {packages:["corechart", 'bar']}); <div id="chart_ca_3y_1" style="width: 100%; height: 500px;"></div>
google.charts.setOnLoadCallback(drawChart); </div>
var dataSet_annee1 = ${barChart_annee1}; <div class="col-sm-4">
var dataSet_annee2 = ${barChart_annee2}; <div id="chart_ca_3y_2" style="width: 100%; height: 500px;"></div>
var dataSet_annee3 = ${barChart_annee3}; </div>
var dataSet_annee4 = ${barChart_annee4}; <div class="col-sm-4">
<div id="chart_ca_3y_3" style="width: 100%; height: 500px;"></div>
function drawChart() { </div>
var data_annee1 = google.visualization.arrayToDataTable(dataSet_annee1); </div>
var data_annee2 = google.visualization.arrayToDataTable(dataSet_annee2);
var data_annee3 = google.visualization.arrayToDataTable(dataSet_annee3);
var data_annee4 = google.visualization.arrayToDataTable(dataSet_annee4); <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
var options_annee1 = { google.charts.load("current", {packages:["corechart"]});
title: '${title1}', google.charts.setOnLoadCallback(drawChart);
seriesType: 'bars', var dataSet_ca_12m = ${chart_ca_12m};
series: {1: {type: 'line'}},
vAxis: { var dataSet_ca_3y_1 = ${chart_ca_3y_1};
viewWindow: { var dataSet_ca_3y_2 = ${chart_ca_3y_2};
min:0 var dataSet_ca_3y_3 = ${chart_ca_3y_3};
}
} function drawChart() {
}; var data_ca_12m = google.visualization.arrayToDataTable(dataSet_ca_12m);
var options_annee2 = {
title: '${title2}', var data_ca_3y_1 = google.visualization.arrayToDataTable(dataSet_ca_3y_1);
seriesType: 'bars', var data_ca_3y_2 = google.visualization.arrayToDataTable(dataSet_ca_3y_2);
series: {1: {type: 'line'}}, var data_ca_3y_3 = google.visualization.arrayToDataTable(dataSet_ca_3y_3);
vAxis: {
viewWindow: { var options_ca_12m = {
min:0 title: '${title}',
} vAxis: {title: "Chiffre d'Affaires en €"},
} isStacked: true
}; };
var options_annee3 = {
title: '${title3}', var options_ca_3y_1 = {
seriesType: 'bars', title: '${title1}',
series: {1: {type: 'line'}}, };
vAxis: {
viewWindow: { var options_ca_3y_2 = {
min:0 title: '${title2}',
} };
}
}; var options_ca_3y_3 = {
var options_annee4 = { title: '${title3}',
title: '${title4}', };
seriesType: 'bars',
series: {1: {type: 'line'}}, var chart_ca_12m = new google.visualization.SteppedAreaChart(document.getElementById('chart_ca_12m'));
vAxis: { chart_ca_12m.draw(data_ca_12m, options_ca_12m);
viewWindow: {
min:0 var chart_ca_3y_1 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_1'));
} chart_ca_3y_1.draw(data_ca_3y_1, options_ca_3y_1);
} var chart_ca_3y_2 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_2'));
}; chart_ca_3y_2.draw(data_ca_3y_2, options_ca_3y_2);
var chart_ca_3y_3 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_3'));
var chart_annee1 = new google.visualization.ComboChart(document.getElementById('barChart_annee1')); chart_ca_3y_3.draw(data_ca_3y_3, options_ca_3y_3);
chart_annee1.draw(data_annee1, options_annee1); }
var chart_annee2 = new google.visualization.ComboChart(document.getElementById('barChart_annee2')); </script>
chart_annee2.draw(data_annee2, options_annee2);
var chart_annee3 = new google.visualization.ComboChart(document.getElementById('barChart_annee3')); </div><!-- content -->
chart_annee3.draw(data_annee3, options_annee3); </metal:block>
var chart_annee4 = new google.visualization.ComboChart(document.getElementById('barChart_annee4'));
chart_annee4.draw(data_annee4, options_annee4);
}
</script>
</div><!-- content -->
</metal:block>

View File

@@ -1,207 +1,229 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from pyramid.response import Response from pyramid.response import Response
from pyramid.renderers import render, get_renderer from pyramid.renderers import render, get_renderer
from pyramid.view import ( from pyramid.view import (
view_config, view_config,
forbidden_view_config, forbidden_view_config,
) )
from pyramid.httpexceptions import ( from pyramid.httpexceptions import (
HTTPFound, HTTPFound,
HTTPNotFound, HTTPNotFound,
HTTPForbidden, HTTPForbidden,
) )
from datetime import * from datetime import *
from dateutil.relativedelta import * from dateutil.relativedelta import *
import json import json
from ..models.default import * from ..models.default import *
from ..models.agenda import * from ..models.agenda import *
from ..models.stats import * from ..models.stats import *
@view_config(route_name='stats', renderer='../templates/stats/stats.pt', permission='view') @view_config(route_name='stats', renderer='../templates/stats/stats.pt', permission='view')
def stats(request): def stats(request):
logged_in = request.authenticated_userid.upper() logged_in = request.authenticated_userid.upper()
# lire la fiche de l'utilisateur # lire la fiche de l'utilisateur
member = get_member_by_id(request, logged_in) member = get_member_by_id(request, logged_in)
access = member.access access = member.access
return { return {
'page_title': "Statistiques", 'page_title': "Statistiques",
'logged_in': logged_in, 'logged_in': logged_in,
'access': access, 'access': access,
} }
@view_config(route_name='stats_dossiers', renderer='../templates/stats/stats_dossiers.pt', permission='view') @view_config(route_name='stats_dossiers', renderer='../templates/stats/stats_dossiers.pt', permission='view')
def stats_dossiers(request): def stats_dossiers(request):
societe = request.matchdict['societe'] societe = request.matchdict['societe']
url = request.route_url('stats_dossiers', societe=societe) url = request.route_url('stats_dossiers', societe=societe)
message = '' message = ''
societes = ['PE','ME','PL','PO','CD'] societes = ['PE','ME','PL','PO','CD']
# prendre en compte les paramètres de saisie # prendre en compte les paramètres de saisie
if 'societe' in request.params: if 'societe' in request.params:
societe = request.params["societe"] societe = request.params["societe"]
url = request.route_url('stats_dossiers', societe=societe) url = request.route_url('stats_dossiers', societe=societe)
# lire les stats globales des demandes de devis # lire les stats globales des demandes de devis
stats_dossiers = get_stats_dd(request, societe) stats_dossiers = get_stats_dd(request, societe)
liste=[] liste=[]
# construire la liste # construire la liste
for item in stats_dossiers: for item in stats_dossiers:
total_facture = item.Facture + item.ReglePart + item.Regle total_facture = item.Facture + item.ReglePart + item.Regle
total_devis = item.Devis + item.Commande + total_facture total_devis = item.Devis + item.Commande + total_facture
d = (str(item.Annee), str(item.Total), str(item.A_traiter), str(total_devis), str(item.Devis), str(total_facture), str(item.ReglePart), str(item.Regle)) d = (str(item.Annee), str(item.Total), str(item.A_traiter), str(total_devis), str(item.Devis), str(total_facture), str(item.ReglePart), str(item.Regle))
liste.append(d) liste.append(d)
return { return {
'page_title': "Stats : Dossiers par année", 'page_title': "Stats : Dossiers par année",
'url': url, 'url': url,
'message': message, 'message': message,
'dt_data': json.dumps(liste), 'dt_data': json.dumps(liste),
'societes': societes, 'societes': societes,
'societe': societe, 'societe': societe,
} }
@view_config(route_name='stats_delais', renderer='../templates/stats/stats_delais.pt', permission='view') @view_config(route_name='stats_delais', renderer='../templates/stats/stats_delais.pt', permission='view')
def stats_delais(request): def stats_delais(request):
societe = request.matchdict['societe'] societe = request.matchdict['societe']
url = request.route_url('stats_delais', societe = societe) url = request.route_url('stats_delais', societe = societe)
datefin = date.today() datefin = date.today()
# debut = aujourd'hui - 11 mois # debut = aujourd'hui - 11 mois
datedeb = datefin + relativedelta(months=-11) datedeb = datefin + relativedelta(months=-11)
societes = ['PE','ME','PL'] societes = ['PE','ME','PL']
# si societe a été changé par le user # si societe a été changé par le user
if 'societe' in request.params: if 'societe' in request.params:
societe = request.params["societe"] societe = request.params["societe"]
# lire les groupes # lire les groupes
groupes = get_stats_delai_groupe(request, societe, datedeb, datefin) groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
# mémoriser le 1er de la liste # mémoriser le 1er de la liste
groupe = groupes[0].group2 groupe = groupes[0].group2
# si groupe a été changé par le user # si groupe a été changé par le user
if 'groupe' in request.params: if 'groupe' in request.params:
groupe = request.params["groupe"] groupe = request.params["groupe"]
# lire les délais CONTACT du groupe # lire les délais CONTACT du groupe
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_contact') items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_contact')
barChart_annee1 = [] barChart_annee1 = []
barChart_annee1.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas')) barChart_annee1.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
title1 = '1er CONTACT' title1 = '1er CONTACT'
for item in items: for item in items:
# construire la liste pour donut cible # construire la liste pour donut cible
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population)) tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
# ('+str(item.population)+')/n' # ('+str(item.population)+')/n'
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref)) d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
barChart_annee1.append(d) barChart_annee1.append(d)
# lire les délais RENDEZ-VOUS du groupe # lire les délais RENDEZ-VOUS du groupe
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_rdv') items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_rdv')
barChart_annee2=[] barChart_annee2=[]
barChart_annee2.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas')) barChart_annee2.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
title2 = '1er RENDEZ-VOUS' title2 = '1er RENDEZ-VOUS'
for item in items: for item in items:
# construire la liste pour donut cible # construire la liste pour donut cible
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population)) tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
# ('+str(item.population)+')/n' # ('+str(item.population)+')/n'
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref)) d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
barChart_annee2.append(d) barChart_annee2.append(d)
# lire les délais DEVIS du groupe # lire les délais DEVIS du groupe
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_devis') items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_devis')
barChart_annee3=[] barChart_annee3=[]
barChart_annee3.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas')) barChart_annee3.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
title3 = '1er DEVIS' title3 = '1er DEVIS'
for item in items: for item in items:
# construire la liste pour donut cible # construire la liste pour donut cible
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population)) tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
# ('+str(item.population)+')/n' # ('+str(item.population)+')/n'
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref)) d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
barChart_annee3.append(d) barChart_annee3.append(d)
# lire les délais FACTURE du groupe # lire les délais FACTURE du groupe
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_facture') items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_facture')
barChart_annee4 = [] barChart_annee4 = []
barChart_annee4.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas')) barChart_annee4.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
title4 = '1ère FACTURE' title4 = '1ère FACTURE'
for item in items: for item in items:
# construire la liste pour donut cible # construire la liste pour donut cible
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population)) tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
# ('+str(item.population)+')/n' # ('+str(item.population)+')/n'
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref)) d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
barChart_annee4.append(d) barChart_annee4.append(d)
return { return {
'page_title': "Délais / mois", 'page_title': "Délais / mois",
'url': url, 'url': url,
'barChart_annee1': json.dumps(barChart_annee1), 'barChart_annee1': json.dumps(barChart_annee1),
'barChart_annee2': json.dumps(barChart_annee2), 'barChart_annee2': json.dumps(barChart_annee2),
'barChart_annee3': json.dumps(barChart_annee3), 'barChart_annee3': json.dumps(barChart_annee3),
'barChart_annee4': json.dumps(barChart_annee4), 'barChart_annee4': json.dumps(barChart_annee4),
'title1': title1, 'title1': title1,
'title2': title2, 'title2': title2,
'title3': title3, 'title3': title3,
'title4': title4, 'title4': title4,
'societes': societes, 'societes': societes,
'societe': societe, 'societe': societe,
'groupes': groupes, 'groupes': groupes,
'groupe': groupe, 'groupe': groupe,
} }
@view_config(route_name='ca_groupes_12m', renderer='../templates/stats/ca_groupes_12m.pt', permission='view') @view_config(route_name='ca_groupes_12m', renderer='../templates/stats/ca_groupes_12m.pt', permission='view')
def ca_groupes_12m(request): def ca_groupes_12m(request):
societe = request.matchdict['societe'] societe = request.matchdict['societe']
url = request.route_url('stats_delais', societe = societe) url = request.route_url('stats_delais', societe = societe)
datefin = date.today() datefin = date.today()
# debut = aujourd'hui - 11 mois # debut = aujourd'hui - 11 mois
datedeb = datefin + relativedelta(months=-11) datedeb = datefin + relativedelta(months=-11)
societes = ['PE','ME','PL'] societes = ['PE','ME','PL']
# si societe a été changé par le user # si societe a été changé par le user
if 'societe' in request.params: if 'societe' in request.params:
societe = request.params["societe"] societe = request.params["societe"]
# lire les groupes # lire les CA par mois
groupes = get_stats_delai_groupe(request, societe, datedeb, datefin) items = get_ca_groupe_12m(request, societe, datedeb, datefin)
chart_ca_12m = []
# mémoriser le 1er de la liste # titre des colonnes
groupe = groupes[0].group2 chart_ca_12m.append(('Mois', 'AXA', { 'type':'string','role': 'tooltip'}, 'MAIF', { 'type':'string','role': 'tooltip'}))
title = 'CA / MOIS'
# si groupe a été changé par le user for item in items:
if 'groupe' in request.params: # construire la liste pour donut cible
groupe = request.params["groupe"] tooltipMAIF = item.date + ' \nCA: '+str(item.MAIF_ca) + '\nDossiers: '+str(round(item.MAIF_nb))
tooltipAXA = item.date + ' \nCA: '+str(item.AXA_ca) + '\nDossiers: '+str(round(item.AXA_nb))
# lire les délais CONTACT du groupe # ('+str(item.population)+')/n'
items = get_ca_groupe_12m(request, societe, datedeb, datefin, groupe, 'delai_contact') d = (item.mois, float(item.AXA_ca), tooltipAXA, float(item.MAIF_ca), tooltipMAIF)
barChart_annee1 = [] chart_ca_12m.append(d)
# titre des colonnes
barChart_annee1.append(('Mois', 'AXA', {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas')) # debut = aujourd'hui - 11 mois
title1 = '1er CONTACT' datedeb = date.today()
for item in items: datedeb.replace(month=1,day=1)
# construire la liste pour donut cible
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population)) # lire les CA par mois
# ('+str(item.population)+')/n' items = get_ca_groupe_3y(request, societe, datedeb)
d = (item.mois, round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref)) chart_ca_3y_1 = []
barChart_annee1.append(d) chart_ca_3y_2 = []
chart_ca_3y_3 = []
# titre des colonnes
return { chart_ca_3y_1.append(('Groupe', 'CA'))
'page_title': "Délais / mois", chart_ca_3y_2.append(('Groupe', 'CA'))
'url': url, chart_ca_3y_3.append(('Groupe', 'CA'))
'barChart_annee1': json.dumps(barChart_annee1), title1 = 'CA ' + (datedeb + relativedelta(years=-2)).strftime("%Y")
'title1': title1, title2 = 'CA ' + (datedeb + relativedelta(years=-1)).strftime("%Y")
'societes': societes, title3 = 'CA ' + datedeb.strftime("%Y")
'societe': societe, for item in items:
'groupes': groupes, # construire la liste pour donut cible
'groupe': groupe, #tooltipMAIF = item.date + ' \nCA: '+str(item.MAIF_ca) + ' €\nDossiers: '+str(round(item.MAIF_nb))
} #tooltipAXA = item.date + ' \nCA: '+str(item.AXA_ca) + ' €\nDossiers: '+str(round(item.AXA_nb))
# ('+str(item.population)+')/n'
d1 = (item.groupe, float(item.Annee1))
chart_ca_3y_1.append(d1)
d2 = (item.groupe, float(item.Annee2))
chart_ca_3y_2.append(d2)
d3 = (item.groupe, float(item.Annee3))
chart_ca_3y_3.append(d3)
return {
'page_title': "CA par groupe",
'url': url,
'chart_ca_12m': json.dumps(chart_ca_12m),
'chart_ca_3y_1': json.dumps(chart_ca_3y_1),
'chart_ca_3y_2': json.dumps(chart_ca_3y_2),
'chart_ca_3y_3': json.dumps(chart_ca_3y_3),
'title': title,
'title1': title1,
'title2': title2,
'title3': title3,
'societes': societes,
'societe': societe,
}

128
setup.py
View File

@@ -1,64 +1,64 @@
import os import os
from setuptools import setup, find_packages from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__)) here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.md')) as f: with open(os.path.join(here, 'README.md')) as f:
README = f.read() README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f: with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read() CHANGES = f.read()
requires = [ requires = [
'pyramid', 'pyramid',
'pyramid_chameleon', 'pyramid_chameleon',
'pyramid_debugtoolbar', 'pyramid_debugtoolbar',
'pyramid_layout', 'pyramid_layout',
'pyramid_mailer', 'pyramid_mailer',
'pyramid_tm', 'pyramid_tm',
'SQLAlchemy', 'SQLAlchemy',
'transaction', 'transaction',
'zope.sqlalchemy == 1.1', 'zope.sqlalchemy == 1.1',
'waitress', 'waitress',
'mysqlclient', 'mysqlclient',
'docutils', 'docutils',
'pdfkit', 'pdfkit',
'python-dateutil', 'python-dateutil',
'user-agents', 'user-agents',
'xlrd', 'xlrd',
'image', 'image',
'pdfminer3' 'pdfminer3'
] ]
tests_require = [ tests_require = [
'WebTest >= 1.3.1', # py3 compat 'WebTest >= 1.3.1', # py3 compat
'pytest', # includes virtualenv 'pytest', # includes virtualenv
'pytest-cov', 'pytest-cov',
] ]
setup(name='mondumas', setup(name='mondumas',
version='1.0', version='1.0',
description='mondumas', description='mondumas',
long_description=README + '\n\n' + CHANGES, long_description=README + '\n\n' + CHANGES,
classifiers=[ classifiers=[
"Programming Language :: Python", "Programming Language :: Python",
"Framework :: Pyramid", "Framework :: Pyramid",
"Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP",
"Topic :: Internet :: WWW/HTTP :: WSGI :: Application", "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
], ],
author='', author='',
author_email='', author_email='',
url='', url='',
keywords='web wsgi bfg pylons pyramid', keywords='web wsgi bfg pylons pyramid',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
zip_safe=False, zip_safe=False,
extras_require={ extras_require={
'testing': tests_require, 'testing': tests_require,
}, },
install_requires=requires, install_requires=requires,
entry_points="""\ entry_points="""\
[paste.app_factory] [paste.app_factory]
main = mondumas:main main = mondumas:main
[console_scripts] [console_scripts]
""", """,
) )