· 10 months ago · Mar 01, 2025, 03:25 AM
1from django.contrib import messages
2from django.views.decorators.http import require_http_methods
3from django.contrib.auth import authenticate, login, logout
4from django.contrib.auth.decorators import login_required, user_passes_test
5from django.http import HttpResponse, JsonResponse, HttpResponseNotAllowed
6from django.shortcuts import get_object_or_404, render, redirect
7from django.views.decorators.csrf import csrf_exempt
8from reportlab.lib.pagesizes import letter
9from reportlab.pdfgen import canvas
10import random, json
11from .models import Cliente, Contrato, Servicio, Usuario, Rol, Empleado, Zona, Direccion, Zona
12from .forms import ClienteForm, ContratoForm # Importa los formularios
13from django.core.paginator import Paginator
14from django.db.models import Q # Importa Q para consultas OR
15from .forms import ContratoForm, ClienteForm, DireccionFormSet
16import traceback
17
18
19def 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
39def 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
51def logout_view(request):
52 logout(request)
53 return redirect('login') # Redirigir al login después de cerrar sesión
54
55@login_required
56def dashboard(request):
57 return render(request, 'usuarios/dashboard.html')
58
59### CRUD USUARIOS ###
60
61@login_required
62def 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
68def 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
86def 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
93def 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
142def lista_empleados(request):
143 empleados = Empleado.objects.all()
144 return render(request, 'usuarios/lista_empleados.html', {'empleados': empleados})
145
146@login_required
147def 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
163def 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
179def 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
188def lista_roles(request):
189 roles = Rol.objects.all()
190 return render(request, 'usuarios/lista_roles.html', {'roles': roles})
191
192@login_required
193def 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
203def 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
215def 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
222def 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
253def 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
260def 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
267def 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/')
274def 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/')
310def 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/')
318def 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/')
324def 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/')
335def 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
342def lista_zonas(request):
343 zonas = Zona.objects.all()
344 return render(request, "usuarios/lista_zonas.html", {"zonas": zonas})
345
346def 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
354def 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
363def 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
369def 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
388def 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
409def get_zonas(request):
410 zonas = list(Zona.objects.values('id', 'nombre'))
411 return JsonResponse({'zonas': zonas})
412
413@require_http_methods(["GET", "POST"])
414def 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
472def 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
484from django.http import JsonResponse
485from django.views.decorators.csrf import csrf_exempt
486from .models import Cliente
487from .forms import ClienteForm
488
489@csrf_exempt
490def 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
529def 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
564def 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
569def 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 ---
577def 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
596def 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
601def 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
614def 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
639def 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
648def 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
655def generar_numero_abonado():
656 return "C" + str(random.randint(100000, 999999))
657
658def 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
667def 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
692def 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
709def 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
723def 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
732def 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
742def 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
756def 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
772def 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
781def get_zonas(request):
782 zonas = list(Zona.objects.values('id', 'nombre'))
783 return JsonResponse({'zonas': zonas})
784
785def 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
794def 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)