Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Modelo de Datos
Modelo de Datos
Etiquetas Producto
Modelo Entidad-Relación
Campos
Clase Contrato
Campos:
Modelo de datos 1
fecha : Fecha del contrato.
tipo_cobro : Tipo de cobro, que puede ser 'Valor Fijo' o 'Valor Variable'.
'Suspendido' y 'Terminado'.
Relaciones:
Modelo de datos 2
usuario_padre : Relación uno a uno con la clase User con el nombre
contrato_padre .
Clase Descuento
Campos:
Relaciones:
Clase HistoricoContrato
Campos:
Relaciones:
Modelo de datos 3
usuario_modificador : Relación con la clase User con el nombre
contrato_modificador_historico (puede ser nulo).
Clase HistoricoDescuento
Campos:
Relaciones:
Clase Pago
Campos:
estado : Estado del pago, con opciones como 'Pendiente', 'Pagado' y 'Trial'.
Modelo de datos 4
creado_en : Fecha de creación del pago (auto-generada).
Relaciones:
💭 Código
class Contrato(models.Model):
TIPO_FACTURADOR = (
(1, 'IFACTURE'),
(2, 'MI PYME'),
(3, 'OTRO'),
)
TIPO_COBRO = (
(1, 'Valor Fijo'),
(2, 'Valor Variable'),
)
ESTADO = (
(1, 'Pendiente'),
(2, 'Vigente'),
(3, 'Suspendido'),
(4, 'Terminado'),
)
PERIODICIDAD = (
(1, 'Mensual'),
(2, 'Trimestral'),
(3, 'Semestral'),
(4, 'Anual'),
)
MOTIVOS = (
Modelo de datos 5
(1, 'Venta mal realizada'),
(2, 'Funcionalidad'),
(3, 'Falta de Tiempo'),
(4, 'Sin presupuesto/cerró'),
(5, 'Atención al cliente'),
(6, 'Cambios en la plataforma'),
(7, 'Competencia'),
(8, 'Descontento general'),
(9, 'Forma de pago'),
(10, 'Propios'),
(11, 'UX')
)
fecha = models.DateField()
fecha_inicio = models.DateField()
fecha_aprobacion = models.DateField(blank=True, null=True)
tipo_facturador = models.IntegerField(choices=TIPO_FACTURADOR)
numero_DTE = models.IntegerField()
tramo_DTE = JSONField(default=dict, blank=True, null=True)
numero_empresa = models.IntegerField()
tramo_empresa = JSONField(default=dict, blank=True, null=True)
numero_usuario = models.IntegerField()
tramo_usuario = JSONField(default=dict, blank=True, null=True)
tipo_cobro = models.IntegerField(choices=TIPO_COBRO)
monto_cobro = models.DecimalField(max_digits=20, decimal_places=6)
#puede ser monto fijo o base de calculo (tramos)
monto_tope = models.DecimalField(max_digits=20, decimal_places=6,
blank=True, null=True)
monto_onboarding = models.DecimalField(max_digits=20, decimal_plac
es=6)
moneda_onboarding = models.IntegerField()
estado = models.IntegerField(choices=ESTADO)
periodicidad = models.IntegerField(choices=PERIODICIDAD, default=
1)
Modelo de datos 6
# atributos (por defecto)
creado_en = models.DateTimeField(auto_now_add=True)
modificado_en = models.DateTimeField(auto_now=True)
# relaciones
categoria = models.ForeignKey(Categoria, on_delete=models.PROTECT)
usuario_padre = models.OneToOneField(User, on_delete=models.PROTEC
T, related_name='contrato_padre')
usuario_creador = models.ForeignKey(User, on_delete=models.PROTEC
T, blank=True, null=True, related_name='contrato_creador')
usuario_modificador = models.ForeignKey(User, on_delete=models.PRO
TECT, blank=True, null=True, related_name='contrato_modificador')
usuario_aprobador = models.ForeignKey(User, on_delete=models.PROTE
CT, blank=True, null=True, related_name='contrato_aprobador')
grupos = models.ManyToManyField(Group, blank=True)
class Meta:
verbose_name = 'Contrato'
verbose_name_plural = 'Contratos'
def __str__(self):
return str(self.usuario_padre)
class Descuento(models.Model):
# atributos (generales)
porcentaje = models.DecimalField(max_digits=20, decimal_places=2)
periodo_inicio = models.DateField()
periodo_fin = models.DateField()
# relaciones
contrato = models.ForeignKey(Contrato, on_delete=models.CASCADE)
usuario_modificador = models.ForeignKey(User, on_delete=models.PRO
TECT, blank=True, null=True, related_name='user_modificador')
class Meta:
verbose_name = 'Descuento'
verbose_name_plural = 'Descuentos'
Modelo de datos 7
def __str__(self):
return '%s - %s - %s' % (str(self.porcentaje), self.periodo_in
icio, self.periodo_fin)
class HistoricoContrato(models.Model):
fecha = models.DateField()
fecha_inicio = models.DateField()
fecha_aprobacion = models.DateField(blank=True, null=True)
tipo_facturador = models.IntegerField(choices=Contrato.TIPO_FACTUR
ADOR)
numero_DTE = models.IntegerField()
tramo_DTE = JSONField(default=dict, blank=True, null=True)
numero_empresa = models.IntegerField()
tramo_empresa = JSONField(default=dict, blank=True, null=True)
numero_usuario = models.IntegerField()
tramo_usuario = JSONField(default=dict, blank=True, null=True)
tipo_cobro = models.IntegerField(choices=Contrato.TIPO_COBRO)
monto_cobro = models.DecimalField(max_digits=20, decimal_places=6)
#puede ser monto fijo o base de calculo (tramos)
monto_onboarding = models.DecimalField(max_digits=20, decimal_plac
es=6)
moneda_onboarding = models.IntegerField()
estado = models.IntegerField(choices=Contrato.ESTADO)
periodicidad = models.IntegerField(choices=Contrato.PERIODICIDAD,
default=1)
# relaciones
categoria = models.ForeignKey(Categoria, on_delete=models.PROTECT)
usuario_padre = models.ForeignKey(User, on_delete=models.PROTECT,
related_name='contrato_padre_historico')
usuario_modificador = models.ForeignKey(User, on_delete=models.PRO
Modelo de datos 8
TECT, blank=True, null=True, related_name='contrato_modificador_hist
orico')
grupos = models.ManyToManyField(Group, blank=True)
contrato = models.ForeignKey(Contrato, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Historico Contrato'
verbose_name_plural = 'Historico Contratos'
def __str__(self):
return str(self.usuario_padre)
class HistoricoDescuento(models.Model):
# atributos (generales)
porcentaje = models.DecimalField(max_digits=20, decimal_places=2)
periodo_inicio = models.DateField()
periodo_fin = models.DateField()
# relaciones
contrato = models.ForeignKey(HistoricoContrato, on_delete=models.C
ASCADE)
usuario_modificador = models.ForeignKey(User, on_delete=models.PRO
TECT, blank=True, null=True)
class Meta:
verbose_name = 'Historico Descuento'
verbose_name_plural = 'Historico Descuentos'
def __str__(self):
return '%s - %s - %s' % (str(self.porcentaje), self.periodo_in
icio, self.periodo_fin)
class Pago(models.Model):
ESTADO = (
(1, 'Pendiente'),
(2, 'Pagado'),
(3, 'Trial'),
Modelo de datos 9
)
creado_en = models.DateTimeField(auto_now_add=True)
# relaciones
contrato = models.ForeignKey(Contrato, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Pago'
verbose_name_plural = 'Pagos'
def __str__(self):
return '%s - %s' % (str(self.contrato), self.periodo)
Modelo de datos 10