Advertisement
losvilos

models

Feb 27th, 2025 (edited)
284
0
18 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.24 KB | Help | 0 0
  1. from django.contrib.auth.models import AbstractUser
  2. from django.db import models
  3. import datetime  # Agrega esto arriba si no está
  4. from django.test import TestCase
  5. from django.utils.timezone import now
  6. from datetime import timedelta
  7. from django.test import TestCase
  8. from django.utils.timezone import now
  9. from datetime import timedelta
  10. from django.apps import apps  # Importación para evitar errores circulares
  11.  
  12. class Rol(models.Model):
  13.     nombre = models.CharField(max_length=50, unique=True)
  14.     fecha_registro = models.DateTimeField(auto_now_add=True)
  15.  
  16.     def __str__(self):
  17.         return self.nombre
  18.  
  19. class Usuario(AbstractUser):
  20.     rol = models.ForeignKey(Rol, on_delete=models.SET_NULL, null=True, blank=True)
  21.     estatus = models.BooleanField(default=True, verbose_name="Activo")
  22.  
  23.     def __str__(self):
  24.         return self.username
  25.  
  26. class Empleado(models.Model):
  27.     nombre = models.CharField(max_length=100)
  28.     apellido = models.CharField(max_length=100)
  29.     dni = models.CharField(max_length=15, unique=True)
  30.     rol = models.ForeignKey(Rol, on_delete=models.SET_NULL, null=True)
  31.     fecha_registro = models.DateTimeField(auto_now_add=True)
  32.  
  33.     def __str__(self):
  34.         return f"{self.nombre} {self.apellido}"  
  35.  
  36. class Zona(models.Model):
  37.     nombre = models.CharField(max_length=100, unique=True)
  38.     fecha_actualizacion = models.DateTimeField(auto_now=True)
  39.     estatus = models.BooleanField(default=True)
  40.  
  41.     def __str__(self):
  42.         return self.nombre
  43.  
  44. class Cliente(models.Model):
  45.     documento = models.CharField(max_length=20, unique=True, verbose_name="Documento")
  46.     nombre = models.CharField(max_length=100, verbose_name="Nombre")
  47.     apellido_paterno = models.CharField(max_length=100, verbose_name="Apellido Paterno")
  48.     apellido_materno = models.CharField(max_length=100, blank=True, null=True, verbose_name="Apellido Materno")
  49.     fecha_nacimiento = models.DateField(verbose_name="Fecha de Nacimiento")
  50.     sexo = models.CharField(max_length=1, choices=[("M", "Masculino"), ("F", "Femenino")], verbose_name="Sexo")
  51.     telefono = models.CharField(max_length=20, verbose_name="Teléfono")
  52.     email = models.EmailField(blank=True, null=True, verbose_name="Correo Electrónico")
  53.     estatus = models.BooleanField(default=True, verbose_name="Estatus")
  54.     numero_cliente = models.CharField(max_length=50, blank=True, null=True, verbose_name="Número de Cliente")
  55.  
  56.     def __str__(self):
  57.         return f"{self.nombre} {self.apellido_paterno}"
  58.  
  59.     class Meta:
  60.         verbose_name = "Cliente"
  61.         verbose_name_plural = "Clientes"
  62.         ordering = ["apellido_paterno", "nombre"]
  63.  
  64. class Direccion(models.Model):
  65.     cliente = models.ForeignKey('usuarios.Cliente', on_delete=models.CASCADE, related_name="direcciones")
  66.     zona = models.ForeignKey('usuarios.Zona', on_delete=models.CASCADE, verbose_name="Zona")
  67.     avenida = models.ForeignKey('usuarios.Avenida', on_delete=models.CASCADE, verbose_name="Avenida")
  68.     direccion = models.CharField(max_length=255, verbose_name="Dirección")
  69.  
  70.     def __str__(self):
  71.         return f"{self.direccion} - {self.avenida.nombre} ({self.cliente.nombre})"
  72.  
  73. class Avenida(models.Model):
  74.     nombre = models.CharField(max_length=100)
  75.     zona = models.ForeignKey(Zona, on_delete=models.CASCADE, related_name="avenidas")
  76.  
  77.     def __str__(self):
  78.         return f"{self.nombre} - {self.zona.nombre}"
  79.  
  80. class Servicio(models.Model):
  81.     nombre = models.CharField(max_length=255, verbose_name="Nombre del Servicio")
  82.     costo = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Costo del Servicio")  # Usar DecimalField
  83.     fecha_registro = models.DateField(auto_now_add=True, verbose_name="Fecha de Registro")
  84.  
  85.     def __str__(self):
  86.         return self.nombre
  87.  
  88.     class Meta:
  89.         verbose_name = "Servicio"
  90.         verbose_name_plural = "Servicios"
  91.         ordering = ["nombre"]  # Orden predeterminado en el admin
  92.    
  93. class Contrato(models.Model):
  94.     cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, verbose_name="Cliente")
  95.     numero_abonado = models.IntegerField(unique=True, null=True, blank=True, verbose_name="Número de Abonado")
  96.     descripcion = models.TextField(blank=True, null=True, verbose_name="Descripción")
  97.     fecha_registro = models.DateField(auto_now_add=True, verbose_name="Fecha de Registro")
  98.     total = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="Total")  # DecimalField
  99.     estado = models.BooleanField(default=True, verbose_name="Estado")
  100.     servicios = models.ManyToManyField(Servicio, verbose_name="Servicios")
  101.  
  102.     def __str__(self):
  103.         return f"Contrato {self.numero_abonado} - {self.cliente.nombre}"
  104.  
  105.     def calcular_total(self):
  106.         self.total = sum(servicio.costo for servicio in self.servicios.all())
  107.         self.save()
  108.  
  109.     def save(self, *args, **kwargs):
  110.         if not self.numero_abonado:  # Generar número si no existe
  111.             self.numero_abonado = self.generar_numero_abonado()
  112.         super().save(*args, **kwargs)
  113.  
  114.     @staticmethod
  115.     def generar_numero_abonado():
  116.         """
  117.        Genera un número de abonado basado en el último registrado.
  118.        """
  119.         ultimo_contrato = Contrato.objects.order_by('-numero_abonado').first()
  120.         return (ultimo_contrato.numero_abonado + 1) if ultimo_contrato and ultimo_contrato.numero_abonado else 1000
  121.  
  122.     class Meta:
  123.         verbose_name = "Contrato"
  124.         verbose_name_plural = "Contratos"
  125.         ordering = ["-fecha_registro"]  # Orden predeterminado por fecha de registro descendente
  126.  
  127.     def calcular_total(self):
  128.         self.total = sum(servicio.costo for servicio in self.servicios.all())
  129.         self.save()
  130.  
  131.     def save(self, *args, **kwargs):
  132.         if not self.numero_abonado:  # Generar número si no existe
  133.             self.numero_abonado = self.generar_numero_abonado()
  134.         super().save(*args, **kwargs)
  135.  
  136.     @staticmethod
  137.     def generar_numero_abonado():
  138.         """
  139.        Genera un número de abonado basado en el último registrado.
  140.        """
  141.         ultimo_contrato = Contrato.objects.order_by('-numero_abonado').first()
  142.         return (ultimo_contrato.numero_abonado + 1) if ultimo_contrato and ultimo_contrato.numero_abonado else 1000
  143.    
  144.    
  145.    
  146.  
  147.  
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement