From 2272a4b6c73f164ef3b7496f45e953830ebf0f07 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 31 Jan 2018 20:35:26 -0600 Subject: [PATCH 1/4] Fix - Issue #164 --- source/static/js/controller/nomina.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/static/js/controller/nomina.js b/source/static/js/controller/nomina.js index efc5c19..4971a52 100644 --- a/source/static/js/controller/nomina.js +++ b/source/static/js/controller/nomina.js @@ -432,6 +432,12 @@ function cmd_nomina_cancel_click(){ msg_error(msg) return } + if(Array.isArray(row)){ + msg = 'Selecciona solo un registro' + msg_error(msg) + return + } + if(row['estatus'] != 'Timbrado'){ msg = 'Solo se pueden cancelar recibos timbrados' msg_error(msg) From 1f40c42ba0a7390af79b4f482b50c24412f41e57 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 31 Jan 2018 21:51:22 -0600 Subject: [PATCH 2/4] Fix - Issue #165 --- source/app/models/main.py | 64 +++------------------------ source/static/js/controller/nomina.js | 1 + 2 files changed, 8 insertions(+), 57 deletions(-) diff --git a/source/app/models/main.py b/source/app/models/main.py index 5fdb284..9e187b8 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -3169,60 +3169,6 @@ class Facturas(BaseModel): obj.save() return {'ok': True, 'msg': 'Notas guardadas correctamente'} - #~ Revisar - def _get_data_cfdi_to_pdf(self, xml, cancel, version): - pre_nomina = PRE['NOMINA'][version] - - data['nomina'] = {} - node = doc.find('{}Complemento/{}Nomina'.format(pre, pre_nomina)) - if not node is None: - data['nomina']['nomina'] = node.attrib.copy() - subnode = node.find('{}Emisor'.format(pre_nomina)) - if not subnode is None: - data['emisor'].update(subnode.attrib.copy()) - subnode = node.find('{}Receptor'.format(pre_nomina)) - data['receptor'].update(subnode.attrib.copy()) - - subnode = node.find('{}Percepciones'.format(pre_nomina)) - data['nomina']['percepciones'] = subnode.attrib.copy() - detalle = [] - for n in subnode.getchildren(): - if 'SeparacionIndemnizacion' in n.tag: - continue - detalle.append(n.attrib.copy()) - data['nomina']['percepciones']['detalle'] = detalle - - data['nomina']['deducciones'] = None - subnode = node.find('{}Deducciones'.format(pre_nomina)) - if not subnode is None: - data['nomina']['deducciones'] = subnode.attrib.copy() - detalle = [] - for n in subnode.getchildren(): - detalle.append(n.attrib.copy()) - data['nomina']['deducciones']['detalle'] = detalle - - data['nomina']['incapacidades'] = None - subnode = node.find('{}Incapacidades'.format(pre_nomina)) - if not subnode is None: - detalle = [] - for n in subnode.getchildren(): - detalle.append(n.attrib.copy()) - data['nomina']['incapacidades'] = detalle - - data['nomina']['otrospagos'] = None - subnode = node.find('{}OtrosPagos'.format(pre_nomina)) - if not subnode is None: - data['nomina']['otrospagos'] = subnode.attrib.copy() - detalle = [] - for n in subnode.getchildren(): - detalle.append(n.attrib.copy()) - ns = n.find('{}SubsidioAlEmpleo'.format(pre_nomina)) - if not ns is None: - data['nomina']['otrospagos']['SubsidioCausado'] = ns.attrib['SubsidioCausado'] - data['nomina']['otrospagos']['detalle'] = detalle - - return data - def _get_not_in_xml(self, invoice, emisor): values = {} @@ -6078,12 +6024,16 @@ class CfdiNomina(BaseModel): ) return {'ok': True, 'rows': tuple(rows)} - def _validate_timbrado(self, data): + def _validate_rules_nomina(self, data): receptor = data['receptor'] if receptor['TipoContrato'] == '99': del data['emisor']['RegistroPatronal'] - return data + # ~ NOM 154 + if data['nomina']['TipoNomina'] == 'E': + data['receptor']['PeriodicidadPago'] = '99' + + return def _make_xml(self, cfdi, auth): emisor = Emisor.select()[0] @@ -6300,7 +6250,7 @@ class CfdiNomina(BaseModel): 'otros_pagos': otros_pagos, 'incapacidades': incapacidades, } - nomina = self._validate_timbrado(self, nomina) + self._validate_rules_nomina(self, nomina) data = { 'comprobante': comprobante, diff --git a/source/static/js/controller/nomina.js b/source/static/js/controller/nomina.js index 4971a52..a80a3cb 100644 --- a/source/static/js/controller/nomina.js +++ b/source/static/js/controller/nomina.js @@ -432,6 +432,7 @@ function cmd_nomina_cancel_click(){ msg_error(msg) return } + if(Array.isArray(row)){ msg = 'Selecciona solo un registro' msg_error(msg) From 781623a64a18d76ded6e222e2999da6a431847c8 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 31 Jan 2018 22:12:56 -0600 Subject: [PATCH 3/4] Fix - Issue #166 --- source/app/controllers/util.py | 1 + source/app/models/main.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index c8421e1..7d757de 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -1368,6 +1368,7 @@ def _receptor(doc, version, values): return data data['usocfdi'] = values['usocfdi'] + data.update(values['receptor']) return data diff --git a/source/app/models/main.py b/source/app/models/main.py index 9e187b8..95b8268 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -3200,6 +3200,10 @@ class Facturas(BaseModel): obj = SATTipoRelacion.get(SATTipoRelacion.key==invoice.tipo_relacion) values['tiporelacion'] = str(obj) + receptor = Socios.select().where(Socios.id==invoice.cliente.id).dicts()[0] + values['receptor'] = {} + for k, v in receptor.items(): + values['receptor'][k] = v return values @classmethod From f55a78060da4194718b296dfa230ba24a3f07fb2 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 31 Jan 2018 22:40:47 -0600 Subject: [PATCH 4/4] =?UTF-8?q?Fix=20-=20Fecha=20de=20ingreso=20vac=C3=ADa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/app/models/main.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/app/models/main.py b/source/app/models/main.py index 95b8268..395a7ad 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -15,7 +15,7 @@ if __name__ == '__main__': from controllers import util -from settings import log, VERSION, PATH_CP, COMPANIES, PRE, CURRENT_CFDI, \ +from settings import log, DEBUG, VERSION, PATH_CP, COMPANIES, PRE, CURRENT_CFDI, \ INIT_VALUES, DEFAULT_PASSWORD, DECIMALES, IMPUESTOS, DEFAULT_SAT_PRODUCTO, \ CANCEL_SIGNATURE, PUBLIC, DEFAULT_SERIE_TICKET, CURRENT_CFDI_NOMINA, \ DEFAULT_SAT_NOMINA, DECIMALES_TAX, TITLE_APP @@ -5520,8 +5520,11 @@ class Empleados(BaseModel): data = row.copy() data['nombre_completo'] = '{} {} {}'.format( row['nombre'], row['paterno'], row['materno']).strip() + + data['fecha_ingreso'] = None if row['fecha_ingreso']: data['fecha_ingreso'] = util.calc_to_date(row['fecha_ingreso']) + data['tipo_contrato'] = SATTipoContrato.get_by_key(row['tipo_contrato']) data['es_sindicalizado'] = sn.get(row['es_sindicalizado'].lower(), False) data['tipo_jornada'] = SATTipoJornada.get_by_key(row['tipo_jornada']) @@ -5543,8 +5546,8 @@ class Empleados(BaseModel): en = 0 ea = 0 for row in rows: - # ~ if row['rfc'] == 'BASM740115RW0': - # ~ continue + if not DEBUG and row['rfc'] == 'BASM740115RW0': + continue data = self._validate_import(self, row) w = (Empleados.rfc==row['rfc']) with database_proxy.transaction():