diff --git a/CHANGELOG.md b/CHANGELOG.md index a362c0e..9199ab6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +v 1.46.0 [27-Ene-2022] +---------------------- + - Mejora: Issue #45 + - Mejora: Agregar tipos de persimos SCT para Carta Porte + - Mejora: Buscar estado y municipio por CP en Carta Porte + + v 1.45.4 [25-Ene-2022] ---------------------- - Error: Al timbrar carta porte. diff --git a/VERSION b/VERSION index bdcb000..a8ada98 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -1.45.4 +1.46.0 diff --git a/source/app/controllers/utils.py b/source/app/controllers/utils.py index 8e02fe3..2fee82f 100644 --- a/source/app/controllers/utils.py +++ b/source/app/controllers/utils.py @@ -379,9 +379,12 @@ class CfdiToDict(object): values['autotransporte'].update(values_auto) path = '//cartaporte20:Remolques' - node_tmp = node_auto.xpath(path, namespaces=self.NS)[0][0] - values_auto = CaseInsensitiveDict(node_tmp.attrib) - values['autotransporte'].update(values_auto) + try: + node_tmp = node_auto.xpath(path, namespaces=self.NS)[0][0] + values_auto = CaseInsensitiveDict(node_tmp.attrib) + values['autotransporte'].update(values_auto) + except IndexError: + pass elif 'Ubicaciones' in node.tag: ubicaciones = [] for n in node: diff --git a/source/app/models/main.py b/source/app/models/main.py index 3cf4462..226c08f 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -10378,7 +10378,7 @@ def get_cp(cp): con = sqlite3.connect(PATH_CP) cursor = con.cursor() sql = """ - SELECT colonia, municipio, estado + SELECT colonia, municipio, estado, municipios.id_municipio FROM colonias, municipios, estados WHERE colonias.id_municipio=municipios.id AND municipios.id_estado=estados.id @@ -10394,7 +10394,9 @@ def get_cp(cp): data = { 'estado': rows[0][2], 'municipio': rows[0][1], + 'key_municipio': str(rows[0][3]).zfill(3), } + print(data) if len(rows) == 1: data['colonia'] = rows[0][0] else: diff --git a/source/app/settings.py b/source/app/settings.py index 8765bc4..3d6f63e 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -42,7 +42,7 @@ except ImportError: DEBUG = DEBUG -VERSION = '1.45.4' +VERSION = '1.46.0' EMAIL_SUPPORT = ('soporte@empresalibre.mx',) TITLE_APP = '{} v{}'.format(TITLE_APP, VERSION) diff --git a/source/static/js/controller/invoices.js b/source/static/js/controller/invoices.js index 6fd607f..8ff65b5 100644 --- a/source/static/js/controller/invoices.js +++ b/source/static/js/controller/invoices.js @@ -90,6 +90,7 @@ var invoices_controllers = { tv_invoice.attachEvent('onChange', tv_invoice_change) $$('grid_carta_mercancias').attachEvent('onItemClick', grid_carta_mercancias_click) + $$('grid_carta_ubicaciones').attachEvent('onBeforeEditStop', grid_carta_ubicaciones_before_edit_stop) $$('cmd_carta_add_product').attachEvent('onItemClick', cmd_carta_add_product_click) $$('cmd_carta_copy_from_invoice').attachEvent('onItemClick', cmd_carta_copy_from_invoice_click) $$('cmd_carta_import_json').attachEvent('onItemClick', cmd_carta_import_json_click) @@ -1120,6 +1121,68 @@ function grid_details_before_edit_start(id){ } +function grid_carta_ubicaciones_before_edit_stop(state, editor){ + if(editor.column != 'CodigoPostal'){ + return true + } + + var g = $$('grid_carta_ubicaciones') + var row = g.getItem(editor.row) + var cp = state.value.trim() + + if(!cp){ + msg = 'El Código Postal no puede estar vacío' + msg_error(msg) + g.blockEvent() + state.value = state.old + g.editCancel() + g.unblockEvent() + return true + } + + if(cp.length != 5){ + msg = 'El Código Postal debe ser de 5 digitos' + msg_error(msg) + g.blockEvent() + state.value = state.old + g.editCancel() + g.unblockEvent() + return true + } + + if(cp.match(/\d/) == null){ + msg = 'El Código Postal deben ser solo digitos' + msg_error(msg) + g.blockEvent() + state.value = state.old + g.editCancel() + g.unblockEvent() + return true + } + + webix.ajax().get('/values/cp', {cp: cp}, { + error: function(text, data, xhr) { + msg_error('Error al consultar el C.P.') + }, + success: function(text, data, xhr) { + var values = data.json(); + if (values.estado == undefined){ + msg = 'No se encontró el C.P., asegurate de que sea correcto' + msg_error(msg) + } else { + row['Estado'] = opt_carta_estados.find(x => x.value === values.estado).id + row['Municipio'] = values.key_municipio + //~ $$('colonia').define('suggest', []) + //~ $$('colonia').define('suggest', values.colonia) + //~ $$('colonia').refresh() + g.refresh() + msg_ok('Municipio:\n' + values.municipio) + } + } + }) +} + + function grid_details_before_edit_stop(state, editor){ var row = grid.getItem(editor.row) diff --git a/source/static/js/ui/bancos.js b/source/static/js/ui/bancos.js index db26ab4..35a7491 100644 --- a/source/static/js/ui/bancos.js +++ b/source/static/js/ui/bancos.js @@ -147,7 +147,7 @@ var grid_cfdi_pay_cols = [ {id: 'cliente', header: ['Razón Social'], fillspace: true}, {id: 'xml', header: 'XML', adjust: 'data', template: get_icon('xml')}, {id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')}, - {id: 'email', header: '', adjust: 'data', template: get_icon('email')} + {id: 'email', header: '@', adjust: 'data', template: get_icon('email')} ] @@ -290,7 +290,7 @@ var grid_bank_invoice_pay_cols = [ {id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')}, //~ {id: 'ods', header: 'ODS', adjust: 'data', template: get_icon('table')}, //~ {id: 'zip', header: 'ZIP', adjust: 'data', template: get_icon('zip')}, - {id: 'email', header: '', adjust: 'data', template: get_icon('email')} + {id: 'email', header: '@', adjust: 'data', template: get_icon('email')} ] diff --git a/source/static/js/ui/invoices.js b/source/static/js/ui/invoices.js index 7014d5d..4e60fd2 100644 --- a/source/static/js/ui/invoices.js +++ b/source/static/js/ui/invoices.js @@ -1,5 +1,5 @@ //~ Empresa Libre -//~ Copyright (C) 2016-2018 Mauricio Baeza Servin (web@correolibre.net) +//~ Copyright (C) 2016-2018 Mauricio Baeza Servin (publico@cuates.net) //~ //~ This program is free software: you can redistribute it and/or modify //~ it under the terms of the GNU General Public License as published by @@ -679,7 +679,7 @@ var grid_preinvoices_cols = [ {id: "cliente", header: ["Razón Social", {content: "selectFilter"}], fillspace:true, sort:"string"}, {id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')}, - {id: 'email', header: '', adjust: 'data', template: get_icon('email')} + {id: 'email', header: '@', adjust: 'data', template: get_icon('email')} ] @@ -936,6 +936,36 @@ var grid_cols_carta_mercancias = [ ] +var opt_carta_tipo_permiso_sct = [ + {id: 'TPAF01', value: '[TPAF01] Autotransporte Federal de carga general.'}, + {id: 'TPAF02', value: '[TPAF02] Transporte privado de carga.'}, + {id: 'TPAF03', value: '[TPAF03] Autotransporte Federal de Carga Especializada de materiales y residuos peligrosos.'}, + {id: 'TPAF04', value: '[TPAF04] Transporte de automóviles sin rodar en vehículo tipo góndola.'}, + {id: 'TPAF05', value: '[TPAF05] Transporte de carga de gran peso y/o volumen de hasta 90 toneladas.'}, + {id: 'TPAF06', value: '[TPAF06] Transporte de carga especializada de gran peso y/o volumen de más 90 toneladas.'}, + {id: 'TPAF07', value: '[TPAF07] Transporte Privado de materiales y residuos peligrosos.'}, + {id: 'TPAF08', value: '[TPAF08] Autotransporte internacional de carga de largo recorrido.'}, + {id: 'TPAF09', value: '[TPAF09] Autotransporte internacional de carga especializada de materiales y residuos peligrosos de largo recorrido.'}, + {id: 'TPAF10', value: '[TPAF10] Autotransporte Federal de Carga General cuyo ámbito de aplicación comprende la franja fronteriza con Estados Unidos.'}, + {id: 'TPAF11', value: '[TPAF11] Autotransporte Federal de Carga Especializada cuyo ámbito de aplicación comprende la franja fronteriza con Estados Unidos.'}, + {id: 'TPAF12', value: '[TPAF12] Servicio auxiliar de arrastre en las vías generales de comunicación.'}, + {id: 'TPAF13', value: '[TPAF13] Servicio auxiliar de servicios de arrastre, arrastre y salvamento, y depósito de vehículos en las vías generales de comunicación.'}, + {id: 'TPAF14', value: '[TPAF14] Servicio de paquetería y mensajería en las vías generales de comunicación.'}, + {id: 'TPAF15', value: '[TPAF15] Transporte especial para el tránsito de grúas industriales con peso máximo de 90 toneladas.'}, + {id: 'TPAF16', value: '[TPAF16] Servicio federal para empresas arrendadoras servicio público federal.'}, + {id: 'TPAF17', value: '[TPAF17] Empresas trasladistas de vehículos nuevos.'}, + {id: 'TPAF18', value: '[TPAF18] Empresas fabricantes o distribuidoras de vehículos nuevos.'}, + {id: 'TPAF19', value: '[TPAF19] Autorización expresa para circular en los caminos y puentes de jurisdicción federal con configuraciones de tractocamión doblemente articulado.'}, + {id: 'TPAF20', value: '[TPAF20] Autotransporte Federal de Carga Especializada de fondos y valores.'}, + {id: 'TPTM01', value: '[TPTM01] Permiso temporal para navegación de cabotaje'}, + {id: 'TPTA01', value: '[TPTA01] Concesión y/o autorización para el servicio regular nacional y/o internacional para empresas mexicanas'}, + {id: 'TPTA02', value: '[TPTA02] Permiso para el servicio aéreo regular de empresas extranjeras'}, + {id: 'TPTA03', value: '[TPTA03] Permiso para el servicio nacional e internacional no regular de fletamento'}, + {id: 'TPTA04', value: '[TPTA04] Permiso para el servicio nacional e internacional no regular de taxi aéreo'}, + {id: 'TPXX00', value: '[TPXX00] Permiso no contemplado en el catálogo.'} +] + + var opt_config_auto = [ {id: '', value: ''}, {id: 'VL', value: '[VL] Vehículo ligero de carga (2 llantas en el eje delantero y 2 llantas en el eje trasero)'}, @@ -1019,7 +1049,7 @@ var opt_carta_aseguradoras = [ var grid_cols_carta_autotransporte = [ {id: 'id', header: 'ID', hidden: true}, - {id: 'PermSCT', header: 'Tipo Permiso SCT', editor: 'text', fillspace: 1}, + {id: 'PermSCT', header: 'Tipo Permiso SCT', editor: 'select', options: opt_carta_tipo_permiso_sct, fillspace: 1}, {id: 'NumPermisoSCT', header: 'Número Permiso SCT', editor: 'text', fillspace: 1}, {id: 'ConfigVehicular', header: 'Clave Autotransporte', editor: 'select', options: opt_config_auto, fillspace: 1}, {id: 'PlacaVM', header: 'Placa', editor: 'text', fillspace: 1},