From 9cb6dbf0b2570b7b44f3f191baceeb72529b71c9 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Thu, 23 Nov 2017 23:56:03 -0600 Subject: [PATCH] =?UTF-8?q?Agregar=20dep=C3=B3sitos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/app/controllers/main.py | 7 ++ source/app/models/db.py | 5 + source/app/models/main.py | 165 ++++++++++++++++++-------- source/static/js/controller/bancos.js | 99 +++++++++++++++- source/static/js/ui/bancos.js | 8 ++ 5 files changed, 234 insertions(+), 50 deletions(-) diff --git a/source/app/controllers/main.py b/source/app/controllers/main.py index 183a479..bc3ac45 100644 --- a/source/app/controllers/main.py +++ b/source/app/controllers/main.py @@ -294,6 +294,13 @@ class AppMovimientosBanco(object): req.context['result'] = self._db.add_movbanco(values) resp.status = falcon.HTTP_200 + def on_delete(self, req, resp): + values = req.params + if self._db.delete('movbanco', values['id']): + resp.status = falcon.HTTP_200 + else: + resp.status = falcon.HTTP_204 + class AppFolios(object): diff --git a/source/app/models/db.py b/source/app/models/db.py index a74fc7e..4b8c81d 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -17,6 +17,9 @@ class StorageEngine(object): def _get_configtimbrar(self, values): return main.config_timbrar() + def _get_saldocuenta(self, values): + return main.CuentasBanco.get_saldo(values['id']) + def _get_validartimbrar(self, values): return main.validar_timbrar() @@ -169,6 +172,8 @@ class StorageEngine(object): return main.SATImpuestos.remove(id) if table == 'cuentasbanco': return main.CuentasBanco.remove(id) + if table == 'movbanco': + return main.MovimientosBanco.remove(id) return False def _get_client(self, values): diff --git a/source/app/models/main.py b/source/app/models/main.py index 21838bb..c927365 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -219,6 +219,28 @@ class Usuarios(BaseModel): order_by = ('nombre', 'apellidos') +class Registro(BaseModel): + usuario = TextField() + accion = TextField(default='') + tabla = TextField(default='') + fecha = DateTimeField(default=util.now) + + def __str__(self): + t = '{} {}-{} ({})' + return t.format(self.usuario, self.accion, self.tabla, self.fecha) + + class Meta: + order_by = ('usuario', 'fecha') + + @classmethod + def add(cls, values): + try: + Registro.create(**values) + return + except: + return + + class SATRegimenes(BaseModel): key = TextField(index=True, unique=True) name = TextField(index=True) @@ -960,6 +982,14 @@ class CuentasBanco(BaseModel): q = CuentasBanco.update(**fields).where(CuentasBanco.id==id) return bool(q.execute()) + @classmethod + def get_saldo(cls, id): + try: + obj = CuentasBanco.get(CuentasBanco.id==id) + return obj.saldo + except CuentasBanco.DoesNotExist: + return 0 + @classmethod def remove(cls, id): try: @@ -1093,6 +1123,8 @@ class MovimientosBanco(BaseModel): auto_round=True) saldo = DecimalField(default=0.0, max_digits=20, decimal_places=6, auto_round=True) + cancelado = BooleanField(default=False) + conciliado = BooleanField(default=False) moneda = TextField(default='MXN') # Complemento de pagos tipo_cambio = DecimalField(default=1.0, max_digits=15, decimal_places=6, auto_round=True) @@ -1115,34 +1147,41 @@ class MovimientosBanco(BaseModel): .select() .where( (MovimientosBanco.cuenta==cuenta) & - (MovimientosBanco.fecharow.fecha)) + (MovimientosBanco.fecha>row.fecha) & + (MovimientosBanco.cancelado==False)) ) - saldo = row.saldo - if row.retiro: - importe = row.retiro * -1 - else: - importe = row.deposito - + saldo = round(Decimal(row.saldo), DECIMALES) for mov in query: - mov.saldo = saldo + importe + mov.saldo = saldo + mov.deposito - mov.retiro mov.save() saldo = mov.saldo - CuentasBanco.actualizar_saldo(None, saldo) + CuentasBanco.actualizar_saldo(row.cuenta, saldo) return saldo @classmethod def add(cls, values): - #~ print(values) + ids = values.pop('ids', '') actualizar = False if not 'saldo' in values: actualizar = True @@ -1167,9 +1206,30 @@ class MovimientosBanco(BaseModel): if actualizar: saldo = cls._actualizar_saldos(cls, obj) + if ids: + FacturasPagos.add(obj, util.loads(ids)) return {'ok': True, 'saldo': saldo} + @classmethod + def remove(cls, id): + try: + obj = MovimientosBanco.get(MovimientosBanco.id==id) + except MovimientosBanco.DoesNotExist: + return False + + if obj.conciliado or obj.cancelado: + return False + + with database_proxy.transaction(): + obj.cancelado = True + obj.save() + + obj = cls._movimiento_anterior(cls, obj.cuenta, obj.fecha) + cls._actualizar_saldos(cls, obj) + + return True + @classmethod def con(cls, id): cant = (MovimientosBanco @@ -1191,7 +1251,10 @@ class MovimientosBanco(BaseModel): fd = (MovimientosBanco.fecha.between( util.get_date(rango['start']), util.get_date(rango['end'], True))) - filtros = (fd & (MovimientosBanco.cuenta==cuenta)) + filtros = (fd & + (MovimientosBanco.cuenta==cuenta) & + (MovimientosBanco.cancelado==False) + ) else: year = int(values['year']) mes = int(values['mes']) @@ -1203,7 +1266,10 @@ class MovimientosBanco(BaseModel): fm = (MovimientosBanco.fecha.month > 0) else: fm = (MovimientosBanco.fecha.month == mes) - filtros = (fy & fm & (MovimientosBanco.cuenta==cuenta)) + filtros = (fy & fm & + (MovimientosBanco.cuenta==cuenta) & + (MovimientosBanco.cancelado==False) + ) rows = tuple(MovimientosBanco .select( @@ -2933,22 +2999,22 @@ 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 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 Meta: + # ~ order_by = ('pago',) + # ~ indexes = ( + # ~ (('pago', 'factura', 'numero'), True), + # ~ ) class PreFacturasRelacionadas(BaseModel): @@ -3093,21 +3159,28 @@ class FacturasImpuestos(BaseModel): ) -#~ class FacturasPagos(BaseModel): - #~ 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 FacturasPagos(BaseModel): + movimiento = ForeignKeyField(MovimientosBanco) + 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 = ('factura',) - #~ indexes = ( - #~ (('factura', 'numero'), True), - #~ ) + class Meta: + order_by = ('factura',) + indexes = ( + (('factura', 'numero'), True), + ) + + @classmethod + def add(cls, mov, ids): + print (mov) + print (ids) + return class PreFacturasImpuestos(BaseModel): @@ -3168,10 +3241,8 @@ def authenticate(args): respuesta['msg'] = '' respuesta['login'] = True respuesta['user'] = str(obj) - #~ respuesta['user'] = obj respuesta['super'] = obj.es_superusuario #~ respuesta['admin'] = obj.es_superusuario or obj.es_admin - #~ desconectar() return respuesta, obj @@ -3262,15 +3333,15 @@ def _init_values(rfc): def _crear_tablas(rfc): tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion, - Folios, - Emisor, Facturas, FacturasDetalle, FacturasImpuestos, + Folios, Registro, + Emisor, Facturas, FacturasDetalle, FacturasImpuestos, FacturasPagos, FacturasRelacionadas, FacturasComplementos, Almacenes, Productos, PreFacturas, PreFacturasDetalle, PreFacturasImpuestos, PreFacturasRelacionadas, SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes, SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos, Socios, Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco, - CfdiPagos, CfdiPagosFacturas, + CfdiPagos, Emisor.regimenes.get_through_model(), Socios.tags.get_through_model(), Productos.impuestos.get_through_model(), diff --git a/source/static/js/controller/bancos.js b/source/static/js/controller/bancos.js index 3a89579..836593b 100644 --- a/source/static/js/controller/bancos.js +++ b/source/static/js/controller/bancos.js @@ -1,4 +1,6 @@ var msg = '' +var msg_importe = '' + var bancos_controllers = { init: function(){ @@ -7,6 +9,7 @@ var bancos_controllers = { $$('cmd_agregar_deposito').attachEvent('onItemClick', cmd_agregar_deposito_click) $$('cmd_guardar_retiro').attachEvent('onItemClick', cmd_guardar_retiro_click) $$('cmd_guardar_deposito').attachEvent('onItemClick', cmd_guardar_deposito_click) + $$('cmd_cancelar_movimiento').attachEvent('onItemClick', cmd_cancelar_movimiento_click) $$('txt_retiro_importe').attachEvent('onChange', txt_retiro_importe_change) $$('txt_deposito_importe').attachEvent('onChange', txt_deposito_importe_change) $$('grid_cfdi_este_deposito').attachEvent('onAfterDrop', grid_cfdi_este_deposito_after_drop) @@ -98,6 +101,20 @@ function get_estado_cuenta(rango){ } +function get_saldo_cuenta(){ + var id = $$('lst_cuentas_banco').getValue() + webix.ajax().get('/values/saldocuenta', {id: id}, function(text, data){ + var value = data.json() + if(value){ + $$('txt_cuenta_saldo').setValue(value) + }else{ + msg = 'No se pudo consultar el saldo' + msg_error(msg) + } + }) +} + + function lst_cuentas_banco_change(nv, ov){ show('Cuenta change') } @@ -147,6 +164,7 @@ function cmd_agregar_retiro_click(){ function cmd_agregar_deposito_click(){ + msg_importe = '' get_bancos_forma_pago(false) get_facturas_por_pagar() $$('multi_bancos').setValue('banco_deposito') @@ -174,6 +192,13 @@ function validate_retiro(values){ return false } + var today = new Date() + if(values.retiro_fecha > today){ + msg = 'Fecha inválida, es una fecha futura' + msg_error(msg) + return + } + var horas = $$('time_retiro').getText().split(':') var seg = parseInt(horas[2]) var min = parseInt(horas[1]) @@ -266,7 +291,6 @@ function cmd_guardar_retiro_click(){ function txt_retiro_importe_change(new_value, old_value){ - showvar(new_value) if(!isFinite(new_value)){ this.config.value = old_value this.refresh() @@ -383,6 +407,13 @@ function validate_deposito(values){ return false } + var today = new Date() + if(values.deposito_fecha > today){ + msg = 'Fecha inválida, es una fecha futura' + msg_error(msg) + return + } + var horas = $$('time_deposito').getText().split(':') var seg = parseInt(horas[2]) var min = parseInt(horas[1]) @@ -423,6 +454,10 @@ function validate_deposito(values){ msg_error(msg) return false } + if(suma < importe){ + msg_importe = 'El importe del depósito en mayor a la suma de facturas. ' + msg_importe += 'Asegurate de que esto sea correcto' + } } return true @@ -435,7 +470,7 @@ function guardar_deposito(values){ var data = new Object() data['cuenta'] = $$('lst_cuentas_banco').getValue() - data['fecha'] = values.retiro_fecha + data['fecha'] = values.deposito_fecha data['hora'] = $$('time_deposito').getText() data['numero_operacion'] = values.deposito_referencia.trim() data['forma_pago'] = $$('lst_deposito_forma_pago').getValue() @@ -443,6 +478,14 @@ function guardar_deposito(values){ data['retiro'] = 0.0 data['descripcion'] = values.deposito_descripcion + if(grid.count()){ + var ids = new Object() + grid.data.each(function(obj){ + ids[obj.id] = obj.importe.to_float() + }) + data['ids'] = ids + } + webix.ajax().post('/movbanco', data, { error:function(text, data, XmlHttpRequest){ msg = 'Ocurrio un error, consulta a soporte técnico' @@ -466,6 +509,7 @@ function guardar_deposito(values){ function cmd_guardar_deposito_click(){ var form = $$('form_banco_deposito') + var grid = $$('grid_cfdi_este_deposito') if(!form.validate()) { msg_error('Valores inválidos') @@ -494,7 +538,11 @@ function cmd_guardar_deposito_click(){ } }) }else{ - msg = 'Todos los datos son correctos.

¿Deseas agregar este depósito?' + if(!msg_importe){ + msg_importe = 'Se van a relacionar ' + grid.count() + ' facturas.' + } + msg = 'Todos los datos son correctos.

' + msg_importe + '

' + msg += '¿Deseas agregar este depósito?' webix.confirm({ title: 'Guardar depósito', ok: 'Si', @@ -509,3 +557,48 @@ function cmd_guardar_deposito_click(){ }) } } + + +function cancelar_movimiento(id){ + var grid = $$('grid_cuentabanco') + + webix.ajax().del('/movbanco', {id: id}, function(text, xml, xhr){ + if(xhr.status == 200){ + get_estado_cuenta() + get_saldo_cuenta() + msg_sucess('Movimiento cancelado correctamente') + }else{ + msg_error('No se pudo eliminar') + } + }) +} + + +function cmd_cancelar_movimiento_click(){ + var grid = $$('grid_cuentabanco') + + var row = grid.getSelectedItem() + if(row == undefined){ + msg_error('Selecciona un movimiento') + return + } + if(row.descripcion == 'Saldo inicial'){ + msg_error('No es posible eliminar el saldo inicial') + return + } + + var msg = '¿Estás seguro de cancelar el movimiento seleccionado?' + msg += '

ESTA ACCIÓN NO SE PUEDE DESHACER

' + webix.confirm({ + title:'Cancelar Movimiento', + ok:'Si', + cancel:'No', + type:'confirm-error', + text:msg, + callback:function(result){ + if (result){ + cancelar_movimiento(row['id']) + } + } + }) +} \ No newline at end of file diff --git a/source/static/js/ui/bancos.js b/source/static/js/ui/bancos.js index 3d05ff1..5426d9e 100644 --- a/source/static/js/ui/bancos.js +++ b/source/static/js/ui/bancos.js @@ -17,10 +17,17 @@ var toolbar_filtro_cuenta = [ {view: 'daterangepicker', id: 'filtro_cuenta_fechas', label: 'Fechas', labelAlign: 'right', width: 300}, {}, +] + + +var toolbar_movimientos_banco = [ {view: 'button', id: 'cmd_agregar_retiro', label: 'Retiro', type: 'iconButton', autowidth: true, icon: 'minus'}, {view: 'button', id: 'cmd_agregar_deposito', label: 'Depósito', type: 'iconButton', autowidth: true, icon: 'plus'}, + {}, + {view: 'button', id: 'cmd_cancelar_movimiento', label: 'Cancelar', + type: 'iconButton', autowidth: true, icon: 'ban'}, ] @@ -250,6 +257,7 @@ var multi_bancos = { {id: 'banco_home', rows:[ {view: 'toolbar', elements: toolbar_banco}, {view: 'toolbar', elements: toolbar_filtro_cuenta}, + {view: 'toolbar', elements: toolbar_movimientos_banco}, grid_cuentabanco, ]}, {id: 'banco_retiro', rows: [form_banco_retiro]},