Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

01. DATOS GENERALES


Producto

Solucoes_espanhol
SolucaoTOTVS RH

Línea de producto: 

Linhas_totvs_espanhol
LinhaLínea Protheus

Segmento:

Segmentos_totvs_espanhol
Segmento RH

Módulo:SIGAGPE - Gestión de Personal.
Función:

   

Rutina(s)Nombre TécnicoFecha
GPFORMEX.PRXFórmulas Estándar - México.30/05/2022
GPFO1MEX.PRXFórmulas Estándar - México
GPFO2MEX
.
PRX
30/05/2022
Fórmulas Estándar México
GPTABMEX
_
.PRXDefinición de Tablas Estándar - México.23/05/2022
GPCRGMEX.PRXContenido de Tablas Estándar - México.24/05/2022
GPPDMEX.PRXConceptos Estándar - México.30/05/2022
GPVPPMEX.PRXConceptos por Proceso Estándar - México.26/05/2022

   

País:México
Ticket:N/A
Requisito/Story/Issue (informe el requisito vinculado):DNOMI-308

02. SITUACIÓN/REQUISITO

Con las reformas a la Ley Federal del Trabajo (LFT) publicadas en el Diario Oficial de la Federación (DOF), versión vespertina, del 23 de abril de 2021, el artículo 127 fue adicionado con una fracción VIII, que establece un nuevo tope en la PTU del trabajador (http://dof.gob.mx/nota_detalle.php?codigo=5616745&fecha=23/04/2021).

03. SOLUCIÓN

SX2 Configuración de Tablas

Se cambió el modo unidad de negocio y modo empresa de las tablas de formulación estándar.

Campo Filial

Se dejó vacío el campo de filial, para coincidir con el cambio de modo en la SX2.

Menú

El menú del portal tiene muchas rutinas repetidas y algunas están mal ubicadas.

Se creó el menú de SIGAGPE_CCF en donde se subsanaron esos problemas, y se agregaron las rutinas de la formulación estándar.

Usuario

Se creó un usuario con la configuración especial para nómina.

RC2/RC3 Fórmulas

Para cumplir con los cambios del 2021 respecto al PTU del 2022, se modifico la formula 15104 PTU PTU TOTAL.

RCB/RCC Tablas Alfanuméricas

...

RC2/RC3 Fórmulas

  • Para cumplir con los cambios del 2021 respecto al PTU del 2022, se modifico la fórmula 15104 - PTU TOTAL y la fórmula REF04 - PTU Cálculo de Referencias
  • Se corrigen los errores de ortografía de las descripciones de las fórmulas.

RCB/RCC Tablas Alfanuméricas

La mecánica del PTU involucra varias tablas alfanuméricas (Actualizaciones | Definic. Cálculo | Mantenim. Tabla). 

La configuración de la RCB cambió desde que fue creado el estándar.

    • En este momento se requiere que se defina al menos un campo que sea usado para la búsqueda (RCB_PESQ).
    • Se agregó la versión (RCB_VERSAO) a las tablas que no la tenían.
    • Se pusieron las descripciones de las tablas (RCB_DESC) en minúsculas, para detectar cuando el Sistema o el usuario las modifican (esto no afecta en el sistema).
    • Se pusieron las descripciones de los campos (RCB_DESCPO) en minúsculas (esto no afecta en el sistema)
    • Se agregó a los campos que faltaban que mostrara mes/año

Se configuró con la información del 2022  la tabla S001 Impuesto Bruto Anual, S003 Subsidio al Empleo Mensual, S006 Salarios Mínimos

Se cambió a minúsculas los títulos de las tablas y los títulos de los campos. Se agregó información al campo de búsqueda, Año/Mes y Versión.

RCJ Procesos

Se utilizará el Proceso 02 Quincenal para las pruebas, por lo que se configuraron todos los campos.

RG5/RG6 Estándar de Periodos

Se dió de alta el estándar de periodos siguiente:

...

RG5_PDPERI

...

RG5_DESCRI

...

AGU

...

Anual

...

ASM

...

Aumento Salario Mínimo

...

DIM

...

Declaración Anual/Constancias

...

MES

...

Mensual

...

PTU

...

Reparto de Utilidades

...

QNA

...

Quincenal

...

SEM

...

Semanal

...

VAR

...

Variabilidad

RGA Encabezado Conceptos por Proceso

Se borraron los registros de conceptos por proceso de todos los procesos excepto el 02, para poder generar el prx solo con un proceso. Se le asignó el estándar de periodos, la fecha inicial y el módulo, para poder generar los periodos del 2019 al 2022.

RCH/RCF/RCG/RFQ Periodos

Se generaron los periodos del proceso 02 Quincenal a través de la generación de periodos con el estándar de periodos.

  • Periodos de Cálculo del 2019, 2020, 2021 y se dejaron como cerrados.
  • Periodos de Cálculo del 2022 y se dejaron como cerrados los periodos antes del 16/05/2022.

RG7 Acumulados

El cliente tiene que tener los acumulados del 2019 al 2021 validados con contabilidad, previo al cálculo del PTU. Para efectos de este Issue, se calculó y cerró la quincena 202205 pago 01.

Con esos datos se generó la información mensual del mes de mayo (RG7_HSR05=RG7_HSR05*2 y RG7_ACUM05=RG7_ACUM05*2) y la información mensual de mayo se repitió en los anteriores meses del 2022 (por ejemplo RG7_HSR01=RG7_HSR05 y RG7_ACUM01=RG7_ACUM05 para los campos del 01 al 04).

Se respaldó la información del 2022 y en el ctree se cambió el año inicial y final por 2021 y se llenaron los campos faltantes (por ejemplo RG7_HSR06=RG7_HSR05 y RG7_ACUM06=RG7_ACUM05 para los campos del 06 al 12) y se appendó.

Se respaldó la información del 2021 y en el ctree se cambió el año inicial y final por 2020 y se appendó. En el respaldó del 2021 se cambió el año inicial y final por 2019 y se appendó.

Cálculo del PTU:

  1. Se calculó, por primera vez, el PTU del Periodo 201905 pago 01, con datos de la tabla S009: TOPE SALARIO un importe máximo (99999.99), y en las columnas de FACTOR PESOS y FACTOR DIAS se capturó 1.00.  Esto trae los acumulados de la base días y base pesos del PTU (sin topar).
  2. Se generó el reporte por periodo vertical, analítico para identificar el salario más alto de los empleados sindicalizado, y se incluyó en la tabla S009, en TOPE SALARIO. Y se calculó por segunda vez el PTU. 
  3. Se generó el reporte de nómina sintéticos para obtener el total de los conceptos 152 PTU Días y 153 PTU Pesos. Con estos datos se calcularon los Factores de Pesos y Días del PTU que se registraron en la tabla S009 y se calculó por tercera vez el PTU.
    • FACTOR PESOS = (IMPORTE A REPARTIR / 2) / ∑Concepto 153 PTU Pesos
    • FACTOR DIAS = (IMPORTE A REPARTIR / 2) / ∑Concepto 152 PTU Días
  1. Se validaron los cálculos con un Excel de ejemplos. Se cerró el periodo.

Se realizaron estos mismos pasos 

RGA - Encabezado Conceptos por Proceso

Se le asignó el estándar de periodos, la fecha inicial y el módulo, para poder generar los periodos del 2019 al 2022. Se agregó el proceso mensual, copiando todos los procedimientos del proceso quincenal.

RCH/RCF/RCG/RFQ - Periodos

Se generaron los periodos del proceso 02 Quincenal a través de la generación de periodos con el estándar de periodos.

    • Periodos de Cálculo del 2019, 2020, 2021 y se dejaron como cerrados.
    • Periodos de Cálculo del 2022 y se dejaron como cerrados los periodos antes del 16/05/2022.

RG7 - Acumulados

El cliente tiene que tener los acumulados del 2019 al 2021 validados con contabilidad, previo al cálculo del PTU.

Cálculo del PTU:

  1. Se calculó, por primera vez, el PTU del Periodo 201905 pago 01, con datos de la tabla S009: TOPE SALARIO un importe máximo (99999.99), y en las columnas de FACTOR PESOS y FACTOR DÍAS se capturó 1.00.  Esto trae los acumulados de la base días y base pesos del PTU (sin topar).
  2. Se generó el reporte por periodo vertical, analítico para identificar el salario más alto de los empleados sindicalizado, y se incluyó en la tabla S009, en Tope Salario. Y se calculó por segunda vez el PTU. 
  3. Se generó el reporte de nómina sintéticos para obtener el total de los conceptos 152 PTU Días y 153 PTU Pesos. Con estos datos se calcularon los Factores de Pesos y Días del PTU que se registraron en la tabla S009 y se calculó por tercera vez el PTU. 

    FACTOR PESOS = (IMPORTE A REPARTIR / 2) / ∑Concepto 153 PTU Pesos
    FACTOR DIAS = (IMPORTE A REPARTIR / 2) / ∑Concepto 152 PTU Días

  4. Se validaron los cálculos con un Excel de ejemplos.
  5. Se cerró el periodo.
  6. Se copiaron los acumulados del mes cinco para el 2020 y 2021,  para generar los acumulados de los 3 años anteriores al 2022.

SRV - Conceptos

En el Catálogo de Conceptos (Actualizaciones | Definic. Cálculo | Conceptos) se tiene que definir los conceptos que conformarán la base de los Días PTU. En el catálogo estándar están configurados los conceptos como base días para PTU (1=Si; 2=No) y los conceptos base pesos para PTU (1=Si; 2=No). 

Se modificaron las descripciones de los conceptos que estaban en mayúsculas. Se corrigieron las faltas de ortografía. Se validaron y ajustaron todos los campos que tienen una lista de valores posibles, para  que tuvieran un valor válido. A los que no tenían información se les asignó el valor correspondiente a No o No usado. A los que tenían información inválida, se les signó el valor correspondiente a No o No usado.

SRA - Empleados

Para cumplir la parte de la ley que dice “así como trabajadores eventuales que hayan laborado menos de 60 días durante el año que corresponda y prestadores de servicios profesionales”, se necesita determinar la base de días del PTU.

Para la determinación de la base días del PTU se toma en cuenta la fecha de ingreso (RA_ADMISSA) o la fecha de reingreso (RA_FECREI) de los empleados (Actualizaciones | Empleados | Empleados). Si se encuentra dentro de la fecha inicial y final del periodo de PTU, se considera para el mínimo de 60 días trabajados para tener derecho al pago del PTU.

SRJ - Funciones

Para cumplir la parte de la ley que dice "todas las trabajadoras y trabajadores tienen derecho a participar en el reparto de utilidades a excepción de los directores, administradores, gerentes generales”, en el catálogo de funciones (Actualizaciones | Archivos | Funciones) se cuenta con el campo "Excluye PTU" donde el cliente informa las funciones que no se les pagará el PTU.


Totvs custom tabs box
tabsPre-condiciones, Procedimiento, Paso 03, Paso 04
idspaso1,paso2

04. INFORMACIÓN ADICIONAL

Diccionario de Datos:

   

...

titlePaquetes 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.

Informações
titleCatálogo de Ejemplo:

View file
namec_RegimenFiscal.csv
height250

   

Informações
titleNOTA:
  • 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.

Archivo de Configuración

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:

Painel
titleGPER884.INI

/*GPER88440.INI V1.2 - Modelo 2022 - 20/04/2022*/
[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 += CFDCarEsp(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="' + CFDCarEsp(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))

   

05. ASUNTOS RELACIONADOS

...

http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/29122021_Matriz_ErroresNomina_v12_RevC.xls

...

Totvs custom tabs box items
defaultyes
referenciapaso1
  • Parche:
    • Respaldar el repositorio (RPO).
    • Aplicar el parche correspondiente a la issue DNOMI-308.
    • Verificar que las rutinas actualizadas en el repositorio, coincidan con las descritas en el encabezado del presente Documento Técnico, y que las fechas sean iguales o superiores.
  • Generar archivos Excel de las fórmulas antes de los cambios
    • Ejecutar la rutina “Consultas | Archivos | Genéricos” y Exportar a Excel la información (Opción Exp. CSV”), de las tablas RC2, RC3, RCC, RCB.
    • Guardar los archivos de Excel generados (antes del cambio).
  • APSDU:
    • Abrir las tablas RCB, RCC, RC2 y RC3.
    • Respaldar la Definición de Tabla (RCB):
      • Estándar: Las tablas que el código inicie con S.
      • Cliente: Las tablas que el código inicie con U.
      • Borrar: todas las tablas (ZAP).
    • Respaldar el Contenido de Tablas (RCC):
      • Estándar: Las tablas que el código inicie con S.
      • Usuario: Las tablas que el código inicie con U y las tablas S008 Vacaciones, S009 PTU, S011 Comedor, S015 Localidades de Pago, S018 Rodapié Recibo de Nómina, S022 Rodapié Recibo de Finiquitos, S023 Criterio Impuesto Estatal, S025 Tipos de Finiquitos, S020 Declaración Anual, S021 Representante Legal, S081 Intereses Préstamos.
      • Borrar: todas las tablas (ZAP).
    • Respaldar el Encabezado de Fórmulas (RC2):
      • Estándar: Las fórmulas que el origen sea igual a “S_”.
      • Cliente: Las fórmulas que el origen sea igual a “U_”.
    • Respaldar el Detalle de Fórmulas (RC3):
      • Estándar: Las fórmulas que el origen sea igual a “S_”.
      • Cliente: Las fórmulas que el origen sea igual a “U_”.
  • Carga de Formulación Estándar:
    • Ingresar a la rutina de Definición de Tablas, ubicada en "Actualizaciones | Definic. Cálculo | Definición Tabla" (GPEA310); para realizar la actualización de los títulos de las tablas.
    • Ingresar a la rutina de Mantenimiento de Tablas, ubicada en "Actualizaciones | Definic. Cálculo | Mtto. Tabla" (GPEA320); para realizar la actualización de las tablas del 2022.
    • Ingresar a la rutina de Fórmulas, ubicada en "Actualizaciones | Definic. Cálculo | Fórmulas" (GPEA290; para realizar la actualización de las fórmulas de PTU (RC2/RC3).
  • Generar archivos Excel de las fórmulas después de los cambios.:
    • Ejecutar la rutina “Consultas | Archivos | Genéricos” y Exportar a Excel la información (Opción Exp. CSV”), de las tablas RC2, RC3, RCB, RCC.
    • Guardar los archivos de Excel generados (después del cambio).
  • Comparar los archivos Excel generados en el punto 2 vs los generados en el punto 7, para determinar las diferencias de configuración de las bases.
    • Encabezado de Fórmulas (RC2):
      • Comparar los archivos antes y después del cambio, para determinar si se realizó el cambio de las fórmulas (versión mayor, después del cambio).
    • Detalle de Fórmulas (RC3):
      • Comparar los archivos antes y después del cambio, para determinar si se realizó el cambio de las fórmulas (debe incluir las líneas del tope del PTU).
  • Se debe tener información en todos los meses del año 2019, 2020, 2021, en la tabla del Histórico de Acumulados (RG7), validada con Contabilidad, de los conceptos (SRV) base días y base pesos del PTU. También debe de tenerse información del cálculo del PTU de los años 2019, 2020 y 2021 para el cálculo del tope "Promedio de tres años del PTU".
  • En caso de que se encuentren diferencias entre contabilidad y nómina,
    • Ingresar a la rutina Periodos, ubicado en "Actualizaciones | Archivos | Periodos (GPEA400) y dar de alta un periodo en diciembre del 2021 (Periodo 202101 Pago 01 Procedimiento 05), de MFN Movimientos Fuera de Nómina, para capturar los ajustes a los acumulados.
    • Ingresar a la rutina de Incidencias por Empleados, ubicada en "Actualizaciones | Asientos | Incid. por Emplead" (GPEA580)e ingresar la información de los ajustes, para el Periodo 202101 Pago 02 Procedimiento 05.
    • Ingresar a la rutina de Cálculo por Procedimientos, ubicada en "Miscelánea | Cálculos  Por procedimientos"  (GPEM020)y calcular el Periodo 202101 Pago 02 Procedimiento 05 para activos e inactivos.
    • Imprimir el Reporte de Nómina, ubicada en "Informes | Periódicos | Planilla de Haberes" (GPER106) o Archivo de Conceptos a Excel, ubicada "Informes | Periódicos | Archivo Conceptos Excel" (GPER012COL), en para validar los datos. NOTA: también servirá como soporte de los ajustes en una auditoría.
    • Ingresar a la rutina Periodos, ubicado en "Actualizaciones | Archivos | Periodos (GPEA400) y cambiar el estatus del periodo a 3 Recibos ya impresos.
    • Ingresar en la rutina Cierre del Periodo, ubicada en "Miscelánea | Cierres | Periodo" (GPEM120) y cerrar el Periodo 202101 Pago 02 Procedimiento 05 Movimientos Fuera de Nómina, para que se guarden en acumulados y el histórico de movimiento, los ajustes.
  • Indicar en Procesos, ubicado en "Actualizaciones | Definic. Cálculo | Procesos" (GPEA420) si se quiere calcular los impuestos del PTU de acuerdo al artículo 96 de la LISR (antes 113) o Artículo 163 del RISR (antes 142).
  • Ingresar a la rutina Periodos, ubicado en "Actualizaciones | Archivos | Periodos (GPEA400) y dar de alta el periodo de PTU del 2022 (Periodo 202205 Pago 01 Procedimiento 04). y seleccionarlo.

    Campo

    Definición

    Período:

    El formato de captura para este campo es aaaamm esto es, cuatro dígitos para el año y dos dígitos para el mes. Usualmente es en Mayo. Ejemplo ‘202205’

    Núm. Pago:

    Como este es un solo periodo en el año, se sugiere poner 01 en el número de pago.

    Mes SRD

    Mes fiscal en el cual se acumula el importe del PTU a pagar en la tabla de Histórico de Movimientos (SRD). Por ejemplo 05 para Mayo.

    Ano SRD

    Año fiscal en el cual se acumula el importe del PTU en la tabla de Histórico de Movimientos (SRD).

    Fecha inicial

    Fecha inicial del periodo que comprende el PTU. (Primer día del año anterior). Por ejemplo: para el Periodo 202205 Pago 01 del Procedimiento 04 PTU sería 01/01/2021.

    Fecha final

    Fecha final que comprende el PTU (Último día del año anterior). Por ejemplo: para el Periodo 202205 Pago 01 del Procedimiento 04 PTU sería 31/12/2021.

    Fecha pago

    Fecha en la que se realizará el pago correspondiente. Esta fecha es la que se considera en la impresión de recibos o en la generación del archivo de depósitos bancario. Por ejemplo: para el Periodo 202205 Pago 01 del Procedimiento 04 PTU la fecha máxima, para no incurrir en multas y recargos, sería 31/05/2022.

    Fecha de corte

    Esta es opcional y su función es indicar la fecha límite para recibir información que afecte el cálculo. Usualmente se considera la misma fecha de pago. Por ejemplo: para el Periodo 202205 Pago 01 del Procedimiento 04 PTU la fecha de corte sería 31/05/2022.

  • Ingresar a la rutina de Conceptos, ubicado en "Actualizaciones | Definic. Cálculo| Conceptos (GPEA040) y revisar que estén bien configuradas las bases de Días PTU (RV_REFPTU) y Pesos PTU (RV_IMPPTU).
  • Ingresar a la rutina de Funciones, ubicado en "Actualizaciones | Archivos | Funciones" (GPEA030) y revisar que estén bien configuradas las funciones que no recibirán PTU (RJ_NOPTU).
  • Asegurarse que se tiene la información de los catálogos usados en el cálculo.
Totvs custom tabs box items
defaultno
referenciapaso2

Cálculo:

  1. Ingresar al módulo Gestión de Personal (SIGAGPE).
  2. Ingresar a la rutina Por procedimiento, ubicada en "Miscelánea | Cálculos | Por procedimiento" (GPEM020).
  3. Informar los parámetros solicitados. Periodo 202205 Pago 01 Procedimiento 04.
  4. Dar clic en "Confirmar".
  5. Visualizar el mensaje de confirmación de finalización del cálculo.

      NOTA: El cálculo del PTU se ejecuta tres veces y en cada una de estos, se afecta esta tabla como se explica a continuación:

    • Consideraciones previas al 1er Cálculo: Dado que el PTU requiere identificar cual es el Tope de Salario Máximo de los Empleados Sindicalizados, previo al cálculo inicial,
      • TOPE SALARIO=99999.99
      • FACTOR PESOS=1.00
      • FACTOR DIAS=1.00
    • Consideraciones previas al 2do Cálculo: El Salario Máximo del Empleado Sindicalizado identificado (bajo el Concepto 151 PTU) debe ser multiplicado por 1.20 y el resultado capturarse en la columna TOPE SALARIO del proceso al que corresponda.
      • TOPE SALARIO= El Salario Máximo del Empleado Sindicalizado * 1.2
      • FACTOR PESOS=1.00
      • FACTOR DIAS=1.00
    • Consideraciones previas al 3er Cálculo: Calcular manualmente FACTOR DIAS Y FACTOR PESOS.
      • TOPE SALARIO= El Salario Máximo del Empleado Sindicalizado * 1.2.
      • FACTOR PESOS = (IMPORTE A REPARTIR / 2) / ∑Total de Salarios (∑Concepto 153 PTU Pesos)
      • FACTOR DIAS = (IMPORTE A REPARTIR / 2) / ∑Total Días (∑Concepto 152 PTU Días

Consulta de Recibo:

  1. Ingresar a la rutina Recibo de Pago, ubicada en "Consultas | Archivos | Recibo de Pago" (GPEA630).
  2. Seleccionar uno de los empleados al cual se realizó el Cálculo de PTU.
  3. Dar clic en "Consultar".
  4. Seleccionar el Periodo del PTU.
  5. Validar que el valor del concepto 151 PTU está topado por el mejor valor entre Salario de 3 Meses o Promedio del pago del PTU de 3 años.

04. INFORMACIÓN ADICIONAL

   

Card documentos
InformacaoSolución disponible para versión 12.1.27 o superiores.
Titulo¡IMPORTANTE!

05. ASUNTOS RELACIONADOS

Sustento Legal para el cambio del PTU:

http://dof.gob.mx/nota_detalle.php?codigo=5616745&fecha=23/04/2021

  • Recibo de Nómina CFDi versión 3.3 - México.

DT Recibo de Nómina CFDi 3.3 - México

  • Documento de Referencia.

DT Recibo de Nómina para versión CFDI 4.0 MEX

  • 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

...


Templatedocumentos