Advertisement
losvilos

views

Feb 27th, 2025 (edited)
282
0
22 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 32.54 KB | Help | 0 0
  1. from django.contrib import messages
  2. from django.views.decorators.http import require_http_methods
  3. from django.contrib.auth import authenticate, login, logout
  4. from django.contrib.auth.decorators import login_required, user_passes_test
  5. from django.http import HttpResponse, JsonResponse, HttpResponseNotAllowed
  6. from django.shortcuts import get_object_or_404, render, redirect
  7. from django.views.decorators.csrf import csrf_exempt
  8. from reportlab.lib.pagesizes import letter
  9. from reportlab.pdfgen import canvas
  10. import random, json
  11. import traceback  # Importa traceback una sola vez
  12. from .models import Cliente, Contrato, Servicio, Usuario, Rol, Empleado, Zona, Avenida, Direccion # Importa todos los modelos en una línea
  13. from .forms import ClienteForm, ContratoForm # Importa los formularios
  14. from django.core.paginator import Paginator
  15. from django.db.models import Q  # Importa Q para consultas OR
  16. from .forms import ContratoForm
  17.  
  18.  
  19.  
  20. @csrf_exempt
  21. def registrar_cliente(request):
  22.     if request.method == "POST":
  23.         try:
  24.             form = ClienteForm(request.POST)
  25.             if form.is_valid():
  26.                 form.save()
  27.                 return JsonResponse({"mensaje": "Cliente agregado correctamente"}, status=200)
  28.             else:
  29.                 return JsonResponse({"error": "Error en el formulario", "detalles": form.errors}, status=400)
  30.         except Exception as e:
  31.             # Capturamos el traceback para ver detalles del error.
  32.             traceback_str = traceback.format_exc()
  33.             return JsonResponse({"error": "Error interno", "detalles": traceback_str}, status=500)
  34.     return JsonResponse({"error": "Método no permitido"}, status=405)
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41. def login_view(request):
  42.     if request.method == "POST":
  43.         username = request.POST['username']
  44.         password = request.POST['password']
  45.         user = authenticate(request, username=username, password=password)
  46.         if user is not None:
  47.             login(request, user)
  48.             return redirect('dashboard')  # Redirigir al dashboard si el login es exitoso
  49.         else:
  50.             messages.error(request, "Usuario o contraseña incorrectos")
  51.     return render(request, 'usuarios/login.html')
  52.  
  53. def logout_view(request):
  54.     logout(request)
  55.     return redirect('login')  # Redirigir al login después de cerrar sesión
  56.  
  57. @login_required
  58. def dashboard(request):
  59.     return render(request, 'usuarios/dashboard.html')
  60.  
  61. ### CRUD USUARIOS ###
  62.  
  63. @login_required
  64. def lista_usuarios(request):
  65.     usuarios = Usuario.objects.all()
  66.     roles = Rol.objects.all()  # ✅ Asegurar que los roles estén disponibles en la plantilla
  67.     return render(request, 'usuarios/lista_usuarios.html', {'usuarios': usuarios, 'roles': roles})
  68.  
  69. @login_required
  70. def editar_usuario(request, user_id):
  71.     usuario = get_object_or_404(Usuario, id=user_id)
  72.  
  73.     if request.method == 'POST':
  74.         usuario.username = request.POST['username']
  75.         usuario.first_name = request.POST['first_name']
  76.         usuario.last_name = request.POST['last_name']
  77.         usuario.email = request.POST['email']
  78.         usuario.rol_id = request.POST.get('rol')
  79.         usuario.estatus = 'estatus' in request.POST  # Checkbox activo/inactivo
  80.         usuario.save()
  81.         messages.success(request, "Usuario actualizado correctamente.")
  82.         return redirect('lista_usuarios')
  83.  
  84.     roles = Rol.objects.all()
  85.     return render(request, 'usuarios/editar_usuario.html', {'usuario': usuario, 'roles': roles})
  86.  
  87. @login_required
  88. def eliminar_usuario(request, user_id):
  89.     usuario = get_object_or_404(Usuario, id=user_id)
  90.     usuario.delete()
  91.     messages.success(request, "Usuario eliminado correctamente.")
  92.     return redirect('lista_usuarios')
  93.  
  94. @login_required
  95. def crear_usuario(request):
  96.     if request.method == "POST":
  97.         username = request.POST.get('username').strip()
  98.         first_name = request.POST.get('first_name').strip()
  99.         last_name = request.POST.get('last_name').strip()
  100.         email = request.POST.get('email').strip()
  101.         password = request.POST.get('password')
  102.         rol_id = request.POST.get('rol')
  103.  
  104.         # Validar que no haya campos vacíos
  105.         if not username or not first_name or not last_name or not email or not password or not rol_id:
  106.             messages.error(request, "Todos los campos son obligatorios.")
  107.             return redirect('lista_usuarios')
  108.  
  109.         # Validar si el usuario ya existe
  110.         if Usuario.objects.filter(username=username).exists():
  111.             messages.error(request, "El nombre de usuario ya está en uso.")
  112.             return redirect('lista_usuarios')
  113.  
  114.         # Verificar si el rol existe en la base de datos
  115.         try:
  116.             rol = Rol.objects.get(id=rol_id)
  117.         except Rol.DoesNotExist:
  118.             messages.error(request, "El rol seleccionado no es válido.")
  119.             return redirect('lista_usuarios')
  120.  
  121.         # Crear usuario y cifrar la contraseña
  122.         nuevo_usuario = Usuario(
  123.             username=username,
  124.             first_name=first_name,
  125.             last_name=last_name,
  126.             email=email,
  127.             rol=rol
  128.         )
  129.         nuevo_usuario.set_password(password)  # 🔐 Cifra la contraseña
  130.         nuevo_usuario.save()
  131.  
  132.         messages.success(request, f"Usuario '{username}' creado correctamente.")
  133.         return redirect('lista_usuarios')
  134.  
  135.     # Si el método no es POST, regresar la lista de usuarios
  136.     usuarios = Usuario.objects.all()
  137.     roles = Rol.objects.all()
  138.     return render(request, 'usuarios/lista_usuarios.html', {'usuarios': usuarios, 'roles': roles})
  139.  
  140.  
  141. ### CRUD EMPLEADOS ###
  142.  
  143. @login_required
  144. def lista_empleados(request):
  145.     empleados = Empleado.objects.all()
  146.     return render(request, 'usuarios/lista_empleados.html', {'empleados': empleados})
  147.  
  148. @login_required
  149. def crear_empleado(request):
  150.     if request.method == "POST":
  151.         nombre = request.POST['nombre']
  152.         apellido = request.POST['apellido']
  153.         dni = request.POST['dni']
  154.         rol_id = request.POST.get('rol')
  155.         rol = Rol.objects.get(id=rol_id)
  156.  
  157.         Empleado.objects.create(nombre=nombre, apellido=apellido, dni=dni, rol=rol)
  158.         messages.success(request, "Empleado agregado correctamente.")
  159.         return redirect('lista_empleados')
  160.  
  161.     roles = Rol.objects.all()
  162.     return render(request, 'usuarios/crear_empleado.html', {'roles': roles})
  163.  
  164. @login_required
  165. def editar_empleado(request, emp_id):
  166.     empleado = get_object_or_404(Empleado, id=emp_id)
  167.  
  168.     if request.method == "POST":
  169.         empleado.nombre = request.POST['nombre']
  170.         empleado.apellido = request.POST['apellido']
  171.         empleado.dni = request.POST['dni']
  172.         empleado.rol_id = request.POST.get('rol')
  173.         empleado.save()
  174.         messages.success(request, "Empleado actualizado correctamente.")
  175.         return redirect('lista_empleados')
  176.  
  177.     roles = Rol.objects.all()
  178.     return render(request, 'usuarios/editar_empleado.html', {'empleado': empleado, 'roles': roles})
  179.  
  180. @login_required
  181. def eliminar_empleado(request, emp_id):
  182.     empleado = get_object_or_404(Empleado, id=emp_id)
  183.     empleado.delete()
  184.     messages.success(request, "Empleado eliminado correctamente.")
  185.     return redirect('lista_empleados')
  186.  
  187. ### CRUD ROLES ###
  188.  
  189. @login_required
  190. def lista_roles(request):
  191.     roles = Rol.objects.all()
  192.     return render(request, 'usuarios/lista_roles.html', {'roles': roles})
  193.  
  194. @login_required
  195. def crear_rol(request):
  196.     if request.method == "POST":
  197.         nombre = request.POST['nombre']
  198.         Rol.objects.create(nombre=nombre)
  199.         messages.success(request, "Rol creado correctamente.")
  200.         return redirect('lista_roles')
  201.  
  202.     return render(request, 'usuarios/crear_rol.html')
  203.  
  204. @login_required
  205. def editar_rol(request, rol_id):
  206.     rol = get_object_or_404(Rol, id=rol_id)
  207.  
  208.     if request.method == "POST":
  209.         rol.nombre = request.POST['nombre']
  210.         rol.save()
  211.         messages.success(request, "Rol actualizado correctamente.")
  212.         return redirect('lista_roles')
  213.  
  214.     return render(request, 'usuarios/editar_rol.html', {'rol': rol})
  215.  
  216. @login_required
  217. def eliminar_rol(request, rol_id):
  218.     rol = get_object_or_404(Rol, id=rol_id)
  219.     rol.delete()
  220.     messages.success(request, "Rol eliminado correctamente.")
  221.     return redirect('lista_roles')
  222.  
  223.  
  224.  
  225. @login_required
  226. def editar_usuario(request, user_id):
  227.     usuario = get_object_or_404(Usuario, id=user_id)
  228.  
  229.     if request.method == "POST":
  230.         usuario.username = request.POST.get('username').strip()
  231.         usuario.first_name = request.POST.get('first_name').strip()
  232.         usuario.last_name = request.POST.get('last_name').strip()
  233.         usuario.email = request.POST.get('email').strip()
  234.         rol_id = request.POST.get('rol')
  235.         usuario.estatus = 'estatus' in request.POST  # Checkbox para activar/desactivar usuario
  236.  
  237.         # Validar si el usuario ya existe con otro ID
  238.         if Usuario.objects.exclude(id=user_id).filter(username=usuario.username).exists():
  239.             messages.error(request, "El nombre de usuario ya está en uso por otro usuario.")
  240.             return redirect('lista_usuarios')
  241.  
  242.         # Verificar si el rol existe
  243.         try:
  244.             usuario.rol = Rol.objects.get(id=rol_id)
  245.         except Rol.DoesNotExist:
  246.             messages.error(request, "El rol seleccionado no es válido.")
  247.             return redirect('lista_usuarios')
  248.  
  249.         usuario.save()
  250.         messages.success(request, f"Usuario '{usuario.username}' actualizado correctamente.")
  251.         return redirect('lista_usuarios')
  252.  
  253.     roles = Rol.objects.all()
  254.     return render(request, 'usuarios/editar_usuario.html', {'usuario': usuario, 'roles': roles})
  255.  
  256.  
  257. @login_required
  258. def eliminar_usuario(request, user_id):
  259.     usuario = get_object_or_404(Usuario, id=user_id)
  260.     usuario.delete()
  261.     messages.success(request, f"Usuario '{usuario.username}' eliminado correctamente.")
  262.     return redirect('lista_usuarios')
  263.  
  264.  
  265.  
  266. # Función para verificar si el usuario es administrador
  267. def es_admin(user):
  268.     return user.is_authenticated and user.is_superuser
  269.  
  270. ### RESTRINGIR VISTAS A ADMINISTRADORES ###
  271.  
  272. @login_required
  273. @user_passes_test(es_admin, login_url='/dashboard/')  # Redirigir si no es admin
  274. def lista_usuarios(request):
  275.     usuarios = Usuario.objects.all()
  276.     roles = Rol.objects.all()
  277.     return render(request, 'usuarios/lista_usuarios.html', {'usuarios': usuarios, 'roles': roles})
  278.  
  279. @login_required
  280. @user_passes_test(es_admin, login_url='/dashboard/')
  281. def crear_usuario(request):
  282.     if request.method == "POST":
  283.         username = request.POST.get('username').strip()
  284.         first_name = request.POST.get('first_name').strip()
  285.         last_name = request.POST.get('last_name').strip()
  286.         email = request.POST.get('email').strip()
  287.         password = request.POST.get('password')
  288.         rol_id = request.POST.get('rol')
  289.  
  290.         if Usuario.objects.filter(username=username).exists():
  291.             messages.error(request, "El nombre de usuario ya está en uso.")
  292.             return redirect('lista_usuarios')
  293.  
  294.         try:
  295.             rol = Rol.objects.get(id=rol_id)
  296.         except Rol.DoesNotExist:
  297.             messages.error(request, "El rol seleccionado no es válido.")
  298.             return redirect('lista_usuarios')
  299.  
  300.         nuevo_usuario = Usuario(
  301.             username=username,
  302.             first_name=first_name,
  303.             last_name=last_name,
  304.             email=email,
  305.             rol=rol
  306.         )
  307.         nuevo_usuario.set_password(password)
  308.         nuevo_usuario.save()
  309.  
  310.         messages.success(request, f"Usuario '{username}' creado correctamente.")
  311.         return redirect('lista_usuarios')
  312.  
  313.     return redirect('lista_usuarios')
  314.  
  315. @login_required
  316. @user_passes_test(es_admin, login_url='/dashboard/')
  317. def eliminar_usuario(request, user_id):
  318.     usuario = get_object_or_404(Usuario, id=user_id)
  319.     usuario.delete()
  320.     messages.success(request, f"Usuario '{usuario.username}' eliminado correctamente.")
  321.     return redirect('lista_usuarios')
  322.  
  323. @login_required
  324. @user_passes_test(es_admin, login_url='/dashboard/')
  325. def lista_roles(request):
  326.     roles = Rol.objects.all()
  327.     return render(request, 'usuarios/lista_roles.html', {'roles': roles})
  328.  
  329. @login_required
  330. @user_passes_test(es_admin, login_url='/dashboard/')
  331. def crear_rol(request):
  332.     if request.method == "POST":
  333.         nombre = request.POST['nombre']
  334.         Rol.objects.create(nombre=nombre)
  335.         messages.success(request, "Rol creado correctamente.")
  336.         return redirect('lista_roles')
  337.  
  338.     return render(request, 'usuarios/crear_rol.html')
  339.  
  340. @login_required
  341. @user_passes_test(es_admin, login_url='/dashboard/')
  342. def eliminar_rol(request, rol_id):
  343.     rol = get_object_or_404(Rol, id=rol_id)
  344.     rol.delete()
  345.     messages.success(request, "Rol eliminado correctamente.")
  346.     return redirect('lista_roles')
  347.  
  348.  
  349. def lista_zonas(request):
  350.     zonas = Zona.objects.all()
  351.     return render(request, "usuarios/lista_zonas.html", {"zonas": zonas})
  352.  
  353. def crear_zona(request):
  354.     if request.method == "POST":
  355.         nombre = request.POST["nombre"]
  356.         Zona.objects.create(nombre=nombre)
  357.         messages.success(request, "Zona creada correctamente.")
  358.         return redirect("lista_zonas")
  359.     return redirect("lista_zonas")
  360.  
  361. def editar_zona(request, zona_id):
  362.     zona = get_object_or_404(Zona, id=zona_id)
  363.     if request.method == "POST":
  364.         zona.nombre = request.POST["nombre"]
  365.         zona.save()
  366.         messages.success(request, "Zona actualizada correctamente.")
  367.         return redirect("lista_zonas")
  368.     return redirect("lista_zonas")
  369.  
  370. def eliminar_zona(request, zona_id):
  371.     zona = get_object_or_404(Zona, id=zona_id)
  372.     zona.delete()
  373.     messages.success(request, "Zona eliminada correctamente.")
  374.     return redirect("lista_zonas")
  375.  
  376.  
  377. def lista_avenidas(request):
  378.     avenidas = Avenida.objects.select_related("zona").order_by("zona_id")
  379.     zonas = Zona.objects.all()  # Enviar zonas al template para el formulario
  380.  
  381.     return render(request, "usuarios/lista_avenidas.html", {"avenidas": avenidas, "zonas": zonas})
  382.  
  383.  
  384. def crear_avenida(request):
  385.     if request.method == "POST":
  386.         nombre = request.POST["nombre"]
  387.         zona_id = request.POST["zona"]
  388.         zona = get_object_or_404(Zona, id=zona_id)
  389.         Avenida.objects.create(nombre=nombre, zona=zona)
  390.         messages.success(request, "Avenida creada correctamente.")
  391.         return redirect("lista_avenidas")
  392.     return redirect("lista_avenidas")
  393.  
  394. def editar_avenida(request, avenida_id):
  395.     avenida = get_object_or_404(Avenida, id=avenida_id)
  396.     if request.method == "POST":
  397.         avenida.nombre = request.POST["nombre"]
  398.         zona_id = request.POST["zona"]
  399.         avenida.zona = get_object_or_404(Zona, id=zona_id)
  400.         avenida.save()
  401.         messages.success(request, "Avenida actualizada correctamente.")
  402.         return redirect("lista_avenidas")
  403.     return redirect("lista_avenidas")
  404.  
  405. def eliminar_avenida(request, avenida_id):
  406.     avenida = get_object_or_404(Avenida, id=avenida_id)
  407.     avenida.delete()
  408.     messages.success(request, "Avenida eliminada correctamente.")
  409.     return redirect("lista_avenidas")
  410.  
  411. def lista_clientes(request):
  412.     clientes_list = Cliente.objects.all().order_by('id')
  413.  
  414.     query = request.GET.get('q')  # Obtiene el término de búsqueda del formulario
  415.  
  416.     if query:
  417.         # Filtra clientes por nombre, documento o cualquier otro campo que desees
  418.         clientes_list = clientes_list.filter(
  419.             Q(nombre__icontains=query) | Q(documento__icontains=query)
  420.         )
  421.  
  422.     paginator = Paginator(clientes_list, 6)
  423.     page_number = request.GET.get('page')
  424.     clientes = paginator.get_page(page_number)
  425.  
  426.     zonas = Zona.objects.all()
  427.     return render(request, 'usuarios/lista_clientes.html', {'clientes': clientes, 'zonas': zonas})
  428.  
  429.  
  430.  
  431. def obtener_cliente(request, id):
  432.     """Devuelve datos del cliente en JSON para edición"""
  433.     cliente = get_object_or_404(Cliente, id=id)
  434.     data = {
  435.         "id": cliente.id,
  436.         "documento": cliente.documento,
  437.         "nombre": cliente.nombre,
  438.         "apellido_paterno": cliente.apellido_paterno,
  439.         "apellido_materno": cliente.apellido_materno,
  440.         "fecha_nacimiento": cliente.fecha_nacimiento.strftime("%Y-%m-%d"),
  441.         "sexo": cliente.sexo,
  442.         "telefono": cliente.telefono,
  443.         "email": cliente.email,
  444.         "direccion": cliente.direccion,
  445.         "estatus": cliente.estatus,
  446.         "zona_id": cliente.zona.id,
  447.         "avenida_id": cliente.avenida.id,
  448.     }
  449.     return JsonResponse(data)
  450.  
  451. def get_avenidas(request, zona_id):
  452.     avenidas = Avenida.objects.filter(zona_id=zona_id).values('id', 'nombre')
  453.     return JsonResponse({'avenidas': list(avenidas)})
  454.  
  455. def get_zonas(request):
  456.     zonas = list(Zona.objects.values('id', 'nombre'))
  457.     return JsonResponse({'zonas': zonas})
  458.  
  459.  
  460.  
  461. @require_http_methods(["GET", "POST"])
  462. def editar_cliente(request, cliente_id):
  463.     cliente = get_object_or_404(Cliente, id=cliente_id)
  464.  
  465.     if request.method == "GET":
  466.         # Devolver los datos del cliente en formato JSON
  467.         data = {
  468.             "id": cliente.id,
  469.             "documento": cliente.documento,
  470.             "nombre": cliente.nombre,
  471.             "apellido_paterno": cliente.apellido_paterno,
  472.             "apellido_materno": cliente.apellido_materno,
  473.             "fecha_nacimiento": cliente.fecha_nacimiento.strftime("%Y-%m-%d") if cliente.fecha_nacimiento else None,
  474.             "sexo": cliente.sexo,
  475.             "telefono": cliente.telefono,
  476.             "email": cliente.email,
  477.             "direccion": cliente.direccion,
  478.             "estatus": cliente.estatus,
  479.             "zona_id": cliente.zona.id if cliente.zona else None,
  480.             "avenida_id": cliente.avenida.id if cliente.avenida else None,
  481.         }
  482.         return JsonResponse(data, safe=False)
  483.  
  484.     elif request.method == "POST":
  485.         try:
  486.             # Procesar el formulario de edición
  487.             form = ClienteForm(request.POST, instance=cliente)
  488.             if form.is_valid():
  489.                 cliente = form.save(commit=False)
  490.                
  491.                 # Procesar el campo 'estatus' manualmente
  492.                 estatus = request.POST.get("estatus", "1")  # Por defecto, "1" (Activo)
  493.                 cliente.estatus = estatus == "1"  # Convertir a booleano
  494.                
  495.                 # Guardar los cambios en la base de datos
  496.                 cliente.save()
  497.  
  498.                 # Devolver una respuesta JSON con el mensaje de éxito
  499.                 return JsonResponse({
  500.                     "message": "Cliente actualizado correctamente",
  501.                     "id": cliente.id,
  502.                     "estatus": cliente.estatus,  # Devolver el estado actualizado
  503.                 }, status=200)
  504.             else:
  505.                 # Si el formulario no es válido, devolver los errores
  506.                 return JsonResponse({
  507.                     "error": "Error en el formulario",
  508.                     "detalles": form.errors,
  509.                 }, status=400)
  510.         except Exception as e:
  511.             # Manejar errores inesperados
  512.             return JsonResponse({
  513.                 "error": "Error interno del servidor",
  514.                 "detalles": str(e),
  515.             }, status=500)
  516.  
  517.     return JsonResponse({"error": "Método no permitido"}, status=405)
  518.  
  519.  
  520.  
  521. @csrf_exempt
  522. def eliminar_cliente(request, cliente_id):
  523.     if request.method == "DELETE":  # Verifica que el método sea DELETE
  524.         cliente = get_object_or_404(Cliente, id=cliente_id)
  525.         cliente.delete()
  526.         return JsonResponse({"mensaje": "Cliente eliminado correctamente"}, status=200)
  527.    
  528.     return JsonResponse({"error": "Método no permitido"}, status=405)
  529.  
  530.  
  531.  
  532.  
  533.  
  534. from django.http import JsonResponse
  535. from django.views.decorators.csrf import csrf_exempt
  536. from .models import Cliente
  537. from .forms import ClienteForm
  538.  
  539. @csrf_exempt
  540. def agregar_cliente(request):
  541.     if request.method == "POST":
  542.         form = ClienteForm(request.POST)
  543.         if form.is_valid():
  544.             # Guardar el cliente, pero sin commit para poder modificar campos manualmente
  545.             cliente = form.save(commit=False)
  546.            
  547.             # Procesar el campo 'estatus' manualmente
  548.             estatus = request.POST.get("estatus", "1")  # Por defecto, "1" (Activo)
  549.             cliente.estatus = estatus == "1"  # Convertir a booleano (True si es "1", False si es "0")
  550.            
  551.             # Guardar el cliente en la base de datos
  552.             cliente.save()
  553.  
  554.             # Devolver una respuesta JSON con los datos del cliente
  555.             return JsonResponse({
  556.                 "mensaje": "Cliente agregado correctamente.",
  557.                 "id": cliente.id,
  558.                 "documento": cliente.documento,
  559.                 "nombre": cliente.nombre,
  560.                 "apellido_paterno": cliente.apellido_paterno,
  561.                 "apellido_materno": cliente.apellido_materno,
  562.                 "telefono": cliente.telefono,
  563.                 "email": cliente.email,
  564.                 "estatus": cliente.estatus,  # Devolver el estado actualizado
  565.             }, status=200)
  566.         else:
  567.             # Si el formulario no es válido, devolver errores
  568.             return JsonResponse({
  569.                 "error": "Error en el formulario",
  570.                 "detalles": form.errors,
  571.             }, status=400)
  572.     else:
  573.         # Si el método no es POST, devolver un error
  574.         return JsonResponse({
  575.             "error": "Método no permitido",
  576.         }, status=405)
  577.  
  578.  
  579. def cliente_detail(request, cliente_id):
  580.     cliente = get_object_or_404(Cliente, pk=cliente_id)
  581.     if request.method == "GET":
  582.         data = {
  583.             'id': cliente.id,
  584.             'documento': cliente.documento,
  585.             'nombre': cliente.nombre,
  586.             'apellido_paterno': cliente.apellido_paterno,
  587.             'apellido_materno': cliente.apellido_materno,
  588.             'fecha_nacimiento': cliente.fecha_nacimiento.strftime('%Y-%m-%d'),
  589.             'sexo': cliente.sexo,
  590.             'telefono': cliente.telefono,
  591.             'email': cliente.email,
  592.             'estatus': cliente.estatus,
  593.             'numero_cliente': cliente.numero_cliente,
  594.             # Se devuelven todas las direcciones asociadas al cliente, incluyendo los IDs para zona y avenida
  595.             'direcciones': [
  596.                 {
  597.                     'id': d.id,
  598.                     'zona': d.zona.nombre if d.zona else None,
  599.                     'zona_id': d.zona.id if d.zona else None,
  600.                     'avenida': d.avenida.nombre if d.avenida else None,
  601.                     'avenida_id': d.avenida.id if d.avenida else None,
  602.                     'direccion': d.direccion,
  603.                 } for d in cliente.direcciones.all()
  604.             ]
  605.         }
  606.         return JsonResponse(data)
  607.     elif request.method == "POST":
  608.         # Aquí procesa la actualización de los datos del cliente
  609.         return JsonResponse({'mensaje': 'Cliente actualizado correctamente.'})
  610.     else:
  611.         return HttpResponseNotAllowed(['GET', 'POST'])
  612.  
  613.  
  614. def detalle_cliente(request, cliente_id):
  615.     cliente = get_object_or_404(Cliente, pk=cliente_id)
  616.     return render(request, 'cliente_detail.html', {'cliente': cliente})
  617.  
  618.  
  619.  
  620. def detalle_cliente_html(request, cliente_id):
  621.     # Obtener el cliente (y sus direcciones) como ya lo haces en cliente_detail
  622.     cliente = get_object_or_404(Cliente, pk=cliente_id)
  623.     return render(request, 'usuarios/detalle_cliente.html', {'cliente': cliente})
  624.  
  625.  
  626.  
  627. # --- Agregado de Reportes y Generación de PDF ---
  628. def generar_pdf_clientes(request):
  629.     response = HttpResponse(content_type='application/pdf')
  630.     response['Content-Disposition'] = 'attachment; filename="reporte_clientes.pdf"'
  631.     pdf = canvas.Canvas(response, pagesize=letter)
  632.     pdf.setTitle("Reporte de Clientes")
  633.     pdf.setFont("Helvetica-Bold", 14)
  634.     pdf.drawString(200, 750, "Reporte de Clientes")
  635.     pdf.setFont("Helvetica", 10)
  636.     clientes = Cliente.objects.all()
  637.     y = 720
  638.     for cliente in clientes:
  639.         pdf.drawString(50, y, f"{cliente.documento} - {cliente.nombre} - {cliente.telefono} - {cliente.email}")
  640.         y -= 20
  641.     pdf.showPage()
  642.     pdf.save()
  643.     return response
  644.  
  645.  
  646. # Vista para listar servicios
  647. def lista_servicios(request):
  648.     servicios = Servicio.objects.all()
  649.     return render(request, 'usuarios/lista_servicios.html', {'servicios': servicios})
  650.  
  651. # Vista para agregar un servicio
  652. def agregar_servicio(request):
  653.     if request.method == "POST":
  654.         nombre = request.POST.get("nombre")
  655.         costo = request.POST.get("costo")
  656.  
  657.         if nombre and costo:
  658.             Servicio.objects.create(nombre=nombre, costo=int(costo))
  659.             messages.success(request, "Servicio agregado correctamente")
  660.             return redirect("servicios")  # Redirige a la lista de servicios
  661.  
  662.     return render(request, "usuarios/lista_servicios.html")
  663.  
  664. # Vista para editar un servicio
  665. def editar_servicio(request, servicio_id):
  666.     servicio = get_object_or_404(Servicio, id=servicio_id)
  667.  
  668.     if request.method == "GET":
  669.         # Retornar datos del servicio en formato JSON
  670.         return JsonResponse({
  671.             "id": servicio.id,
  672.             "nombre": servicio.nombre,
  673.             "costo": servicio.costo
  674.         })
  675.  
  676.     elif request.method == "POST":
  677.         try:
  678.             servicio.nombre = request.POST.get("nombre")
  679.             servicio.costo = int(request.POST.get("costo"))
  680.             servicio.save()
  681.             messages.success(request, "Servicio actualizado correctamente")
  682.             return JsonResponse({"mensaje": "Servicio actualizado correctamente"})
  683.         except Exception as e:
  684.             return JsonResponse({"error": f"Error al actualizar el servicio: {str(e)}"}, status=400)
  685.  
  686.     return JsonResponse({"error": "Método no permitido"}, status=405)
  687.  
  688.  
  689. # Vista para eliminar un servicio
  690. def eliminar_servicio(request, servicio_id):
  691.     servicio = get_object_or_404(Servicio, id=servicio_id)
  692.     servicio.delete()
  693.     messages.success(request, "Servicio eliminado correctamente")
  694.     return JsonResponse({"mensaje": "Servicio eliminado correctamente"})
  695.  
  696.  
  697.    
  698. # Vista para listar contratos
  699. def lista_contratos(request):
  700.     contratos = Contrato.objects.all()
  701.     form = ContratoForm()
  702.     return render(request, "usuarios/lista_contratos.html", {"contratos": contratos, "form": form})
  703.  
  704.  
  705. # Vista para generar número de abonado único
  706. def generar_numero_abonado():
  707.     return "C" + str(random.randint(100000, 999999))
  708.  
  709. def obtener_servicio(request, servicio_id):
  710.     """ Obtiene información de un servicio específico """
  711.     try:
  712.         servicio = get_object_or_404(Servicio, pk=servicio_id)
  713.         return JsonResponse({"id": servicio.id, "nombre": servicio.nombre, "costo": servicio.costo})
  714.     except Exception as e:
  715.         return JsonResponse({'error': f'Ocurrió un error al obtener el servicio: {e}'}, status=500)
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723. # Vista para obtener los datos de un contrato
  724. def obtener_contrato(request, id):
  725.     try:
  726.         contrato = get_object_or_404(Contrato, id=id)
  727.  
  728.         # Construir el nombre completo correctamente
  729.         cliente = contrato.cliente
  730.         cliente_nombre = f"{cliente.nombre} {cliente.apellido_paterno} {cliente.apellido_materno or ''}".strip()
  731.  
  732.         return JsonResponse({
  733.             "success": True,
  734.             "contrato": {
  735.                 "id": contrato.id,
  736.                 "cliente": cliente.id,
  737.                 "cliente_nombre": cliente_nombre,  # ✅ Usa apellido_paterno y apellido_materno
  738.                 "numero_abonado": contrato.numero_abonado,
  739.                 "descripcion": contrato.descripcion,
  740.                 "total": contrato.total
  741.             }
  742.         })
  743.     except Exception as e:
  744.         return JsonResponse({"success": False, "message": f"Error en el servidor: {str(e)}"}, status=500)
  745.  
  746.  
  747. # Vista para editar un registrar_contrato
  748. @csrf_exempt
  749. def obtener_cliente(request, cliente_id):
  750.     """ Devuelve los datos de un cliente en formato JSON. """
  751.     cliente = get_object_or_404(Cliente, id=cliente_id)
  752.     data = {
  753.         "id": cliente.id,
  754.         "documento": cliente.documento,
  755.         "nombre": cliente.nombre,
  756.         "apellido_paterno": cliente.apellido_paterno,
  757.         "apellido_materno": cliente.apellido_materno,
  758.         "telefono": cliente.telefono,
  759.         "email": cliente.email,
  760.         "direccion": cliente.direccion,
  761.         "estatus": cliente.estatus,
  762.     }
  763.     return JsonResponse(data)
  764.  
  765. @csrf_exempt
  766. def editar_cliente(request, cliente_id):
  767.     """ Actualiza un cliente existente. """
  768.     if request.method == "POST":
  769.         try:
  770.             cliente = get_object_or_404(Cliente, id=cliente_id)
  771.             for key, value in request.POST.items():
  772.                 setattr(cliente, key, value)
  773.             cliente.save()
  774.             return JsonResponse({"mensaje": "Cliente actualizado correctamente"}, status=200)
  775.         except Exception as e:
  776.             return JsonResponse({"error": f"Error interno: {str(e)}"}, status=500)
  777.     return JsonResponse({"error": "Método no permitido"}, status=405)
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785. # Vista para eliminar contrato
  786. def eliminar_contrato(request, id):
  787.     if request.method == "DELETE":
  788.         contrato = get_object_or_404(Contrato, id=id)
  789.         contrato.delete()
  790.         return JsonResponse({"success": True})
  791.     return JsonResponse({"success": False, "error": "Método no permitido"}, status=405)
  792.  
  793.  
  794. # Buscar clientes por nombre o documento
  795. def buscar_clientes(request):
  796.     query = request.GET.get("query", "").strip()
  797.     if query:
  798.         clientes = Cliente.objects.filter(nombre__icontains=query) | Cliente.objects.filter(documento__icontains=query)
  799.         data = list(clientes.values("id", "nombre", "documento"))
  800.         return JsonResponse(data, safe=False)
  801.     return JsonResponse([], safe=False)
  802.  
  803.  
  804.  
  805.  
  806.            
  807.  
  808. @csrf_exempt
  809. def agregar_contrato(request):
  810.     """ Agrega un nuevo contrato con sus servicios asociados. """
  811.     if request.method == "POST":
  812.         form = ContratoForm(request.POST)
  813.         if form.is_valid():
  814.             contrato = form.save(commit=False)
  815.             contrato.total = contrato.calcular_total()
  816.             contrato.save()
  817.             form.save_m2m()
  818.             return JsonResponse({"mensaje": "Contrato agregado correctamente"}, status=201)
  819.         return JsonResponse({"error": "Formulario inválido", "detalles": form.errors}, status=400)
  820.     return JsonResponse({"error": "Método no permitido"}, status=405)
  821.  
  822. @csrf_exempt
  823. def editar_contrato(request, id):
  824.     """ Edita los detalles de un contrato existente. """
  825.     contrato = get_object_or_404(Contrato, id=id)
  826.     if request.method == "POST":
  827.         try:
  828.             data = json.loads(request.body.decode("utf-8"))
  829.             for key, value in data.items():
  830.                 setattr(contrato, key, value)
  831.             contrato.save()
  832.             return JsonResponse({"mensaje": "Contrato actualizado correctamente"}, status=200)
  833.         except Exception as e:
  834.             return JsonResponse({"error": f"Error interno: {str(e)}"}, status=500)
  835.     return JsonResponse({"error": "Método no permitido"}, status=405)
  836.  
  837.  
  838.        
  839. def generar_numero_abonado(request):
  840.     """
  841.    Genera un número de abonado único basado en el último contrato registrado.editar_cliente
  842.    """
  843.     ultimo_contrato = Contrato.objects.order_by('-numero_abonado').first()
  844.     nuevo_numero = (ultimo_contrato.numero_abonado + 1) if ultimo_contrato and ultimo_contrato.numero_abonado else 1000
  845.     return JsonResponse({"numero_abonado": nuevo_numero})
  846.  
  847.  
  848. def get_zonas(request):
  849.     zonas = list(Zona.objects.values('id', 'nombre'))
  850.     return JsonResponse({'zonas': zonas})
  851.  
  852. def obtener_avenidas(request):
  853.     """ Devuelve la lista de avenidas filtradas por zona. """
  854.     zona_id = request.GET.get("zona_id")
  855.     avenidas = list(Avenida.objects.filter(zona_id=zona_id).values("id", "nombre")) if zona_id else []
  856.     return JsonResponse({"avenidas": avenidas})
  857.  
  858.  
  859.  
  860.  
  861.  
  862. def obtener_direcciones_cliente(request, cliente_id):
  863.     try:
  864.         direcciones = Direccion.objects.filter(cliente_id=cliente_id).values("id", "direccion")
  865.         return JsonResponse({"direcciones": list(direcciones)})
  866.     except Exception as e:
  867.         print(f"Error al obtener direcciones: {e}")  # Depuración
  868.         return JsonResponse({"error": "Ocurrió un error al obtener las direcciones."}, status=500)
  869.  
  870.  
  871. def obtener_estado_cliente(request, cliente_id):
  872.     try:
  873.         cliente = Cliente.objects.get(id=cliente_id)
  874.         return JsonResponse({'estatus': cliente.estatus})  # Ajusta según el nombre del campo en el modelo
  875.     except Cliente.DoesNotExist:
  876.         return JsonResponse({'error': 'Cliente no encontrado'}, status=404)    
  877.    
  878.    
  879.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement