Spaces:
Sleeping
Sleeping
File size: 5,237 Bytes
35c6a2c c84b9d8 35c6a2c c84b9d8 35c6a2c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
import sys
from models.MovimientosM import Movimiento
from fastapi import HTTPException
from schemas.MovimientosSh import *
from sqlalchemy.orm import Session
from datetime import date,datetime,timedelta
from sqlalchemy import func,between
from core.utils import get_current_date
def create_new_movimiento(movi:MovimientosCreate,id_usuario:str,db:Session):
db_movimiento = Movimiento(
id_usuario = id_usuario,
cuenta = movi.cuenta,
tipo_movimiento = movi.tipo_movimiento,
fecha = movi.fecha,
descripcion = movi.descripcion,
)
try:
db.add(db_movimiento)
db.commit()
db.refresh(db_movimiento)
db.close()
return db_movimiento
except Exception as e :
db.rollback()
# Imprimir el error en la consola
print(f"Error al crear un usuario: {str(e)}",file=sys.stderr)
raise HTTPException(status_code=500,detail=f"Error al crear un movimiento: {str(e)} ")
def get_weekly_expenses(db: Session, user_id: str,tipo:str):
today = datetime.today()
if tipo == "SEMANA":
start_week = today - timedelta(days=today.weekday())
end_week = start_week + timedelta(days=6)
if tipo == "MES":
start_week = today.replace(day=1)
next_month = start_week.replace(month=start_week.month + 1, day=1)
end_week = next_month - timedelta(days=1)
if tipo == "HOY":
start_week = today.replace(hour=0, minute=0, second=0, microsecond=0)
# Obtener el último momento del día (23:59:59)
end_week = today.replace(hour=23, minute=59, second=59, microsecond=999999)
expenses = db.query(Movimiento.descripcion, Movimiento.cuenta,Movimiento.id_movimientos).\
filter(Movimiento.id_usuario == user_id,
Movimiento.tipo_movimiento == 'GASTO',
Movimiento.estado_gasto == True,
between(Movimiento.fecha, start_week.date(), end_week.date())).\
all()
total_expenses = sum(exp[1] for exp in expenses)
details = [{"descripcion": exp[0], "cuenta": float(exp[1]),"id_movimientos":int(exp[2])} for exp in expenses]
return total_expenses,details
def get_consulted_expenses(db: Session, user_id: str,start_week : date,end_week:date):
expenses = db.query(Movimiento.descripcion, Movimiento.cuenta).\
filter(Movimiento.id_usuario == user_id,
Movimiento.tipo_movimiento == 'GASTO',
Movimiento.estado_gasto == True,
between(Movimiento.fecha, start_week, end_week)).\
all()
total_expenses = sum(exp[1] for exp in expenses) # Sumando las cuentas (índice 1)
# Convertir los detalles de gastos a una lista de diccionarios
details = [{"descripcion": exp[0], "cuenta": float(exp[1])} for exp in expenses]
return total_expenses,details
def buscar_movimientos(id:int,db:Session):
movimiento_db = db.query(Movimiento).filter(Movimiento.id_movimientos == id).first()
return movimiento_db
def money_account(db:Session,id_usuario:str,fecha_inicio:date = None,fecha_fin:date = None):
if fecha_inicio is None or fecha_fin is None:
fecha_inicio = get_current_date()
fecha_fin = get_current_date()
ingresos = db.query(func.sum(Movimiento.cuenta)).filter(
Movimiento.tipo_movimiento == 'INGRESO',
between(Movimiento.fecha,fecha_inicio,fecha_fin),
Movimiento.id_usuario == id_usuario,
Movimiento.estado_gasto == 1
).scalar() or 0
gastos = db.query(func.sum(Movimiento.cuenta)).filter(
Movimiento.tipo_movimiento == 'GASTO',
between(Movimiento.fecha,fecha_inicio,fecha_fin),
Movimiento.id_usuario == id_usuario,
Movimiento.estado_gasto == 1
).scalar() or 0
resultado = ingresos - gastos;
return resultado
def update_movimiento_crud(movi:MovimientosUpdate,db:Session):
movimiento_db = buscar_movimientos(movi.id_movimientos,db)
if movimiento_db:
try:
movimiento_db.cuenta = movi.cuenta
movimiento_db.tipo_movimiento = movi.tipo_movimiento
movimiento_db.descripcion = movi.descripcion
db.add(movimiento_db)
db.commit()
db.refresh(movimiento_db)
return movimiento_db
except Exception as e :
db.rollback()
print(f"Error al actualizar movimiento: {str(e)}",file=sys.stderr)
raise HTTPException(status_code=500,detail=f"Error al actualizar un movimiento: {str(e)} ")
return None
def update_movimientos_status_crud(movi:MovimientosUpdateStatus, db:Session):
movimientos_db = buscar_movimientos(movi.id_movimientos, db)
if movimientos_db:
try:
movimientos_db.estado_gasto = movi.estado_gasto
db.add(movimientos_db)
db.commit()
return True
except Exception as e :
db.rollback()
print(f"Error al update un movimiento {str(e)}",file=sys.stderr)
raise HTTPException(status_code=500,detail=f"Error al update movimiento: {str(e)} ")
return False |