diff --git a/mondumas/models/parametres.py b/mondumas/models/parametres.py
index bcaca62..1196a84 100644
--- a/mondumas/models/parametres.py
+++ b/mondumas/models/parametres.py
@@ -32,19 +32,6 @@ def get_rappels_rdv(request):
results = request.dbsession.execute(query, {})
return results.fetchall()
-def get_stats_dd(request, societe):
-
- query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
-SUM(IF(status = '', 1, 0)) AS Created,
-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);"""
- results = request.dbsession.execute(query, {'societe': societe}).fetchall()
- return results
-
def get_dossiers_byChantier(request, societe, name):
query = "CALL spGET_DOSSIERS_byChantier('%s','%s','%s');" % (societe, 'DE', name.replace("'","''"))
@@ -197,21 +184,7 @@ def update_expert(request, code_cab, code_exp, new_values):
def delete_expert(request, code_cab, code_exp):
query = "DELETE FROM p_experts WHERE code_cab = :code_cab AND code_exp = :code_exp;"
execute_query(request, query, {'code_cab': code_cab, 'code_exp': code_exp})
-
-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_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 update_societe(request, code, new_values):
# formater les champs
s = ''
diff --git a/mondumas/models/stats.py b/mondumas/models/stats.py
new file mode 100644
index 0000000..76b16a1
--- /dev/null
+++ b/mondumas/models/stats.py
@@ -0,0 +1,61 @@
+# -*- 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
+
diff --git a/mondumas/routes.py b/mondumas/routes.py
index 81fae50..aa0e1cf 100644
--- a/mondumas/routes.py
+++ b/mondumas/routes.py
@@ -58,8 +58,6 @@ def includeme(config):
config.add_route('emails_msg', '/emails_msg/{nolig}')
config.add_route('expert_edit', '/expert_edit/{code_cab}/{code_exp}')
config.add_route('infrastructure', '/infrastructure')
- config.add_route('stats_dd', '/stats_dd/{societe}')
- config.add_route('stats_delais', '/stats_delais/{societe}')
config.add_route('rappels_rdv', '/rappels_rdv')
config.add_route('rdf_cause_edit', '/rdf_cause_edit/{code}')
config.add_route('rdf_causes', '/rdf_causes')
@@ -74,7 +72,12 @@ def includeme(config):
config.add_route('user_edit', '/user_edit/{cd_uti}')
config.add_route('users', '/users')
config.add_route('users_ua', '/users_ua')
-
+
+ # stats
+ config.add_route('stats', '/stats')
+ config.add_route('stats_dossiers', '/stats_dossiers/{societe}')
+ config.add_route('stats_delais', '/stats_delais/{societe}')
+ config.add_route('ca_groupes_12m', '/ca_groupes_12m/{societe}')
# utils
config.add_route('batch_nuit', '/batch_nuit/{param}')
config.add_route('batch_test', '/batch_test/{param}')
diff --git a/mondumas/templates/default/home.pt b/mondumas/templates/default/home.pt
index 3ed717f..461d306 100644
--- a/mondumas/templates/default/home.pt
+++ b/mondumas/templates/default/home.pt
@@ -45,9 +45,9 @@
PDF DOSSIERS
diff --git a/mondumas/templates/stats/ca_groupes_12m.pt b/mondumas/templates/stats/ca_groupes_12m.pt
new file mode 100644
index 0000000..6c34e7d
--- /dev/null
+++ b/mondumas/templates/stats/ca_groupes_12m.pt
@@ -0,0 +1,96 @@
+
+
+
+
+
diff --git a/mondumas/templates/stats/stats.pt b/mondumas/templates/stats/stats.pt
new file mode 100644
index 0000000..a78062d
--- /dev/null
+++ b/mondumas/templates/stats/stats.pt
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/mondumas/templates/parametres/stats_delais.pt b/mondumas/templates/stats/stats_delais.pt
similarity index 100%
rename from mondumas/templates/parametres/stats_delais.pt
rename to mondumas/templates/stats/stats_delais.pt
diff --git a/mondumas/templates/parametres/stats_dd.pt b/mondumas/templates/stats/stats_dossiers.pt
similarity index 83%
rename from mondumas/templates/parametres/stats_dd.pt
rename to mondumas/templates/stats/stats_dossiers.pt
index 2d35793..ed9adbe 100644
--- a/mondumas/templates/parametres/stats_dd.pt
+++ b/mondumas/templates/stats/stats_dossiers.pt
@@ -21,13 +21,13 @@
| Année |
- A traiter |
- Devis |
- Commandé |
- Facturé |
+ Total DD |
+ DD à traiter |
+ DD avec devis |
+ Devis à traiter |
+ DD avec facture |
Régl part. |
Réglée |
- Total |
@@ -63,7 +63,9 @@
order: [[0, 'asc']],
rowCallback: function( row, data ) {
$('td', row).eq(0).addClass('bg-success');
- $('td', row).eq(7).addClass('bg-warning');
+ $('td', row).eq(1).addClass('bg-warning');
+ $('td', row).eq(3).addClass('bg-warning');
+ $('td', row).eq(5).addClass('bg-warning');
},
});
});
diff --git a/mondumas/views/parametres.py b/mondumas/views/parametres.py
index 7a3f722..813aab3 100644
--- a/mondumas/views/parametres.py
+++ b/mondumas/views/parametres.py
@@ -218,37 +218,6 @@ def rappels_rdv(request):
'nbRappels': nbRappels,
}
-@view_config(route_name='stats_dd', renderer='../templates/parametres/stats_dd.pt', permission='view')
-def stats_dd(request):
-
- societe = request.matchdict['societe']
- url = request.route_url('stats_dd', 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_dd', societe=societe)
-
- # lire les stats globales des demandes de devis
- stats_dd = get_stats_dd(request, societe)
-
- liste=[]
- # construire la liste
- for item in stats_dd:
- d = (str(item.Annee), str(item.Created), str(item.Devis), str(item.Commande), str(item.Facture), str(item.ReglePart),
- str(item.Regle), str(item.Total))
- liste.append(d)
-
- return {
- 'page_title': "Stats : Demandes de devis",
- 'url': url,
- 'message': message,
- 'dt_data': json.dumps(liste),
- 'societes': societes,
- 'societe': societe,
- }
@view_config(route_name='rdf_causes', renderer='../templates/parametres/rdf_causes.pt', permission='manage')
def rdf_causes(request):
@@ -647,96 +616,6 @@ def expert_edit(request):
'message': message,
}
-@view_config(route_name='stats_delais', renderer='../templates/parametres/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': "Indices de performances",
- '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='societes', renderer='../templates/parametres/societes.pt', permission='manage')
def societes(request):
diff --git a/mondumas/views/stats.py b/mondumas/views/stats.py
new file mode 100644
index 0000000..2babb10
--- /dev/null
+++ b/mondumas/views/stats.py
@@ -0,0 +1,207 @@
+# -*- 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,
+ }
+