Advertisement
Fhernd

Untitled

Aug 14th, 2024
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 50.96 KB | Software | 0 0
  1. from flask import current_app, flash, jsonify, redirect, render_template, request, url_for
  2. from flask_login import current_user, login_user, logout_user, login_required
  3. from flask_principal import Permission, RoleNeed, UserNeed, identity_loaded, identity_changed, Identity, AnonymousIdentity
  4. from werkzeug.security import generate_password_hash
  5.  
  6. from app import app, db
  7.  
  8. from app.forms import CambiarClaveForm, ParqueaderoInformacionForm, UsuarioForm
  9. from app.models import Arrendamiento, Cliente, MedioPago, Modulo, Pais, Parqueadero, Parqueo, Periodicidad, Rol, Sede, SedeUsuario, Tarifa, TarifaTipo, Usuario, Vehiculo, VehiculoTipo, usuario_rol
  10. from app.util.roles_enum import Roles
  11. from app.util.utilitarios import to_json
  12.  
  13.  
  14. propietario_role = RoleNeed(Roles.PROPIETARIO.value)
  15. admin_role = RoleNeed(Roles.ADMINISTRADOR.value)
  16. operario_role = RoleNeed(Roles.OPERARIO.value)
  17.  
  18. admin_permission = Permission(admin_role)
  19. propietario_permission = Permission(propietario_role)
  20. operario_permission = Permission(operario_role)
  21. propietario_admin_permission = propietario_permission.union(admin_permission)
  22. todos_permiso = propietario_permission.union(admin_permission).union(operario_permission)
  23.  
  24.  
  25. def tiene_rol(roles_disponibles, roles_asignados):
  26.     """
  27.    Verifica si un usuario tiene un rol específico.
  28.  
  29.    :param roles_disponibles: Roles disponibles.
  30.    :param roles_asignados: Roles asignados.
  31.    :return: Booleano.
  32.    """
  33.     roles_disponibles = [rol.nombre for rol in roles_disponibles]
  34.     return set(roles_asignados).intersection(roles_disponibles)
  35.  
  36.  
  37. @identity_loaded.connect_via(app)
  38. def on_identity_loaded(sender, identity):
  39.     identity.user = current_user
  40.  
  41.     if hasattr(current_user, 'id'):
  42.         identity.provides.add(UserNeed(current_user.id))
  43.  
  44.     if hasattr(current_user, 'roles'):
  45.         for role in current_user.roles:
  46.             identity.provides.add(RoleNeed(role.nombre))
  47.  
  48.  
  49. @app.route("/")
  50. def index():
  51.     """
  52.    Muestra la página de inicio de la aplicación.
  53.  
  54.    :return: Plantilla HTML.
  55.    """
  56.     return render_template("login.html", titulo='Inicio', nombre='Alex')
  57.  
  58.  
  59. @app.route('/dashboard', methods=['GET'])
  60. @login_required
  61. @propietario_admin_permission.require(http_exception=403)
  62. def dashboard():
  63.     """
  64.    Muestra el dashboard de la aplicación.
  65.  
  66.    :return: Plantilla HTML.
  67.    """
  68.     return render_template('dashboard.html', titulo='Dashboard')
  69.  
  70.  
  71. @app.route("/vehiculo-tipo", methods=['GET'])
  72. @login_required
  73. @propietario_admin_permission.require(http_exception=403)
  74. def vehiculo_tipo():
  75.     tipos_vehiculo = VehiculoTipo.query.all()
  76.     return render_template("vehiculo-tipo.html", titulo='Tipo de Vehículo', tipos_vehiculo=tipos_vehiculo)
  77.  
  78.  
  79. @app.route('/vehiculo-tipo/<int:id>', methods=['DELETE'])
  80. @login_required
  81. @propietario_admin_permission.require(http_exception=403)
  82. def vehiculo_tipo_delete(id):
  83.     try:
  84.         vehiculo_tipo = VehiculoTipo.query.get(id)
  85.  
  86.         if vehiculo_tipo is None:
  87.             return jsonify({'status': 'failure', 'message': 'Tipo de vehículo encontrado'}), 404
  88.  
  89.         db.session.delete(vehiculo_tipo)
  90.         db.session.commit()
  91.  
  92.         return jsonify({'status': 'success', 'message': 'Tipo de vehículo eliminado'}), 200
  93.  
  94.     except Exception as e:
  95.         db.session.rollback()
  96.         return jsonify({'status': 'error', 'message': str(e)}), 500
  97.  
  98.  
  99. @app.route('/vehiculo-tipo', methods=['POST'])
  100. @login_required
  101. @propietario_admin_permission.require(http_exception=403)
  102. def vehiculo_tipo_crear():
  103.     try:
  104.         data = request.get_json()
  105.         vehiculo_tipo = VehiculoTipo(nombre=data.get('nombre'))
  106.  
  107.         db.session.add(vehiculo_tipo)
  108.         db.session.commit()
  109.  
  110.         return jsonify({'status': 'success', 'message': 'Tipo de vehículo creado', 'data': {
  111.             'id': vehiculo_tipo.id,
  112.             'nombre': vehiculo_tipo.nombre
  113.         }}), 201
  114.  
  115.     except Exception as e:
  116.         db.session.rollback()
  117.         return jsonify({'status': 'error', 'message': str(e)}), 500
  118.  
  119.  
  120. @app.route('/vehiculo-tipo/<int:id>', methods=['PUT'])
  121. @login_required
  122. @propietario_admin_permission.require(http_exception=403)
  123. def vehiculo_tipo_update(id):
  124.     """
  125.    Actualiza un tipo de vehículo.
  126.  
  127.    :param id: Identificador del tipo de vehículo.
  128.    :return: Respuesta JSON.
  129.    """
  130.     try:
  131.         data = request.get_json()
  132.         vehiculo_tipo = VehiculoTipo.query.get(id)
  133.  
  134.         if vehiculo_tipo is None:
  135.             return jsonify({'status': 'failure', 'message': 'Tipo de vehículo encontrado'}), 404
  136.  
  137.         vehiculo_tipo.nombre = data.get('nombre')
  138.         vehiculo_tipo.updated_at = db.func.current_timestamp()
  139.  
  140.         db.session.commit()
  141.  
  142.         return jsonify({'status': 'success', 'message': 'Tipo de vehículo actualizado', 'data': {
  143.             'id': vehiculo_tipo.id,
  144.             'nombre': vehiculo_tipo.nombre
  145.         }}), 200
  146.  
  147.     except Exception as e:
  148.         db.session.rollback()
  149.         return jsonify({'status': 'error', 'message': str(e)}), 500
  150.  
  151.  
  152. @app.route("/tarifa-tipo", methods=['GET'])
  153. @login_required
  154. @todos_permiso.require(http_exception=403)
  155. def tarifa_tipo():
  156.     """
  157.    Muestra la lista de tipos de tarifa.
  158.    """
  159.     entidades = TarifaTipo.query.all()
  160.     return render_template("tarifa-tipo.html", titulo='Tipo de Tarifa', entidades=entidades)
  161.  
  162.  
  163. @app.route("/tarifas", methods=['GET'])
  164. @login_required
  165. @todos_permiso.require(http_exception=403)
  166. def get_tarifa_tipos():
  167.     """
  168.    Recupera los tipos de tarifa.
  169.  
  170.    :return: Respuesta JSON.
  171.    """
  172.     entidades = Tarifa.query.all()
  173.    
  174.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  175.         'id': entidad.id,
  176.         'costo': entidad.costo,
  177.         'nombre': entidad.nombre,
  178.     } for entidad in entidades]}), 200
  179.  
  180.  
  181. @app.route('/tarifa-tipo', methods=['POST'])
  182. @login_required
  183. @propietario_admin_permission.require(http_exception=403)
  184. def tarifa_tipo_create():
  185.     """
  186.    Crea un nuevo tipo de tarifa.
  187.  
  188.    :return: Respuesta JSON.
  189.    """
  190.     try:
  191.         data = request.get_json()
  192.         entidad = TarifaTipo(nombre=data.get('nombre'), unidad=data.get('unidad'))
  193.  
  194.         db.session.add(entidad)
  195.         db.session.commit()
  196.  
  197.         return jsonify({'status': 'success', 'message': 'Tipo de tarifa creado', 'data': {
  198.             'id': entidad.id,
  199.             'nombre': entidad.nombre,
  200.             'unidad': entidad.unidad
  201.         }}), 201
  202.  
  203.     except Exception as e:
  204.         db.session.rollback()
  205.         return jsonify({'status': 'error', 'message': str(e)}), 500
  206.  
  207.  
  208. @app.route('/tarifa-tipo/<int:id>', methods=['PUT'])
  209. @login_required
  210. @propietario_admin_permission.require(http_exception=403)
  211. def tarifa_tipo_update(id):
  212.     """
  213.    Actualiza un tipo de tarifa.
  214.  
  215.    :param id: Identificador del tipo de tarifa.
  216.    :return: Respuesta JSON.
  217.    """
  218.     try:
  219.         data = request.get_json()
  220.         entidad = TarifaTipo.query.get(id)
  221.  
  222.         if entidad is None:
  223.             return jsonify({'status': 'failure', 'message': 'Tipo de tarifa encontrado'}), 404
  224.  
  225.         entidad.nombre = data.get('nombre')
  226.         entidad.unidad = data.get('unidad')
  227.         entidad.updated_at = db.func.current_timestamp()
  228.  
  229.         db.session.commit()
  230.  
  231.         return jsonify({'status': 'success', 'message': 'Tipo de tarifa actualizado', 'data': {
  232.             'id': entidad.id,
  233.             'nombre': entidad.nombre,
  234.             'unidad': entidad.unidad
  235.         }}), 200
  236.  
  237.     except Exception as e:
  238.         db.session.rollback()
  239.         return jsonify({'status': 'error', 'message': str(e)}), 500
  240.  
  241.  
  242. @app.route('/tarifa-tipo/<int:id>', methods=['DELETE'])
  243. @login_required
  244. @propietario_admin_permission.require(http_exception=403)
  245. def tarifa_tipo_delete(id):
  246.     """
  247.    Elimina un tipo de tarifa.
  248.  
  249.    :param id: Identificador del tipo de tarifa.
  250.    :return: Respuesta JSON.
  251.    """
  252.     try:
  253.         entidad = TarifaTipo.query.get(id)
  254.  
  255.         if entidad is None:
  256.             return jsonify({'status': 'failure', 'message': 'Tipo de tarifa encontrado'}), 404
  257.  
  258.         db.session.delete(entidad)
  259.         db.session.commit()
  260.  
  261.         return jsonify({'status': 'success', 'message': 'Tipo de tarifa eliminado'}), 200
  262.  
  263.     except Exception as e:
  264.         db.session.rollback()
  265.         return jsonify({'status': 'error', 'message': str(e)}), 500
  266.  
  267.  
  268. @app.route("/medio-pago", methods=['GET'])
  269. @login_required
  270. @propietario_admin_permission.require(http_exception=403)
  271. def medio_pago():
  272.     """
  273.    Muestra la lista de tipos de tarifa.
  274.    """
  275.     entidades = MedioPago.query.all()
  276.     return render_template('medio-pago.html', titulo='Medios de Pago', entidades=entidades)
  277.  
  278.  
  279. @app.route("/medios-pago", methods=['GET'])
  280. @login_required
  281. @todos_permiso.require(http_exception=403)
  282. def get_medios_pago():
  283.     """
  284.    Recupera los medios de pago.
  285.  
  286.    :return: Respuesta JSON.
  287.    """
  288.     entidades = MedioPago.query.all()
  289.    
  290.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  291.         'id': entidad.id,
  292.         'nombre': entidad.nombre,
  293.     } for entidad in entidades]}), 200
  294.  
  295.  
  296. @app.route('/medio-pago', methods=['POST'])
  297. @login_required
  298. @propietario_admin_permission.require(http_exception=403)
  299. def medio_pago_create():
  300.     """
  301.    Crea un nuevo medio de pago.
  302.  
  303.    :return: Respuesta JSON.
  304.    """
  305.     try:
  306.         data = request.get_json()
  307.         entidad = MedioPago(nombre=data.get('nombre'))
  308.  
  309.         db.session.add(entidad)
  310.         db.session.commit()
  311.  
  312.         return jsonify({'status': 'success', 'message': 'Medio de pago creado', 'data': {
  313.             'id': entidad.id,
  314.             'nombre': entidad.nombre
  315.         }}), 201
  316.  
  317.     except Exception as e:
  318.         db.session.rollback()
  319.         return jsonify({'status': 'error', 'message': str(e)}), 500
  320.  
  321.  
  322. @app.route('/medio-pago/<int:id>', methods=['PUT'])
  323. @login_required
  324. @propietario_admin_permission.require(http_exception=403)
  325. def medio_pago_update(id):
  326.     """
  327.    Actualiza un medio de pago.
  328.  
  329.    :param id: Identificador del medio de pago.
  330.    :return: Respuesta JSON.
  331.    """
  332.     try:
  333.         data = request.get_json()
  334.         entidad = MedioPago.query.get(id)
  335.  
  336.         if entidad is None:
  337.             return jsonify({'status': 'failure', 'message': 'Medio de pago encontrado'}), 404
  338.  
  339.         entidad.nombre = data.get('nombre')
  340.         entidad.updated_at = db.func.current_timestamp()
  341.  
  342.         db.session.commit()
  343.  
  344.         return jsonify({'status': 'success', 'message': 'Medio de pago actualizado', 'data': {
  345.             'id': entidad.id,
  346.             'nombre': entidad.nombre
  347.         }}), 200
  348.  
  349.     except Exception as e:
  350.         db.session.rollback()
  351.         return jsonify({'status': 'error', 'message': str(e)}), 500
  352.  
  353.  
  354. @app.route('/medio-pago/<int:id>', methods=['DELETE'])
  355. @login_required
  356. @propietario_admin_permission.require(http_exception=403)
  357. def medio_pago_delete(id):
  358.     """
  359.    Elimina un medio de pago.
  360.  
  361.    :param id: Identificador del medio de pago.
  362.    :return: Respuesta JSON.
  363.    """
  364.     try:
  365.         entidad = MedioPago.query.get(id)
  366.  
  367.         if entidad is None:
  368.             return jsonify({'status': 'failure', 'message': 'Medio de pago encontrado'}), 404
  369.  
  370.         db.session.delete(entidad)
  371.         db.session.commit()
  372.  
  373.         return jsonify({'status': 'success', 'message': 'Medio de pago eliminado'}), 200
  374.  
  375.     except Exception as e:
  376.         db.session.rollback()
  377.         return jsonify({'status': 'error', 'message': str(e)}), 500
  378.  
  379.  
  380. @app.route("/cliente", methods=['GET'])
  381. @login_required
  382. @propietario_admin_permission.require(http_exception=403)
  383. def cliente():
  384.     """
  385.    Muestra la lista de tipos de tarifa.
  386.    """
  387.     entidades = Cliente.query.all()
  388.     vehiculos_tipos = VehiculoTipo.query.all()
  389.  
  390.     return render_template('cliente.html', titulo='Clientes', entidades=entidades, vehiculos_tipos=vehiculos_tipos)
  391.  
  392.  
  393. @app.route('/cliente', methods=['POST'])
  394. @login_required
  395. @todos_permiso.require(http_exception=403)
  396. def cliente_crear():
  397.     """
  398.    Crea un nuevo cliente.
  399.  
  400.    :return: Respuesta JSON.
  401.    """
  402.     try:
  403.         data = request.get_json()
  404.         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'))
  405.  
  406.         db.session.add(entidad)
  407.         db.session.commit()
  408.  
  409.         return jsonify({'status': 'success', 'message': 'Cliente creado', 'data': {
  410.             'id': entidad.id,
  411.             'documento': entidad.documento,
  412.             'nombres': entidad.nombres,
  413.             'apellidos': entidad.apellidos,
  414.             'telefono': entidad.telefono,
  415.             'email': entidad.email,
  416.             'direccion': entidad.direccion,
  417.             'parqueadero_id': entidad.parqueadero_id
  418.         }}), 201
  419.  
  420.     except Exception as e:
  421.         db.session.rollback()
  422.         return jsonify({'status': 'error', 'message': str(e)}), 500
  423.  
  424.  
  425. @app.route('/cliente/<string:documento>', methods=['PUT'])
  426. @login_required
  427. @todos_permiso.require(http_exception=403)
  428. def cliente_actualizar(documento):
  429.     """
  430.    Actualiza un cliente.
  431.  
  432.    :param id: Identificador del cliente.
  433.    :return: Respuesta JSON.
  434.    """
  435.     try:
  436.         data = request.get_json()
  437.         entidad = Cliente.query.filter_by(documento=documento).first()
  438.  
  439.         if entidad is None:
  440.             return jsonify({'status': 'failure', 'message': 'Cliente encontrado'}), 404
  441.  
  442.         entidad.documento = data.get('documento')
  443.         entidad.nombres = data.get('nombres')
  444.         entidad.apellidos = data.get('apellidos')
  445.         entidad.telefono = data.get('telefono')
  446.         entidad.email = data.get('email')
  447.         entidad.direccion = data.get('direccion')
  448.         entidad.parqueadero_id = data.get('parqueadero_id')
  449.         entidad.updated_at = db.func.current_timestamp()
  450.  
  451.         db.session.commit()
  452.  
  453.         return jsonify({'status': 'success', 'message': 'Cliente actualizado', 'data': {
  454.             'id': entidad.id,
  455.             'documento': entidad.documento,
  456.             'nombres': entidad.nombres,
  457.             'apellidos': entidad.apellidos,
  458.             'telefono': entidad.telefono,
  459.             'email': entidad.email,
  460.             'direccion': entidad.direccion,
  461.             'parqueadero_id': entidad.parqueadero_id
  462.         }}), 200
  463.  
  464.     except Exception as e:
  465.         db.session.rollback()
  466.         return jsonify({'status': 'error', 'message': str(e)}), 500
  467.  
  468.  
  469. @app.route('/cliente/<string:documento>', methods=['DELETE'])
  470. @login_required
  471. @propietario_admin_permission.require(http_exception=403)
  472. def cliente_eliminar(documento):
  473.     """
  474.    Elimina un cliente.
  475.  
  476.    :param id: Identificador del cliente.
  477.    :return: Respuesta JSON.
  478.    """
  479.     try:
  480.         entidad = Cliente.query.filter_by(documento=documento).first()
  481.  
  482.         if entidad is None:
  483.             return jsonify({'status': 'failure', 'message': 'Cliente encontrado'}), 404
  484.  
  485.         db.session.delete(entidad)
  486.         db.session.commit()
  487.  
  488.         return jsonify({'status': 'success', 'message': 'Cliente eliminado'}), 200
  489.  
  490.     except Exception as e:
  491.         db.session.rollback()
  492.         return jsonify({'status': 'error', 'message': str(e)}), 500
  493.  
  494.  
  495. @app.route("/rol", methods=['GET'])
  496. @login_required
  497. @propietario_permission.require(http_exception=403)
  498. def rol():
  499.     """
  500.    Muestra la lista de roles.
  501.    """
  502.     entidades = Rol.query.all()
  503.     return render_template('rol.html', titulo='Roles', entidades=entidades)
  504.  
  505.  
  506. @app.route("/usuario", methods=['GET'])
  507. @login_required
  508. @propietario_admin_permission.require(http_exception=403)
  509. def usuario():
  510.     """
  511.    Muestra la lista de usuarios.
  512.    """
  513.     entidades = Usuario.query.all()
  514.  
  515.     parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
  516.  
  517.     if parqueadero is not None:
  518.         entidades = Usuario.query.filter_by(parqueadero_id=parqueadero.id).all()
  519.  
  520.     roles = Rol.query.all()
  521.     sedes = Sede.query.all()
  522.     return render_template('usuario.html', titulo='Usuarios', entidades=entidades, roles=roles, sedes=sedes)
  523.  
  524.  
  525. @app.route('/usuario', methods=['POST'])
  526. @login_required
  527. @propietario_admin_permission.require(http_exception=403)
  528. def usuario_crear():
  529.     """
  530.    Crea un nuevo usuario.
  531.  
  532.    :return: Respuesta JSON.
  533.    """
  534.     try:
  535.         data = request.get_json()
  536.  
  537.         hashed_password = generate_password_hash(data.get('password'), method='pbkdf2:sha256')
  538.  
  539.         entidad = Usuario(
  540.             documento=data.get('documento'),
  541.             nombres=data.get('nombres'),
  542.             apellidos=data.get('apellidos'),
  543.             telefono=data.get('telefono'),
  544.             email=data.get('email'),
  545.             password=hashed_password,
  546.             parqueadero_id=current_user.parqueadero_id
  547.         )
  548.  
  549.         db.session.add(entidad)
  550.         db.session.commit()
  551.  
  552.         rol = usuario_rol.insert().values(usuario_id=entidad.id, rol_id=data.get('rolId'))
  553.        
  554.         db.session.execute(rol)
  555.         db.session.commit()
  556.  
  557.         return jsonify({'status': 'success', 'message': 'Usuario creado', 'data': {
  558.             'id': entidad.id,
  559.             'documento': entidad.documento,
  560.             'nombres': entidad.nombres,
  561.             'apellidos': entidad.apellidos,
  562.             'telefono': entidad.telefono,
  563.             'email': entidad.email
  564.         }}), 201
  565.  
  566.     except Exception as e:
  567.         db.session.rollback()
  568.         return jsonify({'status': 'error', 'message': str(e)}), 500
  569.  
  570.  
  571. @app.route('/usuario/<string:documento>', methods=['PUT'])
  572. @login_required
  573. @propietario_admin_permission.require(http_exception=403)
  574. def usuario_actualizar(documento):
  575.     """
  576.    Actualiza un usuario.
  577.  
  578.    :param id: Identificador del usuario.
  579.    :return: Respuesta JSON.
  580.    """
  581.     try:
  582.         data = request.get_json()
  583.         entidad = Usuario.query.filter_by(documento=documento).first()
  584.  
  585.         if entidad is None:
  586.             return jsonify({'status': 'failure', 'message': 'Usuario encontrado'}), 404
  587.  
  588.         entidad.documento = data.get('documento')
  589.         entidad.nombres = data.get('nombres')
  590.         entidad.apellidos = data.get('apellidos')
  591.         entidad.telefono = data.get('telefono')
  592.         entidad.email = data.get('email')
  593.         entidad.rol_id = data.get('rolId')
  594.         entidad.updated_at = db.func.current_timestamp()
  595.  
  596.         db.session.commit()
  597.  
  598.         return jsonify({'status': 'success', 'message': 'Usuario actualizado', 'data': {
  599.             'id': entidad.id,
  600.             'documento': entidad.documento,
  601.             'nombres': entidad.nombres,
  602.             'apellidos': entidad.apellidos,
  603.             'telefono': entidad.telefono,
  604.             'email': entidad.email,
  605.             'rol_id': entidad.rol_id
  606.         }}), 200
  607.  
  608.     except Exception as e:
  609.         db.session.rollback()
  610.         return jsonify({'status': 'error', 'message': str(e)}), 500
  611.  
  612.  
  613. @app.route('/usuario/<string:documento>', methods=['DELETE'])
  614. @login_required
  615. @propietario_admin_permission.require(http_exception=403)
  616. def usuario_eliminar(documento):
  617.     """
  618.    Elimina un usuario.
  619.  
  620.    :param id: Identificador del usuario.
  621.    :return: Respuesta JSON.
  622.    """
  623.     try:
  624.         entidad = Usuario.query.filter_by(documento=documento).first()
  625.  
  626.         if entidad is None:
  627.             return jsonify({'status': 'failure', 'message': 'Usuario encontrado'}), 404
  628.        
  629.         # Eliminar de la tabla de relación sede_usuario:
  630.         sede_usuario = SedeUsuario.query.filter_by(usuario_id=entidad.id).first()
  631.  
  632.         if sede_usuario is not None:
  633.             db.session.delete(sede_usuario)
  634.             db.session.commit()
  635.  
  636.         db.session.delete(entidad)
  637.         db.session.commit()
  638.  
  639.         return jsonify({'status': 'success', 'message': 'Usuario eliminado'}), 200
  640.  
  641.     except Exception as e:
  642.         db.session.rollback()
  643.         return jsonify({'status': 'error', 'message': str(e)}), 500
  644.  
  645.  
  646. @app.route('/usuario/cambiar-password', methods=['PUT'])
  647. @login_required
  648. @propietario_admin_permission.require(http_exception=403)
  649. def usuario_cambiar_password():
  650.     """
  651.    Cambia la contraseña de un usuario.
  652.  
  653.    :return: Respuesta JSON.
  654.    """
  655.     try:
  656.         data = request.get_json()
  657.         entidad = Usuario.query.filter_by(documento=data.get('documento')).first()
  658.  
  659.         if entidad is None:
  660.             return jsonify({'status': 'failure', 'message': 'Usuario no encontrado'}), 404
  661.  
  662.         hashed_password = generate_password_hash(data.get('password'), method='pbkdf2:sha256')
  663.  
  664.         entidad.password = hashed_password
  665.         entidad.updated_at = db.func.current_timestamp()
  666.  
  667.         db.session.commit()
  668.  
  669.         return jsonify({'status': 'success', 'message': 'Contraseña actualizada'}), 200
  670.  
  671.     except Exception as e:
  672.         db.session.rollback()
  673.         return jsonify({'status': 'error', 'message': str(e)}), 500
  674.  
  675.  
  676. @app.route('/usuario/<string:documento>', methods=['GET'])
  677. @login_required
  678. @todos_permiso.require(http_exception=403)
  679. def usuario_obtener(documento):
  680.     """
  681.    Obtiene un usuario.
  682.  
  683.    :param id: Identificador del usuario.
  684.    :return: Respuesta JSON.
  685.    """
  686.     entidad = Usuario.query.filter_by(documento=documento).first()
  687.  
  688.     if entidad is not None:
  689.         return jsonify({'status': 'existente', 'message': 'Ya existe un usuario con el documento dado.'}), 200
  690.  
  691.     return jsonify({'status': 'faile', 'message': 'Usuario encontrado', 'data': {}}), 200
  692.  
  693.  
  694. @app.route("/registro", methods=['GET'])
  695. @propietario_admin_permission.require(http_exception=403)
  696. def registro():
  697.     """
  698.    Muestra la ruta para el registro de un administrador para el parqueadero.
  699.    """
  700.     paises = Pais.query.all()
  701.     return render_template('registro.html', titulo='Registro', paises=paises)
  702.  
  703.  
  704. @app.route('/registro', methods=['POST'])
  705. def registro_crear():
  706.     """
  707.    Crea un nuevo usuario administrador para el parqueadero.
  708.  
  709.    :return: Respuesta JSON.
  710.    """
  711.     try:
  712.         data = request.get_json()
  713.  
  714.         hashed_password = generate_password_hash(data.get('password'), method='pbkdf2:sha256')
  715.  
  716.         entidad = Usuario(
  717.             documento=data.get('documento'),
  718.             nombres=data.get('nombres'),
  719.             apellidos=data.get('apellidos'),
  720.             telefono=data.get('telefono'),
  721.             email=data.get('email'),
  722.             rol_id=2,
  723.             password=hashed_password,
  724.             es_propietario=True
  725.         )
  726.  
  727.         db.session.add(entidad)
  728.         db.session.commit()
  729.  
  730.         return jsonify({'status': 'success', 'message': 'Usuario creado', 'data': {
  731.             'id': entidad.id,
  732.             'documento': entidad.documento,
  733.             'nombres': entidad.nombres,
  734.             'apellidos': entidad.apellidos,
  735.             'telefono': entidad.telefono,
  736.             'email': entidad.email,
  737.             'rol_id': entidad.rol_id
  738.         }}), 201
  739.  
  740.     except Exception as e:
  741.         db.session.rollback()
  742.         return jsonify({'status': 'error', 'message': str(e)}), 500
  743.  
  744.  
  745. @app.route("/parqueadero", methods=['POST'])
  746. @login_required
  747. @propietario_permission.require(http_exception=403)
  748. def parqueadero():
  749.     """
  750.    Crea un nuevo parqueadero.
  751.  
  752.    :return: Respuesta JSON.
  753.    """
  754.     try:
  755.         data = request.get_json()
  756.         entidad = Parqueadero(
  757.             rut=data.get('rut'),
  758.             nombre=data.get('nombre'),
  759.             direccion=data.get('direccion'),
  760.             email=data.get('email'),
  761.             ciudad=data.get('ciudad'),
  762.             telefono=data.get('telefono'),
  763.             usuario_id=data.get('usuarioId'),
  764.             pais_id=data.get('paisId')
  765.         )
  766.  
  767.         db.session.add(entidad)
  768.         db.session.commit()
  769.  
  770.         return jsonify({'status': 'success', 'message': 'Parqueadero creado', 'data': {
  771.             'id': entidad.id,
  772.             'nombre': entidad.nombre,
  773.             'direccion': entidad.direccion,
  774.             'telefono': entidad.telefono,
  775.             'email': entidad.email,
  776.             'pais_id': entidad.pais_id,
  777.             'usuario_id': entidad.usuario_id
  778.         }}), 201
  779.  
  780.     except Exception as e:
  781.         db.session.rollback()
  782.         return jsonify({'status': 'error', 'message': str(e)}), 500
  783.  
  784.  
  785. @app.route("/login", methods=['GET'])
  786. def login():
  787.     """
  788.    Muestra la página de inicio de sesión.
  789.  
  790.    :return: Plantilla HTML.
  791.    """
  792.     return render_template('login.html', titulo='Iniciar Sesión')
  793.  
  794.  
  795. @app.route("/login", methods=['POST'])
  796. def login_post():
  797.     """
  798.    Inicia sesión en la aplicación.
  799.  
  800.    :return: Redirección a la página de inicio.
  801.    """
  802.     if current_user.is_authenticated:
  803.         identity_changed.send(current_app._get_current_object(), identity=Identity(current_user.id))
  804.         return jsonify({"success": True, "redirect_url": url_for('dashboard')})
  805.    
  806.     data = request.get_json()
  807.     email = data.get('email')
  808.  
  809.     usuario = Usuario.query.filter_by(email=email).first()
  810.  
  811.     if usuario is None or not usuario.check_password(data.get('password')):
  812.         return jsonify({"success": False, "message": "Credenciales inválidas"}), 401
  813.  
  814.     login_user(usuario)
  815.     identity_changed.send(current_app._get_current_object(), identity=Identity(usuario.id))
  816.  
  817.     next = request.args.get('next')
  818.  
  819.     if not next:
  820.         roles = [rol.nombre for rol in usuario.roles]
  821.         if tiene_rol(current_user.roles, [Roles.OPERARIO.value]):
  822.             return jsonify({"success": True, "redirect_url": url_for('parqueos')})
  823.         else:
  824.             return jsonify({"success": True, "redirect_url": url_for('dashboard')})
  825.     else:
  826.         return jsonify({"success": True, "redirect_url": next})
  827.  
  828.  
  829. @app.route("/logout", methods=['GET'])
  830. @login_required
  831. def logout():
  832.     """
  833.    Cierra sesión en la aplicación.
  834.  
  835.    :return: Redirección a la página de inicio.
  836.    """
  837.     logout_user()
  838.     identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity())
  839.  
  840.     return redirect(url_for('login'))
  841.  
  842.  
  843. @app.route('/perfil', methods=['GET', 'POST'])
  844. @login_required
  845. @todos_permiso.require(http_exception=403)
  846. def perfil():
  847.     """
  848.    Muestra el perfil del usuario.
  849.  
  850.    :return: Plantilla HTML.
  851.    """
  852.     form = UsuarioForm()
  853.     cambiar_clave_form = CambiarClaveForm()
  854.  
  855.     if form.submit.data and form.validate_on_submit():
  856.         current_user.documento = form.documento.data
  857.         current_user.nombres = form.nombres.data
  858.         current_user.apellidos = form.apellidos.data
  859.         current_user.telefono = form.telefono.data
  860.  
  861.         db.session.commit()
  862.         flash('Perfil actualizado correctamente.', 'perfil-success')
  863.         return redirect(url_for('perfil'))
  864.  
  865.     if cambiar_clave_form.submit.data and cambiar_clave_form.validate_on_submit():
  866.         clave_actual = cambiar_clave_form.clave_actual.data
  867.  
  868.         if not current_user.check_password(clave_actual):
  869.             flash('La contraseña actual es incorrecta', 'cambio-clave-danger')
  870.         else:
  871.             current_user.set_password(cambiar_clave_form.clave_nueva.data)
  872.             db.session.commit()
  873.             flash('Contraseña cambiada correctamente.', 'cambio-clave-success')
  874.             return redirect(url_for('perfil'))
  875.  
  876.     return render_template('perfil.html', titulo='Perfil', form=form, cambiar_clave_form=cambiar_clave_form)
  877.  
  878.  
  879. @app.route('/parqueadero-informacion', methods=['GET', 'POST'])
  880. @login_required
  881. @propietario_admin_permission.require(http_exception=403)
  882. def parqueadero_informacion():
  883.     """
  884.    Muestra la información del parqueadero.
  885.  
  886.    :return: Plantilla HTML.
  887.    """
  888.     parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
  889.  
  890.     form = ParqueaderoInformacionForm(obj=parqueadero)
  891.  
  892.     if form.validate_on_submit():
  893.         form.populate_obj(parqueadero)
  894.         db.session.commit()
  895.         flash('Información del parqueadero actualizada correctamente.', 'parqueadero-informacion-success')
  896.         return redirect(url_for('parqueadero_informacion'))
  897.    
  898.     return render_template('parqueadero-informacion.html', titulo='Información del Parqueadero', form=form)
  899.  
  900.  
  901. @app.route('/sedes', methods=['GET'])
  902. @login_required
  903. @propietario_admin_permission.require(http_exception=403)
  904. def sedes():
  905.     """
  906.    Función de vista para mostrar la página de sedes.
  907.    """
  908.     parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
  909.     sedes = Sede.query.filter_by(parqueadero_id=parqueadero.id).all()
  910.  
  911.     return render_template('sedes.html', titulo='Sedes', entidades=sedes)
  912.  
  913.  
  914. @app.route('/sede', methods=['POST'])
  915. @login_required
  916. @propietario_admin_permission.require(http_exception=403)
  917. def sede_crear():
  918.     """
  919.    Crea una nueva sede.
  920.  
  921.    :return: Respuesta JSON.
  922.    """
  923.     try:
  924.         data = request.get_json()
  925.         parqueadero = Parqueadero.query.filter_by(usuario_id=current_user.id).first()
  926.         entidad = Sede(
  927.             nombre=data.get('nombre'),
  928.             direccion=data.get('direccion'),
  929.             telefono=data.get('telefono'),
  930.             email=data.get('email'),
  931.             parqueadero_id=parqueadero.id
  932.         )
  933.  
  934.         db.session.add(entidad)
  935.         db.session.commit()
  936.  
  937.         return jsonify({'status': 'success', 'message': 'Sede creada', 'data': {
  938.             'id': entidad.id,
  939.             'nombre': entidad.nombre,
  940.             'direccion': entidad.direccion,
  941.             'telefono': entidad.telefono,
  942.             'email': entidad.email,
  943.             'parqueadero_id': entidad.parqueadero_id
  944.         }}), 201
  945.  
  946.     except Exception as e:
  947.         db.session.rollback()
  948.         return jsonify({'status': 'error', 'message': str(e)}), 500
  949.  
  950.  
  951. @app.route('/sede/<int:id>', methods=['PUT'])
  952. @login_required
  953. @propietario_admin_permission.require(http_exception=403)
  954. def sede_actualizar(id):
  955.     """
  956.    Actualiza una sede.
  957.  
  958.    :param id: Identificador de la sede.
  959.    :return: Respuesta JSON.
  960.    """
  961.     try:
  962.         data = request.get_json()
  963.         entidad = Sede.query.get(id)
  964.  
  965.         if entidad is None:
  966.             return jsonify({'status': 'failure', 'message': 'Sede encontrada'}), 404
  967.  
  968.         entidad.nombre = data.get('nombre')
  969.         entidad.direccion = data.get('direccion')
  970.         entidad.telefono = data.get('telefono')
  971.         entidad.email = data.get('email')
  972.         entidad.updated_at = db.func.current_timestamp()
  973.  
  974.         db.session.commit()
  975.  
  976.         return jsonify({'status': 'success', 'message': 'Sede actualizada', 'data': {
  977.             'id': entidad.id,
  978.             'nombre': entidad.nombre,
  979.             'direccion': entidad.direccion,
  980.             'telefono': entidad.telefono,
  981.             'email': entidad.email,
  982.             'parqueadero_id': entidad.parqueadero_id
  983.         }}), 200
  984.  
  985.     except Exception as e:
  986.         db.session.rollback()
  987.         return jsonify({'status': 'error', 'message': str(e)}), 500
  988.  
  989.  
  990. @app.route('/sede/<int:id>', methods=['DELETE'])
  991. @login_required
  992. @propietario_admin_permission.require(http_exception=403)
  993. def sede_eliminar(id):
  994.     """
  995.    Elimina una sede.
  996.  
  997.    :param id: Identificador de la sede.
  998.    :return: Respuesta JSON.
  999.    """
  1000.     try:
  1001.         entidad = Sede.query.get(id)
  1002.  
  1003.         if entidad is None:
  1004.             return jsonify({'status': 'failure', 'message': 'Sede no encontrada'}), 404
  1005.  
  1006.         db.session.delete(entidad)
  1007.         db.session.commit()
  1008.  
  1009.         return jsonify({'status': 'success', 'message': 'Sede eliminada'}), 200
  1010.  
  1011.     except Exception as e:
  1012.         db.session.rollback()
  1013.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1014.  
  1015.  
  1016. @app.route('/sede/<int:id>/modulos', methods=['GET'])
  1017. @login_required
  1018. @todos_permiso.require(http_exception=403)
  1019. def sede_modulos(id):
  1020.     """
  1021.    Muestra los módulos de una sede.
  1022.  
  1023.    :param id: Identificador de la sede.
  1024.    :return: Plantilla HTML.
  1025.    """
  1026.     sede = Sede.query.get(id)
  1027.     modulos = sede.modulos
  1028.  
  1029.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  1030.         'id': modulo.id,
  1031.         'nombre': modulo.nombre,
  1032.         'habilitado': modulo.habilitado,
  1033.         'descripcion': modulo.descripcion,
  1034.     } for modulo in modulos]}), 200
  1035.  
  1036.  
  1037. @app.route('/sede/<int:id>/modulo', methods=['POST'])
  1038. @login_required
  1039. @propietario_admin_permission.require(http_exception=403)
  1040. def sede_modulo_crear(id):
  1041.     """
  1042.    Crea un nuevo módulo en una sede.
  1043.  
  1044.    :param id: Identificador de la sede.
  1045.    :return: Respuesta JSON.
  1046.    """
  1047.     try:
  1048.         data = request.get_json()
  1049.         entidad = Modulo(
  1050.             nombre=data.get('moduloNombre'),
  1051.             habilitado=data.get('moduloHabilitado'),
  1052.             descripcion=data.get('moduloDescripcion'),
  1053.             sede_id=id
  1054.         )
  1055.  
  1056.         db.session.add(entidad)
  1057.         db.session.commit()
  1058.  
  1059.         return jsonify({'status': 'success', 'message': 'Módulo creado', 'data': {
  1060.             'id': entidad.id,
  1061.             'nombre': entidad.nombre,
  1062.             'descripcion': entidad.descripcion,
  1063.             'habilitado': entidad.habilitado,
  1064.             'sede_id': entidad.sede_id
  1065.         }}), 201
  1066.  
  1067.     except Exception as e:
  1068.         db.session.rollback()
  1069.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1070.  
  1071.  
  1072. @app.route('/sede/<int:id>/modulo/<int:modulo_id>', methods=['PUT'])
  1073. @login_required
  1074. @propietario_admin_permission.require(http_exception=403)
  1075. def sede_modulo_actualizar(id, modulo_id):
  1076.     """
  1077.    Actualiza un módulo en una sede.
  1078.  
  1079.    :param id: Identificador de la sede.
  1080.    :param modulo_id: Identificador del módulo.
  1081.    :return: Respuesta JSON.
  1082.    """
  1083.     try:
  1084.         data = request.get_json()
  1085.         entidad = Modulo.query.get(modulo_id)
  1086.  
  1087.         if entidad is None:
  1088.             return jsonify({'status': 'failure', 'message': 'Módulo no encontrado'}), 404
  1089.  
  1090.         entidad.nombre = data.get('moduloNombre')
  1091.         entidad.habilitado = data.get('moduloHabilitado')
  1092.         entidad.descripcion = data.get('moduloDescripcion')
  1093.         entidad.updated_at = db.func.current_timestamp()
  1094.  
  1095.         db.session.commit()
  1096.  
  1097.         return jsonify({'status': 'success', 'message': 'Módulo actualizado', 'data': {
  1098.             'id': entidad.id,
  1099.             'nombre': entidad.nombre,
  1100.             'descripcion': entidad.descripcion,
  1101.             'habilitado': entidad.habilitado,
  1102.             'sede_id': entidad.sede_id
  1103.         }}), 200
  1104.  
  1105.     except Exception as e:
  1106.         db.session.rollback()
  1107.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1108.  
  1109.  
  1110. @app.route('/sede/<int:id>/modulo/<int:modulo_id>', methods=['DELETE'])
  1111. @login_required
  1112. @propietario_admin_permission.require(http_exception=403)
  1113. def sede_modulo_eliminar(id, modulo_id):
  1114.     """
  1115.    Elimina un módulo en una sede.
  1116.  
  1117.    :param id: Identificador de la sede.
  1118.    :param modulo_id: Identificador del módulo.
  1119.    :return: Respuesta JSON.
  1120.    """
  1121.     try:
  1122.         entidad = Modulo.query.get(modulo_id)
  1123.  
  1124.         if entidad is None:
  1125.             return jsonify({'status': 'failure', 'message': 'Módulo no encontrado'}), 404
  1126.  
  1127.         db.session.delete(entidad)
  1128.         db.session.commit()
  1129.  
  1130.         return jsonify({'status': 'success', 'message': 'Módulo eliminado'}), 200
  1131.  
  1132.     except Exception as e:
  1133.         db.session.rollback()
  1134.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1135.  
  1136.  
  1137. @app.route('/sede/asignar-usuario', methods=['POST'])
  1138. @login_required
  1139. @propietario_admin_permission.require(http_exception=403)
  1140. def sede_asignar_usuario():
  1141.     """
  1142.    Asigna un usuario a una sede.
  1143.  
  1144.    :param id: Identificador de la sede.
  1145.    :return: Respuesta JSON.
  1146.    """
  1147.     try:
  1148.         data = request.get_json()
  1149.         documento = data.get('documento')
  1150.         sede_id = data.get('sedeId')
  1151.         usuario = Usuario.query.filter_by(documento=documento).first()
  1152.  
  1153.         if usuario is None:
  1154.             return jsonify({'status': 'failure', 'message': 'Usuario no encontrado'}), 404
  1155.        
  1156.         asignacion = SedeUsuario.query.filter_by(sede_id=sede_id, usuario_id=usuario.id).first()
  1157.         if asignacion is not None:
  1158.             return jsonify({'status': 'existente', 'message': 'Usuario ya asignado a la sede seleccionada.'}), 200
  1159.  
  1160.         asignacion = SedeUsuario(sede_id=sede_id, usuario_id=usuario.id)
  1161.         db.session.add(asignacion)
  1162.         db.session.commit()
  1163.  
  1164.         return jsonify({'status': 'success', 'message': 'Usuario asignado a la sede'}), 200
  1165.  
  1166.     except Exception as e:
  1167.         db.session.rollback()
  1168.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1169.  
  1170.  
  1171. @app.route('/sede/sede-asignada/<int:documento>', methods=['GET'])
  1172. @login_required
  1173. @propietario_admin_permission.require(http_exception=403)
  1174. def sede_asignada(documento):
  1175.     """
  1176.    Muestra los usuarios asignados a una sede.
  1177.  
  1178.    :param id: Identificador de la sede.
  1179.    :return: Respuesta JSON.
  1180.    """
  1181.     usuario = Usuario.query.filter_by(documento=documento).first()
  1182.     asignaciones = usuario.sedes
  1183.  
  1184.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  1185.         'id': asignacion.id,
  1186.         'sede_id': asignacion.sede_id,
  1187.         'usuario_id': asignacion.usuario_id
  1188.     } for asignacion in asignaciones]}), 200
  1189.  
  1190.  
  1191. @app.route('/cliente/<string:documento>/vehiculos', methods=['GET'])
  1192. @login_required
  1193. @todos_permiso.require(http_exception=403)
  1194. def cliente_vehiculos(documento):
  1195.     """
  1196.    Muestra los vehículos de un cliente.
  1197.  
  1198.    :param documento: Documento del cliente.
  1199.    :return: Respuesta JSON.
  1200.    """
  1201.     cliente = Cliente.query.filter_by(documento=documento).first()
  1202.     vehiculos = cliente.vehiculos
  1203.  
  1204.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  1205.         'id': vehiculo.id,
  1206.         'placa': vehiculo.placa,
  1207.         'marca': vehiculo.marca,
  1208.         'modelo': vehiculo.modelo,
  1209.         'tipo': vehiculo.vehiculo_tipo.nombre,
  1210.         'disponible': vehiculo.disponible
  1211.     } for vehiculo in vehiculos]}), 200
  1212.  
  1213.  
  1214. @app.route('/cliente/crear-vehiculo', methods=['POST'])
  1215. @login_required
  1216. @todos_permiso.require(http_exception=403)
  1217. def cliente_crear_vehiculo():
  1218.     """
  1219.    Crea un nuevo vehículo para un cliente.
  1220.  
  1221.    :return: Respuesta JSON.
  1222.    """
  1223.     try:
  1224.         data = request.get_json()
  1225.  
  1226.         cliente = Cliente.query.filter_by(documento=data.get('clienteDocumento')).first()
  1227.         vehiculo_tipo_id = data.get('vehiculoTipoId')
  1228.  
  1229.         entidad = Vehiculo(
  1230.             placa=data.get('vehiculoPlaca'),
  1231.             marca=data.get('vehiculoMarca'),
  1232.             modelo=data.get('vehiculoModelo'),
  1233.             cliente_id=cliente.id,
  1234.             vehiculo_tipo_id=vehiculo_tipo_id,
  1235.         )
  1236.  
  1237.         db.session.add(entidad)
  1238.         db.session.commit()
  1239.  
  1240.         return jsonify({'status': 'success', 'message': 'Vehículo creado', 'data': {
  1241.             'id': entidad.id,
  1242.             'placa': entidad.placa,
  1243.             'marca': entidad.marca,
  1244.             'modelo': entidad.modelo,
  1245.             'cliente_id': entidad.cliente_id,
  1246.             'vehiculo_tipo_id': entidad.vehiculo_tipo_id,
  1247.             'vehiculo_tipo': entidad.vehiculo_tipo.nombre,
  1248.             'disponible': entidad.disponible
  1249.         }}), 201
  1250.  
  1251.     except Exception as e:
  1252.         db.session.rollback()
  1253.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1254.  
  1255.  
  1256. @app.route('/cliente/editar-vehiculo/<int:vehiculo_id>', methods=['PUT'])
  1257. @login_required
  1258. @todos_permiso.require(http_exception=403)
  1259. def cliente_editar_vehiculo(vehiculo_id):
  1260.     """
  1261.    Edita un vehículo de un cliente.
  1262.  
  1263.    :return: Respuesta JSON.
  1264.    """
  1265.     try:
  1266.         data = request.get_json()
  1267.  
  1268.         vehiculo = Vehiculo.query.get(vehiculo_id)
  1269.  
  1270.         if vehiculo is None:
  1271.             return jsonify({'status': 'failure', 'message': 'Vehículo no encontrado'}), 404
  1272.  
  1273.         vehiculo.placa = data.get('vehiculoPlaca')
  1274.         vehiculo.marca = data.get('vehiculoMarca')
  1275.         vehiculo.modelo = data.get('vehiculoModelo')
  1276.         vehiculo.vehiculo_tipo_id = data.get('vehiculoTipoId')
  1277.         vehiculo.updated_at = db.func.current_timestamp()
  1278.  
  1279.         db.session.commit()
  1280.  
  1281.         return jsonify({'status': 'success', 'message': 'Vehículo actualizado', 'data': {
  1282.             'id': vehiculo.id,
  1283.             'placa': vehiculo.placa,
  1284.             'marca': vehiculo.marca,
  1285.             'modelo': vehiculo.modelo,
  1286.             'cliente_id': vehiculo.cliente_id,
  1287.             'vehiculo_tipo_id': vehiculo.vehiculo_tipo_id,
  1288.             'vehiculo_tipo': vehiculo.vehiculo_tipo.nombre,
  1289.             'disponible': vehiculo.disponible
  1290.         }}), 200
  1291.  
  1292.     except Exception as e:
  1293.         db.session.rollback()
  1294.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1295.  
  1296.  
  1297. @app.route('/cliente/vehiculo/<int:vehiculo_id>/cambiar-disponibilidad', methods=['DELETE'])
  1298. @login_required
  1299. @todos_permiso.require(http_exception=403)
  1300. def cliente_eliminar_vehiculo(vehiculo_id):
  1301.     """
  1302.    Elimina un vehículo de un cliente.
  1303.  
  1304.    :return: Respuesta JSON.
  1305.    """
  1306.     try:
  1307.         vehiculo = Vehiculo.query.get(vehiculo_id)
  1308.  
  1309.         if vehiculo is None:
  1310.             return jsonify({'status': 'failure', 'message': 'Vehículo no encontrado'}), 404
  1311.  
  1312.         vehiculo.disponible = not vehiculo.disponible
  1313.  
  1314.         db.session.commit()
  1315.  
  1316.         return jsonify({'status': 'success', 'message': 'Vehículo eliminado'}), 200
  1317.  
  1318.     except Exception as e:
  1319.         db.session.rollback()
  1320.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1321.  
  1322.  
  1323. @app.route('/cliente/vehiculo/<int:vehiculo_id>/arrendamientos', methods=['GET'])
  1324. @login_required
  1325. @todos_permiso.require(http_exception=403)
  1326. def cliente_vehiculo_arrendamientos(vehiculo_id):
  1327.     """
  1328.    Muestra los arrendamientos de un vehículo.
  1329.  
  1330.    :param vehiculo_id: Identificador del vehículo.
  1331.    :return: Respuesta JSON.
  1332.    """
  1333.     vehiculo = Vehiculo.query.get(vehiculo_id)
  1334.     arrendamientos = vehiculo.arrendamientos
  1335.  
  1336.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  1337.         'id': arrendamiento.id,
  1338.         'vehiculoId': arrendamiento.vehiculo_id,
  1339.         'periodicidadId': arrendamiento.periodicidad_id,
  1340.         'tarifaId': arrendamiento.tarifa_id,
  1341.         'medioPagoId': arrendamiento.medio_pago_id,
  1342.         'periodicidad': arrendamiento.periodicidad.nombre,
  1343.         'medioPago': arrendamiento.medio_pago.nombre,
  1344.         'tarifa': arrendamiento.tarifa.nombre,
  1345.         'descripcion': arrendamiento.descripcion
  1346.     } for arrendamiento in arrendamientos]}), 200
  1347.  
  1348.  
  1349. @app.route('/periodicidades', methods=['GET'])
  1350. @login_required
  1351. @todos_permiso.require(http_exception=403)
  1352. def periodicidades():
  1353.     """
  1354.    Muestra las periodicidades.
  1355.  
  1356.    :return: Respuesta JSON.
  1357.    """
  1358.     usuario_id = current_user.id
  1359.     parqueadero = Parqueadero.query.filter_by(usuario_id=usuario_id).first()
  1360.     periodicidades = Periodicidad.query.filter_by(parqueadero_id=parqueadero.id).all()
  1361.  
  1362.     return jsonify({'status': 'success', 'message': 'Consulta realizada de forma satisfactoria', 'data': [{
  1363.         'id': entidad.id,
  1364.         'nombre': entidad.nombre,
  1365.         'dias': entidad.dias
  1366.     } for entidad in periodicidades]}), 200
  1367.  
  1368.  
  1369. @app.route('/cliente/vehiculo/arrendamiento', methods=['POST'])
  1370. @login_required
  1371. @todos_permiso.require(http_exception=403)
  1372. def cliente_vehiculo_arrendamiento():
  1373.     """
  1374.    Crea un arrendamiento de un vehículo.
  1375.  
  1376.    :return: Respuesta JSON.
  1377.    """
  1378.     try:
  1379.         data = request.get_json()
  1380.  
  1381.         descripcion = data.get('descripcion')
  1382.         vehiculo_id = data.get('vehiculoId')
  1383.         periodicidad_id = data.get('periodicidadId')
  1384.         medio_pago_id = data.get('medioPagoId')
  1385.         tarifa_id = data.get('tarifaId')
  1386.  
  1387.         entidad = Arrendamiento(
  1388.             descripcion=descripcion,
  1389.             vehiculo_id=vehiculo_id,
  1390.             periodicidad_id=periodicidad_id,
  1391.             medio_pago_id=medio_pago_id,
  1392.             tarifa_id=tarifa_id
  1393.         )
  1394.  
  1395.         db.session.add(entidad)
  1396.         db.session.commit()
  1397.  
  1398.         return jsonify({'status': 'success', 'message': 'Arrendamiento creado', 'data': {
  1399.             'id': entidad.id,
  1400.             'vehiculoId': entidad.vehiculo_id,
  1401.             'periodicidadId': entidad.periodicidad_id,
  1402.             'tarifaId': entidad.tarifa_id,
  1403.             'medioPagoId': entidad.medio_pago_id,
  1404.             'periodicidad': entidad.periodicidad.nombre,
  1405.             'medioPago': entidad.medio_pago.nombre,
  1406.             'tarifa': entidad.tarifa.nombre,
  1407.             'descripcion': entidad.descripcion
  1408.         }}), 201
  1409.  
  1410.     except Exception as e:
  1411.         db.session.rollback()
  1412.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1413.    
  1414.  
  1415. @app.route('/cliente/vehiculo/arrendamiento/<int:id>', methods=['PUT'])
  1416. @login_required
  1417. @todos_permiso.require(http_exception=403)
  1418. def cliente_vehiculo_arrendamiento_actualizar(id):
  1419.     """
  1420.    Actualiza un arrendamiento de un vehículo.
  1421.  
  1422.    :param id: Identificador del arrendamiento.
  1423.    :return: Respuesta JSON.
  1424.    """
  1425.     try:
  1426.         data = request.get_json()
  1427.         entidad = Arrendamiento.query.get(id)
  1428.  
  1429.         if entidad is None:
  1430.             return jsonify({'status': 'failure', 'message': 'Arrendamiento no encontrado'}), 404
  1431.  
  1432.         entidad.descripcion = data.get('descripcion')
  1433.         entidad.periodicidad_id = data.get('periodicidadId')
  1434.         entidad.medio_pago_id = data.get('medioPagoId')
  1435.         entidad.tarifa_id = data.get('tarifaId')
  1436.         entidad.updated_at = db.func.current_timestamp()
  1437.  
  1438.         db.session.commit()
  1439.  
  1440.         return jsonify({'status': 'success', 'message': 'Arrendamiento actualizado', 'data': {
  1441.             'id': entidad.id,
  1442.             'vehiculoId': entidad.vehiculo_id,
  1443.             'periodicidadId': entidad.periodicidad_id,
  1444.             'tarifaId': entidad.tarifa_id,
  1445.             'medioPagoId': entidad.medio_pago_id,
  1446.             'periodicidad': entidad.periodicidad.nombre,
  1447.             'medioPago': entidad.medio_pago.nombre,
  1448.             'tarifa': entidad.tarifa.nombre,
  1449.             'descripcion': entidad.descripcion
  1450.         }}), 200
  1451.  
  1452.     except Exception as e:
  1453.         db.session.rollback()
  1454.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1455.  
  1456.  
  1457.  
  1458. @app.route('/cliente/<string:documento>/puntos', methods=['GET'])
  1459. @login_required
  1460. @todos_permiso.require(http_exception=403)
  1461. def get_cliente_puntos(documento):
  1462.     """
  1463.    Obtiene los puntos de un cliente.
  1464.  
  1465.    :param documento: Documento del cliente.
  1466.  
  1467.    :return: Respuesta JSON.
  1468.    """
  1469.     cliente = Cliente.query.filter_by(documento=documento).first()
  1470.     puntos = cliente.puntos
  1471.  
  1472.     total_puntos = sum([punto.cantidad for punto in puntos])
  1473.    
  1474.     puntos = {
  1475.         'data': {
  1476.             'documento': documento,
  1477.             'puntos': total_puntos,
  1478.         },
  1479.         'status': 'success',
  1480.     }
  1481.  
  1482.     return jsonify(puntos)
  1483.  
  1484.  
  1485. @app.route('/parqueos', methods=['GET'])
  1486. @login_required
  1487. @operario_permission.require(http_exception=403)
  1488. def parqueos():
  1489.     """
  1490.    Muestra la lista de parqueos.
  1491.    """
  1492.     sedes = [sede.sede for sede in current_user.sedes]
  1493.     tipos_vehiculos = VehiculoTipo.query.all()
  1494.     tipos_vehiculos_json = [to_json(tipo_vehiculo) for tipo_vehiculo in tipos_vehiculos]
  1495.  
  1496.     return render_template('parqueos.html', titulo='Parqueos', sedes=sedes, tipos_vehiculos=tipos_vehiculos_json)
  1497.  
  1498.  
  1499. @app.route('/vehiculo/buscar/<placa>', methods=['GET'])
  1500. @login_required
  1501. def buscar_vehiculo(placa):
  1502.     """
  1503.    Busca un vehículo por placa.
  1504.  
  1505.    :param placa: Placa del vehículo.
  1506.  
  1507.    :return: Respuesta JSON.
  1508.    """
  1509.     vehiculo = Vehiculo.query.filter_by(placa=placa).first()
  1510.  
  1511.     if vehiculo is None:
  1512.         return jsonify({'status': 'failure', 'message': 'No existe un vehículo con la placa indicada.'}), 200
  1513.  
  1514.     return jsonify({
  1515.         'status': 'success',
  1516.         'data': {
  1517.             'id': vehiculo.id,
  1518.             'placa': vehiculo.placa,
  1519.             'marca': vehiculo.marca,
  1520.             'modelo': vehiculo.modelo,
  1521.             'tipo': vehiculo.vehiculo_tipo.nombre,
  1522.             'disponible': vehiculo.disponible
  1523.         }
  1524.     })
  1525.  
  1526.  
  1527. @app.route('/parqueo/ingresar', methods=['POST'])
  1528. @login_required
  1529. @operario_permission.require(http_exception=403)
  1530. def ingresar_parqueo():
  1531.     """
  1532.    Ingresa un vehículo al parqueadero.
  1533.  
  1534.    :return: Respuesta JSON.
  1535.    """
  1536.     try:
  1537.         data = request.get_json()
  1538.         placa = data.get('placa')
  1539.         modulo_id = data.get('moduloId')
  1540.  
  1541.         vehiculo = Vehiculo.query.filter_by(placa=placa).first()
  1542.         modulo = Modulo.query.get(modulo_id)
  1543.  
  1544.         if vehiculo is not None:
  1545.             parqueo = Parqueo.query.filter_by(vehiculo_id=vehiculo.id, fecha_hora_salida=None).first()
  1546.  
  1547.             if parqueo is not None:
  1548.                 return jsonify({'status': 'warning', 'message': 'El vehículo ya se encuentra en el parqueadero'}), 200
  1549.  
  1550.         if vehiculo is None:
  1551.             vehiculo_tipo_id = data.get('vehiculoTipoId')
  1552.             vehiculo = Vehiculo(
  1553.                 placa=placa,
  1554.                 vehiculo_tipo_id=vehiculo_tipo_id
  1555.             )
  1556.  
  1557.             db.session.add(vehiculo)
  1558.             db.session.flush()
  1559.        
  1560.         parqueo = Parqueo(
  1561.             vehiculo_id=vehiculo.id,
  1562.             modulo_id=modulo.id,
  1563.         )
  1564.  
  1565.         db.session.add(parqueo)
  1566.  
  1567.         db.session.commit()
  1568.  
  1569.         return jsonify({'status': 'success', 'message': 'Vehículo ingresado al parqueadero'}), 200
  1570.     except Exception as e:
  1571.         print('Error:', e)
  1572.         db.session.rollback()
  1573.         return jsonify({'status': 'error', 'message': str(e)}), 500
  1574.  
  1575.  
  1576. @app.route('/sede/<int:sede_id>/parqueos-activos', methods=['GET'])
  1577. @login_required
  1578. @operario_permission.require(http_exception=403)
  1579. def parqueos_activos(sede_id):
  1580.     """
  1581.    Obtiene los parqueos activos de una sede.
  1582.  
  1583.    :param sede_id: Identificador de la sede.
  1584.  
  1585.    :return: Respuesta JSON.
  1586.    """
  1587.     parqueos = (
  1588.         Parqueo.query
  1589.         .join(Modulo, Parqueo.modulo_id == Modulo.id)
  1590.         .filter(Modulo.sede_id == sede_id, Parqueo.fecha_hora_salida == None)
  1591.         .all()
  1592.     )
  1593.  
  1594.     return jsonify({
  1595.         'status': 'success',
  1596.         'message': 'Consulta realizada de forma satisfactoria',
  1597.         'data': [
  1598.             {
  1599.                 'id': parqueo.id,
  1600.                 'vehiculo': {
  1601.                     'id': parqueo.vehiculo_id,
  1602.                     'placa': parqueo.vehiculo.placa,
  1603.                     'marca': parqueo.vehiculo.marca,
  1604.                     'modelo': parqueo.vehiculo.modelo,
  1605.                     'tipo': parqueo.vehiculo.vehiculo_tipo.nombre
  1606.                 },
  1607.                 'modulo': {
  1608.                     'id': parqueo.modulo_id,
  1609.                     'nombre': parqueo.modulo.nombre,
  1610.                     'habilitado': parqueo.modulo.habilitado,
  1611.                     'descripcion': parqueo.modulo.descripcion
  1612.                 },
  1613.                 'fechaHoraEntrada': parqueo.fecha_hora_entrada,
  1614.                 'fechaHoraSalida': parqueo.fecha_hora_salida
  1615.             }
  1616.             for parqueo in parqueos
  1617.         ]
  1618.     }), 200
  1619.  
Tags: python
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement