Advertisement
losvilos

views.py

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

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy