diff --git a/source/app/controllers/main.py b/source/app/controllers/main.py index 2afb7a0..0b2cceb 100644 --- a/source/app/controllers/main.py +++ b/source/app/controllers/main.py @@ -287,7 +287,7 @@ class AppMovimientosBanco(object): def on_post(self, req, resp): values = req.params - req.context['result'] = self._db.cuentasbanco(values) + req.context['result'] = self._db.add_movbanco(values) resp.status = falcon.HTTP_200 diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index 1a1e82d..db46559 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -36,7 +36,7 @@ from dateutil import parser from .helper import CaseInsensitiveDict, NumLet, SendMail, TemplateInvoice from settings import DEBUG, log, template_lookup, COMPANIES, DB_SAT, \ PATH_XSLT, PATH_XSLTPROC, PATH_OPENSSL, PATH_TEMPLATES, PATH_MEDIA, PRE, \ - PATH_XMLSEC, TEMPLATE_CANCEL, DEFAULT_SAT_PRODUCTO + PATH_XMLSEC, TEMPLATE_CANCEL, DEFAULT_SAT_PRODUCTO, DECIMALES #~ def _get_hash(password): @@ -1270,6 +1270,10 @@ def get_bool(value): return False +def get_float(value): + return round(float(value), DECIMALES) + + class ImportFacturaLibre(object): def __init__(self, path, rfc): diff --git a/source/app/models/db.py b/source/app/models/db.py index 4d5becd..a74fc7e 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -228,6 +228,9 @@ class StorageEngine(object): def cuentasbanco(self, values): return main.CuentasBanco.add(values) + def add_movbanco(self, values): + return main.MovimientosBanco.add(values) + def get_cuentasbanco(self, values): return main.CuentasBanco.get_(values) diff --git a/source/app/models/main.py b/source/app/models/main.py index fff5fb9..6199bd5 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -954,6 +954,12 @@ class CuentasBanco(BaseModel): def __str__(self): return '{} ({})'.format(self.banco.name, self.cuenta[-4:]) + @classmethod + def actualizar_saldo(cls, id, saldo): + fields = {'saldo': saldo} + q = CuentasBanco.update(**fields).where(CuentasBanco.id==id) + return bool(q.execute()) + @classmethod def remove(cls, id): try: @@ -1049,7 +1055,6 @@ class CuentasBanco(BaseModel): nuevo_mov= { 'cuenta': obj.id, 'fecha': fecha_deposito, - 'movimiento': 1, 'descripcion': 'Saldo inicial', 'forma_pago': SATFormaPago.get_by_key('99'), 'deposito': values['saldo'], @@ -1080,7 +1085,6 @@ class CuentasBanco(BaseModel): class MovimientosBanco(BaseModel): cuenta = ForeignKeyField(CuentasBanco) fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S']) - movimiento = IntegerField(default=0) descripcion = TextField(default='') forma_pago = ForeignKeyField(SATFormaPago) retiro = DecimalField(default=0.0, max_digits=20, decimal_places=6, @@ -1105,12 +1109,28 @@ class MovimientosBanco(BaseModel): class Meta: order_by = ('fecha',) - indexes = ( - (('cuenta', 'movimiento'), True), + + def _ultimo_saldo(self, cuenta): + query = (MovimientosBanco + .select() + .where(MovimientosBanco.cuenta==cuenta)[-1] ) + return round(float(query.saldo), DECIMALES) @classmethod def add(cls, values): + #~ print(values) + if not 'saldo' in values: + hora = values.pop('hora') + values['fecha'] = '{}T{}'.format(values['fecha'][:10], hora) + values['cuenta'] = int(values['cuenta']) + values['retiro'] = util.get_float(values['retiro']) + values['deposito'] = util.get_float(values['deposito']) + values['forma_pago'] = int(values['forma_pago']) + + ultimo_saldo = cls._ultimo_saldo(cls, values['cuenta']) + values['saldo'] = \ + ultimo_saldo - values['retiro'] + values['deposito'] with database_proxy.transaction(): try: obj = MovimientosBanco.create(**values) @@ -1118,7 +1138,9 @@ class MovimientosBanco(BaseModel): msg = 'Este movimiento ya existe' return {'ok': False, 'msg': msg} - return {'ok': True} + CuentasBanco.actualizar_saldo(values['cuenta'], obj.saldo) + + return {'ok': True, 'saldo': obj.saldo} @classmethod def con(cls, id): @@ -1173,6 +1195,8 @@ class MovimientosBanco(BaseModel): class CfdiPagos(BaseModel): movimiento = ForeignKeyField(MovimientosBanco) + fecha = DateTimeField(default=util.now, formats=['%Y-%m-%d %H:%M:%S']) + fecha_timbrado = DateTimeField(null=True) xml = TextField(default='') uuid = UUIDField(null=True) estatus = TextField(default='Guardado') diff --git a/source/static/js/controller/bancos.js b/source/static/js/controller/bancos.js index 5647674..fd6558a 100644 --- a/source/static/js/controller/bancos.js +++ b/source/static/js/controller/bancos.js @@ -5,6 +5,8 @@ var bancos_controllers = { $$('lst_cuentas_banco').attachEvent('onChange', lst_cuentas_banco_change) $$('cmd_agregar_retiro').attachEvent('onItemClick', cmd_agregar_retiro_click) $$('cmd_agregar_deposito').attachEvent('onItemClick', cmd_agregar_deposito_click) + $$('cmd_guardar_retiro').attachEvent('onItemClick', cmd_guardar_retiro_click) + $$('txt_retiro_importe').attachEvent('onChange', txt_retiro_importe_change) set_year_month() } } @@ -31,7 +33,6 @@ function set_year_month(){ m.unblockEvent() } }) - } @@ -96,11 +97,140 @@ function lst_cuentas_banco_change(nv, ov){ } +function get_retiro_forma_pago(){ + webix.ajax().get('/values/formapago', {}, function(text, data){ + var values = data.json() + $$('lst_retiro_forma_pago').getList().parse(values) + }) +} + + function cmd_agregar_retiro_click(){ - show('Retiro') + get_retiro_forma_pago() + $$('multi_bancos').setValue('banco_retiro') } function cmd_agregar_deposito_click(){ - show('Depósito') + showvar('Depósito') +} + + +function validate_retiro(values){ + var importe = values.retiro_importe.replace('$', '').replace(',', '').trim() + + if(!importe){ + msg = 'El importe es requerido' + msg_error(msg) + return false + } + importe = parseFloat(importe).round(2) + if(importe <= 0){ + msg = 'El importe debe ser mayor a cero' + msg_error(msg) + return false + } + + if(!values.retiro_descripcion.trim()){ + msg = 'La descripción es requerida' + msg_error(msg) + return false + } + + var horas = $$('time_retiro').getText().split(':') + var seg = parseInt(horas[2]) + var min = parseInt(horas[1]) + var horas = parseInt(horas[0]) + + if(horas > 23){ + focus('time_retiro') + msg = 'Hora inválida' + msg_error(msg) + return false + } + if(min > 59){ + focus('time_retiro') + msg = 'Hora inválida' + msg_error(msg) + return false + } + if(seg > 59){ + focus('time_retiro') + msg = 'Hora inválida' + msg_error(msg) + return false + } + + return true +} + + +function guardar_retiro(values){ + var form = $$('form_banco_retiro') + + var importe = get_float(values.retiro_importe) + var data = new Object() + data['cuenta'] = $$('lst_cuentas_banco').getValue() + data['fecha'] = values.retiro_fecha + data['hora'] = $$('time_retiro').getText() + data['numero_operacion'] = values.retiro_referencia.trim() + data['forma_pago'] = $$('lst_retiro_forma_pago').getValue() + data['retiro'] = importe + data['deposito'] = 0.0 + data['descripcion'] = values.retiro_descripcion + + webix.ajax().post('/movbanco', data, { + error:function(text, data, XmlHttpRequest){ + msg = 'Ocurrio un error, consulta a soporte técnico' + msg_error(msg) + }, + success:function(text, data, XmlHttpRequest){ + var values = data.json() + if(values.ok){ + $$('txt_cuenta_saldo').setValue(values.saldo) + get_estado_cuenta() + $$('multi_bancos').setValue('banco_home') + form.setValues({}) + }else{ + msg_error(values.msg) + } + } + }) +} + + +function cmd_guardar_retiro_click(){ + var form = $$('form_banco_retiro') + + if(!form.validate()) { + msg_error('Valores inválidos') + return + } + + var values = form.getValues() + if(!validate_retiro(values)){ + return + } + + msg = 'Todos los datos son correctos.

¿Deseas agregar este retiro?' + webix.confirm({ + title: 'Guardar Retiro', + ok: 'Si', + cancel: 'No', + type: 'confirm-error', + text: msg, + callback:function(result){ + if(result){ + guardar_retiro(values) + } + } + }) +} + + +function txt_retiro_importe_change(new_value, old_value){ + if(!isFinite(new_value)){ + this.config.value = old_value + this.refresh() + } } diff --git a/source/static/js/controller/main.js b/source/static/js/controller/main.js index d44948d..2453a0e 100644 --- a/source/static/js/controller/main.js +++ b/source/static/js/controller/main.js @@ -170,7 +170,7 @@ function multi_change(prevID, nextID){ if(nextID == 'app_bancos'){ active = $$('multi_bancos').getActiveId() - if(active == 'bancos_home'){ + if(active == 'banco_home'){ get_cuentas_banco() } return diff --git a/source/static/js/controller/util.js b/source/static/js/controller/util.js index c89af4d..142b4dd 100644 --- a/source/static/js/controller/util.js +++ b/source/static/js/controller/util.js @@ -33,6 +33,11 @@ var months = [ ] +function focus(name){ + webix.UIManager.setFocus(name) +} + + function showvar(values){ webix.message(JSON.stringify(values, null, 2)) } @@ -70,6 +75,11 @@ String.prototype.is_number = function(){ } +function get_float(value){ + return parseFloat(value.replace('$', '').replace(',', '').trim()).round(2) +} + + webix.protoUI({ $cssName: "text", name: "currency", diff --git a/source/static/js/ui/bancos.js b/source/static/js/ui/bancos.js index a17157a..60eea37 100644 --- a/source/static/js/ui/bancos.js +++ b/source/static/js/ui/bancos.js @@ -51,16 +51,76 @@ var grid_cuentabanco = { } +var toolbar_banco_retiro = [ + {view: 'label', label: 'Agregar retiro de banco'}, + {}, + {view: 'icon', click: '$$("multi_bancos").setValue("banco_home")', + icon: 'times-circle'} +] + + +var body_banco_retiro = [ + +] + +var controls_banco_retiro = [ + {view: 'toolbar', elements: toolbar_banco_retiro}, + {cols: [ + {view: 'datepicker', id: 'date_retiro', name: 'retiro_fecha', + label: 'Fecha', format: '%d-%M-%Y', labelAlign: 'right', + required: true, invalidMessage: 'Selecciona una fecha', + labelWidth: 125}, + {view: 'search', id: 'time_retiro', name: 'retiro_hora', + label: 'Hora', icon: 'clock-o', labelAlign: 'right', + pattern:{mask: '##:##:##', allow:/[0-9]/g}, required: true, + invalidMessage: 'Captura una hora'}, + {view: 'text', id: 'retiro_referencia', name: 'retiro_referencia', + label: 'Referencia', labelAlign: 'right'}, + ]}, + {cols: [ + {view: 'richselect', id: 'lst_retiro_forma_pago', + name: 'retiro_forma_pago', label: 'Forma de Pago', required: true, + options: [], labelWidth: 125, labelAlign: 'right'}, + {view: 'currency', type: 'text', id: 'txt_retiro_importe', + name: 'retiro_importe', label: 'Importe', labelAlign: 'right', + required: true, invalidMessage: 'Captura un valor númerico', + inputAlign: 'right', value: ''} + ]}, + {cols: [ + {view: 'text', id: 'retiro_descripcion', name: 'retiro_descripcion', + label: 'Descripción', labelAlign: 'right', required: true, + labelWidth: 125}, + ]}, + {cols: [{}, + {view: 'button', id: 'cmd_guardar_retiro', label: 'Guardar Retiro', + type: 'iconButton', autowidth: true, icon: 'minus'}, + {}]}, +] + + +var form_banco_retiro = { + type: 'space', + responsive: true, + cols: [{ + view: 'form', + id: 'form_banco_retiro', + complexData: true, + scroll: true, + elements: controls_banco_retiro, + }] +} + + var multi_bancos = { id: 'multi_bancos', animate: true, cells:[ - {id: 'bancos_home', rows:[ + {id: 'banco_home', rows:[ {view: 'toolbar', elements: toolbar_banco}, {view: 'toolbar', elements: toolbar_filtro_cuenta}, grid_cuentabanco, - ]} - //~ {id: 'partners_new', rows:[form_partner]} + ]}, + {id: 'banco_retiro', rows: [form_banco_retiro]} ], }