From c8f7554ff6e758512b4f54abb43da7562cd9011b Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Thu, 16 Nov 2017 22:49:17 -0600 Subject: [PATCH] Cuentas Banco UI --- source/app/controllers/main.py | 2 +- source/app/controllers/util.py | 2 + source/app/models/db.py | 3 + source/app/models/main.py | 98 ++++++++++++++++++++++++++- source/static/js/controller/admin.js | 4 +- source/static/js/controller/bancos.js | 41 +++++++++++ source/static/js/controller/main.js | 10 +++ source/static/js/controller/util.js | 17 +++++ source/static/js/ui/bancos.js | 78 +++++++++++++++++++++ source/static/js/ui/invoices.js | 26 ++----- source/static/js/ui/main.js | 16 +++-- source/templates/main.html | 2 + 12 files changed, 266 insertions(+), 33 deletions(-) create mode 100644 source/static/js/controller/bancos.js create mode 100644 source/static/js/ui/bancos.js diff --git a/source/app/controllers/main.py b/source/app/controllers/main.py index 03b46d8..4cce715 100644 --- a/source/app/controllers/main.py +++ b/source/app/controllers/main.py @@ -258,7 +258,7 @@ class AppCuentasBanco(object): def on_get(self, req, resp): values = req.params session = req.env['beaker.session'] - #~ req.context['result'] = self._db.get_emisor(session['rfc']) + req.context['result'] = self._db.get_cuentasbanco(values) resp.status = falcon.HTTP_200 def on_post(self, req, resp): diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index fce597b..1a1e82d 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -1535,6 +1535,8 @@ class ImportFacturaLibre(object): new = {t: row[s] for s, t in fields} if not new['uuid']: new['uuid'] = None + if new['xml'] is None: + new['xml'] = '' if row['estatus'] == 'Pagada': new['pagada'] = True elif row['estatus'] == 'Cancelada': diff --git a/source/app/models/db.py b/source/app/models/db.py index c0b498b..ce8e278 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -217,6 +217,9 @@ class StorageEngine(object): def cuentasbanco(self, values): return main.CuentasBanco.add(values) + def get_cuentasbanco(self, values): + return main.CuentasBanco.get_(values) + def get_folios(self): return main.Folios.get_() diff --git a/source/app/models/main.py b/source/app/models/main.py index 0fb1e0b..dd78974 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -914,6 +914,21 @@ class CuentasBanco(BaseModel): def __str__(self): return '{} ({})'.format(self.banco.name, self.cuenta[-4:]) + @classmethod + def get_(cls, values): + if values['tipo'] == '1': + rows = (CuentasBanco + .select( + CuentasBanco.id, + str(CuentasBanco)) + .where(CuentasBanco.de_emisor==True) + .dicts() + ) + print (tuple(rows)) + return {'ok': True, 'rows': tuple(rows)} + + return + @classmethod def emisor(cls): rows = (CuentasBanco @@ -968,6 +983,52 @@ class CuentasBanco(BaseModel): return data +class BancoMovimientos(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, + auto_round=True) + deposito = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + saldo = DecimalField(default=0.0, max_digits=20, decimal_places=6, + auto_round=True) + moneda = TextField(default='MXN') # Complemento de pagos + tipo_cambio = DecimalField(default=1.0, max_digits=15, decimal_places=6, + auto_round=True) + numero_operacion = TextField(default='') + origen_rfc = TextField(default='') + origen_nombre = TextField(default='') + origen_cuenta = TextField(default='') + destino_rfc = TextField(default='') + destino_cuenta = TextField(default='') + tipo_cadena_pago = TextField(default='') + certificado_pago = TextField(default='') + cadena_pago = TextField(default='') + sello_pago = TextField(default='') + + class Meta: + order_by = ('fecha',) + indexes = ( + (('cuenta', 'movimiento'), True), + ) + + +class CfdiPagos(BaseModel): + movimiento = ForeignKeyField(BancoMovimientos) + xml = TextField(default='') + uuid = UUIDField(null=True) + estatus = TextField(default='Guardado') + estatus_sat = TextField(default='') + notas = TextField(default='') + cancelado = BooleanField(default=False) + + class Meta: + order_by = ('movimiento',) + + class SATUsoCfdi(BaseModel): key = TextField(index=True, unique=True) name = TextField(default='', index=True) @@ -2523,6 +2584,17 @@ class FacturasRelacionadas(BaseModel): return [str(r.factura_origen.uuid) for r in query] +class CfdiPagosFacturas(BaseModel): + pago = ForeignKeyField(CfdiPagos) + factura = ForeignKeyField(Facturas) + + class Meta: + order_by = ('pago',) + indexes = ( + (('pago', 'factura'), True), + ) + + class PreFacturasRelacionadas(BaseModel): factura = ForeignKeyField(PreFacturas, related_name='original') factura_origen = ForeignKeyField(PreFacturas, related_name='relacion') @@ -2665,6 +2737,23 @@ 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 Meta: + order_by = ('factura',) + indexes = ( + (('factura', 'numero'), True), + ) + + class PreFacturasImpuestos(BaseModel): factura = ForeignKeyField(PreFacturas) impuesto = ForeignKeyField(SATImpuestos) @@ -2815,13 +2904,15 @@ def _init_values(rfc): def _crear_tablas(rfc): tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion, - Emisor, Facturas, FacturasDetalle, FacturasImpuestos, Folios, + Folios, + Emisor, Facturas, FacturasDetalle, FacturasImpuestos, FacturasPagos, FacturasRelacionadas, Productos, PreFacturas, PreFacturasDetalle, PreFacturasImpuestos, PreFacturasRelacionadas, SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes, SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos, - Socios, Tags, Usuarios, CuentasBanco, TipoCambio, + Socios, Tags, Usuarios, CuentasBanco, TipoCambio, BancoMovimientos, + CfdiPagos, CfdiPagosFacturas, Emisor.regimenes.get_through_model(), Socios.tags.get_through_model(), Productos.impuestos.get_through_model(), @@ -3092,7 +3183,8 @@ def _importar_facturas(rows): 'importe': impuesto['importe'], } FacturasImpuestos.create(**new) - except IntegrityError: + except IntegrityError as e: + print (e) msg = '\tFactura: id: {}'.format(row['serie'] + str(row['folio'])) log.error(msg) log.info('\tFacturas importadas...') diff --git a/source/static/js/controller/admin.js b/source/static/js/controller/admin.js index dfabde5..9bb5cbd 100644 --- a/source/static/js/controller/admin.js +++ b/source/static/js/controller/admin.js @@ -184,7 +184,7 @@ function get_certificado(){ } -function get_cuentas_banco(){ +function get_admin_cuentas_banco(){ webix.ajax().get('/values/monedasid', function(text, data){ var values = data.json() @@ -310,7 +310,7 @@ function multi_admin_change(prevID, nextID){ $$('tab_emisor').setValue('Datos Fiscales') get_emisor() get_certificado() - get_cuentas_banco() + get_admin_cuentas_banco() return } diff --git a/source/static/js/controller/bancos.js b/source/static/js/controller/bancos.js new file mode 100644 index 0000000..9d5a3f4 --- /dev/null +++ b/source/static/js/controller/bancos.js @@ -0,0 +1,41 @@ +var msg = '' + +var bancos_controllers = { + init: function(){ + $$('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) + } +} + + +function get_cuentas_banco(){ + webix.ajax().get('/cuentasbanco', {'tipo': 1}, { + 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){ + $$('lst_cuentas_banco').getList().parse(values.rows) + $$('lst_cuentas_banco').setValue(values.rows[0].id) + } + } + }) +} + + +function lst_cuentas_banco_change(nv, ov){ + show('Cuenta change') +} + + +function cmd_agregar_retiro_click(){ + show('Retiro') +} + + +function cmd_agregar_deposito_click(){ + show('Depósito') +} diff --git a/source/static/js/controller/main.js b/source/static/js/controller/main.js index f7c287e..d44948d 100644 --- a/source/static/js/controller/main.js +++ b/source/static/js/controller/main.js @@ -65,6 +65,8 @@ var controllers = { $$('grid_preinvoices').attachEvent('onItemClick', grid_preinvoices_click) webix.extend($$('grid_invoices'), webix.ProgressBar) + + bancos_controllers.init() } } @@ -166,6 +168,14 @@ function multi_change(prevID, nextID){ return } + if(nextID == 'app_bancos'){ + active = $$('multi_bancos').getActiveId() + if(active == 'bancos_home'){ + get_cuentas_banco() + } + return + } + if(nextID == 'app_invoices'){ active = $$('multi_invoices').getActiveId() if(active == 'invoices_home'){ diff --git a/source/static/js/controller/util.js b/source/static/js/controller/util.js index dd607ee..ac5ca32 100644 --- a/source/static/js/controller/util.js +++ b/source/static/js/controller/util.js @@ -15,6 +15,23 @@ var table_usocfdi = db.addCollection('usocfdi') var table_relaciones = db.addCollection('relaciones') +var months = [ + {id: -1, value: 'Todos'}, + {id: 1, value: 'Enero'}, + {id: 2, value: 'Febrero'}, + {id: 3, value: 'Marzo'}, + {id: 4, value: 'Abril'}, + {id: 5, value: 'Mayo'}, + {id: 6, value: 'Junio'}, + {id: 7, value: 'Julio'}, + {id: 8, value: 'Agosto'}, + {id: 9, value: 'Septiembre'}, + {id: 10, value: 'Octubre'}, + {id: 11, value: 'Noviembre'}, + {id: 12, value: 'Diciembre'}, +] + + function show(values){ webix.message(JSON.stringify(values, null, 2)) } diff --git a/source/static/js/ui/bancos.js b/source/static/js/ui/bancos.js new file mode 100644 index 0000000..a17157a --- /dev/null +++ b/source/static/js/ui/bancos.js @@ -0,0 +1,78 @@ + + +var toolbar_banco = [ + {view: 'richselect', id: 'lst_cuentas_banco', label: 'Cuenta', + labelWidth: 100, options: []}, + {view: 'text', id: 'txt_cuenta_moneda', label: 'Moneda', readonly: true}, + {view: 'currency', id: 'txt_cuenta_saldo', label: 'Saldo', readonly: true, + inputAlign: 'right', value: 0} +] + + +var toolbar_filtro_cuenta = [ + {view: 'richselect', id: 'filtro_cuenta_year', label: 'Año', + labelAlign: 'right', labelWidth: 50, width: 150, options: []}, + {view: 'richselect', id: 'filtro_cuenta_mes', label: 'Mes', + labelAlign: 'right', labelWidth: 50, width: 200, options: months}, + {view: 'daterangepicker', id: 'filtro_cuenta_fechas', label: 'Fechas', + labelAlign: 'right', width: 300}, + {}, + {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'}, +] + + +var grid_cuentabanco_cols = [ + {id: 'id', header:'ID', hidden: true}, + {id: 'fecha', header: 'Fecha', width: 150}, + {id: 'numero_operacion', header: 'Referencia'}, + {id: 'descripcion', header: ['Descripción', {content: 'textFilter'}], + fillspace:true}, + {id: 'retiro', header: ['Retiro', {content: 'numberFilter'}], + width: 125, format: webix.i18n.priceFormat, css: 'right'}, + {id: 'deposito', header: ['Depósito', {content: 'numberFilter'}], + width: 125, format: webix.i18n.priceFormat, css: 'right'}, + {id: 'saldo', header: ['Saldo'], + width: 125, format: webix.i18n.priceFormat, css: 'right'}, +] + + +var grid_cuentabanco = { + view: 'datatable', + id: 'grid_cuentabanco', + select: 'row', + adjust: true, + footer: true, + resizeColumn: true, + headermenu: true, + columns: grid_cuentabanco_cols, +} + + +var multi_bancos = { + id: 'multi_bancos', + animate: true, + cells:[ + {id: 'bancos_home', rows:[ + {view: 'toolbar', elements: toolbar_banco}, + {view: 'toolbar', elements: toolbar_filtro_cuenta}, + grid_cuentabanco, + ]} + //~ {id: 'partners_new', rows:[form_partner]} + ], +} + + +var title_partners = 'Administración de Bancos' +var app_bancos = { + id: 'app_bancos', + rows:[ + {view: 'template', id: 'th_bancos', type: 'header', + template: title_partners}, + multi_bancos + ] +} + + diff --git a/source/static/js/ui/invoices.js b/source/static/js/ui/invoices.js index 5da23ca..6fc27f3 100644 --- a/source/static/js/ui/invoices.js +++ b/source/static/js/ui/invoices.js @@ -1,20 +1,4 @@ -var months = [ - {id: -1, value: 'Todos'}, - {id: 1, value: 'Enero'}, - {id: 2, value: 'Febrero'}, - {id: 3, value: 'Marzo'}, - {id: 4, value: 'Abril'}, - {id: 5, value: 'Mayo'}, - {id: 6, value: 'Junio'}, - {id: 7, value: 'Julio'}, - {id: 8, value: 'Agosto'}, - {id: 9, value: 'Septiembre'}, - {id: 10, value: 'Octubre'}, - {id: 11, value: 'Noviembre'}, - {id: 12, value: 'Diciembre'}, -] - var grid_cfdi_cliente_cols = [ {id: 'index', header: '#', adjust: 'data', css: 'right', @@ -253,15 +237,15 @@ var grid_details_cols = [ fillspace: true, editor: 'text'}, {id: "unidad", header:{text: 'Unidad', css: 'center'}, width: 100}, {id: 'cantidad', header: {text: 'Cantidad', css: 'center'}, width: 100, - format: webix.i18n.numberFormat, css:'right', editor: 'text'}, + format: webix.i18n.numberFormat, css: 'right', editor: 'text'}, {id: "valor_unitario", header:{text: 'Valor Unitario', css: 'center'}, - width: 100, format: webix.i18n.priceFormat, css:'right', editor: 'text'}, + width: 100, format: webix.i18n.priceFormat, css: 'right', editor: 'text'}, {id: 'descuento', header:{text: 'Descuento', css: 'center'}, - width: 80, format: webix.i18n.priceFormat, css:'right', editor: 'text'}, + width: 80, format: webix.i18n.priceFormat, css: 'right', editor: 'text'}, {id: 'precio_final', hidden: true, header: 'precio_final', width: 80, - format: webix.i18n.priceFormat, css:'right'}, + format: webix.i18n.priceFormat, css: 'right'}, {id: "importe", header:{text: 'Importe', css: 'center'}, width: 150, - format: webix.i18n.priceFormat, css:'right'}, + format: webix.i18n.priceFormat, css: 'right'}, ] diff --git a/source/static/js/ui/main.js b/source/static/js/ui/main.js index 9ba1099..2e61ebb 100644 --- a/source/static/js/ui/main.js +++ b/source/static/js/ui/main.js @@ -1,10 +1,12 @@ + var menu_data = [ {id: 'app_home', icon: 'dashboard', value: 'Inicio'}, {id: 'app_partners', icon: 'users', value: 'Clientes y Proveedores'}, {id: 'app_products', icon: 'server', value: 'Productos y Servicios'}, + {id: 'app_bancos', icon: 'university', value: 'Bancos'}, {id: 'app_invoices', icon: 'cart-plus', value: 'Facturas'}, -]; +] var sidebar = { @@ -18,8 +20,8 @@ var sidebar = { onAfterSelect: function(id){ $$('multi').setValue(id) } - } -}; + }, +} var multi_main = { @@ -33,9 +35,10 @@ var multi_main = { }, app_partners, app_products, + app_bancos, app_invoices, - ] -}; + ], +} var menu_user = { @@ -49,7 +52,8 @@ var menu_user = { type: { subsign: true, }, -}; +} + var ui_main = { rows: [ diff --git a/source/templates/main.html b/source/templates/main.html index 2312e84..8c95768 100644 --- a/source/templates/main.html +++ b/source/templates/main.html @@ -7,11 +7,13 @@ + +