467 lines
20 KiB
Python
467 lines
20 KiB
Python
# -*- 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', renderer='../templates/stats/ca_groupes.pt', permission='view')
|
|
def ca_groupes(request):
|
|
|
|
societe = request.matchdict['societe']
|
|
url = request.route_url('ca_groupes', societe = societe)
|
|
|
|
datefin = date.today()
|
|
datefin.replace(day=1)
|
|
# 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)
|
|
print(datedeb)
|
|
chart_ca_12m = []
|
|
# titre des colonnes
|
|
chart_ca_12m.append(('Mois', 'MAIF', { 'type':'string','role': 'tooltip'}, 'MACIF', { 'type':'string','role': 'tooltip'}, 'GMF', { 'type':'string','role': 'tooltip'},'DOMUS', { 'type':'string','role': 'tooltip'}, 'AXA', { 'type':'string','role': 'tooltip'}))
|
|
title = 'CA sur 12 mois'
|
|
for item in items:
|
|
date_aff = item.date[:3] + ' ' + item.date[-4:]
|
|
# construire la liste pour donut cible
|
|
tooltipMAIF = 'MAIF - ' + date_aff + ' \nCA: '+str(item.MAIF_ca) + ' €\nDossiers: '+str(round(item.MAIF_nb))
|
|
tooltipAXA = "AXA - " + date_aff + ' \nCA: '+str(item.AXA_ca) + ' €\nDossiers: '+str(round(item.AXA_nb))
|
|
tooltipDOMUS = "DOMUS - " + date_aff + ' \nCA: '+str(item.DOMUS_ca) + ' €\nDossiers: '+str(round(item.DOMUS_nb))
|
|
tooltipGMF = "GMF - " + date_aff + ' \nCA: '+str(item.GMF_ca) + ' €\nDossiers: '+str(round(item.GMF_nb))
|
|
tooltipMACIF = "MACIF - " + date_aff + ' \nCA: '+str(item.MACIF_ca) + ' €\nDossiers: '+str(round(item.MACIF_nb))
|
|
# ('+str(item.population)+')/n'
|
|
d = (item.mois[:3], float(item.MAIF_ca), tooltipMAIF, float(item.MACIF_ca), tooltipMACIF, float(item.GMF_ca), tooltipGMF, float(item.DOMUS_ca), tooltipDOMUS, float(item.AXA_ca), tooltipAXA)
|
|
chart_ca_12m.append(d)
|
|
|
|
# debut = aujourd'hui - 11 mois
|
|
thisyear = date.today().year
|
|
|
|
# lire les CA par mois
|
|
items = get_ca_groupe_3y(request, societe, thisyear)
|
|
chart_ca_3y_1 = []
|
|
chart_ca_3y_2 = []
|
|
chart_ca_3y_3 = []
|
|
# titre des colonnes
|
|
chart_ca_3y_1.append(('Groupe', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
chart_ca_3y_2.append(('Groupe', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
chart_ca_3y_3.append(('Groupe', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
title1 = 'CA ' + str(thisyear - 2)
|
|
title2 = 'CA ' + str(thisyear - 1)
|
|
title3 = 'CA ' + str(thisyear)
|
|
for item in items:
|
|
# construire la liste pour donut cible
|
|
tooltip_y1 = item.groupe + ' \nCA: '+str(item.Annee1) + ' €\nDossiers: '+str(round(item.Count1))
|
|
tooltip_y2 = item.groupe + ' \nCA: '+str(item.Annee2) + ' €\nDossiers: '+str(round(item.Count1))
|
|
tooltip_y3 = item.groupe + ' \nCA: '+str(item.Annee3) + ' €\nDossiers: '+str(round(item.Count1))
|
|
# ('+str(item.population)+')/n'
|
|
d1 = (item.groupe, float(item.Annee1), tooltip_y1)
|
|
chart_ca_3y_1.append(d1)
|
|
d2 = (item.groupe, float(item.Annee2), tooltip_y2)
|
|
chart_ca_3y_2.append(d2)
|
|
d3 = (item.groupe, float(item.Annee3), tooltip_y3)
|
|
chart_ca_3y_3.append(d3)
|
|
|
|
# lire les CA par mois
|
|
items = get_ca_groupe_3y_with_others(request, societe, thisyear)
|
|
chart_ca_3y_1_x = []
|
|
chart_ca_3y_2_x = []
|
|
chart_ca_3y_3_x = []
|
|
# titre des colonnes
|
|
chart_ca_3y_1_x.append(('Groupe', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
chart_ca_3y_2_x.append(('Groupe', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
chart_ca_3y_3_x.append(('Groupe', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
title1 = 'CA ' + str(thisyear - 2)
|
|
title2 = 'CA ' + str(thisyear - 1)
|
|
title3 = 'CA ' + str(thisyear)
|
|
for item in items:
|
|
# construire la liste pour donut cible
|
|
tooltip_y1 = item.groupe + ' \nCA: '+str(item.Annee1) + ' €\nDossiers: '+str(round(item.Count1))
|
|
tooltip_y2 = item.groupe + ' \nCA: '+str(item.Annee2) + ' €\nDossiers: '+str(round(item.Count1))
|
|
tooltip_y3 = item.groupe + ' \nCA: '+str(item.Annee3) + ' €\nDossiers: '+str(round(item.Count1))
|
|
# ('+str(item.population)+')/n'
|
|
d1_x = (item.groupe, float(item.Annee1), tooltip_y1)
|
|
chart_ca_3y_1_x.append(d1_x)
|
|
d2_x = (item.groupe, float(item.Annee2), tooltip_y2)
|
|
chart_ca_3y_2_x.append(d2_x)
|
|
d3_x = (item.groupe, float(item.Annee3), tooltip_y3)
|
|
chart_ca_3y_3_x.append(d3_x)
|
|
|
|
|
|
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),
|
|
'chart_ca_3y_1_x': json.dumps(chart_ca_3y_1_x),
|
|
'chart_ca_3y_2_x': json.dumps(chart_ca_3y_2_x),
|
|
'chart_ca_3y_3_x': json.dumps(chart_ca_3y_3_x),
|
|
'title': title,
|
|
'title1': title1,
|
|
'title2': title2,
|
|
'title3': title3,
|
|
'societes': societes,
|
|
'societe': societe,
|
|
}
|
|
|
|
@view_config(route_name='ca_clients', renderer='../templates/stats/ca_clients.pt', permission='view')
|
|
def ca_clients(request):
|
|
|
|
societe = request.matchdict['societe']
|
|
url = request.route_url('ca_clients', 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_clients_12m(request, societe, datedeb, datefin)
|
|
print(datedeb)
|
|
chart_ca_12m = []
|
|
# titre des colonnes
|
|
chart_ca_12m.append(('Mois', 'SOCIETE', { 'type':'string','role': 'tooltip'}, 'REGIES', { 'type':'string','role': 'tooltip'},
|
|
'PARTICULIER', { 'type':'string','role': 'tooltip'}, 'GROUPEMENT', { 'type':'string','role': 'tooltip'}, 'EXPERTS',
|
|
{ 'type':'string','role': 'tooltip'}, 'ASSURANCES', { 'type':'string','role': 'tooltip'}))
|
|
title = 'CA sur 12 mois'
|
|
for item in items:
|
|
date_aff = item.date[:3] + ' ' + item.date[-4:]
|
|
# construire la liste pour donut cible
|
|
tooltipA = date_aff + ' \nCA: '+str(item.A_ca) + ' €\nDossiers: '+str(round(item.A_nb))
|
|
tooltipE = date_aff + ' \nCA: '+str(item.E_ca) + ' €\nDossiers: '+str(round(item.E_nb))
|
|
tooltipG = date_aff + ' \nCA: '+str(item.G_ca) + ' €\nDossiers: '+str(round(item.G_nb))
|
|
tooltipP = date_aff + ' \nCA: '+str(item.P_ca) + ' €\nDossiers: '+str(round(item.P_nb))
|
|
tooltipR = date_aff + ' \nCA: '+str(item.R_ca) + ' €\nDossiers: '+str(round(item.R_nb))
|
|
tooltipS = date_aff + ' \nCA: '+str(item.S_ca) + ' €\nDossiers: '+str(round(item.S_nb))
|
|
# ('+str(item.population)+')/n'
|
|
d = (item.mois[:3], float(item.S_ca), tooltipS, float(item.R_ca), tooltipR, float(item.P_ca), tooltipP,
|
|
float(item.G_ca), tooltipG, float(item.E_ca), tooltipE, float(item.A_ca), tooltipA)
|
|
chart_ca_12m.append(d)
|
|
|
|
# debut = aujourd'hui - 11 mois
|
|
thisyear = date.today().year
|
|
|
|
# lire les CA par mois
|
|
items = get_ca_clients_3y(request, societe, thisyear)
|
|
chart_ca_3y_1 = []
|
|
chart_ca_3y_2 = []
|
|
chart_ca_3y_3 = []
|
|
# titre des colonnes
|
|
chart_ca_3y_1.append(('Clients', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
chart_ca_3y_2.append(('Clients', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
chart_ca_3y_3.append(('Clients', 'CA', { 'type':'string','role': 'tooltip'}))
|
|
title1 = 'CA ' + str(thisyear - 2)
|
|
title2 = 'CA ' + str(thisyear - 1)
|
|
title3 = 'CA ' + str(thisyear)
|
|
for item in items:
|
|
# construire la liste pour donut cible
|
|
tooltip_y1 = item.LIB + ' \nCA: '+str(item.Annee1) + ' €\nDossiers: '+str(round(item.Count1))
|
|
tooltip_y2 = item.LIB + ' \nCA: '+str(item.Annee2) + ' €\nDossiers: '+str(round(item.Count1))
|
|
tooltip_y3 = item.LIB + ' \nCA: '+str(item.Annee3) + ' €\nDossiers: '+str(round(item.Count1))
|
|
# ('+str(item.population)+')/n'
|
|
if item.Annee1 > 0:
|
|
ca = float(item.Annee1)
|
|
else:
|
|
ca = 0
|
|
d1 = (item.LIB, ca, tooltip_y1)
|
|
chart_ca_3y_1.append(d1)
|
|
if item.Annee2 > 0:
|
|
ca = float(item.Annee2)
|
|
else:
|
|
ca = 0
|
|
d2 = (item.LIB, ca, tooltip_y2)
|
|
chart_ca_3y_2.append(d2)
|
|
if item.Annee3 > 0:
|
|
ca = float(item.Annee3)
|
|
else:
|
|
ca = 0
|
|
d3 = (item.LIB, ca, tooltip_y3)
|
|
chart_ca_3y_3.append(d3)
|
|
|
|
return {
|
|
'page_title': "CA par types de clients",
|
|
'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,
|
|
}
|
|
|
|
@view_config(route_name='delais_pourcentage', renderer='../templates/stats/delais_pourcentage.pt', permission='view')
|
|
def delais_pourcentage(request):
|
|
|
|
societe = request.matchdict['societe']
|
|
url = request.route_url('delais_pourcentage', 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 CA par mois
|
|
items = get_delais_pourcent(request, societe, groupe, datedeb)
|
|
chart_delais_p = []
|
|
|
|
# titre des colonnes
|
|
chart_delais_p.append(('Catégorie', 'Delais'))
|
|
title = 'POURCENTAGE DELAIS'
|
|
for item in items:
|
|
# construire la liste pour donut cible
|
|
#tooltipA = item.date + ' \nCA: '+str(item.A_ca) + ' €\nDossiers: '+str(round(item.A_nb))
|
|
# ('+str(item.population)+')/n'
|
|
d = ('1er contact inférieur à 2j', round(item.delais_inf))
|
|
chart_delais_p.append(d)
|
|
d = ('1er contact supérieur à 2j', round(item.delais_sup))
|
|
chart_delais_p.append(d)
|
|
|
|
return {
|
|
'page_title': "Pourcentage de délais inférieurs à 2 jours",
|
|
'url': url,
|
|
'chart_delais_p': json.dumps(chart_delais_p),
|
|
'title': title,
|
|
'societes': societes,
|
|
'societe': societe,
|
|
'groupes': groupes,
|
|
'groupe': groupe,
|
|
}
|
|
|
|
@view_config(route_name='pourcentage_devis', renderer='../templates/stats/pourcentage_devis.pt', permission='view')
|
|
def pourcentage_devis(request):
|
|
|
|
societe = request.matchdict['societe']
|
|
url = request.route_url('delais_pourcentage', 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 le nb de devis facturés
|
|
items = get_nb_devis_fact(request, societe, datedeb)
|
|
chart_devis_fact = []
|
|
|
|
# titre des colonnes
|
|
chart_devis_fact.append(('Catégorie', 'Delais'))
|
|
title = 'POURCENTAGE DU NOMBRE DE DEVIS FACTURÉS'
|
|
for item in items:
|
|
# construire la liste pour donut cible
|
|
#tooltipA = item.date + ' \nCA: '+str(item.A_ca) + ' €\nDossiers: '+str(round(item.A_nb))
|
|
# ('+str(item.population)+')/n'
|
|
d = ('Nb de devis facturés', round(item.devis_fact))
|
|
chart_devis_fact.append(d)
|
|
d = ('Nb de devis non facturés', round(item.devis_non_fact))
|
|
chart_devis_fact.append(d)
|
|
|
|
# lire le nb de devis facturés
|
|
items = get_nb_fact_with_devis(request, societe, datedeb)
|
|
chart_fact = []
|
|
|
|
# titre des colonnes
|
|
chart_fact.append(('Catégorie', 'Delais'))
|
|
title = 'POURCENTAGE DU NOMBRE DE FACTURES AVEC DEVIS'
|
|
for item in items:
|
|
# construire la liste pour donut cible
|
|
#tooltipA = item.date + ' \nCA: '+str(item.A_ca) + ' €\nDossiers: '+str(round(item.A_nb))
|
|
# ('+str(item.population)+')/n'
|
|
d = ('Nb de factures avec devis', round(item.fact_w_devis))
|
|
chart_fact.append(d)
|
|
d = ('Nb de factures sans devis', round(item.fact_wo_devis))
|
|
chart_fact.append(d)
|
|
|
|
return {
|
|
'page_title': "Pourcentage de délais inférieurs à 2 jours",
|
|
'url': url,
|
|
'chart_devis_fact': json.dumps(chart_devis_fact),
|
|
'chart_fact': json.dumps(chart_fact),
|
|
'title': title,
|
|
'societes': societes,
|
|
'societe': societe,
|
|
}
|
|
|