107 lines
4.5 KiB
Python
107 lines
4.5 KiB
Python
import sqlalchemy as sa
|
|
from sqlalchemy import func
|
|
from ..models.portfolio import Actifs, Allocation, Histo
|
|
|
|
class PFService(object):
|
|
|
|
@classmethod
|
|
def get_actifs(cls, request, no_id):
|
|
if no_id == '0':
|
|
items = request.dbsession.query(Actifs, Allocation).join(Allocation).order_by(Allocation.ordre, Actifs.libelle).all()
|
|
else:
|
|
# lire une allocation par le no_id
|
|
items = request.dbsession.query(Actifs).filter(Actifs.no_id == no_id).first()
|
|
return items
|
|
|
|
@classmethod
|
|
def get_allocation(cls, request, no_cat):
|
|
if no_cat == '0':
|
|
query = request.dbsession.query(Allocation)
|
|
query = query.order_by(sa.asc(Allocation.ordre)).all()
|
|
else:
|
|
# lire une allocation par le no_id
|
|
query = request.dbsession.query(Allocation).filter(Allocation.no_cat == no_cat).first()
|
|
return query
|
|
|
|
@classmethod
|
|
def get_allocation_byType(cls, request, type):
|
|
# lire une allocation par le no_id
|
|
query = request.dbsession.query(Allocation).filter(Allocation.type == type).all()
|
|
return query
|
|
|
|
@classmethod
|
|
def get_histo(cls, request, no_id):
|
|
if no_id == '0':
|
|
items = request.dbsession.query(Histo).order_by(sa.asc(Histo.date)).all()
|
|
elif no_id == '-1':
|
|
items = request.dbsession.query(Histo).order_by(sa.desc(Histo.date)).all()
|
|
else:
|
|
# lire le histo par le no_id
|
|
items = request.dbsession.query(Histo).filter(Histo.no_id == no_id).first()
|
|
return items
|
|
|
|
@classmethod
|
|
def get_last_histo(cls, request):
|
|
# lire le dernier histo créé
|
|
items = request.dbsession.query(Histo).order_by(sa.desc(Histo.date)).first()
|
|
return items
|
|
|
|
@classmethod
|
|
def delete_allocation(cls, request, no_id):
|
|
request.dbsession.query(Allocation).filter(Allocation.no_ == no_id).delete(synchronize_session=False)
|
|
return
|
|
|
|
@classmethod
|
|
def delete_histo(cls, request, no_id):
|
|
request.dbsession.query(Histo).filter(Histo.no_id == no_id).delete(synchronize_session=False)
|
|
return
|
|
|
|
@classmethod
|
|
def update_actif_devise(cls, request, devise, taux):
|
|
request.dbsession.query(Actifs).filter(Actifs.devise == devise).update({'parite': taux})
|
|
return
|
|
|
|
def update_actif_valeur(request, symbole, cours, valeur, plus_value, pc_plusvalue):
|
|
request.dbsession.query(Actifs).filter(Actifs.symbole == symbole
|
|
).update({'cours': cours,
|
|
'valeur': valeur,
|
|
'plus_value':plus_value,
|
|
'pc_plusvalue': pc_plusvalue,
|
|
})
|
|
return
|
|
|
|
def update_portefeuille(request, today):
|
|
# cumuler la valeur totale des actifs
|
|
result = request.dbsession.query(Actifs, func.sum(Actifs.valeur).label("TotalValue")).first()
|
|
TotalValue = result.TotalValue
|
|
# maj du pourcentage d'allocation des lignes du portefeuille
|
|
items = PFService.get_actifs(request, '0')
|
|
for item in items:
|
|
pc_allocation = round(item.Actifs.valeur / TotalValue * 100, 3)
|
|
request.dbsession.query(Actifs).filter(Actifs.no_id == item.Actifs.no_id).update({'pc_allocation': pc_allocation,
|
|
'modif_le': today})
|
|
|
|
# maj des allocations
|
|
items = PFService.get_allocation(request, '0')
|
|
for item in items:
|
|
# cumuler la valeur totale des actifs de cette classe
|
|
result = request.dbsession.query(Actifs, func.sum(Actifs.valeur).label("TotalClasse")
|
|
).filter(Actifs.classe == item.classe).first()
|
|
TotalClasse = result.TotalClasse
|
|
pc_atteint = round(TotalClasse / TotalValue * 100, 3)
|
|
# maj du pourcentage d'allocation de cette classe
|
|
request.dbsession.query(Allocation).filter(Allocation.classe == item.classe
|
|
).update({'valeur': TotalClasse,
|
|
'pc_atteint': pc_atteint})
|
|
|
|
return
|
|
|
|
def delete_actif(cls, request, no_id):
|
|
request.dbsession.query(Actifs).filter(Actifs.no_id == no_id).delete(synchronize_session=False)
|
|
return
|
|
|
|
|
|
|
|
|
|
|