Files
ctp_blogr/cao_blogr/services/portfolio.py
2023-02-08 17:41:07 +01:00

106 lines
4.1 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, dividends):
request.dbsession.query(Actifs).filter(Actifs.symbole == symbole).update({'cours': cours, 'rendement': dividends})
return
def update_portefeuille(request):
# 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
request.dbsession.query(Actifs).update({'pc_allocation': Actifs.valeur / TotalValue * 100})
# 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
# maj du pourcentage d'allocation de cette classe
request.dbsession.query(Allocation).filter(Allocation.classe == item.classe
).update({'valeur': TotalClasse, 'pc_atteint': TotalClasse / TotalValue * 100})
return
def delete_actif(cls, request, no_id):
request.dbsession.query(Actifs).filter(Actifs.no_id == no_id).delete(synchronize_session=False)
return
def get_dividends(ticker):
d = 0
# le ticker a des dividendes ?
if len(ticker.dividends) > 0:
# oui, cumuler les dividendes sur un an
h = ticker.history(period="1y")
nb = len(ticker.dividends)
for i in range(nb):
d += ticker.dividends[nb - 1 - i]
return d