diff --git a/source/app/models/main.py b/source/app/models/main.py index 5be38d9..6d6eb32 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -226,6 +226,86 @@ class Tags(BaseModel): order_by = ('tag',) +class TipoDireccion(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoTitulo(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoTelefono(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoCorreo(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoPariente(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoResponsable(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoMovimientoAlumno(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + +class TipoMovimientoAlmacen(BaseModel): + nombre = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + def __str__(self): + return self.nombre + + class Usuarios(BaseModel): usuario = TextField(unique=True) nombre = TextField(default='') @@ -1074,6 +1154,45 @@ class SATBancos(BaseModel): return {'ok': result} +class SATNivelesEducativos(BaseModel): + name = TextField(index=True) + + class Meta: + order_by = ('name',) + + def __str__(self): + return self.name + + +class NivelesEducativos(BaseModel): + nombre = TextField() + autorizacion = TextField(default='') + + class Meta: + order_by = ('nombre',) + indexes = ( + (('nombre', 'autorizacion'), True), + ) + + def __str__(self): + return '{} ({})'.format(self.nombre, self.autorizacion) + + +class Grupos(BaseModel): + nivel = ForeignKeyField(NivelesEducativos) + grado = TextField(default='') + nombre = TextField(default='') + + class Meta: + order_by = ('nivel', 'grado', 'nombre') + indexes = ( + (('nivel', 'grado', 'nombre'), True), + ) + + def __str__(self): + return '{} {} {}'.format(self.nivel.nombre, self.grado, self.nombre) + + class CuentasBanco(BaseModel): de_emisor = BooleanField(default=False) activa = BooleanField(default=True) @@ -1671,6 +1790,132 @@ class Socios(BaseModel): return bool(q.execute()) +class Contactos(BaseModel): + socio = ForeignKeyField(Socios) + titulo = ForeignKeyField(TipoTitulo) + foto = TextField(default='') + nombre = TextField(index=True) + paterno = TextField(index=True) + materno = TextField(default='') + fecha_nacimiento = DateField(null=True) + notas = TextField(default='') + + class Meta: + order_by = ('socio', 'nombre') + indexes = ( + (('socio', 'nombre', 'paterno', 'materno'), True), + ) + + +class ContactoDirecciones(BaseModel): + contacto = ForeignKeyField(Contactos) + tipo = ForeignKeyField(TipoDireccion) + direccion = TextField() + + class Meta: + order_by = ('contacto',) + indexes = ( + (('contacto', 'tipo', 'direccion'), True), + ) + + +class ContactoTelefonos(BaseModel): + contacto = ForeignKeyField(Contactos) + tipo = ForeignKeyField(TipoTelefono) + telefono = TextField() + + class Meta: + order_by = ('contacto',) + indexes = ( + (('contacto', 'tipo', 'telefono'), True), + ) + + +class ContactoCorreos(BaseModel): + contacto = ForeignKeyField(Contactos) + tipo = ForeignKeyField(TipoCorreo) + correo = TextField() + + class Meta: + order_by = ('contacto',) + indexes = ( + (('contacto', 'tipo', 'correo'), True), + ) + + +class Alumnos(BaseModel): + rfc = TextField(null=True) + curp = TextField(index=True, unique=True) + foto = TextField(default='') + nombre = TextField(index=True) + paterno = TextField(index=True) + materno = TextField(default='') + calle = TextField(default='') + no_exterior = TextField(default='') + no_interior = TextField(default='') + colonia = TextField(default='') + municipio = TextField(default='') + estado = TextField(default='') + pais = TextField(default='') + codigo_postal = TextField(default='') + notas = TextField(default='') + telefonos = TextField(default='') + correos = TextField(default='') + es_activo = BooleanField(default=True) + fecha_alta = DateField(default=util.now) + fecha_nacimiento = DateField(null=True) + factura = ForeignKeyField(Socios, null=True) + grupo = ForeignKeyField(Grupos, null=True) + + def __str__(self): + t = '{} {} {}' + return t.format(self.nombre, self.paterno, self.materno) + + class Meta: + order_by = ('nombre', 'paterno') + + +class AlumnosParientes(BaseModel): + alumno = ForeignKeyField(Alumnos) + tipo_pariente = ForeignKeyField(TipoPariente) + foto = TextField(default='') + nombre = TextField(index=True) + paterno = TextField(index=True) + materno = TextField(default='') + fecha_nacimiento = DateField(null=True) + puede_recoger = BooleanField(default=False) + + class Meta: + order_by = ('alumno',) + + +class ParienteDirecciones(BaseModel): + pariente = ForeignKeyField(AlumnosParientes) + tipo = ForeignKeyField(TipoDireccion) + direccion = TextField() + + class Meta: + order_by = ('pariente',) + + +class ParienteTelefonos(BaseModel): + pariente = ForeignKeyField(AlumnosParientes) + tipo = ForeignKeyField(TipoTelefono) + telefono = TextField() + + class Meta: + order_by = ('pariente',) + + +class ParienteCorreos(BaseModel): + pariente = ForeignKeyField(AlumnosParientes) + tipo = ForeignKeyField(TipoCorreo) + correo = TextField() + + class Meta: + order_by = ('pariente',) + + class Almacenes(BaseModel): nombre = TextField(default='') ubicacion = TextField(default='') @@ -3212,24 +3457,6 @@ class FacturasComplementos(BaseModel): return {r.nombre: util.loads(r.valores) for r in query} -# ~ class CfdiPagosFacturas(BaseModel): - # ~ pago = ForeignKeyField(CfdiPagos) - # ~ factura = ForeignKeyField(Facturas) - # ~ numero = IntegerField(default=1) - # ~ saldo_anterior = DecimalField(default=0.0, max_digits=20, decimal_places=6, - # ~ auto_round=True) - # ~ importe = DecimalField(default=0.0, max_digits=18, decimal_places=6, - # ~ auto_round=True) - # ~ saldo = DecimalField(default=0.0, max_digits=18, decimal_places=6, - # ~ auto_round=True) - - # ~ class Meta: - # ~ order_by = ('pago',) - # ~ indexes = ( - # ~ (('pago', 'factura', 'numero'), True), - # ~ ) - - class PreFacturasRelacionadas(BaseModel): factura = ForeignKeyField(PreFacturas, related_name='original') factura_origen = ForeignKeyField(PreFacturas, related_name='relacion') @@ -3511,6 +3738,94 @@ class PreFacturasImpuestos(BaseModel): return data +class CamposPersonalizados(BaseModel): + nombre = TextField() + slug = TextField(unique=True) + + class Meta: + order_by = ('nombre',) + + +class FacturasPersonalizados(BaseModel): + factura = ForeignKeyField(Facturas) + campo = TextField() + valor = TextField() + + class Meta: + order_by = ('factura',) + + +class Tickets(BaseModel): + cliente = ForeignKeyField(Socios, null=True) + serie = TextField(default='') + folio = IntegerField(default=0) + fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S']) + forma_pago = TextField(default='') + subtotal = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + descuento = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + total = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + total_trasladados = DecimalField( + max_digits=20, decimal_places=6, auto_round=True, null=True) + estatus = TextField(default='Generado') + notas = TextField(default='') + factura = ForeignKeyField(Facturas, null=True) + cancelado = BooleanField(default=False) + vendedor = TextField(default='') + comision = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + cambio = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + + class Meta: + order_by = ('fecha',) + + +class TicketsDetalle(BaseModel): + ticket = ForeignKeyField(Tickets) + producto = ForeignKeyField(Productos, null=True) + descripcion = TextField(default='') + cantidad = DecimalField(default=0.0, max_digits=18, decimal_places=6, + auto_round=True) + valor_unitario = DecimalField(default=0.0, max_digits=18, decimal_places=6, + auto_round=True) + descuento = DecimalField(default=0.0, max_digits=18, decimal_places=6, + auto_round=True) + precio_final = DecimalField(default=0.0, max_digits=18, decimal_places=6, + auto_round=True) + importe = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + + class Meta: + order_by = ('ticket',) + + +class TicketsImpuestos(BaseModel): + ticket = ForeignKeyField(Tickets) + impuesto = ForeignKeyField(SATImpuestos) + base = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + importe = DecimalField(default=0.0, max_digits=18, decimal_places=6, + auto_round=True) + + class Meta: + order_by = ('ticket',) + indexes = ( + (('ticket', 'impuesto'), True), + ) + + +class SeriesProductos(BaseModel): + factura = ForeignKeyField(FacturasDetalle, null=True) + ticket = ForeignKeyField(TicketsDetalle, null=True) + serie = TextField(default='') + + class Meta: + order_by = ('serie',) + + def authenticate(args): respuesta = {'login': False, 'msg': 'No Autorizado', 'user': ''} values = util.get_con(args['rfc']) @@ -3626,15 +3941,22 @@ def _init_values(rfc): def _crear_tablas(rfc): tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion, - Folios, Registro, + Folios, Registro, CamposPersonalizados, Emisor, Facturas, FacturasDetalle, FacturasImpuestos, FacturasPagos, - FacturasRelacionadas, FacturasComplementos, Almacenes, Productos, + FacturasRelacionadas, FacturasComplementos, FacturasPersonalizados, + SeriesProductos, Almacenes, Productos, PreFacturas, PreFacturasDetalle, PreFacturasImpuestos, - PreFacturasRelacionadas, + PreFacturasRelacionadas, Tickets, TicketsDetalle, TicketsImpuestos, SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes, SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos, - Socios, Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco, - CfdiPagos, + SATNivelesEducativos, + Socios, Contactos, ContactoCorreos, ContactoDirecciones, + ContactoTelefonos, + Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco, + TipoCorreo, TipoDireccion, TipoPariente, TipoResponsable, TipoTelefono, + TipoTitulo, TipoMovimientoAlumno, TipoMovimientoAlmacen, + CfdiPagos, NivelesEducativos, Alumnos, AlumnosParientes, Grupos, + ParienteDirecciones, ParienteTelefonos, ParienteCorreos, Emisor.regimenes.get_through_model(), Socios.tags.get_through_model(), Productos.impuestos.get_through_model(), diff --git a/source/app/settings.py b/source/app/settings.py index bc3bc44..58a0807 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -21,7 +21,7 @@ except ImportError: DEBUG = DEBUG -VERSION = '0.2.1' +VERSION = '1.2.0' EMAIL_SUPPORT = ('soporte@empresalibre.net',) BASE_DIR = os.path.abspath(os.path.dirname(__file__)) diff --git a/source/db/valores_iniciales.json b/source/db/valores_iniciales.json index 27e6b54..fd4f604 100644 --- a/source/db/valores_iniciales.json +++ b/source/db/valores_iniciales.json @@ -27,6 +27,16 @@ {"key": "ACT", "name": "Actividad", "activo": false} ] }, +{ + "tabla": "SATNivelesEducativos", + "datos": [ + {"name": "Preescolar"}, + {"name": "Primaria"}, + {"name": "Secundaria"}, + {"name": "Profesional técnico"}, + {"name": "Bachillerato o su equivalente"} + ] +}, { "tabla": "SATTipoRelacion", "datos": [