From 6902e04e549a7bebcd054bba79465131a3d2176b Mon Sep 17 00:00:00 2001 From: thienan Date: Tue, 15 Jun 2021 15:40:25 +0200 Subject: [PATCH] Ajout graphiques CA par groupes --- .vscode/settings.json | 3 +- mondumas.egg-info/PKG-INFO | 120 +++--- mondumas.egg-info/SOURCES.txt | 2 + mondumas/models/stats.py | 139 ++++--- mondumas/templates/stats/ca_groupes_12m.pt | 185 +++++---- mondumas/views/stats.py | 436 +++++++++++---------- setup.py | 128 +++--- 7 files changed, 524 insertions(+), 489 deletions(-) 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] + """, + )