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