Si actualmente ya tienes instalado la solución de SAP para facturas electrónicas SD/FI e instalado el Certificado Digital, se puede generar el Sello Digital del Recibo de Nómina directamente desde SAP. Este evita el dar datos confidenciales de la firma electrónica a los PAC.

Para este propósito debemos de usar el BADI HRPAYMX_CFDI  liberado por SAP para la solución de Recibos de Nómina CFDI.

El Sello Digital se obtiene a partir de una cadena de caracteres con información definida por el SAT el cual se encripta con algoritmos definidos por el SAT y se genera un string de 172 posiciones denominado “Sello Digital”.

/wp-content/uploads/2013/12/sello_digital_353697.png

La base para la generación del Sello Digital es la generación de los que se denomina cadena original usando la estructura liberada por SAP HRPAYMX_S_CFDI_ANNEX_20.

Adjunto un programa que permite generar la cadena original.

Módulo de Función ZPYMX_DI_CREATE_ORI_IN_MSG

INCLUDE LZPYMX_DI_SIGNATURETOP
CONSTANTS gc_pipeline TYPE c VALUE ‘|’.
FUNCTION ZPYMX_DI_CREATE_ORI_IN_MSG

FUNCTION zpymx_di_create_ori_in_msg.

*”———————————————————————-

*”*”Interfase local

*”  IMPORTING

*”     REFERENCE(IS_CFDI_ANNEX_20) TYPE  HRPAYMX_S_CFDI_ANNEX_20

*”  EXPORTING

*”     REFERENCE(EV_ORI_INPUT_MSG) TYPE  STRING

*”  EXCEPTIONS

*”      OIM_BLOCK_ERROR

*”      DATA_BLOCK_ERROR

*”      BLOCK_CREATION_ERROR

*”      CUSTOM_ERROR

*”———————————————————————-

   DATA:

     lo_annex20  TYPE REF TO cl_abap_structdescr,

     lt_comp_tab TYPE cl_abap_structdescr=>component_table,

     ls_comp     TYPE LINE OF cl_abap_structdescr=>component_table.

   “built up character string

   DATA lv_data_pos_chain         TYPE string.

   FIELD-SYMBOLS:

     <lv_value> TYPE ANY.

   lo_annex20 ?= cl_abap_typedescr=>describe_by_data( is_cfdi_annex_20 ).

   lt_comp_tab = lo_annex20->get_components( ).

*———————————————————————-*

* Procesar Estructura

*———————————————————————-*

   LOOP AT lt_comp_tab INTO ls_comp.

     ASSIGN COMPONENT ls_compname

     OF STRUCTURE is_cfdi_annex_20 TO <lv_value>.

     PERFORM f_create_chain USING <lv_value>

                                  ls_comptype->kind

                           CHANGING lv_data_pos_chain.

   ENDLOOP.

   CONCATENATE gc_pipeline gc_pipeline

               lv_data_pos_chain

               gc_pipeline gc_pipeline INTO ev_ori_input_msg.

* Remove direct consecutive blanks, because SAT input message

* is created in this way

   CONDENSE ev_ori_input_msg.

ENDFUNCTION.

INCLUDE LZPYMX_DI_SIGNATUREF01

*———————————————————————-*

***INCLUDE LZPYMX_DI_SIGNATUREF01 .

*———————————————————————-*

*&———————————————————————*

*&      Form  F_CREATE_CHAIN

*&———————————————————————*

*       text

*———————————————————————-*

*      –>P_<LV_VALUE>  text

*      <–P_LV_DATA_POS_CHAIN  text

*———————————————————————-*

FORM f_create_chain  USING      value(p_elemento) TYPE any

                                 p_kind TYPE c

                      CHANGING   data_pos_chain TYPE any.

   DATA:

     lo_elemento  TYPE REF TO cl_abap_structdescr,

     lt_comp_tab TYPE cl_abap_structdescr=>component_table,

     ls_comp     TYPE LINE OF cl_abap_structdescr=>component_table.

   FIELD-SYMBOLS:

     <lv_header> TYPE ANY,

     <dyn_table> TYPE STANDARD TABLE,

     <lv_value>  TYPE ANY.

   DATA concatenated_field(255) TYPE c.

   CASE p_kind.

     WHEN cl_abap_typedescr=>kind_table.

       ASSIGN p_elemento TO <dyn_table>.

       LOOP AT <dyn_table> ASSIGNING <lv_header>.

         lo_elemento ?= cl_abap_typedescr=>describe_by_data( <lv_header> ).

         lt_comp_tab = lo_elemento->get_components( ).

         LOOP AT lt_comp_tab INTO ls_comp.

           ASSIGN COMPONENT ls_compname

           OF STRUCTURE <lv_header> TO <lv_value>.

           PERFORM f_create_chain USING <lv_value>

                                        ls_comptype->kind

                                 CHANGING data_pos_chain.

         ENDLOOP.

       ENDLOOP.

     WHEN cl_abap_typedescr=>kind_struct.

       lo_elemento ?= cl_abap_typedescr=>describe_by_data( p_elemento ).

       lt_comp_tab = lo_elemento->get_components( ).

       LOOP AT lt_comp_tab INTO ls_comp.

         ASSIGN COMPONENT ls_compname

         OF STRUCTURE p_elemento TO <lv_value>.

         PERFORM f_create_chain USING <lv_value>

                                      ls_comptype->kind

                               CHANGING data_pos_chain.

       ENDLOOP.

     WHEN cl_abap_typedescr=>kind_elem.

       IF ( p_elemento IS NOT INITIAL ) AND

          ( p_elemento <> ).

         concatenated_field = p_elemento.

*         deleting of unnecessary white spaces

         “CONDENSE concatenated_field.

         SHIFT concatenated_field LEFT DELETING LEADING space.

         IF data_pos_chain <> .

           CONCATENATE data_pos_chain concatenated_field

           INTO data_pos_chain

           SEPARATED BY gc_pipeline.

         ELSE.

           data_pos_chain = concatenated_field.

         ENDIF.

       ENDIF.

     WHEN OTHERS.

       IF ( p_elemento IS NOT INITIAL ) AND

          ( p_elemento <> ).

         concatenated_field = p_elemento.

*         deleting of unnecessary white spaces

         “CONDENSE concatenated_field.

         SHIFT concatenated_field LEFT DELETING LEADING space.

         IF data_pos_chain <> .

           CONCATENATE data_pos_chain concatenated_field

           INTO data_pos_chain

           SEPARATED BY gc_pipeline.

         ELSE.

           data_pos_chain = concatenated_field.

         ENDIF.

       ENDIF.

   ENDCASE.

ENDFORM.                    ” F_CREATE_CHAIN

Con los datos llenos en la estructura SAP HRPAYMX_S_CFDI_ANNEX_20, se genera de forma automática la cadena original.

Cadena_Original.png

Una vez que se ha generado la cadena original debemos de aplicar los módulos de función que tiene SAP de forma estándar para generar el Sello Digital tomando los certificados instalados en los servidores de aplicación.

Si necesitan más información estoy a sus órdenes por este medio.

Saludos,

To report this post you need to login first.

31 Comments

You must be Logged on to comment or reply to a post.

  1. Pavel Garcia Post author

    Disculpen la demora en contestar pero todas las funciones se encuentra en el paquete ID-MX-DI.

     

    En el módulo de función IDMX_DI_SD_SINGLE_SIGN están las rutinas para generar la cadena original y el sello digital en el módulo SD y los podemos tomar como ejemplo..

     

    Saludos,

    (0) 
  2. Elda Estefanía Sánchez Avilés

    Que tal, espero alguien me pueda echar la mano, en mi trabajo tenemos únicamente el módulo de RH, me piden genere yo el sello digital para adjuntarlo en el xml de los recibos de nómina. ¿Existen ya los algoritmos programados (HASH, RSA y la conversión a base 64 que pide el CFDI) o alguna nota que deba aplicar el basis para que pueda yo hacer esto desde la BADI? .

     

    Agradeceré mucho su ayuda, buen día.

    (0) 
    1. Pavel Garcia Post author

      Hola Elda:

      Nosotros ya pudimos generar el sello digital en SAP y Timbra con el PAC.

       

      Para poder generar el Sello Digital tienes que tener instalado las siguientes notas:

      • Instalación Certificados Digitales en Servidores de Aplicación SAP (Ver Nota 1300880 – Digital Invoice Mexico: Import Certificates).
      • Tener Instalado la solución estándar de SAP para la factura electrónica CFD y CFDI (Ver Nota 1869512 – CFDI Digital Invoice Mexico)

       

      El sello lo tienes que generar en el BADI HRPAYMX_CFDI Método IF_HRPAYMX_CFDI~CHANGE_DATA.

       

      La estructura HRPAYMX_S_CFDI_ANNEX_20 es diferente que la estructura de IDMX_DI_ORI_IN_MSG_TYPE que es con la que se genera la cadena original en MF de factura electrónica de SD (Además no tiene la estructura de complemento de Nómina). Lo que realizamos nosotros fue crear una nueva estructura ZHRPAYMX_S_CFDI_CHAIN que usa los campos de  HRPAYMX_S_CFDI_ANNEX_20 pero con el orden que requiere el SAT en su definición del CFDI 3.2 y el complemento de Nómina. En un post anterior indico como generar la cadena origina.

       

      Si desean más información con gusto me pueden escribir a pavel.garcia@wiseitgroup.com

       

      Saludos,

      (0) 
  3. Hugo Rodriguez

    Hola.

     

    – En SD, el FM para hacer el sello es: IDMX_DI_SD_SINGLE_SIGN y este contiene el FM: IDMX_DI_SD_DATA_EXTRACT  que es el que forma la cadena original.

     

      

    – En FI, el FM para hacer el sello es: IDMX_DI_FI_SINGLE_SIGN y este contiene el FM: IDMX_DI_FI_DATA_EXTRACT  que es el que forma la cadena original.

     

     

    En ambos co-existen CFD y CFDI

    Espero les sea de utilidad. Voy a publicar esto mismo en otro Post por si desean comentamos ahí para no hacer más larga el presente Post.

     

    Saludos!

    Hugo.

    (0) 
  4. Elda Estefanía Sánchez Avilés

    Gracias por sus respuestas, me quedó claro que debo de generar mi rutina para formar la cadena original pero ahora me surgió una duda más, puesto que nosotros solo tenemos instalado el módulo RH, no tenemos ni FI ni SD, ¿puedo hacer los cifrados HASH y RSA y la base 64 sin problema y el funcional basis puede instalar la nota 1869512 en RH?

    (0) 
  5. Jose Angel de la Garza Cruz

    Una duda, ya implemente varias funciones y me genera correcta la cadena, sin embargo tengo duda con los certificados en el servidor, como hay que indicarle al programa que certificado debe tomar para tal cadena? Debe ser por división de personal supongo pero no hayo la manera de extraer el certificado que corresponde, espero que alguien me pueda orientar un poco.

     

    Muchas Gracias.

    (0) 
    1. Elda Estefanía Sánchez Avilés

      Hola,

       

      Creo que tengo una respuesta para eso,  en la SPRO-componentes multiaplicaciones-funciones de aplicación generales-firma digital-parametrizaciones específicas del país-mexico-parametrizacion de firma digital.

       

      Ahí se liga la sociedad con el archivo pse.


      Espero te ayude eso.

      (0) 
  6. Veronia Alegria

    hola,

    Con el cliente que vi esto si tiene SD y lo del cfdi y me dieron la clave para cada división y de esta manera lo estoy identificando para que haga el cifrado del numero de certificado y del certificado.

    Ya vi el modulo de función para el sello pero tengo duda de que mandar en cada campo.

    Saludos,

    Vero

    (0) 
  7. Jose Angel de la Garza Cruz

    Que tal!

     

    Sigo teniendo problemas con la generación del sello, ya tengo los archivos PSE en el servidor pero no encuentro como se deben de leer adecuadamente dependiendo de la división, así como convertirlo en la cadena que ira en el XML, alguien tendrá algún ejemplo?

     

    Muchas Gracias!

    (0) 
    1. Juan Eusebio Rodriguez

      Hola.

       

      Laconfiguración la mencionaron anteriormente.

      Una vez que tienes firmados e instalados los archivos PSE configuras la vista: IDMX_DI_VPSEPROF para que crees un perfir para cada Sociedad y asignas el archivo PSE.

      Después asignas el ID del perfil a la Sociedad en la vista IDMX_DI_VPROFDET.

       

      Cabe mensionar que la cadena generada debe estar bien formada en base a los campos obligatorios y definidos en el archivo nómina11.xslt – Secuencia de cadena original que esta publicado en el SAT.

      Espero que te sean de utilidad mis comentarios.

      (0) 
      1. Jose Angel de la Garza Cruz

        Listo ya los cargue a esas vistas y estoy aplicando la función IDMX_DI_SIGN, ya me genero algunas cadenas pero no se si tenga que aplicar algo mas o esas se las paso al XML.

         

        En las vistas (IDMX_DI_VPSEPROF) les asigne el CODE PAGE UTF-8, mas no se si sea correcto, asi como el formato de firma PKCS#1.

        (0) 
        1. Pavel Garcia Post author

          Adjunto el código que me genera todos los datos necesarios del sellado usando MF de CFDI 3.2 de SD

           

          FUNCTION zpymx_di_sign.

          *”———————————————————————-

          *”*”Interfase local

          *”  IMPORTING

          *”     REFERENCE(IV_BUKRS) TYPE  BUKRS

          *”     REFERENCE(IV_ERDAT) TYPE  DATUM

          *”     REFERENCE(IV_ERZET) TYPE  UZEIT

          *”     REFERENCE(IS_CFDI_CHAIN) TYPE  ZHRPAYMX_S_CFDI_CHAIN

          *”  EXPORTING

          *”     REFERENCE(EV_CERTIFICATE_NBR) TYPE  CHAR20

          *”     REFERENCE(EV_CERTIFICATE) TYPE  STRING

          *”     REFERENCE(EV_DIGITAL_SEAL) TYPE  STRING

          *”  EXCEPTIONS

          *”      ERROR

          *”———————————————————————-

             DATA:

               lv_ori_input_msg TYPE string,

               ls_ssf_parameters TYPE  idmx_di_const,

               lv_ssf_parameters_id  TYPE  idmx_di_profile,

               lv_ssf_validity_flag TYPE general_flag,

               lv_indatalen         TYPE ssflen,

               lt_in_data_table     TYPE TABLE OF ssfbin,

               ls_in_data_table     TYPE ssfbin,

               ls_cvers TYPE cvers,

               ls_cer_config TYPE zcfdi_cer_config,

               lv_signer_id       TYPE ssfid,

               lv_cert_valid_from TYPE  ssfutc,

               lv_cert_valid_to   TYPE  ssfutc ,

               lv_serialno(40)   TYPE c,

               lv_checked_serial_nr(255) TYPE c,

               lv_psefile_path   TYPE ssfparmspab,

               lv_string_unchecked_serial_nr TYPE string,

               lv_offset TYPE i,

               lv_cert_xstring   TYPE xstring,

               lv_certificate    TYPE ssfcert.

           

             CONSTANTS:

                 lc_sap_basis TYPE dlvunit VALUE ‘SAP_BASIS’.

           

          * GET SAP BASIS RELEASE VERSION

             SELECT SINGLE * FROM cvers INTO ls_cvers

               WHERE component = lc_sap_basis.

           

          *———————————————————————-*

          * DETERMINE SIGNATURE PARAMETER ID

          *———————————————————————-*

             CALL FUNCTION ‘IDMX_DI_GET_PARAM_ID’

               EXPORTING

                 bukrs                 = iv_bukrs

                 erdat                 = iv_erdat

                 erzeit                = iv_erzet

               IMPORTING

                 parameter_id          = lv_ssf_parameters_id

               EXCEPTIONS

                 no_valid_parameter_id = 1.

           

             IF sysubrc <> 0.

               MESSAGE ID symsgid TYPE symsgty NUMBER symsgno

                       WITH symsgv1 symsgv2 symsgv3 symsgv4.

          *                RAISING error.

             ENDIF.

           

          *——————————————————

          *. CHECK SSF ENVIRONMENT (configured server)

          *——————————————————

          *      CALL FUNCTION ‘IDMX_DI_CHECK_SSF_CONFIG’

          *        EXPORTING

          *          iv_parameters_id        = lv_ssf_parameters_id

          *          iv_doc_creation_date    = lv_fecha_timbrado

          *          iv_doc_creation_time    = lv_hora_timbrado

          *        IMPORTING

          *          ev_validity_flag        = lv_ssf_validity_flag

          *        EXCEPTIONS

          *          parameters_id_not_exist = 1

          *          psefile_not_exist       = 2

          *          psefile_invalid         = 3

          *          unknown_error           = 4

          *          OTHERS                  = 5.

          *

          *      IF NOT sy-subrc IS INITIAL.

          *        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

          *                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

          **            RAISING error.

          *      ENDIF.

           

             CALL FUNCTION ‘IDMX_DI_GET_PARAMS’

               EXPORTING

                 ssf_parameters_id     = lv_ssf_parameters_id

               IMPORTING

                 PARAMETERS            = ls_ssf_parameters

          *          pse_password          = lv_password

               EXCEPTIONS

                 data_error            = 1

                 incomplete_parameters = 2

                 OTHERS                = 3.

             IF sysubrc <> 0.

               MESSAGE ID symsgid TYPE symsgty NUMBER symsgno

                       WITH symsgv1 symsgv2 symsgv3 symsgv4.

             ENDIF.

           

          *———————————————————————-*

          * Generar Cadena Original

          *———————————————————————-*

             CALL FUNCTION ‘ZPYMX_DI_CREATE_ORI_IN_MSG’

               EXPORTING

                 is_cfdi_chain        = is_cfdi_chain

               IMPORTING

                 ev_ori_input_msg     = lv_ori_input_msg

               EXCEPTIONS

                 oim_block_error      = 1

                 data_block_error     = 2

                 block_creation_error = 3

                 custom_error         = 4

                 OTHERS               = 5.

             IF sysubrc <> 0.

               MESSAGE ID symsgid TYPE symsgty NUMBER symsgno

                       WITH symsgv1 symsgv2 symsgv3 symsgv4.

             ENDIF.

           

          *——————————————————-

          * CREATION OF DIGITAL SIGNATURE

          *——————————————————–

           

             CALL FUNCTION ‘IDMX_DI_SIGN’

               EXPORTING

                 inv_str                   = lv_ori_input_msg

                 ssf_parameters_id         = lv_ssf_parameters_id

          * SSF_PARAMETERS                =

             iv_release                    = ls_cversrelease

          * IV_PRINT                      =

             iv_get_certificate            = ‘X’

          * IV_DOC_AWKEY                  =

          * IV_DOC_AWTYP                  =

             IMPORTING

             prn_sign                      = ev_digital_seal

          * SIGN_BM                       =

          * LEN_SIGN_BM                   =

             prn_cert_sno                  = lv_checked_serial_nr

          *      ori_md5                       = lv_ori_hashed_md5

             cert_base64                   = ev_certificate

             EXCEPTIONS

               ssf_custom_error              = 1

               ssf_krn_error                 = 2

               ssf_no_memory                 = 3

               ssf_no_ssflib                 = 4

               ssf_no_cert                   = 5

               ssf_parameter_not_found       = 6

               ssf_parameter_wrong           = 7

               invalid_filename_password     = 8

               conv_error                    = 9

               custom_error                  = 10

               no_operation                  = 11

               OTHERS                        = 12

                       .

             IF sysubrc <> 0.

               MESSAGE ID symsgid TYPE symsgty NUMBER symsgno

                       WITH symsgv1 symsgv2 symsgv3 symsgv4.

          *                RAISING error.

             ENDIF.

           

          * SERIAL NUMBER OF THE CERTIFICATE

          * Remove check digits which are inserted every even place

           

             CLEAR lv_offset.

             lv_offset = 1.

             WHILE NOT lv_checked_serial_nr+lv_offset(1) IS INITIAL.

               CONCATENATE lv_string_unchecked_serial_nr lv_checked_serial_nr+lv_offset(1)

               INTO lv_string_unchecked_serial_nr.

               lv_offset = lv_offset + 2.

             ENDWHILE.

           

             ev_certificate_nbr = lv_string_unchecked_serial_nr.

           

          ENDFUNCTION.

          (0) 
          1. Jose Angel de la Garza Cruz

            Que tal!

             

            Ya probe la función y es correcta.

             

            Lo único es el parámetro CERT_BASE64, no existe en la función IDMX_DI_SIGN, estuve buscando notas pero no encontré ninguna que actualice esta función.

             

            Ese parámetro cual vendría siendo?

            (0) 
              1. Jose Angel de la Garza Cruz

                Muchas Gracias! con esa nota ya di en el clavo! Batalle un poco en encontrar las notas exactas que afectaban esa función (IDMX_DI_SIGN) pero ya las implemente y me genera correctamente el certificado y el sello en base 64.

                 

                Las notas son la 1711011 y la 1734373, implemente algunas mas que no teníamos, pero según yo con esas es suficiente.

                (0) 
                1. Rogelio Tenorio

                  Hola Jose Angel, estoy interesando en generar todo desde SAP,  me podrias apoyar, cuales son las notas de SAP que tengo que aplicar para generar el sello y la firma digital ?

                   

                  De antemano gracias por tu apoyo

                  Saludos,

                     Rogelio

                  (0) 
                  1. Jose Angel de la Garza Cruz

                    Pues son bastantitas, a parte de todas las nuevas del CFDi-Nomina, tienes que tener las de facturación electrónica o bien tener el ultimo SP de HR, yo implemente la 1711011 y la 1734373 para la generación del sello digital y con eso ya me creo el sello correcto, para la cadena original me sirvió mucho el código que compartió Pavel. 

                     

                    Las notas del CFDi-Nomina, son las sigs:
                    1944988, 1949006, 1956098, 1953642, 1960932, 1972070, 1975152, 1992828, 2000481.

                     

                    Para cargas los certificados al servidor lo debe de hacer un basis, es la nota: 1300880.

                     

                    En las tablas IDMX_DI_VPSEPROF y IDMX_DI_VPROFDET haces la relación certificado-división de personal.

                     

                    Saludos.

                    (0) 
                    1. Rogelio Tenorio

                      Hola Jose, Gracias,  pero creo que tengo problemas con mi BASIS en la aplicación de la nota

                       

                      Para mis pruebas solicite que importaran los cerificados que proporciona el SAT para pruebas

                      http://www.sat.gob.mx/informacion_fiscal/factura_electronica/Paginas/certificado_sello_digital.aspx

                       

                      Pero no se cual es su problema, ellos me estan mandando esto:

                       

                      Hello Rogelio,

                      that does not help, since here the missing certificate can not be found and all private certificates refer to ‘Hector Ornelas Arciga’. There are several notes in the SAP on the subject. Default response is the following:

                       

                      In your Private certificate, the Issuer is “Héctor Ornelas Arciga”,

                       

                      but there are no Government certificates that have the Subject with

                       

                      the name “Héctor Ornelas Arciga”, so your Private does not fit with

                       

                      the other certificates. Actually, the Government certificate that

                       

                      you sent us has the Subject “Servicio de Administración Tributaria”,

                       

                      it is not the same name of the Issuer of your Private certificate.

                       

                       

                       

                      In this case, we suggest you to contact SAT or Banco de Mexico. They

                       

                      can provide you the correct Government and Root certificates that fits

                       

                      with your Private certificate. Also, probably SAT or Banco de Mexico

                       

                      can provide you a new Private certificate that fits with the Government

                       

                      and Root certificates that you already have (the same of the ZIP file).

                       

                      Ya no se hacer o darles  ,  podrias ayudarme, como se importan y de donde tomaste los certificados ?

                       

                      Saludos

                          Rogelio

                      (0) 
  8. Victor Hugo Castañeda

    Hola, estoy ya generando el sello con esta función pero al momento del envío al PAC me dice que el sello no es correcto, tendrán alguna idea de lo que pueda estar sucediendo?

    (0) 
    1. Jose Angel de la Garza Cruz

      Que tal Hugo.

       

      Lo que sucede es que la estructura que maneja SAP no es la que pide el SAT, hay que mover algunos campos de posición así como identificar los campos que pide SAT que aunque no traigan valor los mande como |0.0| en la cadena original.

       

      Esto me lo comento Pavel García, solo es de ajustar la función.

       

      Puedes crear una nueva estructura Z y aplicar un “Move corresponding”.

       

      Asi queda la estructura (son componentes de la estructura del anexo20):

       

      gfda.JPG

       

      Yo aun no libero la nueva función ya que aun me marca que el sello es invalido, pero de preferencia guarda la cadena en una tabla Z para que la compares con la cadena que debe de ser en base a la información del XML utilizando otro validador de CFD como el Valida CFD.

      (0) 
    2. Hugo Rodriguez

      Hola Vic.

      Estas intentando usar los FMs de FI y SD para sellar el CFDi de PY ¿cierto?

      Por lo que he leido en esta cadena de conversación, Pavel García ya lo consiguió.

      Nosotros aún no tenemos planes de integrar esto en el estándar (sellado del CFDi para PY).

      (0) 
      1. Victor Hugo Castañeda

        Hola a todos:

         

        Gracias por la ayuda, el problema es que el cliente nada más tiene contratado el servicio de timbrado, y no tienen intención de adquirir otro de sus métodos que ofrece su PAC para el sellado, pero ya logramos hacer en pruebas un timbrado, lo cual requirió generar un nuevo Trans con la disposición requerida por el SAT, para obtener la cadena original.

         

        Ahora me tope con que al regreso del timbre el preCFDi viene en un string, y requiero incertarlo al XML, supongo que mas adelante lo vuelve a transformar, para mostrar en el container el XML.

         

        Por otro lado en el programa RPCPAYMX_CFDI_LOADER al darle una carpeta en donde grabe algunos archivos XML de prueba, no me levanta los archivos, mandando en el log todos erroneos,  es requisito que hayan sido timbrados?

         

           Saludos.

        (0) 
        1. Hugo Rodriguez

          Hola Vic.

          los XMLs timbrados pueden ser rechazados si el objeto de Transformación no coincide con la estructura del archivo. Puedes ver en el reporte _LOADER el objeto trans que tenemos por estándar (el timbre debe ir en el complemento de Nómina justo antes del nodo de Nómina). Saludos!

          (0) 
      2. Pavel Garcia Post author

        Hola Hugo:

        Gracias por la referencia, adjunto mis comentarios respecto a la estrategia a seguir para el sellado y timbrado:

         

        a) Sellado SAP y Timbrado PAC. Como comente en otros post anteriores este requiere conocer bien la funcionalidad de factura electrónica de SAP o en su caso contratar una empresa de consultoría especializada en el tema del Sello Digital. En el caso del timbrado este se puede realizar usando una aplicación propia del PAC o a través de un Web Services lanzado a través de un servidor PI o directamente desde ABAP a traves de las clases PROXYs.

         

        b) Sellado y Timbrado PAC. Este escenario es el más sencillo pero algunos CLIENTES no quieren este escenario por temas de seguridad y políticas corporativas de compartir a un tercero la firma electrónica de la empresa. El sellado y timbrado se puede realizar usando una aplicación propia del PAC o a través de un Web Services lanzado a través de un servidor PI o directamente desde ABAP a traves de las clases PROXYs.

         

        En el primer escenario la parte crítica es el armado de la cadena original que es la base del sello digital, como comenté en un post anterior es conveniente grabar en una tabla Z la cadena generada en la función que compartí para compararlo con el que genera el PAC a partir del XML generado.

         

        Voy a tratar de compartir este fin de semana la solución completa de nuestra versión 1.0 que tiene todavía código duro por la urgencia de terminar este fin de mes. En nuestra versión 2.0 ya disponemos de forma flexible la configuración de la cadena original pero este no puedo publicarlo o en todo caso lo podemos ofrecer como consultoría de implementación.

         

        Saludos,

        (0) 
  9. Flavio Abreu

    Buenos días,

     

    Nosotros para evitar todo el tema del sellado, contratamos con el PAC que ellos generaran el CFDI completo, no solo el timbrado, a partir del XML que nos arroja SAP y de esa manera estamos trabajando. Tanto en PY como en SD y FI, escogimos esta opción porque nos hace independientes de cualquier cambio que emita el SAT, y el PAC es el que esta obligado a avisarnos de los cambios (si aplican de nuestro lado) o simplemente el los implementa y nosotros nos mantenemos al margen; solo validamos de manera aleatoria que se esten generando correctamente los CFDI.

     

    Saludos.

    (0) 
  10. Pavel Garcia Post author

    Buenos días:

     

    Nosotros ya tenemos la solución de integración SAP-PAC usando Web Services, funcionando en varios clientes.

     

    Si requieren información de la solución favor de enviarme un correo a cpavel.garcia@gmail.com con sus datos para ponernos en contacto.

     

    Saludos,

    (0) 

Leave a Reply