diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b4b449..5bcbed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v 1.46.4 [18-Feb-2022] +---------------------- + - Error: Issue #54 + + v 1.46.3 [15-Feb-2022] ---------------------- - Error: Issue #53 diff --git a/VERSION b/VERSION index c9e1991..55c81d9 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -1.46.3 +1.46.4 diff --git a/source/app/controllers/pacs/finkok/finkok.py b/source/app/controllers/pacs/finkok/finkok.py index 09c54b5..60e2f8a 100644 --- a/source/app/controllers/pacs/finkok/finkok.py +++ b/source/app/controllers/pacs/finkok/finkok.py @@ -72,8 +72,10 @@ class DebugPlugin(Plugin): class PACFinkok(object): WS = 'https://facturacion.finkok.com/servicios/soap/{}.wsdl' + NS_TYPE = 'ns1' if DEBUG: WS = 'http://demo-facturacion.finkok.com/servicios/soap/{}.wsdl' + NS_TYPE = 'ns0' URL = { 'quick_stamp': False, 'timbra': WS.format('stamp'), @@ -209,9 +211,12 @@ class PACFinkok(object): method = 'cancel' client = Client(self.URL[method], transport=self._transport, plugins=self._plugins) - uuid_type = client.get_type('ns1:UUIDS') + + uuid_type = client.get_type(f'{self.NS_TYPE}:UUIDS') + ns1_uuid = client.get_type(f'{self.NS_TYPE}:UUID') + # ~ sa = client.get_type('ns0:stringArray') - ns1_uuid = client.get_type('ns1:UUID') + data_uuid = { 'UUID': cfdi_uuid, 'FolioSustitucion': info['args']['uuid'], diff --git a/source/app/models/main.py b/source/app/models/main.py index 32122eb..bd47931 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -8853,6 +8853,8 @@ class CfdiNomina(BaseModel): def _cancel(self, values, user): id = int(values['id']) + args = utils.loads(values['args']) + obj = CfdiNomina.get(CfdiNomina.id==id) if obj.uuid is None: msg = 'Solo se pueden cancelar recibos timbrados' @@ -8860,7 +8862,7 @@ class CfdiNomina(BaseModel): auth = Configuracion.get_({'fields': 'pac_auth'}) certificado = Certificado.get(Certificado.es_fiel==False) - result = utils.cancel_xml_sign(obj, auth, certificado) + result = utils.cancel_xml_sign(obj, args, auth, certificado) if result['ok']: obj.estatus = 'Cancelado' diff --git a/source/app/settings.py b/source/app/settings.py index da296ee..42feafd 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -42,7 +42,7 @@ except ImportError: DEBUG = DEBUG -VERSION = '1.46.3' +VERSION = '1.46.4' EMAIL_SUPPORT = ('soporte@empresalibre.mx',) TITLE_APP = '{} v{}'.format(TITLE_APP, VERSION) diff --git a/source/static/js/controller/bancos.js b/source/static/js/controller/bancos.js index 7831b85..b4bbe33 100644 --- a/source/static/js/controller/bancos.js +++ b/source/static/js/controller/bancos.js @@ -1131,35 +1131,6 @@ function cmd_pay_cancel_click(){ win_invoice_cancel_pay.init() $$('win_invoice_cancel_pay').show() - - //~ msg = '¿Estás seguro de cancelar esta factura?\n\nESTA ACCIÓN NO SE PUEDE DESHACER' - //~ webix.confirm({ - //~ title: 'Cancelar Factura', - //~ ok: 'Si', - //~ cancel: 'No', - //~ type: 'confirm-error', - //~ text: msg, - //~ callback:function(result){ - //~ if(result){ - //~ webix.ajax().post('/cfdipay', data, { - //~ error:function(text, data, XmlHttpRequest){ - //~ msg = 'Ocurrio un error, consulta a soporte técnico' - //~ msg_error(msg) - //~ }, - //~ success:function(text, data, XmlHttpRequest){ - //~ values = data.json(); - //~ if(values.ok){ - //~ grid.updateItem(values.id, {'estatus': 'Cancelada'}) - //~ msg_ok(values.msg) - //~ }else{ - //~ msg_error(values.msg) - //~ } - //~ } - //~ }) - //~ } - //~ } - //~ }) - } diff --git a/source/static/js/controller/nomina.js b/source/static/js/controller/nomina.js index 4ce72a1..9a7292c 100644 --- a/source/static/js/controller/nomina.js +++ b/source/static/js/controller/nomina.js @@ -485,29 +485,43 @@ function cmd_nomina_cancel_click(){ return } - msg = '¿Estás seguro de cancelar el recibo?

' - msg += row['empleado'] + ' (' + row['serie'] + '-' + row['folio'] + ')' - msg += '

ESTA ACCIÓN NO SE PUEDE DESHACER

' - webix.confirm({ - title: 'Cancelar Nomina', - ok: 'Si', - cancel: 'No', - type: 'confirm-error', - text: msg, - callback:function(result){ - if (result){ - cancel_nomina(row['id']) - } - } - }) + win_invoice_cancel_nomina.init() + $$('win_invoice_cancel_nomina').show() } -function cancel_nomina(id){ +function cmd_win_cancel_nomina_close_click(){ + $$('win_invoice_cancel_nomina').close() +} + + +function cmd_invoice_cancel_nomina_click(){ + var reason = $$('lst_reasons_cancel').getValue() + var uuid = $$('txt_cancel_uuid').getValue() + + if(!reason){ + msg = 'Selecciona un motivo para esta cancelación' + msg_error(msg) + return + } + if(reason=='01' & !uuid){ + msg = 'Debes de capturar el UUID que reemplaza a este CFDI' + msg_error(msg) + return + } + + $$('win_invoice_cancel_nomina').close() + send_cancel_nomina(reason, uuid) +} + + +function send_cancel_nomina(reason, uuid){ var grid = $$('grid_nomina') + var row = grid.getSelectedItem() var data = new Object() data['opt'] = 'cancel' - data['id'] = id + data['id'] = row.id + data['args'] = {reason: reason, uuid: uuid} webix.ajax().sync().post('nomina', data, { error:function(text, data, XmlHttpRequest){ @@ -517,7 +531,7 @@ function cancel_nomina(id){ success:function(text, data, XmlHttpRequest){ values = data.json(); if(values.ok){ - grid.updateItem(id, values.row) + grid.updateItem(row.id, values.row) msg_ok(values.msg) }else{ msg_error(values.msg) @@ -609,3 +623,5 @@ function cmd_nomina_sat_click(){ }) } + + diff --git a/source/static/js/ui/nomina.js b/source/static/js/ui/nomina.js index feece5d..5f1d9a9 100644 --- a/source/static/js/ui/nomina.js +++ b/source/static/js/ui/nomina.js @@ -245,3 +245,44 @@ var win_import_nomina = { $$('up_nomina').attachEvent('onUploadComplete', up_nomina_upload_complete) } } + + +var opt_reasons_cancel_nomina = [ + {id: '', value: ''}, + {id: '01', value: '[01] Comprobante emitido con errores con relación'}, + {id: '02', value: '[02] Comprobante emitido con errores sin relación'}, + {id: '03', value: '[03] No se llevó acabo la operación'}, + {id: '04', value: '[04] Operación nominativa relacionada en una factura global'}, +] + + +var body_invoice_cancel_nomina = {rows: [{minHeight: 15}, + {view: 'richselect', id: 'lst_reasons_cancel', labelPosition: 'top', label: 'Razón de cancelación', options: opt_reasons_cancel_pay, value: '', width: 400}, + {view: 'text', id: 'txt_cancel_uuid', labelPosition: 'top', label: 'UUID que sustituye', width: 400}, + {view: 'label', label: 'Esta acción no se puede deshacer', autowidth: true, align: 'center'}, + {view: 'label', label: '¿Estás segura de continuar?', autowidth: true, align: 'center'}, + {cols: [{}, + {view: 'button', id: 'cmd_invoice_cancel_nomina', width: 100, label: 'Cancelar', type: 'danger', icon: 'ban'}, + {maxWidth: 25}, + {view: 'button', id: 'cmd_win_cancel_nomina_close', width: 100, label: 'Cerrar'}, + {} + ]}, + {minHeight: 20}, +]} + + +var win_invoice_cancel_nomina = { + init: function(){ + webix.ui({ + view: 'window', + id: 'win_invoice_cancel_nomina', + modal: true, + width: 400, + position: 'center', + head: 'Cancelar CFDI', + body: body_invoice_cancel_nomina, + }) + $$('cmd_invoice_cancel_nomina').attachEvent('onItemClick', cmd_invoice_cancel_nomina_click) + $$('cmd_win_cancel_nomina_close').attachEvent('onItemClick', cmd_win_cancel_nomina_close_click) + } +} diff --git a/source/templates/plantilla_pagos.ods b/source/templates/plantilla_pagos.ods index c16523d..07b2528 100644 Binary files a/source/templates/plantilla_pagos.ods and b/source/templates/plantilla_pagos.ods differ