From 4922010caf165736c7461f5d9c11800a33514342 Mon Sep 17 00:00:00 2001 From: El Mau Date: Thu, 20 Jan 2022 00:06:05 -0600 Subject: [PATCH] Importar carta porte desde json --- CHANGELOG.md | 5 ++ VERSION | 2 +- source/app/controllers/util.py | 10 +-- source/app/controllers/utils.py | 4 +- source/app/models/db.py | 3 + source/app/models/main.py | 17 +++- source/app/settings.py | 2 +- source/static/js/controller/invoices.js | 102 +++++++++++++++++++++++- source/static/js/ui/invoices.js | 42 +++++++++- 9 files changed, 172 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15433a6..e056e9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v 1.45.0 [20-Ene-2022] +---------------------- + - Importar Carta Porte desde archivo JSON + + v 1.44.2 [19-Ene-2022] ---------------------- - Agregar opción STARTTLS que requieren algunos servidores de correo diff --git a/VERSION b/VERSION index 2ccbba3..3e59ccd 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -1.44.2 +1.45.0 diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index 65f5468..548bbf1 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -956,7 +956,7 @@ class LIBO(object): self._set_cell(f'{{cp.{k}}}', v) first = True - count = len(ubicaciones) + count = len(ubicaciones) - 1 for i, ubicacion in enumerate(ubicaciones): tipo = ubicacion['TipoUbicacion'] nombre = ubicacion['NombreRemitenteDestinatario'] @@ -973,7 +973,7 @@ class LIBO(object): cell_5 = self._set_cell('{cp.Domicilio}', domicilio) row = cell_1.CellAddress.Row + 1 - self._sheet.getRows().insertByIndex(row, count - 1) + self._sheet.getRows().insertByIndex(row, count) self._copy_paste_rows(cell_1, count) else: cell_1 = self._set_cell(v=tipo, cell=cell_1) @@ -983,7 +983,7 @@ class LIBO(object): cell_5 = self._set_cell(v=domicilio, cell=cell_5) first = True - count = len(detalle) + count = len(detalle) - 1 for i, mercancia in enumerate(detalle): clave = mercancia['BienesTransp'] descripcion = mercancia['Descripcion'] @@ -997,9 +997,9 @@ class LIBO(object): cell_3 = self._set_cell('{cp.ClaveUnidad}', unidad) cell_4 = self._set_cell('{cp.Cantidad}', cantidad) cell_5 = self._set_cell('{cp.PesoEnKg}', peso) - if count > 1: + if count > 0: row = cell_1.CellAddress.Row + 1 - self._sheet.getRows().insertByIndex(row, count - 1) + self._sheet.getRows().insertByIndex(row, count) self._copy_paste_rows(cell_1, count) else: cell_1 = self._set_cell(v=clave, cell=cell_1) diff --git a/source/app/controllers/utils.py b/source/app/controllers/utils.py index b3450ab..28e731e 100644 --- a/source/app/controllers/utils.py +++ b/source/app/controllers/utils.py @@ -783,8 +783,8 @@ def _cancel_with_cert(invoice, args, auth, certificado): def cancel_xml_sign(invoice, args, auth, certificado): - # ~ if DEBUG: - return _cancel_with_cert(invoice, args, auth, certificado) + if DEBUG: + return _cancel_with_cert(invoice, args, auth, certificado) cert = SATCertificate(certificado.cer, certificado.key_enc.encode()) pac = PACS[auth['pac']]() diff --git a/source/app/models/db.py b/source/app/models/db.py index bb7e680..3d55374 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -161,6 +161,9 @@ class StorageEngine(object): def _get_unidades(self, values): return main.SATUnidades.get_activos() + def _get_unitbykey(self, values): + return main.SATUnidades.get_activos_by_key() + def add_moneda(self, values): return main.SATMonedas.add(values) diff --git a/source/app/models/main.py b/source/app/models/main.py index 7a1433d..8074856 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -1511,6 +1511,17 @@ class SATUnidades(BaseModel): ) return tuple(rows) + @classmethod + def get_activos_by_key(cls): + rows = (SATUnidades + .select( + SATUnidades.key.alias('id'), + SATUnidades.name.alias('value')) + .where(SATUnidades.activo==True) + .dicts() + ) + return tuple(rows) + @classmethod def remove(cls, id): with database_proxy.transaction(): @@ -5337,15 +5348,17 @@ class Facturas(BaseModel): total_weight = 0.00 mercancias = values['mercancias'] for mercancia in mercancias['mercancias']: - mercancia['ClaveUnidad'] = SATUnidades.get_key_by_id(mercancia['ClaveUnidad']) total_weight += float(mercancia['PesoEnKg']) + if isinstance(mercancia['PesoEnKg'], (int, float)): + mercancia['PesoEnKg'] = f"{mercancia['PesoEnKg']:.2f}" mercancias['PesoBrutoTotal'] = f"{total_weight:.2f}" ubicaciones = values['ubicaciones'] for ubicacion in ubicaciones: if 'DistanciaRecorrida' in ubicacion: - print(1, type(ubicacion['DistanciaRecorrida']), ubicacion['DistanciaRecorrida']) total_distance += float(ubicacion['DistanciaRecorrida']) + if isinstance(ubicacion['DistanciaRecorrida'], (int, float)): + ubicacion['DistanciaRecorrida'] = f"{ubicacion['DistanciaRecorrida']:.2f}" municipio = ubicacion.pop('Municipio') estado = ubicacion.pop('Estado') pais = ubicacion.pop('Pais') diff --git a/source/app/settings.py b/source/app/settings.py index 137f25b..4ca5055 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -42,7 +42,7 @@ except ImportError: DEBUG = DEBUG -VERSION = '1.44.2' +VERSION = '1.45.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 6da1b19..8b2802c 100644 --- a/source/static/js/controller/invoices.js +++ b/source/static/js/controller/invoices.js @@ -92,6 +92,7 @@ var invoices_controllers = { $$('grid_carta_mercancias').attachEvent('onItemClick', grid_carta_mercancias_click) $$('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) webix.extend($$('grid_invoices'), webix.ProgressBar) @@ -2637,7 +2638,7 @@ function _copy_from_invoice(){ function cmd_carta_copy_from_invoice_click(){ msg = '¿Estás seguro de copiar los productos?

\ - Esto reemplazara todos los datos actuales' + Esto reemplazara todos los datos actuales de las mercancías.' webix.confirm({ title: 'Copiar productos', ok: 'Si', @@ -2659,3 +2660,102 @@ function grid_carta_mercancias_click(id, e, node){ } this.remove(id.row) } + + +function _set_carta_porte_from_json(data){ + try{ + var values = JSON.parse(data) + }catch(e){ + msg_error('Revisa el archivo JSON') + webix.alert({ + title: 'Error al cargar JSON', + text: e.message, + type: 'alert-error' + }) + return + } + + var mercancias = values['mercancias'] + var ubicaciones = values['ubicaciones'] + var autotransporte = values['autotransporte'] + var operador = values['operador'] + + $$('lst_carta_UnidadPeso').setValue(values['unidad_de_peso']) + var grid = $$('grid_carta_mercancias') + grid.clearAll() + mercancias.forEach(function(row, index){ + var data = new Object() + data['delete'] = '-' + data['BienesTransp'] = row.clave_sat + data['Descripcion'] = row.descripcion + data['Cantidad'] = row.cantidad + data['ClaveUnidad'] = row.clave_unidad + data['PesoEnKg'] = row.peso_en_kg + grid.add(data) + }) + + var grid = $$('grid_carta_ubicaciones') + grid.clearAll() + ubicaciones.forEach(function(row, index){ + var data = new Object() + data['delete'] = '-' + data['TipoUbicacion'] = row.tipo + data['RFCRemitenteDestinatario'] = row.rfc + data['NombreRemitenteDestinatario'] = row.nombre + data['FechaHoraSalidaLlegada'] = new Date(row.fecha) + if('distancia' in row){ + data['DistanciaRecorrida'] = row.distancia + } + data['Municipio'] = row.municipio + data['Estado'] = row.estado + data['Pais'] = 'MEX' + data['CodigoPostal'] = row.codigo_postal + grid.add(data) + }) + + var grid = $$('grid_carta_autotransporte') + grid.clearAll() + var data = new Object() + data['PermSCT'] = autotransporte.tipo_permiso + data['NumPermisoSCT'] = autotransporte.numero + data['ConfigVehicular'] = autotransporte.clave + data['PlacaVM'] = autotransporte.placa + data['AnioModeloVM'] = autotransporte.modelo + if('remolque' in autotransporte){ + data['SubTipoRem'] = autotransporte.remolque + data['Placa'] = autotransporte.placa_remolque + } + data['AseguraRespCivil'] = autotransporte.aseguradora + data['PolizaRespCivil'] = autotransporte.poliza + grid.add(data) + + var grid = $$('grid_carta_tipos_figuras') + grid.clearAll() + var data = new Object() + data['TipoFigura'] = '01' + if('tipo' in operador){ + data['TipoFigura'] = operador.tipo + } + data['RFCFigura'] = operador.rfc + data['NombreFigura'] = operador.nombre + data['NumLicencia'] = operador.licencia + grid.add(data) + + $$('chk_cfdi_usar_cartaporte').setValue(1) +} + + +function cmd_carta_import_json_click(){ + win_carta_import_json.init() + $$('win_carta_import_json').show() +} + + +function up_invoice_json_on_after_file_add(obj){ + let reader = new FileReader() + reader.readAsText(obj.file) + reader.onload = function(){ + _set_carta_porte_from_json(reader.result) + } + $$('win_carta_import_json').close() +} diff --git a/source/static/js/ui/invoices.js b/source/static/js/ui/invoices.js index 499ae5d..a897c6b 100644 --- a/source/static/js/ui/invoices.js +++ b/source/static/js/ui/invoices.js @@ -928,7 +928,7 @@ var grid_cols_carta_mercancias = [ {id: 'BienesTransp', header: 'Clave SAT', editor: 'text', fillspace: 1}, {id: 'Descripcion', header: 'Descripción', editor: 'text', fillspace: 1}, {id: 'Cantidad', header: 'Cantidad', editor: 'text', format: webix.i18n.numberFormat, css: 'right', fillspace: 1}, - {id: 'ClaveUnidad', header: 'Unidad', editor: 'select', options: 'values/unidades', footer: 'Total peso:', fillspace: 1}, + {id: 'ClaveUnidad', header: 'Unidad', editor: 'select', options: 'values/unitbykey', footer: 'Total peso:', fillspace: 1}, //~ {id: 'ValorMercancia', header: 'Valor Mercancia', format: webix.i18n.priceFormat, css: 'right', footer: 'Total peso:', fillspace: 1}, {id: 'PesoEnKg', header: 'Peso (Kg)', format: webix.i18n.numberFormat, css: 'right', editor: 'text', footer: {content: 'summColumn', css: 'right'}, fillspace: 1}, ] @@ -1139,8 +1139,12 @@ var body_carta_tipos_figuras = {rows:[ var controls_carta_porte = [ {cols: [{maxWidth: 15}, {view: 'checkbox', id: 'chk_cfdi_usar_cartaporte', labelWidth: 0, - labelRight: 'Usar el complemento Carta Porte'}, - {}]}, + labelRight: 'Usar el complemento Carta Porte'}, {}, + {view: 'button', id: 'cmd_carta_import_json', label: 'Importar JSON', + icon: 'upload', type: 'iconButton', autowidth: true, align: 'center'}, + {view: 'button', id: 'cmd_carta_import_ods', label: 'Importar ODS', + icon: 'upload', type: 'iconButton', autowidth: true, align: 'center'}, + {maxWidth: 15}]}, {view: 'fieldset', label: 'Mercancias', body: body_carta_mercancias}, {cols: [{maxWidth: 15}, {view: 'richselect', id: 'lst_carta_TranspInternac', labelPosition: 'top', @@ -1300,3 +1304,35 @@ var win_invoice_cancel = { $$('cmd_win_cancel_close').attachEvent('onItemClick', cmd_win_cancel_close_click) } } + + +var body_upload_carta_json = {rows: [ + {view: 'form', id: 'form_upload_carta', rows: [ + {cols: [{}, + {view: 'uploader', id: 'up_invoice_json', autosend: false, + link: 'lst_upload_invoice', value: 'Seleccionar Archivo', + accept:'application/json', upload: ''}, {}]}, + {cols: [ + {view: 'list', id: 'lst_upload_invoice', name: 'lst_upload_invoice', + type: 'uploader', autoheight: true, borderless: true}]}, + //~ {cols: [{}, {view: 'button', id: 'cmd_upload_invoice', + //~ label: 'Importar Factura'}, {}]}, + ]}, +]} + + +var win_carta_import_json = { + init: function(){ + webix.ui({ + view: 'window', + id: 'win_carta_import_json', + width: 400, + modal: true, + position: 'center', + head: 'Importar Carta Porte JSON', + body: body_upload_carta_json, + }) + //~ $$('cmd_upload_invoice').attachEvent('onItemClick', cmd_upload_invoice_click) + $$('up_invoice_json').attachEvent('onAfterFileAdd', up_invoice_json_on_after_file_add) + } +}