Fhernd icon

Untitled

Fhernd | PRO | 08/14/24 11:21:42 PM UTC | 0 ⭐ | 1065 👁️ | Never ⏰ | [python]
Python |

50.96 KB

|

Software

|

0 👍

/

0 👎

from flask import current_app, flash, jsonify, redirect, render_template, request, url_for
from flask_login import current_user, login_user, logout_user, login_required
from flask_principal import Permission, RoleNeed, UserNeed, identity_loaded, identity_changed, Identity, AnonymousIdentity
from werkzeug.security import generate_password_hash
 
from app import app, db
 
from app.forms import CambiarClaveForm, ParqueaderoInformacionForm, UsuarioForm
from app.models import Arrendamiento, Cliente, MedioPago, Modulo, Pais, Parqueadero, Parqueo, Periodicidad, Rol, Sede, SedeUsuario, Tarifa, TarifaTipo, Usuario, Vehiculo, VehiculoTipo, usuario_rol
from app.util.roles_enum import Roles
from app.util.utilitarios import to_json
 
 
propietario_role = RoleNeed(Roles.PROPIETARIO.value)
admin_role = RoleNeed(Roles.ADMINISTRADOR.value)
operario_role = RoleNeed(Roles.OPERARIO.value)
 
admin_permission = Permission(admin_role)
propietario_permission = Permission(propietario_role)
operario_permission = Permission(operario_role)
propietario_admin_permission = propietario_permission.union(admin_permission)
todos_permiso = propietario_permission.union(admin_permission).union(operario_permission)
 
 
def tiene_rol(roles_disponibles, roles_asignados):
    """
    Verifica si un usuario tiene un rol específico.
 
    :param roles_disponibles: Roles disponibles.
    :param roles_asignados: Roles asignados.
    :return: Booleano.
    """
    roles_disponibles = [rol.nombre for rol in roles_disponibles]
    return set(roles_asignados).intersection(roles_disponibles)
 
 
@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):
    identity.user = current_user
 
    if hasattr(current_user, 'id'):
        identity.provides.add(UserNeed(current_user.id))
 
    if hasattr(current_user, 'roles'):
        for role in current_user.roles:
            identity.provides.add(RoleNeed(role.nombre))
 
 
@app.route("/")
def index():
    """
    Muestra la página de inicio de la aplicación.
 
    :return: Plantilla HTML.
    """
    return render_template("login.html", titulo='Inicio', nombre='Alex')
 
 
@app.route('/dashboard', methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def dashboard():
    """
    Muestra el dashboard de la aplicación.
 
    :return: Plantilla HTML.
    """
    return render_template('dashboard.html', titulo='Dashboard')
 
 
@app.route("/vehiculo-tipo", methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def vehiculo_tipo():
    tipos_vehiculo = VehiculoTipo.query.all()
    return render_template("vehiculo-tipo.html", titulo='Tipo de Vehículo', tipos_vehiculo=tipos_vehiculo)
 
 
@app.route('/vehiculo-tipo/<int:id>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def vehiculo_tipo_delete(id):
    try:
        vehiculo_tipo = VehiculoTipo.query.get(id)
 
        if vehiculo_tipo is None:
            return jsonify({'status': 'failure', 'message': 'Tipo de vehículo encontrado'}), 404
 
        db.session.delete(vehiculo_tipo)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Tipo de vehículo eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/vehiculo-tipo', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def vehiculo_tipo_crear():
    try:
        data = request.get_json()
        vehiculo_tipo = VehiculoTipo(nombre=data.get('nombre'))
 
        db.session.add(vehiculo_tipo)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Tipo de vehículo creado', 'data': {
            'id': vehiculo_tipo.id,
            'nombre': vehiculo_tipo.nombre
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/vehiculo-tipo/<int:id>', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def vehiculo_tipo_update(id):
    """
    Actualiza un tipo de vehículo.
 
    :param id: Identificador del tipo de vehículo.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        vehiculo_tipo = VehiculoTipo.query.get(id)
 
        if vehiculo_tipo is None:
            return jsonify({'status': 'failure', 'message': 'Tipo de vehículo encontrado'}), 404
 
        vehiculo_tipo.nombre = data.get('nombre')
        vehiculo_tipo.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Tipo de vehículo actualizado', 'data': {
            'id': vehiculo_tipo.id,
            'nombre': vehiculo_tipo.nombre
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route("/tarifa-tipo", methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def tarifa_tipo():
    """
    Muestra la lista de tipos de tarifa.
    """
    entidades = TarifaTipo.query.all()
    return render_template("tarifa-tipo.html", titulo='Tipo de Tarifa', entidades=entidades)
 
 
@app.route("/tarifas", methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def get_tarifa_tipos():
    """
    Recupera los tipos de tarifa.
 
    :return: Respuesta JSON.
    """
    entidades = Tarifa.query.all()
    
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': entidad.id,
        'costo': entidad.costo,
        'nombre': entidad.nombre,
    } for entidad in entidades]}), 200
 
 
@app.route('/tarifa-tipo', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def tarifa_tipo_create():
    """
    Crea un nuevo tipo de tarifa.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = TarifaTipo(nombre=data.get('nombre'), unidad=data.get('unidad'))
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Tipo de tarifa creado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'unidad': entidad.unidad
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/tarifa-tipo/<int:id>', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def tarifa_tipo_update(id):
    """
    Actualiza un tipo de tarifa.
 
    :param id: Identificador del tipo de tarifa.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = TarifaTipo.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Tipo de tarifa encontrado'}), 404
 
        entidad.nombre = data.get('nombre')
        entidad.unidad = data.get('unidad')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Tipo de tarifa actualizado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'unidad': entidad.unidad
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/tarifa-tipo/<int:id>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def tarifa_tipo_delete(id):
    """
    Elimina un tipo de tarifa.
 
    :param id: Identificador del tipo de tarifa.
    :return: Respuesta JSON.
    """
    try:
        entidad = TarifaTipo.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Tipo de tarifa encontrado'}), 404
 
        db.session.delete(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Tipo de tarifa eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route("/medio-pago", methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def medio_pago():
    """
    Muestra la lista de tipos de tarifa.
    """
    entidades = MedioPago.query.all()
    return render_template('medio-pago.html', titulo='Medios de Pago', entidades=entidades)
 
 
@app.route("/medios-pago", methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def get_medios_pago():
    """
    Recupera los medios de pago.
 
    :return: Respuesta JSON.
    """
    entidades = MedioPago.query.all()
    
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': entidad.id,
        'nombre': entidad.nombre,
    } for entidad in entidades]}), 200
 
 
@app.route('/medio-pago', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def medio_pago_create():
    """
    Crea un nuevo medio de pago.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = MedioPago(nombre=data.get('nombre'))
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Medio de pago creado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/medio-pago/<int:id>', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def medio_pago_update(id):
    """
    Actualiza un medio de pago.
 
    :param id: Identificador del medio de pago.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = MedioPago.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Medio de pago encontrado'}), 404
 
        entidad.nombre = data.get('nombre')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Medio de pago actualizado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/medio-pago/<int:id>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def medio_pago_delete(id):
    """
    Elimina un medio de pago.
 
    :param id: Identificador del medio de pago.
    :return: Respuesta JSON.
    """
    try:
        entidad = MedioPago.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Medio de pago encontrado'}), 404
 
        db.session.delete(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Medio de pago eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route("/cliente", methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def cliente():
    """
    Muestra la lista de tipos de tarifa.
    """
    entidades = Cliente.query.all()
    vehiculos_tipos = VehiculoTipo.query.all()
 
    return render_template('cliente.html', titulo='Clientes', entidades=entidades, vehiculos_tipos=vehiculos_tipos)
 
 
@app.route('/cliente', methods=['POST'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_crear():
    """
    Crea un nuevo cliente.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Cliente(documento=data.get('documento'), nombres=data.get('nombres'), apellidos=data.get('apellidos'), telefono=data.get('telefono'), email=data.get('email'), direccion=data.get('direccion'), parqueadero_id=data.get('parqueadero_id'))
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Cliente creado', 'data': {
            'id': entidad.id,
            'documento': entidad.documento,
            'nombres': entidad.nombres,
            'apellidos': entidad.apellidos,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'direccion': entidad.direccion,
            'parqueadero_id': entidad.parqueadero_id
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/cliente/<string:documento>', methods=['PUT'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_actualizar(documento):
    """
    Actualiza un cliente.
 
    :param id: Identificador del cliente.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Cliente.query.filter_by(documento=documento).first()
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Cliente encontrado'}), 404
 
        entidad.documento = data.get('documento')
        entidad.nombres = data.get('nombres')
        entidad.apellidos = data.get('apellidos')
        entidad.telefono = data.get('telefono')
        entidad.email = data.get('email')
        entidad.direccion = data.get('direccion')
        entidad.parqueadero_id = data.get('parqueadero_id')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Cliente actualizado', 'data': {
            'id': entidad.id,
            'documento': entidad.documento,
            'nombres': entidad.nombres,
            'apellidos': entidad.apellidos,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'direccion': entidad.direccion,
            'parqueadero_id': entidad.parqueadero_id
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/cliente/<string:documento>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def cliente_eliminar(documento):
    """
    Elimina un cliente.
 
    :param id: Identificador del cliente.
    :return: Respuesta JSON.
    """
    try:
        entidad = Cliente.query.filter_by(documento=documento).first()
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Cliente encontrado'}), 404
 
        db.session.delete(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Cliente eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route("/rol", methods=['GET'])
@login_required
@propietario_permission.require(http_exception=403)
def rol():
    """
    Muestra la lista de roles.
    """
    entidades = Rol.query.all()
    return render_template('rol.html', titulo='Roles', entidades=entidades)
 
 
@app.route("/usuario", methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def usuario():
    """
    Muestra la lista de usuarios.
    """
    entidades = Usuario.query.all()
 
    parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
 
    if parqueadero is not None:
        entidades = Usuario.query.filter_by(parqueadero_id=parqueadero.id).all()
 
    roles = Rol.query.all()
    sedes = Sede.query.all()
    return render_template('usuario.html', titulo='Usuarios', entidades=entidades, roles=roles, sedes=sedes)
 
 
@app.route('/usuario', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def usuario_crear():
    """
    Crea un nuevo usuario.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
 
        hashed_password = generate_password_hash(data.get('password'), method='pbkdf2:sha256')
 
        entidad = Usuario(
            documento=data.get('documento'),
            nombres=data.get('nombres'),
            apellidos=data.get('apellidos'),
            telefono=data.get('telefono'),
            email=data.get('email'),
            password=hashed_password,
            parqueadero_id=current_user.parqueadero_id
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        rol = usuario_rol.insert().values(usuario_id=entidad.id, rol_id=data.get('rolId'))
        
        db.session.execute(rol)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Usuario creado', 'data': {
            'id': entidad.id,
            'documento': entidad.documento,
            'nombres': entidad.nombres,
            'apellidos': entidad.apellidos,
            'telefono': entidad.telefono,
            'email': entidad.email
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/usuario/<string:documento>', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def usuario_actualizar(documento):
    """
    Actualiza un usuario.
 
    :param id: Identificador del usuario.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Usuario.query.filter_by(documento=documento).first()
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Usuario encontrado'}), 404
 
        entidad.documento = data.get('documento')
        entidad.nombres = data.get('nombres')
        entidad.apellidos = data.get('apellidos')
        entidad.telefono = data.get('telefono')
        entidad.email = data.get('email')
        entidad.rol_id = data.get('rolId')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Usuario actualizado', 'data': {
            'id': entidad.id,
            'documento': entidad.documento,
            'nombres': entidad.nombres,
            'apellidos': entidad.apellidos,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'rol_id': entidad.rol_id
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/usuario/<string:documento>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def usuario_eliminar(documento):
    """
    Elimina un usuario.
 
    :param id: Identificador del usuario.
    :return: Respuesta JSON.
    """
    try:
        entidad = Usuario.query.filter_by(documento=documento).first()
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Usuario encontrado'}), 404
        
        # Eliminar de la tabla de relación sede_usuario:
        sede_usuario = SedeUsuario.query.filter_by(usuario_id=entidad.id).first()
 
        if sede_usuario is not None:
            db.session.delete(sede_usuario)
            db.session.commit()
 
        db.session.delete(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Usuario eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/usuario/cambiar-password', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def usuario_cambiar_password():
    """
    Cambia la contraseña de un usuario.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Usuario.query.filter_by(documento=data.get('documento')).first()
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Usuario no encontrado'}), 404
 
        hashed_password = generate_password_hash(data.get('password'), method='pbkdf2:sha256')
 
        entidad.password = hashed_password
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Contraseña actualizada'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/usuario/<string:documento>', methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def usuario_obtener(documento):
    """
    Obtiene un usuario.
 
    :param id: Identificador del usuario.
    :return: Respuesta JSON.
    """
    entidad = Usuario.query.filter_by(documento=documento).first()
 
    if entidad is not None:
        return jsonify({'status': 'existente', 'message': 'Ya existe un usuario con el documento dado.'}), 200
 
    return jsonify({'status': 'faile', 'message': 'Usuario encontrado', 'data': {}}), 200
 
 
@app.route("/registro", methods=['GET'])
@propietario_admin_permission.require(http_exception=403)
def registro():
    """
    Muestra la ruta para el registro de un administrador para el parqueadero.
    """
    paises = Pais.query.all()
    return render_template('registro.html', titulo='Registro', paises=paises)
 
 
@app.route('/registro', methods=['POST'])
def registro_crear():
    """
    Crea un nuevo usuario administrador para el parqueadero.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
 
        hashed_password = generate_password_hash(data.get('password'), method='pbkdf2:sha256')
 
        entidad = Usuario(
            documento=data.get('documento'),
            nombres=data.get('nombres'),
            apellidos=data.get('apellidos'),
            telefono=data.get('telefono'),
            email=data.get('email'),
            rol_id=2,
            password=hashed_password,
            es_propietario=True
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Usuario creado', 'data': {
            'id': entidad.id,
            'documento': entidad.documento,
            'nombres': entidad.nombres,
            'apellidos': entidad.apellidos,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'rol_id': entidad.rol_id
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route("/parqueadero", methods=['POST'])
@login_required
@propietario_permission.require(http_exception=403)
def parqueadero():
    """
    Crea un nuevo parqueadero.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Parqueadero(
            rut=data.get('rut'),
            nombre=data.get('nombre'),
            direccion=data.get('direccion'),
            email=data.get('email'),
            ciudad=data.get('ciudad'),
            telefono=data.get('telefono'),
            usuario_id=data.get('usuarioId'),
            pais_id=data.get('paisId')
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Parqueadero creado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'direccion': entidad.direccion,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'pais_id': entidad.pais_id,
            'usuario_id': entidad.usuario_id
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route("/login", methods=['GET'])
def login():
    """
    Muestra la página de inicio de sesión.
 
    :return: Plantilla HTML.
    """
    return render_template('login.html', titulo='Iniciar Sesión')
 
 
@app.route("/login", methods=['POST'])
def login_post():
    """
    Inicia sesión en la aplicación.
 
    :return: Redirección a la página de inicio.
    """
    if current_user.is_authenticated:
        identity_changed.send(current_app._get_current_object(), identity=Identity(current_user.id))
        return jsonify({"success": True, "redirect_url": url_for('dashboard')})
    
    data = request.get_json()
    email = data.get('email')
 
    usuario = Usuario.query.filter_by(email=email).first()
 
    if usuario is None or not usuario.check_password(data.get('password')):
        return jsonify({"success": False, "message": "Credenciales inválidas"}), 401
 
    login_user(usuario)
    identity_changed.send(current_app._get_current_object(), identity=Identity(usuario.id))
 
    next = request.args.get('next')
 
    if not next:
        roles = [rol.nombre for rol in usuario.roles]
        if tiene_rol(current_user.roles, [Roles.OPERARIO.value]):
            return jsonify({"success": True, "redirect_url": url_for('parqueos')})
        else:
            return jsonify({"success": True, "redirect_url": url_for('dashboard')})
    else:
        return jsonify({"success": True, "redirect_url": next})
 
 
@app.route("/logout", methods=['GET'])
@login_required
def logout():
    """
    Cierra sesión en la aplicación.
 
    :return: Redirección a la página de inicio.
    """
    logout_user()
    identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity())
 
    return redirect(url_for('login'))
 
 
@app.route('/perfil', methods=['GET', 'POST'])
@login_required
@todos_permiso.require(http_exception=403)
def perfil():
    """
    Muestra el perfil del usuario.
 
    :return: Plantilla HTML.
    """
    form = UsuarioForm()
    cambiar_clave_form = CambiarClaveForm()
 
    if form.submit.data and form.validate_on_submit():
        current_user.documento = form.documento.data
        current_user.nombres = form.nombres.data
        current_user.apellidos = form.apellidos.data
        current_user.telefono = form.telefono.data
 
        db.session.commit()
        flash('Perfil actualizado correctamente.', 'perfil-success')
        return redirect(url_for('perfil'))
 
    if cambiar_clave_form.submit.data and cambiar_clave_form.validate_on_submit():
        clave_actual = cambiar_clave_form.clave_actual.data
 
        if not current_user.check_password(clave_actual):
            flash('La contraseña actual es incorrecta', 'cambio-clave-danger')
        else:
            current_user.set_password(cambiar_clave_form.clave_nueva.data)
            db.session.commit()
            flash('Contraseña cambiada correctamente.', 'cambio-clave-success')
            return redirect(url_for('perfil'))
 
    return render_template('perfil.html', titulo='Perfil', form=form, cambiar_clave_form=cambiar_clave_form)
 
 
@app.route('/parqueadero-informacion', methods=['GET', 'POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def parqueadero_informacion():
    """
    Muestra la información del parqueadero.
 
    :return: Plantilla HTML.
    """
    parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
 
    form = ParqueaderoInformacionForm(obj=parqueadero)
 
    if form.validate_on_submit():
        form.populate_obj(parqueadero)
        db.session.commit()
        flash('Información del parqueadero actualizada correctamente.', 'parqueadero-informacion-success')
        return redirect(url_for('parqueadero_informacion'))
    
    return render_template('parqueadero-informacion.html', titulo='Información del Parqueadero', form=form)
 
 
@app.route('/sedes', methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sedes():
    """
    Función de vista para mostrar la página de sedes.
    """
    parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
    sedes = Sede.query.filter_by(parqueadero_id=parqueadero.id).all()
 
    return render_template('sedes.html', titulo='Sedes', entidades=sedes)
 
 
@app.route('/sede', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_crear():
    """
    Crea una nueva sede.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
        entidad = Sede(
            nombre=data.get('nombre'),
            direccion=data.get('direccion'),
            telefono=data.get('telefono'),
            email=data.get('email'),
            parqueadero_id=parqueadero.id
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Sede creada', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'direccion': entidad.direccion,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'parqueadero_id': entidad.parqueadero_id
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/<int:id>', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_actualizar(id):
    """
    Actualiza una sede.
 
    :param id: Identificador de la sede.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Sede.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Sede encontrada'}), 404
 
        entidad.nombre = data.get('nombre')
        entidad.direccion = data.get('direccion')
        entidad.telefono = data.get('telefono')
        entidad.email = data.get('email')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Sede actualizada', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'direccion': entidad.direccion,
            'telefono': entidad.telefono,
            'email': entidad.email,
            'parqueadero_id': entidad.parqueadero_id
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/<int:id>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_eliminar(id):
    """
    Elimina una sede.
 
    :param id: Identificador de la sede.
    :return: Respuesta JSON.
    """
    try:
        entidad = Sede.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Sede no encontrada'}), 404
 
        db.session.delete(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Sede eliminada'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/<int:id>/modulos', methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def sede_modulos(id):
    """
    Muestra los módulos de una sede.
 
    :param id: Identificador de la sede.
    :return: Plantilla HTML.
    """
    sede = Sede.query.get(id)
    modulos = sede.modulos
 
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': modulo.id,
        'nombre': modulo.nombre,
        'habilitado': modulo.habilitado,
        'descripcion': modulo.descripcion,
    } for modulo in modulos]}), 200
 
 
@app.route('/sede/<int:id>/modulo', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_modulo_crear(id):
    """
    Crea un nuevo módulo en una sede.
 
    :param id: Identificador de la sede.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Modulo(
            nombre=data.get('moduloNombre'),
            habilitado=data.get('moduloHabilitado'),
            descripcion=data.get('moduloDescripcion'),
            sede_id=id
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Módulo creado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'descripcion': entidad.descripcion,
            'habilitado': entidad.habilitado,
            'sede_id': entidad.sede_id
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/<int:id>/modulo/<int:modulo_id>', methods=['PUT'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_modulo_actualizar(id, modulo_id):
    """
    Actualiza un módulo en una sede.
 
    :param id: Identificador de la sede.
    :param modulo_id: Identificador del módulo.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Modulo.query.get(modulo_id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Módulo no encontrado'}), 404
 
        entidad.nombre = data.get('moduloNombre')
        entidad.habilitado = data.get('moduloHabilitado')
        entidad.descripcion = data.get('moduloDescripcion')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Módulo actualizado', 'data': {
            'id': entidad.id,
            'nombre': entidad.nombre,
            'descripcion': entidad.descripcion,
            'habilitado': entidad.habilitado,
            'sede_id': entidad.sede_id
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/<int:id>/modulo/<int:modulo_id>', methods=['DELETE'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_modulo_eliminar(id, modulo_id):
    """
    Elimina un módulo en una sede.
 
    :param id: Identificador de la sede.
    :param modulo_id: Identificador del módulo.
    :return: Respuesta JSON.
    """
    try:
        entidad = Modulo.query.get(modulo_id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Módulo no encontrado'}), 404
 
        db.session.delete(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Módulo eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/asignar-usuario', methods=['POST'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_asignar_usuario():
    """
    Asigna un usuario a una sede.
 
    :param id: Identificador de la sede.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        documento = data.get('documento')
        sede_id = data.get('sedeId')
        usuario = Usuario.query.filter_by(documento=documento).first()
 
        if usuario is None:
            return jsonify({'status': 'failure', 'message': 'Usuario no encontrado'}), 404
        
        asignacion = SedeUsuario.query.filter_by(sede_id=sede_id, usuario_id=usuario.id).first()
        if asignacion is not None:
            return jsonify({'status': 'existente', 'message': 'Usuario ya asignado a la sede seleccionada.'}), 200
 
        asignacion = SedeUsuario(sede_id=sede_id, usuario_id=usuario.id)
        db.session.add(asignacion)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Usuario asignado a la sede'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/sede-asignada/<int:documento>', methods=['GET'])
@login_required
@propietario_admin_permission.require(http_exception=403)
def sede_asignada(documento):
    """
    Muestra los usuarios asignados a una sede.
 
    :param id: Identificador de la sede.
    :return: Respuesta JSON.
    """
    usuario = Usuario.query.filter_by(documento=documento).first()
    asignaciones = usuario.sedes
 
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': asignacion.id,
        'sede_id': asignacion.sede_id,
        'usuario_id': asignacion.usuario_id
    } for asignacion in asignaciones]}), 200
 
 
@app.route('/cliente/<string:documento>/vehiculos', methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_vehiculos(documento):
    """
    Muestra los vehículos de un cliente.
 
    :param documento: Documento del cliente.
    :return: Respuesta JSON.
    """
    cliente = Cliente.query.filter_by(documento=documento).first()
    vehiculos = cliente.vehiculos
 
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': vehiculo.id,
        'placa': vehiculo.placa,
        'marca': vehiculo.marca,
        'modelo': vehiculo.modelo,
        'tipo': vehiculo.vehiculo_tipo.nombre,
        'disponible': vehiculo.disponible
    } for vehiculo in vehiculos]}), 200
 
 
@app.route('/cliente/crear-vehiculo', methods=['POST'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_crear_vehiculo():
    """
    Crea un nuevo vehículo para un cliente.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
 
        cliente = Cliente.query.filter_by(documento=data.get('clienteDocumento')).first()
        vehiculo_tipo_id = data.get('vehiculoTipoId')
 
        entidad = Vehiculo(
            placa=data.get('vehiculoPlaca'),
            marca=data.get('vehiculoMarca'),
            modelo=data.get('vehiculoModelo'),
            cliente_id=cliente.id,
            vehiculo_tipo_id=vehiculo_tipo_id,
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Vehículo creado', 'data': {
            'id': entidad.id,
            'placa': entidad.placa,
            'marca': entidad.marca,
            'modelo': entidad.modelo,
            'cliente_id': entidad.cliente_id,
            'vehiculo_tipo_id': entidad.vehiculo_tipo_id,
            'vehiculo_tipo': entidad.vehiculo_tipo.nombre,
            'disponible': entidad.disponible
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/cliente/editar-vehiculo/<int:vehiculo_id>', methods=['PUT'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_editar_vehiculo(vehiculo_id):
    """
    Edita un vehículo de un cliente.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
 
        vehiculo = Vehiculo.query.get(vehiculo_id)
 
        if vehiculo is None:
            return jsonify({'status': 'failure', 'message': 'Vehículo no encontrado'}), 404
 
        vehiculo.placa = data.get('vehiculoPlaca')
        vehiculo.marca = data.get('vehiculoMarca')
        vehiculo.modelo = data.get('vehiculoModelo')
        vehiculo.vehiculo_tipo_id = data.get('vehiculoTipoId')
        vehiculo.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Vehículo actualizado', 'data': {
            'id': vehiculo.id,
            'placa': vehiculo.placa,
            'marca': vehiculo.marca,
            'modelo': vehiculo.modelo,
            'cliente_id': vehiculo.cliente_id,
            'vehiculo_tipo_id': vehiculo.vehiculo_tipo_id,
            'vehiculo_tipo': vehiculo.vehiculo_tipo.nombre,
            'disponible': vehiculo.disponible
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/cliente/vehiculo/<int:vehiculo_id>/cambiar-disponibilidad', methods=['DELETE'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_eliminar_vehiculo(vehiculo_id):
    """
    Elimina un vehículo de un cliente.
 
    :return: Respuesta JSON.
    """
    try:
        vehiculo = Vehiculo.query.get(vehiculo_id)
 
        if vehiculo is None:
            return jsonify({'status': 'failure', 'message': 'Vehículo no encontrado'}), 404
 
        vehiculo.disponible = not vehiculo.disponible
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Vehículo eliminado'}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/cliente/vehiculo/<int:vehiculo_id>/arrendamientos', methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_vehiculo_arrendamientos(vehiculo_id):
    """
    Muestra los arrendamientos de un vehículo.
 
    :param vehiculo_id: Identificador del vehículo.
    :return: Respuesta JSON.
    """
    vehiculo = Vehiculo.query.get(vehiculo_id)
    arrendamientos = vehiculo.arrendamientos
 
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': arrendamiento.id,
        'vehiculoId': arrendamiento.vehiculo_id,
        'periodicidadId': arrendamiento.periodicidad_id,
        'tarifaId': arrendamiento.tarifa_id,
        'medioPagoId': arrendamiento.medio_pago_id,
        'periodicidad': arrendamiento.periodicidad.nombre,
        'medioPago': arrendamiento.medio_pago.nombre,
        'tarifa': arrendamiento.tarifa.nombre,
        'descripcion': arrendamiento.descripcion
    } for arrendamiento in arrendamientos]}), 200
 
 
@app.route('/periodicidades', methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def periodicidades():
    """
    Muestra las periodicidades.
 
    :return: Respuesta JSON.
    """
    usuario_id = current_user.id
    parqueadero = Parqueadero.query.filter_by(usuario_id=usuario_id).first()
    periodicidades = Periodicidad.query.filter_by(parqueadero_id=parqueadero.id).all()
 
    return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
        'id': entidad.id,
        'nombre': entidad.nombre,
        'dias': entidad.dias
    } for entidad in periodicidades]}), 200
 
 
@app.route('/cliente/vehiculo/arrendamiento', methods=['POST'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_vehiculo_arrendamiento():
    """
    Crea un arrendamiento de un vehículo.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
 
        descripcion = data.get('descripcion')
        vehiculo_id = data.get('vehiculoId')
        periodicidad_id = data.get('periodicidadId')
        medio_pago_id = data.get('medioPagoId')
        tarifa_id = data.get('tarifaId')
 
        entidad = Arrendamiento(
            descripcion=descripcion,
            vehiculo_id=vehiculo_id,
            periodicidad_id=periodicidad_id,
            medio_pago_id=medio_pago_id,
            tarifa_id=tarifa_id
        )
 
        db.session.add(entidad)
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Arrendamiento creado', 'data': {
            'id': entidad.id,
            'vehiculoId': entidad.vehiculo_id,
            'periodicidadId': entidad.periodicidad_id,
            'tarifaId': entidad.tarifa_id,
            'medioPagoId': entidad.medio_pago_id,
            'periodicidad': entidad.periodicidad.nombre,
            'medioPago': entidad.medio_pago.nombre,
            'tarifa': entidad.tarifa.nombre,
            'descripcion': entidad.descripcion
        }}), 201
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
    
 
@app.route('/cliente/vehiculo/arrendamiento/<int:id>', methods=['PUT'])
@login_required
@todos_permiso.require(http_exception=403)
def cliente_vehiculo_arrendamiento_actualizar(id):
    """
    Actualiza un arrendamiento de un vehículo.
 
    :param id: Identificador del arrendamiento.
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        entidad = Arrendamiento.query.get(id)
 
        if entidad is None:
            return jsonify({'status': 'failure', 'message': 'Arrendamiento no encontrado'}), 404
 
        entidad.descripcion = data.get('descripcion')
        entidad.periodicidad_id = data.get('periodicidadId')
        entidad.medio_pago_id = data.get('medioPagoId')
        entidad.tarifa_id = data.get('tarifaId')
        entidad.updated_at = db.func.current_timestamp()
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Arrendamiento actualizado', 'data': {
            'id': entidad.id,
            'vehiculoId': entidad.vehiculo_id,
            'periodicidadId': entidad.periodicidad_id,
            'tarifaId': entidad.tarifa_id,
            'medioPagoId': entidad.medio_pago_id,
            'periodicidad': entidad.periodicidad.nombre,
            'medioPago': entidad.medio_pago.nombre,
            'tarifa': entidad.tarifa.nombre,
            'descripcion': entidad.descripcion
        }}), 200
 
    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
 
@app.route('/cliente/<string:documento>/puntos', methods=['GET'])
@login_required
@todos_permiso.require(http_exception=403)
def get_cliente_puntos(documento):
    """
    Obtiene los puntos de un cliente.
 
    :param documento: Documento del cliente.
 
    :return: Respuesta JSON.
    """
    cliente = Cliente.query.filter_by(documento=documento).first()
    puntos = cliente.puntos
 
    total_puntos = sum([punto.cantidad for punto in puntos])
    
    puntos = {
        'data': {
            'documento': documento,
            'puntos': total_puntos,
        },
        'status': 'success',
    }
 
    return jsonify(puntos)
 
 
@app.route('/parqueos', methods=['GET'])
@login_required
@operario_permission.require(http_exception=403)
def parqueos():
    """
    Muestra la lista de parqueos.
    """
    sedes = [sede.sede for sede in current_user.sedes]
    tipos_vehiculos = VehiculoTipo.query.all()
    tipos_vehiculos_json = [to_json(tipo_vehiculo) for tipo_vehiculo in tipos_vehiculos]
 
    return render_template('parqueos.html', titulo='Parqueos', sedes=sedes, tipos_vehiculos=tipos_vehiculos_json)
 
 
@app.route('/vehiculo/buscar/<placa>', methods=['GET'])
@login_required
def buscar_vehiculo(placa):
    """
    Busca un vehículo por placa.
 
    :param placa: Placa del vehículo.
 
    :return: Respuesta JSON.
    """
    vehiculo = Vehiculo.query.filter_by(placa=placa).first()
 
    if vehiculo is None:
        return jsonify({'status': 'failure', 'message': 'No existe un vehículo con la placa indicada.'}), 200
 
    return jsonify({
        'status': 'success',
        'data': {
            'id': vehiculo.id,
            'placa': vehiculo.placa,
            'marca': vehiculo.marca,
            'modelo': vehiculo.modelo,
            'tipo': vehiculo.vehiculo_tipo.nombre,
            'disponible': vehiculo.disponible
        }
    })
 
 
@app.route('/parqueo/ingresar', methods=['POST'])
@login_required
@operario_permission.require(http_exception=403)
def ingresar_parqueo():
    """
    Ingresa un vehículo al parqueadero.
 
    :return: Respuesta JSON.
    """
    try:
        data = request.get_json()
        placa = data.get('placa')
        modulo_id = data.get('moduloId')
 
        vehiculo = Vehiculo.query.filter_by(placa=placa).first()
        modulo = Modulo.query.get(modulo_id)
 
        if vehiculo is not None:
            parqueo = Parqueo.query.filter_by(vehiculo_id=vehiculo.id, fecha_hora_salida=None).first()
 
            if parqueo is not None:
                return jsonify({'status': 'warning', 'message': 'El vehículo ya se encuentra en el parqueadero'}), 200
 
        if vehiculo is None:
            vehiculo_tipo_id = data.get('vehiculoTipoId')
            vehiculo = Vehiculo(
                placa=placa,
                vehiculo_tipo_id=vehiculo_tipo_id
            )
 
            db.session.add(vehiculo)
            db.session.flush()
        
        parqueo = Parqueo(
            vehiculo_id=vehiculo.id,
            modulo_id=modulo.id,
        )
 
        db.session.add(parqueo)
 
        db.session.commit()
 
        return jsonify({'status': 'success', 'message': 'Vehículo ingresado al parqueadero'}), 200
    except Exception as e:
        print('Error:', e)
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
@app.route('/sede/<int:sede_id>/parqueos-activos', methods=['GET'])
@login_required
@operario_permission.require(http_exception=403)
def parqueos_activos(sede_id):
    """
    Obtiene los parqueos activos de una sede.
 
    :param sede_id: Identificador de la sede.
 
    :return: Respuesta JSON.
    """
    parqueos = (
        Parqueo.query
        .join(Modulo, Parqueo.modulo_id == Modulo.id)
        .filter(Modulo.sede_id == sede_id, Parqueo.fecha_hora_salida == None)
        .all()
    )
 
    return jsonify({
        'status': 'success',
        'message': 'Consulta realizada de forma satisfactoria',
        'data': [
            {
                'id': parqueo.id,
                'vehiculo': {
                    'id': parqueo.vehiculo_id,
                    'placa': parqueo.vehiculo.placa,
                    'marca': parqueo.vehiculo.marca,
                    'modelo': parqueo.vehiculo.modelo,
                    'tipo': parqueo.vehiculo.vehiculo_tipo.nombre
                },
                'modulo': {
                    'id': parqueo.modulo_id,
                    'nombre': parqueo.modulo.nombre,
                    'habilitado': parqueo.modulo.habilitado,
                    'descripcion': parqueo.modulo.descripcion
                },
                'fechaHoraEntrada': parqueo.fecha_hora_entrada,
                'fechaHoraSalida': parqueo.fecha_hora_salida
            }
            for parqueo in parqueos
        ]
    }), 200
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎