diff --git a/.vscode/settings.json b/.vscode/settings.json
index 7a73a41..4b1a30b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,2 +1,3 @@
-{
+{
+ "html.validate.scripts": false
}
\ No newline at end of file
diff --git a/mondumas.egg-info/PKG-INFO b/mondumas.egg-info/PKG-INFO
index 1febcf9..f02fdca 100644
--- a/mondumas.egg-info/PKG-INFO
+++ b/mondumas.egg-info/PKG-INFO
@@ -1,60 +1,60 @@
-Metadata-Version: 2.1
-Name: mondumas
-Version: 1.0
-Summary: mondumas
-Home-page: UNKNOWN
-Author:
-Author-email:
-License: UNKNOWN
-Keywords: web wsgi bfg pylons pyramid
-Platform: UNKNOWN
-Classifier: Programming Language :: Python
-Classifier: Framework :: Pyramid
-Classifier: Topic :: Internet :: WWW/HTTP
-Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
-Provides-Extra: testing
-
-# README #
-
-Cette application web permet aux collaborateurs de l'entreprise Dumas :
-
- - 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
-
-Elle est développée avec les composants open source suivants :
-
-## Backend
-
-- [Python](https://www.python.org/downloads/) 3.7
-- [Pyramid web framework](https://trypyramid.com/) 1.10
-- [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)
-
-## Frontend
-
-- [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7
-- [Jquery](https://jquery.com/download/) for JavaScript 3.2.1
-- Chameleon templates
-- [FormValidation](https://formvalidation.io/) form validator 0.7.0
-
-## Jquery Plugins
-
-- [DataTables](https://datatables.net/) 1.10.20
-- [Fullcalendar](https://fullcalendar.io/) 3.9.0
-- [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4
-- [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1
-- [jSignature](https://willowsystems.github.io/jSignature)
-- [less.js](http://lesscss.org/) 3.11.1
-- [moment.js](https://momentjs.com/) with-locales.min.js
-
-
-[Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
-
-
-
-0.0
----
-
-- Initial version
-
-
+Metadata-Version: 2.1
+Name: mondumas
+Version: 1.0
+Summary: mondumas
+Home-page: UNKNOWN
+Author:
+Author-email:
+License: UNKNOWN
+Keywords: web wsgi bfg pylons pyramid
+Platform: UNKNOWN
+Classifier: Programming Language :: Python
+Classifier: Framework :: Pyramid
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Provides-Extra: testing
+
+# README #
+
+Cette application web permet aux collaborateurs de l'entreprise Dumas :
+
+ - 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
+
+Elle est développée avec les composants open source suivants :
+
+## Backend
+
+- [Python](https://www.python.org/downloads/) 3.7
+- [Pyramid web framework](https://trypyramid.com/) 1.10
+- [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)
+
+## Frontend
+
+- [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7
+- [Jquery](https://jquery.com/download/) for JavaScript 3.2.1
+- Chameleon templates
+- [FormValidation](https://formvalidation.io/) form validator 0.7.0
+
+## Jquery Plugins
+
+- [DataTables](https://datatables.net/) 1.10.20
+- [Fullcalendar](https://fullcalendar.io/) 3.9.0
+- [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4
+- [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1
+- [jSignature](https://willowsystems.github.io/jSignature)
+- [less.js](http://lesscss.org/) 3.11.1
+- [moment.js](https://momentjs.com/) with-locales.min.js
+
+
+[Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
+
+
+
+0.0
+---
+
+- Initial version
+
+
diff --git a/mondumas.egg-info/SOURCES.txt b/mondumas.egg-info/SOURCES.txt
index 0434673..e9c7c8f 100644
--- a/mondumas.egg-info/SOURCES.txt
+++ b/mondumas.egg-info/SOURCES.txt
@@ -25,6 +25,7 @@ mondumas/models/default.py
mondumas/models/devis.py
mondumas/models/dossier.py
mondumas/models/parametres.py
+mondumas/models/stats.py
mondumas/models/utils.py
mondumas/scripts/__init__.py
mondumas/views/__init__.py
@@ -34,4 +35,5 @@ mondumas/views/devis.py
mondumas/views/dossier.py
mondumas/views/notfound.py
mondumas/views/parametres.py
+mondumas/views/stats.py
mondumas/views/utils.py
\ No newline at end of file
diff --git a/mondumas/models/stats.py b/mondumas/models/stats.py
index 76b16a1..ca51ae5 100644
--- a/mondumas/models/stats.py
+++ b/mondumas/models/stats.py
@@ -1,61 +1,78 @@
-# -*- coding: utf8 -*-
-from sqlalchemy import text
-from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import (
- scoped_session,
- sessionmaker,
-)
-from zope.sqlalchemy import (
- ZopeTransactionExtension,
- mark_changed
-)
-
-from datetime import *
-import dateutil.relativedelta
-import transaction
-
-def execute_query(request, query, params):
- """Execute query and mark session as changed"""
- request.dbsession.execute(query, params)
- mark_changed(request.dbsession)
- transaction.commit()
-
-def get_stats_dd(request, societe):
-
- query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
-SUM(IF(status = '', 1, 0)) AS A_traiter,
-SUM(IF(status = 'Devis', 1, 0)) AS Devis,
-SUM(IF(status = 'Commandé', 1, 0)) AS Commande,
-SUM(IF(status = 'Facturé', 1, 0)) AS Facture,
-SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart,
-SUM(IF(status = 'Réglée', 1, 0)) AS Regle
-FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;"""
- 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
- query = """SELECT * FROM stats_delais
- WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;"""
- results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"),
- '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
- WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;"""
- 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):
-
- query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
-DATE_FORMAT(date, "%M") as mois,
-SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca,
-sum(IF(groupe = 'AXA', 1, 0)) AS AXA_nb,
-SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF
-FROM bddevfac.facture
-WHERE societe='PE' and date >= "2020/07/01" and date <= "2021/06/30" GROUP BY yymm;"""
- results = request.dbsession.execute(query, {'societe': societe}).fetchall()
- return results
-
+# -*- coding: utf8 -*-
+from sqlalchemy import text
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import (
+ scoped_session,
+ sessionmaker,
+)
+from zope.sqlalchemy import (
+ ZopeTransactionExtension,
+ mark_changed
+)
+
+from datetime import *
+from dateutil.relativedelta import *
+import dateutil.relativedelta
+import transaction
+
+def execute_query(request, query, params):
+ """Execute query and mark session as changed"""
+ request.dbsession.execute(query, params)
+ mark_changed(request.dbsession)
+ transaction.commit()
+
+def get_stats_dd(request, societe):
+
+ query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
+SUM(IF(status = '', 1, 0)) AS A_traiter,
+SUM(IF(status = 'Devis', 1, 0)) AS Devis,
+SUM(IF(status = 'Commandé', 1, 0)) AS Commande,
+SUM(IF(status = 'Facturé', 1, 0)) AS Facture,
+SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart,
+SUM(IF(status = 'Réglée', 1, 0)) AS Regle
+FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;"""
+ 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
+ query = """SELECT * FROM stats_delais
+ WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;"""
+ results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"),
+ '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
+ WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;"""
+ 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, datedeb, datefin):
+
+ query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
+ DATE_FORMAT(date, "%M") as mois,
+ DATE_FORMAT(date, "%M %Y") as date,
+ SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca,
+ SUM(IF(groupe = 'AXA', 1, 0)) AS AXA_nb,
+ SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF_ca,
+ SUM(IF(groupe = 'MAIF', 1, 0)) AS MAIF_nb
+ 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()
+
diff --git a/mondumas/templates/stats/ca_groupes_12m.pt b/mondumas/templates/stats/ca_groupes_12m.pt
index 6c34e7d..62ced17 100644
--- a/mondumas/templates/stats/ca_groupes_12m.pt
+++ b/mondumas/templates/stats/ca_groupes_12m.pt
@@ -1,96 +1,89 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mondumas/views/stats.py b/mondumas/views/stats.py
index 2babb10..4fd457c 100644
--- a/mondumas/views/stats.py
+++ b/mondumas/views/stats.py
@@ -1,207 +1,229 @@
-# -*- coding: utf8 -*-
-from pyramid.response import Response
-from pyramid.renderers import render, get_renderer
-from pyramid.view import (
- view_config,
- forbidden_view_config,
-)
-from pyramid.httpexceptions import (
- HTTPFound,
- HTTPNotFound,
- HTTPForbidden,
-)
-
-from datetime import *
-from dateutil.relativedelta import *
-import json
-
-from ..models.default import *
-from ..models.agenda import *
-from ..models.stats import *
-
-@view_config(route_name='stats', renderer='../templates/stats/stats.pt', permission='view')
-def stats(request):
- logged_in = request.authenticated_userid.upper()
- # lire la fiche de l'utilisateur
- member = get_member_by_id(request, logged_in)
- access = member.access
-
- return {
- 'page_title': "Statistiques",
- 'logged_in': logged_in,
- 'access': access,
- }
-
-@view_config(route_name='stats_dossiers', renderer='../templates/stats/stats_dossiers.pt', permission='view')
-def stats_dossiers(request):
-
- societe = request.matchdict['societe']
- url = request.route_url('stats_dossiers', societe=societe)
- message = ''
- societes = ['PE','ME','PL','PO','CD']
-
- # prendre en compte les paramètres de saisie
- if 'societe' in request.params:
- societe = request.params["societe"]
- url = request.route_url('stats_dossiers', societe=societe)
-
- # lire les stats globales des demandes de devis
- stats_dossiers = get_stats_dd(request, societe)
-
- liste=[]
- # construire la liste
- for item in stats_dossiers:
- total_facture = item.Facture + item.ReglePart + item.Regle
- 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))
- liste.append(d)
-
- return {
- 'page_title': "Stats : Dossiers par année",
- 'url': url,
- 'message': message,
- 'dt_data': json.dumps(liste),
- 'societes': societes,
- 'societe': societe,
- }
-
-@view_config(route_name='stats_delais', renderer='../templates/stats/stats_delais.pt', permission='view')
-def stats_delais(request):
-
- societe = request.matchdict['societe']
- url = request.route_url('stats_delais', societe = societe)
-
- datefin = date.today()
- # debut = aujourd'hui - 11 mois
- datedeb = datefin + relativedelta(months=-11)
-
- societes = ['PE','ME','PL']
- # si societe a été changé par le user
- if 'societe' in request.params:
- societe = request.params["societe"]
-
- # lire les groupes
- groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
-
- # mémoriser le 1er de la liste
- groupe = groupes[0].group2
-
- # si groupe a été changé par le user
- if 'groupe' in request.params:
- groupe = request.params["groupe"]
-
- # lire les délais CONTACT du groupe
- items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_contact')
- barChart_annee1 = []
- barChart_annee1.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
- title1 = '1er CONTACT'
- for item in items:
- # construire la liste pour donut cible
- tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
- # ('+str(item.population)+')/n'
- d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
- barChart_annee1.append(d)
-
- # lire les délais RENDEZ-VOUS du groupe
- items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_rdv')
- barChart_annee2=[]
- barChart_annee2.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
- title2 = '1er RENDEZ-VOUS'
- for item in items:
- # construire la liste pour donut cible
- tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
- # ('+str(item.population)+')/n'
- d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
- barChart_annee2.append(d)
-
- # lire les délais DEVIS du groupe
- items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_devis')
- barChart_annee3=[]
- barChart_annee3.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
- title3 = '1er DEVIS'
- for item in items:
- # construire la liste pour donut cible
- tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
- # ('+str(item.population)+')/n'
- d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
- barChart_annee3.append(d)
-
- # lire les délais FACTURE du groupe
- items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_facture')
- barChart_annee4 = []
- barChart_annee4.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
- title4 = '1ère FACTURE'
- for item in items:
- # construire la liste pour donut cible
- tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
- # ('+str(item.population)+')/n'
- d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
- barChart_annee4.append(d)
-
- return {
- 'page_title': "Délais / mois",
- 'url': url,
- 'barChart_annee1': json.dumps(barChart_annee1),
- 'barChart_annee2': json.dumps(barChart_annee2),
- 'barChart_annee3': json.dumps(barChart_annee3),
- 'barChart_annee4': json.dumps(barChart_annee4),
- 'title1': title1,
- 'title2': title2,
- 'title3': title3,
- 'title4': title4,
- 'societes': societes,
- 'societe': societe,
- 'groupes': groupes,
- 'groupe': groupe,
- }
-
-@view_config(route_name='ca_groupes_12m', renderer='../templates/stats/ca_groupes_12m.pt', permission='view')
-def ca_groupes_12m(request):
-
- societe = request.matchdict['societe']
- url = request.route_url('stats_delais', societe = societe)
-
- datefin = date.today()
- # debut = aujourd'hui - 11 mois
- datedeb = datefin + relativedelta(months=-11)
-
- societes = ['PE','ME','PL']
- # si societe a été changé par le user
- if 'societe' in request.params:
- societe = request.params["societe"]
-
- # lire les groupes
- groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
-
- # mémoriser le 1er de la liste
- groupe = groupes[0].group2
-
- # si groupe a été changé par le user
- if 'groupe' in request.params:
- groupe = request.params["groupe"]
-
- # lire les délais CONTACT du groupe
- items = get_ca_groupe_12m(request, societe, datedeb, datefin, groupe, 'delai_contact')
- barChart_annee1 = []
- # titre des colonnes
- barChart_annee1.append(('Mois', 'AXA', {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
- title1 = '1er CONTACT'
- for item in items:
- # construire la liste pour donut cible
- tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
- # ('+str(item.population)+')/n'
- d = (item.mois, round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
- barChart_annee1.append(d)
-
-
- return {
- 'page_title': "Délais / mois",
- 'url': url,
- 'barChart_annee1': json.dumps(barChart_annee1),
- 'title1': title1,
- 'societes': societes,
- 'societe': societe,
- 'groupes': groupes,
- 'groupe': groupe,
- }
-
+# -*- coding: utf8 -*-
+from pyramid.response import Response
+from pyramid.renderers import render, get_renderer
+from pyramid.view import (
+ view_config,
+ forbidden_view_config,
+)
+from pyramid.httpexceptions import (
+ HTTPFound,
+ HTTPNotFound,
+ HTTPForbidden,
+)
+
+from datetime import *
+from dateutil.relativedelta import *
+import json
+
+from ..models.default import *
+from ..models.agenda import *
+from ..models.stats import *
+
+@view_config(route_name='stats', renderer='../templates/stats/stats.pt', permission='view')
+def stats(request):
+ logged_in = request.authenticated_userid.upper()
+ # lire la fiche de l'utilisateur
+ member = get_member_by_id(request, logged_in)
+ access = member.access
+
+ return {
+ 'page_title': "Statistiques",
+ 'logged_in': logged_in,
+ 'access': access,
+ }
+
+@view_config(route_name='stats_dossiers', renderer='../templates/stats/stats_dossiers.pt', permission='view')
+def stats_dossiers(request):
+
+ societe = request.matchdict['societe']
+ url = request.route_url('stats_dossiers', societe=societe)
+ message = ''
+ societes = ['PE','ME','PL','PO','CD']
+
+ # prendre en compte les paramètres de saisie
+ if 'societe' in request.params:
+ societe = request.params["societe"]
+ url = request.route_url('stats_dossiers', societe=societe)
+
+ # lire les stats globales des demandes de devis
+ stats_dossiers = get_stats_dd(request, societe)
+
+ liste=[]
+ # construire la liste
+ for item in stats_dossiers:
+ total_facture = item.Facture + item.ReglePart + item.Regle
+ 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))
+ liste.append(d)
+
+ return {
+ 'page_title': "Stats : Dossiers par année",
+ 'url': url,
+ 'message': message,
+ 'dt_data': json.dumps(liste),
+ 'societes': societes,
+ 'societe': societe,
+ }
+
+@view_config(route_name='stats_delais', renderer='../templates/stats/stats_delais.pt', permission='view')
+def stats_delais(request):
+
+ societe = request.matchdict['societe']
+ url = request.route_url('stats_delais', societe = societe)
+
+ datefin = date.today()
+ # debut = aujourd'hui - 11 mois
+ datedeb = datefin + relativedelta(months=-11)
+
+ societes = ['PE','ME','PL']
+ # si societe a été changé par le user
+ if 'societe' in request.params:
+ societe = request.params["societe"]
+
+ # lire les groupes
+ groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
+
+ # mémoriser le 1er de la liste
+ groupe = groupes[0].group2
+
+ # si groupe a été changé par le user
+ if 'groupe' in request.params:
+ groupe = request.params["groupe"]
+
+ # lire les délais CONTACT du groupe
+ items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_contact')
+ barChart_annee1 = []
+ barChart_annee1.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
+ title1 = '1er CONTACT'
+ for item in items:
+ # construire la liste pour donut cible
+ tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
+ # ('+str(item.population)+')/n'
+ d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
+ barChart_annee1.append(d)
+
+ # lire les délais RENDEZ-VOUS du groupe
+ items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_rdv')
+ barChart_annee2=[]
+ barChart_annee2.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
+ title2 = '1er RENDEZ-VOUS'
+ for item in items:
+ # construire la liste pour donut cible
+ tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
+ # ('+str(item.population)+')/n'
+ d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
+ barChart_annee2.append(d)
+
+ # lire les délais DEVIS du groupe
+ items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_devis')
+ barChart_annee3=[]
+ barChart_annee3.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
+ title3 = '1er DEVIS'
+ for item in items:
+ # construire la liste pour donut cible
+ tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
+ # ('+str(item.population)+')/n'
+ d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
+ barChart_annee3.append(d)
+
+ # lire les délais FACTURE du groupe
+ items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_facture')
+ barChart_annee4 = []
+ barChart_annee4.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
+ title4 = '1ère FACTURE'
+ for item in items:
+ # construire la liste pour donut cible
+ tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
+ # ('+str(item.population)+')/n'
+ d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
+ barChart_annee4.append(d)
+
+ return {
+ 'page_title': "Délais / mois",
+ 'url': url,
+ 'barChart_annee1': json.dumps(barChart_annee1),
+ 'barChart_annee2': json.dumps(barChart_annee2),
+ 'barChart_annee3': json.dumps(barChart_annee3),
+ 'barChart_annee4': json.dumps(barChart_annee4),
+ 'title1': title1,
+ 'title2': title2,
+ 'title3': title3,
+ 'title4': title4,
+ 'societes': societes,
+ 'societe': societe,
+ 'groupes': groupes,
+ 'groupe': groupe,
+ }
+
+@view_config(route_name='ca_groupes_12m', renderer='../templates/stats/ca_groupes_12m.pt', permission='view')
+def ca_groupes_12m(request):
+
+ societe = request.matchdict['societe']
+ url = request.route_url('stats_delais', societe = societe)
+
+ datefin = date.today()
+ # debut = aujourd'hui - 11 mois
+ datedeb = datefin + relativedelta(months=-11)
+
+ societes = ['PE','ME','PL']
+ # si societe a été changé par le user
+ if 'societe' in request.params:
+ societe = request.params["societe"]
+
+ # lire les CA par mois
+ items = get_ca_groupe_12m(request, societe, datedeb, datefin)
+ chart_ca_12m = []
+ # titre des colonnes
+ chart_ca_12m.append(('Mois', 'AXA', { 'type':'string','role': 'tooltip'}, 'MAIF', { 'type':'string','role': 'tooltip'}))
+ title = 'CA / MOIS'
+ for item in items:
+ # construire la liste pour donut cible
+ 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'
+ d = (item.mois, float(item.AXA_ca), tooltipAXA, float(item.MAIF_ca), tooltipMAIF)
+ chart_ca_12m.append(d)
+
+ # debut = aujourd'hui - 11 mois
+ datedeb = date.today()
+ datedeb.replace(month=1,day=1)
+
+ # lire les CA par mois
+ items = get_ca_groupe_3y(request, societe, datedeb)
+ chart_ca_3y_1 = []
+ chart_ca_3y_2 = []
+ chart_ca_3y_3 = []
+ # titre des colonnes
+ chart_ca_3y_1.append(('Groupe', 'CA'))
+ chart_ca_3y_2.append(('Groupe', 'CA'))
+ chart_ca_3y_3.append(('Groupe', 'CA'))
+ title1 = 'CA ' + (datedeb + relativedelta(years=-2)).strftime("%Y")
+ title2 = 'CA ' + (datedeb + relativedelta(years=-1)).strftime("%Y")
+ title3 = 'CA ' + datedeb.strftime("%Y")
+ for item in items:
+ # construire la liste pour donut cible
+ #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,
+ }
+
diff --git a/setup.py b/setup.py
index 4918890..ac05599 100644
--- a/setup.py
+++ b/setup.py
@@ -1,64 +1,64 @@
-import os
-
-from setuptools import setup, find_packages
-
-here = os.path.abspath(os.path.dirname(__file__))
-with open(os.path.join(here, 'README.md')) as f:
- README = f.read()
-with open(os.path.join(here, 'CHANGES.txt')) as f:
- CHANGES = f.read()
-
-requires = [
- 'pyramid',
- 'pyramid_chameleon',
- 'pyramid_debugtoolbar',
- 'pyramid_layout',
- 'pyramid_mailer',
- 'pyramid_tm',
- 'SQLAlchemy',
- 'transaction',
- 'zope.sqlalchemy == 1.1',
- 'waitress',
- 'mysqlclient',
- 'docutils',
- 'pdfkit',
- 'python-dateutil',
- 'user-agents',
- 'xlrd',
- 'image',
- 'pdfminer3'
- ]
-
-tests_require = [
- 'WebTest >= 1.3.1', # py3 compat
- 'pytest', # includes virtualenv
- 'pytest-cov',
- ]
-
-setup(name='mondumas',
- version='1.0',
- description='mondumas',
- long_description=README + '\n\n' + CHANGES,
- classifiers=[
- "Programming Language :: Python",
- "Framework :: Pyramid",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- ],
- author='',
- author_email='',
- url='',
- keywords='web wsgi bfg pylons pyramid',
- packages=find_packages(),
- include_package_data=True,
- zip_safe=False,
- extras_require={
- 'testing': tests_require,
- },
- install_requires=requires,
- entry_points="""\
- [paste.app_factory]
- main = mondumas:main
- [console_scripts]
- """,
- )
+import os
+
+from setuptools import setup, find_packages
+
+here = os.path.abspath(os.path.dirname(__file__))
+with open(os.path.join(here, 'README.md')) as f:
+ README = f.read()
+with open(os.path.join(here, 'CHANGES.txt')) as f:
+ CHANGES = f.read()
+
+requires = [
+ 'pyramid',
+ 'pyramid_chameleon',
+ 'pyramid_debugtoolbar',
+ 'pyramid_layout',
+ 'pyramid_mailer',
+ 'pyramid_tm',
+ 'SQLAlchemy',
+ 'transaction',
+ 'zope.sqlalchemy == 1.1',
+ 'waitress',
+ 'mysqlclient',
+ 'docutils',
+ 'pdfkit',
+ 'python-dateutil',
+ 'user-agents',
+ 'xlrd',
+ 'image',
+ 'pdfminer3'
+ ]
+
+tests_require = [
+ 'WebTest >= 1.3.1', # py3 compat
+ 'pytest', # includes virtualenv
+ 'pytest-cov',
+ ]
+
+setup(name='mondumas',
+ version='1.0',
+ description='mondumas',
+ long_description=README + '\n\n' + CHANGES,
+ classifiers=[
+ "Programming Language :: Python",
+ "Framework :: Pyramid",
+ "Topic :: Internet :: WWW/HTTP",
+ "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+ ],
+ author='',
+ author_email='',
+ url='',
+ keywords='web wsgi bfg pylons pyramid',
+ packages=find_packages(),
+ include_package_data=True,
+ zip_safe=False,
+ extras_require={
+ 'testing': tests_require,
+ },
+ install_requires=requires,
+ entry_points="""\
+ [paste.app_factory]
+ main = mondumas:main
+ [console_scripts]
+ """,
+ )