ajout TER & rendement et changement catégorien en allocation

This commit is contained in:
CAO Thien-An
2017-07-26 14:45:09 +02:00
parent ae819f49fa
commit dbeac03c37
11 changed files with 122 additions and 131 deletions

View File

@@ -17,7 +17,7 @@ from .default import (
def get_actifs(request, no_id):
if no_id == '0':
query = "SELECT actifs.*, classes.* FROM actifs INNER JOIN classes ON actifs.categorie = classes.classe ORDER BY ordre, libelle"
query = "SELECT actifs.*, classes.* FROM actifs INNER JOIN classes ON actifs.classe = classes.classe ORDER BY ordre, libelle"
results = request.dbsession.execute(query).fetchall()
else:
# lire le actif par son identifiant
@@ -60,26 +60,26 @@ def delete_actif(request, no_id):
query = "DELETE FROM actifs WHERE no_id = :no_id ;"
execute_query(request, query, {'no_id': no_id})
def get_categories(request, no_cat):
def get_allocation(request, no_cat):
if no_cat == '0':
query = """
SELECT categories.*, classes.* FROM categories INNER JOIN classes ON categories.categorie = classes.classe
SELECT allocation.*, classes.* FROM allocation INNER JOIN classes ON allocation.classe = classes.classe
ORDER BY ordre"""
results = request.dbsession.execute(query).fetchall()
else:
# lire le actif par son identifiant
query = """SELECT * FROM categories WHERE no_cat=:no_cat;"""
query = """SELECT * FROM allocation WHERE no_cat=:no_cat;"""
results = request.dbsession.execute(query, {'no_cat': no_cat}).first()
return results
def get_categories_bytype(request, type):
def get_allocation_bytype(request, type):
# lire le actif par son identifiant
query = """SELECT categories.*, classes.* FROM categories INNER JOIN classes ON categories.categorie = classes.classe
query = """SELECT allocation.*, classes.* FROM allocation INNER JOIN classes ON allocation.classe = classes.classe
WHERE type=:type ORDER by ordre;"""
results = request.dbsession.execute(query, {'type': type}).fetchall()
return results
def update_categorie(request, no_cat, new_values):
def update_allocation(request, no_cat, new_values):
# formater les champs
s = ''
for param in new_values.keys():
@@ -89,14 +89,14 @@ def update_categorie(request, no_cat, new_values):
s = "%s=:%s" % (param, param)
if no_cat == '0':
query = "INSERT INTO categories SET %s" % s
query = "INSERT INTO allocation SET %s" % s
else:
new_values['no_cat'] = no_cat
query = "UPDATE categories SET %s WHERE no_cat = :no_cat;" % s
query = "UPDATE allocation SET %s WHERE no_cat = :no_cat;" % s
execute_query(request, query, new_values)
def delete_categorie(request, no_cat):
query = "DELETE FROM categories WHERE no_cat = :no_cat ;"
def delete_allocation(request, no_cat):
query = "DELETE FROM allocation WHERE no_cat = :no_cat ;"
execute_query(request, query, {'no_cat': no_cat})
def get_classes(request, classe):

View File

@@ -11,11 +11,11 @@
data-fv-icon-validating="glyphicon glyphicon-refresh">
<div class="form-group">
<label class="control-label col-xs-2" for="categorie">Catégorie</label>
<label class="control-label col-xs-2" for="classe">Classe</label>
<div class="col-xs-3">
<select class="form-control" id="categorie" name="categorie">
<div tal:repeat="item categories_list">
<option value="${item.categorie}" tal:attributes="selected actif.categorie==item.categorie and 'selected' or None">${item.categorie}</option>
<select class="form-control" id="classe" name="classe">
<div tal:repeat="item allocation_list">
<option value="${item.classe}" tal:attributes="selected actif.classe==item.classe and 'selected' or None">${item.classe}</option>
</div>
</select>
</div>
@@ -66,6 +66,39 @@
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="pru">PRU</label>
<div class="col-xs-2">
<div class="input-group">
<div class="input-group-addon">€</div>
<input class="form-control" type="text" id="pru" name="pru" value="${actif.pru}"
data-fv-numeric="true"
data-fv-numeric-message="Le nombre doit être composé de chiffres et/ou de ." />
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="ter">TER</label>
<div class="col-xs-2">
<div class="input-group">
<div class="input-group-addon">%</div>
<input class="form-control" type="text" id="ter" name="ter" value="${actif.ter}"
data-fv-numeric="true"
data-fv-numeric-message="Le nombre doit être composé de chiffres et/ou de ." />
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="rdt">Rendement</label>
<div class="col-xs-2">
<div class="input-group">
<div class="input-group-addon">%</div>
<input class="form-control" type="text" id="rdt" name="rdt" value="${actif.rdt}"
data-fv-numeric="true"
data-fv-numeric-message="Le nombre doit être composé de chiffres et/ou de ." />
</div>
</div>
</div>
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">

View File

@@ -11,11 +11,11 @@
data-fv-icon-validating="glyphicon glyphicon-refresh">
<div class="form-group">
<label class="control-label col-xs-2" for="categorie">Catégorie</label>
<label class="control-label col-xs-2" for="classe">Classe</label>
<div class="col-xs-3">
<select class="form-control" id="categorie" name="categorie">
<div tal:repeat="item categories_list">
<option value="${item.categorie}" tal:attributes="selected actif.categorie==item.categorie and 'selected' or None">${item.categorie}</option>
<select class="form-control" id="classe" name="classe">
<div tal:repeat="item allocation_list">
<option value="${item.classe}" tal:attributes="selected actif.classe==item.classe and 'selected' or None">${item.classe}</option>
</div>
</select>
</div>
@@ -51,6 +51,28 @@
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="ter">TER</label>
<div class="col-xs-2">
<div class="input-group">
<div class="input-group-addon">%</div>
<input class="form-control" type="text" id="ter" name="ter" value="${actif.ter}"
data-fv-numeric="true"
data-fv-numeric-message="Le nombre doit être composé de chiffres et/ou de ." />
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="rdt">Rendement</label>
<div class="col-xs-2">
<div class="input-group">
<div class="input-group-addon">%</div>
<input class="form-control" type="text" id="rdt" name="rdt" value="${actif.rdt}"
data-fv-numeric="true"
data-fv-numeric-message="Le nombre doit être composé de chiffres et/ou de ." />
</div>
</div>
</div>
<br />
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">

View File

@@ -17,7 +17,7 @@
<table id="actifs_list" class="table table-condensed table-bordered">
<thead>
<tr>
<th>Catégorie</th>
<th>Classe</th>
<th>Symbole</th>
<th>Libellé</th>
<th class="text-right">Nombre</th>
@@ -31,7 +31,7 @@
</thead>
<tbody>
<tr tal:repeat="ligne items">
<td class="${ligne.bg_color}">${ligne.categorie}</td>
<td class="${ligne.bg_color}">${ligne.classe}</td>
<td>${ligne.symbole}</td>
<td tal:condition="ligne.type=='ACTION'"><a href="actif_edit/${ligne.no_id}">${ligne.libelle}</a></td>
<td tal:condition="ligne.type<>'ACTION'"><a href="actif2_edit/${ligne.no_id}">${ligne.libelle}</a></td>

View File

@@ -4,7 +4,7 @@
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
<br />
<div class="row">
<form id="categorie_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="categorie"
<form id="categorie_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="allocation"
data-fv-framework="bootstrap"
data-fv-icon-valid="glyphicon glyphicon-ok"
data-fv-icon-invalid="glyphicon glyphicon-remove"
@@ -13,9 +13,9 @@
<div class="form-group">
<label class="col-xs-2 control-label">Classe</label>
<div class="col-xs-2">
<select class="form-control" id="categorie" name="categorie">
<select class="form-control" id="allocation" name="allocation">
<div tal:repeat="item classes_list">
<option value="${item.classe}" tal:attributes="selected categorie.categorie==item.classe and 'selected' or None">${item.classe}</option>
<option value="${item.classe}" tal:attributes="selected allocation.classe==item.classe and 'selected' or None">${item.classe}</option>
</div>
</select>
</div>
@@ -23,7 +23,7 @@
<div class="form-group">
<label class="control-label col-xs-2" for="pc_cible">Pourcentage cible</label>
<div class="col-xs-2">
<input class="form-control" type="text" id="pc_cible" name="pc_cible" value="${categorie.pc_cible}"
<input class="form-control" type="text" id="pc_cible" name="pc_cible" value="${allocation.pc_cible}"
data-fv-digits="true"
data-fv-digits-message="Le nombre doit être composé que de chiffres" />
</div>
@@ -33,12 +33,12 @@
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">
<a class="btn btn-default" href="${request.application_url}/categories_list">
<a class="btn btn-default" href="${request.application_url}/allocation_list">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="categorie.no_cat <> 0">
tal:condition="allocation.no_cat <> 0">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div>
</div>

View File

@@ -7,9 +7,9 @@
<div class="col-md-6">
<p>
<a href="allocation_edit/0" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouvelle catégorie</a>
<span class="glyphicon glyphicon-plus"></span> Nouvelle classe</a>
</p>
<table id="categories_list" class="table table-condensed table-bordered">
<table id="allocation_list" class="table table-condensed table-bordered">
<thead>
<tr>
<th>Classe</th>
@@ -19,7 +19,7 @@
</thead>
<tbody>
<tr tal:repeat="item items">
<td class="${item.bg_color}"><a href="allocation_edit/${item.no_cat}">${item.categorie}</a></td>
<td class="${item.bg_color}"><a href="allocation_edit/${item.no_cat}">${item.classe}</a></td>
<td class="text-right">${item.pc_cible} %</td>
<td class="text-center">${item.type}</td>
</tr>

View File

@@ -1,74 +0,0 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
<br />
<div class="row">
<form id="categorie_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="categorie"
data-fv-framework="bootstrap"
data-fv-icon-valid="glyphicon glyphicon-ok"
data-fv-icon-invalid="glyphicon glyphicon-remove"
data-fv-icon-validating="glyphicon glyphicon-refresh">
<div class="form-group">
<label class="col-xs-2 control-label">Libellé</label>
<div class="col-xs-3">
<input class="form-control" type="text" name="categorie"
value="${categorie.categorie}" placeholder="15 caractères maximum"
data-fv-notempty="true"
data-fv-notempty-message="Le symbole est obligatoire"
data-fv-stringlength="true"
data-fv-stringlength-max="15"
data-fv-stringlength-message="15 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Type</label>
<div class="col-xs-2">
<select class="form-control" id="type" name="type">
<div tal:repeat="item types_list">
<option value="${item}" tal:attributes="selected categorie.type==item and 'selected' or None">${item}</option>
</div>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="pc_cible">Pourcentage cible</label>
<div class="col-xs-2">
<input class="form-control" type="text" id="pc_cible" name="pc_cible" value="${categorie.pc_cible}"
data-fv-digits="true"
data-fv-digits-message="Le nombre doit être composé que de chiffres" />
</div>
</div>
<br />
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">
<a class="btn btn-default" href="${request.application_url}/categories_list">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
<button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="categorie.no_cat <> 0">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div>
</div>
</div>
</form>
<br />
<br />
</div> <!-- row -->
<script>
$(document).ready(function() {
$('#categorie_edit-form').formValidation();
$('form input').on('keypress', function(e) {
return e.which !== 13;
});
});
</script>
</div>
</metal:block>

View File

@@ -9,7 +9,7 @@
<table id="categories_list" class="table table-condensed table-bordered">
<thead>
<tr>
<th>Catégorie</th>
<th>Classe</th>
<th class="text-right">% cible</th>
<th class="text-right">% actuel</th>
<th class="text-right">Ecart</th>
@@ -18,7 +18,7 @@
</thead>
<tbody>
<tr tal:repeat="item items">
<td class="${item.bg_color}">${item.categorie}</td>
<td class="${item.bg_color}">${item.classe}</td>
<td class="text-right">${item.pc_cible} %</td>
<td class="text-right">${layout.to_percent(item.pc_atteint)}</td>
<td tal:condition="(item.pc_atteint - item.pc_cible)>=0" class="text-right" style="color: green;">${layout.to_percent(item.pc_atteint - item.pc_cible)}</td>
@@ -38,17 +38,19 @@
<table id="actifs_list" class="table table-condensed table-bordered">
<thead>
<tr>
<th>Catégorie</th>
<th>Classe</th>
<th>Libellé</th>
<th class="text-right">Valeur</th>
<th class="text-right">+/- Valeur</th>
<th class="text-right">% de +/-</th>
<th class="text-right">% PF</th>
<th class="text-right">TER</th>
<th class="text-right">Rendement</th>
</tr>
</thead>
<tbody>
<tr tal:repeat="ligne actifs">
<td class="${ligne.bg_color}">${ligne.categorie}</td>
<td class="${ligne.bg_color}">${ligne.classe}</td>
<td>${ligne.libelle}</td>
<td class="text-right">${layout.to_euro(ligne.valeur)}</td>
<td tal:condition="ligne.plus_value>=0" class="text-right" style="color: green;">${layout.to_euro(ligne.plus_value)}</td>
@@ -56,6 +58,8 @@
<td tal:condition="ligne.pc_plusvalue>=0" class="text-right" style="color: green;">${layout.to_percent(ligne.pc_plusvalue)}</td>
<td tal:condition="ligne.pc_plusvalue <0" class="text-right" style="color: red;">${layout.to_percent(ligne.pc_plusvalue)}</td>
<td class="text-right">${ligne.pc_allocation} %</td>
<td class="text-right">${layout.to_percent(ligne.ter)}</td>
<td class="text-right">${layout.to_percent(ligne.rdt)}</td>
</tr>
<tr>
<td colspan="2"></td>
@@ -63,6 +67,7 @@
<td class="text-right">${layout.to_euro(total_pv)}</td>
<td class="text-right">${layout.to_percent(total_pc_value)}</td>
<td class="text-right">100 %</td>
<td colspan="2"></td>
</tr>
</tbody>
</table>

View File

@@ -57,6 +57,7 @@
<li><a href="${request.application_url}/actifs_list">ACTIFS</a></li>
<li><a href="${request.application_url}/allocation_list">ALLOCATION</a></li>
<li><a href="${request.application_url}/doc_list">DOCS</a></li>
<li><a href="${request.application_url}/histo_list">HISTORIQUE</a></li>
${panel('dropdown_menu_panel')}
</ul>
</div>

View File

@@ -85,16 +85,18 @@ def actif_edit(request):
no_id = request.matchdict['no_id']
url = request.route_url('actif_edit', no_id=no_id)
message = ''
categories_list = get_categories_bytype(request,'ACTION')
allocation_list = get_allocation_bytype(request,'ACTION')
if no_id == '0':
# nouveau
actif = {}
actif['no_id'] = '0'
actif['symbole'] = ''
actif['categorie'] = 'Actions Europe'
actif['classe'] = 'Europe Large'
actif['nombre'] = '0'
actif['pru'] = '0'
actif['ter'] = '0'
actif['rdt'] = '0'
page_title= 'Nouvel actif ACTION'
else:
# lire la fiche du actif
@@ -139,7 +141,7 @@ def actif_edit(request):
'page_title': page_title,
'url': url,
'actif': actif,
'categories_list': categories_list,
'allocation_list': allocation_list,
'message': message,
}
@@ -148,17 +150,19 @@ def actif2_edit(request):
no_id = request.matchdict['no_id']
url = request.route_url('actif2_edit', no_id=no_id)
message = ''
categories_list = get_categories_bytype(request,'AUTRE')
allocation_list = get_allocation_bytype(request,'AUTRE')
if no_id == '0':
# nouveau
actif = {}
actif['no_id'] = '0'
actif['symbole'] = ''
actif['categorie'] = 'Obligations'
actif['classe'] = 'Obligations'
actif['libelle'] = ''
actif['pru'] = '0'
actif['cours'] = '0'
actif['ter'] = '0'
actif['rdt'] = '0'
page_title= 'Nouvel actif'
else:
# lire la fiche du actif
@@ -190,7 +194,7 @@ def actif2_edit(request):
'page_title': page_title,
'url': url,
'actif': actif,
'categories_list': categories_list,
'allocation_list': allocation_list,
'message': message,
}
@@ -198,8 +202,8 @@ def actif2_edit(request):
def allocation_list(request):
message = ''
# lire les categories
items = get_categories(request, '0')
# lire les allocation
items = get_allocation(request, '0')
# calculer % total
total = 0
for item in items:
@@ -224,19 +228,19 @@ def allocation_edit(request):
if no_cat == '0':
# nouveau
categorie = {}
categorie['no_cat'] = '0'
categorie['categorie'] = ''
categorie['type'] = 'ACTION'
categorie['pc_cible'] = '0'
page_title= u'Nouvelle catégorie'
allocation = {}
allocation['no_cat'] = '0'
allocation['classe'] = ''
allocation['type'] = 'ACTION'
allocation['pc_cible'] = '0'
page_title= u'Nouvelle classe'
else:
# lire la fiche de la categorie
categorie = get_categories(request, no_cat)
if not categorie:
request.session.flash(u"Catégorie non trouvé : %s" % no_cat, 'warning')
allocation = get_allocation(request, no_cat)
if not allocation:
request.session.flash(u"Classe non trouvé : %s" % no_cat, 'warning')
return HTTPFound(location=request.route_url('allocation_list'))
page_title= u"Catégorie : %s" % (categorie.categorie)
page_title= u"Classe : %s" % (allocation.classe)
if 'form.submitted' in request.params:
new_values = {}
@@ -245,20 +249,20 @@ def allocation_edit(request):
new_values[param] = request.params[param]
if new_values:
update_categorie(request, no_cat, new_values)
update_allocation(request, no_cat, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('allocation_list'))
if 'form.deleted' in request.params:
delete_categorie(request, no_cat)
delete_allocation(request, no_cat)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('allocation_list'))
return {
'page_title': page_title,
'url': url,
'categorie': categorie,
'allocation': allocation,
'classes_list': classes_list,
'message': message,
}

View File

@@ -28,7 +28,7 @@ from ..security import groupfinder
from ..models.default import *
from ..models.actifs import (
get_actifs,
get_categories,
get_allocation,
)
from ..models.members import (
get_member_by_email,
@@ -72,7 +72,7 @@ def home(request):
message = ''
# lire les categories
items = get_categories(request, '0')
items = get_allocation(request, '0')
# lire les actifs
actifs = get_actifs(request, '0')