Índice
01. Visión General
Debido a la actualización de la Facturación Electrónica con la Reforma Fiscal 2022; se modificó en el apartado Recibo de Nómina (dentro de la documentación técnica Factura Electrónica) del CFDI 4.0, se establece que la vigencia de esta nueva versión inicia a partir del 01 de enero del 2022, el complemento de nómina versión 1.2 se integra con la versión 4.0 del CFDI en su revisión C, siendo obligatorio a partir del 1 de julio de 2022.
Por tanto, será a partir del 1 de julio de 2022 que se deje de utilizar la versión 3.3 y se generalice la obligación de emitir la versión 4.0.
Para cumplir con dicha reforma fiscal, se modifica el esquema del CFDI con los siguientes cambios:
- Se actualiza a versión 4.0.
- Se quita la forma de pago (FormaPago).
- Como parte de la integración con el CFDI versión 4.0, se incorporan requisitos obligatorios para la emisión del comprobante de nómina, por lo que se incluyen nuevos atributos (Exportacion, DomicilioFiscalReceptor, RegimenFiscalReceptor y ObjetoImp).
Actualización de las direcciones URL de los esquemas XML y XSD para actualizarlos a CFDI 4.0:
Anterior
Nuevo
http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/cfd/3
http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/cfd/4
- Uso CFDI - c_UsoCFDI
Se cambia el valor fijo "P01" por "CN01" (Nómina) del catálogo c_UsoCFDI publicado en el Portal del SAT. - Actualización de las tablas de los catálogos “Deducciones” y “TipoOtroPago”.
Se crea un nuevo script Generación de XML para recibos de Nómina 4.0 (gper88440.ini) para la nueva versión 4.0, donde se realizan todos los nuevos ajustes para agregar los nuevos atributos Exportacion, DomicilioFiscaIReceptor, RegimenFiscalReceptor y Objetolmp, además se actualizan las URL utilizadas para la versión CFDi 4.0.
En la rutina Recibo de Pago (GPER884.PRW) se realiza un cambio para que en el caso de la versión 3.3, permanezca el uso del script Generación de XML para recibos de Nómina 3.3 y para la versión 4.0 se use el nuevo script Generación de XML para recibos de Nómina 4.0, esto en base al parámetro MV_CFDI40 y que exista el campo RA_FISCALI.
Se actualiza la tabla alfanumérica S031 - Tipo concepto SAT, con los catálogos publicados por el SAT para “Deducciones” y “TipoOtroPago”.
Para mayor información ver la documentación del Portal del SAT.
02. Rutinas Utilizadas
Para contar con la nueva funcionalidad de Recibo de Nómina para versión CFDI 4.0, es necesario tener actualizadas las siguientes rutinas:
GPER884.PRW | Recibos de Nomina CFDI v 1.2 |
---|---|
gper884.ini | Generación de XML para recibos de Nómina 3.3 |
gper88440.ini | Generación de XML para recibos de Nómina 4.0 |
GPTABMEX.PRX | Definición tablas alfanuméricas. |
GPCRGMEX.PRX | Mantenimiento tablas alfanuméricas. |
GPER884.PRW | Recibos de Nomina CFDI v 1.2 |
TIMBRERN.PRW | Timbrado de CFDI con Complemento de Recibo de Nómina. |
CANCTFD.PRW | Cancelación de CFDI con Complemento de Nómina. |
FISA812.PRW | Definición de catálogos |
FISA813.PRW | Mantenimiento de catálogos. |
FISA814.PRW | Generación de Catálogos. |
Actualización de Diccionario de Datos
Al contar con las versiones de las rutinas descritas anteriormente; en la rutina Recibos de Nómina CFDI Versión 1.2 (GPER884), si no se cuenta con la actualización del Diccionario de Datos mencionadas en el presente Documento Técnico, no se podrá utilizar la rutina. Se enviará un mensaje indicando que se debe actualizar el grupo de preguntas GPER884.
Lo anterior se agregó para evitar errores en el proceso de Timbrado y Cancelación.
03. Ejemplo de Utilización
Implementación
- Se debe contar con las configuraciones en Catálogos, Parámetros (SX6), etc., utilizadas en versiones anteriores; para más detalle consultar el documento Recibo de Nómina CFDi versión 3.3: DT Recibo de Nómina CFDi 3.3 - México.
- Actualizar el ejecutable homologado del Proveedor Autorizado de Certificación (PAC), siguiendo las instrucciones mencionadas en la sección 08. Ejecutables homologados.
Tener implementada la cancelación de CFDI Nómina con motivos de cancelación: 13481039 DNOMI-47 DT Cancelación CFDI de Nómina con Motivos de Cancelación MEX: verificar que se tenga actualizado el grupo de GPER884 y CANCTFD, creación de los campos RIW_MOTIVO y RIW_IDSUST.
Actualización de Diccionario de Datos
En la rutina Recibos de Nómina CFDI Versión 1.2 (GPER884), si no se cuenta con la actualización del Diccionario de Datos, no se podrá utilizar la rutina. Se enviará un mensaje indicando que se debe actualizar el grupo de preguntas GPER884.
Lo anterior se agregó para evitar errores en el proceso de Timbrado y Cancelación.
- Configurar parámetro MV_CFDI40 igual a ".T." para activar la versión 4.0 del CFDI, verificar que se tenga creado el campo RA_FISCALI y la consulta MEX010; mencionadas en la sección 05. DICCIONARIO DE DATOS.
- Verificar que se tenga información del catálogo S010 - Régimen Fiscal (tablas F3H - Definición de catálogos y F3I - Catálogos del módulo de Facturación) para más detalle consultar el apartado 05. DICCIONARIO DE DATOS.
Copiar el script de Generación de XML para recibos de Nómina 4.0 (gper88440.ini), en la carpeta "system" del ambiente (con los ajustes mencionados anteriormente) y realizar la parametrización necesaria.
Archivo de Configuración
Si cuenta con personalizaciones en el archivo de configuración (gper884.ini) correspondiente a la versión CFDI 3.3, se recomienda realizar la indicaciones mencionadas en la sección "Archivo de Configuración" del punto 06. Archivo de Configuración (gper88440.ini).
- Respaldar las tablas alfanuméricas (RCB y RCC), eliminar el contenido de la tabla S031 - Tipo concepto SAT.
- A través de la rutina “Definición Tablas” y “Mantenimiento Tab." en el menú SIGAGPE (Actualizaciones | Definic. de Cálculo), se debe entrar a las rutinas para que se cree la tabla alfanumérica.
A través de la rutina Empleados en el módulo Gestión de Personal – SIGAGPE (Actualizaciones | Empleados), registrar un empleado que tenga informado el C.P. (RA_CEP) y el nuevo campo Rég.Fiscal (RA_FISCALI), además de todas las configuraciones ya usadas para el versión 3.3.
Campos obligatorios
- Los campos correspondientes al Nombre, RFC, Código Postal y Régimen Fiscal; tanto para el Emisor como Receptor deben coincidir con los registrados ante el SAT.
Se sugiere que el campo Rég.Fiscal (RA_FISCALI) del Empleado (Receptor), contenga la clave “605” - Sueldos y Salarios e Ingresos Asimilados a Salarios, como régimen fiscal del contribuyente receptor del comprobante (trabajador asalariado o asimilado a salarios).
Este dato podrá ser consultado en la constancia de situación fiscal emitida por el SAT, la cual se puede obtener en la siguiente liga:
https://www.sat.gob.mx/aplicacion/login/53027/genera-tu-constancia-de-situacion-fiscal
A través de la rutina “Conceptos” en el menú SIGAGPE (Actualizaciones | Definic. de Cálculo), se deben tener registros de conceptos.
A través de la rutina "Empleados" en el módulo Gestión de Personal – SIGAGPE (Actualizaciones | Empleados), tener empleados registrados.
- A través de la rutina "Tipos. de Procedim." en el módulo Gestión de Personal – SIGAGPE (Actualizaciones | Definic. Cálculo), contar con un procedimiento de nómina.
- A través de la rutina "Procesos" en el módulo Gestión de Personal (Actualizaciones | Definic. Cálculo), tener un proceso.
A través de la rutina "Periodos" en el módulo Gestión de Personal – SIGAGPE (Actualizaciones | Definic. Cálculo), tener un periodo abierto para el procedimiento y proceso definidos.
- Realizar el Cálculo de Nómina para el empleado previamente configurado; módulo Gestión de Personal (SIGAGPE), rutina Miscelánea | Cálculos | Por Procedimientos (GPEM020).
- Verificamos los Movimientos de Nómina (SRC) para el Periodo, Proceso y Procedimiento calculados.
04. Timbrado de Recibos de Nómina
Descripción general del proceso de Generación, Timbrado, Impresión y Envío de Recibos de Nómina:
Ubicación
Menú | Gestión de Personal |
Submenú | Informes | Empleados |
Nombre de la Rutina | Recibo de Nómina CFDI V1.2 |
Programa | GPER884 |
Módulo | Gestión de Personal |
Tipo | Función Protheus |
Procedimiento
Recibo de Nómina CFDI v1.2 (GPER884.PRW):
- Ingresar al módulo Gestión de Personal (SIGAGPE), opción "Informes | Empleados | Recibo de Nómina CFDI v1.2" (GPER884). Indicar los parámetros requeridos en base al cálculo realizado previamente:
- ¿Proceso?: Se debe definir el proceso para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para la consulta de procesos - RCJ).
- ¿Procedimiento?: Se debe definir el procedimiento para la generación de los recibos de nómina (teclear el valor directamente o bien presionar la tecla F3 para consultar los procedimientos - SRY).
- ¿Periodo?: Se debe definir el periodo para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para la consulta de periodos - RCH). Pueden ser periodos abiertos o cerrados.
- ¿Numero de Pago?: Se debe definir el número de pago para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para consultar los números de pago – RCH01).
- ¿Pre-imp/Mail?: Se debe definir el tipo de generación de los recibos de nómina. Las opciones disponibles son “Impreso” e “E-mail”. Indicar la opción "Impreso"
- ¿De Sucursal / A Sucursal?: Se debe definir el rango de las sucursales para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para consultar las sucursales – XM0).
- ¿De Matricula / A Matricula?: Se debe definir el rango de matrículas para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para consultar las matrículas – SRA02).
- ¿De Nombre? / ¿A Nombre:? Se debe definir el rango de nombres para la generación de los recibos de nómina (teclearlo directamente).
- ¿De Nº de Tarj. sin Rel.? / ¿A Nº de Tarj. sin Rel.?: Se debe ingresar el número de tarjeta para la generación de los recibos de nómina (teclear directamente).
- ¿De Centro de Costo? / ¿A Centro de Costo?: Se debe definir el rango de centro de costos para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para consultar los centros de costo - CTT).
- ¿De Departamento? / ¿A Departamento?: Se debe definir el rango de departamentos para la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para consultar departamentos - SQB).
- ¿Situaciones por Impr?.: Se debe definir las situaciones o estatus por imprimir para la generación de los recibos de nómina (teclear directamente).
- ¿Categorías por Impr.?: Se debe definir las categorías por imprimir para la generación de los recibos de nómina (teclear directamente).
- Mensaje 1 / Mensaje 2 / Mensaje 3/ Mensaje Pie de Pag.: Definir un mensaje para mostrar en la generación de los recibos de nómina (teclear directamente o bien presionar la tecla F3 para consultar mensajes – S018). Este mensaje se mostrara en la sección de mensajes del Recibo.
- ¿De Local Pago? / ¿A Local Pago?: Definir el rango de Localidades de Pago para la generación de los recibos de nómina (teclear directamente).
- ¿Sumariza Concepto?: Definir si el concepto será resumido. Las opciones disponibles son “Si” o “No”.
- ¿Envía Timbrar?: Definir si se envía a Timbrar o solo se imprimen. Las opciones disponibles son “Si” o “No”.
- ¿Sustituye Recibo Anterior?: Definir si se sustituirá el recibo anterior será sustituido por algún error. Las opciones disponibles son “Si” o “No”.
- ¿Enviar a Canc. Rec. Ant.?: Definir si se sustituirá el recibo anterior será cancelado automáticamente. Las opciones disponibles son “Si” o “No”.
¿Motivo de Cancelación?: Definir el motivo por el cual será cancelado el recibo anterior y si el recibo actual tendrá el nodo "CfdiRelacionados". Las opciones disponibles son “01” o “02”.
Uso de Preguntas 28, 29 y 30
Para mayor información sobre el uso de las preguntas ¿Sustituye Recibo Anterior?, ¿Enviar a Canc. Rec. Ant.? y ¿Motivo de Cancelación?; se recomienda leer el siguiente documento:
DT Cancelación y Timbrado de Complemento de Nómina con Motivos de Cancelación MEX
Confirmar la generación del Recibo de Nómina.
Matriz de Errores
En caso de ocurrir un error durante el proceso de timbrado, se recomienda leer la información de "Matriz de Errores" mencionada en la sección 05. ASUNTOS RELACIONADOS.
- Verificar que el XML contenga los siguientes atributos en azul:
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nomina12="http://www.sat.gob.mx/nomina12" xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd" Version="4.0" Serie="000012D MG 01" Folio="020120200301" Fecha="2022-04-07T15:04:59" Sello="5mi2bys8eHtz2uXguxXWqyEfqjtCMDTQ==" NoCertificado="00001000000502636197" Certificado="MRS/CtUeOxXZxFgnV6luIS1kzu+7aj4WR+m3" SubTotal="14783.93" Descuento="1927.25" Moneda="MXN" Total="12856.68" TipoDeComprobante="N" Exportacion="01" MetodoPago="PUE" LugarExpedicion="76000">
<cfdi:Emisor Rfc="TME031112BC0" Nombre="TOTVS MEXICO" RegimenFiscal="601"/>
<cfdi:Receptor Rfc="GORM900830JN4" Nombre="MARCO AUGUSTO GONZALEZ RIVERA" DomicilioFiscalReceptor="76117" RegimenFiscalReceptor="605" UsoCFDI="CN01"/>
<cfdi:Conceptos>
<cfdi:Concepto ClaveProdServ="84111505" Cantidad="1" ClaveUnidad="ACT" Descripcion="Pago de nómina" ValorUnitario="14783.93" Importe="14783.93" Descuento="1927.25" ObjetoImp="01"/>
</cfdi:Conceptos>
<cfdi:Complemento>
<nomina12:Nomina Version="1.2" TipoNomina="O" FechaPago="2020-03-15" FechaInicialPago="2020-03-01" FechaFinalPago="2020-03-15" NumDiasPagados="1" TotalPercepciones="14783.92" TotalDeducciones="1927.25" TotalOtrosPagos="0.01" >
<nomina12:Emisor RegistroPatronal="TOV12312312345" RfcPatronOrigen="TME031112BC0"/>
<nomina12:Receptor Curp="GUCJ711118HMCRRS01" NumSeguridadSocial="96907103020" FechaInicioRelLaboral="2020-01-01" Antigüedad="P10W" TipoContrato="01" Sindicalizado="No" TipoJornada="01" TipoRegimen="02" NumEmpleado="000012" Departamento="DEPARTAMENTO 05" Puesto="ADMINISTRATIVO" RiesgoPuesto="1" PeriodicidadPago="04" Banco="030" CuentaBancaria="1234567891" SalarioBaseCotApor="7701.00" SalarioDiarioIntegrado="107.32" ClaveEntFed="QUE"/>
<nomina12:Percepciones TotalSueldos="14783.92" TotalGravado="7701.00" TotalExento="7082.92">
<nomina12:Percepcion TipoPercepcion="001" Clave="100" Concepto="Sueldo" ImporteGravado="7701.00" ImporteExento="0.00"/>
<nomina12:Percepcion TipoPercepcion="004" Clave="705" Concepto="Neto Pagado" ImporteGravado="0.00" ImporteExento="7082.92"/>
</nomina12:Percepciones>
<nomina12:Deducciones TotalOtrasDeducciones="1309.17" TotalImpuestosRetenidos="618.08" >
<nomina12:Deduccion TipoDeduccion="002" Clave="403" Concepto="ISR Neto" Importe="618.08"/>
<nomina12:Deduccion TipoDeduccion="048" Clave="490" Concepto="Provision IETU" Importe="1309.17"/>
</nomina12:Deducciones>
<nomina12:OtrosPagos>
<nomina12:OtroPago TipoOtroPago="002" Clave="002" Concepto="Subsidio para el empleo (Efectivamente entregado al trabajador)." Importe="0.01" >
<nomina12:SubsidioAlEmpleo SubsidioCausado="0.01"/>
</nomina12:OtroPago>
</nomina12:OtrosPagos>
</nomina12:Nomina>
</cfdi:Complemento>
</cfdi:Comprobante>
Atributos nuevos en el XML
- xlms:cfdi / xsi:schemaLocation = Contienen las URL's correspondientes a la versión 4.0 de CFDI.
- Exportacion = Definido en la guía de llenado que debe llevar el valor "01".
- RegimenFiscal (Emisor) = Código registrado ante el SAT.
- DomicilioFiscalReceptor = Código Postal del Receptor, tomado del campo RA_CEP.
- RegimenFiscalReceptor = Código registrado ante el SAT para el Empleado, tomado del campo RA_FISCALI.
- UsoCFDI = Definido en la guía de llenado que debe levar el valor "CN01".
- ObjetoImp = Definido en la guía de llenado que debe levar el valor "01"
05. Diccionario de Datos
Cambios al Diccionario de Datos.
Verificar que se tengan las siguientes configuraciones, en caso contrario, crearlas desde la opción Base de Datos (Base de Datos | Diccionario) el módulo del Configurador (SIGACFG).
Parámetros en el archivo SX6 – Parámetros:
Nombre de la Variable | MV_CFDI40 |
---|---|
Tipo | Lógico |
Descripción | Uso de CFDI versión 4.0 |
Valor Estándar | .T. |
Actualización Consulta Estándar en el archivo SXB – Consulta Estándar:
Alias | Tipo | Secuencia | Columna | Descripción | Contenido |
MEX010 | 1 | 01 | RE | Régimen fiscal | F3I |
MEX010 | 2 | 01 | 01 | Régimen fiscal | F812SXB("S010","RegiFiscal") |
MEX010 | 5 | 01 | VAR_IXB |
En la Tabla SRA - Maestro de Empleados:
Se agregó el siguiente campo:
Campo | RA_FISCALI |
---|---|
Tipo | C - Carácter |
Tamaño | 3 |
Decimal | 0 |
Formato | @! |
Contexto | Real |
Propiedad | Modificar |
Tit. Español | Rég. Fiscal |
Desc. Español | Régimen Fiscal |
Validación | Vazio() .Or. ValidF3I("S010",M->RA_FISCALI,1,3) |
Obligatorio | No |
Consulta | MEX010 |
Usado | Si |
Exhibe en Browse | No |
Help | Atributo requerido para incorporar la clave del régimen fiscal del contribuyente receptor al que aplicará el efecto fiscal de este comprobante. |
Paquetes de actualización
Las actualizaciones al Diccionario de Datos, se realizaron en los siguientes paquetes:
Código: 010082
Contenido: Crea del parámetro MV_CFDI40 y la consulta MEX010.
Código: 010339
Pacote: DNOMI-176 - Recibo de pago de nómina y su complemento versión 4.0 del CFDi.
Contenido: Crea el campo RA_FISCALI.
Carga de Tabla Alfanumérica
S031 - Tipo concepto SAT
Clave | Descripción |
---|---|
001P | Sueldos, Salarios, Rayas y Jornales |
002P | Gratificación Anual (Aguinaldo) |
003P | Participación de los Trabajadores en las Utilidades PTU |
004P | Reembolso de Gastos Médicos, Dentales y Hospitalarios |
005P | Fondo de Ahorro |
006P | Caja de Ahorro |
009P | Contribuciones a Cargo del Trabajador Pagadas por el Patrón |
010P | Premio por Puntualidad |
011P | Prima De Seguro De Vida |
012P | Seguro de Gastos Médicos Mayores |
013P | Cuotas Sindicales Pagadas por el Patrón |
014P | Subsidios por Incapacidad |
015P | Becas para Trabajadores y/o Hijos |
019P | Horas Extras |
020P | Prima Dominical |
021P | Prima Vacacional |
022P | Prima por Antigüedad |
023P | Pagos por Separación |
024P | Seguro de Retiro |
025P | Indemnizaciones |
026P | Reembolso por Funeral |
027P | Cuotas de Seguridad Social Pagadas por el patrón |
028P | Comisiones |
029P | Vales de despensa |
030P | Vales de restaurantes |
031P | Vales de gasolina |
032P | Vales de ropa |
033P | Ayuda para la renta |
034P | Ayuda para artículos escolares |
035P | Ayuda para anteojos |
036P | Ayuda para transporte |
037P | Ayuda para gastos de funeral |
038P | Otros ingresos por salarios |
039P | Jubilaciones, pensiones o haberes de retiro |
044P | Jubilaciones, pensiones o haberes de retiro en parcialidades |
045P | Ingresos en acciones o títulos valor que representan bienes |
046P | Ingresos asimilados a salarios |
047P | Alimentación |
048P | Habitación |
049P | Premios por asistencia |
001D | Seguridad Social |
002D | ISR |
003D | Aportaciones a Retiro, Cesantía en Edad Avanzada y Vejez |
004D | Otros |
005D | Aportaciones a Fondo de Vivienda |
006D | Descuento por Incapacidad |
007D | Pensión Alimenticia |
008D | Renta |
009D | Préstamos provenientes del Fondo Nacional de la Vivienda para los Trabajadores |
010D | Pago por Crédito de Vivienda |
011D | Pago de Abonos INFONACOT |
012D | Anticipo de Salarios |
013D | Pagos hechos con exceso al trabajador |
014D | Errores |
015D | Pérdidas |
016D | Averías |
017D | Adquisición de artículos producidos por la empresa o establecimiento. |
018D | Cuotas para la constitución y fomento de sociedades cooperativas y de cajas de ahorro |
019D | Cuotas Sindicales |
020D | Ausencias (Ausentismo) |
021D | Cuotas Obrero Patronales |
022D | Impuestos Locales |
023D | Aportaciones voluntarias |
001O | Reintegro de ISR pagado en exceso (siempre que no haya sido enterado al SAT). |
002O | Subsidio para el empleo (efectivamente entregado al trabajador). |
003O | Viáticos (entregados al trabajador). |
004O | Aplicación de saldo a favor por compensación anual. |
006O* | Alimentos en bienes (Servicios de comedor y comida) Art 94 último párrafo LISR. |
007O* | ISR Ajustado por subsidio. |
008O* | Subsidio efectivamente entregado que no correspondía (Aplica sólo cuando haya ajuste al cierre de mes). |
999O | Pagos distintos a los listados y que no deben considerarse como ingreso por sueldos, salarios o ingresos asimilados. |
050P | VIÁTICOS |
024D | Ajuste en Gratificación Anual (Aguinaldo) Exento |
025D | Ajuste en Gratificación Anual (Aguinaldo) Gravado |
026D | Ajuste en Participación de los Trabajadores en las Utilidades PTU Exento |
027D | Ajuste en Participación de los Trabajadores en las Utilidades PTU Gravado |
028D | Ajuste en Reembolso de Gastos Médicos Dentales y Hospitalarios Exento |
029D | Ajuste en Fondo de ahorro Exento |
030D | Ajuste en Caja de ahorro Exento |
031D | Ajuste en Contribuciones a Cargo del Trabajador Pagadas por el Patron Exento |
032D | Ajuste en Premios por puntualidad Gravado |
033D | Ajuste en Prima de Seguro de vida Exento |
034D | Ajuste en Seguro de Gastos Médicos Mayores Exento |
035D | Ajuste en Cuotas Sindicales Pagadas por el Patrón Exento |
036D | Ajuste en Subsidios por incapacidad Exento |
037D | Ajuste en Becas para trabajadores y/o hijos Exento |
038D | Ajuste en Horas extra Exento |
039D | Ajuste en Horas extra Gravado |
040D | Ajuste en Prima dominical Exento |
041D | Ajuste en Prima dominical Gravado |
042D | Ajuste en Prima vacacional Exento |
043D | Ajuste en Prima vacacional Gravado |
044D | Ajuste en Prima por antig³edad Exento |
045D | Ajuste en Prima por antig³edad Gravado |
046D | Ajuste en Pagos por separación Exento |
047D | Ajuste en Pagos por separación Gravado |
048D | Ajuste en Seguro de retiro Exento |
049D | Ajuste en Indemnizaciones Exento |
050D | Ajuste en Indemnizaciones Gravado |
051D | Ajuste en Reembolso por funeral Exento |
052D | Ajuste en Cuotas de seguridad social pagadas por el patrón Exento |
053D | Ajuste en Comisiones Gravado |
054D | Ajuste en Vales de despensa Exento |
055D | Ajuste en Vales de restaurante Exento |
056D | Ajuste en Vales de gasolina Exento |
057D | Ajuste en Vales de ropa Exento |
058D | Ajuste en Ayuda para renta Exento |
059D | Ajuste en Ayuda para artículos escolares Exento |
060D | Ajuste en Ayuda para anteojos Exento |
061D | Ajuste en Ayuda para transporte Exento |
062D | Ajuste en Ayuda para gastos de funeral Exento |
063D | Ajuste en Otros ingresos por salarios Exento |
064D | Ajuste en Otros ingresos por salarios Gravado |
065D | Ajuste en Jubilaciones pensiones o haberes de retiro Exento |
066D | Ajuste en Jubilaciones pensiones o haberes de retiro Gravado |
067D | Ajuste en Pagos por separación Acumulable |
068D | Ajuste en Pagos por separación No acumulable |
069D | Ajuste en Jubilaciones pensiones o haberes de retiro Acumulable |
070D | Ajuste en Jubilaciones pensiones o haberes de retiro No acumulable |
071D | Ajuste en Subsidio para el empleo (efectivamente entregado al trabajador |
072D | Ajuste en Ingresos en acciones o títulos valor que representan bienes Exento |
073D | Ajuste en Ingresos en acciones o títulos valor que representan bienes Gravado |
074D | Ajuste en Alimentación Exento |
075D | Ajuste en Alimentación Gravado |
076D | Ajuste en Habitación Exento |
077D | Ajuste en Habitación Gravado |
078D | Ajuste en Premios por asistencia |
079D | Ajuste en Pagos distintos a los listados y que no deben considerarse como ingreso por sueldos salarios o ingresos asimilados. |
080D | Ajuste en Viáticos gravados |
081D | Ajuste en Viáticos (entregados al trabajador) |
082D | Ajuste en Fondo de ahorro Gravado |
083D | Ajuste en Caja de ahorro Gravado |
084D | Ajuste en Prima de Seguro de vida Gravado |
085D | Ajuste en Seguro de Gastos Médicos Mayores Gravado |
086D | Ajuste en Subsidios por incapacidad Gravado |
087D | Ajuste en Becas para trabajadores y/o hijos Gravado |
088D | Ajuste en Seguro de retiro Gravado |
089D | Ajuste en Vales de despensa Gravado |
090D | Ajuste en Vales de restaurante Gravado |
091D | Ajuste en Vales de gasolina Gravado |
092D | Ajuste en Vales de ropa Gravado |
093D | Ajuste en Ayuda para renta Gravado |
094D | Ajuste en Ayuda para artículos escolares Gravado |
095D | Ajuste en Ayuda para anteojos Gravado |
096D | Ajuste en Ayuda para transporte Gravado |
097D | Ajuste en Ayuda para gastos de funeral Gravado |
098D | Ajuste a ingresos asimilados a salarios gravados |
099D | Ajuste a ingresos por sueldos y salarios gravados |
100D | Ajuste en Viáticos exentos |
101D | ISR Retenido de ejercicio anterior |
107D* | Ajuste al Subsidio Causado |
* Registros nuevos agregados al catálogo de “Deducciones” y “TipoOtroPago”, publicados por el SAT.
Configuraciones para el catálogo de Régimen Fiscal Receptor
Como parte de la integración con Facturación Electrónica versión 4.0, se utiliza el mismo catálogo S010 - Régimen Fiscal (del módulo de Facturación), en caso de no contar con información en la tabla S010 (al seleccionar la consulta del campo RA_FISCALI), se debe cargar el catálogo o dar mantenimiento manual, para lo que es necesario tener las opciones en el menú, verificar que se cuente con ellas o agregarlas desde la opción Menús (Entorno | Archivos) el módulo del configurador (SIGACFG).
- Opción “Definición de Catálogos” (FISA812.PRW) en el menú de Gestión de Personal (SIGAGPE) en Actualizaciones| Archivos.
- Opción “Mantenimiento de Catálogos” (FISA813.PRW) en el menú de Gestión de Personal (SIGAGPE) en Actualizaciones| Archivos.
En caso de realizar la carga del catálogo, en la ruta definida en el parámetro MV_PATH814 copiar el catálogo del SAT obtenido de la planilla Catálogo de datos (xsd) http://www.sat.gob.mx/sitio_internet/cfd/catalogos/catCFDI.xsd y ejecutar la opción de Mantenimiento de Catálogos, o también se pueden capturar los registros en la misma opción de manera manual.
- Catálogo c_RegimenFiscal.csv
- Catálogo c_RegimenFiscal.csv
Catálogo de Ejemplo:
NOTA:
- El parámetro MV_PATH814, indica la ruta donde se colocan los archivos "csv" para la carga de Catálogos del SAT. Tiene predefinida la ruta "C:\TEMP\FISA814\".
- Al ejecutar la rutina, enviará mensajes indicando que no se encuentran diversos catálogos, que aplican para Facturación Electrónica v4.0. Para efectos de Recibo de pago de nómina, solo aplica el catálogo S010 - Régimen Fiscal.
06. Archivo de Configuración (gper88440.ini)
Si se cuenta con personalizaciones en el archivo gper884.ini correspondiente a la versión 3.3, se recomienda copiar el contenido de este y reemplazar la información del archivo gper88440.ini correspondiente a la versión 4.0; tras realizar lo anterior, realice las modificaciones sugeridas en azul que se muestran a continuación:
/*GPER884.INI V1.2 - Modelo 2017 - 20/03/2017*/
[XXX POSICIONAMENTOS]
[XXX INICIALIZACION]
(PRE) SRVPD->(DbSetOrder(1))
(PRE) _aTotal[072] := SRA->RA_FILIAL
(PRE) _aTotal[073] := SRA->RA_MAT
(PRE) _aTotal[074] := ""
(PRE) _aTotal[075] := CFDCarEsp(Alltrim(SM0->M0_NOMECOM))
(PRE) _aTotal[076] := StrZero(Year(Date()),4) + "-" + StrZero(Month(Date()),2) + "-" + StrZero(Day(Date()),2) + "T" + Time()
(PRE) _aTotal[077] := Alltrim(MV_PAR01)+Alltrim(MV_PAR02)+Alltrim(MV_PAR03)+Alltrim(MV_PAR04)
(PRE) _aTotal[078] := Alltrim(SRA->RA_MAT)+Alltrim(SRA->RA_FILIAL)
(PRE) _aTotal[098] := "|"
(PRE) _aTotal[099] := "||"
(PRE) _aTotal[100] := ""
//CADENA ORIGINAL
[SRA CADENAORIGINAL_SELLO]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
//Cadena Original
(PRE) cCadOrig := _aTotal[099]
//Version
(PRE) cCadOrig += "4.0" + _aTotal[098]
//Serie
(PRE) cCadOrig += _aTotal[078] + _aTotal[098]
//Folio
(PRE) cCadOrig += _aTotal[077] + _aTotal[098]
//Fecha
(PRE) cCadOrig += Alltrim(_aTotal[076]) + _aTotal[098]
//Num Certificado
(PRE) cCadOrig += SuperGetMv("MV_CFDI_CS",,"") + _aTotal[098]
//Subtotal
(PRE) cCadOrig += Alltrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP), 2), "99999999.99")) + _aTotal[098]
//Descuento
(PRE) cCadOrig += Alltrim(Transform(Round(nOtroDedu+nImpReten,2), "99999999.99")) + _aTotal[098]
//Moneda
(PRE) cCadOrig += Alltrim("MXN") + _aTotal[098]
//Total
(PRE) cCadOrig += Alltrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP) - (nOtroDedu + nImpReten), 2), "99999999.99")) + _aTotal[098]
//Tipo Comprobante
(PRE) cCadOrig += Alltrim("N") + _aTotal[098]
//Exportacion
(PRE) cCadOrig += Alltrim("01") + _aTotal[098]
//Metodo Pago
(PRE) cCadOrig += Alltrim("PUE") + _aTotal[098]
//Lugar de expedición
(PRE) cCadOrig += CFDCarEsp(AllTrim(RGC->RGC_CODPOS)) + _aTotal[098]
//Tipo Relacionados
(PRE) cCadOrig += NodoRelacc(3)
//UUIDS Relacionados
(PRE) cCadOrig += NodoRelacc(1)
//COMPROBANTE:EMISOR
//:RFC
(PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_CGC)) + _aTotal[098]
//:Nombre
(PRE) cCadOrig += Alltrim(SM0->M0_NOMECOM) + _aTotal[098]
//:Regimen
(PRE) cCadOrig += cTipoReg + _aTotal[098]
//COMPROBANTE:RECEPTOR
//:RFC
(PRE) cCadOrig += CFDCarEsp(AllTrim(SRA->RA_CIC)) + _aTotal[098]
//:Nombre
(PRE) cCadOrig += Alltrim(SRA->RA_NOME) + _aTotal[098]
//:DomicilioFiscalReceptor
(PRE) cCadOrig += CFDCarEsp(Alltrim(SRA->RA_CEP)) + _aTotal[098]
//:RegimenFiscalReceptor
(PRE) cCadOrig += CFDCarEsp(Alltrim(Iif(SRA->(ColumnPos("RA_FISCALI")) > 0,SRA->RA_FISCALI,""))) + _aTotal[098]
//:UsoCFDI
(PRE) cCadOrig += Alltrim("CN01") + _aTotal[098]
//COMPROBANTE:CONCEPTOS
//Clave Servicio
(PRE) cCadOrig += AllTrim("84111505")+ _aTotal[098]
//:Cantidad
(PRE) cCadOrig += Alltrim("1")+ _aTotal[098]
//:Unidad de medida
(PRE) cCadOrig += Alltrim("ACT")+ _aTotal[098]
//:Descripcion
(PRE) cCadOrig += DECODEUTF8(AllTrim("Pago de nómina")) + _aTotal[098]
//:valorUnitario
(PRE) cCadOrig += AllTrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP),2), "99999999.99")) + _aTotal[098]
//Importe
(PRE) cCadOrig += AllTrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP),2), "99999999.99")) + _aTotal[098]
//TotalDeducciones
(PRE) cCadOrig += Alltrim(Transform(Round(nTotDGrav+nTotDExen,2), "99999999.99")) + _aTotal[098]
//ObjetoImp
(PRE) cCadOrig += Alltrim("01")+ _aTotal[098]
//NOMINA
//version
(PRE) cCadOrig += "1.2" + _aTotal[098]
//TipoNomina
(PRE) cCadOrig += IIf(SRY->RY_TIPO == "1" .And. !lImprIndem, "O", "E") + _aTotal[098]
//FechaPago
(PRE) cCadOrig += Alltrim(STR(YEAR(dFchPag)))+"-"+ STRZERO(MONTH(dFchPag),2) +"-"+STRZERO(DAY(dFchPag),2) + _aTotal[098]
//FechaInicialPago
(PRE) cCadOrig += Alltrim(STR(YEAR(dFchInPag)))+"-"+ STRZERO(MONTH(dFchInPag),2) +"-"+STRZERO(DAY(dFchInPag),2) + _aTotal[098]
//FechaFinalPago
(PRE) cCadOrig += Alltrim(STR(YEAR(dFchFiPag)))+"-"+ STRZERO(MONTH(dFchFiPag),2) +"-"+STRZERO(DAY(dFchFiPag),2) + _aTotal[098]
//NumDiasPagados
(PRE) cCadOrig += Alltrim(Str(IIf(nDiasPag == 0, 1, nDiasPag))) + _aTotal[098]
//TotalPercepciones
(PRE) cCadOrig += IIf(nTotPGrav+nTotPExen <> 0, Alltrim(Transform(Round(nTotPGrav+nTotPExen,2), "99999999.99")) + _aTotal[098], "")
//TotalDeducciones
(PRE) cCadOrig += IIf(nTotDGrav+nTotDExen <> 0, Alltrim(Transform(Round(nTotDGrav+nTotDExen,2), "99999999.99")) + _aTotal[098], "")
//TotalOtrosPagos
(PRE) cCadOrig += IIf(nTotOtroP <> 0 .And. !lRegAsimil, AllTrim(Transform(Round(nTotOtroP,2), "99999999.99")) + _aTotal[098], "")
//EMISOR
//RegistroPatronal
(PRE) cCadOrig += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, AllTrim(cRegPatr) + _aTotal[098], "")
//RfcPatronOrigen
(PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_CGC)) + _aTotal[098]
//EntidadSNCF
(PRE) IIf(!Empty(cOrigRecur), cCadOrig += Alltrim(cOrigRecur) + _aTotal[098], "")
(PRE) IIf(!Empty(cOrigRecur), cCadOrig += Alltrim(Transform(Round(nTotPGrav+nTotPExen,2), "99999999.99")) + _aTotal[098], "")
//RECEPTOR
//Curp
(PRE) cCadOrig += Alltrim(SRA->RA_CURP) + _aTotal[098]
//NumSeguridadSocial
(PRE) IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, cCadOrig += AllTrim(SRA->RA_RG) + _aTotal[098], "")
//FechaInicioRelLaboral
(PRE) IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, cCadOrig += AllTrim(Str(Year(dFchInLab))) + "-" + StrZero(Month(dFchInLab),2) + "-" + StrZero(Day(dFchInLab),2) + _aTotal[098], "")
//Antigüedad
(PRE) IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, cCadOrig += 'P' + AllTrim(Str(nAntigue)) + 'W' + _aTotal[098], "")
//TipoContrato
(PRE) cCadOrig += IIf(lImprIndem,"99", Alltrim(SRA->RA_TIPCON)) + _aTotal[098]
//Sindicalizado
(PRE) IIf(SRA->RA_CATFUNC <> 'A', cCadOrig += IIf(!Empty(SRA->RA_SINDICA) .And. !lRegAsimil, "SÃ", "No") + _aTotal[098], "")
//TipoJornada
(PRE) IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil, cCadOrig += AllTrim(cTipJorn) + _aTotal[098], "")
//TipoRegimen
(PRE) cCadOrig += IIf(lImprIndem,"13",AllTrim(SRA->RA_TIPREG)) + _aTotal[098]
//NumEmpleado
(PRE) cCadOrig += AllTrim(SRA->RA_MAT) + _aTotal[098]
//Departamento
//MOD (PRE) cCadOrig += IIf(!Empty(cDeptoIm), AllTrim(cDeptoIm), "") + _aTotal[098]
(PRE) cCadOrig += IIf(!Empty(cDeptoIm), AllTrim(cDeptoIm) + _aTotal[098], "")
//Puesto
(PRE) cCadOrig += IIf(!Empty(cPuesCfdi), AllTrim(cPuesCfdi) + _aTotal[098], "")
//RiesgoPuesto
(PRE) cCadOrig += IIf(!lRegAsimil .AND. !lImprIndem, IIf(SRA->RA_CATFUNC <> 'A', AllTrim(cRiegCFDi), AllTrim("99")) + _aTotal[098], "")
//PeriodicidadPago
(PRE) cCadOrig += CFDCarEsp(Alltrim(IIf(SRY->RY_TIPO == "1",cPerCFDi, "99"))) + _aTotal[098]
//Banco
(PRE) IIf(!Empty(SRA->RA_CLABE),,cCadOrig += IIf(!Empty(cBcoCfdi), Alltrim(cBcoCfdi) + _aTotal[098], ""))
//CLABE
(PRE) cCadOrig += IIf(!Empty(SRA->RA_CLABE), Alltrim(SRA->RA_CLABE), Alltrim(SRA->RA_CTDEPSA)) + _aTotal[098]
//SalarioBaseCotApor
(PRE) IIf(SRA->RA_CATFUNC <> 'A', cCadOrig += Alltrim(Transform(Round(nSalBasAp,2), "99999999.99")) + _aTotal[098], "")
//SalarioDiarioIntegrado
(PRE) IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, cCadOrig += AllTrim(Transform(Round(SRA->RA_SALINT,2), "99999999.99")) + _aTotal[098], "")
//ClaveEntFed
(PRE) cCadOrig += Alltrim(cEntFed) + _aTotal[098]
//SUBCONTRATACION
//RfcLabora
(PRE) cCadOrig += IIf(SRA->RA_PORSUB <> 0, Alltrim(SRA->RA_RFCLAB) + _aTotal[098], "")
//PorcentajeTiempo
(PRE) cCadOrig += IIf(SRA->RA_PORSUB <> 0, Alltrim(Str(SRA->RA_PORSUB)) + _aTotal[098], "")
//PERCEPCIONES
//TotalSueldos
(PRE) IIf(nTotSueld <> 0, cCadOrig += Alltrim(Transform(Round(nTotSueld,2), "99999999.99")) + _aTotal[098], "")
//TotalSeparacionIndemnizacion
(PRE) IIf(nTotIndem <> 0, cCadOrig += Alltrim(Transform(Round(nTotIndem,2), "99999999.99")) + _aTotal[098], "")
//TotalJubilacionPensionRetiro
(PRE) IIf(nTotJubil <> 0, cCadOrig += Alltrim(Transform(Round(nTotJubil,2), "99999999.99")) + _aTotal[098], "")
//TotalGravado
(PRE) cCadOrig += Alltrim(Transform(Round(nTotPGrav,2), "99999999.99")) + _aTotal[098]
//TotalExento
(PRE) cCadOrig += Alltrim(Transform(Round(nTotPExen,2), "99999999.99")) + _aTotal[098]
//PERCEPCION (AccionesOTitulos y/o Horas Extras)
(PRE) VldCad884("1")
//JubilacionPensionRetiro
//TotalUnaExhibicion
(PRE) IIf(nTotUnaEx <> 0, cCadOrig += Alltrim(Transform(Round(nTotUnaEx,2), "99999999.99")) + _aTotal[098], "")
//TotalParcialidad
(PRE) IIf(nTotParci <> 0, cCadOrig += Alltrim(Transform(Round(nTotParci,2), "99999999.99")) + _aTotal[098], "")
//MontoDiario
(PRE) IIf(nTotParci <> 0, cCadOrig += Alltrim(Transform(Round(nTotDiari,2), "99999999.99")) + _aTotal[098], "")
//IngresoAcumulable
(PRE) IIf(nTotUnaEx+nTotParci <> 0, cCadOrig += Alltrim(Transform(Round(nTotIAcum,2), "99999999.99")) + _aTotal[098], "")
//IngresoNoAcumulable
(PRE) IIf(nTotUnaEx+nTotParci <> 0, cCadOrig += Alltrim(Transform(Round(NTotNAcum,2), "99999999.99")) + _aTotal[098], "")
//SeparacionIndemnizacion
//TotalPagado
(PRE) IIf(nTotPagad <> 0, cCadOrig += Alltrim(Transform(Round(nTotPagad,2), "99999999.99")) + _aTotal[098], "")
//NumAñosServicio
(PRE) IIf(nTotPagad <> 0, cCadOrig += Alltrim(Str(IIf(nNumAnios==0, 1, nNumAnios))) + _aTotal[098], "")
//UltimoSueldoMensOrd
(PRE) IIf(nTotPagad <> 0, cCadOrig += Alltrim(Transform(Round(nUltSuelM,2), "99999999.99")) + _aTotal[098], "")
//IngresoAcumulable
(PRE) IIf(nTotPagad <> 0, cCadOrig += Alltrim(Transform(Round(nIngrAcum,2), "99999999.99")) + _aTotal[098], "")
//IngresoNoAcumulable
(PRE) IIf(nTotPagad <> 0, cCadOrig += Alltrim(Transform(Round(nIngrNAcu,2), "99999999.99")) + _aTotal[098], "")
//DEDUCCIONES
//TotalOtrasDeducciones
(PRE) IIf(nOtroDedu <> 0, cCadOrig += Alltrim(Transform(Round(nOtroDedu,2), "99999999.99")) + _aTotal[098], "")
//TotalImpuestosRetenidos
(PRE) IIf(nImpReten <> 0, cCadOrig += Alltrim(Transform(Round(nImpReten,2), "99999999.99")) + _aTotal[098], "")
//DEDUCCION
(PRE) VldCad884("2")
//OtroPago
//TipoOtroPago (SubsidioAlEmpleo - CompensacionSaldosAFavor)
(PRE) IIf(!lRegAsimil, VldCad884("3"), .T.)
//Incapacidad
(PRE) VldCad884("4")
(PRE) cCadOrig += _aTotal[098]
(POS) _aTotal[074] := ENCODEUTF8(cCadOrig)
(POS) cCadOrig := ENCODEUTF8(cCadOrig)
//Sello
(POS) _aTotal[100] := LjHex2Asc(SHA256(cCadOrig,2))
(POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDI_KP",,""),_aTotal[100],6,"assinatura")
(POS) _aTotal[100] := ENCODE64(_aTotal[100])
// C O N F I G U R A C I O N D E L A R C H I V O : R E C N O M . INI
[XXX CABECERA]
Linha1 C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'
//CFDI: CFDI:COMPROBANTE
[XXX CFDI]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
//Certificado
//CSD_XIA190128J61c.pem XIA190128J61 - pruebas SAT
(PRE) cCert01 := "MIIFyDCCA7CgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0NDMwDQYJKoZIhvcNAQEL"
(PRE) cCert01 += "BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
(PRE) cCert01 += "TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
(PRE) cCert01 += "aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
(PRE) cCert01 += "GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
(PRE) cCert01 += "BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
(PRE) cCert01 += "T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
(PRE) cCert01 += "bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MjA0MDUxWhcNMjMwNjE3MjA0MDUx"
(PRE) cCert01 += "WjCB7zEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
(PRE) cCert01 += "MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
(PRE) cCert01 += "BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
(PRE) cCert01 += "LRMcWElBMTkwMTI4SjYxIC8gS0FITzY0MTEwMUIzOTEeMBwGA1UEBRMVIC8gS0FI"
(PRE) cCert01 += "TzY0MTEwMUhOVExLUzA2MSIwIAYDVQQLExlYZW5vbiBJbmR1c3RyaWFsIEFydGlj"
(PRE) cCert01 += "bGVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiJQ5YcSgjwsGf29+"
(PRE) cCert01 += "3go7VGdtMZCcH9wUpn46ZMAlFwUojnCPTvwJ3+cSwjqJnw8ahr3DuRwekvGR4BJA"
(PRE) cCert01 += "b5b9Xi8kyoiWtwcGOSWxO38Bp9J1e/BO9HMbQBPAtLDuG47oqnH8zWLOeaoYRJDp"
(PRE) cCert01 += "ARw4RX1ko2+9tbj0ntBtM7Vk1E8EWiA/h2Meq0LIv1+ySGTUrEW46FM01J5pzELv"
(PRE) cCert01 += "5XupBghuJxR5DG9fiOW7u3dR5s3tZoVLwA1KdjJtY0mmnfCwxg6i5AqhvY+FAI5D"
(PRE) cCert01 += "6CF6/lHA8PWg63WasvrhuIv70xCLjgPT/j00ZcPrLvBf1DefGVic980Ch/SDvC+M"
(PRE) cCert01 += "dJ1F5wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG"
(PRE) cCert01 += "9w0BAQsFAAOCAgEACjfTPoKY2N5MxjmAMltd5XZCV1vgAwEtrIRYTodhE8R0Tp1Q"
(PRE) cCert01 += "anAXb0luPyBv5hIXWK4VqAI4fcTtP+n7kkrwfha6ErkPWFNJWJm8ZsMmby/3WgVo"
(PRE) cCert01 += "JkOFyRYQqr5Il3N6wMa5kiDBtDRbqB3iEXmvtrvjWSHyxAER+zo3jWGFlhBZ0nQN"
(PRE) cCert01 += "Rtjx8sPFihVc5TUH682HJiU4oWvT63Dnra8ncqiW/uCuY86crnUq0fW7Lw/3+PY5"
(PRE) cCert01 += "xXjNxR/Hh3sUPITfJrGaLWurD1J9npr9yGAJ6t9zrhhZnepIC0DUMc5+j4pg1DrO"
(PRE) cCert01 += "32jzwUOLQqErDizh84NoJCWwbg+US8wi3zD0ZKiDv7XsTNWAW2Ap2JkzykKHjFTZ"
(PRE) cCert01 += "iEm3uZOkJNfcu3o+kefr5HfXFT+iN9K5FUEhaQwgUeZBRJ8V5F6gmhz3d6ixVbiZ"
(PRE) cCert01 += "oFNhYR8e2k8gF9gGrVMrEbJGQrl+6+ZYQLFiauXeG7fu1svk19PuyredRJGnseJq"
(PRE) cCert01 += "yV4RzcRGhJA+cLnmpdDOTEhignnvnhEuY6HVRYYXhOTyeeluET7KRCxbJGqO7TdW"
(PRE) cCert01 += "gjrHL3HRbNE4NY5GAdOZuLaWxElG5ZVCHqtG0Nh7UQAhcz+EKyZBAewv5XuH0Oom"
(PRE) cCert01 += "ZXw6mM2mY2soL6z1224NusM8/BbJcYTQUlAEKblEChhGK1XlxiVOU2nc9KE="
(PRE) if (SM0->M0_CODIGO == '01', cCert := cCert01,cCert := cCert01)
(PRE) _aTotal[001] := '<cfdi:Comprobante'
(PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
(PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
(PRE) _aTotal[001] += ' xmlns:nomina12="http://www.sat.gob.mx/nomina12"'
(PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd"'
(PRE) _aTotal[001] += ' Version="4.0"'
(PRE) _aTotal[001] += ' Serie="' + _aTotal[078] + '"'
(PRE) _aTotal[001] += ' Folio="' + _aTotal[077] + '"'
(PRE) _aTotal[001] += ' Fecha="' + _aTotal[076]+ '"'
(PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
(PRE) _aTotal[001] += ' NoCertificado="' + SuperGetMv("MV_CFDI_CS",,"") + '"'
(PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
(PRE) _aTotal[001] += ' SubTotal="' + AllTrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP), 2), "99999999.99")) + '"'
(PRE) _aTotal[001] += ' Descuento="' + Alltrim(Transform(Round(nOtroDedu+nImpReten,2), "99999999.99")) + '"'
(PRE) _aTotal[001] += ' Moneda="' + Alltrim("MXN") + '"'
(PRE) _aTotal[001] += ' Total="' + AllTrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP) - (nOtroDedu + nImpReten), 2), "99999999.99")) + '"'
(PRE) _aTotal[001] += ' TipoDeComprobante="' + AllTrim("N") + '"'
(PRE) _aTotal[001] += ' Exportacion="' + Alltrim("01") + '"'
(PRE) _aTotal[001] += ' MetodoPago="' + Alltrim("PUE") + '"'
(PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(RGC->RGC_CODPOS)) + '"'
(PRE) _aTotal[001] += '>'
(PRE) _aTotal[001] := ENCODEUTF8(_aTotal[001])
(PREREG) _aTotal[001]
//COMPROBANTE: CFDI:CfdiRelacionado
[XXX CfdiRelacionados]
(PRE) _aTotal[001] := NodoRelacc(2)
(PRE) _aTotal[001] := ENCODEUTF8(_aTotal[001])
(PREREG) _aTotal[001]
//COMPROBANTE: CFDI:EMISOR
[XXX EMISOR]
(PRE) _aTotal[001] := ' <cfdi:Emisor'
(PRE) _aTotal[001] += ' Rfc="' + CFDCarEsp(Alltrim(SM0->M0_CGC)) + '"'
(PRE) _aTotal[001] += ' Nombre="' + _aTotal[075] + '"'
(PRE) _aTotal[001] += ' RegimenFiscal="' + cTipoReg + '"'
(PRE) _aTotal[001] += '/>'
(PRE) _aTotal[001] := ENCODEUTF8(_aTotal[001])
(PREREG) _aTotal[001]
//COMPROBANTE: CFDI:RECEPTOR
[XXX RECEPTOR]
(PREREG) (_aTotal[001] := ' <cfdi:Receptor' , .T.)
(PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SRA->RA_CIC)) + '"' , .T.)
(PREREG) (_aTotal[001] += ' Nombre="' + Alltrim(SRA->RA_NOME) + '"' , .T.)
(PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + CFDCarEsp(Alltrim(SRA->RA_CEP)) + '"' , .T.)
(PREREG) (_aTotal[001] += ' RegimenFiscalReceptor="' + CFDCarEsp(Alltrim(Iif(SRA->(ColumnPos("RA_FISCALI")) > 0,SRA->RA_FISCALI,""))) + '"' , .T.)
(PREREG) (_aTotal[001] += ' UsoCFDI="' + CFDCarEsp( "CN01") + '"' , .T.)
(PREREG) (_aTotal[001] += '/>' ,.T.)
(PREREG) (_aTotal[001] := ENCODEUTF8(_aTotal[001]) , .T.)
(PREREG) _aTotal[001]
//COMPROBANTE: CFDI:COCEPTOS
[XXX CONCEPTOS]
CONCEPTOS C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Conceptos",.T.,.F.,4))
[XXX CONCEPTO]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
(PREREG) (_aTotal[002] := ' <cfdi:Concepto',.T.)
(PREREG) (_aTotal[002] += ' ClaveProdServ="'+AllTrim("84111505")+'"',.T.)
(PREREG) (_aTotal[002] += ' Cantidad="' + Alltrim("1") + '"',.T.)
(PREREG) (_aTotal[002] += ' ClaveUnidad="' + Alltrim("ACT") + '"',.T.)
(PREREG) (_aTotal[002] += ' Descripcion="' + DECODEUTF8(AllTrim("Pago de nómina")) + '"',.T.)
(PREREG) (_aTotal[002] += ' ValorUnitario="' + Alltrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP),2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += ' Importe="' + Alltrim(Transform(Round(nTotPGrav + nTotPExen + IIf(lRegAsimil, 0, nTotOtroP),2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += ' Descuento="' + Alltrim(Transform(Round(nTotDGrav+nTotDExen,2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += ' ObjetoImp="' + Alltrim("01") + '"',.T.)
(PREREG) (_aTotal[002] += '/>',.T.)
(PREREG) (_aTotal[078] ++,.T.)
(PREREG) ENCODEUTF8(_aTotal[002])
[XXX CONCEPTOS]
CONCEPTOS C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Conceptos",.F.,.T.,4))
//COMPLEMENTO: CFDI:COMPLEMENTO
[XXX COMPLEM]
COMPLEM C 023 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))
//COMPLEMENTO: NOMINA:NOMINA
[XXX NOMINA]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
(PRE) _aTotal[001] := ' <nomina12:Nomina'
(PRE) _aTotal[001] += ' Version="1.2"'
(PRE) _aTotal[001] += ' TipoNomina="' + IIf(SRY->RY_TIPO == "1" .And. !lImprIndem, "O", "E") + '"'
(PRE) _aTotal[001] += ' FechaPago="' + Alltrim(STR(YEAR(dFchPag)))+"-"+ STRZERO(MONTH(dFchPag),2) +"-"+STRZERO(DAY(dFchPag),2)+ '"'
(PRE) _aTotal[001] += ' FechaInicialPago="' + Alltrim(STR(YEAR(dFchInPag)))+"-"+ STRZERO(MONTH(dFchInPag),2) +"-"+STRZERO(DAY(dFchInPag),2)+ '"'
(PRE) _aTotal[001] += ' FechaFinalPago="' + Alltrim(STR(YEAR(dFchFiPag)))+"-"+ STRZERO(MONTH(dFchFiPag),2) +"-"+STRZERO(DAY(dFchFiPag),2)+ '"'
(PRE) _aTotal[001] += ' NumDiasPagados="' + Alltrim(Str(IIf(nDiasPag == 0, 1, nDiasPag))) + '"'
(PRE) _aTotal[001] += IIf(nTotPGrav+nTotPExen <> 0, ' TotalPercepciones="' + Alltrim(Transform(Round(nTotPGrav+nTotPExen,2), "99999999.99")) + '"', "")
(PRE) _aTotal[001] += IIf(nTotDGrav+nTotDExen <> 0, ' TotalDeducciones="' + Alltrim(Transform(Round(nTotDGrav+nTotDExen,2), "99999999.99")) + '"', "")
(PRE) _aTotal[001] += IIf(nTotOtroP <> 0 .And. !lRegAsimil, ' TotalOtrosPagos="' + Alltrim(Transform(Round(nTotOtroP,2), "99999999.99")) + '" ', "")
(PRE) _aTotal[001] += '>'
(PRE) _aTotal[001] := ENCODEUTF8(_aTotal[001])
(PREREG) _aTotal[001]
[XXX EMISOR]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
(PREREG) (NodOpcion(6),.T.)
(PRE) _aTotal[001] := ' <nomina12:Emisor'
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, ' RegistroPatronal="' + Alltrim(cRegPatr) +'"', "")
(PRE) _aTotal[001] += ' RfcPatronOrigen="' + CFDCarEsp(Alltrim(SM0->M0_CGC)) + '"'
(PREREG) (_aTotal[001] += IIf(Alltrim(cOrigRecur) == "", '/>', '>'),.T.)
(PREREG) (_aTotal[001] += IIf(Alltrim(cOrigRecur) == "", "", cCRLF + cNodoSNCF),.T.)
(PREREG) ENCODEUTF8(_aTotal[001])
(PREREG) ( Iif ((cOrigRecur <> ""),.T.,.F.))
EMISOR C 026 0 ENCODEUTF8(XMLConv("",,,"nomina12:Emisor",.F.,.T.,8))
//COMPROBANTE: CFDI:RECEPTOR
[XXX RECEPTOR]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
(PREREG) (NodOpcion(5),.T.)
(PRE) _aTotal[001] := ' <nomina12:Receptor'
(PRE) _aTotal[001] += ' Curp="' + Alltrim(SRA->RA_CURP) + '"'
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, ' NumSeguridadSocial="' + AllTrim(SRA->RA_RG) +'"', "")
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, ' FechaInicioRelLaboral="' + AllTrim(Str(Year(dFchInLab))) + "-" + StrZero(Month(dFchInLab),2) + "-" + StrZero(Day(dFchInLab),2) + '"', "")
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, DecodeUTF8(' Antigüedad="') + 'P' + AllTrim(Str(nAntigue)) + 'W' + '" ', "")
(PRE) _aTotal[001] += ' TipoContrato="' + Iif(lImprIndem,"99",Alltrim(SRA->RA_TIPCON)) + '"'
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A', ' Sindicalizado="' + IIf(!Empty(SRA->RA_SINDICA) .And. !lRegAsimil, "S�", "No") + '"', "")
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil, ' TipoJornada="' + AllTrim(cTipJorn) + '"', "")
(PRE) _aTotal[001] += ' TipoRegimen="' + Iif(lImprIndem,"13",Alltrim(SRA->RA_TIPREG)) + '"'
(PRE) _aTotal[001] += ' NumEmpleado="' + Alltrim(SRA->RA_MAT) +'"'
(PRE) _aTotal[001] += ' Departamento="' + Alltrim(cDeptoIm) + '"'
(PRE) _aTotal[001] += ' Puesto="' + Alltrim(cPuesCfdi) + '"'
(PRE) IIf(!lRegAsimil .AND. !lImprIndem, _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A', ' RiesgoPuesto="' + AllTrim(cRiegCFDi) + '"', ' RiesgoPuesto="' + AllTrim("99") + '"'), .T.)
(PRE) _aTotal[001] += ' PeriodicidadPago="' + CFDCarEsp(Alltrim(IIf(SRY->RY_TIPO == "1",cPerCFDi, "99"))) + '"'
(PRE) IIf(!Empty(SRA->RA_CLABE), ,_aTotal[001] += ' Banco="' + Alltrim(cBcoCfdi) + '"')
(PRE) _aTotal[001] += ' CuentaBancaria="' + IIf(!Empty(SRA->RA_CLABE), Alltrim(SRA->RA_CLABE), Alltrim(SRA->RA_CTDEPSA)) + '"'
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A', ' SalarioBaseCotApor="' + Alltrim(Transform(Round(nSalBasAp,2), "99999999.99")) + '"', "")
(PRE) _aTotal[001] += IIf(SRA->RA_CATFUNC <> 'A' .And. !lRegAsimil .And. !lImprIndem, ' SalarioDiarioIntegrado="' + Alltrim(Transform(Round(SRA->RA_SALINT,2), "99999999.99")) + '"', "")
(PRE) _aTotal[001] += ' ClaveEntFed="' + Alltrim(cEntFed) + '"'
(PREREG) (_aTotal[001] += IIf(cNodoSubC <> "", '>', '/>'),.T.)
(PREREG) (_aTotal[001] += IIf(cNodoSubC == "", "", cCRLF + cNodoSubC),.T.)
(PREREG) ENCODEUTF8(_aTotal[001])
(PREREG) ( Iif ((cNodoSubC <> ""),.T.,.F.))
RECEPTOR C 028 0 ENCODEUTF8(XMLConv("",,,"nomina12:Receptor",.F.,.T.,8))
//COMPLEMENTO: NOMINA:PERCEPCIONES
[XXX PERCEPCION]
(PRE) DBSELECTAREA("SRVPD")
(PRE) SRVPD->(DbGotop())
(PREREG) ( Iif ((Alltrim(SRVPD->RV_TIPO) =="1"),.T.,.F.))
(PRE) _aTotal[002] := ' <nomina12:Percepciones'
(PRE) _aTotal[002] += IIf(nTotSueld<>0, ' TotalSueldos="' + Alltrim(Transform(Round(nTotSueld,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nTotIndem<>0, ' TotalSeparacionIndemnizacion="' + Alltrim(Transform(Round(nTotIndem,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nTotJubil<>0, ' TotalJubilacionPensionRetiro="' + Alltrim(Transform(Round(nTotJubil,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += ' TotalGravado="' + Alltrim(Transform(Round(nTotPGrav,2), "99999999.99")) + '"'
(PRE) _aTotal[002] += ' TotalExento="' + Alltrim(Transform(Round(nTotPExen,2), "99999999.99")) + '"'
(PRE) _aTotal[002] += '>'
(PRE) _aTotal[002] := ENCODEUTF8(_aTotal[002])
(PREREG) _aTotal[002]
[SRVPD PERCEPCION]
(PRE) SRVPD->(DbGotop())
(PREREG) ( Iif ((Alltrim(SRVPD->RV_TIPO) =="1"),.T.,.F.))
(PREREG) NodOpcion(1)
(PREREG) NodOpcion(2)
(PREREG) (_aTotal[002] := ' <nomina12:Percepcion',.T.)
(PREREG) (_aTotal[002] += ' TipoPercepcion="' + Alltrim(Substr(SRVPD->RV_TIPSAT,1,3)) + '"',.T.)
(PREREG) (_aTotal[002] += ' Clave="' + Alltrim(SRVPD->RV_COD) + '"',.T.)
(PREREG) (_aTotal[002] += ' Concepto="' + Alltrim(SRVPD->RV_DESCDET) + '"',.T.)
(PREREG) (_aTotal[002] += ' ImporteGravado="' + Alltrim(Transform(Round(SRVPD->RC_VALORGV,2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += ' ImporteExento="' + Alltrim(Transform(Round(SRVPD->RC_VALOREX,2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += IIf(cNodoAccT <> "" .Or. cNodoHExt <> "", '>', '/>'),.T.)
(PREREG) (_aTotal[002] += IIf(cNodoAccT == "", "", cCRLF + cNodoAccT),.T.)
(PREREG) (_aTotal[002] += IIf(cNodoHExt == "", "", cCRLF + cNodoHExt),.T.)
(PREREG) ENCODEUTF8(_aTotal[002])
(PREREG) ( Iif ((cNodoAccT <> "" .Or. cNodoHExt <> ""),.T.,.F.))
PERCEPCION C 036 0 ENCODEUTF8(XMLConv("",,,"nomina12:Percepcion",.F.,.T.,12))
[SRVPD JUBILACION]
(PREREG) Iif((nTotUnaEx+nTotParci+nTotDiari+nTotIAcum+NTotNAcum<>0),.T.,.F. )
(PRE) _aTotal[002] := ' <nomina12:JubilacionPensionRetiro'
(PRE) _aTotal[002] += IIf(nTotUnaEx <> 0, ' TotalUnaExhibicion="' + Alltrim(Transform(Round(nTotUnaEx,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nTotParci <> 0, ' TotalParcialidad="' + Alltrim(Transform(Round(nTotParci,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nTotParci <> 0, ' MontoDiario="' + Alltrim(Transform(Round(nTotDiari,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nTotUnaEx+nTotParci <> 0, ' IngresoAcumulable="' + Alltrim(Transform(Round(nTotIAcum,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nTotUnaEx+nTotParci <> 0, ' IngresoNoAcumulable="' + Alltrim(Transform(Round(NTotNAcum,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += '/>'
(PREREG) ENCODEUTF8(_aTotal[002])
(PREREG) VldNodJub()
[SRVPD INDEMNIZACION]
(PREREG) Iif((nTotPagad+nNumAnios+nUltSuelM+nIngrAcum+nIngrNAcu<>0),.T.,.F. )
(PRE) _aTotal[002] := ' <nomina12:SeparacionIndemnizacion'
(PRE) _aTotal[002] += ' TotalPagado="' + Alltrim(Transform(Round(nTotPagad,2), "99999999.99")) + '"'
(PRE) _aTotal[002] += ' NumAñosServicio="' + Alltrim(Str(IIf(nNumAnios==0, 1, nNumAnios))) + '"'
(PRE) _aTotal[002] += ' UltimoSueldoMensOrd="' + Alltrim(Transform(Round(nUltSuelM,2), "99999999.99")) + '"'
(PRE) _aTotal[002] += ' IngresoAcumulable="' + Alltrim(Transform(Round(nIngrAcum,2), "99999999.99")) + '"'
(PRE) _aTotal[002] += ' IngresoNoAcumulable="' + Alltrim(Transform(Round(nIngrNAcu,2), "99999999.99")) + '"'
(PRE) _aTotal[002] += '/>'
(PREREG) ENCODEUTF8(_aTotal[002])
(PREREG) VldNodInde()
[XXX PERCEPCION]
(PRE) SRVPD->(DbGotop())
(PREREG) ( Iif ((Alltrim(SRVPD->RV_TIPO) =="1"),.T.,.F.))
PERCEPCION C 032 0 ENCODEUTF8(XMLConv("",,,"nomina12:Percepciones",.F.,.T.,8))
//COMPLEMENTO: NOMINA:DEDUCCIONES
[XXX DEDUCCIONS]
(PRE) DBSELECTAREA("SRVPD")
(PRE) SRVPD->(DbGotop())
(PRE) DbSeek(_aTotal[072]+_aTotal[073]+"2")
(PREREG) ( Iif ((Alltrim(SRVPD->RV_TIPO) =="2"),.T.,.F.))
(PRE) _aTotal[002] := ' <nomina12:Deducciones'
(PRE) _aTotal[002] += IIf(nOtroDedu <> 0, ' TotalOtrasDeducciones="' + Alltrim(Transform(Round(nOtroDedu,2), "99999999.99")) + '"', "")
(PRE) _aTotal[002] += IIf(nImpReten <> 0, ' TotalImpuestosRetenidos="' + Alltrim(Transform(Round(nImpReten,2), "99999999.99")) + '" ', "")
(PRE) _aTotal[002] += '>'
(PREREG) ENCODEUTF8(_aTotal[002])
[SRVPD DEDUCCION]
(PREREG) ( Iif ((Alltrim(SRVPD->RV_TIPO) =="2"),.T.,.F.))
(PREREG) (_aTotal[002] := ' <nomina12:Deduccion',.T.)
(PREREG) (_aTotal[002] += ' TipoDeduccion="' + Alltrim(Substr(SRVPD->RV_TIPSAT,1,3)) + '"',.T.)
(PREREG) (_aTotal[002] += ' Clave="' + Alltrim(SRVPD->RV_COD) + '"',.T.)
(PREREG) (_aTotal[002] += ' Concepto="' + Alltrim(SRVPD->RV_DESCDET) + '"',.T.)
(PREREG) (_aTotal[002] += ' Importe="' + Alltrim(Transform(Round(SRVPD->RC_VALORGV + SRVPD->RC_VALOREX,2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += '/>',.T.)
(PREREG) ENCODEUTF8(_aTotal[002])
[XXX DEDUCCIONS]
(PRE) DBSELECTAREA("SRVPD")
(PRE) SRVPD->(DbGotop())
(PRE) DbSeek(_aTotal[072]+_aTotal[073]+"2")
(PREREG) ( Iif ((Alltrim(SRVPD->RV_TIPO) =="2"),.T.,.F.))
DEDUCCIONS C 032 0 ENCODEUTF8(XMLConv("",,,"nomina12:Deducciones",.F.,.T.,8))
//COMPLEMENTO: NOMINA:OTROSPAGOS
[XXX OTROSPAGOS]
//Variable utilizada para validar si es Regimen Asimilado
(PRE) lRegAsimil := SRA->RA_TIPREG $ "05|06|07|08|09|10|11"
(PREREG) !lRegAsimil
(PREREG) _aTotal[002] := ''
(PREREG) _aTotal[002] := fOtrosPag()
(PREREG) ENCODEUTF8(_aTotal[002])
[XXX INCAPACIDS]
(PRE) SRCIN->(DbGotop())
(PREREG) Iif(!SRCIN->(Eof()),.T.,.F. )
(PRE) _aTotal[001] := ' <nomina12:Incapacidades>'
(PREREG) ENCODEUTF8(_aTotal[001])
//COMPLEMENTO: NOMINA:INCAPACIDAD
[SRCIN INCAPACIDAD]
(PRE) SRCIN->(DbGotop())
(PREREG) (_aTotal[002] := ' <nomina12:Incapacidad',.T.)
(PREREG) (_aTotal[002] += ' DiasIncapacidad="' + Alltrim(Str(SRCIN->RC_HORAS)) + '"',.T.)
(PREREG) (_aTotal[002] += ' TipoIncapacidad="' + Alltrim(SRCIN->RCM_TIPSAT) + '"',.T.)
(PREREG) (_aTotal[002] += ' ImporteMonetario="' + Alltrim(Transform(Round(SRCIN->RC_VALOR,2), "99999999.99")) + '"',.T.)
(PREREG) (_aTotal[002] += '/>',.T.)
(PREREG) ENCODEUTF8(_aTotal[002])
[XXX INCAPACIDAD]
(PRE) SRCIN->(DbGotop())
(PREREG) Iif(!SRCIN->(Eof()),.T.,.F. )
INCAPACIDAD C 030 0 ENCODEUTF8(XMLConv("",,,"nomina12:Incapacidad",.F.,.T.,8))
[XXX INCAPACIDS]
(PRE) SRCIN->(DbGotop())
(PREREG) Iif(!SRCIN->(Eof()),.T.,.F. )
INCAPACIDS C 033 0 ENCODEUTF8(XMLConv("",,,"nomina12:Incapacidades",.F.,.T.,8))
[XXX NOMINA]
NOMINA C 023 0 ENCODEUTF8(XMLConv("",,,"nomina12:Nomina",.F.,.T.,4))
//COMPLEMENTO: CFDI:COMPLEMENTO
[XXX COMPLEM]
COMPLEM C 023 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))
[XXX ADDENDA]
ADDENDA C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Addenda",.T.,.F.,4))
[XXX ADDENDA1]
(PREREG) (_aTotal[003] := ' <cfdi:t_obs',.T.)
(PREREG) (_aTotal[003] += ' CadenaOrig="' + Alltrim(_aTotal[074]) + '"',.T.)
(PREREG) (_aTotal[003] += ' Sucursal="' + SRA->RA_FILIAL + '"',.T.)
(PREREG) (_aTotal[003] += '/>',.T.)
(PREREG) _aTotal[003]
(POS) DelATbr884()
[XXX ADDENDA]
ADDENDA C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Addenda",.F.,.T.,4))
[XXX CFDI]
CFDI C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))
Clave del Certificado
El valor de la variable cCert01 en el Archivo de Configuración, deberá contener la Clave del Certificado contenida en el archivo ".pem", la cual corresponde al Emisor.
07. Tablas Utilizadas
- SRA - Empleados.
- SRV - Conceptos.
- RCJ - Procesos.
- SRY - Tipos de Procedimiento.
- RGC - Localidad de Pago.
- CTT - Centro de Costos.
- RCB - Definición de Tablas.
- RCC - Mantenimiento de Tablas.
- SRJ - Funciones.
- RC0 - Registro Patronal.
- SR6 - Turnos de Trabajo.
- RF3 - Jornada.
- RF8/RF4 - Horario.
- RF9 - Tipo de Día.
- RGA/SRM - Conceptos por Proceso.
- RFQ/RCH - Periodos.
- SRC - Cálculos por Procedimiento.
- RIW - Folios Fiscales de Nómina.
08. Información Adicional
- Comprobante del recibo de pago de nómina y su complemento.
http://omawww.sat.gob.mx/tramitesyservicios/Paginas/complemento_nomina.htm
http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Guia_llenado_Nomina.pdf
Aplicable para la versión 4.0 del CFDI y el complemento de nómina versión 1.2
- Matriz de errores de Nómina.
- Matriz de errores de CFDI 4.0.
https://www.sat.gob.mx/cs/Satellite?blobcol=urldata&blobkey=id&blobtable=MungoBlobs&blobwhere=1579314864502&ssbinary=true
- Recibo de Nómina CFDi versión 3.3 - México.
DT Recibo de Nómina CFDi 3.3 - México
- Cancelación de CFDI Nómina con motivos de cancelación.
09. Ejecutables homologados
A continuación se encuentran las instrucciones para la actualización de los ejecutables homologados de los diferentes PAC's (Proveedores Autorizados de Certificados), con los que TOTVS mantiene los servicios de timbrado de CFDI's (Comprobantes Fiscales Digitales).
- Ingresar a la Central de Descargas y Actualizaciones:
https://suporte.totvs.com/portal/p/10098/download#company/ - Seleccionar la opción, TOTVS Línea Protheus:
- Dar clic en la opción "Artefactos Generales del Producto":
- Dar clic en la opción "Rdmake Estándar":
- De las opciones desplegadas; buscar la opción "Localizaciones" y dar clic en ella:
- Dar clic en en el botón "Haga download del archivo":
- Tras completarse la descarga del archivo; descomprimir el contenido.
- Se mostrará la siguiente estructura de carpetas:
- Seleccionar el archivo ".zip" correspondiente al PAC que se tiene contratado y extraer su contenido.
- El contenido del archivo extraído anteriormente, copiarlo y colocarlo en la carpeta configurada en el parámetro MV_CFDSMAR.