diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py
index 9dbcca7..98183bd 100644
--- a/source/app/controllers/util.py
+++ b/source/app/controllers/util.py
@@ -1359,6 +1359,7 @@ class LIBO(object):
'codigo_postal',
'notas',
'correo',
+ 'regimen_fiscal',
)
rows = tuple([dict(zip(fields, r)) for r in data[1:]])
msg = 'Empleados importados correctamente'
@@ -1561,8 +1562,9 @@ def to_pdf(data, emisor_rfc, ods=False, pdf_from='1'):
default = f'plantilla_factura_{version}.ods'
if 'nomina' in data and data['nomina']:
- default = 'plantilla_nomina.ods'
- version = '{}_{}'.format(data['nomina']['version'], version)
+ version_nomina = data['nomina']['version']
+ default = f'plantilla_nomina_{version}_{version_nomina}.ods'
+ version = f'{version}_cn_{version_nomina}'
if 'carta_porte' in data:
default = 'plantilla_factura_cp.ods'
@@ -1576,14 +1578,16 @@ def to_pdf(data, emisor_rfc, ods=False, pdf_from='1'):
if pdf_from == '2':
return to_pdf_from_json(rfc, version, data)
+ donativo = ''
+ if data['donativo']:
+ donativo = '_donativo'
+
+ template_name = f'{rfc.lower()}_{version}.ods'
+
if APP_LIBO:
app = LIBO()
if app.is_running:
- donativo = ''
- if data['donativo']:
- donativo = '_donativo'
- name = '{}_{}{}{}.ods'.format(rfc.lower(), pagos, version, donativo)
- path = get_template_ods(name, default)
+ path = get_template_ods(template_name, default)
if path:
return app.pdf(path, data, ods)
@@ -2245,7 +2249,9 @@ def upload_file(rfc, opt, file_obj):
tmp = file_obj.filename.split('.')
ext = tmp[-1].lower()
- versions = ('_3.2.ods', '_3.3.ods', '_3.3_cp_2.0.ods', '_4.0.ods')
+ versions = ('_3.2.ods',
+ '_3.3.ods', '_3.3_cn_1.2.ods', '_3.3_cp_2.0.ods',
+ '_4.0.ods', '_4.0_cn_1.2.ods')
if opt in versions:
return save_template(rfc, opt, file_obj)
diff --git a/source/app/controllers/utils.py b/source/app/controllers/utils.py
index 985a0a9..8970bef 100644
--- a/source/app/controllers/utils.py
+++ b/source/app/controllers/utils.py
@@ -263,6 +263,7 @@ class CfdiToDict(object):
'divisas': 'http://www.sat.gob.mx/divisas',
'leyendasFisc': 'http://www.sat.gob.mx/leyendasFiscales',
'cartaporte20': 'http://www.sat.gob.mx/CartaPorte20',
+ 'nomina12': 'http://www.sat.gob.mx/nomina12',
}
tipo_figura = {
'01': '[01] Operador',
@@ -399,6 +400,14 @@ class CfdiToDict(object):
path = '//cfdi:Complemento'
complemento = self._root.xpath(path, namespaces=self.NS)[0]
+ path = '//nomina12:Nomina'
+ nomina = complemento.xpath(path, namespaces=self.NS)
+ if nomina:
+ for node in nomina[0]:
+ if 'Receptor' in node.tag:
+ attr = CaseInsensitiveDict(node.attrib)
+ self._values['receptor'].update(attr)
+
path = '//divisas:Divisas'
divisas = complemento.xpath(path, namespaces=self.NS)
if divisas:
diff --git a/source/app/models/main.py b/source/app/models/main.py
index ff4fe6d..e1c9a7b 100644
--- a/source/app/models/main.py
+++ b/source/app/models/main.py
@@ -8934,6 +8934,7 @@ class Empleados(BaseModel):
codigo_postal = TextField(default='')
notas = TextField(default='')
correo = TextField(default='')
+ regimen_fiscal = TextField(default='')
class Meta:
order_by = ('nombre_completo',)
@@ -8985,10 +8986,10 @@ class Empleados(BaseModel):
obj = Empleados.create(**data)
en += 1
- msg = 'Empleados encontrados: {}
'.format(len(rows))
- msg += 'Empleados nuevos: {}
'.format(en)
- msg += 'Empleados actualizados: {}
'.format(ea)
- msg += 'Empleados no importados: {}'.format(len(rows) - en - ea)
+ msg = 'Empleados:
Encontrados: {}
'.format(len(rows))
+ msg += 'Nuevos: {}
'.format(en)
+ msg += 'Actualizados: {}
'.format(ea)
+ msg += 'No importados: {}'.format(len(rows) - en - ea)
return {'ok': True, 'msg': msg}
def _get(self):
@@ -9706,7 +9707,7 @@ class CfdiNomina(BaseModel):
comprobante['Serie'] = cfdi.serie
comprobante['Folio'] = str(cfdi.folio)
comprobante['Fecha'] = cfdi.fecha.isoformat()[:19]
- comprobante['FormaPago'] = cfdi.forma_pago
+ # ~ comprobante['FormaPago'] = cfdi.forma_pago
comprobante['NoCertificado'] = certificado.serie
comprobante['Certificado'] = certificado.cer_txt
comprobante['SubTotal'] = FORMAT.format(cfdi.subtotal)
@@ -9733,6 +9734,8 @@ class CfdiNomina(BaseModel):
receptor = {
'Rfc': cfdi.empleado.rfc,
'Nombre': cfdi.empleado.nombre_completo,
+ 'DomicilioFiscalReceptor': cfdi.empleado.codigo_postal,
+ 'RegimenFiscalReceptor': cfdi.empleado.regimen_fiscal,
'UsoCFDI': cfdi.uso_cfdi,
}
@@ -9746,6 +9749,7 @@ class CfdiNomina(BaseModel):
'Descripcion': row.descripcion,
'ValorUnitario': FORMAT.format(row.valor_unitario),
'Importe': FORMAT.format(row.importe),
+ 'ObjetoImp': '01',
}
if row.descuento:
concepto['Descuento'] = FORMAT.format(row.descuento)
@@ -10106,7 +10110,11 @@ class CfdiNomina(BaseModel):
return b'', name
values = cls._get_not_in_xml(cls, obj, emisor)
+
data = util.get_data_from_xml(obj, values)
+
+ data.update(utils.CfdiToDict(obj.xml).values)
+
doc = util.to_pdf(data, emisor.rfc)
# ~ if sync:
@@ -11058,6 +11066,13 @@ def _migrate_tables(rfc=''):
warehouse = ForeignKeyField(Almacenes, null=True, to_field=Almacenes.id)
migrations.append(migrator.add_column(table, field, warehouse))
+ table = 'empleados'
+ field = 'regimen_fiscal'
+ columns = [c.name for c in database_proxy.get_columns(table)]
+ if not field in columns:
+ regimen_fiscal = TextField(default='')
+ migrations.append(migrator.add_column(table, field, regimen_fiscal))
+
if migrations:
with database_proxy.atomic() as txn:
migrate(*migrations)
@@ -11065,7 +11080,7 @@ def _migrate_tables(rfc=''):
Configuracion.add({'version': VERSION})
log.info('Tablas migradas correctamente...')
- _importar_valores('', rfc)
+ # ~ _importar_valores('', rfc)
log.info('Actualizando valores...')
try:
@@ -11076,6 +11091,14 @@ def _migrate_tables(rfc=''):
else:
log.info('Valores actualizados...')
+ try:
+ q = SATEstados.update(**{'key': 'CMX'}).where(SATEstados.key=='DIF')
+ q.execute()
+ except Exception as e:
+ log.error(e)
+ else:
+ log.info('Valores actualizados...')
+
return
diff --git a/source/db/valores_iniciales.json b/source/db/valores_iniciales.json
index 7cfb63a..9ca6de0 100644
--- a/source/db/valores_iniciales.json
+++ b/source/db/valores_iniciales.json
@@ -731,7 +731,7 @@
"pais": "MEX"
},
{
- "key": "DIF",
+ "key": "CMX",
"name": "Ciudad de M\u00e9xico",
"pais": "MEX"
},
diff --git a/source/static/js/controller/admin.js b/source/static/js/controller/admin.js
index c81a63f..4604a7d 100644
--- a/source/static/js/controller/admin.js
+++ b/source/static/js/controller/admin.js
@@ -81,7 +81,7 @@ var controllers = {
$$('txt_plantilla_factura_css').attachEvent('onItemClick', txt_plantilla_factura_css_click)
$$('txt_plantilla_ticket').attachEvent('onItemClick', txt_plantilla_ticket_click)
$$('txt_plantilla_donataria').attachEvent('onItemClick', txt_plantilla_donataria_click)
- $$('txt_plantilla_nomina1233').attachEvent('onItemClick', txt_plantilla_nomina1233_click)
+ //~ $$('txt_plantilla_nomina1233').attachEvent('onItemClick', txt_plantilla_nomina1233_click)
$$('txt_plantilla_pagos10').attachEvent('onItemClick', txt_plantilla_pagos10_click)
$$('make_pdf_from').attachEvent('onChange', opt_make_pdf_from_on_change)
$$('cmd_template_upload').attachEvent('onItemClick', cmd_template_upload_click)
diff --git a/source/static/js/ui/admin.js b/source/static/js/ui/admin.js
index 0362aa9..1da6d3e 100644
--- a/source/static/js/ui/admin.js
+++ b/source/static/js/ui/admin.js
@@ -598,8 +598,10 @@ var type_make_pdf = [
var opt_templates_cfdi = [
{id: '_4.0.ods', value: 'CFDI v4.0'},
+ {id: '_4.0_cn_1.2.ods', value: 'CFDI v4.0 - Nómina v1.2'},
{id: '_3.3.ods', value: 'CFDI v3.3'},
- {id: '_3.3_cp_2.0.ods', value: 'CFDI v3.3 - Carta Porte 2.0'},
+ {id: '_3.3_cn_1.2.ods', value: 'CFDI v3.3 - Nómina v1.2'},
+ {id: '_3.3_cp_2.0.ods', value: 'CFDI v3.3 - Carta Porte v2.0'},
{id: '_3.2.ods', value: 'CFDI v3.2'},
]
@@ -629,11 +631,6 @@ var options_templates = [
{}, {maxWidth: 20} ]},
{maxHeight: 20},
- {cols: [{maxWidth: 20},
- {view: 'search', id: 'txt_plantilla_nomina1233', name: 'plantilla_nomina1233',
- label: 'Plantilla Nomina v1.2 - Cfdi 3.3 (ODS): ', labelPosition: 'top',
- icon: 'file'}, {maxWidth: 40}, {}]},
- {maxHeight: 20},
{cols: [{maxWidth: 20},
{view: 'search', id: 'txt_plantilla_pagos10', name: 'plantilla_pagos10',
label: 'Plantilla Factura de Pagos v1.0 - Cfdi 3.3 (ODS): ',
@@ -827,7 +824,7 @@ var options_admin_products = [
var options_admin_complements = [
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento de Nómina', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_usar_nomina', labelWidth: 0,
@@ -837,7 +834,7 @@ var options_admin_complements = [
{view: 'text', id: 'txt_config_nomina_folio', name: 'config_nomina_folio',
label: 'Folio', labelWidth: 50, labelAlign: 'right'},
{maxWidth: 15}]},
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento de Pagos', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_config_pagos', labelWidth: 0,
@@ -849,25 +846,25 @@ var options_admin_complements = [
{view: 'text', id: 'txt_config_cfdipay_folio', name: 'txt_config_cfdipay_serie',
label: 'Folio', labelWidth: 50, labelAlign: 'right'},
{maxWidth: 15}]},
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento de Divisas', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_config_divisas', labelWidth: 0,
labelRight: 'Usar complemento de divisas'},
{maxWidth: 15}]},
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento INE', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_config_ine', labelWidth: 0,
labelRight: 'Usar el complemento INE'},
{maxWidth: 15}]},
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento para escuelas EDU', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_config_edu', labelWidth: 0,
labelRight: 'Usar el complemento EDU'},
{maxWidth: 15}]},
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento Leyendas Fiscales', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_config_leyendas_fiscales', labelWidth: 0,
@@ -876,7 +873,7 @@ var options_admin_complements = [
type: 'form', align: 'center', autowidth: true, disabled: true},
{}, {maxWidth: 15}
]},
- {maxHeight: 20},
+ {maxHeight: 10},
{template: 'Complemento para Carta Porte', type: 'section'},
{cols: [{maxWidth: 15},
{view: 'checkbox', id: 'chk_config_carta_porte', labelWidth: 0,
diff --git a/source/templates/plantilla_nomina.ods b/source/templates/plantilla_nomina_3.3_1.2.ods
similarity index 100%
rename from source/templates/plantilla_nomina.ods
rename to source/templates/plantilla_nomina_3.3_1.2.ods
diff --git a/source/templates/plantilla_nomina_4.0_1.2.ods b/source/templates/plantilla_nomina_4.0_1.2.ods
new file mode 100644
index 0000000..7d8c93a
Binary files /dev/null and b/source/templates/plantilla_nomina_4.0_1.2.ods differ
diff --git a/source/xslt/cadena.xslt b/source/xslt/cadena.xslt
index db72919..c4e48ed 100644
--- a/source/xslt/cadena.xslt
+++ b/source/xslt/cadena.xslt
@@ -5,16 +5,17 @@
+
+