0% found this document useful (0 votes)
8 views129 pages

ZCL_FI_CFDIXMLFE Class Methods Overview

The document defines a class ZCL_FI_CFDIXMLFE in ABAP with various methods for handling financial transactions, including creating XML files, attaching documents, and processing payments. It includes methods for canceling payments, generating PDFs, and sending emails, among others. The class is structured to manage financial data and integrate with document management systems.

Uploaded by

Jorge FOS
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views129 pages

ZCL_FI_CFDIXMLFE Class Methods Overview

The document defines a class ZCL_FI_CFDIXMLFE in ABAP with various methods for handling financial transactions, including creating XML files, attaching documents, and processing payments. It includes methods for canceling payments, generating PDFs, and sending emails, among others. The class is structured to manage financial data and integrate with document management systems.

Uploaded by

Jorge FOS
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

class ZCL_FI_CFDIXMLFE definition

public
final
create public .

public section.

data LV_PATH type STRING .

methods CREATE_TXT_CANCEL
importing
!I_XBLNR type XBLNR
!I_PAVAL type T001Z-PAVAL
!I_UUID type ZFI_T_PAGOS_CFDI-UUID_PAGO
!I_BELNR type BELNR_D
!I_BUKRS type BUKRS
!I_GJAHR type GJAHR
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI .
methods ATTACH_FILE
importing
!I_FILE type STRING
!I_KEY type SWO_TYPEID
!I_TYPE type SWO_OBJTYP
!I_VALUE type XSTRING optional
!I_STRING type STRING optional .
methods CANCEL_PAGO
importing
!I_BKPF type BKPF optional
!T_BSEG type BSEG_T optional
exporting
!E_XML type XSTRING
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI optional
!T_PARCIAL_R type ZFI_TT_PAGOS_CFDI optional .
methods CONSTRUCTOR .
methods GET_FILES_GOS
importing
!I_DOCUMENT type SIBFBORIID
exporting
!R_CONTENT_PDF type XSTRING
!R_CONTENT_XML type XSTRING .
methods SAVE_LOG
importing
!I_CREATE type CHAR1 optional
!I_S_LOG type BAL_S_LOG optional
!I_S_MSG type BAL_S_MSG optional
changing
!C_LOG_HANDLE type BALLOGHNDL optional .
methods PARSER_XML_SPEI
importing
!I_XML type STRING
changing
!T_PARSER type ZFI_TT_ABAP_XMLTB .
methods PARSER_XML
importing
!I_XML type STRING
changing
!T_PARSER type ZABAP_XMLTB
exceptions
PARSE_ERROR .
methods POPUP_GET_VALUES
importing
!I_TITLE type CHAR50
!I_TIPO type CHAR1
!I_BUTTONS type CHAR1
exporting
!E_RETURN type CHAR1
changing
!T_FIELDS type KWT_SVAL optional .
methods SAVE_TEXT
importing
!I_KEY type THEAD-TDNAME
!I_ID type THEAD-TDID
!T_TLINE type IDMX_DI_T_TLINE .
methods SUSTITUIR_PAGO
importing
!I_BKPF type BKPF optional
!T_BSEG type BSEG_T optional
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI optional .
methods COMPLEMENTO_PAGOS
importing
!I_BKPF type BKPF
!I_KUNNR type KUNNR
!T_BSEG type BSEG_T
!T_AUSZ3 type RE_T_EX_AUSZ3 optional
!I_TIPO type CHAR1
!T_CHEQUE type ZFI_TT_CHEQUE_CFDI optional
!T_SPEI type STRING optional
!T_TRANSFER type ZFI_TT_TRANSFER_CFDI optional
!I_DOC_SUSTITUIR type ZFI_E_DOC_SUST optional
!I_DOCS_SUSTI type ZFI_EDVAL_T optional "<--AGREGADO POR DEML 07.01.201
9 POR F-802
!I_STATUS type ZFI_E_STATUS optional
!I_BANK_V type CHAR3 optional
!I_VBELN type VBELN optional
!T_NUMTARJ type ZFI_TT_TARJETA_CFDI optional
exporting
!E_XML type XSTRING
!E_PDF type XSTRING
!E_MESSAGE type STRING
!E_UUID type ZFI_E_UUID
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI
!C_E_MSJ type STRING . "AGREGADO POR DEML 30.10.2018 POR F-799
methods CREATE_PDF
importing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI
!I_PRINT type CHAR1 optional
!T_PAGOS_PDF type ZFIFES_PAGOS_T "ZSDFES_PAGOS_T "<-- MODIFICADO POR DE
ML 10.01.2018 POR F-802
!I_XML type XSTRING
!T_DOCNUM type IDMX_CFDI_STAT_LOG_MX_T optional
!I_VBELN type VBELN_VF optional
!I_KUNNR type KUNNR optional
!I_BUKRS type BUKRS optional
!I_YEAR type GJAHR optional "AGREGADO POR DEML 26.10.2018 POR F-727
changing
!I_PDF type XSTRING
!I_NF type ZFI_T_PAGOS_CFDI-BELNR . "AGREGADO POR DEML 27.10.2018 POR F
-727
methods SPELL_AMOUNT
importing
!I_TOTAL type NETWR
!I_WAERS type WAERS default 'MXN'
exporting
!E_AMOUNT_TEXT type CHAR255 .
methods SEND_MAIL
importing
!I_MAIL type AD_SMTPADR
!I_ATTNAME type SO_OBJ_DES
!I_BUKRS type BUKRS
changing
!T_ATT_XML type SOLIX_TAB optional
!T_ATT_PDF type SOLIX_TAB optional .
methods READ_TVARVC
importing
!I_NAME type RVARI_VNAM
returning
value(R_VALUE) type RSELOPTION .
*** METODO CREADO POR DEML POR F-799 ***
methods ENVIO_COMPLMTO
importing
!LV_PDF_R type XSTRING
!LV_XML_R type XSTRING
!I_SOC type BUKRS
!I_YEAR type GJAHR
!I_NDOC type ZFI_T_PAGOS_CFDI-BELNR
!I_CLIE type KUNNR
changing
!E_MENSAJE type I .
methods GET_NOCERTIFICADO
importing
!I_BUKRS type BUKRS
changing
!I_XML_STRING type STRING
!I_NOCER type STRING
!I_CERTI type STRING
!I_SELLO type STRING .
PROTECTED SECTION.
private section.

types:
BEGIN OF ty_file,
line TYPE string,
END OF ty_file .
types:
BEGIN OF ty_itab,
line TYPE x LENGTH 255,
END OF ty_itab .

methods CREATE_CHAIN
importing
!I_PAGOS type ZFIFES_PAGOS "ZSDFES_PAGOS "<-- MODIFICADO POR DEML 10.01
.2018 POR F-802
exporting
!E_CHAIN type STRING .
methods GET_SIGN
importing
!I_BUKRS type BUKRS
!I_ERDAT type ERDAT
!I_ERZEIT type CPUTM
!I_CHAIN type STRING
exporting
!E_SELLO type STRING
!E_CERTIF type STRING
!E_NOCERTIF type STRING .
methods PROCESS_DATA_CANCEL
importing
!I_BKPF type BKPF
!I_KUNNR type KUNNR
!T_BSEG type BSEG_T
!T_DOCNUM type IDMX_CFDI_STAT_LOG_MX_T optional
!I_TIPO type CHAR1
!T_CHEQUE type ZFI_TT_CHEQUE_CFDI optional
!I_SPEI type STRING optional
!I_DOC_SUSTITUIR type ZFI_E_DOC_SUST optional
!I_STATUS type ZFI_E_STATUS optional
!I_BANK_V type CHAR3 optional
!T_MBANCO type ZFI_S_BANCO_CFDI optional
exporting
!E_XML type XSTRING
!E_MESSAGE type STRING
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI optional
!T_DATA_ADIC type ZFI_TT_PAGO_ADIC optional
!T_CREATE_TXT type ZSDFES_PAGO optional .
methods READ_TEXT
importing
!I_ID type THEAD-TDID
!I_NAME type THEAD-TDNAME
!I_OBJECT type THEAD-TDOBJECT
changing
!T_LINES type EFG_TAB_TLINE optional .
methods CREATE_XML
importing
!I_BKPF type BKPF optional
!I_CANCEL type FLAG optional
!E_XML type XSTRING
exporting
!E_XML_R type XSTRING
!E_MESSAGE type STRING
!E_UUID type ZFI_E_UUID
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI .
methods DOWNLOAD_XML
importing
!I_FILE type STRING .
methods PROCESS_DATA
importing
!I_BKPF type BKPF
!I_KUNNR type KUNNR
!I_VBELN type VBELN optional
!T_BSEG type BSEG_T
!T_BSEG_N type BSEG_T optional
!T_AUSZ3 type RE_T_EX_AUSZ3 optional
!T_DOCNUM type IDMX_CFDI_STAT_LOG_MX_T optional
!I_TIPO type CHAR1
!T_CHEQUE type ZFI_TT_CHEQUE_CFDI optional
!T_SPEI type STRING optional
!T_TRANSFER type ZFI_TT_TRANSFER_CFDI optional
!I_DOC_SUSTITUIR type ZFI_E_DOC_SUST optional
!I_DOCS_SUSTI type ZFI_EDVAL_T optional "<--AGREGADO POR DEML 07.01.201
9 POR F-802
!I_STATUS type ZFI_E_STATUS optional
!I_BANK_V type CHAR3 optional
!T_NUMTARJ type ZFI_TT_TARJETA_CFDI optional
exporting
!E_XML type XSTRING
!E_MESSAGE type STRING
!E_PAGOS type ZFIFES_PAGOS_T "zsdfes_pagos_t "<-- MODIFICADO POR DEML 1
0.01.2018 POR F-802
changing
!T_PARCIAL type ZFI_TT_PAGOS_CFDI optional
!T_DATA_ADIC type ZFI_TT_PAGO_ADIC optional .
methods GET_EMISOR_DOM
importing
!SOCIEDAD type BUKRS
exporting
!DOMICILIO type ZSDFES_EXPEMISOR .
methods GET_RECEPTOR_DOM
importing
!CLIENTE type KUNNR
exporting
!DOMICILIO type ZSDFES_EXPEMISOR .
methods FORMAT_QRCODE
importing
!I_SENDER_RFC type CHAR20
!I_RECEIVER_RFC type CHAR20
!I_AMOUNT type CHAR20
!I_UUID type CHAR36
!I_SELLO type STRING
exporting
!E_QRCODE type CHAR200 .
methods ARMA_FINANCIERAS
importing
!I_ID type THEAD-TDID
!I_NAME type THEAD-TDNAME
!I_OBJECT type THEAD-TDOBJECT
changing
!T_LINES type EFG_TAB_TLINE optional .
ENDCLASS.

CLASS ZCL_FI_CFDIXMLFE IMPLEMENTATION.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->ARMA_FINANCIERAS
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_ID TYPE THEAD-TDID
* | [--->] I_NAME TYPE THEAD-TDNAME
* | [--->] I_OBJECT TYPE THEAD-TDOBJECT
* | [<-->] T_LINES TYPE EFG_TAB_TLINE(opti
onal)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD ARMA_FINANCIERAS.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->ATTACH_FILE
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_FILE TYPE STRING
* | [--->] I_KEY TYPE SWO_TYPEID
* | [--->] I_TYPE TYPE SWO_OBJTYP
* | [--->] I_VALUE TYPE XSTRING(optional)
* | [--->] I_STRING TYPE STRING(optional)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD attach_file.
* Los documentos serán anexados a la factura.

DATA: lv_ext TYPE soodk-objtp,


lt_file TYPE solix_tab,
lt_file_string TYPE soli_tab,
ls_rel_doc TYPE borident,
ls_rolea TYPE borident,
ls_document_id TYPE sofmk,
ls_folder_id TYPE sofdk,
lt_objhead TYPE STANDARD TABLE OF soli,
lt_object_sol TYPE STANDARD TABLE OF solisti1,
lt_objcont_bin TYPE STANDARD TABLE OF solix,
lv_folder_id TYPE soobjinfi1-object_id,
lv_string TYPE string,
lv_xstring TYPE xstring,
ls_obj_data TYPE sodocchgi1,
ls_instid TYPE sofolenti1,
lv_doc_size TYPE i.

CLEAR: ls_rel_doc, lt_objcont_bin[], ls_rolea.

CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'


EXPORTING
region = 'B'
IMPORTING
folder_id = ls_folder_id
EXCEPTIONS
OTHERS = 1.

IF sy-subrc NE 0.
* Regresar código de retorno con error
ENDIF.

SPLIT i_file AT '.' INTO ls_obj_data-obj_descr lv_ext.


IF i_value IS NOT INITIAL.
cl_bcs_convert=>xstring_to_xtab( EXPORTING iv_xstring = i_value
IMPORTING et_xtab = lt_file ).
lv_doc_size = xstrlen( i_value ).

lt_objcont_bin = lt_file.
* ls_obj_data-doc_size = lines( lt_objcont_bin ) * '255'.
ls_obj_data-doc_size = lv_doc_size.

ENDIF.
IF i_string IS NOT INITIAL.
lv_string = i_string.
REPLACE ALL OCCURRENCES OF '#' IN lv_string WITH ''.

lt_file_string = cl_bcs_convert=>string_to_soli( lv_string ).

lt_object_sol = lt_file_string.

ENDIF.

TRANSLATE lv_ext TO UPPER CASE.

ls_obj_data-obj_langu = sy-langu.
lv_folder_id = ls_folder_id.

CALL FUNCTION 'SO_DOCUMENT_INSERT_API1'


EXPORTING
folder_id = lv_folder_id
document_data = ls_obj_data
document_type = lv_ext
IMPORTING
document_info = ls_instid
TABLES
object_content = lt_object_sol
contents_hex = lt_objcont_bin
object_header = lt_objhead
EXCEPTIONS
folder_not_exist = 1
document_type_not_exist = 2
operation_no_authorization = 3
parameter_error = 4
x_error = 5
enqueue_error = 6
OTHERS = 7.

IF sy-subrc NE 0.

*regresar código de retorno con error

ENDIF.
ls_rolea-objkey = i_key.
ls_rolea-objtype = i_type.

ls_rel_doc-objkey = ls_instid-doc_id.
ls_rel_doc-objtype = 'MESSAGE'.

CALL FUNCTION 'BINARY_RELATION_CREATE'


EXPORTING
obj_rolea = ls_rolea
obj_roleb = ls_rel_doc
relationtype = 'ATTA'
EXCEPTIONS
OTHERS = 1.

IF sy-subrc NE 0.

*regresar código de retorno con error


ENDIF.
* COMMIT WORK AND WAIT.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->CANCEL_PAGO
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BKPF TYPE BKPF(optional)
* | [--->] T_BSEG TYPE BSEG_T(optional)
* | [<---] E_XML TYPE XSTRING
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI(
optional)
* | [<-->] T_PARCIAL_R TYPE ZFI_TT_PAGOS_CFDI(o
ptional)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD cancel_pago.

* * Se deberá mandar el XML que se genero antes de timbrar pero importe 1


peso en el total del pago.
DATA: lv_kunnr TYPE kunnr,
lv_pagos TYPE xstring,
lv_message TYPE string,
lv_xml TYPE xstring,
lv_print TYPE char1,
lv_pdf TYPE xstring.

DATA: lt_create_txt TYPE zsdfes_pago,


lv_xblnr TYPE zfi_t_pagos_cfdi-xblnr,
lv_uuid TYPE zfi_t_pagos_cfdi-uuid_pago,
lv_paval TYPE t001z-paval,
lv_bukrs TYPE zfi_t_pagos_cfdi-bukrs,
lv_belnr TYPE zfi_t_pagos_cfdi-belnr,
lv_gjahr TYPE zfi_t_pagos_cfdi-gjahr.

DATA: lt_pagos_adic TYPE zfi_tt_pago_adic.


FIELD-SYMBOLS <fs_parcial> TYPE zfi_t_pagos_cfdi.

t_parcial_r[] = t_parcial[].
* Se debe ir a recuperar los datos de Cheque y SPEI si es que se tienen.

SELECT * INTO TABLE lt_pagos_adic FROM zfi_t_pago_adic


WHERE belnr = i_bkpf-stblg
AND bukrs = i_bkpf-bukrs
AND gjahr = i_bkpf-gjahr.

SELECT SINGLE belnr bukrs gjahr xblnr uuid_pago INTO ( lv_belnr, lv_bukrs,
lv_gjahr, lv_xblnr, lv_uuid )
FROM zfi_t_pagos_cfdi
WHERE belnr = i_bkpf-stblg
AND bukrs = i_bkpf-bukrs
AND gjahr = i_bkpf-gjahr.
IF sy-subrc EQ 0.
SELECT SINGLE paval FROM t001z INTO lv_paval
WHERE bukrs = lv_bukrs
AND party = 'MX_RFC'.
ENDIF.

*Obtener clave del cliente


READ TABLE t_parcial ASSIGNING <fs_parcial> INDEX 1.
IF sy-subrc EQ 0.
lv_kunnr = <fs_parcial>-kunnr.
ENDIF.

me->process_data_cancel( EXPORTING i_bkpf = i_bkpf


i_kunnr = lv_kunnr
i_tipo = '1'
t_bseg = t_bseg
IMPORTING e_xml = lv_pagos
CHANGING t_parcial = t_parcial
t_data_adic = lt_pagos_adic ).
* t_create_txt = lt_create_txt ).

me->create_xml( EXPORTING i_bkpf = i_bkpf


e_xml = lv_pagos
i_cancel = 'X'
IMPORTING e_xml_r = e_xml " lv_xml
CHANGING t_parcial = t_parcial ).

LOOP AT t_parcial ASSIGNING <fs_parcial>.


<fs_parcial>-docto_cancel = i_bkpf-belnr.
ENDLOOP.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->COMPLEMENTO_PAGOS
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BKPF TYPE BKPF
* | [--->] I_KUNNR TYPE KUNNR
* | [--->] T_BSEG TYPE BSEG_T
* | [--->] T_AUSZ3 TYPE RE_T_EX_AUSZ3(opti
onal)
* | [--->] I_TIPO TYPE CHAR1
* | [--->] T_CHEQUE TYPE ZFI_TT_CHEQUE_CFDI
(optional)
* | [--->] T_SPEI TYPE STRING(optional)
* | [--->] T_TRANSFER TYPE ZFI_TT_TRANSFER_CFD
I(optional)
* | [--->] I_DOC_SUSTITUIR TYPE ZFI_E_DOC_SUST(opti
onal)
* | [--->] I_DOCS_SUSTI TYPE ZFI_EDVAL_T(optiona
l)
* | [--->] I_STATUS TYPE ZFI_E_STATUS(optio
nal)
* | [--->] I_BANK_V TYPE CHAR3(optional)
* | [--->] I_VBELN TYPE VBELN(optional)
* | [--->] T_NUMTARJ TYPE ZFI_TT_TARJETA_CFD
I(optional)
* | [<---] E_XML TYPE XSTRING
* | [<---] E_PDF TYPE XSTRING
* | [<---] E_MESSAGE TYPE STRING
* | [<---] E_UUID TYPE ZFI_E_UUID
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI
* | [<-->] C_E_MSJ TYPE STRING
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD complemento_pagos.
TYPES: BEGIN OF ty_factura,
vbeln TYPE vbeln,
gjahr TYPE gjahr,
END OF ty_factura.

DATA: lv_pagos TYPE xstring, "XML DE PAGOS TIMBRADO


lv_message TYPE string,
lv_xml TYPE xstring,
lv_pdf TYPE xstring,
LV_DOC TYPE ZFI_T_PAGOS_CFDI-BELNR, "AGREGADO POR DEML 27.10.20
18
VMENSAJE TYPE I VALUE 4, "AGREGADO POR DEML 27.10.2018
lv_print TYPE c LENGTH 1,
lv_kunnr TYPE kunnr. "clave del cliente
DATA: z_aubel TYPE vbrp-aubel,
z_factura TYPE vbeln,
z_name TYPE thead-tdname,
z_awkey TYPE bkpf-awkey,
z_awtyp TYPE bkpf-awtyp,
z_fact_fi TYPE c.

DATA: ls_factura TYPE ty_factura,


lt_pagos TYPE STANDARD TABLE OF ZFIFES_PAGOS. "zsdfes_pagos. "<--
MODIFICADO POR DEML 10.01.2018 POR F-802
DATA: lt_factura TYPE STANDARD TABLE OF ty_factura,
lt_parciales TYPE STANDARD TABLE OF zfi_t_pagos_cfdi,
lt_pagos_adic TYPE zfi_tt_pago_adic,
lt_docnum TYPE STANDARD TABLE OF cfdi_stat_log_mx,
lt_bseg_n TYPE bseg_t,
lt_lines TYPE STANDARD TABLE OF tline,
lt_ausz3 TYPE re_t_ex_ausz3.

FIELD-SYMBOLS: <fs_bseg> TYPE bseg,


<fs_parcial> TYPE zfi_t_pagos_cfdi,
<fs_lines> TYPE tline.

CONSTANTS c_vbrk TYPE string VALUE 'VBRK'.

IF NOT i_bkpf-belnr IS INITIAL.


* Separar las NC de las facturas.
* lt_bseg_n[] = t_bseg[].
* DELETE lt_bseg_n WHERE rebzg IS INITIAL.
* DELETE lt_bseg_n WHERE shkzg NE 'H'.

*Recupera el valor de Pagos


lt_ausz3[] = t_ausz3[].

** Relacionar que factura pertenece a cada NC ya sea por número o UUID


* LOOP AT lt_bseg_n ASSIGNING <fs_bseg>.
* IF <fs_bseg>-vbeln IS INITIAL.
* SELECT SINGLE awtyp awkey INTO (z_awtyp, z_awkey) FROM bkpf
* WHERE bukrs = i_bkpf-bukrs
* AND belnr = <fs_bseg>-rebzg
* AND gjahr = <fs_bseg>-rebzj.
* IF z_awkey IS NOT INITIAL.
* <fs_bseg>-vbeln = z_awkey.
* ELSE.
* <fs_bseg>-vbeln = <fs_bseg>-rebzg.
* ENDIF.
* IF z_awtyp <> c_vbrk.
* z_fact_fi = abap_true.
* ENDIF.
* ELSE.
* CLEAR z_fact_fi.
* ENDIF.
* IF z_fact_fi IS INITIAL.
** Si es NC SD
** Recuperar pedido para buscar Factura SD
* SELECT SINGLE aubel INTO z_aubel FROM vbrp
* WHERE vbeln = <fs_bseg>-vbeln.
* IF sy-subrc EQ 0.
*
* SELECT SINGLE vbelv INTO z_factura FROM vbfa
* WHERE vbeln = z_aubel
* AND vbtyp_v = 'M'.
*
* IF z_factura IS NOT INITIAL.
* <fs_bseg>-vbel2 = z_factura.
* ELSE.
** Debemos buscar el UUID en el Pedido
* z_name = z_aubel.
* me->read_text( EXPORTING i_id = 'ZREU'
* i_name = z_name
* i_object = 'VBBK'
* CHANGING t_lines = lt_lines ).
* IF lt_lines[] IS INITIAL.
* <fs_bseg>-sgtxt = 'NO VALIDO'.
* ELSE.
* READ TABLE lt_lines ASSIGNING <fs_lines> INDEX 1.
* <fs_bseg>-sgtxt = <fs_lines>-tdline.
* ENDIF.
* ENDIF.
* ENDIF.
** Si es NC FI
* ELSE.
** Buscamos su factura
* SELECT SINGLE rebzg INTO z_factura FROM bseg
* WHERE bukrs = <fs_bseg>-bukrs
* AND belnr = <fs_bseg>-rebzg
* AND gjahr = <fs_bseg>-rebzj
* AND rebzg <> ''.
* IF z_factura IS NOT INITIAL.
* <fs_bseg>-vbel2 = z_factura.
* ELSE.
* z_name(4) = i_bkpf-bukrs.
* z_name+4(10) = <fs_bseg>-rebzg.
* z_name+14(4) = <fs_bseg>-rebzj.
*
* me->read_text( EXPORTING i_id = 'ZUUI'
* i_name = z_name
* i_object = 'BELEG'
* CHANGING t_lines = lt_lines ).
* IF lt_lines[] IS INITIAL.
* <fs_bseg>-sgtxt = 'NO VALIDO'.
* ELSE.
* READ TABLE lt_lines ASSIGNING <fs_lines> INDEX 1.
* <fs_bseg>-sgtxt = <fs_lines>-tdline.
* ENDIF.
* ENDIF.
* ENDIF.
* ENDLOOP.

* IF lt_bseg_n[] IS INITIAL.
lt_bseg_n[] = t_bseg[].
DELETE lt_bseg_n[] WHERE bschl NE '08'.

* ENDIF.
* Obtener que facturas se estan pagadando,
LOOP AT t_bseg ASSIGNING <fs_bseg> WHERE rebzg IS NOT INITIAL
AND shkzg EQ 'S'.
IF <fs_bseg>-vbeln IS NOT INITIAL.
ls_factura-vbeln = <fs_bseg>-vbeln.
ls_factura-gjahr = <fs_bseg>-rebzj.
lv_kunnr = <fs_bseg>-kunnr.
APPEND ls_factura TO lt_factura.
ELSE.
SELECT SINGLE awkey
FROM bkpf
INTO z_awkey
WHERE bukrs EQ i_bkpf-bukrs
AND belnr EQ <fs_bseg>-rebzg
AND gjahr EQ <fs_bseg>-rebzj.
IF z_awkey IS NOT INITIAL.
ls_factura-vbeln = z_awkey.
ls_factura-gjahr = <fs_bseg>-rebzj.
lv_kunnr = <fs_bseg>-kunnr.
APPEND ls_factura TO lt_factura.
ELSE.
ls_factura-vbeln = <fs_bseg>-rebzg.
ls_factura-gjahr = <fs_bseg>-rebzj.
lv_kunnr = <fs_bseg>-kunnr.
APPEND ls_factura TO lt_factura.
ENDIF.
ENDIF.
ENDLOOP.

IF lt_factura[] IS NOT INITIAL.


* Verificar si ya existe un pago la factura del cliente, pero timbrado
SELECT * INTO TABLE lt_parciales FROM zfi_t_pagos_cfdi
FOR ALL ENTRIES IN lt_factura
WHERE bukrs = i_bkpf-bukrs
AND kunnr = lv_kunnr
AND vbeln = lt_factura-vbeln
AND gjahrf = lt_factura-gjahr
AND status = 'A'.
ENDIF.

IF i_bkpf-stblg IS NOT INITIAL.


SELECT * INTO TABLE lt_pagos_adic FROM zfi_t_pago_adic
WHERE belnr = i_bkpf-stblg
AND bukrs = i_bkpf-bukrs
AND gjahr = i_bkpf-gjahr.
ELSE.
IF lt_parciales[] IS NOT INITIAL.
SELECT * INTO TABLE lt_pagos_adic FROM zfi_t_pago_adic
FOR ALL ENTRIES IN lt_parciales
WHERE belnr = lt_parciales-belnr
AND bukrs = lt_parciales-bukrs
AND gjahr = lt_parciales-gjahr
AND vbeln = lt_parciales-vbeln
AND gjahrf = lt_parciales-gjahrf.
ENDIF.
ENDIF.
* Siempre recuerar el IDOC de Timbrado
IF lt_factura[] IS NOT INITIAL.
SELECT * INTO TABLE lt_docnum FROM cfdi_stat_log_mx
FOR ALL ENTRIES IN lt_factura
WHERE bukrs EQ i_bkpf-bukrs
AND refdoc EQ lt_factura-vbeln
AND gjahr EQ lt_factura-gjahr
* AND reftyp EQ 'B'
AND ( status EQ 'A' OR
status EQ 'S' ).
ENDIF.

me->process_data( EXPORTING i_bkpf = i_bkpf


i_kunnr = i_kunnr
i_vbeln = i_vbeln
i_tipo = i_tipo
i_bank_v = i_bank_v
i_doc_sustituir = i_doc_sustituir
I_DOCS_SUSTI = I_DOCS_SUSTI[] "<-- AGRE
GADO POR DEML 07.01.2019 POR F-802
i_status = i_status
t_ausz3 = lt_ausz3
t_bseg_n = lt_bseg_n
t_bseg = t_bseg
t_docnum = lt_docnum
t_cheque = t_cheque
t_transfer = t_transfer
t_spei = t_spei
t_numtarj = t_numtarj
IMPORTING e_xml = lv_pagos
e_message = lv_message
e_pagos = lt_pagos
CHANGING t_parcial = lt_parciales
t_data_adic = lt_pagos_adic ).

e_message = lv_message.
DATA flag TYPE char2.
IMPORT flag = flag FROM MEMORY ID 'flag'.
IF flag eq 'VR' and i_tipo ne 1.
LOOP AT lt_parciales ASSIGNING <fs_parcial>.
IF <fs_parcial>-status IS INITIAL.
<fs_parcial>-status = 'I'.
ENDIF.
MODIFY zfi_t_pagos_cfdi FROM <fs_parcial>.
ENDLOOP.
else.
IF lv_message IS INITIAL.
me->create_xml( EXPORTING i_bkpf = i_bkpf
e_xml = lv_pagos
IMPORTING e_xml_r = lv_xml
e_uuid = e_uuid
CHANGING t_parcial = lt_parciales ).

t_parcial[] = lt_parciales[].
e_xml = lv_xml. "Regresa el XML timbrado
"Solo estatus que eran R, I o Vacío y ya timbraron
IF ( lv_xml IS NOT INITIAL AND i_status <> 'CR' ).
me->create_pdf( EXPORTING t_parcial = lt_parciales
i_print = lv_print
t_pagos_pdf = lt_pagos
i_xml = lv_xml
t_docnum = lt_docnum
i_vbeln = ls_factura-vbeln
i_kunnr = i_kunnr
i_bukrs = i_bkpf-bukrs
I_YEAR = LS_FACTURA-GJAHR "AGREGADO
POR DEML 26.10.2018 F-727
CHANGING i_pdf = lv_pdf
I_NF = LV_DOC ). "AGREGADO POR DEM
L 27.10.2018 F-799

IF lv_pdf IS NOT INITIAL.


e_pdf = lv_pdf.

"MANDA CORREO...
me->ENVIO_COMPLMTO( EXPORTING
LV_XML_R = E_XML
LV_PDF_R = E_PDF
I_CLIE = I_KUNNR
I_NDOC = LV_DOC
I_SOC = I_BKPF-BUKRS
I_YEAR = LS_FACTURA-GJAHR
CHANGING
E_MENSAJE = VMENSAJE ).
CASE VMENSAJE.
WHEN 0.
LOOP AT T_PARCIAL ASSIGNING <FS_PARCIAL>.
<FS_PARCIAL>-STATUSENV = '@08@'.
<FS_PARCIAL>-LOGENV = 'Envio correcto'.
ENDLOOP.
C_E_MSJ = 'Envio REP correcto'.
WHEN 1.
LOOP AT T_PARCIAL ASSIGNING <FS_PARCIAL>.
<FS_PARCIAL>-STATUSENV = '@0A@'.
<FS_PARCIAL>-LOGENV = 'Envio erroneo'.
ENDLOOP.
C_E_MSJ = 'Envio REP erroneo'.
WHEN 2.
LOOP AT T_PARCIAL ASSIGNING <FS_PARCIAL>.
<FS_PARCIAL>-STATUSENV = '@0A@'.
<FS_PARCIAL>-LOGENV = 'Sin correo'.
ENDLOOP.
C_E_MSJ = 'Envio REP erroneo'.
WHEN 3.
LOOP AT T_PARCIAL ASSIGNING <FS_PARCIAL>.
<FS_PARCIAL>-STATUSENV = '@0A@'.
<FS_PARCIAL>-LOGENV = 'Correo erroneo'.
ENDLOOP.
C_E_MSJ = 'Envio REP erroneo'.
ENDCASE.
ENDIF.
ENDIF.

ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->CONSTRUCTOR
* +--------------------------------------------------------------------------
-----------------------+
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD constructor.

DATA: lt_tvarvc TYPE STANDARD TABLE OF tvarvc,


ls_tvarvc TYPE tvarvc.

SELECT *
FROM tvarvc
INTO TABLE lt_tvarvc
WHERE name EQ 'ZCL_FI_CFDIXMLFE'.

LOOP AT lt_tvarvc INTO ls_tvarvc.

IF ls_tvarvc-low EQ 'PATH'.
lv_path = ls_tvarvc-high.

ENDIF.

ENDLOOP.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->CREATE_CHAIN
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_PAGOS TYPE ZFIFES_PAGOS
* | [<---] E_CHAIN TYPE STRING
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD create_chain.

CONSTANTS k_pipe TYPE c LENGTH 1 VALUE '|'.

DATA: z_cadena TYPE string,


z_string TYPE string,
ls_pagos TYPE zfifes_pagos. "zsdfes_pagos, "<-- MODIFICADO POR DEML
10.01.2018 POR F-802

FIELD-SYMBOLS: <fs_concepto> TYPE zsdfes_conceptos,


<fs_pago> TYPE zsdfes_pago,
<fs_doctorelacionado> TYPE zsdfes_doctorelacionado,
<fs_trasladop> TYPE zsdfes_trasladosp,
<fs_impuestosdr> TYPE zsdfes_impuestosdr,
<fs_rela> TYPE zfi_uuid_reltab_s. "<-- AGREGA
DO POR DEML 10.01.2019 POR F-802

ls_pagos = i_pagos.

CONCATENATE k_pipe k_pipe ls_pagos-version INTO z_cadena.


CONCATENATE z_cadena k_pipe ls_pagos-serie INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-folio INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-fecha INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-nocertificado INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-subtotal INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-moneda INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-total INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-tipodecomprobante INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-exportacion INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-lugarexpedicion INTO z_cadena.

IF ls_pagos-relacionados-tiporelacion IS NOT INITIAL.


CONCATENATE z_cadena k_pipe ls_pagos-relacionados-tiporelacion INTO z_ca
dena.
LOOP AT ls_pagos-relacionados-uuid ASSIGNING <fs_rela>.
CONDENSE <fs_rela>-uuid_r.
CONCATENATE z_cadena k_pipe <fs_rela>-uuid_r INTO z_cadena.
ENDLOOP.
ENDIF.

CONDENSE ls_pagos-emisor-rfc.
CONCATENATE z_cadena k_pipe ls_pagos-emisor-rfc INTO z_cadena.
CONDENSE z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-emisor-nombre INTO z_cadena.
CONDENSE ls_pagos-emisor-regimenfiscal.
CONCATENATE z_cadena k_pipe ls_pagos-emisor-regimenfiscal INTO z_cadena.

CONDENSE ls_pagos-receptor-rfc.
CONCATENATE z_cadena k_pipe ls_pagos-receptor-rfc INTO z_cadena.
CONDENSE ls_pagos-receptor-nombre.
CONCATENATE z_cadena k_pipe ls_pagos-receptor-nombre INTO z_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-receptor-domiciliofiscalreceptor INTO
z_cadena.
CONDENSE ls_pagos-receptor-usocfdi.
CONCATENATE z_cadena k_pipe ls_pagos-receptor-regimenfiscalreceptor INTO z
_cadena.
CONCATENATE z_cadena k_pipe ls_pagos-receptor-usocfdi INTO z_cadena.

LOOP AT ls_pagos-conceptos ASSIGNING <fs_concepto>.


CONDENSE <fs_concepto>-claveprodserv.
CONCATENATE z_cadena k_pipe <fs_concepto>-claveprodserv INTO z_cadena.
CONDENSE <fs_concepto>-cantidad.
CONCATENATE z_cadena k_pipe <fs_concepto>-cantidad INTO z_cadena.
CONDENSE <fs_concepto>-claveunidad.
CONCATENATE z_cadena k_pipe <fs_concepto>-claveunidad INTO z_cadena.
CONDENSE <fs_concepto>-descripcion.
CONCATENATE z_cadena k_pipe <fs_concepto>-descripcion INTO z_cadena.
CONDENSE <fs_concepto>-valorunitario.
CONCATENATE z_cadena k_pipe <fs_concepto>-valorunitario INTO z_cadena.
CONDENSE <fs_concepto>-importe.
CONCATENATE z_cadena k_pipe <fs_concepto>-importe INTO z_cadena.
CONDENSE <fs_concepto>-objetoimp.
CONCATENATE z_cadena k_pipe <fs_concepto>-objetoimp INTO z_cadena.
ENDLOOP.

CONDENSE ls_pagos-versionp.
CONCATENATE z_cadena k_pipe ls_pagos-versionp INTO z_cadena.

"CPB-INI Campos nuevos.


LOOP AT ls_pagos-pago ASSIGNING <fs_pago>.
CONDENSE <fs_pago>-tipocambiop.
CONDENSE <fs_pago>-fechapago.
CONDENSE <fs_pago>-totretenisr.
CONDENSE <fs_pago>-totretenieps.
CONDENSE <fs_pago>-tottrasbaseiva16.
CONDENSE <fs_pago>-tottrasimpuestoiva16.
CONDENSE <fs_pago>-tottrasbaseiva8.
CONDENSE <fs_pago>-tottrasimpuestoiva8.
CONDENSE <fs_pago>-tottrasbaseiva0.
CONDENSE <fs_pago>-tottrasimpuestoiva0.
CONDENSE <fs_pago>-tottrasbaseivaexento.
CONDENSE <fs_pago>-montototalpagos.

CONCATENATE z_cadena k_pipe <fs_pago>-tipocambiop INTO z_cadena.


IF <fs_pago>-totretenisr IS NOT INITIAL.
CONDENSE <fs_pago>-totretenisr.
CONCATENATE z_cadena k_pipe <fs_pago>-totretenisr INTO z_cadena.
ENDIF.

IF <fs_pago>-totretenieps IS NOT INITIAL.


CONDENSE <fs_pago>-totretenieps.
CONCATENATE z_cadena k_pipe <fs_pago>-totretenieps INTO z_cadena.
ENDIF.

IF <fs_pago>-tottrasbaseiva16 IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasbaseiva16.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasbaseiva16 INTO z_cadena.
ENDIF.

IF <fs_pago>-tottrasimpuestoiva16 IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasimpuestoiva16.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasimpuestoiva16 INTO z_cade
na.
ENDIF.

IF <fs_pago>-tottrasbaseiva8 IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasbaseiva8.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasbaseiva8 INTO z_cadena.
ENDIF.

IF <fs_pago>-tottrasimpuestoiva8 IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasimpuestoiva8.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasimpuestoiva8 INTO z_caden
a.
ENDIF.

IF <fs_pago>-tottrasbaseiva0 IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasbaseiva0.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasbaseiva0 INTO z_cadena.
ENDIF.

IF <fs_pago>-tottrasimpuestoiva0 IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasimpuestoiva0.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasimpuestoiva0 INTO z_caden
a.
ENDIF.

IF <fs_pago>-tottrasbaseivaexento IS NOT INITIAL.


CONDENSE <fs_pago>-tottrasbaseivaexento.
CONCATENATE z_cadena k_pipe <fs_pago>-tottrasbaseivaexento INTO z_cade
na.
ENDIF.

IF <fs_pago>-montototalpagos IS NOT INITIAL.


CONDENSE <fs_pago>-montototalpagos.
CONCATENATE z_cadena k_pipe <fs_pago>-montototalpagos INTO z_cadena.
ENDIF.

EXIT.
ENDLOOP.
"CPB-FIN Campos nuevos.

LOOP AT ls_pagos-pago ASSIGNING <fs_pago>.


CONDENSE <fs_pago>-fechapago.
CONCATENATE z_cadena k_pipe <fs_pago>-fechapago INTO z_cadena.
CONDENSE <fs_pago>-formadepagop.
CONCATENATE z_cadena k_pipe <fs_pago>-formadepagop INTO z_cadena.
CONDENSE <fs_pago>-monedap.
CONCATENATE z_cadena k_pipe <fs_pago>-monedap INTO z_cadena.

IF <fs_pago>-tipocambiop IS NOT INITIAL.


z_string = <fs_pago>-tipocambiop.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.
ENDIF.

z_string = <fs_pago>-monto.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.

IF <fs_pago>-numoperacion IS NOT INITIAL.


CONDENSE <fs_pago>-numoperacion.
CONCATENATE z_cadena k_pipe <fs_pago>-numoperacion INTO z_cadena.
ENDIF.

"***condicion diferente de MX
IF <fs_pago>-rfcemisorctaord IS NOT INITIAL.
CONDENSE <fs_pago>-rfcemisorctaord.
CONCATENATE z_cadena k_pipe <fs_pago>-rfcemisorctaord INTO z_cadena.
ENDIF.

IF <fs_pago>-nombancoordext IS NOT INITIAL.


CONDENSE <fs_pago>-nombancoordext.
CONCATENATE z_cadena k_pipe <fs_pago>-nombancoordext INTO z_cadena.
ENDIF.
"***
* Parametros no opciones para GCC
IF <fs_pago>-ctaordenante IS NOT INITIAL.
CONDENSE <fs_pago>-ctaordenante.
CONCATENATE z_cadena k_pipe <fs_pago>-ctaordenante INTO z_cadena.
ENDIF.

IF <fs_pago>-rfcemisorctaben IS NOT INITIAL.


CONDENSE <fs_pago>-rfcemisorctaben.
CONCATENATE z_cadena k_pipe <fs_pago>-rfcemisorctaben INTO z_cadena.
ENDIF.

IF <fs_pago>-ctabeneficiario IS NOT INITIAL.


CONDENSE <fs_pago>-ctabeneficiario.
CONCATENATE z_cadena k_pipe <fs_pago>-ctabeneficiario INTO z_cadena.
ENDIF.

IF <fs_pago>-tipocadpago IS NOT INITIAL.


CONDENSE <fs_pago>-tipocadpago.
CONCATENATE z_cadena k_pipe <fs_pago>-tipocadpago INTO z_cadena.
ENDIF.

IF <fs_pago>-certpago IS NOT INITIAL.


CONDENSE <fs_pago>-certpago.
CONCATENATE z_cadena k_pipe <fs_pago>-certpago INTO z_cadena.
ENDIF.

IF <fs_pago>-cadpago IS NOT INITIAL.


CONDENSE <fs_pago>-cadpago.
CONCATENATE z_cadena k_pipe <fs_pago>-cadpago INTO z_cadena.
ENDIF.

IF <fs_pago>-sellopago IS NOT INITIAL.


CONDENSE <fs_pago>-sellopago.
CONCATENATE z_cadena k_pipe <fs_pago>-sellopago INTO z_cadena.
ENDIF.

"*********************************************************
"** Documento relacionado **
"*********************************************************
LOOP AT <fs_pago>-doctorelacionado ASSIGNING <fs_doctorelacionado>.
CONDENSE <fs_doctorelacionado>-iddocumento.
CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-iddocumento INTO z_c
adena.

IF <fs_doctorelacionado>-serie IS NOT INITIAL.


CONDENSE <fs_doctorelacionado>-serie.
CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-serie INTO z_caden
a.
ENDIF.

IF <fs_doctorelacionado>-folio IS NOT INITIAL.


CONDENSE <fs_doctorelacionado>-folio.
CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-folio INTO z_caden
a.
ENDIF.

CONDENSE <fs_doctorelacionado>-monedadr.
CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-monedadr INTO z_cade
na.

IF <fs_doctorelacionado>-tipocambiodr IS NOT INITIAL.


z_string = <fs_doctorelacionado>-tipocambiodr.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.
ENDIF.

* CONDENSE <fs_doctorelacionado>-metododepagodr.
* CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-metododepagodr IN
TO z_cadena.

z_string = <fs_doctorelacionado>-numparcialidad.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.

z_string = <fs_doctorelacionado>-impsaldoant.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.

z_string = <fs_doctorelacionado>-imppagado.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.

z_string = <fs_doctorelacionado>-impsaldoinsoluto.
CONDENSE z_string.
CONCATENATE z_cadena k_pipe z_string INTO z_cadena.

"CPB-INI Campos nuevos.


IF <fs_doctorelacionado>-objetoimp IS NOT INITIAL.
CONDENSE <fs_doctorelacionado>-objetoimp.
CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-objetoimp INTO z_c
adena.
ENDIF.

IF <fs_doctorelacionado>-equivalenciadr IS NOT INITIAL.


CONDENSE <fs_doctorelacionado>-equivalenciadr.
CONCATENATE z_cadena k_pipe <fs_doctorelacionado>-equivalenciadr INT
O z_cadena.
ENDIF.
"CPB-FIN Campos nuevos.

LOOP AT <fs_doctorelacionado>-impuestosdr ASSIGNING <fs_impuestosdr>.


CONDENSE <fs_impuestosdr>-trasladosdr-basedr.
CONCATENATE z_cadena k_pipe <fs_impuestosdr>-trasladosdr-basedr INTO
z_cadena.
CONDENSE <fs_impuestosdr>-trasladosdr-impuestodr.
CONCATENATE z_cadena k_pipe <fs_impuestosdr>-trasladosdr-impuestodr
INTO z_cadena.
CONDENSE <fs_impuestosdr>-trasladosdr-tipofactordr.
CONCATENATE z_cadena k_pipe <fs_impuestosdr>-trasladosdr-
tipofactordr INTO z_cadena.
CONDENSE <fs_impuestosdr>-trasladosdr-tasaocuotadr.
CONCATENATE z_cadena k_pipe <fs_impuestosdr>-trasladosdr-
tasaocuotadr INTO z_cadena.
CONDENSE <fs_impuestosdr>-trasladosdr-importedr.
CONCATENATE z_cadena k_pipe <fs_impuestosdr>-trasladosdr-importedr
INTO z_cadena.
ENDLOOP.
ENDLOOP.

"*********************************************************
"** ImpuestosP TrasladosP **
"*********************************************************
LOOP AT <fs_pago>-trasladosp ASSIGNING <fs_trasladop>.
CONDENSE <fs_trasladop>-trasladop-basep.
CONCATENATE z_cadena k_pipe <fs_trasladop>-trasladop-basep INTO z_cade
na.
CONDENSE <fs_trasladop>-trasladop-impuestop.
CONCATENATE z_cadena k_pipe <fs_trasladop>-trasladop-impuestop INTO z_
cadena.
CONDENSE <fs_trasladop>-trasladop-tipofactorp.
CONCATENATE z_cadena k_pipe <fs_trasladop>-trasladop-tipofactorp INTO
z_cadena.
CONDENSE <fs_trasladop>-trasladop-tasaocuotap.
CONCATENATE z_cadena k_pipe <fs_trasladop>-trasladop-tasaocuotap INTO
z_cadena.
CONDENSE <fs_trasladop>-trasladop-importep.
CONCATENATE z_cadena k_pipe <fs_trasladop>-trasladop-importep INTO z_c
adena.
ENDLOOP.

ENDLOOP.
CONCATENATE z_cadena k_pipe k_pipe INTO z_cadena.

e_chain = z_cadena.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->CREATE_PDF
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI
* | [--->] I_PRINT TYPE CHAR1(optional)
* | [--->] T_PAGOS_PDF TYPE ZFIFES_PAGOS_T
* | [--->] I_XML TYPE XSTRING
* | [--->] T_DOCNUM TYPE IDMX_CFDI_STAT_LOG
_MX_T(optional)
* | [--->] I_VBELN TYPE VBELN_VF(optional)
* | [--->] I_KUNNR TYPE KUNNR(optional)
* | [--->] I_BUKRS TYPE BUKRS(optional)
* | [--->] I_YEAR TYPE GJAHR(optional)
* | [<-->] I_PDF TYPE XSTRING
* | [<-->] I_NF TYPE ZFI_T_PAGOS_CFDI-
BELNR
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD create_pdf.

DATA: ls_pagos TYPE zfifes_pagos, "zsdfes_pagos, "<-- MODIFICA


DO POR DEML 10.01.2018 POR F-802
ls_pago TYPE zsdfes_pago,
ls_doctorelacionado TYPE zsdfes_doctorelacionado,
ls_conceptos TYPE zsdfes_conceptos,
lt_emisor TYPE STANDARD TABLE OF adrc,
lt_receptor TYPE STANDARD TABLE OF adrc,
* lt_xml_info TYPE TABLE OF smum_xmltb,
lt_xml_info TYPE zfi_tt_abap_xmltb,
it_return TYPE STANDARD TABLE OF bapiret2,
str_test TYPE string.

DATA: lv_formadepagop TYPE string,


lv_is_sello TYPE string, " Sello para PDF
l_caden TYPE zedcadena, "string
l_caden2 TYPE zedcadena, "string
lt_edid4 TYPE STANDARD TABLE OF edid4,
ls_e1edkt1 TYPE e1edkt1,
ls_e1edkt2 TYPE e1edkt2.

* FIELD-SYMBOLS: <fs_xml_info> TYPE smum_xmltb,


FIELD-SYMBOLS: <fs_xml_info> TYPE zfi_st_smum_xmltb,
<fs_pagos> TYPE zfifes_pagos, "zsdfes_pagos, "<-- MODI
FICADO POR DEML 10.01.2018 POR F-802
<fs_rela> TYPE zfi_uuid_reltab_s, "<-- AGREGADO POR D
EML 10.01.2019 POR F-802
<fs_conceptos> TYPE zsdfes_conceptos,
<fs_pago> TYPE zsdfes_pago,
<fs_docr> TYPE zsdfes_doctorelacionado,
<fs_edid4> TYPE edid4,
<fs_aux> TYPE edid4,
<fs_docnum> TYPE cfdi_stat_log_mx.

CONSTANTS: c_sello TYPE char20 VALUE 'Sello',


c_cfdiver TYPE char20 VALUE 'Version',
c_cfdirel TYPE char20 VALUE 'TipoRelacion',
c_uuid TYPE char20 VALUE 'UUID',
c_fechasat TYPE char20 VALUE 'FechaTimbrado',
c_rfcpac TYPE char20 VALUE 'RfcProvCertif',
c_certsat TYPE char20 VALUE 'NoCertificadoSAT',
c_sellosat TYPE char20 VALUE 'SelloSAT'.

DATA: ls_control_parameters TYPE ssfctrlop,


ls_output_options TYPE ssfcompop,
ls_return TYPE ssfcrescl.
* is_stxbitmaps TYPE stxbitmaps.
*
DATA: lt_otfdata TYPE STANDARD TABLE OF itcoo,
it_lines TYPE STANDARD TABLE OF tline.
*
DATA: z_bin TYPE i,
lv_pdf_file TYPE xstring,
z_error TYPE char1.
*
DATA: lv_fm_name TYPE rs38l_fnam,
lv_expedido2 TYPE zsdfes_expemisor,
lv_factu_dom TYPE zsdfes_expemisor,
lv_iletra TYPE string,
lv_amount_text TYPE char255,
lv_monto TYPE p DECIMALS 2,
lv_moneda TYPE waers.

DATA: lv_qr TYPE char200,


lv_sender_rfc TYPE char20,
lv_receiver_rfc TYPE char20,
lv_amount TYPE char20,
lv_uuid TYPE char36,
lv_qr_s TYPE string,
lv_logo TYPE char30,
lv_company TYPE string,
lv_rfc TYPE string.

DATA: lv_cfdiver TYPE string,


lv_cfdirel TYPE string,
lv_uuidsat TYPE string,
lv_fechasat TYPE string,
lv_rfcpac TYPE string,
lv_certsat TYPE string,
lv_sellosat TYPE zedcadena.

* DATA: z_path TYPE string,


* z_full_path TYPE string,
* z_vbeln TYPE vbeln_vf,
* z_rfc TYPE char15,
* z_save_pdf TYPE c,
* z_flength TYPE i.
*
CONSTANTS: lc_formname TYPE tdsfname VALUE 'ZFI_FAC_COMPLEMENTO_VF_33',
lc_formname4 TYPE tdsfname VALUE 'ZFI_FAC_COMPLEMENTO_VF_40'.
* k_pdf TYPE c LENGTH 4 VALUE '.pdf',
* k_prefix TYPE c LENGTH 7 VALUE 'ZQRCODE',
* k_error TYPE c LENGTH 1 VALUE 'E',
* k_flag TYPE c LENGTH 1 VALUE 'X'.
*
* CONSTANTS: k_graphics TYPE thead-tdobject VALUE 'GRAPHICS',
* k_bmon TYPE thead-tdid VALUE 'BMON',
* k_bcol TYPE thead-tdid VALUE 'BCOL',
* k_bmap TYPE thead-tdid VALUE 'BMAP'.
*
*** INI FCR Ajustes impresión CFDI 4.0 INI ***
DATA: lt_edidd TYPE STANDARD TABLE OF edidd,
lt_cfdik11_tax TYPE STANDARD TABLE OF e1edmxcfdik11_tax,
lt_cfdik33_tax TYPE STANDARD TABLE OF e1edmxcfdik33_10_stax,
lt_tax_comple TYPE STANDARD TABLE OF zcfdi_tax_complemento,
lt_tax_complep TYPE STANDARD TABLE OF zcfdi_tax_complemento,
ls_cfdik11_tax TYPE e1edmxcfdik11_tax,
ls_cfdik33_tax TYPE e1edmxcfdik33_10_stax,
ls_tax_comple TYPE zcfdi_tax_complemento.
*** FIN FCR Ajustes impresión CFDI 4.0 FIN ***
*
CLEAR: lv_pdf_file.

READ TABLE t_pagos_pdf ASSIGNING <fs_pagos> INDEX 1.


IF sy-subrc EQ 0.
ls_pagos-version = <fs_pagos>-version.
ls_pagos-versionp = <fs_pagos>-versionp.
ls_pagos-fecha = <fs_pagos>-fecha.
ls_pagos-serie = <fs_pagos>-serie.
ls_pagos-folio = <fs_pagos>-folio.
ls_pagos-sello = <fs_pagos>-sello.
ls_pagos-tipodecomprobante = <fs_pagos>-tipodecomprobante.
ls_pagos-nocertificado = <fs_pagos>-nocertificado.
ls_pagos-certificado = <fs_pagos>-certificado.
ls_pagos-subtotal = <fs_pagos>-subtotal.
ls_pagos-moneda = <fs_pagos>-moneda.
ls_pagos-total = <fs_pagos>-total.
ls_pagos-lugarexpedicion = <fs_pagos>-lugarexpedicion.

LOOP AT <fs_pagos>-conceptos ASSIGNING <fs_conceptos>.


ls_conceptos-claveprodserv = <fs_conceptos>-claveprodserv.
ls_conceptos-noidentificacion = <fs_conceptos>-noidentificacion.
ls_conceptos-cantidad = <fs_conceptos>-cantidad.
ls_conceptos-unidad = <fs_conceptos>-unidad.
ls_conceptos-claveunidad = <fs_conceptos>-claveunidad.
ls_conceptos-descripcion = <fs_conceptos>-descripcion.
ls_conceptos-valorunitario = <fs_conceptos>-valorunitario.
ls_conceptos-importe = <fs_conceptos>-importe.
ls_conceptos-descuentos = <fs_conceptos>-descuentos.
ls_conceptos-numeropedimento = <fs_conceptos>-numeropedimento.
ls_conceptos-cuentapredial = <fs_conceptos>-cuentapredial.
ls_conceptos-itemnum = <fs_conceptos>-itemnum.
ENDLOOP.
APPEND ls_conceptos TO ls_pagos-conceptos[].

LOOP AT <fs_pagos>-pago ASSIGNING <fs_pago>.


ls_pago-fechapago = <fs_pago>-fechapago.
ls_pago-formadepagop = <fs_pago>-formadepagop.
ls_pago-monedap = <fs_pago>-monedap.
ls_pago-tipocambiop = <fs_pago>-tipocambiop.
ls_pago-monto = <fs_pago>-monto.
* CALL FUNCTION 'HRCM_AMOUNT_TO_STRING_CONVERT'
* EXPORTING
* betrg = p_betrg
** WAERS = ' '
* new_decimal_separator = '.'
* new_thousands_separator = ','
* IMPORTING
* string = strnew.

ls_pago-numoperacion = <fs_pago>-numoperacion.
ls_pago-rfcemisorctaord = <fs_pago>-rfcemisorctaord.
ls_pago-nombancoordext = <fs_pago>-nombancoordext.
ls_pago-ctaordenante = <fs_pago>-ctaordenante.
ls_pago-rfcemisorctaben = <fs_pago>-rfcemisorctaben.
ls_pago-ctabeneficiario = <fs_pago>-ctabeneficiario.
ls_pago-tipocadpago = <fs_pago>-tipocadpago.
ls_pago-certpago = <fs_pago>-certpago.
ls_pago-cadpago = <fs_pago>-cadpago.
ls_pago-sellopago = <fs_pago>-sellopago.

lv_formadepagop = <fs_pago>-formadepagop.
LOOP AT <fs_pago>-doctorelacionado ASSIGNING <fs_docr>.
ls_doctorelacionado-iddocumento = <fs_docr>-iddocumento.
TRANSLATE ls_doctorelacionado-iddocumento TO UPPER CASE.
ls_doctorelacionado-serie = <fs_docr>-serie.
ls_doctorelacionado-folio = <fs_docr>-folio.
ls_doctorelacionado-monedadr = <fs_docr>-monedadr.
ls_doctorelacionado-tipocambiodr = <fs_docr>-tipocambiodr.
ls_doctorelacionado-metododepagodr = <fs_docr>-metododepagodr.
ls_doctorelacionado-numparcialidad = <fs_docr>-numparcialidad.
ls_doctorelacionado-impsaldoant = <fs_docr>-impsaldoant.
ls_doctorelacionado-imppagado = <fs_docr>-imppagado.
ls_doctorelacionado-impsaldoinsoluto = <fs_docr>-impsaldoinsoluto.
APPEND ls_doctorelacionado TO ls_pago-doctorelacionado[].
CLEAR ls_doctorelacionado.
*
*** INI FCR Ajustes impresión CFDI 4.0 INI ***
LOOP AT <fs_docr>-impuestosdr ASSIGNING FIELD-
SYMBOL(<fs_trasladosdr>).
ls_tax_comple-folio = <fs_docr>-folio.
ls_tax_comple-basedr = <fs_trasladosdr>-trasladosdr-basedr.
ls_tax_comple-impuestodr = <fs_trasladosdr>-trasladosdr-
impuestodr.
ls_tax_comple-tipofactordr = <fs_trasladosdr>-trasladosdr-
tipofactordr.
ls_tax_comple-tasaocuotadr = <fs_trasladosdr>-trasladosdr-
tasaocuotadr.
ls_tax_comple-importedr = <fs_trasladosdr>-trasladosdr-
importedr.

CONDENSE: ls_tax_comple-basedr,
ls_tax_comple-impuestodr,
ls_tax_comple-tipofactordr,
ls_tax_comple-tasaocuotadr,
ls_tax_comple-importedr.
APPEND ls_tax_comple TO lt_tax_comple.
ENDLOOP.
*** FIN FCR Ajustes impresión CFDI 4.0 FIN ***
*
ENDLOOP.
*
*** INI FCR Ajustes impresión CFDI 4.0 INI ***
LOOP AT <fs_pago>-trasladosp[] ASSIGNING FIELD-
SYMBOL(<fs_trasladosp>).
ls_tax_comple-basedr = <fs_trasladosp>-trasladop-basep.
ls_tax_comple-impuestodr = <fs_trasladosp>-trasladop-impuestop.
ls_tax_comple-tipofactordr = <fs_trasladosp>-trasladop-tipofactorp.
ls_tax_comple-tasaocuotadr = <fs_trasladosp>-trasladop-tasaocuotap.
ls_tax_comple-importedr = <fs_trasladosp>-trasladop-importep.
CONDENSE: ls_tax_comple-basedr,
ls_tax_comple-impuestodr,
ls_tax_comple-tipofactordr,
ls_tax_comple-tasaocuotadr,
ls_tax_comple-importedr.
APPEND ls_tax_comple TO lt_tax_complep.
ENDLOOP.
*** FIN FCR Ajustes impresión CFDI 4.0 FIN ***
*
ENDLOOP.
APPEND ls_pago TO ls_pagos-pago[].
*
*** INI FCR Ajustes impresión CFDI 4.0 INI ***
SELECT SINGLE pstlz
FROM kna1
INTO @DATA(lv_pstlz)
WHERE kunnr EQ @i_kunnr.
*** FIN FCR Ajustes impresión CFDI 4.0 FIN ***
*
**********************************************************************
ls_pagos-relacionados-tiporelacion = <fs_pagos>-relacionados-
tiporelacion.
**********************************************************************
*** SEGMENTO MODIFICADO POR DEML 10.01.2019 POR F-802 ***
*** CÓDIGO PREVIO COMENTADO CON 3 '*' ***
**********************************************************************
*** ls_pagos-relacionados-uuid = <fs_pagos>-relacionados-uuid.
LOOP AT <fs_pagos>-relacionados-uuid ASSIGNING <fs_rela>.
APPEND <fs_rela>-uuid_r TO ls_pagos-relacionados-uuid[].
ENDLOOP.
**********************************************************************

ls_pagos-emisor-rfc = <fs_pagos>-emisor-rfc.
ls_pagos-emisor-nombre = <fs_pagos>-emisor-nombre.
ls_pagos-emisor-regimenfiscal = <fs_pagos>-emisor-regimenfiscal.

ls_pagos-receptor-rfc = <fs_pagos>-receptor-rfc.
ls_pagos-receptor-nombre = <fs_pagos>-receptor-nombre.
ls_pagos-receptor-usocfdi = <fs_pagos>-receptor-usocfdi.
ls_pagos-receptor-numregidtrib = <fs_pagos>-receptor-numregidtrib.
ls_pagos-receptor-residenciafiscal = <fs_pagos>-receptor-
residenciafiscal.

lv_company = ls_pagos-emisor-nombre.

ENDIF.

* CALL FUNCTION 'SMUM_XML_PARSE'


* EXPORTING
* xml_input = i_xml
* TABLES
* xml_table = lt_xml_info
* return = it_return
* EXCEPTIONS
* OTHERS = 0.

CALL FUNCTION 'ZFI_FM_SMUM_XML_PARSE'


EXPORTING
xml_input = i_xml
TABLES
xml_table = lt_xml_info
return = it_return.

READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_sello.


IF sy-subrc = 0.
l_caden = <fs_xml_info>-cvalue.
lv_is_sello = <fs_xml_info>-cvalue.
ENDIF.
* READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_cfdi
ver.
* IF sy-subrc = 0.
lv_cfdiver = '1.1'.
* ENDIF.

** READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_cfd


irel.
** CLEAR lv_cfdirel.
** IF sy-subrc = 0.
** lv_cfdirel = <fs_xml_info>-cvalue.
** ENDIF.
** "Evaluar lv_cfdirel y obtener el ultimo valor UUID

* READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_uuid


.
* IF sy-subrc = 0.
* lv_uuid = <fs_xml_info>-cvalue.
* TRANSLATE lv_uuid TO UPPER CASE.
* ENDIF.
LOOP AT lt_xml_info ASSIGNING <fs_xml_info> WHERE cname = c_uuid.
lv_uuid = <fs_xml_info>-cvalue.
TRANSLATE lv_uuid TO UPPER CASE.
ENDLOOP.

READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_fechasat


.
IF sy-subrc = 0.
lv_fechasat = <fs_xml_info>-cvalue.
ENDIF.
READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_rfcpac.
IF sy-subrc = 0.
lv_rfcpac = <fs_xml_info>-cvalue.
ENDIF.
READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_certsat.
IF sy-subrc = 0.
lv_certsat = <fs_xml_info>-cvalue.
ENDIF.
READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_sellosat
.
IF sy-subrc = 0.
lv_sellosat = <fs_xml_info>-cvalue.
ENDIF.

IF l_caden IS NOT INITIAL.


l_caden2 = l_caden+255(255).
l_caden = l_caden(255).
ENDIF.

get_emisor_dom( EXPORTING sociedad = i_bukrs


IMPORTING domicilio = lv_expedido2 ).

get_receptor_dom( EXPORTING cliente = i_kunnr


IMPORTING domicilio = lv_factu_dom ).
* QR
lv_sender_rfc = ls_pagos-emisor-rfc.
lv_receiver_rfc = ls_pagos-receptor-rfc.
lv_amount = ls_pago-monto.
* lv_sello = ls_pagos-sello.

format_qrcode( EXPORTING i_sender_rfc = lv_sender_rfc


i_receiver_rfc = lv_receiver_rfc
i_amount = lv_amount
i_uuid = lv_uuid
i_sello = lv_is_sello
IMPORTING e_qrcode = lv_qr ).
lv_qr_s = lv_qr.

* Importe en Letra
lv_monto = ls_pago-monto.
lv_moneda = ls_pago-monedap.
spell_amount( EXPORTING i_total = lv_monto
i_waers = lv_moneda
IMPORTING e_amount_text = lv_amount_text ).

lv_iletra = lv_amount_text.

CONCATENATE 'ZLOGO_' i_bukrs INTO lv_logo.


lv_rfc = lv_sender_rfc.
lv_uuidsat = lv_uuid.

* Inicializar el formulario.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lc_formname4
IMPORTING
fm_name = lv_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.

* Si hubo errores, desplegar mensaje y terminar, si se continua se


* produce un error de run time.
IF sy-subrc NE 0. "CHECA ERRORES EN LAS FUNCIONES
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

* Smartform Parameters -----


ls_output_options-tdcopies = '001'.
ls_output_options-tddest = 'LP01'.
ls_output_options-bcs_langu = sy-langu.
ls_output_options-tdimmed = abap_true.
ls_output_options-tdnewid = abap_true.
ls_output_options-tddelete = abap_true.
ls_output_options-tdprinter = 'SAPWIN'.

ls_control_parameters-preview = ' '.


ls_control_parameters-no_dialog = abap_true.
ls_control_parameters-device = 'PRINTER'.
ls_control_parameters-getotf = abap_true.

CALL FUNCTION lv_fm_name


EXPORTING
control_parameters = ls_control_parameters
output_options = ls_output_options
is_expedido2 = lv_expedido2
is_facturado2 = lv_factu_dom
is_direccion = lv_expedido2
is_qr = lv_qr_s
is_data = ls_pagos
i_iletra = lv_iletra
i_sellodig = l_caden
i_sellodig2 = l_caden2
i_cfdivers = lv_cfdiver
i_uuidsat = lv_uuidsat
i_fechaemison = lv_fechasat
i_rfcpac = lv_rfcpac
i_certsat = lv_certsat
i_sellosat = lv_sellosat
i_logo1 = lv_logo
i_cmpny_name = lv_company
i_rfc = lv_rfc
i_regimen = i_kunnr
i_cp = lv_pstlz
IMPORTING
job_output_info = ls_return
TABLES
t_tax_comple = lt_tax_comple
t_tax_complep = lt_tax_complep
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
* Error handling
IF sy-subrc <> 0.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
* Recupera el Smartforms en el formato OTF
lt_otfdata[] = ls_return-otfdata[].
ENDIF.

CLEAR: z_bin.

" Output File


CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF'
max_linewidth = 132
IMPORTING
bin_filesize = z_bin
bin_file = lv_pdf_file
TABLES
otf = lt_otfdata
lines = it_lines
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
err_bad_otf = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

i_pdf = lv_pdf_file.

" Guardar XML Timbrado


"* ----------------------------------------------------
DATA: gv_full_path TYPE string,
doc_name TYPE string,
lv_ruta_xml TYPE tvarv_low,
lv_ruta_server TYPE string.

CONSTANTS: lc_ruta TYPE rvari_vnam VALUE 'ZCFDI_RUTA_XML_CC'.

" Save PDF on Application Server


* SELECT SINGLE low
* INTO lv_ruta_xml
* FROM tvarvc
* WHERE name EQ lc_ruta.

lv_ruta_server = '/usr/sap/InterfaceSAP/XML_CFDI/CC_PAGO/Resultado_XML_CC/
'.

* CONCATENATE lv_ruta_xml i_bukrs ls_pagos-folio '.pdf' INTO gv_full_pa


th.
CONCATENATE i_bukrs ls_pagos-folio i_year INTO doc_name.
CONCATENATE lv_ruta_server doc_name '.pdf' INTO gv_full_path. "MODIFICACI
ÓN HECHA POR DEML 26.10.2018 F727
i_nf = ls_pagos-folio.

DELETE DATASET gv_full_path.

OPEN DATASET gv_full_path IN BINARY MODE FOR OUTPUT.


IF sy-subrc EQ 0.
TRANSFER lv_pdf_file TO gv_full_path.
CLOSE DATASET gv_full_path.
ENDIF.
*

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->CREATE_TXT_CANCEL
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_XBLNR TYPE XBLNR
* | [--->] I_PAVAL TYPE T001Z-PAVAL
* | [--->] I_UUID TYPE ZFI_T_PAGOS_CFDI-
UUID_PAGO
* | [--->] I_BELNR TYPE BELNR_D
* | [--->] I_BUKRS TYPE BUKRS
* | [--->] I_GJAHR TYPE GJAHR
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD create_txt_cancel.
* TYPES: BEGIN OF ty_line,
* line TYPE c LENGTH 3000,
* END OF ty_line.
*
* DATA: lt_line TYPE STANDARD TABLE OF ty_line,
* lv_length TYPE i.
*
* DATA: lv_xstring TYPE xstring,
* lv_string TYPE string,
* lv_serie TYPE string,
* lv_folio TYPE string.
*
* DATA: ls_input TYPE zcfdi_cancelar_documento_soap1,
* ls_output TYPE zcfdi_cancelar_documento_soap,
* lo_salv_msg TYPE REF TO cx_salv_msg,
* lo_msg TYPE REF TO cx_ai_system_fault.
*
* CONSTANTS c_serie TYPE string VALUE 'DZ'.
*
* SPLIT i_xblnr AT '-' INTO lv_serie lv_folio.
*
* CONCATENATE i_paval '|'
* c_serie '|'
* i_belnr '|'
* i_uuid
* INTO lv_string.
*
* APPEND lv_string TO lt_line.
*
**---BAJA EL TXT A RUTA LOCAL
* cl_gui_frontend_services=>gui_download( EXPORTING filename
= 'C:\DocumentosPac\Pago_Cancel.txt'
* filetype
= 'ASC'
* IMPORTING filelength
= lv_length
* CHANGING data_tab
= lt_line
* EXCEPTIONS file_write_error
= 1
* no_batch
= 2
* gui_refuse_fil
etransfer = 3
* invalid_type
= 4
* no_authority
= 5
* unknown_error
= 6
* header_not_all
owed = 7
* separator_not_
allowed = 8
* filesize_not_a
llowed = 9
* header_too_lon
g = 10
* dp_error_creat
e = 11
* dp_error_send
= 12
* dp_error_write
= 13
* unknown_dp_err
or = 14
* access_denied
= 15
* dp_out_of_memo
ry = 16
* disk_full
= 17
* dp_timeout
= 18
* file_not_found
= 19
* dataprovider_e
xception = 20
* control_flush_
error = 21
* not_supported_
by_gui = 22
* error_no_gui
= 23
* OTHERS
= 24 ).
*
*
**Convierte string a Xstring
* CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
* EXPORTING
* text = lv_string
* mimetype = 'SPACE'
* IMPORTING
* buffer = lv_xstring
* EXCEPTIONS
* failed = 1
* OTHERS = 2.
*
* CLEAR lv_string.
**Convierte Xstring a Base64
* CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
* EXPORTING
* input = lv_xstring
* IMPORTING
* output = lv_string
* EXCEPTIONS
* OTHERS = 1.
*
***********************************************************************Consum
o de WS
* ls_input-no_documento_sap = i_belnr.
* ls_input-sociedad = i_bukrs.
* ls_input-ejercicio = i_gjahr.
* ls_input-tipo_documento = 'P'.
* ls_input-archivo_txt = lv_string.
*
* TRY.
* DATA(lo_proxy) = NEW zcfdi_co_default_soap( 'ZCFDI_PUERTA' ).
*
* CATCH cx_salv_msg INTO lo_salv_msg.
* WRITE lo_salv_msg->get_longtext( ).
* ENDTRY.
*
* TRY.
* lo_proxy->cancelar_documento( EXPORTING input = ls_input
* IMPORTING output = ls_output ).
*
* CATCH cx_ai_system_fault INTO lo_msg.
* WRITE lo_msg->get_longtext( ).
* ENDTRY.
*
* IF ls_output-cancelar_documento_result IS NOT INITIAL. "Si existe una r
espuesta genera el Log de errores y acutualiza la tabla Z con R en Status
*****************************************************************************
*****************************
**** CATCHS
* DATA: zcl_sys_exception TYPE REF TO cx_ai_system_fault,
* zcl_app_exception TYPE REF TO cx_ai_application_fault,
* zcl_cx_root TYPE REF TO cx_root,
* z_mensaje TYPE string.
*
******LOG
* DATA: wa_log TYPE bal_s_log,
* wa_log_handle TYPE balloghndl,
* lt_log_handle TYPE bal_t_logh,
* wa_msg TYPE bal_s_msg,
* z_msgid TYPE sy-msgid VALUE 'SY',
* z_msgno TYPE sy-msgno VALUE '002',
* z_log TYPE char50,
* z_long TYPE i,
* z_char TYPE i,
* z_cont TYPE n LENGTH 1,
* z_campo TYPE c LENGTH 20,
* z_new TYPE string,
* z_message TYPE string.
*
**** Variables
* DATA: lv_doc_type TYPE char1.
*
* FIELD-SYMBOLS: <fs_parcial> TYPE zfi_t_pagos_cfdi.
*
* LOOP AT t_parcial ASSIGNING <fs_parcial>.
* <fs_parcial>-status = 'CR'.
* ENDLOOP.
* IF sy-subrc EQ 0.
** Define el Heaer del Log
* CONCATENATE 'Log CANCEL PAYMENT CDFI:' <fs_parcial>-bukrs <fs_parc
ial>-belnr <fs_parcial>-gjahr
* INTO wa_log-extnumber SEPARATED BY space.
* wa_log-aluser = sy-uname.
* wa_log-alprog = sy-repid.
* wa_log-altcode = sy-tcode.
* wa_log-object = 'Z_IDMX'.
* wa_log-subobject = 'Z_IDMX_SUB'.
* wa_log-aldate = sy-datlo.
* wa_log-altime = sy-timlo.
*
**Crea Log
* CLEAR: wa_log_handle.
*
* me->save_log( EXPORTING i_create = abap_true
* i_s_log = wa_log
* CHANGING c_log_handle = wa_log_handle ).
*
* " ----------------------------------------------------------------
* " Send TXT File to TI Web Service
* " ----------------------------------------------------------------
* TRY.
*
* CATCH cx_ai_system_fault INTO zcl_sys_exception.
* z_mensaje = zcl_sys_exception->get_text( ).
*
**Build Error message
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error WS Payment Consumer:' <fs_parcial>-bukrs <f
s_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
* lv_doc_type = 'C'.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
* ENDTRY.
* TRY .
********* Exception System Fault
************************************************************
* CATCH cx_ai_system_fault INTO zcl_sys_exception.
* z_mensaje = zcl_sys_exception->get_text( ).
*
**Build Error message
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error System Payment Fault:' <fs_parcial>-bukrs <
fs_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
* lv_doc_type = 'C'.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
********* Exception Application Fault
************************************************************
* CATCH cx_ai_application_fault INTO zcl_app_exception.
* z_mensaje = zcl_app_exception->get_text( ).
*
**Build Error message
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error Application Payment Fault:' <fs_parcial>-
bukrs <fs_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
* lv_doc_type = 'C'.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
********* SOAP FAULT
************************************************************
* CATCH cx_root INTO zcl_cx_root. "cx_ai_so
ap_fault
* z_mensaje = zcl_cx_root->get_text( ).
*
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error Stamp Payment Document:' <fs_parcial>-bukrs
<fs_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
**Build Error message
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
* ENDTRY.
* ENDIF.
* ELSE.
* LOOP AT t_parcial ASSIGNING FIELD-SYMBOL(<fs_parcial_e>).
**Actuliza la tabla t_parcial
* <fs_parcial_e>-status = 'CE'. "Enviado
* ENDLOOP.
* ENDIF.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->CREATE_XML
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BKPF TYPE BKPF(optional)
* | [--->] I_CANCEL TYPE FLAG(optional)
* | [--->] E_XML TYPE XSTRING
* | [<---] E_XML_R TYPE XSTRING
* | [<---] E_MESSAGE TYPE STRING
* | [<---] E_UUID TYPE ZFI_E_UUID
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD create_xml.
** Se mandara a llamar el WS para timbrar el PAGO

*
*** Proxy
* DATA: zcl_proxy TYPE REF TO ZCFDI_CO_TIMBRADO_SERVICE, " --> WS de Factur
acion
* is_input TYPE ZCFDI_TIMBRADO1, "MOD_ALSA
* is_output TYPE ZCFDI_TIMBRADO_RESPONSE1. "MOD_ALSAZCFDI_TIMBRADO_RE
SPONSE1
*
**** CATCHS
* DATA: zcl_sys_exception TYPE REF TO cx_ai_system_fault,
* zcl_app_exception TYPE REF TO cx_ai_application_fault,
* zcl_cx_root TYPE REF TO cx_root,
* z_mensaje TYPE string.
********
* DATA: ls_user TYPE zcfdicanceluname. "parametros de entrada WS
*
******LOG
DATA: wa_log TYPE bal_s_log,
wa_log_handle TYPE balloghndl,
* lt_log_handle TYPE bal_t_logh,
wa_msg TYPE bal_s_msg,
z_msgid TYPE sy-msgid VALUE 'SY',
z_msgno TYPE sy-msgno VALUE '002',
z_log TYPE char50,
lv_ruta_server TYPE string,
full_rute TYPE string,
lv_timx TYPE char1 VALUE ' '. " SI TIMBRA = x
* z_long TYPE i,
* z_char TYPE i,
* z_cont TYPE n LENGTH 1,
* z_campo TYPE c LENGTH 20,
* z_new TYPE string,
* z_message TYPE string.
*
**** Variables
* DATA: lv_logical_port(60) TYPE c,
* lv_cp TYPE cpcodepage,
* lv_xml_string TYPE string,
* lv_sello_pac TYPE c LENGTH 1,
* lv_rfc_pac TYPE c LENGTH 15,
* lv_rfc_name TYPE c LENGTH 50,
* lv_pac_test TYPE tvarv_val,
* lv_doc_type TYPE char1.
*
DATA: lv_line TYPE string.

*-----------------------------------------------*
DATA: lt_string TYPE STANDARD TABLE OF string,
ls_string TYPE string.

DATA: lv_filename TYPE string,


c_xml TYPE char4 VALUE '.xml'.
*-----------------------------------------------*
DATA: flag TYPE char2.
IMPORT flag = flag FROM MEMORY ID 'flag'.
FIELD-SYMBOLS: <fs_parcial> TYPE zfi_t_pagos_cfdi.
* <fs_ws> TYPE tvarvc,
* <fs_campo> TYPE any.
*
* CONSTANTS: c_uuid TYPE char20 VALUE 'UUID',
* c_textlen TYPE i VALUE 70,
* c_pac_test TYPE string VALUE 'IDMX_TEST_PAC',
* c_download TYPE string VALUE 'IDMX_DOWNLOAD',
* c_ws_port TYPE string VALUE 'IDMX_PUERTA',
* c_ws_user TYPE string VALUE 'IDMX_WS_USER'.
*
READ TABLE t_parcial ASSIGNING <fs_parcial> INDEX 1.
IF sy-subrc EQ 0.
* Define el Heaer del Log
CONCATENATE 'Log STAMP PAYMENT CDFI:' <fs_parcial>-bukrs <fs_parcial>-
belnr <fs_parcial>-gjahr
INTO wa_log-extnumber SEPARATED BY space.
wa_log-aluser = sy-uname.
wa_log-alprog = sy-repid.
wa_log-altcode = sy-tcode.
wa_log-object = 'Z_IDMX'.
wa_log-subobject = 'Z_IDMX_SUB'.
wa_log-aldate = sy-datlo.
wa_log-altime = sy-timlo.

*Crea Log
CLEAR: wa_log_handle.

me->save_log( EXPORTING i_create = abap_true


i_s_log = wa_log
CHANGING c_log_handle = wa_log_handle ).
*
*
* " Logical Port Variant
* SELECT SINGLE high INTO lv_logical_port FROM tvarvc
* WHERE name EQ c_ws_port
* AND low = sy-sysid.
*
* " Get the PAC user and pass
*
* SELECT SINGLE * INTO ls_user FROM zcfdicanceluname
* WHERE bukrs = <fs_parcial>-bukrs .
* IF sy-subrc EQ 0.
* is_input-parameters-usuario = ls_user-uname.
* is_input-parameters-clave = ls_user-password.
* ENDIF.
*
CLEAR lv_line.
*
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
im_xstring = e_xml
im_encoding = 'UTF-8'
IMPORTING
ex_string = lv_line.

* lv_line = lv_line+39.
*
DATA: ls_input TYPE zcomp_generar_complemento_tim1,
ls_output TYPE zcomp_generar_complemento_timb,
lv_ruta_port TYPE tvarv_low,
lv_logical_port TYPE prx_logical_port_name,
lv_status TYPE string.

DATA: ls_json TYPE zecfdiresponse,


ls_detail TYPE zerror_details,
lv_message1 TYPE string,
lv_message2 TYPE string,
lv_message3 TYPE string,
lo_cast_error TYPE REF TO cx_sy_move_cast_error.

DATA: lv_balnrext TYPE balnrext,


ls_log TYPE bal_s_log,
ls_log_handle TYPE balloghndl,
lv_msg TYPE bal_s_msg,
lt_log_handle TYPE bal_t_logh,
bal_log_head TYPE bal_s_log,
l_log_handle TYPE balloghndl.

CONSTANTS: lc_port TYPE rvari_vnam VALUE 'ZCFDI_COMPL_PORT',


lc_error_ws TYPE char20 VALUE '{"stage"'.

ls_input-xml_timbrar = lv_line.

" Get Logical Port


***** COMENTAR PARA EVITAR TIMBRADO
SELECT SINGLE low
FROM tvarvc
INTO lv_ruta_port
WHERE name EQ lc_port.

MOVE lv_ruta_port TO lv_logical_port.


TRY.
DATA(lo_complpago) = NEW zcomp_co_servicio_complemento( lv_logical_po
rt ).

lo_complpago->generar_complemento_timbrado( EXPORTING input = ls_inp


ut
IMPORTING output = ls_out
put ).

CATCH cx_root INTO DATA(lv_cx_root).


ls_output-generar_complemento_timbrado_r = lc_error_ws.
MESSAGE lv_cx_root->get_text( ) TYPE 'I'.

ENDTRY.

lv_status = ls_output-generar_complemento_timbrado_r.
**** FIN COMENTAR

"DS
DATA: z_xml_response TYPE xstring,
lt_xml_info TYPE TABLE OF smum_xmltb,
it_return TYPE STANDARD TABLE OF bapiret2.
DATA: lv_string TYPE string,
lv_xstring TYPE xstring,
lv_code TYPE abap_encod VALUE 'UTF-8'. "UTF-8
CONSTANTS: c_uuid TYPE char20 VALUE 'UUID'.

FIELD-SYMBOLS: <fs_xml_info> TYPE smum_xmltb.

" Status ERROR


IF lv_status(8) EQ lc_error_ws.

LOOP AT t_parcial ASSIGNING <fs_parcial>.


*Actuliza la tabla t_parcial
IF i_cancel EQ abap_true.
<fs_parcial>-status = 'CR'. "Cancelado
ELSE.
<fs_parcial>-status = 'R'. "Enviado
ENDIF.
ENDLOOP.
TRY.
" Deserializar el contenido de la respuesta JSON
/ui2/cl_json=>deserialize( EXPORTING
json = lv_status
CHANGING
data = ls_json ).
CATCH cx_sy_move_cast_error INTO lo_cast_error.
ENDTRY.
IF sy-subrc EQ 0.

READ TABLE ls_json-comp_error_details INTO ls_detail INDEX 1.


IF ls_detail-sat_error_code IS NOT INITIAL.
lv_message1 = ls_detail-sat_error_code.
lv_message2 = ls_detail-sat_error_message.
lv_message3 = ls_detail-message.
ELSE.
lv_message1 = ls_json-error_id.
lv_message2 = ls_json-message.
lv_message3 = ls_json-message.

ENDIF.

* IF flag ne 'VR'. "SEDK929824 -------- 24/09/2021


IF flag IS INITIAL. "SEDK929824 ---------------- 24/09/2021

CALL FUNCTION 'POPUP_TO_INFORM'


EXPORTING
titel = 'Respuesta CFDI'
txt1 = lv_message1
txt2 = lv_message2
txt3 = lv_message3
txt4 = ' '. "detail_structure-field.
ENDIF.
CLEAR: bal_log_head.

CONCATENATE 'ZXML_LOG' sy-datum sy-uzeit sy-uname sy-repid


INTO bal_log_head-extnumber SEPARATED BY space.
bal_log_head-object = 'ZXML_LOG'.
bal_log_head-subobject = 'ZXML_LOG_S'.
bal_log_head-aldate = sy-datum.
bal_log_head-altime = sy-uzeit.
bal_log_head-aluser = sy-uname.
bal_log_head-altcode = sy-tcode.
bal_log_head-alprog = sy-repid.
bal_log_head-almode = ' '."sy-batch.

CALL FUNCTION 'BAL_LOG_CREATE'


EXPORTING
i_s_log = bal_log_head
IMPORTING
e_log_handle = l_log_handle
EXCEPTIONS
OTHERS = 1.

IF sy-subrc = 0.
lv_msg-msgty = 'E'.
lv_msg-msgid = 'ZSAP'.
lv_msg-msgno = 1.
CONCATENATE lv_message1 lv_message3
INTO lv_msg-msgv1 SEPARATED BY space.

CONCATENATE <fs_parcial>-bukrs <fs_parcial>-belnr INTO lv_msg-msgv2


SEPARATED BY space.
lv_msg-probclass = 1 .

CALL FUNCTION 'BAL_LOG_MSG_ADD'


EXPORTING
i_log_handle = l_log_handle
i_s_msg = lv_msg
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.

IF sy-subrc = 0.
"Do nothing
ENDIF.

INSERT l_log_handle INTO TABLE lt_log_handle.

CALL FUNCTION 'BAL_DB_SAVE'


EXPORTING
i_client = sy-mandt
i_save_all = 'X'
i_t_log_handle = lt_log_handle
EXCEPTIONS
log_not_found = 1
save_not_allowed = 2
numbering_error = 3
OTHERS = 4.

IF sy-subrc = 0.
REFRESH lt_log_handle.
ENDIF.

ENDIF.

ENDIF.

ELSE.

* String a Xstring
cl_bcs_convert=>string_to_xstring( EXPORTING iv_string = lv_status
iv_codepage = lv_code
RECEIVING ev_xstring = lv_xstring )
.

z_xml_response = lv_xstring.

CALL FUNCTION 'SMUM_XML_PARSE'


EXPORTING
xml_input = z_xml_response
TABLES
xml_table = lt_xml_info
return = it_return
EXCEPTIONS
OTHERS = 0.

* READ TABLE lt_xml_info ASSIGNING <fs_xml_info> WITH KEY cname = c_uu


id.

LOOP AT lt_xml_info[] ASSIGNING <fs_xml_info>


WHERE cname EQ c_uuid.
e_uuid = <fs_xml_info>-cvalue.

ENDLOOP.

* IF sy-subrc = 0.
IF NOT e_uuid IS INITIAL.
LOOP AT t_parcial ASSIGNING <fs_parcial>.
*Actuliza la tabla t_parcial
IF i_cancel EQ abap_true.
<fs_parcial>-status = 'CA'. "Cancelado
lv_ruta_server = '/usr/sap/InterfaceSAP/XML_CFDI/CC_PAGO/XML_CC/'.

ELSE.
<fs_parcial>-status = 'A'. "Enviado
lv_ruta_server = '/usr/sap/InterfaceSAP/XML_CFDI/CC_PAGO/
Resultado_XML_CC/'.
lv_timx = 'X'.
ENDIF.
<fs_parcial>-uuid_pago = e_uuid. "<fs_xml_info>-cvalue.
<fs_parcial>-fecha_timbra = sy-datum.
ENDLOOP.

** Se debe anexar el XML timbrado al documento financiero.


e_xml_r = z_xml_response.
ELSE.
CONCATENATE 'Error Stamp Payment Document:' <fs_parcial>-bukrs <fs_par
cial>-belnr <fs_parcial>-gjahr
INTO z_log SEPARATED BY space.
wa_msg-msgv1 = z_log.
wa_msg-msgty = 'E'.
wa_msg-msgid = z_msgid.
wa_msg-msgno = z_msgno.
wa_msg-probclass = 2.

me->save_log( EXPORTING i_create = abap_false


i_s_msg = wa_msg
CHANGING c_log_handle = wa_log_handle ).
ENDIF.

" Guardar XML Timbrado


"* ----------------------------------------------------
DATA: gv_full_path TYPE string,
lv_ruta_xml TYPE tvarv_low.
CONSTANTS: lc_ruta TYPE rvari_vnam VALUE 'ZCFDI_RUTA_XML_CC',
lc_ruta_c TYPE rvari_vnam VALUE 'ZCFDI_RUTA_CANCEL_CC'.

" Save XML on Application Server


IF i_cancel <> 'X'.
SELECT SINGLE low
INTO lv_ruta_xml
FROM tvarvc
WHERE name EQ lc_ruta.
ELSE.
SELECT SINGLE low
INTO lv_ruta_xml
FROM tvarvc
WHERE name EQ lc_ruta_c.
ENDIF.

CONCATENATE i_bkpf-bukrs i_bkpf-belnr i_bkpf-gjahr c_xml INTO gv_full_pa


th. "MODIFICACIÓN HECHA POR DEML 26.10.2018 F727 SE AGREGÓ EL CAMPO I_BKPF-
GJAHR
CONCATENATE lv_ruta_server gv_full_path INTO full_rute.
DELETE DATASET full_rute.
OPEN DATASET full_rute FOR OUTPUT IN TEXT MODE
ENCODING DEFAULT.
IF lv_timx EQ 'X'.
TRANSFER lv_status TO full_rute.
ELSE.
TRANSFER lv_line TO full_rute.
ENDIF.

CLOSE DATASET full_rute.


* OPEN DATASET gv_full_path IN BINARY MODE FOR OUTPUT.
** IF sy-subrc EQ 0.
** TRANSFER z_xml_response TO gv_full_path.
** CLOSE DATASET gv_full_path.
**
** ENDIF.

ENDIF.
*
** me->download_xml( EXPORTING i_file = lv_line ).
*
*
*
* " ----------------------------------------------------------------
* " Send XML File to PAC Web Service
* " ----------------------------------------------------------------
* TRY.
*
* CREATE OBJECT zcl_proxy
* EXPORTING
* logical_port_name = lv_logical_port.
*
* CATCH cx_ai_system_fault INTO zcl_sys_exception.
* z_mensaje = zcl_sys_exception->get_text( ).
*
**Build Error message
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error WS Payment Consumer:' <fs_parcial>-bukrs <fs_pa
rcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
* lv_doc_type = 'C'.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
* ENDTRY.
* TRY .
*
* CALL METHOD zcl_proxy->timbrado "emitir_timbrar MOD_ALSA
* EXPORTING
* input = is_input
* IMPORTING
* output = is_output.
*
********* Exception System Fault
************************************************************
* CATCH cx_ai_system_fault INTO zcl_sys_exception.
* z_mensaje = zcl_sys_exception->get_text( ).
*
**Build Error message
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error System Payment Fault:' <fs_parcial>-bukrs <fs_p
arcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
* lv_doc_type = 'C'.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
********* Exception Application Fault
************************************************************
* CATCH cx_ai_application_fault INTO zcl_app_exception.
* z_mensaje = zcl_app_exception->get_text( ).
*
**Build Error message
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error Application Payment Fault:' <fs_parcial>-bukrs
<fs_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
* lv_doc_type = 'C'.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
********* SOAP FAULT
************************************************************
* CATCH cx_root INTO zcl_cx_root. "cx_ai_soap_fa
ult
* z_mensaje = zcl_cx_root->get_text( ).
*
* CLEAR: z_log, wa_msg.
* CONCATENATE 'Error Stamp Payment Document:' <fs_parcial>-bukrs <fs
_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
**Build Error message
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-msgv1 = z_log.
* wa_msg-msgv2 = z_mensaje.
* wa_msg-probclass = 2.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
* ENDTRY.
*
**Check the Result is a CODE Sucessfully
* IF is_output-parameters-return-status IS NOT INITIAL.
* IF is_output-parameters-return-codigo IS NOT INITIAL. "-
folio_uddi MOD_ALSA
** Se debe anexar el XML timbrado al documento financiero.
* e_xml_r = is_output-parameters-return-timbre. " -xml.
* <fs_parcial>-uuid_pago = is_output-parameters-return-codigo. "Iden
tificar donde trae el folio UUID
* <fs_parcial>-fecha_timbra = sy-datum.
* <fs_parcial>-status = 'A'.
*
* ELSE.
* CONCATENATE 'Error Stamp Payment Document:' <fs_parcial>-bukrs <fs
_parcial>-belnr <fs_parcial>-gjahr
* INTO z_log SEPARATED BY space.
* wa_msg-msgv1 = z_log.
* IF is_output-parameters-return-status IS NOT INITIAL.
* e_message = is_output-parameters-return-status. "MOD
_ALSA
* z_new = is_output-parameters-return-codigo. "-message MOD
ALSA
* z_long = strlen( z_new ).
* z_cont = 2.
* z_char = 0.
* DO 3 TIMES.
* IF z_long >= 50.
* CONCATENATE 'wa_msg-msgv' z_cont INTO z_campo.
* ASSIGN (z_campo) TO <fs_campo>.
* <fs_campo> = z_new(50).
* z_char = z_char + 50.
* z_new = is_output-parameters-return-codigo. "-
message+z_char. MOD ALSA
* z_long = strlen( z_new ).
* z_cont = z_cont + 1.
* ELSE.
* CONCATENATE 'wa_msg-msgv' z_cont INTO z_campo.
* ASSIGN (z_campo) TO <fs_campo>.
* <fs_campo> = z_new.
* EXIT.
* ENDIF.
* ENDDO.
* ENDIF.
* wa_msg-msgty = 'E'.
* wa_msg-msgid = z_msgid.
* wa_msg-msgno = z_msgno.
* wa_msg-probclass = 2.
*
* me->save_log( EXPORTING i_create = abap_false
* i_s_msg = wa_msg
* CHANGING c_log_handle = wa_log_handle ).
*
* ENDIF.
* ENDIF.

*-----------------------------------------------*
* Save Local
APPEND lv_line TO lt_string.
* break mperez.
* CONCATENATE '/usr/sap/InterfaceSAP/XML_CFDI/CC_PAGO/XML_CC/' <fs_parcial>-
bukrs <fs_parcial>-belnr c_xml INTO lv_ruta_server.
*DELETE DATASET lv_ruta_server.
* OPEN DATASET lv_ruta_server FOR OUTPUT IN TEXT MODE
* ENCODING DEFAULT.
* TRANSFER lv_line TO lv_ruta_server.
* CLOSE DATASET lv_ruta_server.

* IF flag ne 'VR'. "SEDK929824 -------- 24/09/2021


IF flag IS INITIAL. "SEDK929824 ---------------- 24/09/2021

* CONCATENATE 'C:\tmp\' <fs_parcial>-bukrs <fs_parcial>-belnr c_xml INTO


lv_filename.
*
*
* CALL FUNCTION 'GUI_DOWNLOAD'
* EXPORTING
* filename = lv_filename
* filetype = 'ASC'
* TABLES
* data_tab = lt_string
** FIELDNAMES =
* EXCEPTIONS
* file_write_error = 1
* no_batch = 2
* gui_refuse_filetransfer = 3
* invalid_type = 4
* no_authority = 5
* unknown_error = 6
* header_not_allowed = 7
* separator_not_allowed = 8
* filesize_not_allowed = 9
* header_too_long = 10
* dp_error_create = 11
* dp_error_send = 12
* dp_error_write = 13
* unknown_dp_error = 14
* access_denied = 15
* dp_out_of_memory = 16
* disk_full = 17
* dp_timeout = 18
* file_not_found = 19
* dataprovider_exception = 20
* control_flush_error = 21
* OTHERS = 22.
* IF sy-subrc <> 0.
* Implement suitable error handling here
*
* ENDIF.
ENDIF.
*-----------------------------------------------*
ENDIF.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->DOWNLOAD_XML
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_FILE TYPE STRING
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD download_xml.

DATA: lt_file TYPE STANDARD TABLE OF ty_file,


ls_file TYPE ty_file,
lv_filename TYPE string.

ls_file-line = i_file.

APPEND ls_file TO lt_file[].


CLEAR ls_file.

CONCATENATE 'C:/Tmp/Test_' sy-datum '_' sy-uzeit '.xml'


INTO lv_filename.

CALL FUNCTION 'GUI_DOWNLOAD'


EXPORTING
filename = lv_filename
TABLES
data_tab = lt_file[].

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->ENVIO_COMPLMTO
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] LV_PDF_R TYPE XSTRING
* | [--->] LV_XML_R TYPE XSTRING
* | [--->] I_SOC TYPE BUKRS
* | [--->] I_YEAR TYPE GJAHR
* | [--->] I_NDOC TYPE ZFI_T_PAGOS_CFDI-
BELNR
* | [--->] I_CLIE TYPE KUNNR
* | [<-->] E_MENSAJE TYPE I
* +--------------------------------------------------------------------------
------------</SIGNATURE>
method ENVIO_COMPLMTO.
* Declaracion de variables y tablas
DATA: LIT_BINARY_CONTENT TYPE SOLIX_TAB.

TYPES: BEGIN OF TY_EMAIL,


KUNNR TYPE ZFI_T_PAGOS_CFDI-KUNNR,
SMTP_ADDR TYPE ADR6-SMTP_ADDR,
END OF TY_EMAIL.

DATA: DIR_EMAIL TYPE STANDARD TABLE OF TY_EMAIL.

DATA: lv_xml_size TYPE so_obj_len,


lv_pdf_size TYPE so_obj_len,
lt_pdf TYPE solix_tab,
LV_I TYPE I,
len TYPE sood-objlen,
LV_NXML TYPE SO_OBJ_DES,
LV_NPDF TYPE SO_OBJ_DES,
BCS_EXCEPTION TYPE REF TO CX_BCS.

* VARIABLES PARA ENCABEZADO DEL CORREO


DATA: LO_SEND_REQUEST TYPE REF TO CL_BCS,
LO_DOCUMENT TYPE REF TO CL_DOCUMENT_BCS,
LO_SENDER TYPE REF TO IF_SENDER_BCS,
LO_RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.

* VARIABLES PARA CUERPO DEL CORREO


DATA: LTEXT(255) TYPE C,
WL_EMAIL_LINE(80) TYPE C,
LT_MESSAGE_BODY TYPE BCSY_TEXT,
WL_MESSAGE_BODY TYPE BCSY_TEXT,
W_SUBJECT(50) TYPE C,
L_SUB TYPE SO_OBJ_DES,
NOM1 TYPE ADRC-NAME1,
NOM2 TYPE ADRC-NAME2,
NSOC TYPE STRING.

FIELD-SYMBOLS: <FS_EMAIL> TYPE TY_EMAIL.

* Buscar los correos del cliente


IF I_CLIE IS NOT INITIAL.
SELECT K~KUNNR, A6~SMTP_ADDR
INTO CORRESPONDING FIELDS OF TABLE @DIR_EMAIL
FROM KNA1 AS K
INNER JOIN ADR6 AS A6 ON ( A6~ADDRNUMBER = K~ADRNR )
WHERE K~KUNNR = @I_CLIE.

IF SY-SUBRC <> 0.
"NO SE ENCONTRARON CORREOS.
E_MENSAJE = 2.
EXIT.
ENDIF.
ENDIF.

* Crear el cuerpo del correo

** SE OBTIENE LA DESCRIPCIÓN DE LA SOCIEDAD


SELECT SINGLE AD~NAME1, AD~NAME2
INTO ( @NOM1, @NOM2 )
FROM T001 AS T
INNER JOIN ADRC AS AD ON ( AD~ADDRNUMBER = T~ADRNR )
WHERE T~BUKRS = @I_SOC.

IF SY-SUBRC = 0.
CONCATENATE NOM1 NOM2 INTO NSOC SEPARATED BY SPACE.
ENDIF.

** GENERAR TEXTOS DE ASUNTO Y CUERPO DE CORREO


L_SUB = 'Complemento de Pago'.
APPEND 'Se envía complemento de Pago' TO LT_MESSAGE_BODY.
APPEND ' ' TO LT_MESSAGE_BODY.
APPEND NSOC TO LT_MESSAGE_BODY.

LO_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

LO_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
i_type = 'RAW'
i_text = lt_message_body "Mensaje del ema
il
i_subject = L_SUB ). "Asunto del ema
il

CALL METHOD LO_SEND_REQUEST->SET_DOCUMENT( LO_DOCUMENT ).

* Agregar destinatario(s)
LOOP AT DIR_EMAIL ASSIGNING <FS_EMAIL>.
TRY.
LO_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( <FS_EMAI
L>-SMTP_ADDR ).
CALL METHOD LO_SEND_REQUEST->ADD_RECIPIENT
EXPORTING
i_recipient = LO_RECIPIENT
i_express = 'X'.
CATCH CX_BCS INTO BCS_EXCEPTION.
E_MENSAJE = 3.
EXIT.
ENDTRY.
ENDLOOP.
* Añadimos el remitente del email, en este caso el usuario de sap que lo
crea
LO_SENDER = CL_SAPUSER_BCS=>CREATE( SY-UNAME ).
CALL METHOD LO_SEND_REQUEST->SET_SENDER( I_SENDER = LO_SENDER ).
* Adjuntar archivos
IF LV_XML_R IS NOT INITIAL AND LV_PDF_R IS NOT INITIAL.
CONCATENATE I_SOC I_NDOC I_YEAR '.pdf' INTO LV_NPDF.
CONCATENATE I_SOC I_NDOC I_YEAR '.xml' INTO LV_NXML.
* Get PDF xstring and convert it to BCS format
LV_PDF_SIZE = XSTRLEN( LV_PDF_R ).
LT_PDF = CL_DOCUMENT_BCS=>XSTRING_TO_SOLIX( IP_XSTRING = LV_PDF_R ).

CALL METHOD LO_DOCUMENT->ADD_ATTACHMENT


EXPORTING
i_attachment_type = 'PDF'
i_attachment_subject = LV_NPDF
i_attachment_size = LV_PDF_SIZE
i_att_content_hex = LT_PDF.
* Get XML xstring and convert it to BCS format
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = LV_XML_R
IMPORTING
output_length = LV_I
TABLES
binary_tab = LIT_BINARY_CONTENT.

LEN = LV_I.

CALL METHOD LO_DOCUMENT->ADD_ATTACHMENT


EXPORTING
i_attachment_type = 'XML'
i_attachment_subject = LV_NXML
i_attachment_size = LEN
i_att_content_hex = LIT_BINARY_CONTENT.
ENDIF.

** Enviar correo
* Se asigna la prioridad para envio inmediato.
CALL METHOD LO_SEND_REQUEST->SET_SEND_IMMEDIATELY
EXPORTING
I_SEND_IMMEDIATELY = 'X'.
* Enviamos el email
LO_SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).
** Mostrar mensaje con estado del envio
IF SY-SUBRC = 0.
E_MENSAJE = 0.
ELSE.
E_MENSAJE = 1.
ENDIF.

endmethod.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->FORMAT_QRCODE
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_SENDER_RFC TYPE CHAR20
* | [--->] I_RECEIVER_RFC TYPE CHAR20
* | [--->] I_AMOUNT TYPE CHAR20
* | [--->] I_UUID TYPE CHAR36
* | [--->] I_SELLO TYPE STRING
* | [<---] E_QRCODE TYPE CHAR200
* +--------------------------------------------------------------------------
------------</SIGNATURE>
method FORMAT_QRCODE.
DATA: z_integer TYPE char10,
z_decimal TYPE char6,
z_amount TYPE string,
z_amount_fin TYPE char20,
z_sello TYPE string,
z_len TYPE i,
z_diff TYPE i.

CONSTANTS: c_ur TYPE char64 VALUE '[Link]


[Link]/[Link]?',
c_id TYPE char3 VALUE 'id=',
c_re TYPE char4 VALUE '&re=',
c_rr TYPE char4 VALUE '&rr=',
c_tt TYPE char4 VALUE '&tt=',
c_fe TYPE char4 VALUE '&fe='.

" Amount Format


z_amount = i_amount.

CONDENSE: z_amount.

SPLIT z_amount AT '.' INTO z_integer z_decimal.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'


EXPORTING
input = z_integer
IMPORTING
output = z_integer.

z_len = strlen( z_decimal ).

z_diff = 6 - z_len.

" 0's Fill


DO z_diff TIMES.
CONCATENATE z_decimal '0' INTO z_decimal.
ENDDO.

CONCATENATE z_integer z_decimal


INTO z_amount_fin
SEPARATED BY '.'.

z_len = STRLEN( i_sello ).


z_diff = z_len - 8.
z_sello = i_sello+z_diff(8).

" Final QR Code String


CONCATENATE c_ur
c_id i_uuid
c_re i_sender_rfc
c_rr i_receiver_rfc
c_tt z_amount_fin
c_fe z_sello
INTO e_qrcode.
endmethod.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->GET_EMISOR_DOM
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] SOCIEDAD TYPE BUKRS
* | [<---] DOMICILIO TYPE ZSDFES_EXPEMISOR
* +--------------------------------------------------------------------------
------------</SIGNATURE>
method GET_EMISOR_DOM.
DATA: lt_adrc_bukrs TYPE TABLE OF adrc,
ls_t001 TYPE t001,
ls_adrc TYPE adrc,
wa_t005t TYPE t005t.

SELECT SINGLE * INTO ls_t001


FROM t001
WHERE bukrs = sociedad.

CALL FUNCTION 'ADDR_SELECT_ADRC_SINGLE'


EXPORTING
addrnumber = ls_t001-adrnr
TABLES
et_adrc = lt_adrc_bukrs
EXCEPTIONS
address_not_exist = 1
parameter_error = 2
internal_error = 3
OTHERS = 4.

IF sy-subrc = 0.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

READ TABLE lt_adrc_bukrs INTO ls_adrc INDEX 1.

domicilio-calle = ls_adrc-street.
domicilio-noexterior = ls_adrc-house_num1.
domicilio-colonia = ls_adrc-str_suppl3.
domicilio-municipio = ls_adrc-city2.
domicilio-localidad = ls_adrc-city1.
domicilio-region = ls_adrc-region.
domicilio-codigopostal = ls_adrc-post_code1.
domicilio-tel_number = ls_adrc-tel_number.

*---Descripción de país
SELECT SINGLE * INTO wa_t005t
FROM t005t
WHERE spras = 'S' AND
land1 = ls_adrc-country.
IF sy-subrc EQ 0.
domicilio-pais = wa_t005t-landx.
ENDIF.
endmethod.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->GET_FILES_GOS
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_DOCUMENT TYPE SIBFBORIID
* | [<---] R_CONTENT_PDF TYPE XSTRING
* | [<---] R_CONTENT_XML TYPE XSTRING
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD get_files_gos.
DATA: lt_anexos TYPE STANDARD TABLE OF srgbtbrel,
lt_solix TYPE STANDARD TABLE OF solix,
ls_document TYPE sofolenti1.

DATA: lv_size TYPE i,


lv_xstring TYPE xstring.

CONSTANTS: c_bkpf TYPE sibftypeid VALUE 'BKPF',


c_atta TYPE oblreltype VALUE 'ATTA',
c_xml_ext TYPE so_obj_tp VALUE 'XML',
c_pdf_ext TYPE so_obj_tp VALUE 'PDF'.

FIELD-SYMBOLS: <fs_anexos> TYPE srgbtbrel.

SELECT * INTO TABLE lt_anexos FROM srgbtbrel


WHERE reltype = c_atta
AND instid_a = i_document
AND typeid_a = c_bkpf.

LOOP AT lt_anexos ASSIGNING <fs_anexos>.

CALL FUNCTION 'SO_DOCUMENT_READ_API1'


EXPORTING
document_id = <fs_anexos>-instid_b(46)
IMPORTING
document_data = ls_document
TABLES
contents_hex = lt_solix
EXCEPTIONS
document_id_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
IF sy-subrc = 0.

lv_size = ls_document-doc_size.

lv_xstring = cl_bcs_convert=>solix_to_xstring( it_solix = lt_solix


iv_size = lv_size ).

CASE ls_document-obj_type.
WHEN c_pdf_ext.
r_content_pdf = lv_xstring.
WHEN c_xml_ext.
IF ls_document-obj_descr(1) = 'G'.
r_content_xml = lv_xstring.
ENDIF.
ENDCASE.

ENDIF.
ENDLOOP.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->GET_NOCERTIFICADO
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BUKRS TYPE BUKRS
* | [<-->] I_XML_STRING TYPE STRING
* | [<-->] I_NOCER TYPE STRING
* | [<-->] I_CERTI TYPE STRING
* | [<-->] I_SELLO TYPE STRING
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD get_nocertificado.
DATA:
lo_http_client TYPE REF TO if_http_client,
lo_rest_client TYPE REF TO cl_rest_http_client,
lo_request TYPE REF TO if_rest_entity,
lo_response TYPE REF TO if_rest_entity,
lv_value TYPE string,
lv_str1 TYPE string,
lv_str2 TYPE string,
lv_str3 TYPE string,
lv_str4 TYPE string,
lv_str5 TYPE string,
lv_str6 TYPE string,
lv_token TYPE string,
lv_body TYPE string,
lv_uri TYPE string,
lv_valor TYPE char5,
lv_media_type TYPE string, "Media Type
lt_parameter TYPE tihttpnvp. "List of Content Type Parameters
"-----------------------------------------------------------------

"**********************************
"*** Obtiene Certificado ***
"**********************************
cl_http_client=>create_by_destination(
EXPORTING
destination = 'SELLOCARTAPORTE' " Logical destinatio
n (specified in function call)
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
destination_not_found = 2
destination_no_authority = 3
plugin_not_active = 4
internal_error = 5
OTHERS = 6
).

CREATE OBJECT lo_rest_client


EXPORTING
io_http_client = lo_http_client.

lo_http_client->request->set_version( if_http_reques
t=>co_protocol_version_1_1 ).

FREE lt_parameter.
APPEND INITIAL LINE TO lt_parameter ASSIGNING FIELD-
SYMBOL(<lw_parameter>).
<lw_parameter>-name = 'p_sociedad'.
<lw_parameter>-value = i_bukrs.
IF lo_http_client IS BOUND AND lo_rest_client IS BOUND.
* IF sy-sysid EQ 'SEC'.
* CONCATENATE '/api/Certificado_prueba?p_sociedad='
* i_bukrs
* INTO lv_uri.
* ELSEIF sy-sysid EQ 'SEP'.
CONCATENATE '/api/Certificado_cfdi40?p_sociedad='
i_bukrs
INTO lv_uri.
* ENDIF.

cl_http_utility=>set_request_uri(
EXPORTING
request = lo_http_client->request
uri = lv_uri ).

CONCATENATE 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmx


pbmUgSldUIEJ1aWxkZXIiLCJ'
'pYXQiOjE2NDg4NzM4OTIsImV4cCI6MTY4MDQwOTg5MiwiYXVkIjoid3d3Lm
V4YW1wbGUuY29tIiw'
'ic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG
5ueSIsIlN1cm5hbWU'
'iOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2
xlIjpbIk1hbmFnZXI'
'iLCJQcm9qZWN0IEFkbWluaXN0cmF0b3IiXX0.EDFhK_wGiX9B7Ogacm7MHD
JKl1uNk90Vrx1JFzF'
'bEUI' INTO lv_token.

CALL METHOD lo_rest_client->if_rest_client~set_request_header


EXPORTING
iv_name = 'authorization'
iv_value = lv_token.

* DATA lv_value2 TYPE string.


* lv_value2 = i_bukrs.
* CALL METHOD lo_rest_client->if_rest_client~set_request_header
* EXPORTING
* iv_name = 'p_sociedad'
* iv_value = lv_value2.

lv_body = i_xml_string.
lv_value = cl_abap_char_utilities=>newline.
CONCATENATE '>' lv_value '<' INTO lv_value.
IF sy-subrc = 0.
REPLACE ALL OCCURRENCES OF lv_value IN lv_body WITH '><' IN
CHARACTER MODE.
ENDIF.

lo_request = lo_rest_client->if_rest_client~create_request_entity( ).
* lo_request->set_header_field( iv_name = 'p_sociedad'
* iv_value = lv_value2
* ).
lo_request->set_content_type(
iv_media_type = if_rest_media_type=>gc_text_plain
it_parameter = lt_parameter
).
" lo_request->set_string_data( lv_body ).
TRY.
* lo_rest_client->if_rest_resource~get( ).
lo_rest_client->if_rest_resource~post( lo_request ).
lo_response = lo_rest_client->if_rest_client~get_response_entity( ).
DATA(http_status) = lo_response->get_header_field( '~status_code'
).
DATA(json_response) = lo_response->get_string_data( ).
DATA objectresult.

/ui2/cl_json=>deserialize( EXPORTING json = json_response


pretty_name = /ui2/
cl_json=>pretty_mode-camel_case
CHANGING data = objectresult ).

SPLIT json_response AT ',' INTO: lv_str1 lv_str2 lv_str3 lv_str4 lv_


str5 lv_str6.
IF lv_str1+9(4) EQ 'true'.
lv_valor = 'true'.
ELSE.
lv_valor = 'false'.
ENDIF.

IF lv_valor EQ 'false' AND lv_str2+11(16) EQ 'Consulta exitosa'.


FIND FIRST OCCURRENCE OF '"numero_certificado":' IN lv_str3.
IF sy-subrc EQ 0.
lv_str3 = lv_str3+21.
REPLACE FIRST OCCURRENCE OF ',' IN lv_str3 WITH space.
CONDENSE lv_str3.
i_nocer = lv_str3.

REPLACE ALL OCCURRENCES OF '"' IN i_nocer WITH space.


CONDENSE i_nocer.

CONCATENATE 'NoCertificado=' lv_str3 INTO lv_str3.


REPLACE FIRST OCCURRENCE OF 'NoCertificado=""' IN i_xml_string W
ITH lv_str3.
ENDIF.
ENDIF.

CATCH cx_rest_client_exception INTO DATA(lv_cx_log2).


ENDTRY.
ENDIF.

"**********************************
"*** Obtiene Sello ***
"**********************************
cl_http_client=>create_by_destination(
EXPORTING
destination = 'SELLOCARTAPORTE' " Logical destinatio
n
IMPORTING
client = lo_http_client " HTTP Client Abstra
ction
EXCEPTIONS
argument_not_found = 1
destination_not_found = 2
destination_no_authority = 3
plugin_not_active = 4
internal_error = 5
OTHERS = 6
).

CREATE OBJECT lo_rest_client


EXPORTING
io_http_client = lo_http_client.

lo_http_client->request->set_version( if_http_reques
t=>co_protocol_version_1_1 ).

IF lo_http_client IS BOUND AND lo_rest_client IS BOUND.


* lv_uri = '/api/Info40_prueba'.
CLEAR lv_uri.

* IF sy-sysid EQ 'SEC'.
* CONCATENATE '/api/Info40_prueba?p_sociedad='
* i_bukrs
* INTO lv_uri.
* ELSEIF sy-sysid EQ 'SEP'.
CONCATENATE '/api/Info_cfdi40?p_sociedad='
i_bukrs
INTO lv_uri.
* ENDIF.

cl_http_utility=>set_request_uri(
EXPORTING request = lo_http_client->request
uri = lv_uri ).

CONCATENATE 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmx


pbmUgSldUIEJ1aWxkZXIiLCJ'
'pYXQiOjE2NDg4NzM4OTIsImV4cCI6MTY4MDQwOTg5MiwiYXVkIjoid3d3Lm
V4YW1wbGUuY29tIiw'
'ic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG
5ueSIsIlN1cm5hbWU'
'iOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2
xlIjpbIk1hbmFnZXI'
'iLCJQcm9qZWN0IEFkbWluaXN0cmF0b3IiXX0.EDFhK_wGiX9B7Ogacm7MHD
JKl1uNk90Vrx1JFzF'
'bEUI' INTO lv_token.

CALL METHOD lo_rest_client->if_rest_client~set_request_header


EXPORTING
iv_name = 'authorization'
iv_value = lv_token.

lv_body = i_xml_string.
lv_value = cl_abap_char_utilities=>newline.
CONCATENATE '>' lv_value '<' INTO lv_value.
IF sy-subrc = 0.
REPLACE ALL OCCURRENCES OF lv_value IN lv_body WITH '><' IN
CHARACTER MODE.
ENDIF.

* FREE lt_parameter.
* APPEND INITIAL LINE TO lt_parameter ASSIGNING FIELD-
SYMBOL(<lw_parameter>).
* <lw_parameter>-name = 'p_sociedad'.
* <lw_parameter>-value = i_bukrs.

lo_request = lo_rest_client->if_rest_client~create_request_entity( ).
lo_request->set_content_type(
iv_media_type = if_rest_media_type=>gc_text_plain
it_parameter = lt_parameter
).
lo_request->set_string_data( lv_body ).

TRY.
lo_rest_client->if_rest_resource~post( lo_request ).
lo_response = lo_rest_client->if_rest_client~get_response_entity(
).
http_status = lo_response->get_header_field( '~status_code' ).

" HTTP JSON return string


json_response = lo_response->get_string_data( ).
/ui2/cl_json=>deserialize( EXPORTING json = json_response
pretty_name = /ui2/
cl_json=>pretty_mode-camel_case
CHANGING data = objectresult ).

SPLIT json_response AT ',' INTO: lv_str1 lv_str2 lv_str3 lv_str4 lv_


str5 lv_str6.
IF lv_str1+9(4) EQ 'true'.
lv_valor = 'true'.
ELSE.
lv_valor = 'false'.
ENDIF.

IF lv_valor EQ 'false' AND lv_str2+11(16) EQ 'Consulta exitosa'.


FIND FIRST OCCURRENCE OF '"certificado":' IN lv_str6.
IF sy-subrc EQ 0.
lv_str6 = lv_str6+14.
REPLACE FIRST OCCURRENCE OF '"}' IN lv_str6 WITH '"'.
REPLACE FIRST OCCURRENCE OF ',' IN lv_str6 WITH space.
CONDENSE lv_str6.

i_certi = lv_str6.
REPLACE ALL OCCURRENCES OF '"' IN i_certi WITH space.
CONDENSE i_certi.

CONCATENATE 'Certificado=' lv_str6 INTO lv_str6.


REPLACE FIRST OCCURRENCE OF 'Certificado=""' IN i_xml_string WIT
H lv_str6.
ENDIF.

FIND FIRST OCCURRENCE OF '"sello":' IN lv_str4.


IF sy-subrc EQ 0.
lv_str4 = lv_str4+8.
REPLACE FIRST OCCURRENCE OF ',' IN lv_str4 WITH space.
CONDENSE lv_str4.

i_sello = lv_str4.
REPLACE ALL OCCURRENCES OF '"' IN i_sello WITH space.
CONDENSE i_sello.

CONCATENATE 'Sello=' lv_str4 INTO lv_str4.


REPLACE FIRST OCCURRENCE OF 'Sello=""' IN i_xml_string WITH lv_s
tr4.
ENDIF.

ENDIF.
CATCH cx_rest_client_exception INTO lv_cx_log2.
ENDTRY.
ENDIF.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->GET_RECEPTOR_DOM
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] CLIENTE TYPE KUNNR
* | [<---] DOMICILIO TYPE ZSDFES_EXPEMISOR
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD get_receptor_dom.
DATA: ls_kna1 TYPE kna1,
ls_t001 TYPE t001,
ls_adrc TYPE adrc,
lt_adrc TYPE TABLE OF adrc.

SELECT SINGLE * INTO ls_kna1


FROM kna1
WHERE kunnr = cliente.

CALL FUNCTION 'ADDR_SELECT_ADRC_SINGLE'


EXPORTING
addrnumber = ls_kna1-adrnr
TABLES
et_adrc = lt_adrc
EXCEPTIONS
address_not_exist = 1
parameter_error = 2
internal_error = 3
OTHERS = 4.

IF sy-subrc = 0.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

READ TABLE lt_adrc INTO ls_adrc INDEX 1.

domicilio-calle = ls_adrc-street.
domicilio-noexterior = ls_adrc-house_num1.
domicilio-colonia = ls_adrc-str_suppl3.
domicilio-municipio = ls_adrc-city2.
domicilio-localidad = ls_adrc-city1.
domicilio-pais = ls_adrc-country.
domicilio-codigopostal = ls_adrc-post_code1.
domicilio-tel_number = ls_adrc-tel_number.
domicilio-name = ls_kna1-name1.
domicilio-name2 = ls_kna1-name2.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->GET_SIGN
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BUKRS TYPE BUKRS
* | [--->] I_ERDAT TYPE ERDAT
* | [--->] I_ERZEIT TYPE CPUTM
* | [--->] I_CHAIN TYPE STRING
* | [<---] E_SELLO TYPE STRING
* | [<---] E_CERTIF TYPE STRING
* | [<---] E_NOCERTIF TYPE STRING
* +--------------------------------------------------------------------------
------------</SIGNATURE>
method GET_SIGN.
DATA: ls_pseprof TYPE idmx_di_pseprof,
z_ssf_parameters_id TYPE idmx_di_profile,
z_pse_filename TYPE idmx_di_pseprof-psefilename,
z_ssf_validity_flag TYPE general_flag,
z_sello_string TYPE string,
z_skip_signature TYPE c.

CLEAR: ls_pseprof, z_ssf_parameters_id, z_pse_filename, z_ssf_validity_fla


g, z_sello_string, z_skip_signature.

CALL FUNCTION 'IDMX_DI_GET_PARAM_ID'


EXPORTING
bukrs = i_bukrs
erdat = i_erdat
erzeit = i_erzeit
IMPORTING
parameter_id = z_ssf_parameters_id
EXCEPTIONS
no_valid_parameter_id = 1.

CLEAR: z_pse_filename, z_skip_signature, ls_pseprof.

SELECT SINGLE *
FROM idmx_di_pseprof
INTO ls_pseprof
WHERE ssfprofilename EQ z_ssf_parameters_id.

SELECT SINGLE psefilename


FROM idmx_di_pseprof
INTO z_pse_filename
WHERE ssfprofilename = z_ssf_parameters_id.
IF sy-subrc = 0 AND z_pse_filename IS INITIAL.
z_skip_signature = abap_true.
ENDIF.

*------------------------------------------------------
*. CHECK SSF ENVIRONMENT (configured server)
*------------------------------------------------------
IF z_skip_signature IS INITIAL. "2029035
CALL FUNCTION 'IDMX_DI_CHECK_SSF_CONFIG'
EXPORTING
iv_parameters_id = z_ssf_parameters_id
iv_doc_creation_date = i_erdat
iv_doc_creation_time = i_erzeit
IMPORTING
ev_validity_flag = z_ssf_validity_flag
EXCEPTIONS
parameters_id_not_exist = 1
psefile_not_exist = 2
psefile_invalid = 3
unknown_error = 4
OTHERS = 5.
ELSE.
z_ssf_validity_flag = abap_true.
ENDIF.
IF z_skip_signature IS INITIAL.
CALL METHOD cl_cfdi_utility_mx=>get_certificate
EXPORTING
is_pseprof = ls_pseprof
IMPORTING
ev_serial_no = z_sello_string
EXCEPTIONS
ssf_parameter_not_found = 1
psefile_not_exist = 2
unknown_error = 3
sapcryptolib_not_installed = 4
psefile_access_denied = 5
psefile_invalid = 6
conv_error = 7
no_operation = 8
ssf_parameter_wrong = 9
OTHERS = 10.

DATA: z_release TYPE cvers-release VALUE '740',


z_pa_id TYPE idmx_di_profile,
z_prn_sign TYPE string,
z_sign_bm TYPE xstring,
z_certif TYPE string.

z_pa_id = ls_pseprof-ssfprofilename.
DATA ls_cvers TYPE cvers.

SELECT SINGLE * FROM cvers INTO ls_cvers


WHERE component = 'SAP_BASIS'.

CALL FUNCTION 'IDMX_DI_SIGN'


EXPORTING
inv_str = i_chain
iv_release = ls_cvers-release
ssf_parameters_id = z_ssf_parameters_id "z_pa_id
iv_get_certificate = 'X'
IMPORTING
prn_sign = z_prn_sign
sign_bm = z_sign_bm
cert_base64 = z_certif
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.

e_certif = z_certif.
e_sello = z_prn_sign.
e_nocertif = z_sello_string.
ENDIF.

endmethod.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->PARSER_XML
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_XML TYPE STRING
* | [<-->] T_PARSER TYPE ZABAP_XMLTB
* | [EXC!] PARSE_ERROR
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD PARSER_XML.

DATA: i_buffer TYPE xstring,


return TYPE STANDARD TABLE OF bapiret2.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'


EXPORTING
text = i_xml
IMPORTING
buffer = i_buffer
EXCEPTIONS
failed = 1
OTHERS = 2.

IF sy-subrc NE 0.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING parse_error.
ENDIF.

CALL FUNCTION 'SMUM_XML_PARSE'


EXPORTING
xml_input = i_buffer
TABLES
xml_table = t_parser
return = return.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->PARSER_XML_SPEI
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_XML TYPE STRING
* | [<-->] T_PARSER TYPE ZFI_TT_ABAP_XMLTB
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD parser_xml_spei.

DATA: i_buffer TYPE xstring,


return TYPE STANDARD TABLE OF bapiret2.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'


EXPORTING
text = i_xml
IMPORTING
buffer = i_buffer
EXCEPTIONS
failed = 1
OTHERS = 2.

IF sy-subrc EQ 0.
CALL FUNCTION 'ZFI_FM_SMUM_XML_PARSE'
EXPORTING
xml_input = i_buffer
TABLES
xml_table = t_parser
return = return.
ENDIF.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->POPUP_GET_VALUES
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_TITLE TYPE CHAR50
* | [--->] I_TIPO TYPE CHAR1
* | [--->] I_BUTTONS TYPE CHAR1
* | [<---] E_RETURN TYPE CHAR1
* | [<-->] T_FIELDS TYPE KWT_SVAL(optional)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD popup_get_values.
DATA: lv_text1 TYPE c LENGTH 50,
lv_text2 TYPE c LENGTH 50,
lv_result TYPE c,
ls_fields TYPE sval.

CONSTANTS: c_tabfield TYPE string VALUE 'ZFI_S_CHEQUE_CFDI',


c_tabfield_b TYPE string VALUE 'ZFI_S_TRANSFER_CFDI',
c_pais TYPE string VALUE 'PAIS_BANCO',
c_pais_b TYPE string VALUE 'BANKS',
c_banco TYPE string VALUE 'BANCO',
c_banco_b TYPE string VALUE 'BANKL',
c_referencia TYPE string VALUE 'REFERENCIA',
c_cuenta TYPE string VALUE 'CUENTA_EMISOR',
c_cuenta_b TYPE string VALUE 'BANKN',
c_cheque TYPE string VALUE 'NUMERO_CHEQUE'.

CASE i_tipo.
WHEN 'C'.

FREE t_fields. CLEAR ls_fields.


* Llenamos la tabla con nuestros campos.
ls_fields-tabname = c_tabfield.
ls_fields-fieldname = c_pais.
APPEND ls_fields TO t_fields.
ls_fields-fieldname = c_banco.
APPEND ls_fields TO t_fields.
ls_fields-fieldname = c_cuenta.
APPEND ls_fields TO t_fields.
ls_fields-fieldname = c_cheque.
APPEND ls_fields TO t_fields.

WHEN 'T'.
IF i_buttons = 0.
FREE t_fields. CLEAR ls_fields.
* Llenamos la tabla con nuestros campos.
ls_fields-tabname = c_tabfield_b.
ls_fields-fieldname = c_pais_b.
APPEND ls_fields TO t_fields.
ls_fields-fieldname = c_banco_b.
APPEND ls_fields TO t_fields.
ls_fields-fieldname = c_cuenta_b.
APPEND ls_fields TO t_fields.
ls_fields-fieldname = c_referencia.
APPEND ls_fields TO t_fields.
ELSEIF i_buttons = 2.
lv_text1 = 'Mismo Banco'.
lv_text2 = 'SPEI'.
ENDIF.
ENDCASE.

IF i_buttons = 0.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = i_title
start_column = '5'
start_row = '5'
IMPORTING
returncode = e_return
TABLES
fields = t_fields
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.

ELSEIF i_buttons = 2.

CALL FUNCTION 'K_KKB_POPUP_RADIO2'


EXPORTING
i_title = i_title "'Tipo Transferencia'
i_text1 = lv_text1 "'Mismo Banco'
i_text2 = lv_text2 "'SPEI'
i_default = 1
IMPORTING
i_result = e_return
EXCEPTIONS
cancel = 1
OTHERS = 2.

ENDIF.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->PROCESS_DATA
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BKPF TYPE BKPF
* | [--->] I_KUNNR TYPE KUNNR
* | [--->] I_VBELN TYPE VBELN(optional)
* | [--->] T_BSEG TYPE BSEG_T
* | [--->] T_BSEG_N TYPE BSEG_T(optional)
* | [--->] T_AUSZ3 TYPE RE_T_EX_AUSZ3(opti
onal)
* | [--->] T_DOCNUM TYPE IDMX_CFDI_STAT_LOG
_MX_T(optional)
* | [--->] I_TIPO TYPE CHAR1
* | [--->] T_CHEQUE TYPE ZFI_TT_CHEQUE_CFDI
(optional)
* | [--->] T_SPEI TYPE STRING(optional)
* | [--->] T_TRANSFER TYPE ZFI_TT_TRANSFER_CFD
I(optional)
* | [--->] I_DOC_SUSTITUIR TYPE ZFI_E_DOC_SUST(opti
onal)
* | [--->] I_DOCS_SUSTI TYPE ZFI_EDVAL_T(optiona
l)
* | [--->] I_STATUS TYPE ZFI_E_STATUS(optio
nal)
* | [--->] I_BANK_V TYPE CHAR3(optional)
* | [--->] T_NUMTARJ TYPE ZFI_TT_TARJETA_CFD
I(optional)
* | [<---] E_XML TYPE XSTRING
* | [<---] E_MESSAGE TYPE STRING
* | [<---] E_PAGOS TYPE ZFIFES_PAGOS_T
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI(
optional)
* | [<-->] T_DATA_ADIC TYPE ZFI_TT_PAGO_ADIC(op
tional)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD process_data.
DATA: ls_pagos TYPE zfifes_pagos, "zsdfes_pagos, "<-- MODIFICA
DO POR DEML 10.01.2018 POR F-802
ls_pago TYPE zsdfes_pago,
ls_doctorelacionado TYPE zsdfes_doctorelacionado,
ls_concepto TYPE zsdfes_conceptos,
ls_fi_pagos TYPE zfi_t_pagos_cfdi,
ls_fi_pago_adic TYPE zfi_t_pago_adic,
ls_knb1 TYPE knb1,
lv_pagos TYPE string,
lv_adrnr TYPE ad_addrnum,
lv_pais TYPE banks,
lv_land1 TYPE land1,
lv_stcd1 TYPE stcd1,
lv_paval TYPE paval,
lv_regfis TYPE paval,
lv_pac_test TYPE tvarv_val,
lv_rfc_pac TYPE c LENGTH 15,
lv_name_pac TYPE c LENGTH 50,
lv_sello_pac TYPE c LENGTH 1,
lv_zterm TYPE dzterm,
* lv_xsplt TYPE t052-xsplt,
* lv_zwels_sat TYPE zsd_e_zwels_sat,
lv_string TYPE string,
lv_message TYPE string,
lv_uuid_pag TYPE zfi_e_uuid,
lo_oref TYPE REF TO cx_root,
z_long TYPE i,
z_chain TYPE string,
z_sign TYPE string,
z_certif TYPE string,
z_nocertif TYPE string.
DATA:
lw_objetoimp TYPE c LENGTH 2,
lw_objetoimp01 TYPE c LENGTH 2 VALUE '01',
lw_objetoimp02 TYPE c LENGTH 2 VALUE '02'.

*** Transformacion
DATA: z_xml_file TYPE xstring,
zcl_ixml TYPE REF TO if_ixml,
zcl_streamfactory TYPE REF TO if_ixml_stream_factory,
zcl_encoding TYPE REF TO if_ixml_encoding,
zcl_ixml_ostream TYPE REF TO if_ixml_ostream.

DATA: ls_e1edmxcfdik01 TYPE e1edmxcfdik01,


ls_e1edmxcfdik06 TYPE e1edmxcfdik06,
ls_e1edmxcfdistamp TYPE e1edmxcfdistamp,
ls_e1edkt1 TYPE e1edkt1,
ls_e1edkt2 TYPE e1edkt2,
ls_vbrk TYPE vbrk,
ls_bseg_fi TYPE bseg.

DATA: lt_emisor TYPE STANDARD TABLE OF adrc,


lt_receptor TYPE STANDARD TABLE OF adrc,
lt_parcial TYPE STANDARD TABLE OF zfi_t_pagos_cfdi,
lt_line_rt TYPE TABLE OF tline,
ls_thead TYPE thead.

DATA: lt_concepto TYPE STANDARD TABLE OF zsdfes_conceptos,


lt_bseg TYPE STANDARD TABLE OF bseg,
lt_bseg_nc TYPE STANDARD TABLE OF bseg,
lt_edid4 TYPE STANDARD TABLE OF edid4,
lt_edid4_r TYPE STANDARD TABLE OF edid4,
lt_parser_s TYPE zfi_tt_abap_xmltb.
* lt_parser TYPE zabap_xmltb.

DATA: lt_pagos TYPE STANDARD TABLE OF zfifes_pagos, "zsdfes_pagos, "<-


- MODIFICADO POR DEML 10.01.2018 POR F-802
lv_is_sello TYPE string, " Sello para PDF
lv_is_cad TYPE string. " Cadena Original para PDF

DATA: lv_tzone TYPE tznzonedef,


lv_adrnr_d TYPE adrnr,
lv_conv TYPE tzonref-tstamps,
lv_tzone1 TYPE tzonref-tzone,
lv_date TYPE sy-datlo,
lv_time TYPE sy-timlo,
lv_payterm TYPE cfdi_payterm_code,
lv_fact_fi TYPE c,
lv_blart TYPE bkpf-blart,
lv_waers TYPE bkpf-waers,
lv_kursf TYPE bkpf-kursf,
lv_awkey TYPE bkpf-awkey.
*** AGREGADO POR DEML 10.01.2019 POR F-802
DATA: ls_uuidrel TYPE zfi_uuid_reltab,
wa_uuidrel TYPE zfi_uuid_reltab_s,
wa_docsust TYPE zfi_edval.
DATA:
lt_impuestosdr TYPE zsdftt_impuestosdr,
lt_trasladosp TYPE zsdftt_trasladosp,
lt_impuestosdr_hd TYPE TABLE OF zsdfes_traslados,
lt_total_impuestosdr TYPE TABLE OF zsdfes_traslados,
lw_total_impuestosdr TYPE zsdfes_traslados.
"Asigno los ImpuestosP -> TrasladosP.
DATA:
lw_basedr TYPE netwr,
lw_impuestodr TYPE c LENGTH 10,
lw_tipofactordr TYPE c LENGTH 10,
lw_tasaocuotadr(10) TYPE p DECIMALS 6,
lw_importedr TYPE netwr,
lw_basedr2 TYPE netwr,
lw_impuestodr2 TYPE c LENGTH 10,
lw_tipofactordr2 TYPE c LENGTH 10,
lw_tasaocuotadr2 TYPE netwr,
lw_importedr2 TYPE netwr,
lv_dmbtr TYPE dmbtr.

DATA: lt_datos TYPE STANDARD TABLE OF zfi_t_pagos_cfdi.


*** FIN AGREGADO

CONSTANTS: c_test_pac TYPE string VALUE 'IDMX_TEST_PAC',


c_cuenta TYPE string VALUE 'Cuenta',
c_certificado TYPE string VALUE 'numeroCertificado',
c_cadena TYPE string VALUE 'cadenaCDA',
c_sello TYPE string VALUE 'sello',
c_montopago TYPE string VALUE 'MontoPago',
c_banemi TYPE string VALUE 'BancoEmisor'.

FIELD-SYMBOLS: <fs_bseg> TYPE bseg,


<fs_bseg_n> TYPE bseg,
<fs_parcial> TYPE zfi_t_pagos_cfdi,
<fs_emisor> TYPE adrc,
<fs_receptor> TYPE adrc,
<fs_edid4> TYPE edid4,
<fs_aux> TYPE edid4,
<fs_docnum> TYPE cfdi_stat_log_mx,
<fs_parser_s> TYPE zfi_st_smum_xmltb,
* <fs_parser> TYPE smum_xmltb,
<fs_adic> TYPE zfi_t_pago_adic,
<fs_transfer> TYPE zfi_s_transfer_cfdi,
<fs_cheque> TYPE zfi_s_cheque_cfdi,
<fs_lines_rt> TYPE tline,
<fs_dynpro> LIKE lt_datos.
* INI FCR Cambios Complemento de Pago CFDI4.0 ***
DATA: tl_edidd TYPE STANDARD TABLE OF edidd.
DATA:
lt_10_stax TYPE STANDARD TABLE OF ze1edmxcfdik33_10_stax,
lt_10_stax_hd TYPE STANDARD TABLE OF ze1edmxcfdik33_10_stax,
lt_10_stax_de TYPE STANDARD TABLE OF ze1edmxcfdik33_10_stax,
ls_10_stax TYPE e1edmxcfdik33_10_stax, "Manda DUMP por el tañaño
ls_10_stax2 TYPE ze1edmxcfdik33_10_stax,
ls_11_tax TYPE e1edmxcfdik11_tax.

DATA: ls_impuestosdr TYPE zsdfes_impuestosdr,


ls_trasladosdr TYPE zsdfes_trasladosdr,
ls_trasladosp TYPE zsdfes_trasladosp.
DATA: tl_trasp TYPE STANDARD TABLE OF zsdfes_traslados,
sl_trasp TYPE zsdfes_traslados.
DATA car TYPE c LENGTH 4.
DATA sl_trasladop TYPE zsdfes_trasladosp.
DATA:
lt_zsdftt_trasladosp TYPE zsdftt_trasladosp,
lw_tot_fact TYPE netwr,
lw_porcen(16) TYPE p DECIMALS 10, "AKKUR,
lw_base(16) TYPE p DECIMALS 10,
lw_base2(16) TYPE p DECIMALS 10,
lw_base_2dec TYPE netwr, "lw_base2
TYPE netwr,
lw_rate TYPE p DECIMALS 3,"netwr, " se modifica tema de
decimales nmontero 30.09.2023 F1425994-22
lw_stax_amount(16) TYPE p DECIMALS 10,
lw_stax_amount_2dec TYPE netwr,
lw_stax_amount2(16) TYPE p DECIMALS 10,
lw_stax_rate(16) TYPE p DECIMALS 10, "AKKUR,
lw_stax_rate2(16) TYPE p DECIMALS 10,
lv_totreteniva TYPE netwr,
lv_totretenisr TYPE netwr,
lv_totretenieps TYPE netwr,
lv_tottrasbaseiva16 TYPE netwr,
lv_tottrasimpuestoiva16 TYPE netwr,
lv_tottrasbaseiva8 TYPE netwr,
lv_tottrasimpuestoiva8 TYPE netwr,
lv_tottrasbaseiva0 TYPE netwr,
lv_tottrasimpuestoiva0 TYPE netwr,
lv_tottrasbaseivaexento TYPE netwr,
lv_montototalpagos TYPE netwr,
lw_basex TYPE netwr,
lw_tax TYPE netwr,
lw_taxbueno TYPE netwr.
DATA:
lv_string2 TYPE string,
lv_name TYPE string,
z_xml_file2 TYPE xstring.
"------------------------------------------------------------------------
--------------------

*Extraer datos de la Sociedad


SELECT SINGLE adrnr INTO lv_adrnr FROM t001
WHERE bukrs = i_bkpf-bukrs.

SELECT SINGLE paval INTO lv_paval FROM t001z


WHERE bukrs = i_bkpf-bukrs
AND party = 'MX_RFC'.

SELECT SINGLE paval INTO lv_regfis FROM t001z


WHERE bukrs = i_bkpf-bukrs
AND party = 'CFDITR'.

SELECT * INTO TABLE lt_emisor FROM adrc


WHERE addrnumber = lv_adrnr.

"* LLenamos los datos de Pagos


"* INI CPB Cambios Complemento de Pago CFDI4.0 ***
FREE lt_total_impuestosdr.
ASSIGN ('(ZFI_PR_PAGOS_CFDI)LT_DATOS') TO <fs_dynpro>.

IF <fs_dynpro> IS ASSIGNED.
lt_datos[] = <fs_dynpro>.
SORT lt_datos BY vbeln.

IF lt_datos[] IS NOT INITIAL.


"Facturas SD
SELECT vbeln, netwr, mwsbk
FROM vbrk
INTO TABLE @DATA(lt_vbrk_hd)
FOR ALL ENTRIES IN @lt_datos
WHERE vbeln EQ @lt_datos-vbeln
ORDER BY PRIMARY KEY.
"Entonces buscar la factura FI.
IF sy-subrc EQ 4.

ENDIF.

SELECT bukrs, belnr, gjahr,


buzei, bschl, koart,
shkzg, dmbtr
FROM bseg
INTO TABLE @DATA(lt_bseg_hd)
FOR ALL ENTRIES IN @lt_datos
WHERE belnr EQ @lt_datos-vbeln
AND bukrs EQ @lt_datos-bukrs
AND gjahr EQ @lt_datos-gjahrf
ORDER BY PRIMARY KEY.
ENDIF.
ENDIF.

ls_pagos-version = '4.0'.
ls_pagos-versionp = '2.0'.
ls_pagos-exportacion = '01'.
"* FIN CPB Cambios Complemento de Pago CFDI4.0 ***

********************************************************************
*Recuperacion de tiempo
*--->Recupera Zona Hr Central
SELECT SINGLE tzonedef INTO lv_tzone
FROM ttzcu.
*--->Recupera la Zona horario de la region - Sociedad
SELECT SINGLE adrnr INTO lv_adrnr_d
FROM t001
WHERE bukrs = i_bkpf-bukrs. "'0822'.
IF sy-subrc EQ 0.
SELECT SINGLE time_zone
FROM adrc INTO lv_tzone1
WHERE addrnumber = lv_adrnr_d.
ENDIF.

*--->Recupera la zona Horario Central


CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
EXPORTING
i_datlo = sy-datum
i_timlo = sy-uzeit
i_tzone = lv_tzone
IMPORTING
e_timestamp = lv_conv.

*--->Recupera Hora y Fecha de Zona MX


CALL FUNCTION 'IB_CONVERT_FROM_TIMESTAMP'
EXPORTING
i_timestamp = lv_conv
i_tzone = lv_tzone1
IMPORTING
e_datlo = lv_date
e_timlo = lv_time.

CONCATENATE lv_date(4) '-' lv_date+4(2) '-' lv_date+6(2) 'T'


lv_time(2) ':' lv_time+2(2) ':' lv_time+4(2)
INTO ls_pagos-fecha.

ls_pagos-serie = i_bkpf-blart.
ls_pagos-folio = i_bkpf-belnr.
ls_pagos-tipodecomprobante = 'P'.
ls_pagos-subtotal = '0'.
ls_pagos-total = '0'.
ls_pagos-moneda = 'XXX'.
* EMISOR
READ TABLE lt_emisor ASSIGNING <fs_emisor> INDEX 1.
IF sy-subrc EQ 0.
IF lv_rfc_pac IS NOT INITIAL.
ls_pagos-emisor-rfc = lv_rfc_pac.
ls_pagos-emisor-nombre = lv_name_pac.
ELSE.
ls_pagos-emisor-rfc = lv_paval.
CONCATENATE <fs_emisor>-name1 <fs_emisor>-name2 INTO
ls_pagos-emisor-nombre SEPARATED BY space.
ENDIF.
ls_pagos-emisor-regimenfiscal = lv_regfis.
ls_pagos-lugarexpedicion = <fs_emisor>-post_code1.

ENDIF.

READ TABLE t_bseg ASSIGNING <fs_bseg> WITH KEY bschl = '15'


koart = 'D'.

* RECEPTOR
SELECT SINGLE land1 adrnr stcd1 INTO (lv_land1, lv_adrnr, lv_stcd1)
FROM kna1
WHERE kunnr = i_kunnr.
IF sy-subrc EQ 0.
SELECT * INTO TABLE lt_receptor FROM adrc
WHERE addrnumber = lv_adrnr.

ls_pagos-receptor-rfc = lv_stcd1.

READ TABLE lt_receptor ASSIGNING <fs_receptor> INDEX 1.


IF sy-subrc EQ 0.
CONCATENATE <fs_receptor>-name1 <fs_receptor>-name2 INTO
ls_pagos-receptor-nombre SEPARATED BY space.
ENDIF.
* INI FCR Cambios Complemento de Pago CFDI4.0 ***
* ls_pagos-receptor-usocfdi = 'P01'.
ls_pagos-receptor-usocfdi = 'CP01'.

SELECT SINGLE *
FROM kna1
INTO @DATA(ls_kna1)
WHERE kunnr EQ @i_kunnr.
IF sy-subrc EQ 0.
ls_pagos-receptor-regimenfiscalreceptor = ls_kna1-konzs.
ls_pagos-receptor-domiciliofiscalreceptor = ls_kna1-pstlz.
ENDIF.

* FIN FCR Cambios Complemento de Pago CFDI4.0 ***


IF lv_land1 <> 'MX'. "Se debe mandar estos 2 valores
ls_pagos-receptor-numregidtrib = ''.
ls_pagos-receptor-residenciafiscal = ''.
ENDIF.
ENDIF.

ls_concepto-claveprodserv = '84111506'.
ls_concepto-cantidad = 1.
ls_concepto-claveunidad = 'ACT'.
ls_concepto-descripcion = 'Pago'.
ls_concepto-valorunitario = '0'.
ls_concepto-importe = '0'.
ls_concepto-objetoimp = '01'. "1 No objeto de impuesto ok 202302
10

CONDENSE ls_concepto-claveprodserv.
CONDENSE ls_concepto-cantidad.
CONDENSE ls_concepto-claveunidad.
CONDENSE ls_concepto-descripcion.
CONDENSE ls_concepto-valorunitario.
CONDENSE ls_concepto-importe.
CONDENSE ls_concepto-objetoimp.
APPEND ls_concepto TO lt_concepto.

ls_pagos-conceptos[] = lt_concepto[].

" FechaPago
*--->Recupera la zona Horario Central
CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
EXPORTING
i_datlo = i_bkpf-budat
i_timlo = i_bkpf-cputm
i_tzone = lv_tzone
IMPORTING
e_timestamp = lv_conv.

*--->Recupera Hora y Fecha de Zona MX


CALL FUNCTION 'IB_CONVERT_FROM_TIMESTAMP'
EXPORTING
i_timestamp = lv_conv
i_tzone = lv_tzone1
IMPORTING
e_datlo = lv_date
e_timlo = lv_time.

CONCATENATE lv_date(4) '-' lv_date+4(2) '-' lv_date+6(2) 'T'


lv_time(2) ':' lv_time+2(2) ':' lv_time+4(2)
INTO ls_pago-fechapago.

" MonedaP.
ls_pago-monedap = i_bkpf-waers.

" TipoCambioP.
IF i_bkpf-kursf NE 0.
ls_pago-tipocambiop = i_bkpf-kursf.
ELSE.
DATA lv_ukurs TYPE ukurs_curr.

SELECT SINGLE ukurs


FROM tcurr
INTO lv_ukurs
WHERE kurst EQ 'M'
AND fcurr EQ i_bkpf-waers
AND tcurr EQ 'MXN'
AND gdatu EQ i_bkpf-budat.

IF sy-subrc EQ 0.
ls_pago-tipocambiop = lv_ukurs.
ENDIF.
ENDIF.

" CtaBeneficiario
DATA: lv_hbkid TYPE hbkid,
lv_bankn TYPE bankn,
lv_clabe TYPE bnkn2,
lv_hkont TYPE hkont,
lv_strlen TYPE i.

DATA: lv_bankl_cb TYPE bankl,


lv_adrnr_cb TYPE ad_addrnum,
ls_adrct_cb TYPE adrct.

FIELD-SYMBOLS: <fs_bseg_i1> TYPE bseg.

READ TABLE t_bseg[] ASSIGNING <fs_bseg_i1> WITH KEY buzei = '001'.


* INDEX 1.

IF <fs_bseg_i1> IS ASSIGNED.
" Monto
ls_pago-monto = <fs_bseg_i1>-wrbtr.

* Obteniendo la cuenta del banco en la que se hizo el registro


* del cobro
lv_hkont = <fs_bseg_i1>-hkont.
lv_strlen = strlen( lv_hkont ).
lv_strlen = lv_strlen - 1.

CONCATENATE lv_hkont(lv_strlen) '0'


INTO lv_hkont.

SELECT SINGLE hbkid bankn bnkn2


FROM t012k
INTO (lv_hbkid , lv_bankn, lv_clabe)
WHERE bukrs EQ i_bkpf-bukrs
AND hkont EQ lv_hkont.
* Esta cuenta debe validar contra el SPEI si se
* selecciono esta opcion.
IF sy-subrc EQ 0.
IF i_tipo NE 1.
*** ls_pago-ctabeneficiario = lv_bankn.
*--->Recuperacion de RFC Cuenta Beneficiario
SELECT SINGLE bankl
FROM t012
INTO lv_bankl_cb
WHERE bukrs EQ i_bkpf-bukrs
AND hbkid EQ lv_hbkid.
IF sy-subrc EQ 0.
SELECT SINGLE adrnr
FROM bnka
INTO lv_adrnr_cb
WHERE banks EQ 'MX'
AND bankl EQ lv_bankl_cb.
IF sy-subrc EQ 0.
SELECT SINGLE *
FROM adrct
INTO ls_adrct_cb
WHERE addrnumber EQ lv_adrnr_cb.
" RfcEmisorCtaBen
ls_pago-rfcemisorctaben = ls_adrct_cb-remark.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

" NumOperacion
IF <fs_bseg_i1> IS ASSIGNED.
ls_pago-numoperacion = <fs_bseg_i1>-zuonr.
ls_doctorelacionado-metododepagodr = <fs_bseg_i1>-zterm.
ENDIF.

CLEAR lv_adrnr.
DATA: lv_banka TYPE c LENGTH 300,
ls_adrct TYPE adrct.
IF ( i_tipo = 2 OR i_tipo = 3 ).
IF i_bank_v IS NOT INITIAL.
" RfcEmisorCtaOrd

READ TABLE t_transfer ASSIGNING <fs_transfer> INDEX 1.


IF sy-subrc EQ 0.
lv_pais = <fs_transfer>-banks.
ELSE.
READ TABLE t_cheque ASSIGNING <fs_cheque> INDEX 1.
IF sy-subrc EQ 0.
lv_pais = <fs_cheque>-pais_banco.
ENDIF.
ENDIF.
SELECT SINGLE banka adrnr FROM bnka INTO (lv_banka , lv_adrnr)
WHERE banks EQ lv_pais
AND bankl EQ i_bank_v.

SELECT SINGLE * FROM adrct INTO ls_adrct


WHERE addrnumber EQ lv_adrnr.

ls_pago-rfcemisorctaord = ls_adrct-remark.
" NomBancoOrdExt
TRANSLATE lv_banka TO UPPER CASE.

CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'


EXPORTING
intext = lv_banka
IMPORTING
outtext = lv_banka
EXCEPTIONS
invalid_codepage = 1
codepage_mismatch = 2
internal_error = 3
cannot_convert = 4
fields_not_type_c = 5
OTHERS = 6.

REPLACE ALL OCCURRENCES OF '.' IN lv_banka WITH space.

ls_pago-nombancoordext = lv_banka.
ENDIF.
ENDIF.

CASE i_tipo.
WHEN '1'. "Efectivo
ls_pago-formadepagop = '01'.
ls_fi_pago_adic-tipo = '1'.
ls_pago-ctabeneficiario = ''.
ls_pago-rfcemisorctaord = ''.
ls_pago-rfcemisorctaben = ''.
WHEN '2'. "Cheque
ls_pago-formadepagop = '02'.
ls_fi_pago_adic-tipo = '2'.
WHEN '3'. "Transferencia
ls_pago-formadepagop = '03'.
ls_fi_pago_adic-tipo = '3'.
WHEN '4'.
ls_pago-formadepagop = '04'.
ls_fi_pago_adic-formadepago = '04'.
ls_fi_pago_adic-tipo = '4'.
WHEN '5'.
ls_pago-formadepagop = '28'.
ls_fi_pago_adic-formadepago = '28'.
ls_fi_pago_adic-tipo = '5'.
ENDCASE.

* LLenamos datos del cheque


DATA: lv_remark TYPE ad_remark1.

IF i_tipo = 2.
LOOP AT t_cheque ASSIGNING <fs_cheque>.
ls_pago-ctaordenante = <fs_cheque>-cuenta_emisor.
ls_pago-numoperacion = <fs_cheque>-numero_cheque.
SELECT SINGLE adrnr INTO lv_adrnr FROM bnka
WHERE banks = <fs_cheque>-pais_banco
AND bankl = <fs_cheque>-banco.
SELECT SINGLE remark INTO lv_remark FROM adrct
WHERE addrnumber = lv_adrnr
AND langu = sy-langu.
IF sy-subrc EQ 0.
ls_pago-rfcemisorctaord = lv_remark.
ENDIF.
ENDLOOP.
ENDIF.

** PAGO CON TARJETA


DATA: ls_numtarj TYPE zfi_s_tarjeta_cfdi.
CLEAR ls_numtarj.

IF ( i_tipo = 4 OR i_tipo = 5 ).
READ TABLE t_numtarj INTO ls_numtarj INDEX 1.
IF sy-subrc = 0.
ls_pago-ctaordenante = ls_numtarj-numtarjeta.
ls_fi_pago_adic-banco = ls_numtarj-bankl.
ls_pago-formadepagop = ls_numtarj-formapagop.
ls_fi_pago_adic-formadepago = ls_numtarj-formapagop.
ls_fi_pago_adic-numoperacion = ls_numtarj-referencia.
ls_pago-numoperacion = ls_numtarj-referencia.

SELECT SINGLE adrnr INTO lv_adrnr FROM bnka


WHERE banks = ls_numtarj-banks
AND bankl = ls_numtarj-bankl.
IF sy-subrc EQ 0.
SELECT SINGLE remark INTO lv_remark FROM adrct
WHERE addrnumber = lv_adrnr
AND langu = sy-langu.
IF sy-subrc EQ 0.
ls_pago-rfcemisorctaord = lv_remark.
ls_fi_pago_adic-rfcemisorctaord = lv_remark.
ENDIF .
ENDIF.
ENDIF.
ENDIF.

"* Ejecutamos el Parse al XML de SPEI para obtener los datos necesarios
"* o en caso de transfer mismo banco, tomamos los datos de t_transfer
IF i_tipo = 3.
IF t_spei IS NOT INITIAL AND t_transfer[] IS INITIAL.
lv_string = t_spei.
ls_pago-tipocadpago = '01'.

me->parser_xml_spei( EXPORTING i_xml = lv_string


CHANGING t_parser = lt_parser_s ).
"* Se deben llenar algunos campos con la información del XML
READ TABLE lt_parser_s ASSIGNING <fs_parser_s> WITH KEY cname = c_cuen
ta.
IF sy-subrc EQ 0.
IF ( <fs_parser_s>-cvalue = lv_clabe OR <fs_parser_s>-cvalue+6(11) =
lv_bankn ).
ls_pago-ctaordenante = <fs_parser_s>-cvalue.
ELSE.
e_message = text-e01.
ENDIF.
ENDIF.

READ TABLE lt_parser_s ASSIGNING <fs_parser_s> WITH KEY cname = c_mont


opago.
IF sy-subrc EQ 0.
IF <fs_parser_s>-cvalue <> ls_pago-monto.
e_message = text-e02.
ENDIF.
ENDIF.

READ TABLE lt_parser_s ASSIGNING <fs_parser_s> WITH KEY cname = c_cert


ificado.
IF sy-subrc EQ 0.
ls_pago-certpago = <fs_parser_s>-cvalue.
ENDIF.

READ TABLE lt_parser_s ASSIGNING <fs_parser_s> WITH KEY cname = c_cade


na.
IF sy-subrc EQ 0.
DATA lv_cadstring TYPE string.
lv_cadstring = <fs_parser_s>-cvalue.
ls_pago-cadpago = cl_http_utility=>encode_base64( lv_cadstring ).
ENDIF.

READ TABLE lt_parser_s ASSIGNING <fs_parser_s> WITH KEY cname = c_sell


o.
IF sy-subrc EQ 0.
ls_pago-sellopago = <fs_parser_s>-cvalue.
REPLACE ALL OCCURRENCES OF '|' IN ls_pago-sellopago WITH space.
ENDIF.

LOOP AT lt_parser_s ASSIGNING <fs_parser_s> WHERE cname = c_cuenta.


IF ls_pago-ctabeneficiario IS INITIAL.
ls_pago-ctabeneficiario = <fs_parser_s>-cvalue.
ELSE.
ls_pago-ctaordenante = <fs_parser_s>-cvalue.
ENDIF.
ENDLOOP.

READ TABLE lt_parser_s ASSIGNING <fs_parser_s> WITH KEY cname = c_bane


mi.
IF sy-subrc EQ 0.
ls_pago-nombancoordext = <fs_parser_s>-cvalue.
ENDIF.

* ELSE.
ELSEIF t_transfer[] IS NOT INITIAL .
LOOP AT t_transfer ASSIGNING <fs_transfer>.
ls_pago-ctaordenante = <fs_transfer>-bankn.
ls_pago-numoperacion = <fs_transfer>-referencia.
SELECT SINGLE adrnr INTO lv_adrnr FROM bnka
WHERE banks = <fs_transfer>-banks
AND bankl = <fs_transfer>-bankl.
SELECT SINGLE remark INTO lv_remark FROM adrct
WHERE addrnumber = lv_adrnr
AND langu = sy-langu.
IF sy-subrc EQ 0.
ls_pago-rfcemisorctaord = lv_remark.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.

"* Si el tipo es C, significa que es una cancelación NUEVA y debe tomar


se info de ZFI_T_PAGO_ADIC.
IF i_tipo = 'C'.
READ TABLE t_data_adic ASSIGNING <fs_adic> INDEX 1.
IF sy-subrc = 0.
CASE <fs_adic>-tipo.
WHEN '1'.
ls_pago-formadepagop = '01'.
WHEN '2'.
ls_pago-formadepagop = '02'.
ls_pago-numoperacion = <fs_adic>-numoperacion.
ls_pago-ctaordenante = <fs_adic>-ctaordenante.
ls_pago-rfcemisorctaord = <fs_adic>-rfcemisorctaord.
WHEN '3'.
ls_pago-formadepagop = '03'.
ls_pago-ctaordenante = <fs_adic>-ctaordenante.
ls_pago-numoperacion = <fs_adic>-numoperacion.
ls_pago-certpago = <fs_adic>-certpago.
ls_pago-cadpago = <fs_adic>-cadpago.
ls_pago-sellopago = <fs_adic>-sellopago.
WHEN '4' OR '5'.
IF <fs_adic>-tipo = '4'.
ls_pago-formadepagop = '04'.
ELSE.
ls_pago-formadepagop = '28'.
ENDIF.
ls_pago-ctaordenante = <fs_adic>-ctaordenante.
ls_pago-rfcemisorctaord = <fs_adic>-rfcemisorctaord.
ENDCASE.
ENDIF.

" *********************************************************************
*
" *** SEGMENTO MODIFICADO POR DEML 10.01.2019 POR F-802
***
"*** CÓDIGO PREVIO COMENTADO CON 3 '*'
***
"**********************************************************************
"* SE LLENA EL TAG DE RELACIONADOS, CON EL UUID DE PAGO DEL DOCTO
"* QUE SE ESTA CANCELANDO
READ TABLE t_parcial ASSIGNING <fs_parcial> INDEX 1.
IF sy-subrc EQ 0.
ls_pagos-relacionados-tiporelacion = '04'.
*** ls_pagos-relacionados-uuid = <fs_parcial>-uuid_pago.
MOVE <fs_parcial>-uuid_pago TO wa_uuidrel-uuid_r.
APPEND wa_uuidrel TO ls_uuidrel[].
CLEAR wa_uuidrel.
ls_pagos-relacionados-uuid[] = ls_uuidrel[].
ENDIF.
ls_pago-monto = 0.
ENDIF.

IF i_docs_susti[] IS NOT INITIAL.


ls_pagos-relacionados-tiporelacion = '04'.
LOOP AT i_docs_susti INTO wa_docsust.
READ TABLE ls_uuidrel INTO wa_uuidrel WITH KEY uuid_r = wa_docsust-
uuid_pago.
IF sy-subrc <> 0.
MOVE wa_docsust-uuid_pago TO wa_uuidrel.
APPEND wa_uuidrel TO ls_uuidrel[].
CLEAR wa_uuidrel.
ENDIF.
ENDLOOP.
ls_pagos-relacionados-uuid[] = ls_uuidrel[].
ENDIF.

MOVE-CORRESPONDING ls_pago TO ls_fi_pago_adic.


SORT t_parcial BY vbeln ASCENDING parcialidad DESCENDING.
"* Llenar los Relacionados
lt_bseg[] = t_bseg[].

lt_bseg_nc[] = t_bseg[].
SORT lt_bseg_nc BY rebzg.

LOOP AT lt_bseg ASSIGNING <fs_bseg> WHERE rebzg IS NOT INITIAL


AND shkzg = 'S'.
"* Determinar si es factura SD o NC Financiera.
CLEAR: lv_fact_fi, lv_awkey.
IF <fs_bseg>-vbeln IS INITIAL.
ls_doctorelacionado-serie = 'A'.
SELECT SINGLE blart waers kursf awkey
FROM bkpf
INTO (lv_blart, lv_waers, lv_kursf, lv_awkey)
WHERE bukrs EQ i_bkpf-bukrs
AND belnr EQ <fs_bseg>-rebzg
AND gjahr EQ <fs_bseg>-rebzj.
IF lv_awkey IS NOT INITIAL.
<fs_bseg>-vbeln = lv_awkey.
ELSE.
<fs_bseg>-vbeln = <fs_bseg>-rebzg.
lv_fact_fi = abap_true.
ENDIF.
ELSE.
ls_doctorelacionado-serie = 'B'.
ENDIF.

ls_doctorelacionado-equivalenciadr = '1'. "CR 20221222


ls_doctorelacionado-tipocambiop = '1'. "CR 20221222

"* buscar si ya tiene pagos la factura


READ TABLE t_data_adic ASSIGNING <fs_adic> WITH KEY vbeln = <fs_bseg>-
vbeln
gjahrf = <fs_bseg>-
rebzj.

READ TABLE t_parcial ASSIGNING <fs_parcial> WITH KEY vbeln = <fs_bseg>-


vbeln
gjahrf = <fs_bseg>-
rebzj.
IF sy-subrc EQ 0.
ls_doctorelacionado-iddocumento = <fs_parcial>-uuid_fact.
SPLIT <fs_parcial>-xblnr AT '-' INTO ls_doctorelacionado-serie
ls_doctorelacionado-folio.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'


EXPORTING
input = ls_doctorelacionado-folio
IMPORTING
output = ls_doctorelacionado-folio.

ls_doctorelacionado-monedadr = <fs_parcial>-moneda.

IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = '1'. "<fs_parcial>-
tipocambio'.
ENDIF.
ls_doctorelacionado-metododepagodr = 'PPD'."RRR:Valor marcado como
Fijo PPD

IF ( i_tipo <> 'C' AND i_status <> 'R' ).


ls_doctorelacionado-numparcialidad = <fs_parcial>-parcialidad + 1.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.

ls_doctorelacionado-impsaldoant = <fs_parcial>-s_insoluto.

LOOP AT t_bseg_n[] ASSIGNING <fs_bseg_n>


WHERE bschl EQ '08'
AND ( rebzg EQ <fs_bseg>-rebzg OR rebzg EQ lv_awkey OR reb
zg EQ <fs_bseg>-vbeln ).

ls_doctorelacionado-impsaldoant = ls_doctorelacionado-impsaldoant
- <fs_bseg_n>-dmbtr.
<fs_bseg>-wrbtr = <fs_bseg>-wrbtr - <fs_bseg_n>-wrbtr.
ENDLOOP.

ls_doctorelacionado-imppagado = <fs_bseg>-wrbtr.
ls_doctorelacionado-impsaldoinsoluto = ls_doctorelacionado-
impsaldoant - <fs_bseg>-wrbtr. "CPB 20230331 manda mal el campo, no timbra

ELSEIF ( i_tipo = 'C' OR i_status = 'R' ).


ls_doctorelacionado-numparcialidad = <fs_parcial>-parcialidad.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.

ls_doctorelacionado-impsaldoant = <fs_parcial>-s_anterior.
ls_doctorelacionado-imppagado = <fs_parcial>-s_pagado.
ls_doctorelacionado-impsaldoinsoluto = <fs_parcial>-s_insoluto.
"CPB 20230331 manda mal el campo, no timbra
ENDIF.

IF lv_rfc_pac IS NOT INITIAL.


ls_pagos-nocertificado = text-p01. "Certificado del PAC para test
ELSE.
IF <fs_adic> IS ASSIGNED.
ls_pagos-certificado = <fs_adic>-certificado.
ls_pagos-nocertificado = <fs_adic>-nocertificado.
ls_pagos-sello = <fs_adic>-sello.
ENDIF.
ENDIF.

"**************************
"** Facturas FINANCIERAS. LLena todos los campos mas los nuevos.
"**************************
"* Buscar el IDOC S y A para obtener los datos requeridos
READ TABLE t_docnum ASSIGNING <fs_docnum> WITH KEY status = 'S'
refdoc = <fs_bseg>-
vbeln
gjahr = <fs_bseg>-
rebzj.
IF sy-subrc EQ 0.
"Comentado por issue en PRO, mueve otro UUID.
"ls_doctorelacionado-iddocumento = <fs_docnum>-sellocfd_guid. "
CPB
SELECT * FROM edid4
INTO TABLE lt_edid4
WHERE docnum EQ <fs_docnum>-docnum.

READ TABLE lt_edid4[] ASSIGNING <fs_edid4> WITH KEY segnam = 'E1EDMX


CFDIK01'.
IF sy-subrc EQ 0.
ls_e1edmxcfdik01 = <fs_edid4>-sdata.
ls_doctorelacionado-monedadr = ls_e1edmxcfdik01-currency.
IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = ls_e1edmxcfdik01-
exchange_rate.
ENDIF.

SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '


'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.
ENDIF.

"* SERIE Y FOLIO


ls_doctorelacionado-folio = <fs_bseg>-vbeln.

LOOP AT lt_edid4 ASSIGNING <fs_edid4> WHERE segnam = 'E1EDKT1'.


ls_e1edkt1 = <fs_edid4>-sdata.
CASE ls_e1edkt1-tdid.
WHEN 'ECC'.
IF lv_sello_pac = 'X'.
CONCATENATE ls_pagos-sello ls_e1edkt2-tdline
INTO ls_pagos-sello.
ENDIF.
WHEN 'SNC'.
IF lv_rfc_pac IS NOT INITIAL.
ls_pagos-nocertificado = text-p01. "Certificado del PAC par
a test
ELSE.
LOOP AT lt_edid4 ASSIGNING <fs_aux> WHERE segnam = 'E1EDKT2'
AND psgnum = <fs_edid4
>-segnum.
MOVE <fs_aux>-sdata TO ls_e1edkt2.
CONCATENATE ls_pagos-nocertificado ls_e1edkt2-tdline
INTO ls_pagos-nocertificado.
ENDLOOP.
ENDIF.
WHEN 'XCB'.
IF lv_sello_pac = 'X'.
CONCATENATE ls_pagos-certificado ls_e1edkt2-tdline
INTO ls_pagos-certificado.
ENDIF.
ENDCASE.
ENDLOOP.

FREE: tl_edidd.
CALL FUNCTION 'IDOC_READ_COMPLETELY'
EXPORTING
document_number = <fs_docnum>-docnum
TABLES
int_edidd = tl_edidd
EXCEPTIONS
document_not_exist = 1
document_number_invalid = 2
OTHERS = 3.

IF sy-subrc EQ 0.
"CPB - INI - Complemento de Pago 2.0
FREE: lt_10_stax, lt_impuestosdr.
CLEAR: ls_impuestosdr.

"Get importe pagadopara desglosar importes correctos.


READ TABLE lt_datos ASSIGNING FIELD-SYMBOL(<lw_datos>)
WITH KEY vbeln = <fs_bseg>-vbeln
flag = 'X'.
"**********************************
"** Ejecuta desde el Monitor. **
"**********************************
IF sy-subrc EQ 0.
READ TABLE lt_vbrk_hd ASSIGNING FIELD-SYMBOL(<lw_vbrk_hd>)
WITH KEY vbeln = <fs_bseg>-vbeln.
IF sy-subrc EQ 0.
lw_tot_fact = <lw_vbrk_hd>-netwr + <lw_vbrk_hd>-mwsbk.
ELSE.
READ TABLE lt_bseg_hd ASSIGNING FIELD-SYMBOL(<lw_bseg_hd>)
WITH KEY belnr = <fs_bseg>-vbeln
shkzg = 'S'.
IF sy-subrc EQ 0.
lw_tot_fact = <lw_bseg_hd>-dmbtr.
ENDIF.
ENDIF.

IF lw_tot_fact GT 0.
lw_porcen = <lw_datos>-s_pagado / lw_tot_fact.
ELSE.
lw_porcen = 100.
ENDIF.
ELSE.

CLEAR lv_dmbtr.
"Obtengo importes de N.C.
LOOP AT t_bseg ASSIGNING FIELD-SYMBOL(<lw_bseg>)
WHERE rebzg EQ <fs_bseg>-vbeln
AND vbeln IS INITIAL.
READ TABLE lt_bseg_nc ASSIGNING FIELD-SYMBOL(<lw_bseg_nc>)
WITH KEY rebzg = <lw_bseg>-belnr.
IF sy-subrc EQ 0.
ADD <lw_bseg_nc>-dmbtr TO lv_dmbtr.
ENDIF.
ENDLOOP.

"Se ejecuta desde la F-28.


SELECT SINGLE netwr, mwsbk
FROM vbrk
INTO @DATA(lw_vbrk)
WHERE vbeln EQ @<fs_bseg>-vbeln.
IF sy-subrc EQ 0.
lw_tot_fact = lw_vbrk-netwr + lw_vbrk-mwsbk.
IF <fs_bseg> IS ASSIGNED.
SUBTRACT lv_dmbtr FROM <fs_bseg>-dmbtr.
ENDIF.
ELSE.
"Facturas FI. 20230321
SELECT bukrs, belnr, gjahr,
buzei, bschl, koart,
shkzg, dmbtr
FROM bseg
INTO TABLE @lt_bseg_hd
WHERE belnr EQ @<fs_bseg>-vbeln
AND bukrs EQ @<fs_bseg>-bukrs
AND gjahr EQ @<fs_bseg>-gjahr
ORDER BY PRIMARY KEY.
IF sy-subrc EQ 0.
READ TABLE lt_bseg_hd ASSIGNING <lw_bseg_hd>
WITH KEY belnr = <fs_bseg>-vbeln
shkzg = 'S'.
IF sy-subrc EQ 0.
lw_tot_fact = <lw_bseg_hd>-dmbtr.
ENDIF.
ENDIF.
ENDIF.

IF lw_tot_fact GT 0.
lw_porcen = <fs_bseg>-dmbtr / lw_tot_fact .
ELSE.
lw_porcen = 100.
ENDIF.
ENDIF.

LOOP AT tl_edidd ASSIGNING FIELD-SYMBOL(<sl_edidd>)


WHERE segnam EQ 'E1EDMXCFDIK33_10_STAX'.
CLEAR: lw_base, lw_base2, lw_stax_rate.

ls_10_stax = <sl_edidd>-sdata.
ls_10_stax-stax_base_amount = <sl_edidd>-sdata(17).
CONDENSE:
ls_10_stax-stax_base_amount,
ls_10_stax-stax_type_code,
ls_10_stax-stax_factor_type,
ls_10_stax-stax_rate,
ls_10_stax-stax_amount.

lw_base = ls_10_stax-stax_base_amount.
lw_base2 = lw_base * lw_porcen.
lw_base_2dec = lw_base2.
ls_10_stax-stax_base_amount = lw_base2.

ls_10_stax2-stax_base_amount = ls_10_stax-stax_base_amount.
ls_10_stax2-stax_type_code = ls_10_stax-stax_type_code.
ls_10_stax2-stax_factor_type = ls_10_stax-stax_factor_type.
ls_10_stax2-stax_rate = ls_10_stax-stax_rate.
ls_10_stax2-stax_amount = ls_10_stax-stax_amount.

ls_10_stax2-stax_base_amount = lw_base2.
CONDENSE ls_10_stax2-stax_base_amount.

lw_stax_rate = ls_10_stax2-stax_rate.
IF lw_stax_rate GT 0.
lw_stax_amount = lw_base_2dec * lw_stax_rate.
"lw_base2 * lw_stax_rate.
lw_stax_amount_2dec = lw_stax_amount.
ls_10_stax2-stax_amount = lw_stax_amount_2dec.
CONDENSE ls_10_stax2-stax_amount.
ENDIF.

APPEND ls_10_stax2 TO lt_10_stax.


ENDLOOP.

SORT lt_10_stax BY stax_type_code


stax_rate.
lt_10_stax_hd[] = lt_10_stax[].
lt_10_stax_de[] = lt_10_stax[].
FREE lt_10_stax.

DELETE ADJACENT DUPLICATES FROM lt_10_stax_hd COMPARING stax_type_


code
stax_rate.

LOOP AT lt_10_stax_hd ASSIGNING FIELD-SYMBOL(<lw_10_stax_hd>).


APPEND INITIAL LINE TO lt_10_stax ASSIGNING FIELD-
SYMBOL(<lt_10_stax>).
<lt_10_stax>-stax_type_code = <lw_10_stax_hd>-
stax_type_code.
<lt_10_stax>-stax_factor_type = <lw_10_stax_hd>-
stax_factor_type.
<lt_10_stax>-stax_rate = <lw_10_stax_hd>-stax_rate.
CLEAR: lw_base2, lw_stax_amount2.

LOOP AT lt_10_stax_de ASSIGNING FIELD-SYMBOL(<lw_10_stax_de>)


WHERE stax_type_code EQ <lw_10_stax_hd>-stax_type_code
AND stax_rate EQ <lw_10_stax_hd>-stax_rate.

lw_base = <lw_10_stax_de>-
stax_base_amount.
ADD lw_base TO lw_base2.

lw_stax_amount = <lw_10_stax_de>-
stax_amount.
ADD lw_stax_amount TO lw_stax_amount2.
ENDLOOP.

lw_base_2dec = lw_base2.
<lt_10_stax>-stax_base_amount = lw_base_2dec.
lw_stax_amount_2dec = lw_stax_amount2.
<lt_10_stax>-stax_amount = lw_stax_amount_2dec.
CONDENSE:
<lt_10_stax>-stax_base_amount,
<lt_10_stax>-stax_amount.
ENDLOOP.

"CPB - INI - CR Nuevos nodos.

lv_montototalpagos = ls_pago-monto.
ls_pago-tipocambiop = '1'.

"AJuste para tema del centavo.


LOOP AT lt_10_stax ASSIGNING <lt_10_stax>.
lw_basex = <lt_10_stax>-stax_base_amount.
lw_tax = <lt_10_stax>-stax_amount.
lw_rate = <lt_10_stax>-stax_rate.

lw_taxbueno = lw_basex * lw_rate.

IF lw_tax NE lw_taxbueno.
<lt_10_stax>-stax_amount = lw_taxbueno.
CONDENSE <lt_10_stax>-stax_amount NO-GAPS.
ENDIF.
ENDLOOP.

LOOP AT lt_10_stax ASSIGNING <lt_10_stax>


WHERE stax_type_code EQ '002'.

CASE <lt_10_stax>-stax_rate.
WHEN '0.000000'.
ADD <lt_10_stax>-stax_base_amount TO lv_tottrasbaseiva0.
ADD <lt_10_stax>-stax_amount TO lv_tottrasimpuestoiva
0.
WHEN '0.080000'.
ADD <lt_10_stax>-stax_base_amount TO lv_tottrasbaseiva8.
ADD <lt_10_stax>-stax_amount TO lv_tottrasimpuestoiva
8.

WHEN '0.160000'.
ADD <lt_10_stax>-stax_base_amount TO lv_tottrasbaseiva16.
ADD <lt_10_stax>-stax_amount TO lv_tottrasimpuestoiva
16.
ENDCASE.
ENDLOOP.
"CPB - FIN - CR Nuevos nodos.

LOOP AT lt_10_stax INTO ls_10_stax2.


ls_trasladosdr-trasladodr-impuestodr = ls_10_stax2-
stax_type_code.
ls_trasladosdr-trasladodr-tipofactordr = ls_10_stax2-
stax_factor_type.
ls_trasladosdr-trasladodr-tasaocuotadr = ls_10_stax2-stax_rate.
ls_trasladosdr-trasladodr-importedr = ls_10_stax2-
stax_amount.
ls_trasladosdr-trasladodr-basedr = ls_10_stax2-
stax_base_amount.
APPEND ls_trasladosdr TO lt_impuestosdr.

lw_total_impuestosdr = ls_trasladosdr-trasladodr.
APPEND lw_total_impuestosdr TO lt_total_impuestosdr.
MOVE ls_trasladosdr-trasladodr TO ls_impuestosdr-trasladosdr.

ENDLOOP.

ls_pago-impuestosdr[] = lt_impuestosdr[].
ENDIF. "CALL FUNCTION 'IDOC_READ_COMPLETELY'
"CPB - FIN - Complemento de Pago 2.0

"* SI EL IDOC NO EXISTE, ES UNA FACTURA 3.2 O DOCTO FINANCIERO


ELSE. "Recupera valores de la VBRK

SELECT SINGLE * FROM vbrk INTO ls_vbrk


WHERE vbeln EQ <fs_bseg>-vbeln.
IF sy-subrc EQ 0.
ls_doctorelacionado-monedadr = ls_vbrk-waerk.

IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = '1'. "ls_vbrk-kurrf.
ENDIF.

ls_doctorelacionado-impsaldoant = ls_vbrk-netwr + ls_vbrk-


mwsbk.
ls_doctorelacionado-numparcialidad = 1.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.
ls_doctorelacionado-folio = <fs_bseg>-vbeln.

ELSE. "Si no la encuentra en documento Financiero


"* Se deben obtener los datos de FI
ls_doctorelacionado-serie = lv_blart.
ls_doctorelacionado-folio = <fs_bseg>-vbeln.
ls_doctorelacionado-monedadr = lv_waers.
IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = '1'. "lv_kursf.
ENDIF.

SELECT SINGLE * INTO ls_bseg_fi FROM bseg


WHERE bukrs = i_bkpf-bukrs
AND belnr = <fs_bseg>-vbeln
AND gjahr = <fs_bseg>-rebzj
AND bschl = '01'
AND koart = 'D'
AND shkzg = 'S'.

ls_doctorelacionado-impsaldoant = ls_bseg_fi-wrbtr.
ls_doctorelacionado-numparcialidad = 1.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.
ENDIF.
ENDIF.

ELSE.
"**************************
"** Facturas LOGISTICAS.
"**************************
"* Buscar el IDOC S y A para obtener los datos requeridos
READ TABLE t_docnum ASSIGNING <fs_docnum> WITH KEY status = 'S'
refdoc = <fs_bseg>-
vbeln
gjahr = <fs_bseg>-
rebzj.
IF sy-subrc EQ 0.
ls_doctorelacionado-iddocumento = <fs_docnum>-sellocfd_guid. "CP
B

SELECT * FROM edid4


INTO TABLE lt_edid4
WHERE docnum EQ <fs_docnum>-docnum.

READ TABLE lt_edid4[] ASSIGNING <fs_edid4> WITH KEY segnam = 'E1EDMX


CFDIK01'.
IF sy-subrc EQ 0.
ls_e1edmxcfdik01 = <fs_edid4>-sdata.
ls_doctorelacionado-monedadr = ls_e1edmxcfdik01-currency.
IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = ls_e1edmxcfdik01-
exchange_rate.
ENDIF.
ls_doctorelacionado-impsaldoant = ls_e1edmxcfdik01-total.
ls_doctorelacionado-numparcialidad = 1.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.
ENDIF.

"* SERIE Y FOLIO


ls_doctorelacionado-folio = <fs_bseg>-vbeln.

LOOP AT lt_edid4 ASSIGNING <fs_edid4> WHERE segnam = 'E1EDKT1'.


ls_e1edkt1 = <fs_edid4>-sdata.
CASE ls_e1edkt1-tdid.
WHEN 'ECC'.
IF lv_sello_pac = 'X'.
CONCATENATE ls_pagos-sello ls_e1edkt2-tdline
INTO ls_pagos-sello.
ENDIF.
WHEN 'SNC'.
IF lv_rfc_pac IS NOT INITIAL.
ls_pagos-nocertificado = text-p01. "Certificado del PAC par
a test
ELSE.
LOOP AT lt_edid4 ASSIGNING <fs_aux> WHERE segnam = 'E1EDKT2'
AND psgnum = <fs_edid4
>-segnum.
MOVE <fs_aux>-sdata TO ls_e1edkt2.
CONCATENATE ls_pagos-nocertificado ls_e1edkt2-tdline
INTO ls_pagos-nocertificado.
ENDLOOP.
ENDIF.
WHEN 'XCB'.
IF lv_sello_pac = 'X'.
CONCATENATE ls_pagos-certificado ls_e1edkt2-tdline
INTO ls_pagos-certificado.
ENDIF.
ENDCASE.
ENDLOOP.

FREE: tl_edidd.
CALL FUNCTION 'IDOC_READ_COMPLETELY'
EXPORTING
document_number = <fs_docnum>-docnum
TABLES
int_edidd = tl_edidd
EXCEPTIONS
document_not_exist = 1
document_number_invalid = 2
OTHERS = 3.

IF sy-subrc EQ 0.
"CPB - INI - Complemento de Pago 2.0
FREE: lt_10_stax, lt_impuestosdr.
CLEAR: ls_impuestosdr.

"Get importe pagadopara desglosar importes correctos.


READ TABLE lt_datos ASSIGNING <lw_datos>
WITH KEY vbeln = <fs_bseg>-vbeln.
"Ejecuta desde el Monitor.
IF sy-subrc EQ 0.
READ TABLE lt_vbrk_hd ASSIGNING <lw_vbrk_hd>
WITH KEY vbeln = <fs_bseg>-vbeln.
IF sy-subrc EQ 0.
lw_tot_fact = <lw_vbrk_hd>-netwr + <lw_vbrk_hd>-mwsbk.
ELSE.
lw_tot_fact = <fs_bseg>-wrbtr.
ENDIF.

IF lw_tot_fact GT 0.
lw_porcen = <lw_datos>-s_pagado / lw_tot_fact.
ELSE.
lw_porcen = 100.
ENDIF.
ELSE.

CLEAR lv_dmbtr.
"Obtengo importes de N.C.
LOOP AT t_bseg ASSIGNING <lw_bseg>
WHERE rebzg EQ <fs_bseg>-vbeln
AND vbeln IS INITIAL.
READ TABLE lt_bseg_nc ASSIGNING <lw_bseg_nc>
WITH KEY rebzg = <lw_bseg>-belnr.
IF sy-subrc EQ 0.
ADD <lw_bseg_nc>-dmbtr TO lv_dmbtr.
ENDIF.
ENDLOOP.

"Se ejecuta desde la F-28.


SELECT SINGLE netwr, mwsbk
FROM vbrk
INTO @lw_vbrk
WHERE vbeln EQ @<fs_bseg>-vbeln.
IF sy-subrc EQ 0.
lw_tot_fact = lw_vbrk-netwr + lw_vbrk-mwsbk.
IF <fs_bseg> IS ASSIGNED.
SUBTRACT lv_dmbtr FROM <fs_bseg>-dmbtr.
ENDIF.
ELSE.
"20230322
SELECT bukrs, belnr, gjahr,
buzei, bschl, koart,
shkzg, dmbtr
FROM bseg
INTO TABLE @lt_bseg_hd
WHERE belnr EQ @<fs_bseg>-vbeln
AND bukrs EQ @<fs_bseg>-bukrs
AND gjahr EQ @<fs_bseg>-gjahr
ORDER BY PRIMARY KEY.
IF sy-subrc EQ 0.
READ TABLE lt_bseg_hd ASSIGNING <lw_bseg_hd>
WITH KEY belnr = <fs_bseg>-vbeln
shkzg = 'S'.
IF sy-subrc EQ 0.
lw_tot_fact = <lw_bseg_hd>-dmbtr.
ENDIF.
ENDIF.
ENDIF.

IF lw_tot_fact GT 0.
lw_porcen = <fs_bseg>-dmbtr / lw_tot_fact .
ELSE.
lw_porcen = 100.
ENDIF.
ENDIF.

LOOP AT tl_edidd ASSIGNING <sl_edidd>


WHERE segnam EQ 'E1EDMXCFDIK33_10_STAX'.
CLEAR: lw_base, lw_base2, lw_stax_rate.

ls_10_stax = <sl_edidd>-sdata.
ls_10_stax-stax_base_amount = <sl_edidd>-sdata(17).

CONDENSE:
ls_10_stax-stax_base_amount,
ls_10_stax-stax_type_code,
ls_10_stax-stax_factor_type,
ls_10_stax-stax_rate,
ls_10_stax-stax_amount.

lw_base = ls_10_stax-stax_base_amount.
lw_base2 = lw_base * lw_porcen.
lw_base_2dec = lw_base2.
ls_10_stax-stax_base_amount = lw_base2.

* ls_10_stax2 = ls_10_stax.
ls_10_stax2-stax_base_amount = ls_10_stax-stax_base_amount.
ls_10_stax2-stax_type_code = ls_10_stax-stax_type_code.
ls_10_stax2-stax_factor_type = ls_10_stax-stax_factor_type.
ls_10_stax2-stax_rate = ls_10_stax-stax_rate.
ls_10_stax2-stax_amount = ls_10_stax-stax_amount.

ls_10_stax2-stax_base_amount = lw_base2.
CONDENSE ls_10_stax2-stax_base_amount.

lw_stax_rate = ls_10_stax2-stax_rate.
IF lw_stax_rate GT 0.
lw_stax_amount = lw_base_2dec * lw_stax_rate.
lw_stax_amount_2dec = lw_stax_amount.
ls_10_stax2-stax_amount = lw_stax_amount_2dec.
CONDENSE ls_10_stax2-stax_amount.
ENDIF.

APPEND ls_10_stax2 TO lt_10_stax.


ENDLOOP.

SORT lt_10_stax BY stax_type_code


stax_rate.
lt_10_stax_hd[] = lt_10_stax[].
lt_10_stax_de[] = lt_10_stax[].
FREE lt_10_stax.

DELETE ADJACENT DUPLICATES FROM lt_10_stax_hd COMPARING stax_type_


code
stax_rate.

LOOP AT lt_10_stax_hd ASSIGNING <lw_10_stax_hd>.


APPEND INITIAL LINE TO lt_10_stax ASSIGNING <lt_10_stax>.
<lt_10_stax>-stax_type_code = <lw_10_stax_hd>-
stax_type_code.
<lt_10_stax>-stax_factor_type = <lw_10_stax_hd>-
stax_factor_type.
<lt_10_stax>-stax_rate = <lw_10_stax_hd>-stax_rate.
CLEAR: lw_base2, lw_stax_amount2.

LOOP AT lt_10_stax_de ASSIGNING <lw_10_stax_de>


WHERE stax_type_code EQ <lw_10_stax_hd>-stax_type_code
AND stax_rate EQ <lw_10_stax_hd>-stax_rate.

lw_base = <lw_10_stax_de>-
stax_base_amount.
ADD lw_base TO lw_base2.

lw_stax_amount = <lw_10_stax_de>-
stax_amount.
ADD lw_stax_amount TO lw_stax_amount2.
ENDLOOP.

lw_base_2dec = lw_base2.
<lt_10_stax>-stax_base_amount = lw_base_2dec.
lw_stax_amount_2dec = lw_stax_amount2.
<lt_10_stax>-stax_amount = lw_stax_amount_2dec.
CONDENSE:
<lt_10_stax>-stax_base_amount,
<lt_10_stax>-stax_amount.
ENDLOOP.

"CPB - INI - CR Nuevos nodos.


lv_montototalpagos = ls_pago-monto.
ls_pago-tipocambiop = '1'.

"AJuste para tema del centavo.


LOOP AT lt_10_stax ASSIGNING <lt_10_stax>.
lw_basex = <lt_10_stax>-stax_base_amount.
lw_tax = <lt_10_stax>-stax_amount.
lw_rate = <lt_10_stax>-stax_rate.

lw_taxbueno = lw_basex * lw_rate.

IF lw_tax NE lw_taxbueno.
<lt_10_stax>-stax_amount = lw_taxbueno.
CONDENSE <lt_10_stax>-stax_amount NO-GAPS.
ENDIF.
ENDLOOP.

LOOP AT lt_10_stax ASSIGNING <lt_10_stax>


WHERE stax_type_code EQ '002'.

CASE <lt_10_stax>-stax_rate.
WHEN '0.000000'.
ADD <lt_10_stax>-stax_base_amount TO lv_tottrasbaseiva0.
ADD <lt_10_stax>-stax_amount TO lv_tottrasimpuestoiva
0.
WHEN '0.080000'.
ADD <lt_10_stax>-stax_base_amount TO lv_tottrasbaseiva8.
ADD <lt_10_stax>-stax_amount TO lv_tottrasimpuestoiva
8.

WHEN '0.160000'.
ADD <lt_10_stax>-stax_base_amount TO lv_tottrasbaseiva16.
ADD <lt_10_stax>-stax_amount TO lv_tottrasimpuestoiva
16.
ENDCASE.
ENDLOOP.
"CPB - FIN - CR Nuevos nodos.

LOOP AT lt_10_stax INTO ls_10_stax2.


ls_trasladosdr-trasladodr-impuestodr = ls_10_stax2-
stax_type_code.
ls_trasladosdr-trasladodr-tipofactordr = ls_10_stax2-
stax_factor_type.
ls_trasladosdr-trasladodr-tasaocuotadr = ls_10_stax2-stax_rate.
ls_trasladosdr-trasladodr-importedr = ls_10_stax2-
stax_amount.
ls_trasladosdr-trasladodr-basedr = ls_10_stax2-
stax_base_amount.
APPEND ls_trasladosdr TO lt_impuestosdr.

lw_total_impuestosdr = ls_trasladosdr-trasladodr.
APPEND lw_total_impuestosdr TO lt_total_impuestosdr.
MOVE ls_trasladosdr-trasladodr TO ls_impuestosdr-trasladosdr.

ENDLOOP.

ls_pago-impuestosdr[] = lt_impuestosdr[].
ENDIF. "CALL FUNCTION 'IDOC_READ_COMPLETELY'
"CPB - FIN - Complemento de Pago 2.0

"* SI EL IDOC NO EXISTE, ES UNA FACTURA 3.2 O DOCTO FINANCIERO


ELSE. "Recupera valores de la VBRK

SELECT SINGLE * FROM vbrk INTO ls_vbrk


WHERE vbeln EQ <fs_bseg>-vbeln.
IF sy-subrc EQ 0.
ls_doctorelacionado-monedadr = ls_vbrk-waerk.

IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = '1'. "ls_vbrk-kurrf.
ENDIF.

ls_doctorelacionado-impsaldoant = ls_vbrk-netwr + ls_vbrk-


mwsbk.
ls_doctorelacionado-numparcialidad = 1.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.

ls_doctorelacionado-folio = <fs_bseg>-vbeln.

ELSE. "Si no la encuentra en documento Financiero


"* Se deben obtener los datos de FI
ls_doctorelacionado-serie = lv_blart.
ls_doctorelacionado-folio = <fs_bseg>-vbeln.
ls_doctorelacionado-monedadr = lv_waers.
IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
ls_doctorelacionado-tipocambiodr = '1'. "lv_kursf.
ENDIF.

SELECT SINGLE * INTO ls_bseg_fi FROM bseg


WHERE bukrs = i_bkpf-bukrs
AND belnr = <fs_bseg>-vbeln
AND gjahr = <fs_bseg>-rebzj
AND bschl = '01'
AND koart = 'D'
AND shkzg = 'S'.

ls_doctorelacionado-impsaldoant = ls_bseg_fi-wrbtr.
ls_doctorelacionado-numparcialidad = 1.
SHIFT ls_doctorelacionado-numparcialidad RIGHT DELETING TRAILING '
'.
CONDENSE ls_doctorelacionado-numparcialidad NO-GAPS.
ENDIF.
ENDIF.

"**** UUID DEL IDOC


READ TABLE t_docnum ASSIGNING <fs_docnum> WITH KEY status = 'A'
refdoc = <fs_bseg>-
vbeln
gjahr = <fs_bseg>-
rebzj.
IF sy-subrc EQ 0.
SELECT * FROM edid4
INTO TABLE lt_edid4_r
WHERE docnum EQ <fs_docnum>-docnum.

READ TABLE lt_edid4_r[] ASSIGNING <fs_edid4> WITH KEY segnam = 'E1ED


MXCFDISTAMP'.
IF sy-subrc EQ 0.
ls_e1edmxcfdistamp = <fs_edid4>-sdata.
ls_doctorelacionado-iddocumento = ls_e1edmxcfdistamp-uuid.
ENDIF.

ELSE.
CLEAR: lt_line_rt, ls_thead.
IF lv_fact_fi IS INITIAL.
ls_thead-tdname = <fs_bseg>-vbeln.
me->read_text( EXPORTING i_id = 'ZUUI'
i_name = ls_thead-tdname
i_object = 'VBBK'
CHANGING t_lines = lt_line_rt ).

ELSE.
ls_thead-tdname(4) = i_bkpf-bukrs.
ls_thead-tdname+4(10) = <fs_bseg>-rebzg.
ls_thead-tdname+14(4) = <fs_bseg>-rebzj.

me->read_text( EXPORTING i_id = 'ZUUI'


i_name = ls_thead-tdname
i_object = 'BELEG'
CHANGING t_lines = lt_line_rt ).
ENDIF.

"*Recuperacion del valor de cabecera ZUUD


READ TABLE lt_line_rt ASSIGNING <fs_lines_rt> INDEX 1.
IF sy-subrc EQ 0.
ls_doctorelacionado-iddocumento = <fs_lines_rt>-tdline.
ENDIF.

"*** SI EL UUID viene vacio, mandar "no valido"


IF ls_doctorelacionado-iddocumento IS INITIAL.
ls_doctorelacionado-iddocumento = text-vnv.
ENDIF.
ENDIF.

"ls_doctorelacionado-iddocumento = ls_doctorelacionado-folio.

LOOP AT t_bseg_n[] ASSIGNING <fs_bseg_n>.


IF <fs_bseg_n>-rebzg IS INITIAL.
ls_doctorelacionado-impsaldoant = ls_doctorelacionado-impsaldoant
- <fs_bseg_n>-dmbtr.
<fs_bseg>-wrbtr = <fs_bseg>-wrbtr - <fs_bseg_n>-wrbtr.

ELSE.
IF ( <fs_bseg_n>-rebzg EQ <fs_bseg>-rebzg OR <fs_bseg_n>-rebzg EQ
lv_awkey OR <fs_bseg_n>-rebzg EQ <fs_bseg>-vbeln ).
ls_doctorelacionado-impsaldoant = ls_doctorelacionado-
impsaldoant - <fs_bseg_n>-dmbtr.
<fs_bseg>-wrbtr = <fs_bseg>-wrbtr - <fs_bseg_n>-wrbtr.

ENDIF.
ENDIF.
ENDLOOP.

ls_doctorelacionado-imppagado = <fs_bseg>-wrbtr.
ls_doctorelacionado-impsaldoinsoluto = ls_doctorelacionado-
impsaldoant - <fs_bseg>-wrbtr. "saldo factura - pago
ls_doctorelacionado-metododepagodr = 'PPD'. "Valor establecido com
o fijo

ENDIF. "READ TABLE t_parcial ASSIGNING <fs_parcial> WITH KEY vbeln


= <fs_bseg>-vbeln

"* SE Llena estructura para gaurdar pago nuevo en ZFI_T_PAGOS_CFDI


ls_fi_pagos-belnr = i_bkpf-belnr.
ls_fi_pagos-bukrs = i_bkpf-bukrs.
ls_fi_pagos-gjahr = i_bkpf-gjahr.
ls_fi_pagos-kunnr = i_kunnr.
ls_fi_pagos-vbeln = <fs_bseg>-vbeln.
ls_fi_pagos-gjahrf = <fs_bseg>-rebzj.
ls_fi_pagos-uuid_fact = ls_doctorelacionado-iddocumento.

DATA: lv_len TYPE i.


DATA: lv_uuid TYPE c LENGTH 50.

" lv_uuid = <fs_docnum>-sellocfd_guid.


lv_len = strlen( ls_fi_pagos-uuid_fact ).

IF lv_len EQ 32.
CONCATENATE ls_fi_pagos-uuid_fact(8) '-'
ls_fi_pagos-uuid_fact+8(4) '-'
ls_fi_pagos-uuid_fact+12(4) '-'
ls_fi_pagos-uuid_fact+16(4) '-'
ls_fi_pagos-uuid_fact+20(12)
INTO ls_fi_pagos-uuid_fact.
ENDIF.

ls_fi_pagos-metododepagodr = ls_doctorelacionado-metododepagodr.

ls_fi_pagos-parcialidad = ls_doctorelacionado-numparcialidad.
" Ajuste de numparcialidad de 2 A 1 caracteres. 1de
SHIFT ls_fi_pagos-parcialidad RIGHT DELETING TRAILING ' '.
CONDENSE ls_fi_pagos-parcialidad NO-GAPS.
" Ajuste de numparcialidad de 2 A 1 caracteres.

ls_fi_pagos-tipocambio = ls_doctorelacionado-tipocambiodr.
ls_fi_pagos-moneda = ls_doctorelacionado-monedadr.

ls_fi_pagos-s_insoluto = ls_doctorelacionado-impsaldoinsoluto.
ls_fi_pagos-s_pagado = ls_doctorelacionado-imppagado.
ls_fi_pagos-s_anterior = ls_doctorelacionado-impsaldoant.

"*** AGREGADO POR DEML PARA F-802


IF i_docs_susti[] IS NOT INITIAL.
READ TABLE i_docs_susti INTO wa_docsust WITH KEY vbeln = <fs_bseg>-
vbeln.
ls_fi_pagos-docto_sustituir = wa_docsust-belnr.
ls_fi_pagos-gjahrs = wa_docsust-gjahr.
ENDIF.
"*** FIN AGREGADO POR DEML PARA F-802

CONDENSE: ls_doctorelacionado-impsaldoinsoluto, ls_doctorelacionado-


imppagado, ls_doctorelacionado-impsaldoant.

"*--->RRR: conversión de Folio


CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = ls_doctorelacionado-folio
IMPORTING
output = ls_doctorelacionado-folio.

CONCATENATE ls_doctorelacionado-serie ls_doctorelacionado-folio


INTO ls_fi_pagos-xblnr SEPARATED BY '-'.

ls_fi_pago_adic-belnr = i_bkpf-belnr.
ls_fi_pago_adic-bukrs = i_bkpf-bukrs.
ls_fi_pago_adic-gjahr = i_bkpf-gjahr.
ls_fi_pago_adic-kunnr = i_kunnr.
ls_fi_pago_adic-vbeln = <fs_bseg>-vbeln.
ls_fi_pago_adic-gjahrf = <fs_bseg>-rebzj.
ls_fi_pago_adic-certificado = ls_pagos-certificado.
ls_fi_pago_adic-nocertificado = ls_pagos-nocertificado.
ls_fi_pago_adic-sello = ls_pagos-sello.

IF lt_impuestosdr[] IS INITIAL.
ls_doctorelacionado-objetoimp = '02'. "3 No objeto de impuesto
ELSE.
ls_doctorelacionado-objetoimp = '02'. "4 No objeto de impuesto
ENDIF.

MODIFY zfi_t_pago_adic FROM ls_fi_pago_adic.


APPEND ls_fi_pagos TO lt_parcial.

ls_doctorelacionado-impuestosdr = lt_impuestosdr[].

lv_len = strlen( ls_doctorelacionado-iddocumento ).

IF lv_len EQ 32.
CONCATENATE ls_doctorelacionado-iddocumento(8) '-'
ls_doctorelacionado-iddocumento+8(4) '-'
ls_doctorelacionado-iddocumento+12(4) '-'
ls_doctorelacionado-iddocumento+16(4) '-'
ls_doctorelacionado-iddocumento+20(12)
INTO ls_doctorelacionado-iddocumento.
ENDIF.
APPEND ls_doctorelacionado TO ls_pago-doctorelacionado[].

CLEAR ls_doctorelacionado.

FREE lt_impuestosdr[].
ENDLOOP. "LOOP AT lt_bseg ASSIGNING <fs_bseg> WHERE rebzg IS NOT INIT
IAL

CLEAR ls_pago-trasladosp.
t_parcial[] = lt_parcial[].

CONDENSE: ls_pago-fechapago.
CONDENSE ls_pago-formadepagop.
CONDENSE ls_pago-monedap.
CONDENSE ls_pago-tipocambiop.
CONDENSE ls_pago-monto.
CONDENSE ls_pago-numoperacion.
CONDENSE ls_pago-rfcemisorctaord.
CONDENSE ls_pago-nombancoordext.
CONDENSE ls_pago-ctaordenante.
CONDENSE ls_pago-rfcemisorctaben.
CONDENSE ls_pago-ctabeneficiario.
CONDENSE ls_pago-tipocadpago.
CONDENSE ls_pago-certpago.
CONDENSE ls_pagos-version.
CONDENSE ls_pagos-versionp.
CONDENSE ls_pagos-fecha.
CONDENSE ls_pagos-serie.
CONDENSE ls_pagos-folio.
CONDENSE ls_pagos-sello.
CONDENSE ls_pagos-tipodecomprobante.
CONDENSE ls_pagos-nocertificado.
CONDENSE ls_pagos-certificado.
CONDENSE ls_pagos-subtotal.
CONDENSE ls_pagos-moneda.
CONDENSE ls_pagos-total.
CONDENSE ls_pagos-lugarexpedicion.
CONDENSE ls_pagos-relacionados-tiporelacion.
CONDENSE ls_pagos-emisor-rfc.
CONDENSE ls_pagos-emisor-nombre.
CONDENSE ls_pagos-emisor-regimenfiscal.
CONDENSE ls_pagos-receptor-rfc.
CONDENSE ls_pagos-receptor-nombre.
CONDENSE ls_pagos-receptor-usocfdi.
CONDENSE ls_pagos-receptor-numregidtrib.
CONDENSE ls_pagos-receptor-residenciafiscal.
CONDENSE ls_pago-fechapago.
CONDENSE ls_pago-formadepagop.
CONDENSE ls_pago-monedap.
CONDENSE ls_pago-tipocambiop.
CONDENSE ls_pago-monto.
CONDENSE ls_pago-numoperacion.
CONDENSE ls_pago-rfcemisorctaord.
CONDENSE ls_pago-nombancoordext.
CONDENSE ls_pago-ctaordenante.
CONDENSE ls_pago-rfcemisorctaben.
CONDENSE ls_pago-ctabeneficiario.
CONDENSE ls_pago-tipocadpago.
CONDENSE ls_pago-certpago.
CONDENSE ls_pago-cadpago.
CONDENSE ls_pago-sellopago.

IF lt_total_impuestosdr[] IS INITIAL.
lw_objetoimp = lw_objetoimp01.
ELSE.
lw_objetoimp = lw_objetoimp01.
ENDIF.

LOOP AT ls_pagos-conceptos ASSIGNING FIELD-SYMBOL(<lw_conceptos>).


<lw_conceptos>-objetoimp = lw_objetoimp.
ENDLOOP.

"CPB - nuevos ajustes 10.01.2023


IF lv_totreteniva GT 0.
ls_pago-totreteniva = lv_totreteniva.
ENDIF.
IF lv_totretenisr GT 0.
ls_pago-totretenisr = lv_totretenisr.
ENDIF.
IF lv_totretenieps GT 0.
ls_pago-totretenieps = lv_totretenieps.
ENDIF.

IF lv_tottrasbaseiva16 GT 0.
ls_pago-tottrasbaseiva16 = lv_tottrasbaseiva16.
ENDIF.
IF lv_tottrasimpuestoiva16 GT 0.
ls_pago-tottrasimpuestoiva16 = lv_tottrasimpuestoiva16.
ENDIF.

IF lv_tottrasbaseiva8 GT 0.
ls_pago-tottrasbaseiva8 = lv_tottrasbaseiva8.
ENDIF.
IF lv_tottrasimpuestoiva8 GT 0.
ls_pago-tottrasimpuestoiva8 = lv_tottrasimpuestoiva8.
ENDIF.

IF lv_tottrasbaseiva0 GT 0.
ls_pago-tottrasbaseiva0 = lv_tottrasbaseiva0.
ENDIF.
IF lv_tottrasimpuestoiva0 GT 0.
ls_pago-tottrasimpuestoiva0 = lv_tottrasimpuestoiva0.
ENDIF.

IF lv_tottrasbaseivaexento GT 0.
ls_pago-tottrasbaseivaexento = lv_tottrasbaseivaexento.
ENDIF.
IF lv_montototalpagos GT 0.
ls_pago-montototalpagos = lv_montototalpagos.
ENDIF.

IF lv_tottrasbaseiva0 GE 0.
ls_pago-tottrasimpuestoiva0 = '0.00'.
ENDIF.

"Financieras
IF ls_pago-tottrasbaseiva0 EQ ''.
ls_pago-tottrasimpuestoiva0 = ''.
ENDIF.

CONDENSE ls_pago-totreteniva.
CONDENSE ls_pago-totretenisr.
CONDENSE ls_pago-totretenieps.
CONDENSE ls_pago-tottrasbaseiva16.
CONDENSE ls_pago-tottrasimpuestoiva16.
CONDENSE ls_pago-tottrasbaseiva8.
CONDENSE ls_pago-tottrasimpuestoiva8.
CONDENSE ls_pago-tottrasbaseiva0.
CONDENSE ls_pago-tottrasimpuestoiva0.
CONDENSE ls_pago-tottrasbaseivaexento.
CONDENSE ls_pago-montototalpagos.
"CPB - nuevos ajustes 10.01.2023

APPEND ls_pago TO ls_pagos-pago[].

SORT lt_total_impuestosdr BY impuestodr tasaocuotadr.


lt_impuestosdr_hd[] = lt_total_impuestosdr[].
DELETE ADJACENT DUPLICATES FROM lt_impuestosdr_hd COMPARING impuestodr ta
saocuotadr.

LOOP AT lt_impuestosdr_hd ASSIGNING FIELD-SYMBOL(<lw_impuestosdr_hd>).


LOOP AT lt_total_impuestosdr ASSIGNING FIELD-
SYMBOL(<lw_total_impuestosdr>)
WHERE impuestodr EQ <lw_impuestosdr_hd>-impuestodr
AND tasaocuotadr EQ <lw_impuestosdr_hd>-tasaocuotadr.

lw_basedr = <lw_total_impuestosdr>-basedr.
lw_impuestodr = <lw_total_impuestosdr>-impuestodr.
lw_tipofactordr = <lw_total_impuestosdr>-tipofactordr.
lw_tasaocuotadr = <lw_total_impuestosdr>-tasaocuotadr.
lw_importedr = <lw_total_impuestosdr>-importedr.

ADD lw_basedr TO lw_basedr2.


* ADD lw_tasaocuotadr TO lw_tasaocuotadr2.
ADD lw_importedr TO lw_importedr2.
ENDLOOP.

APPEND INITIAL LINE TO lt_zsdftt_trasladosp ASSIGNING FIELD-


SYMBOL(<lw_trasladosp>).
<lw_trasladosp>-trasladop-basep = lw_basedr2.
<lw_trasladosp>-trasladop-impuestop = lw_impuestodr.
<lw_trasladosp>-trasladop-tipofactorp = lw_tipofactordr.
<lw_trasladosp>-trasladop-tasaocuotap = lw_tasaocuotadr.
<lw_trasladosp>-trasladop-importep = lw_importedr2.

CONDENSE:
<lw_trasladosp>-trasladop-basep,
<lw_trasladosp>-trasladop-impuestop,
<lw_trasladosp>-trasladop-tipofactorp,
<lw_trasladosp>-trasladop-tasaocuotap,
<lw_trasladosp>-trasladop-importep.

CLEAR: lw_basedr2, lw_impuestodr2, lw_importedr2.


ENDLOOP.

READ TABLE ls_pagos-pago ASSIGNING FIELD-SYMBOL(<lw_1>) INDEX 1.


IF sy-subrc EQ 0.
<lw_1>-trasladosp[] = lt_zsdftt_trasladosp[].
ENDIF.

ls_pagos-version = '4.0'.
ls_pagos-versionp = '2.0'.

************************************************************************
* "Crea la Cadena Original
* me->create_chain( EXPORTING i_pagos = ls_pagos
* IMPORTING e_chain = z_chain ).
* "Recupera Sello, Certificado y [Link]
* me->get_sign( EXPORTING i_bukrs = i_bkpf-bukrs
* i_erdat = i_bkpf-budat
* i_erzeit = i_bkpf-cputm
* i_chain = z_chain
* IMPORTING e_sello = z_sign
* e_certif = z_certif
* e_nocertif = z_nocertif ).
*
*************************************************************************
* ls_pagos-nocertificado = z_nocertif.
*
* "Crea la Cadena Original
* me->create_chain( EXPORTING i_pagos = ls_pagos
* IMPORTING e_chain = z_chain ).
* "Recupera Sello, Certificado y [Link]
* me->get_sign( EXPORTING i_bukrs = i_bkpf-bukrs
* i_erdat = i_bkpf-budat
* i_erzeit = i_bkpf-cputm
* i_chain = z_chain
* IMPORTING e_sello = z_sign
* e_certif = z_certif
* e_nocertif = z_nocertif ).
*
* "Actualiza las tablas PAGOS y ADICIONALES con la cadena recuperada
* ls_pagos-nocertificado = z_nocertif.
* ls_pagos-certificado = z_certif.
* ls_pagos-sello = z_sign. "* INI FCR Cambios Complemento
de Pago CFDI4.0 ***

"*Create the tansformation


zcl_ixml = cl_ixml=>create( ).
zcl_streamfactory = zcl_ixml->create_stream_factory( ).
zcl_encoding = zcl_ixml->create_encoding( character_set = 'UTF-8' byt
e_order = 0 ).
zcl_ixml_ostream = zcl_streamfactory->create_ostream_xstring( z_xml_file
).
zcl_ixml_ostream->set_encoding( encoding = zcl_encoding ).

* CPB-INI CFDI 4.0 get NoCertificado y Sello.


CLEAR: ls_pagos-sello, ls_pagos-nocertificado, ls_pagos-certificado.

TRY.
CALL TRANSFORMATION zsdtr_fecfdi_pagos
SOURCE cfdi = ls_pagos
RESULT XML zcl_ixml_ostream.

"e_xml = z_xml_file.
ENDTRY.

CLEAR lv_string2.
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
im_xstring = z_xml_file
im_encoding = 'UTF-8'
IMPORTING
ex_string = lv_string2.

me->get_nocertificado( EXPORTING i_bukrs = i_bkpf-bukrs


CHANGING i_xml_string = lv_string2
i_nocer = ls_pagos-nocertificado
i_certi = ls_pagos-certificado
i_sello = ls_pagos-sello ).
* CPB-FIN CFDI 4.0 get NoCertificado y Sello.
APPEND ls_pagos TO lt_pagos.
e_pagos = lt_pagos[].
CLEAR ls_pago.
REPLACE ALL OCCURRENCES OF 'xmlns:pago20="[Link] V
ersion="2.0"'
IN lv_string2 WITH 'Version="2.0"'.

REPLACE ALL OCCURRENCES OF 'xmlns:xsi="[Link]


instance"'
IN lv_string2
WITH 'xmlns:xsi="[Link] xmlns:pago
20="[Link]

* CALL FUNCTION 'SCMS_STRING_TO_XSTRING'


* EXPORTING
* text = lv_string2
* IMPORTING
* buffer = z_xml_file2
* EXCEPTIONS
* failed = 1
* OTHERS = 2.

CLEAR z_xml_file.
CALL FUNCTION 'ECATT_CONV_STRING_TO_XSTRING'
EXPORTING
im_string = lv_string2
im_encoding = 'UTF-8'
IMPORTING
ex_xstring = z_xml_file2.

e_xml = z_xml_file2.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->PROCESS_DATA_CANCEL
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BKPF TYPE BKPF
* | [--->] I_KUNNR TYPE KUNNR
* | [--->] T_BSEG TYPE BSEG_T
* | [--->] T_DOCNUM TYPE IDMX_CFDI_STAT_LOG
_MX_T(optional)
* | [--->] I_TIPO TYPE CHAR1
* | [--->] T_CHEQUE TYPE ZFI_TT_CHEQUE_CFDI
(optional)
* | [--->] I_SPEI TYPE STRING(optional)
* | [--->] I_DOC_SUSTITUIR TYPE ZFI_E_DOC_SUST(opti
onal)
* | [--->] I_STATUS TYPE ZFI_E_STATUS(optio
nal)
* | [--->] I_BANK_V TYPE CHAR3(optional)
* | [--->] T_MBANCO TYPE ZFI_S_BANCO_CFDI(o
ptional)
* | [<---] E_XML TYPE XSTRING
* | [<---] E_MESSAGE TYPE STRING
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI(
optional)
* | [<-->] T_DATA_ADIC TYPE ZFI_TT_PAGO_ADIC(op
tional)
* | [<-->] T_CREATE_TXT TYPE ZSDFES_PAGO(optiona
l)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD process_data_cancel.
DATA: ls_pagos TYPE ZFIFES_PAGOS, "zsdfes_pagos, "<-- MODIFICA
DO POR DEML 10.01.2018 POR F-802
ls_pago TYPE zsdfes_pago,
ls_doctorelacionado TYPE zsdfes_doctorelacionado,
ls_concepto TYPE zsdfes_conceptos,
ls_fi_pagos TYPE zfi_t_pagos_cfdi,
ls_fi_pago_adic TYPE zfi_t_pago_adic,
ls_knb1 TYPE knb1,
lv_pagos TYPE string,
lv_adrnr TYPE ad_addrnum,
lv_land1 TYPE land1,
lv_stcd1 TYPE stcd1,
lv_paval TYPE paval,
lv_regfis TYPE paval,
lv_pac_test TYPE tvarv_val,
lv_rfc_pac TYPE c LENGTH 15,
lv_name_pac TYPE c LENGTH 50,
lv_sello_pac TYPE c LENGTH 1,
lv_zterm TYPE dzterm,
lv_xsplt TYPE t052-xsplt,
lv_zwels_sat TYPE char2,
lv_string TYPE string,
lv_message TYPE string,
lv_uuid_pag TYPE zfi_e_uuid,
lo_oref TYPE REF TO cx_root,
z_long TYPE i,
lv_numcert TYPE string.
DATA: z_chain TYPE string,
z_sign TYPE string,
z_certif TYPE string,
z_nocertif TYPE string.

*** Transformacion
DATA: z_xml_file TYPE xstring,
zcl_ixml TYPE REF TO if_ixml,
zcl_streamfactory TYPE REF TO if_ixml_stream_factory,
zcl_encoding TYPE REF TO if_ixml_encoding,
zcl_ixml_ostream TYPE REF TO if_ixml_ostream.

DATA: ls_e1edmxcfdik01 TYPE e1edmxcfdik01,


ls_e1edmxcfdistamp TYPE e1edmxcfdistamp,
ls_e1edkt1 TYPE e1edkt1,
ls_e1edkt2 TYPE e1edkt2.

DATA: lt_emisor TYPE STANDARD TABLE OF adrc,


lt_receptor TYPE STANDARD TABLE OF adrc,
lt_parcial TYPE STANDARD TABLE OF zfi_t_pagos_cfdi.

DATA: lt_concepto TYPE STANDARD TABLE OF zsdfes_conceptos,


lt_bseg TYPE STANDARD TABLE OF bseg,
lt_edid4 TYPE STANDARD TABLE OF edid4,
lt_edid4_r TYPE STANDARD TABLE OF edid4,
lt_parser TYPE zabap_xmltb.

*** AGREGADO POR DEML 10.01.2019 POR F-802


DATA: LS_UUIDREL TYPE ZFI_UUID_RELTAB,
WA_UUIDREL TYPE ZFI_UUID_RELTAB_S.
*** FIN AGREGADO

CONSTANTS: c_test_pac TYPE string VALUE 'IDMX_TEST_PAC',


c_cuenta TYPE string VALUE 'Cuenta',
c_certificado TYPE string VALUE 'numeroCertificado',
c_cadena TYPE string VALUE 'cadenaCDA',
c_sello TYPE string VALUE 'sello',
c_montopago TYPE string VALUE 'MontoPago',
c_cvespei TYPE string VALUE 'ClaveSPEI',
c_banemi TYPE string VALUE 'BancoEmisor',
c_test_num_cert TYPE string VALUE 'IDMX_TEST_NUMCERT'.

FIELD-SYMBOLS: <fs_bseg> TYPE bseg,


<fs_parcial> TYPE zfi_t_pagos_cfdi,
<fs_emisor> TYPE adrc,
<fs_receptor> TYPE adrc,
<fs_edid4> TYPE edid4,
<fs_aux> TYPE edid4,
<fs_docnum> TYPE cfdi_stat_log_mx,
<fs_parser> TYPE smum_xmltb,
<fs_adic> TYPE zfi_t_pago_adic.

*Extraer datos de la Sociedad


SELECT SINGLE adrnr INTO lv_adrnr FROM t001
WHERE bukrs = i_bkpf-bukrs.

SELECT SINGLE paval INTO lv_paval FROM t001z


WHERE bukrs = i_bkpf-bukrs
AND party = 'MX_RFC'.

SELECT SINGLE paval INTO lv_regfis FROM t001z


WHERE bukrs = i_bkpf-bukrs
AND party = 'CFDITR'.

SELECT * INTO TABLE lt_emisor FROM adrc


WHERE addrnumber = lv_adrnr.

* Identificar si es ambiente de pruebas


SELECT SINGLE high INTO lv_pac_test FROM tvarvc
WHERE name = c_test_pac
AND low = sy-sysid.
IF sy-subrc = 0.
SPLIT lv_pac_test AT '|' INTO lv_sello_pac lv_rfc_pac lv_name_pac.
ENDIF.

* LLenamos los datos de Pagos

ls_pagos-version = '3.3'.
ls_pagos-versionp = '1.0'.

CONCATENATE sy-datum(4) '-' sy-datum+4(2) '-' sy-datum+6(2) 'T'


sy-uzeit(2) ':' sy-uzeit+2(2) ':' sy-uzeit+4(2)
INTO ls_pagos-fecha.

ls_pagos-serie = i_bkpf-blart.
ls_pagos-folio = i_bkpf-belnr.
ls_pagos-tipodecomprobante = 'P'.
ls_pagos-subtotal = '0'.
ls_pagos-total = '0'.
ls_pagos-moneda = 'XXX'. "i_bkpf-waers.

* EMISOR
READ TABLE lt_emisor ASSIGNING <fs_emisor> INDEX 1.
IF sy-subrc EQ 0.
IF lv_rfc_pac IS NOT INITIAL.
ls_pagos-emisor-rfc = lv_rfc_pac.
ls_pagos-emisor-nombre = lv_name_pac.
ELSE.
ls_pagos-emisor-rfc = lv_paval.
CONCATENATE <fs_emisor>-name1 <fs_emisor>-name2 INTO
ls_pagos-emisor-nombre SEPARATED BY space.
ENDIF.
ls_pagos-emisor-regimenfiscal = lv_regfis.
ls_pagos-lugarexpedicion = <fs_emisor>-post_code1.

ENDIF.

READ TABLE t_bseg ASSIGNING <fs_bseg> WITH KEY bschl = '15'


koart = 'D'.

* RECEPTOR
SELECT SINGLE land1 adrnr stcd1 INTO (lv_land1, lv_adrnr, lv_stcd1)
FROM kna1
WHERE kunnr = i_kunnr.
IF sy-subrc EQ 0.
SELECT * INTO TABLE lt_receptor FROM adrc
WHERE addrnumber = lv_adrnr.
ls_pagos-receptor-rfc = lv_stcd1.

READ TABLE lt_receptor ASSIGNING <fs_receptor> INDEX 1.


IF sy-subrc EQ 0.
CONCATENATE <fs_receptor>-name1 <fs_receptor>-name2 INTO
ls_pagos-receptor-nombre SEPARATED BY space.
ENDIF.
ls_pagos-receptor-usocfdi = 'P01'.
IF lv_land1 <> 'MX'. "Se debe mandar estos 2 valores
ls_pagos-receptor-numregidtrib = ''.
ls_pagos-receptor-residenciafiscal = ''.
ENDIF.
ENDIF.

ls_concepto-claveprodserv = '84111506'.
ls_concepto-cantidad = 1.
ls_concepto-claveunidad = 'ACT'.
ls_concepto-descripcion = 'Pago'.
ls_concepto-valorunitario = '0'.
ls_concepto-importe = '0'.
ls_concepto-unidad = ''.
APPEND ls_concepto TO lt_concepto.

ls_pagos-conceptos[] = lt_concepto[].

" FechaPago
CONCATENATE i_bkpf-budat(4) '-' i_bkpf-budat+4(2) '-' i_bkpf-budat+6(2) 'T
'
i_bkpf-cputm(2) ':' i_bkpf-cputm+2(2) ':' i_bkpf-cputm+4(2)
INTO ls_pago-fechapago.

" MonedaP
ls_pago-monedap = i_bkpf-waers.

" TipoCambioP
IF i_bkpf-kursf NE 0.
ls_pago-tipocambiop = i_bkpf-kursf.
ELSE.
DATA lv_ukurs TYPE ukurs_curr.

SELECT SINGLE ukurs


FROM tcurr
INTO lv_ukurs
WHERE kurst EQ 'M'
AND fcurr EQ i_bkpf-waers
AND tcurr EQ 'MXN'
AND gdatu EQ i_bkpf-budat.

IF sy-subrc EQ 0.
ls_pago-tipocambiop = lv_ukurs.
ENDIF.
ENDIF.

" CtaBeneficiario
DATA: lv_hbkid TYPE hbkid,
lv_bankn TYPE bankn,
lv_clabe TYPE bnkn2,
lv_hkont TYPE hkont,
lv_strlen TYPE i.

DATA: lv_bankl_cb TYPE bankl,


lv_adrnr_cb TYPE ad_addrnum,
ls_adrct_cb TYPE adrct.

FIELD-SYMBOLS: <fs_bseg_i1> TYPE bseg.

READ TABLE t_bseg[] ASSIGNING <fs_bseg_i1> WITH KEY buzei = '001'.


* INDEX 1.

IF <fs_bseg_i1> IS ASSIGNED.
" Monto
ls_pago-monto = 1.

* Obteniendo la cuenta del banco en la que se hizo el registro


* del cobro
lv_hkont = <fs_bseg_i1>-hkont.
lv_strlen = strlen( lv_hkont ).
lv_strlen = lv_strlen - 1.

CONCATENATE lv_hkont(lv_strlen) '0'


INTO lv_hkont.

SELECT SINGLE hbkid bankn bnkn2


FROM t012k
INTO (lv_hbkid , lv_bankn, lv_clabe)
WHERE bukrs EQ i_bkpf-bukrs
AND hkont EQ lv_hkont.
* Esta cuenta debe validar contra el SPEI si se
* selecciono esta opcion.
ENDIF.

" NumOperacion
IF <fs_bseg_i1> IS ASSIGNED.
ls_pago-numoperacion = <fs_bseg_i1>-zuonr.
* ls_doctorelacionado-metododepagodr = 'PPD'."RRR:Valor marcado como Fij
o PPD
ENDIF.

CASE i_tipo.
WHEN '1'.
ls_pago-formadepagop = '01'.
ls_fi_pago_adic-tipo = '1'.
ENDCASE.
ls_pago-monto = 1.

MOVE-CORRESPONDING ls_pago TO ls_fi_pago_adic.

SORT t_parcial BY vbeln ASCENDING parcialidad DESCENDING.


* Llenar los Relacionados

READ TABLE t_parcial ASSIGNING <fs_parcial> INDEX 1.


IF sy-subrc EQ 0.
ls_pagos-relacionados-tiporelacion = '04'.
**********************************************************************
*** SEGMENTO MODIFICADO POR DEML 10.01.2019 POR F-802 ***
*** CÓDIGO PREVIO COMENTADO CON 3 '*' ***
**********************************************************************
*** ls_pagos-relacionados-uuid = <fs_parcial>-uuid_pago.
MOVE <fs_parcial>-uuid_pago TO WA_UUIDREL-UUID_R.
APPEND WA_UUIDREL TO LS_UUIDREL[].
CLEAR WA_UUIDREL.
ls_pagos-relacionados-uuid[] = LS_UUIDREL[].
**********************************************************************
* ls_doctorelacionado-iddocumento = <fs_parcial>-uuid_pago.
* ls_doctorelacionado-serie = 'DZ'.
* ls_doctorelacionado-folio = <fs_parcial>-belnr.

* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'


* EXPORTING
* input = ls_doctorelacionado-folio
* IMPORTING
* output = ls_doctorelacionado-folio.

* ls_doctorelacionado-monedadr = <fs_parcial>-moneda.
* IF ls_pago-monedap NE ls_doctorelacionado-monedadr.
* ls_doctorelacionado-tipocambiodr = '1'. "<fs_parcial>-
tipocambio.
* ENDIF.
* ls_doctorelacionado-metododepagodr = 'PPD'."RRR:Valor marcado como
Fijo PPD
* ls_doctorelacionado-numparcialidad = 1. "RRR:Valor marcado como
Fijo PPD
* ls_doctorelacionado-impsaldoant = 1.
* ls_doctorelacionado-imppagado = 1.
* ls_doctorelacionado-impsaldoinsoluto = 0.
* APPEND ls_doctorelacionado TO ls_pago-doctorelacionado[].
CLEAR ls_doctorelacionado.
ENDIF.

DATA:lv_usosat TYPE zsd_t_uso_cfdi-uso_sat.

APPEND ls_pago TO ls_pagos-pago[].


CLEAR ls_pago.
CONDENSE ls_pagos-emisor-nombre.
CONDENSE ls_pagos-receptor-nombre NO-GAPS.
* un certificado para pruebas
CLEAR lv_numcert.
SELECT SINGLE high INTO lv_numcert FROM tvarvc
WHERE name = c_test_num_cert
AND low = sy-sysid.
IF sy-subrc EQ 0.
ls_pagos-nocertificado = lv_numcert.
ENDIF.

* * Crea cadena original


me->create_chain( EXPORTING i_pagos = ls_pagos
IMPORTING e_chain = z_chain ).
* Recupera sello, certificado y No. Certificado
me->get_sign( EXPORTING i_bukrs = i_bkpf-bukrs
i_erdat = i_bkpf-budat
i_erzeit = i_bkpf-cputm
i_chain = z_chain
IMPORTING e_sello = z_sign
e_certif = z_certif
e_nocertif = z_nocertif ).

ls_pagos-nocertificado = z_nocertif.

* * Crea cadena original


me->create_chain( EXPORTING i_pagos = ls_pagos
IMPORTING e_chain = z_chain ).
* Recupera sello, certificado y No. Certificado
me->get_sign( EXPORTING i_bukrs = i_bkpf-bukrs
i_erdat = i_bkpf-budat
i_erzeit = i_bkpf-cputm
i_chain = z_chain
IMPORTING e_sello = z_sign
e_certif = z_certif
e_nocertif = z_nocertif ).

ls_pagos-certificado = z_certif.
ls_pagos-sello = z_sign.

*Create the tansformation


zcl_ixml = cl_ixml=>create( ).
zcl_streamfactory = zcl_ixml->create_stream_factory( ).
zcl_encoding = zcl_ixml->create_encoding( character_set = 'UTF-8' byt
e_order = 0 ).
zcl_ixml_ostream = zcl_streamfactory->create_ostream_xstring( z_xml_file
).
zcl_ixml_ostream->set_encoding( encoding = zcl_encoding ).
TRY.
CALL TRANSFORMATION zsdtr_fecfdi_pagos
SOURCE cfdi = ls_pagos
RESULT XML zcl_ixml_ostream.
e_xml = z_xml_file.

ENDTRY.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Private Method ZCL_FI_CFDIXMLFE->READ_TEXT
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_ID TYPE THEAD-TDID
* | [--->] I_NAME TYPE THEAD-TDNAME
* | [--->] I_OBJECT TYPE THEAD-TDOBJECT
* | [<-->] T_LINES TYPE EFG_TAB_TLINE(opti
onal)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD read_text.
DATA lt_lines TYPE STANDARD TABLE OF tline.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = i_id
language = sy-langu
name = i_name
object = i_object
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.

t_lines[] = lt_lines[].

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->READ_TVARVC
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_NAME TYPE RVARI_VNAM
* | [<-()] R_VALUE TYPE RSELOPTION
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD read_tvarvc.
DATA: lt_tvarvc TYPE STANDARD TABLE OF tvarvc,
ls_tvarvc TYPE tvarvc,
ls_value TYPE rsdsselopt.

SELECT *
FROM tvarvc
INTO TABLE lt_tvarvc[]
WHERE name EQ i_name.

LOOP AT lt_tvarvc[] INTO ls_tvarvc.


ls_value-sign = ls_tvarvc-sign.
ls_value-option = ls_tvarvc-opti.
ls_value-low = ls_tvarvc-low.
ls_value-high = ls_tvarvc-high.

APPEND ls_value TO r_value[].


CLEAR ls_value.

ENDLOOP.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->SAVE_LOG
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_CREATE TYPE CHAR1(optional)
* | [--->] I_S_LOG TYPE BAL_S_LOG(optional
)
* | [--->] I_S_MSG TYPE BAL_S_MSG(optional
)
* | [<-->] C_LOG_HANDLE TYPE BALLOGHNDL(optional
)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD SAVE_LOG.

DATA: lt_log_handle TYPE bal_t_logh.

IF i_create = abap_true.
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = i_s_log
IMPORTING
e_log_handle = c_log_handle
EXCEPTIONS
OTHERS = 1.
ELSE.
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_s_msg = i_s_msg
i_log_handle = c_log_handle
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.
IF sy-subrc = 0.
INSERT c_log_handle INTO TABLE lt_log_handle.
*Guarda el mensaje del log
CALL FUNCTION 'BAL_DB_SAVE'
EXPORTING
i_client = sy-mandt
i_save_all = abap_true
i_t_log_handle = lt_log_handle
EXCEPTIONS
log_not_found = 1
save_not_allowed = 2
numbering_error = 3
OTHERS = 4.
IF sy-subrc EQ 0.
CLEAR lt_log_handle[].
ENDIF.
ENDIF.

ENDIF.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->SAVE_TEXT
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_KEY TYPE THEAD-TDNAME
* | [--->] I_ID TYPE THEAD-TDID
* | [--->] T_TLINE TYPE IDMX_DI_T_TLINE
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD SAVE_TEXT.
DATA: ls_header TYPE thead.

ls_header-tdobject = 'BELEG'.
ls_header-tdname = i_key.
ls_header-tdid = i_id.
ls_header-tdspras = sy-langu.
ls_header-tdlinesize = '072'.
*#->Llamamos a la función que nos completa el texto
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = ls_header
* insert = 'X'
savemode_direct = 'X'
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->SEND_MAIL
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_MAIL TYPE AD_SMTPADR
* | [--->] I_ATTNAME TYPE SO_OBJ_DES
* | [--->] I_BUKRS TYPE BUKRS
* | [<-->] T_ATT_XML TYPE SOLIX_TAB(optional
)
* | [<-->] T_ATT_PDF TYPE SOLIX_TAB(optional
)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD send_mail.
TYPES: BEGIN OF ty_body,
name TYPE string,
END OF ty_body.

DATA: lo_send_request TYPE REF TO cl_bcs,


lo_bcs_exception TYPE REF TO cx_bcs,
lo_document TYPE REF TO cl_document_bcs,
lo_sender TYPE REF TO if_sender_bcs,
lo_recipient TYPE REF TO if_recipient_bcs,
lt_message_body TYPE bcsy_text,
ls_message TYPE soli,
lv_sent_to_all TYPE os_boolean,
lv_sender TYPE ad_smtpadr,
lv_emailadd TYPE ad_smtpadr,
lv_sub TYPE so_obj_des,
lv_error TYPE string,
lv_smail TYPE rvari_vnam VALUE 'CFDI_SMAIL',
lr_smail TYPE rseloption,
ls_range TYPE rsdsselopt,
ls_header TYPE thead,
lt_lines TYPE STANDARD TABLE OF tline,
ls_lines TYPE tline,
ls_body TYPE ty_body,
lv_line TYPE i,
lv_name1 TYPE ad_name1.

SELECT SINGLE a~name1


FROM adrc AS a
INNER JOIN t001 AS b ON b~adrnr EQ a~addrnumber
INTO lv_name1
WHERE b~bukrs EQ i_bukrs.

ls_body-name = lv_name1.

lr_smail = me->read_tvarvc( lv_smail ).

READ TABLE lr_smail[] INTO ls_range


WITH KEY low = 'MAIL'.
IF sy-subrc EQ 0.
lv_sender = ls_range-high.
ENDIF.

TRY.
lo_send_request = cl_bcs=>create_persistent( ).
"subject
CLEAR: lv_sub,
lt_message_body[].

CALL FUNCTION 'READ_TEXT'


EXPORTING
id = 'ST'
language = 'S'
name = 'ZCFDI_HEADERMAIL'
object = 'TEXT'
IMPORTING
header = ls_header
TABLES
lines = lt_lines[]
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc EQ 0.
LOOP AT lt_lines[] INTO ls_lines.
CONCATENATE ls_lines-tdline lv_sub
INTO lv_sub SEPARATED BY space.
ENDLOOP.
ENDIF.
CLEAR: ls_header, lt_lines[], lv_line.

" Body Mail


CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'ST'
language = 'S'
name = 'ZCFDI_BODYMAIL'
object = 'TEXT'
IMPORTING
header = ls_header
TABLES
lines = lt_lines[]
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc EQ 0.
LOOP AT lt_lines[] INTO ls_lines.
ls_message-line = ls_lines-tdline.
REPLACE '&LS_BODY-NAME&' IN ls_message-line WITH ls_body-name.
APPEND ls_message TO lt_message_body[].
CLEAR ls_message.
ENDLOOP.
ENDIF.
CLEAR: ls_header, lt_lines[], lv_line.

" PUT your TEXT INTO the document


lo_document = cl_document_bcs=>create_document( i_type = 'HTM'
i_text = lt_message
_body[]
i_subject = lv_sub ).

IF NOT t_att_pdf[] IS INITIAL.


lo_document->add_attachment( EXPORTING i_attachment_type = 'PDF
'
i_attachment_subject = i_at
tname
i_att_content_hex = t_at
t_pdf[] ).
ENDIF.

IF NOT t_att_xml[] IS INITIAL.


lo_document->add_attachment( EXPORTING i_attachment_type = 'XML'
i_attachment_subject = i_attn
ame
i_att_content_hex = t_att_
xml[] ).
ENDIF.

" CREATE sender


lo_sender = cl_cam_address_bcs=>create_internet_address( lv_sender ).

" SET sender


lo_send_request->set_sender( lo_sender ).

" CREATE RECEIVER


lv_emailadd = i_mail.

lo_recipient = cl_cam_address_bcs=>create_internet_address( lv_emailad


d ).

" ADD recipient OBJECT TO SEND REQUEST


lo_send_request->add_recipient( EXPORTING i_recipient = lo_recipient
i_express = abap_true ).

" send email


lo_send_request->set_document( lo_document ).

lo_send_request->send( EXPORTING i_with_error_screen = 'X'


RECEIVING result = lv_sent_to_all
).

COMMIT WORK.

CATCH cx_bcs INTO lo_bcs_exception.


lv_error = lo_bcs_exception->get_text( ).
ENDTRY.

ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->SPELL_AMOUNT
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_TOTAL TYPE NETWR
* | [--->] I_WAERS TYPE WAERS (default ='M
XN')
* | [<---] E_AMOUNT_TEXT TYPE CHAR255
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD spell_amount.
DATA: ls_words TYPE spell,
lv_decimals TYPE char2,
lv_denominacion TYPE char15,
lv_sufix TYPE char5.

CALL FUNCTION 'SPELL_AMOUNT'


EXPORTING
amount = i_total
currency = i_waers
language = 'S'
IMPORTING
in_words = ls_words
EXCEPTIONS
not_found = 1
too_large = 2
OTHERS = 3.

IF sy-subrc EQ 0.

CASE i_waers.
WHEN 'MXN'.
lv_denominacion = 'PESOS'.
lv_sufix = 'M.N.'.

WHEN 'USD'.
lv_denominacion = 'DOLARES'.

ENDCASE.

lv_decimals = ls_words-decimal(2).

CONCATENATE ls_words-word lv_denominacion lv_decimals


INTO e_amount_text SEPARATED BY space.

CONCATENATE e_amount_text '/100'


INTO e_amount_text.

CONCATENATE e_amount_text lv_sufix


INTO e_amount_text SEPARATED BY space.

ENDIF.
ENDMETHOD.

* <SIGNATURE>----------------------------------------------------------------
-----------------------+
* | Instance Public Method ZCL_FI_CFDIXMLFE->SUSTITUIR_PAGO
* +--------------------------------------------------------------------------
-----------------------+
* | [--->] I_BKPF TYPE BKPF(optional)
* | [--->] T_BSEG TYPE BSEG_T(optional)
* | [<-->] T_PARCIAL TYPE ZFI_TT_PAGOS_CFDI(
optional)
* +--------------------------------------------------------------------------
------------</SIGNATURE>
METHOD sustituir_pago.
DATA: lv_msgv1 TYPE SYMSGV.
FIELD-SYMBOLS: <fs_parcial> TYPE zfi_t_pagos_cfdi.
* Deberá actualizar la tabla ZFI_T_PAGOS_CFDI con status S y mandar
* mensaje de que ya pueden realizar nuevo Cobro
CLEAR lv_msgv1.
LOOP AT t_parcial ASSIGNING <fs_parcial>.
UPDATE zfi_t_pagos_cfdi SET status = 'S'
docto_cancel = i_bkpf-belnr
WHERE belnr = <fs_parcial>-belnr
AND bukrs = <fs_parcial>-bukrs
AND gjahr = <fs_parcial>-gjahr
AND kunnr = <fs_parcial>-kunnr
AND vbeln = <fs_parcial>-vbeln.
ENDLOOP.
lv_msgv1 = <fs_parcial>-belnr.

CALL FUNCTION 'POPUP_DISPLAY_MESSAGE'


EXPORTING
msgid = 'ZCFDI'
msgty = 'I'
msgno = '004'
msgv1 = lv_msgv1.

ENDMETHOD.
ENDCLASS.

You might also like