2010/1/19 mf <mf2
...@gmail.com>:
> Hola, hace un tiempo realicé una aplicación para la administración de
Hola ¿mf?
Voy detallando algunas cosas y al final estaría mi propuesta de models.py.
Cabe aclarar que no sería la aplicación completa, habría que continuar
el trabajo de diseño.
> - A ciertos alumnos se les puede hacer una "atención" por lo que pasan
> a tener una cuota especial.
Esto estaría resuelto con las "Listas de precio".
> - El monto de la cuota puede cambiar en el transcurso del año.
Esto estaría resuelto con las "Listas de precio".
> - La cuota se puede pagar un poco un día otro poco otro, por lo que no
> le veo sentido a que cada cuota tenga un campo "fecha de pago".
Esto estaría resuelto con los "Comprobantes".
> - Se pagan por adelantado del 1 al 10 del mes en curso.
Se generaría un comprobante tipo "Recibo".
> - Computación, taller, comedor se agregan al monto del valor de la
> cuota base y son opcionales.
Cada cliente puede tener uno o más abonos asociados.
> Por lo tanto, el campo monto de c/ Cuota depende de los campos de
> Alumno. Si existe una cuota especial todo lo demás no importa, en otro
> caso se hace la suma de valores.
Los precios por lista de precio te podría solucionar esto.
> Mis dudas al respecto son las siguientes:
> -Como las cuotas se pueden pagar en diferentes días, para registrar
> cada pago: ¿estaría bien crear otra tabla Pago, o hay algo que no
> estoy viendo?
Yo pondría, tal cual está en mi versión del models.py todo en una
misma tabla (Facturas y recibos). Luego a sacar cuenta para saber
saldos.
> -Como yo lo pensé, los registros de las cuotas se deberían llenar
> previamente al pago. De esta forma cuando un pago es realizado se
> descuenta de la cuota determinada.
> -No tengo bien en claro como llevar a cabo el punto anterior, cuando
> crear las cuotas de cada mes.
Habría que crea un proceso que automatice la creación de facturas
(Comprobantes tipo factura) basándose en los abonos que cada cliente
tiene "Activo".
> Me parece que estoy haciendo difícil algo que debe ser fácil de
> resolver pero la verdad que no se me ocurrió otra forma de hacerlo.
> Si alguien quiere ver como es mi models.py por el momento les dejo el
> link: http://pastebin.com/m5d9a0e8b.
> Muchas gracias por su ayuda.
De nada, espero que sirva el aporte.
> --
> Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
> Si quieres publicar en este grupo, envía un mensaje de correo
> electrónico a django-es@googlegroups.com
> Para anular la suscripción a este grupo, envíe un mensaje a django-es-unsubscribe@googlegroups.com
> Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
Adjunto un ejemplo de models.py (
http://pastebin.com/f75ae270d) que no
está probado (puede contener errores).
# Ejemplos de listas de precio:
# * "Efectivo"
# * "Tarjeta de crédito"
# * "Tarjeta de débito"
# * "Atención por familia"
# * "Promoción Sumate Ya!"
class ListaPrecio(models.Model):
descripcion = models.CharField("Descripción", max_length=50)
def __unicode__(self):
return self.descripcion
class Meta:
verbose_name = "Lista de precio"
verbose_name_plural = "Listas de precio"
# Ejemplos de productos:
# * "Abono escolar"
# * "Computación"
# * "Taller"
# * "Comedor"
class Producto(models.Model):
descripcion = models.CharField(max_length=50)
def __unicode__(self):
return self.descripcion
# Ejemplos de clientes:
# * "José Luis", "Efectivo"
# * "Natalia", "Atención por familia"
# * "Leslie", "Efectivo"
# * "Agustina", "Atención por familia"
# * "Valentina", "Promoción Sumate Ya!"
class Cliente(models.Model):
# Datos generales
...
# Esta seria la lista de precios a aplicar a un cliente en particular.
# En el caso de los clientes con "Promociones" ciertos productos
podrían tener importe 0 (bonificados)
lista_precio = ForeignKey(ListaPrecio)
# Ejemplos de abonos:
# * "José Luis", "Abono escolar", 2010-03-01, 2010-11-30
# * "José Luis", "Comedor", 2010-07-01, 2010-11-30
# * "Valentina", "Abono escolar", 2010-03-01, 2010-11-30
# * "Valentina", "Comedor", 2010-03-01, 2010-11-30
# * "Valentina", "Computación", 2010-03-01, 2010-11-30
class Abono(models.Model):
cliente = ForeignKey(Cliente)
producto = ForeignKey(Producto)
vigencia_desde = models.DateField()
vigencia_hasta = models.DateField()
# Ejemplo de precios:
# * "Efectivo", "Abono escolar", 2010-01-01, 120.00
# * "Efectivo", "Comedor", 2010-01-01, 35.00
# * "Efectivo", "Computación", 2010-01-01, 50.00
# Nótese que en la promoción siguiente el Abono escolar es un poco más
alto, pero incluye Comedor y Computación (están con importe en cero).
# * "Promoción Sumate Ya!", "Abono escolar", 2010-01-01, 150.00
# * "Promoción Sumate Ya!", "Comedor", 2010-01-01, 0.00
# * "Promoción Sumate Ya!", "Computación", 2010-01-01, 0.00
class Precio(models.Model):
lista_precio = ForeignKey(ListaPrecio)
producto = ForeignKey(Producto)
vigencia = models.DateField()
importe = models.DecimalField(max_digits=10, decimal_places=2)
# Esta tabla posiblemente no habría que editarla, si no entregarla
como parte de la aplicación ya cargada.
# Habría que confirmar con alguien que tenga conocimientos contables
mejores que los míos para corroborar si el DEB/CRED de cada tipo de
comprobante está bien especificado.
# Ejemplo de tipos de comprobantes:
# * "F", "Factura", "D"
# * "R", "Recibo", "C"
# * "D", "Nota de débito", "D"
# * "C", "Nota de crédito", "C"
class ComprobanteTipo(models.Model):
DEBCRED_CHOICES = (
('D', 'Débito'),
('C', 'Crédito'),
)
id = models.CharField(max_length=1, primary_key=True)
descripcion = models.CharField(max_length=50)
debito_credito = models.CharField(max_length=1, choices=DEBCRED_CHOICES)
def __unicode__(self):
return self.descripcion
class Meta:
verbose_name = "Tipo de comprobante"
verbose_name_plural = "Tipos de comprobante"
# Ejemplo de comprobantes:
# * "Factura", "C", 0, 1, 2010-03-01, "José Luis", 120.00, 2010-03-10
# * "Factura", "C", 0, 2, 2010-03-01, "Valentina", 150.00, 2010-03-10
# * "Recibo", "X", 0, 1, 2010-03-05, "Valentina", 150.00, Null
class Comprobante(models.Model):
LETRA_CHOICES = (
('A', 'A'),
('B', 'B'),
('C', 'C'),
('X', 'X'),
)
tipo = ForeignKey(ComprobanteTipo)
letra = models.CharField(max_length=1, choices=LETRA_CHOICES)
sucursal = models.PositiveIntegerField()
numero = models.PositiveIntegerField()
fecha = models.DateField()
cliente = ForeignKey(Cliente)
importe = models.DecimalField(max_digits=10, decimal_places=2)
vencimiento = models.DateField(null=True, blank=True)
def __unicode__(self):
return "%s-%s-%i-%i" % (self.tipo, self.letra, self.sucursal,
self.numero)
# Ejemplo de líneas de comprobantes:
# * "Factura-C-0-1", "Abono escolar" # "Factura-C-0-1" -> tipo
"Factura", letra C, sucursal 0, numero 1
# * "Factura-C-0-2", "Abono escolar"
# * "Factura-C-0-2", "Comedor"
# * "Factura-C-0-2", "Computación"
class ComprobanteLinea(models.Model):
comprobante = ForeignKey(Comprobante)
producto = ForeignKey(Producto)
class Meta:
verbose_name = "Línea de comprobante"
verbose_name_plural = "Líneas de comprobante"
--
---
José Luis DALLAPICCOLA
Neuquén Capital
Patagonia Argentina