Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from django.contrib.auth.models import AbstractUser
- from django.db import models
- import datetime # Agrega esto arriba si no está
- from django.test import TestCase
- from django.utils.timezone import now
- from datetime import timedelta
- from django.test import TestCase
- from django.utils.timezone import now
- from datetime import timedelta
- from django.apps import apps # Importación para evitar errores circulares
- class Rol(models.Model):
- nombre = models.CharField(max_length=50, unique=True)
- fecha_registro = models.DateTimeField(auto_now_add=True)
- def __str__(self):
- return self.nombre
- class Usuario(AbstractUser):
- rol = models.ForeignKey(Rol, on_delete=models.SET_NULL, null=True, blank=True)
- estatus = models.BooleanField(default=True, verbose_name="Activo")
- def __str__(self):
- return self.username
- class Empleado(models.Model):
- nombre = models.CharField(max_length=100)
- apellido = models.CharField(max_length=100)
- dni = models.CharField(max_length=15, unique=True)
- rol = models.ForeignKey(Rol, on_delete=models.SET_NULL, null=True)
- fecha_registro = models.DateTimeField(auto_now_add=True)
- def __str__(self):
- return f"{self.nombre} {self.apellido}"
- class Zona(models.Model):
- nombre = models.CharField(max_length=100, unique=True)
- fecha_actualizacion = models.DateTimeField(auto_now=True)
- estatus = models.BooleanField(default=True)
- def __str__(self):
- return self.nombre
- class Cliente(models.Model):
- documento = models.CharField(max_length=20, unique=True, verbose_name="Documento")
- nombre = models.CharField(max_length=100, verbose_name="Nombre")
- apellido_paterno = models.CharField(max_length=100, verbose_name="Apellido Paterno")
- apellido_materno = models.CharField(max_length=100, blank=True, null=True, verbose_name="Apellido Materno")
- fecha_nacimiento = models.DateField(verbose_name="Fecha de Nacimiento")
- sexo = models.CharField(max_length=1, choices=[("M", "Masculino"), ("F", "Femenino")], verbose_name="Sexo")
- telefono = models.CharField(max_length=20, verbose_name="Teléfono")
- email = models.EmailField(blank=True, null=True, verbose_name="Correo Electrónico")
- estatus = models.BooleanField(default=True, verbose_name="Estatus")
- numero_cliente = models.CharField(max_length=50, blank=True, null=True, verbose_name="Número de Cliente")
- def __str__(self):
- return f"{self.nombre} {self.apellido_paterno}"
- class Meta:
- verbose_name = "Cliente"
- verbose_name_plural = "Clientes"
- ordering = ["apellido_paterno", "nombre"]
- class Direccion(models.Model):
- cliente = models.ForeignKey('usuarios.Cliente', on_delete=models.CASCADE, related_name="direcciones")
- zona = models.ForeignKey('usuarios.Zona', on_delete=models.CASCADE, verbose_name="Zona")
- avenida = models.ForeignKey('usuarios.Avenida', on_delete=models.CASCADE, verbose_name="Avenida")
- direccion = models.CharField(max_length=255, verbose_name="Dirección")
- def __str__(self):
- return f"{self.direccion} - {self.avenida.nombre} ({self.cliente.nombre})"
- class Avenida(models.Model):
- nombre = models.CharField(max_length=100)
- zona = models.ForeignKey(Zona, on_delete=models.CASCADE, related_name="avenidas")
- def __str__(self):
- return f"{self.nombre} - {self.zona.nombre}"
- class Servicio(models.Model):
- nombre = models.CharField(max_length=255, verbose_name="Nombre del Servicio")
- costo = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Costo del Servicio") # Usar DecimalField
- fecha_registro = models.DateField(auto_now_add=True, verbose_name="Fecha de Registro")
- def __str__(self):
- return self.nombre
- class Meta:
- verbose_name = "Servicio"
- verbose_name_plural = "Servicios"
- ordering = ["nombre"] # Orden predeterminado en el admin
- class Contrato(models.Model):
- cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, verbose_name="Cliente")
- numero_abonado = models.IntegerField(unique=True, null=True, blank=True, verbose_name="Número de Abonado")
- descripcion = models.TextField(blank=True, null=True, verbose_name="Descripción")
- fecha_registro = models.DateField(auto_now_add=True, verbose_name="Fecha de Registro")
- total = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="Total") # DecimalField
- estado = models.BooleanField(default=True, verbose_name="Estado")
- servicios = models.ManyToManyField(Servicio, verbose_name="Servicios")
- def __str__(self):
- return f"Contrato {self.numero_abonado} - {self.cliente.nombre}"
- def calcular_total(self):
- self.total = sum(servicio.costo for servicio in self.servicios.all())
- self.save()
- def save(self, *args, **kwargs):
- if not self.numero_abonado: # Generar número si no existe
- self.numero_abonado = self.generar_numero_abonado()
- super().save(*args, **kwargs)
- @staticmethod
- def generar_numero_abonado():
- """
- Genera un número de abonado basado en el último registrado.
- """
- ultimo_contrato = Contrato.objects.order_by('-numero_abonado').first()
- return (ultimo_contrato.numero_abonado + 1) if ultimo_contrato and ultimo_contrato.numero_abonado else 1000
- class Meta:
- verbose_name = "Contrato"
- verbose_name_plural = "Contratos"
- ordering = ["-fecha_registro"] # Orden predeterminado por fecha de registro descendente
- def calcular_total(self):
- self.total = sum(servicio.costo for servicio in self.servicios.all())
- self.save()
- def save(self, *args, **kwargs):
- if not self.numero_abonado: # Generar número si no existe
- self.numero_abonado = self.generar_numero_abonado()
- super().save(*args, **kwargs)
- @staticmethod
- def generar_numero_abonado():
- """
- Genera un número de abonado basado en el último registrado.
- """
- ultimo_contrato = Contrato.objects.order_by('-numero_abonado').first()
- return (ultimo_contrato.numero_abonado + 1) if ultimo_contrato and ultimo_contrato.numero_abonado else 1000
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement