Conforme post anterior, eu fiz um código para pegar o digest value do XML, ainda não testei no processo de contingência, se não funcionar, vou ter q procurar outra forma.
FORM f_digest_value USING fu_active TYPE j_1bnfe_active
CHANGING fc_digval TYPE string.
DATA: lo_download TYPE REF TO cl_j_1bnfe_xml_download,
lo_ixml TYPE REF TO if_ixml,
lo_stream_factory TYPE REF TO if_ixml_stream_factory,
lo_doc TYPE REF TO if_ixml_document,
lo_node_col TYPE REF TO if_ixml_node_collection,
lo_node TYPE REF TO if_ixml_node.
DATA: l_rfcdest TYPE rfcdest,
l_xnfeactive TYPE j_1bxnfeactive,
l_xml TYPE xstring,
l_key TYPE j_1b_nfe_access_key,
l_key44 TYPE j_1b_nfe_access_key_dtel44,
l_xml_cont TYPE j_1b_nfe_xml_content.
CONSTANTS lc_model_nfe TYPE j_1b_nfe_doctype VALUE 'NFE'.
"CONSTANTS lc_direct_in TYPE j_1b_nfe_direction VALUE 'INBD'.
CONSTANTS lc_direct_out TYPE j_1b_nfe_direction VALUE 'OUTB'.
CLEAR fc_digval.
MOVE-CORRESPONDING fu_active TO l_key.
l_key44 = l_key.
SELECT SINGLE ext_event, seqnum
INTO @DATA(ls_event)
FROM j_1bnfe_event
WHERE docnum EQ @fu_active-docnum.
CALL FUNCTION 'J_1B_NFE_CHECK_RFC_DESTINATION'
EXPORTING
i_bukrs = fu_active-bukrs
i_branch = fu_active-branch
i_model = fu_active-model
IMPORTING
e_rfcdest = l_rfcdest
e_xnfeactive = l_xnfeactive
EXCEPTIONS
rfc_error = 1
OTHERS = 2.
CREATE OBJECT lo_download
EXPORTING
iv_xml_key = l_key44
iv_rfc = l_rfcdest.
CALL METHOD lo_download->load_xml_content
EXPORTING
iv_docnum = fu_active-docnum
iv_event_type = ls_event-ext_event
iv_event_seqnum = ls_event-seqnum
iv_direction = lc_direct_out
iv_doctype = lc_model_nfe.
l_xml_cont = lo_download->get_xml_content( ).
*--------------------------------------------------------------------*
* Get DigestValue from lf_signature XML
*---------|----------------------------------------------------------*
lo_ixml = cl_ixml=>create( ).
lo_stream_factory = lo_ixml->create_stream_factory( ).
lo_doc = lo_ixml->create_document( ).
IF lo_ixml->create_parser(
document = lo_doc
stream_factory = lo_stream_factory
istream = lo_stream_factory->create_istream_xstring( string = l_xml_cont )
)->parse( ) <> 0.
RETURN.
ENDIF.
lo_node_col = lo_doc->get_elements_by_tag_name( name = 'DigestValue' ).
IF lo_node_col->get_length( ) > 0.
lo_node = lo_node_col->get_item( 0 ).
fc_digval = lo_node->get_value( ).
ENDIF.
ENDFORM.
quarta-feira, 30 de outubro de 2019
SAP NFCe - Montagem QRCODE
PARA OS DESAVIDADOS PELO MENOS ATÉ HOJE 10/2019 A SAP NÃO TEM UMA SOLUÇÃO PARA NFCE, O MODELO 65 TEM Q SER ADICIONADO NO DOMINIO, ENHANCEMENTS SÃO NECESSÁRIOS PARA VISUALIZAR O XML, E NA FUNÇÃO DE SAIDA DO XML ATÉ TEM A ESTRUTURA COMO PARÂMETRO, MAS PRECISA DE UM ENHANCEMENT PARA PREECHER OS DADOS DO QRCODE SÓ PARA O MODELO 65.
Nesse caso tem uma TVARV q guardo os parâmetros por depender do estado e do tipo do ambiente.
Na minha TVARV eu tenho alguns parâmetros separados por "|"
- REGIO - Número da região da J_1BNFE_ACTIVE
- TOKEN - É o número da sequência do CSC( Código de Segurança do Contribuinte ), onde a empresa tem cadastro no SEFAZ do seu estado
- CSC - é o código Código de Segurança do Contribuinte que vem do SEFAZ do estado
- URL de consulta - É o endereço para consulta do QRCODE
- URL - a outra URL é para utilizar na função /XNFE/OUTNFE_CREATE_400, no parâmetro IS_NFESUPL.
Verificar como é montado o hash e como ele vai na estrutura do XML do QRCODE.
Para montar o código HASH , usar a função abaixo.
CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
EXPORTING
data = fu_chave
IMPORTING
hash = fc_hash
EXCEPTIONS
unknown_alg = 1
param_error = 2
internal_error = 3
OTHERS = 4.
- CONTINGÊNCIA
Para esses caso são adicionados alguns campos a mais. Acho q o mais complicado é pegar o DIGEST VALUE
eu criei uma rotina para pegar o xml e pegar o valor da tag no XML, vou deixa em outro post
DATA : l_nfe_key TYPE string.
DATA: l_qrcode_ver TYPE string.
DATA: l_tpamb TYPE string.
DATA: l_url_cons TYPE string.
DATA: l_geral TYPE string.
DATA: l_hash TYPE hash160,
l_vlr_total TYPE j_1bnfdoc-nftot,
l_valor_c TYPE char15,
l_dig_value TYPE string.
SELECT SINGLE *
INTO @DATA(ls_active)
FROM j_1bnfe_active
WHERE docnum EQ @i_docnum.
l_nfe_key = ls_active-regio &&
ls_active-nfyear &&
ls_active-nfmonth &&
ls_active-stcd1 &&
ls_active-model &&
ls_active-serie &&
ls_active-nfnum9 &&
ls_active-docnum9 &&
ls_active-cdv.
l_qrcode_ver = '2'.
l_tpamb = ls_active-tpamb.
SELECT low
INTO TABLE @DATA(lt_low)
FROM tvarvc
WHERE name EQ 'ZSD_QRCODE_UF_CSC'
AND type EQ 'S'.
LOOP AT lt_low INTO DATA(ls_low).
SPLIT ls_low AT '|' INTO: DATA(l_regio) DATA(l_token)
DATA(l_csc) DATA(l_url_cons_qr) DATA(l_url).
CASE l_regio.
WHEN ls_active-regio.
TRANSLATE l_url_cons_qr TO LOWER CASE.
TRANSLATE l_url TO LOWER CASE.
e_url = l_url.
EXIT.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
CHECK l_csc IS NOT INITIAL.
"CONTINGÊNCIA
IF ls_active-tpemis = '2' OR
ls_active-tpemis = '3' OR
ls_active-tpemis = '4' OR
ls_active-tpemis = '5'.
SELECT SINGLE *
INTO @DATA(ls_nfdoc)
FROM j_1bnfdoc
WHERE docnum EQ @i_docnum.
CHECK sy-subrc = 0.
IF i_vlr_total <= 0.
LOOP AT it_binlin INTO DATA(ls_binlin).
ADD ls_binlin-nfnet TO l_vlr_total.
ENDLOOP.
ELSE.
l_vlr_total = i_vlr_total.
ENDIF.
l_valor_c = l_vlr_total.
PERFORM f_digest_value USING ls_active
CHANGING l_dig_value.
l_geral = l_nfe_key && '|' && l_qrcode_ver && '|' && ls_active-tpamb &&
'|' && ls_nfdoc-docdat+6(2) && '|' && l_valor_c && l_dig_value &&
'|' && l_token && l_csc.
PERFORM f_conv_hash USING l_geral
CHANGING l_hash.
IF sy-subrc = 0.
e_qrcode_key = l_url_cons_qr && l_nfe_key && '|' && l_qrcode_ver &&
'|' && ls_active-tpamb && '|' && l_dig_value &&
'|' && l_token && '|' && l_hash.
ENDIF.
ELSE. "Nota normal.
l_geral = l_nfe_key && '|' && l_qrcode_ver && '|' && ls_active-tpamb &&
'|' && l_token && l_csc.
PERFORM f_conv_hash USING l_geral
CHANGING l_hash.
IF sy-subrc = 0.
e_qrcode_key = l_url_cons_qr && l_nfe_key && '|' && l_qrcode_ver &&
'|' && ls_active-tpamb && '|' && l_token && '|' && l_hash.
ENDIF.
ENDIF.
ENDFUNCTION.
Nesse caso tem uma TVARV q guardo os parâmetros por depender do estado e do tipo do ambiente.
Na minha TVARV eu tenho alguns parâmetros separados por "|"
- REGIO - Número da região da J_1BNFE_ACTIVE
- TOKEN - É o número da sequência do CSC( Código de Segurança do Contribuinte ), onde a empresa tem cadastro no SEFAZ do seu estado
- CSC - é o código Código de Segurança do Contribuinte que vem do SEFAZ do estado
- URL de consulta - É o endereço para consulta do QRCODE
- URL - a outra URL é para utilizar na função /XNFE/OUTNFE_CREATE_400, no parâmetro IS_NFESUPL.
Verificar como é montado o hash e como ele vai na estrutura do XML do QRCODE.
Para montar o código HASH , usar a função abaixo.
CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
EXPORTING
data = fu_chave
IMPORTING
hash = fc_hash
EXCEPTIONS
unknown_alg = 1
param_error = 2
internal_error = 3
OTHERS = 4.
- CONTINGÊNCIA
Para esses caso são adicionados alguns campos a mais. Acho q o mais complicado é pegar o DIGEST VALUE
eu criei uma rotina para pegar o xml e pegar o valor da tag no XML, vou deixa em outro post
DATA : l_nfe_key TYPE string.
DATA: l_qrcode_ver TYPE string.
DATA: l_tpamb TYPE string.
DATA: l_url_cons TYPE string.
DATA: l_geral TYPE string.
DATA: l_hash TYPE hash160,
l_vlr_total TYPE j_1bnfdoc-nftot,
l_valor_c TYPE char15,
l_dig_value TYPE string.
SELECT SINGLE *
INTO @DATA(ls_active)
FROM j_1bnfe_active
WHERE docnum EQ @i_docnum.
l_nfe_key = ls_active-regio &&
ls_active-nfyear &&
ls_active-nfmonth &&
ls_active-stcd1 &&
ls_active-model &&
ls_active-serie &&
ls_active-nfnum9 &&
ls_active-docnum9 &&
ls_active-cdv.
l_qrcode_ver = '2'.
l_tpamb = ls_active-tpamb.
SELECT low
INTO TABLE @DATA(lt_low)
FROM tvarvc
WHERE name EQ 'ZSD_QRCODE_UF_CSC'
AND type EQ 'S'.
LOOP AT lt_low INTO DATA(ls_low).
SPLIT ls_low AT '|' INTO: DATA(l_regio) DATA(l_token)
DATA(l_csc) DATA(l_url_cons_qr) DATA(l_url).
CASE l_regio.
WHEN ls_active-regio.
TRANSLATE l_url_cons_qr TO LOWER CASE.
TRANSLATE l_url TO LOWER CASE.
e_url = l_url.
EXIT.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
CHECK l_csc IS NOT INITIAL.
"CONTINGÊNCIA
IF ls_active-tpemis = '2' OR
ls_active-tpemis = '3' OR
ls_active-tpemis = '4' OR
ls_active-tpemis = '5'.
SELECT SINGLE *
INTO @DATA(ls_nfdoc)
FROM j_1bnfdoc
WHERE docnum EQ @i_docnum.
CHECK sy-subrc = 0.
IF i_vlr_total <= 0.
LOOP AT it_binlin INTO DATA(ls_binlin).
ADD ls_binlin-nfnet TO l_vlr_total.
ENDLOOP.
ELSE.
l_vlr_total = i_vlr_total.
ENDIF.
l_valor_c = l_vlr_total.
PERFORM f_digest_value USING ls_active
CHANGING l_dig_value.
l_geral = l_nfe_key && '|' && l_qrcode_ver && '|' && ls_active-tpamb &&
'|' && ls_nfdoc-docdat+6(2) && '|' && l_valor_c && l_dig_value &&
'|' && l_token && l_csc.
PERFORM f_conv_hash USING l_geral
CHANGING l_hash.
IF sy-subrc = 0.
e_qrcode_key = l_url_cons_qr && l_nfe_key && '|' && l_qrcode_ver &&
'|' && ls_active-tpamb && '|' && l_dig_value &&
'|' && l_token && '|' && l_hash.
ENDIF.
ELSE. "Nota normal.
l_geral = l_nfe_key && '|' && l_qrcode_ver && '|' && ls_active-tpamb &&
'|' && l_token && l_csc.
PERFORM f_conv_hash USING l_geral
CHANGING l_hash.
IF sy-subrc = 0.
e_qrcode_key = l_url_cons_qr && l_nfe_key && '|' && l_qrcode_ver &&
'|' && ls_active-tpamb && '|' && l_token && '|' && l_hash.
ENDIF.
ENDIF.
ENDFUNCTION.
Assinar:
Postagens (Atom)