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

- + -

INDICES P.

+

STATISTIQUES


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, + } +