Merge branch 'master' of https://bitbucket.org/caotek/dumas_gestion
This commit is contained in:
@@ -20,7 +20,7 @@ pyramid.includes =
|
|||||||
|
|
||||||
|
|
||||||
sqlalchemy.url = mysql://phuoc:phuoc!@localhost/bddevfac?charset=utf8
|
sqlalchemy.url = mysql://phuoc:phuoc!@localhost/bddevfac?charset=utf8
|
||||||
# sqlalchemy.url = mysql://phuoc:phuoc!@192.168.1.17/bddevfac?charset=utf8
|
# sqlalchemy.url = mysql://phuoc:phuoc!@192.168.15.33/bddevfac?charset=utf8
|
||||||
# sqlalchemy.url = mysql://phuoc:phuoc!@192.168.0.31/bddevfac?charset=utf8
|
# sqlalchemy.url = mysql://phuoc:phuoc!@192.168.0.31/bddevfac?charset=utf8
|
||||||
|
|
||||||
mondumas.admin_email = cao.thien-phuoc@orange.fr
|
mondumas.admin_email = cao.thien-phuoc@orange.fr
|
||||||
|
|||||||
@@ -339,6 +339,11 @@ def get_status_by_id(request, code):
|
|||||||
results = request.dbsession.execute(query, {'code': code}).first()
|
results = request.dbsession.execute(query, {'code': code}).first()
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def get_motifs(request):
|
||||||
|
query = """SELECT * FROM p_motfs;"""
|
||||||
|
results = request.dbsession.execute(query,).fetchall()
|
||||||
|
return results
|
||||||
|
|
||||||
def get_factures_en_att(request, societe):
|
def get_factures_en_att(request, societe):
|
||||||
query = """SELECT f.date, LPAD(f.no_id,6,'0') AS numero, f.nomcli, CONCAT(f.c_nom,'; ',f.c_adr,'; ',f.c_ville) AS chantier, f.totalht AS montant, f.status, s.libelle, f.nosin, f.nopol, f.usermaj
|
query = """SELECT f.date, LPAD(f.no_id,6,'0') AS numero, f.nomcli, CONCAT(f.c_nom,'; ',f.c_adr,'; ',f.c_ville) AS chantier, f.totalht AS montant, f.status, s.libelle, f.nosin, f.nopol, f.usermaj
|
||||||
FROM facture f JOIN p_statuts s ON f.STATUS = s.CODE WHERE f.societe=:societe AND f.STATUS < 8 ORDER BY f.societe, f.STATUS, f.nomcli;"""
|
FROM facture f JOIN p_statuts s ON f.STATUS = s.CODE WHERE f.societe=:societe AND f.STATUS < 8 ORDER BY f.societe, f.STATUS, f.nomcli;"""
|
||||||
|
|||||||
@@ -82,6 +82,20 @@ def get_ca_groupe_3y(request, societe, year):
|
|||||||
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
|
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
|
||||||
return results.fetchall()
|
return results.fetchall()
|
||||||
|
|
||||||
|
def get_ca_groupe_3y_with_others(request, societe, year):
|
||||||
|
|
||||||
|
query = """SELECT groupe,
|
||||||
|
SUM(IF (year(date) = :year - 2, TOTALHT, 0)) as Annee1,
|
||||||
|
SUM(IF (year(date) = :year - 2, 1, 0)) as Count1,
|
||||||
|
SUM(IF (year(date) = :year - 1, TOTALHT, 0)) as Annee2,
|
||||||
|
SUM(IF (year(date) = :year - 1, 1, 0)) as Count2,
|
||||||
|
SUM(IF (year(date) = :year, TOTALHT, 0)) as Annee3,
|
||||||
|
SUM(IF (year(date) = :year, 1, 0)) as Count3
|
||||||
|
FROM bddevfac.facture
|
||||||
|
WHERE societe=:societe AND year(date) >= :year - 2 AND typecli <> 'I' GROUP BY groupe;"""
|
||||||
|
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
|
||||||
|
return results.fetchall()
|
||||||
|
|
||||||
def get_ca_clients_12m(request, societe, datedeb, datefin):
|
def get_ca_clients_12m(request, societe, datedeb, datefin):
|
||||||
|
|
||||||
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
|
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
|
||||||
@@ -127,3 +141,24 @@ def get_delais_pourcent(request, societe, groupe, datedeb):
|
|||||||
WHERE societe = :societe AND GROUPE = :groupe AND date >= :datedeb;"""
|
WHERE societe = :societe AND GROUPE = :groupe AND date >= :datedeb;"""
|
||||||
results = request.dbsession.execute(query, {'societe': societe, 'groupe': groupe, 'datedeb': datedeb.strftime("%Y-%m")})
|
results = request.dbsession.execute(query, {'societe': societe, 'groupe': groupe, 'datedeb': datedeb.strftime("%Y-%m")})
|
||||||
return results.fetchall()
|
return results.fetchall()
|
||||||
|
|
||||||
|
def get_nb_devis_fact(request, societe, datedeb):
|
||||||
|
|
||||||
|
query = """SELECT
|
||||||
|
SUM(IF (NOFACT > 0, 1, 0)) AS devis_fact,
|
||||||
|
SUM(IF (NOFACT <= 0, 1, 0)) AS devis_non_fact
|
||||||
|
FROM bddevfac.devis
|
||||||
|
WHERE societe = :societe AND date >= :datedeb;"""
|
||||||
|
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y-%m")})
|
||||||
|
return results.fetchall()
|
||||||
|
|
||||||
|
def get_nb_fact_with_devis(request, societe, datedeb):
|
||||||
|
|
||||||
|
query = """SELECT
|
||||||
|
SUM(IF (NODEVIS > 0, 1, 0)) AS fact_w_devis,
|
||||||
|
SUM(IF (NODEVIS <= 0, 1, 0)) AS fact_wo_devis
|
||||||
|
FROM bddevfac.facture
|
||||||
|
WHERE societe = :societe AND date >= :datedeb;"""
|
||||||
|
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y-%m")})
|
||||||
|
return results.fetchall()
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ def includeme(config):
|
|||||||
config.add_route('ca_groupes', '/ca_groupes/{societe}')
|
config.add_route('ca_groupes', '/ca_groupes/{societe}')
|
||||||
config.add_route('ca_clients', '/ca_clients/{societe}')
|
config.add_route('ca_clients', '/ca_clients/{societe}')
|
||||||
config.add_route('delais_pourcentage', '/delais_pourcentage/{societe}')
|
config.add_route('delais_pourcentage', '/delais_pourcentage/{societe}')
|
||||||
|
config.add_route('pourcentage_devis', '/pourcentage_devis/{societe}')
|
||||||
|
|
||||||
# utils
|
# utils
|
||||||
config.add_route('batch_nuit', '/batch_nuit/{param}')
|
config.add_route('batch_nuit', '/batch_nuit/{param}')
|
||||||
|
|||||||
@@ -109,7 +109,7 @@
|
|||||||
<span class="info-box-icon"><i class="glyphicon glyphicon-file"></i></span>
|
<span class="info-box-icon"><i class="glyphicon glyphicon-file"></i></span>
|
||||||
<div class="info-box-content">
|
<div class="info-box-content">
|
||||||
<span class="info-box-number">DEVIS</span>
|
<span class="info-box-number">DEVIS</span>
|
||||||
<span class="info-box-text">EN ATTENTE </span>
|
<span class="info-box-text">EN COURS </span>
|
||||||
<span class="info-box-number"><span class="badge bg-PE">${nb_de_restants.nb_PE}</span>
|
<span class="info-box-number"><span class="badge bg-PE">${nb_de_restants.nb_PE}</span>
|
||||||
<span class="badge bg-ME">${nb_de_restants.nb_ME}</span>
|
<span class="badge bg-ME">${nb_de_restants.nb_ME}</span>
|
||||||
<span class="badge bg-PL">${nb_de_restants.nb_PL}</span></span>
|
<span class="badge bg-PL">${nb_de_restants.nb_PL}</span></span>
|
||||||
|
|||||||
@@ -64,14 +64,14 @@
|
|||||||
<p>Dernière modif. le <b>${entete.DATEMAJ.strftime('%d/%m/%Y à %H:%M')}</b> par <b>${entete.USERMAJ}</b></p>
|
<p>Dernière modif. le <b>${entete.DATEMAJ.strftime('%d/%m/%Y à %H:%M')}</b> par <b>${entete.USERMAJ}</b></p>
|
||||||
<p>
|
<p>
|
||||||
<a class="btn btn-warning" role="button" href="#"
|
<a class="btn btn-warning" role="button" href="#"
|
||||||
data-toggle="modal" data-target="#confirmCloture"><span class="glyphicon glyphicon-check"></span> Modif. statut</a>
|
data-toggle="modal" data-target="#confirmCloture" tal:condition="access > 0"><span class="glyphicon glyphicon-check"></span> Modif. statut</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div> <!-- row -->
|
</div> <!-- row -->
|
||||||
<!-- ENTETE entete -->
|
<!-- ENTETE entete -->
|
||||||
<table class="table table-bordered table-condensed">
|
<table class="table table-bordered table-condensed" tal:condition="access > 0">
|
||||||
<tr class="well">
|
<tr class="well">
|
||||||
<th class="text-right">Total HT</th>
|
<th class="text-right">Total HT</th>
|
||||||
<th class="text-right">Total TVA</th>
|
<th class="text-right">Total TVA</th>
|
||||||
@@ -98,9 +98,9 @@
|
|||||||
<tr tal:repeat="detail details">
|
<tr tal:repeat="detail details">
|
||||||
<td>${detail.REF}</td>
|
<td>${detail.REF}</td>
|
||||||
<td>${detail.LIB}</td>
|
<td>${detail.LIB}</td>
|
||||||
<td class="text-right">${layout.to_euro(detail.QTE)}</td>
|
<td class="text-right">${detail.QTE}</td>
|
||||||
<td class="text-right">${layout.to_euroz(detail.PRIXHT)}</td>
|
<td class="text-right"><span tal:condition="access > 0">${layout.to_euroz(detail.PRIXHT)}</span></td>
|
||||||
<td class="text-right">${layout.to_euroz(detail.MTHT)}</td>
|
<td class="text-right"><span tal:condition="access > 0">${layout.to_euroz(detail.MTHT)}</span></td>
|
||||||
<td class="text-center">${detail.USERMAJ}</td>
|
<td class="text-center">${detail.USERMAJ}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@@ -133,13 +133,12 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<label class="control-label col-xs-4" for="motif">Motif :</label>
|
<label class="control-label col-xs-4" for="motif">Motif :</label>
|
||||||
<div class="col-xs-8">
|
<div class="col-xs-8">
|
||||||
<input class="form-control" type="text" id="motif" name="motif" value=""
|
<select class="form-control" id="motif" name="motif">
|
||||||
placeholder="65 caractères maximum"
|
<option selected> </option>
|
||||||
data-fv-notempty="true"
|
<div tal:repeat="item motif">
|
||||||
data-fv-notempty-message="Veuillez remplir un motif"
|
<option>${item.code} | ${item.libelle}</option>
|
||||||
data-fv-stringlength="true"
|
</div>
|
||||||
data-fv-stringlength-max="65"
|
</select>
|
||||||
data-fv-stringlength-message="65 caractères maximum"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
@@ -129,7 +129,7 @@
|
|||||||
|
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li class="active"><a data-toggle="tab" href="#tab_suivi"><b>SUIVI du DOSSIER</b></a></li>
|
<li class="active"><a data-toggle="tab" href="#tab_suivi"><b>SUIVI du DOSSIER</b></a></li>
|
||||||
<li tal:condition="access > 0">
|
<li>
|
||||||
<a data-toggle="tab" href="#tab_documents"><b>DEVIS - FACTURES</b></a></li>
|
<a data-toggle="tab" href="#tab_documents"><b>DEVIS - FACTURES</b></a></li>
|
||||||
<li tal:condition="access > 0">
|
<li tal:condition="access > 0">
|
||||||
<a data-toggle="tab" href="#tab_attaches"><b>DOCUMENTS ATTACHES</b></a></li>
|
<a data-toggle="tab" href="#tab_attaches"><b>DOCUMENTS ATTACHES</b></a></li>
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>${detail.date.strftime('%d-%m-%Y')}</td>
|
<td>${detail.date.strftime('%d-%m-%Y')}</td>
|
||||||
<td>${detail.nomcli}</td>
|
<td>${detail.nomcli}</td>
|
||||||
<td class="text-right">${layout.to_euro(detail.montant)}</td>
|
<td class="text-right"><span tal:condition="access > 0">${layout.to_euro(detail.montant)}</span></td>
|
||||||
<td class="text-center">${detail.status}</td>
|
<td class="text-center">${detail.status}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
@@ -343,13 +343,12 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<label class="control-label col-xs-4" for="motif">Motif :</label>
|
<label class="control-label col-xs-4" for="motif">Motif :</label>
|
||||||
<div class="col-xs-8">
|
<div class="col-xs-8">
|
||||||
<input class="form-control" type="text" id="motif" name="motif" value=""
|
<select class="form-control" id="motif" name="motif">
|
||||||
placeholder="65 caractères maximum"
|
<option selected> </option>
|
||||||
data-fv-notempty="true"
|
<div tal:repeat="item motif">
|
||||||
data-fv-notempty-message="Veuillez remplir un motif"
|
<option>${item.code} | ${item.libelle}</option>
|
||||||
data-fv-stringlength="true"
|
</div>
|
||||||
data-fv-stringlength-max="65"
|
</select>
|
||||||
data-fv-stringlength-message="65 caractères maximum"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
@@ -37,6 +37,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h2>Evolution du CA sur les 3 dernières années (global)</h2>
|
||||||
|
<div class="row">
|
||||||
|
<!-- camembert 1 -->
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div id="chart_ca_3y_1_x" style="width: 100%; height: 500px;"></div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div id="chart_ca_3y_2_x" style="width: 100%; height: 500px;"></div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div id="chart_ca_3y_3_x" style="width: 100%; height: 500px;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@@ -48,6 +62,10 @@
|
|||||||
var dataSet_ca_3y_2 = ${chart_ca_3y_2};
|
var dataSet_ca_3y_2 = ${chart_ca_3y_2};
|
||||||
var dataSet_ca_3y_3 = ${chart_ca_3y_3};
|
var dataSet_ca_3y_3 = ${chart_ca_3y_3};
|
||||||
|
|
||||||
|
var dataSet_ca_3y_1_x = ${chart_ca_3y_1_x};
|
||||||
|
var dataSet_ca_3y_2_x = ${chart_ca_3y_2_x};
|
||||||
|
var dataSet_ca_3y_3_x = ${chart_ca_3y_3_x};
|
||||||
|
|
||||||
function drawChart() {
|
function drawChart() {
|
||||||
var data_ca_12m = google.visualization.arrayToDataTable(dataSet_ca_12m);
|
var data_ca_12m = google.visualization.arrayToDataTable(dataSet_ca_12m);
|
||||||
|
|
||||||
@@ -55,6 +73,10 @@
|
|||||||
var data_ca_3y_2 = google.visualization.arrayToDataTable(dataSet_ca_3y_2);
|
var data_ca_3y_2 = google.visualization.arrayToDataTable(dataSet_ca_3y_2);
|
||||||
var data_ca_3y_3 = google.visualization.arrayToDataTable(dataSet_ca_3y_3);
|
var data_ca_3y_3 = google.visualization.arrayToDataTable(dataSet_ca_3y_3);
|
||||||
|
|
||||||
|
var data_ca_3y_1_x = google.visualization.arrayToDataTable(dataSet_ca_3y_1_x);
|
||||||
|
var data_ca_3y_2_x = google.visualization.arrayToDataTable(dataSet_ca_3y_2_x);
|
||||||
|
var data_ca_3y_3_x = google.visualization.arrayToDataTable(dataSet_ca_3y_3_x);
|
||||||
|
|
||||||
var options_ca_12m = {
|
var options_ca_12m = {
|
||||||
title: '${title}',
|
title: '${title}',
|
||||||
vAxis: {title: "Chiffre d'Affaires en €"},
|
vAxis: {title: "Chiffre d'Affaires en €"},
|
||||||
@@ -80,6 +102,21 @@
|
|||||||
pieHole: 0.3,
|
pieHole: 0.3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var options_ca_3y_1_x = {
|
||||||
|
title: '${title1}',
|
||||||
|
colors: ['gray', 'green', '#3366cc', 'purple', 'ff9900', 'dc3912'],
|
||||||
|
};
|
||||||
|
|
||||||
|
var options_ca_3y_2_x = {
|
||||||
|
title: '${title2}',
|
||||||
|
colors: ['gray', 'green', '#3366cc', 'purple', 'ff9900', 'dc3912'],
|
||||||
|
};
|
||||||
|
|
||||||
|
var options_ca_3y_3_x = {
|
||||||
|
title: '${title3}',
|
||||||
|
colors: ['gray', 'green', '#3366cc', 'purple', 'ff9900', 'dc3912'],
|
||||||
|
};
|
||||||
|
|
||||||
var chart_ca_12m = new google.visualization.ColumnChart(document.getElementById('chart_ca_12m'));
|
var chart_ca_12m = new google.visualization.ColumnChart(document.getElementById('chart_ca_12m'));
|
||||||
chart_ca_12m.draw(data_ca_12m, options_ca_12m);
|
chart_ca_12m.draw(data_ca_12m, options_ca_12m);
|
||||||
|
|
||||||
@@ -89,6 +126,13 @@
|
|||||||
chart_ca_3y_2.draw(data_ca_3y_2, options_ca_3y_2);
|
chart_ca_3y_2.draw(data_ca_3y_2, options_ca_3y_2);
|
||||||
var chart_ca_3y_3 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_3'));
|
var chart_ca_3y_3 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_3'));
|
||||||
chart_ca_3y_3.draw(data_ca_3y_3, options_ca_3y_3);
|
chart_ca_3y_3.draw(data_ca_3y_3, options_ca_3y_3);
|
||||||
|
|
||||||
|
var chart_ca_3y_1_x = new google.visualization.PieChart(document.getElementById('chart_ca_3y_1_x'));
|
||||||
|
chart_ca_3y_1_x.draw(data_ca_3y_1_x, options_ca_3y_1_x);
|
||||||
|
var chart_ca_3y_2_x = new google.visualization.PieChart(document.getElementById('chart_ca_3y_2_x'));
|
||||||
|
chart_ca_3y_2_x.draw(data_ca_3y_2_x, options_ca_3y_2_x);
|
||||||
|
var chart_ca_3y_3_x = new google.visualization.PieChart(document.getElementById('chart_ca_3y_3_x'));
|
||||||
|
chart_ca_3y_3_x.draw(data_ca_3y_3_x, options_ca_3y_3_x);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
63
mondumas/templates/stats/pourcentage_devis.pt
Normal file
63
mondumas/templates/stats/pourcentage_devis.pt
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<metal:block use-macro="main_template">
|
||||||
|
<div metal:fill-slot="content">
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<div class="row">
|
||||||
|
<form method="POST" id="frm" class="form-horizontal">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-sm-2">Societe</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<select class="form-control" id="societe" name="societe" onChange="$('#frm').submit()">
|
||||||
|
<tal:block tal:repeat="item societes">
|
||||||
|
<option value="${item}" tal:attributes="selected societe==item and 'selected' or None"> ${item}</option>
|
||||||
|
</tal:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- CAMENBERT DU NOMBRE DE DEVIS FACTURES -->
|
||||||
|
<div id="chart_devis_fact" style="width: 100%; height: 500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- CAMEMBERT DU NOMBRE DE FACTURES AVEC DEVIS -->
|
||||||
|
<div id="chart_fact" style="width: 100%; height: 500px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
google.charts.load("current", {packages:["corechart"]});
|
||||||
|
google.charts.setOnLoadCallback(drawChart);
|
||||||
|
var dataSet_devis_fact = ${chart_devis_fact};
|
||||||
|
var dataSet_fact = ${chart_fact};
|
||||||
|
|
||||||
|
function drawChart() {
|
||||||
|
var data_devis_fact = google.visualization.arrayToDataTable(dataSet_devis_fact);
|
||||||
|
var data_fact = google.visualization.arrayToDataTable(dataSet_fact);
|
||||||
|
|
||||||
|
var options_devis_fact = {
|
||||||
|
title: '${title}',
|
||||||
|
pieHole: 0.4,
|
||||||
|
};
|
||||||
|
|
||||||
|
var options_fact = {
|
||||||
|
title: '${title}',
|
||||||
|
pieHole: 0.4,
|
||||||
|
};
|
||||||
|
|
||||||
|
var chart_devis_fact = new google.visualization.PieChart(document.getElementById('chart_devis_fact'));
|
||||||
|
chart_devis_fact.draw(data_devis_fact, options_devis_fact);
|
||||||
|
|
||||||
|
var chart_fact = new google.visualization.PieChart(document.getElementById('chart_fact'));
|
||||||
|
chart_fact.draw(data_fact, options_fact);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</div><!-- content -->
|
||||||
|
</metal:block>
|
||||||
|
|
||||||
|
|
||||||
@@ -29,6 +29,11 @@
|
|||||||
<span class="glyphicon glyphicon-equalizer logo-warning"></span>
|
<span class="glyphicon glyphicon-equalizer logo-warning"></span>
|
||||||
<h4>CA / TYPE CLIENTS</h4></a>
|
<h4>CA / TYPE CLIENTS</h4></a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<a href="${request.application_url}/pourcentage_devis/PE" tal:condition="access > 0">
|
||||||
|
<span class="glyphicon glyphicon-equalizer logo-warning"></span>
|
||||||
|
<h4>POURCENTAGE DEVIS</h4></a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,10 @@ def devis_view(request):
|
|||||||
logged_in = request.authenticated_userid.upper()
|
logged_in = request.authenticated_userid.upper()
|
||||||
url = request.route_url("devis_view", nodevis=nodevis)
|
url = request.route_url("devis_view", nodevis=nodevis)
|
||||||
|
|
||||||
|
# lire son niveau d'accès
|
||||||
|
member = get_member_by_id(request, logged_in)
|
||||||
|
access = member.access
|
||||||
|
|
||||||
type_doc = nodevis[3:5]
|
type_doc = nodevis[3:5]
|
||||||
if type_doc == 'DE':
|
if type_doc == 'DE':
|
||||||
page_title = "Devis no : %s" % (nodevis)
|
page_title = "Devis no : %s" % (nodevis)
|
||||||
@@ -93,6 +97,7 @@ def devis_view(request):
|
|||||||
bg_color = "bg-%s" % societe
|
bg_color = "bg-%s" % societe
|
||||||
|
|
||||||
status = get_status_by_id(request, 'DE')
|
status = get_status_by_id(request, 'DE')
|
||||||
|
motifs = get_motifs(request)
|
||||||
|
|
||||||
if 'form.close' in request.params:
|
if 'form.close' in request.params:
|
||||||
status = request.params["status"]
|
status = request.params["status"]
|
||||||
@@ -119,7 +124,9 @@ def devis_view(request):
|
|||||||
'details': details,
|
'details': details,
|
||||||
'bg_color': bg_color,
|
'bg_color': bg_color,
|
||||||
'status': status,
|
'status': status,
|
||||||
|
'motifs': motifs,
|
||||||
'type_doc': type_doc,
|
'type_doc': type_doc,
|
||||||
|
'access': access,
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='devis_web', renderer='../templates/devis/devis_web.pt', permission='view')
|
@view_config(route_name='devis_web', renderer='../templates/devis/devis_web.pt', permission='view')
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ def dossier_view(request):
|
|||||||
bg_color = "bg-%s" % societe
|
bg_color = "bg-%s" % societe
|
||||||
|
|
||||||
status = get_status_by_id(request, '')
|
status = get_status_by_id(request, '')
|
||||||
|
motifs = get_motifs(request)
|
||||||
|
|
||||||
if 'form.close' in request.params:
|
if 'form.close' in request.params:
|
||||||
status = request.params["status"]
|
status = request.params["status"]
|
||||||
@@ -159,6 +160,7 @@ def dossier_view(request):
|
|||||||
'bg_color': bg_color,
|
'bg_color': bg_color,
|
||||||
'access': access,
|
'access': access,
|
||||||
'status': status,
|
'status': status,
|
||||||
|
'motifs': motifs,
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='dossier_selected', permission='view')
|
@view_config(route_name='dossier_selected', permission='view')
|
||||||
@@ -1442,8 +1444,8 @@ def resize_photos(image_file):
|
|||||||
# set the resizing factor so the aspect ratio can be retained
|
# set the resizing factor so the aspect ratio can be retained
|
||||||
# factor > 1.0 increases size
|
# factor > 1.0 increases size
|
||||||
# factor < 1.0 decreases size
|
# factor < 1.0 decreases size
|
||||||
factor = 0.50
|
width = 1366
|
||||||
width = int(width_org * factor)
|
factor = (width/float(width_org))
|
||||||
height = int(height_org * factor)
|
height = int(height_org * factor)
|
||||||
# best down-sizing filter
|
# best down-sizing filter
|
||||||
img_anti = img_org.resize((width, height), Image.ANTIALIAS)
|
img_anti = img_org.resize((width, height), Image.ANTIALIAS)
|
||||||
|
|||||||
@@ -218,6 +218,32 @@ def ca_groupes(request):
|
|||||||
d3 = (item.groupe, float(item.Annee3), tooltip_y3)
|
d3 = (item.groupe, float(item.Annee3), tooltip_y3)
|
||||||
chart_ca_3y_3.append(d3)
|
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 {
|
return {
|
||||||
'page_title': "CA par groupe",
|
'page_title': "CA par groupe",
|
||||||
'url': url,
|
'url': url,
|
||||||
@@ -225,6 +251,9 @@ def ca_groupes(request):
|
|||||||
'chart_ca_3y_1': json.dumps(chart_ca_3y_1),
|
'chart_ca_3y_1': json.dumps(chart_ca_3y_1),
|
||||||
'chart_ca_3y_2': json.dumps(chart_ca_3y_2),
|
'chart_ca_3y_2': json.dumps(chart_ca_3y_2),
|
||||||
'chart_ca_3y_3': json.dumps(chart_ca_3y_3),
|
'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,
|
'title': title,
|
||||||
'title1': title1,
|
'title1': title1,
|
||||||
'title2': title2,
|
'title2': title2,
|
||||||
@@ -378,3 +407,60 @@ def delais_pourcentage(request):
|
|||||||
'groupe': groupe,
|
'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,
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user