You are on page 1of 12

Metodos implementados FI:

GET ITEMS:
method /EDGE/IF_EI_IT_POSTING_DOC~GET_ITEMS.
DATA: lv_buzei TYPE buzei,
ls_extension2 TYPE /edge/ei_it_extension2.

FIELD-
SYMBOLS: <ls_accountreceivable> LIKE LINE OF et_accountreceivable,
<ls_currencyamount> LIKE LINE OF et_currencyamount
,
<ls_bseg> LIKE LINE OF ms_fi_fields-
bseg,
<ls_accountgl> LIKE LINE OF et_accountgl,
<ls_extension2> LIKE LINE OF et_extension2.

CLEAR: lv_buzei, ls_extension2.


lv_buzei = 1.
* Vendor postion
* Accountreceivable
* APPEND INITIAL LINE TO et_accountreceivable ASSIGNING <ls_accountre
ceivable>.
* <ls_accountreceivable>-itemno_acc = lv_buzei.
** <ls_accountreceivable>-gl_account = ms_fi_fields-lifnr.
* <ls_accountreceivable>-customer = ms_fi_fields-lifnr.

* Currencyamount
APPEND INITIAL LINE TO et_currencyamount ASSIGNING <ls_currencyamoun
t>.
<ls_currencyamount>-itemno_acc = lv_buzei.
<ls_currencyamount>-currency = ms_general_data-waers.
<ls_currencyamount>-amt_doccur = ms_fi_fields-dmbtr."importe_total.

LOOP AT ms_fi_fields-bseg ASSIGNING <ls_bseg>.


lv_buzei = lv_buzei + 1.
* Accountreceivable N/A
* Currencyamount
APPEND INITIAL LINE TO et_currencyamount ASSIGNING <ls_currencyamo
unt>.
<ls_currencyamount>-itemno_acc = lv_buzei.
<ls_currencyamount>-currency = ms_general_data-waers.
* <ls_currencyamount>-tax_amt = ( <ls_bseg>-
dmbtr * <ls_bseg>-porcentage / 100 ) * -1.
<ls_currencyamount>-amt_doccur = ( <ls_bseg>-
dmbtr + ( <ls_bseg>-dmbtr * <ls_bseg>-porcentage / 100 ) ) * -1.
* <ls_currencyamount>-amt_doccur = <ls_bseg>-dmbtr.
* Accountgl
APPEND INITIAL LINE TO et_accountgl ASSIGNING <ls_accountgl>.
<ls_accountgl>-itemno_acc = lv_buzei.
* <ls_accountgl>-acct_key = <ls_bseg>-bschl.
<ls_accountgl>-gl_account = <ls_bseg>-hkont.
<ls_accountgl>-tax_code = <ls_bseg>-mwskz.
* <ls_accountgl>-wbs_element = <ls_bseg>-projk.
<ls_accountgl>-item_text = <ls_bseg>-sgtxt_item.
<ls_accountgl>-profit_ctr = <ls_bseg>-prctr.
<ls_accountgl>-costcenter = <ls_bseg>-kostl.
* APPEND INITIAL LINE TO et_extension2 ASSIGNING <ls_extension2>.
* ls_extension2-posnr = lv_buzei.
* ls_extension2-bschl = <ls_bseg>.
* <ls_extension2>-structure = '/EDGE/EI_IT_EXTENSION2'.
* <ls_extension2>-valuepart1 = ls_extension2.
ENDLOOP.

"Ampliar BADI para campos que no aparecen como POSNR BSCHL

ENDMETHOD.

GET_VENDOR:

method /EDGE/IF_EI_IT_POSTING_DOC~GET_VENDOR.
FIELD-SYMBOLS: <ls_vendor> LIKE LINE OF et_accountpayable.

APPEND INITIAL LINE TO et_accountpayable ASSIGNING <ls_vendor>.


<ls_vendor>-itemno_acc = 1.
<ls_vendor>-vendor_no = ms_fi_fields-lifnr.
<ls_vendor>-pmnttrms = ms_fi_fields-zterm.
<ls_vendor>-pmnt_block = ms_fi_fields-zlspr.
<ls_vendor>-pymt_meth = ms_fi_fields-zlsch.
<ls_vendor>-alloc_nmbr = ms_fi_fields-zuonr.
<ls_vendor>-item_text = ms_fi_fields-sgtxt.
<ls_vendor>-tax_code = ms_fi_fields-mwskz.

endmethod.

POST_FI_INVOICE:

METHOD /edge/if_ei_it_posting_doc~post_fi_invoice.

DATA: ls_documentheader TYPE bapiache09,


ls_customercpd TYPE bapiacpa09,
lv_tipo_doc TYPE char4,
ls_bsip TYPE bsip,
ls_body TYPE /edge/ei_itfattura_elettronic5,
lt_accountreceivable TYPE ty_t_accountreceivable,
lt_currencyamount TYPE ty_t_currencyamount,
lt_accountpayable TYPE ty_t_accountpayable,
lt_accounttax TYPE ty_t_accounttax,
lt_accountgl TYPE ty_t_accountgl,
lt_paymentcard TYPE ty_t_paymentcard,
lt_contractitem TYPE ty_t_contractitem,
lt_realestate TYPE ty_t_realestate,
lt_extension2 TYPE ty_t_extension2.

DATA: lv_objtype TYPE awtyp,


lv_objkey TYPE awkey,
lv_objsys TYPE awsys,
lt_return TYPE bapiret2_t,
ls_error TYPE abap_bool.
FIELD-SYMBOLS: <ls_return> LIKE LINE OF lt_return,
<fs_currency> LIKE LINE OF lt_currencyamount.

instantiate_attributes( EXPORTING is_general_data = is_general_data


is_fi_fields = is_fi_fields
it_screen_fields_gen = it_screen_f
ields_gen
it_screen_fields_fi = it_screen_fi
elds_fi
is_estructura_xml = is_estructura_
xml ).

* Get header data


get_document_header( IMPORTING es_documentheader = ls_documentheader
).

* Get cpd data


get_customercpd( IMPORTING es_customercpd = ls_customercpd ).

* Item
get_items( IMPORTING et_accountreceivable = lt_accountreceivable
et_currencyamount = lt_currencyamount
et_accountgl = lt_accountgl
et_extension2 = lt_extension2 ).

READ TABLE is_estructura_xml-


fattura_elettronica_body INTO ls_body INDEX 1.
IF sy-subrc IS INITIAL.
lv_tipo_doc = ls_body-dati_generali-dati_generali_documento-
tipo_documento.
ENDIF.
IF lv_tipo_doc NE 'TD04'.
READ TABLE lt_currencyamount ASSIGNING <fs_currency> INDEX 1.
IF sy-subrc IS INITIAL.
<fs_currency>-amt_doccur = <fs_currency>-amt_doccur * -1.
<fs_currency>-amt_base = <fs_currency>-amt_base * -1.
ENDIF.
ELSE.
LOOP AT lt_currencyamount ASSIGNING <fs_currency>.
IF <fs_currency>-itemno_acc > 1.
<fs_currency>-amt_doccur = <fs_currency>-amt_doccur * -1.
<fs_currency>-amt_base = <fs_currency>-amt_base * -1.
ENDIF.
ENDLOOP.
ENDIF.

* Get vendor data


get_vendor( IMPORTING et_accountpayable = lt_accountpayable ).

* Get tax postions


get_tax( IMPORTING et_accounttax = lt_accounttax ).

* Get Payment card


get_paymentcard( IMPORTING et_paymentcard = lt_paymentcard ).

* Get contract item


get_contract_item( IMPORTING et_contractitem = lt_contractitem ).
* Get Real State data
get_re_data( IMPORTING et_realestate = lt_realestate ).

REFRESH: lt_return.
SELECT SINGLE * INTO ls_bsip FROM bsip
WHERE bukrs = ms_general_data-bukrs AND
lifnr = ms_fi_fields-lifnr AND
waers = ms_general_data-waers AND
bldat = ms_general_data-bldat AND
xblnr = ms_general_data-reference.

IF sy-subrc EQ 0.
* RAISE EXCEPTION TYPE /edge/cx_ei_it_exception
* EXPORTING
* textid = /edge/cx_ei_it_exception=>post_error.
DATA lv_string TYPE string.
CONCATENATE 'Document has already been entered under number'
ls_bsip-bukrs ls_bsip-belnr ls_bsip-
gjahr INTO lv_string SEPARATED BY space.
MESSAGE lv_string TYPE 'W' DISPLAY LIKE 'E'.
* Implement suitable error handling here
ELSE.

CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'


EXPORTING
documentheader = ls_documentheader
customercpd = ls_customercpd
IMPORTING
obj_type = lv_objtype
obj_key = lv_objkey
obj_sys = lv_objsys
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
accounttax = lt_accounttax
currencyamount = lt_currencyamount
* CRITERIA =
* VALUEFIELD =
* EXTENSION1 =
return = et_return
paymentcard = lt_paymentcard
contractitem = lt_contractitem
extension2 = lt_extension2
realestate = lt_realestate.
* accountwt = ms_pst_invoice-acctwt

CLEAR ls_error.
READ TABLE et_return ASSIGNING <ls_return> WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ls_error = abap_true.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ENDIF.
LOOP AT et_return ASSIGNING <ls_return> WHERE type = 'E'.
CALL METHOD mo_log->add_msg_e
EXPORTING
pi_msgid = <ls_return>-id
pi_msgno = <ls_return>-number
pi_msgv1 = <ls_return>-message_v1
pi_msgv2 = <ls_return>-message_v2
pi_msgv3 = <ls_return>-message_v3
pi_msgv4 = <ls_return>-message_v4.
ENDLOOP.
IF ls_error IS NOT INITIAL.
RAISE EXCEPTION TYPE /edge/cx_ei_it_exception
EXPORTING
textid = /edge/cx_ei_it_exception=>post_error.
ENDIF.
es_einvoice-belnr = lv_objkey(10).
es_einvoice-bukrs = lv_objkey+10(4).
es_einvoice-gjahr = lv_objkey+14(4).

DO 5 TIMES.
* WHILE es_einvoice-xblnr_alt IS INITIAL.
SELECT SINGLE xblnr_alt INTO es_einvoice-xblnr_alt FROM bkpf
WHERE bukrs = es_einvoice-bukrs AND
belnr = es_einvoice-belnr AND
gjahr = es_einvoice-gjahr.

IF sy-subrc IS NOT INITIAL.


WAIT UP TO 1 SECONDS.
ELSE.
EXIT.
ENDIF.
* ENDWHILE.
ENDDO.
* ev_ref_busobjke = lv_objkey+0(10).
CONCATENATE lv_objkey+10(4) lv_objkey(10) lv_objkey+14(4) INTO es_
einvoice-ref_busobjke.
* cs_einvoice-ref_busobjke = lv_objkey+0(10).
ev_ref_busobjke = es_einvoice-ref_busobjke.
ev_success = 'X'.
ENDIF.
ENDMETHOD.

SIMU_FI_INVOICE:

METHOD /edge/if_ei_it_posting_doc~simu_fi_invoice.

DATA: ls_documentheader TYPE bapiache09,


ls_customercpd TYPE bapiacpa09,
lv_tipo_doc TYPE char4,
ls_body TYPE /edge/ei_itfattura_elettronic5,
lt_accountreceivable TYPE ty_t_accountreceivable,
lt_currencyamount TYPE ty_t_currencyamount,
lt_accountpayable TYPE ty_t_accountpayable,
lt_accounttax TYPE ty_t_accounttax,
lt_accountgl TYPE ty_t_accountgl,
lt_paymentcard TYPE ty_t_paymentcard,
lt_contractitem TYPE ty_t_contractitem,
lt_realestate TYPE ty_t_realestate,
lt_extension2 TYPE ty_t_extension2.

DATA: lt_return TYPE bapiret2_t,


ls_error TYPE abap_bool.

FIELD-SYMBOLS: <ls_return> LIKE LINE OF lt_return,


<fs_currency> TYPE bapiaccr09.

instantiate_attributes( EXPORTING is_general_data = is_general_data


is_fi_fields = is_fi_fields
it_screen_fields_gen = it_screen_f
ields_gen
it_screen_fields_fi = it_screen_fi
elds_fi
is_estructura_xml = is_estructura_
xml ).

* Get header data


get_document_header( IMPORTING es_documentheader = ls_documentheader
).

* Get cpd data


get_customercpd( IMPORTING es_customercpd = ls_customercpd ).

* Item
get_items( IMPORTING et_accountreceivable = lt_accountreceivable
et_currencyamount = lt_currencyamount
et_accountgl = lt_accountgl
et_extension2 = lt_extension2 ).

READ TABLE is_estructura_xml-


fattura_elettronica_body INTO ls_body INDEX 1.
IF sy-subrc IS INITIAL.
lv_tipo_doc = ls_body-dati_generali-dati_generali_documento-
tipo_documento.
ENDIF.
IF lv_tipo_doc NE 'TD04'.
READ TABLE lt_currencyamount ASSIGNING <fs_currency> INDEX 1.
IF sy-subrc IS INITIAL.
<fs_currency>-amt_doccur = <fs_currency>-amt_doccur * -1.
<fs_currency>-amt_base = <fs_currency>-amt_base * -1.
ENDIF.
ELSE.
LOOP AT lt_currencyamount ASSIGNING <fs_currency>.
IF <fs_currency>-itemno_acc > 1.
<fs_currency>-amt_doccur = <fs_currency>-amt_doccur * -1.
<fs_currency>-amt_base = <fs_currency>-amt_base * -1.
ENDIF.
ENDLOOP.
ENDIF.

* Get vendor data


get_vendor( IMPORTING et_accountpayable = lt_accountpayable ).
* Get tax postions
get_tax( IMPORTING et_accounttax = lt_accounttax ).

* Get Payment card


get_paymentcard( IMPORTING et_paymentcard = lt_paymentcard ).

* Get contract item


get_contract_item( IMPORTING et_contractitem = lt_contractitem ).

* Get Real State data


get_re_data( IMPORTING et_realestate = lt_realestate ).

REFRESH: lt_return.

CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'


EXPORTING
documentheader = ls_documentheader
customercpd = ls_customercpd
* CONTRACTHEADER =
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
accounttax = lt_accounttax
currencyamount = lt_currencyamount
* CRITERIA =
* VALUEFIELD =
* EXTENSION1 =
return = et_return
paymentcard = lt_paymentcard
contractitem = lt_contractitem
extension2 = lt_extension2
realestate = lt_realestate.
* ACCOUNTWT =

CLEAR ls_error.
READ TABLE lt_return ASSIGNING <ls_return> WITH KEY type = 'E'.
IF sy-subrc = 0.
ls_error = abap_true.
ENDIF.

LOOP AT lt_return ASSIGNING <ls_return> WHERE type = 'E'.


CALL METHOD mo_log->add_msg_e
EXPORTING
pi_msgid = <ls_return>-id
pi_msgno = <ls_return>-number
pi_msgv1 = <ls_return>-message_v1
pi_msgv2 = <ls_return>-message_v2
pi_msgv3 = <ls_return>-message_v3
pi_msgv4 = <ls_return>-message_v4.
ENDLOOP.
IF ls_error IS NOT INITIAL.
RAISE EXCEPTION TYPE /edge/cx_ei_it_exception
EXPORTING
textid = /edge/cx_ei_it_exception=>post_error.
ENDIF.
ev_success = 'X'.

ENDMETHOD.

GET_DOCUMENT HEADER:

method /EDGE/IF_EI_IT_POSTING_DOC~GET_DOCUMENT_HEADER.

* Received
* es_documentheader-bus_act = 'RMRP'.
es_documentheader-username = sy-uname.
es_documentheader-doc_date = ms_general_data-bldat.
es_documentheader-pstng_date = ms_general_data-budat.
es_documentheader-vatdate = ms_general_data-vatdate.
es_documentheader-doc_type = ms_general_data-blart.
es_documentheader-ref_doc_no = ms_general_data-reference.
es_documentheader-comp_code = ms_general_data-bukrs.
es_documentheader-fis_period = ms_general_data-monat.
es_documentheader-fisc_year = ms_general_data-gjahr.
es_documentheader-header_txt = ms_general_data-bktxt.

* Enhancement
get_document_header_enh( CHANGING cs_documentheader = es_documenthea
der ).

ENDMETHOD.

Luego esta la lógica, en la BADI /EDGE/BADI_EI_IT_FI_FIELDS:

Metodos:

GET_ITEMS_FI

METHOD /edge/if_ei_it_badi_fi_fields~get_items_fi.

FIELD-SYMBOLS: <ls_body> LIKE LINE OF is_estructura_xml-


fattura_elettronica_body,
<ls_linea> LIKE LINE OF <ls_body>-dati_beni_servizi-
dettaglio_linee,
<ls_item> LIKE LINE OF et_item.

READ TABLE is_estructura_xml-


fattura_elettronica_body ASSIGNING <ls_body> INDEX mv_seqin.
IF sy-subrc NE 0.
"TO_DO lanzar excepción
ELSE.

LOOP AT <ls_body>-dati_beni_servizi-
dettaglio_linee ASSIGNING <ls_linea>.
APPEND INITIAL LINE TO et_item ASSIGNING <ls_item>.
"<ls_item>-BSCHL --> Sin implementación
"<ls_item>-HKONT --> Sin implementación
"<ls_item>-MWSKZ --> Sin implementación
IF <ls_body>-dati_generali-dati_generali_documento-
tipo_documento EQ 'TD04'.
<ls_item>-bschl = 50.
ELSE.
<ls_item>-bschl = 40.
ENDIF.
<ls_item>-porcentage = <ls_linea>-aliquota_iva.
<ls_item>-dmbtr = <ls_linea>-prezzo_totale.
ENDLOOP.
ENDIF.
ENDMETHOD.

GET_VENDOR:

METHOD /edge/if_ei_it_badi_fi_fields~get_vendor.

DATA lv_stcd2 TYPE lfa1-stceg.

CONCATENATE is_estructura_xml-fattura_elettronica_header-
cedente_prestatore-dati_anagrafici-id_fiscale_iva-id_paese
is_estructura_xml-fattura_elettronica_header-
cedente_prestatore-dati_anagrafici-id_fiscale_iva-
id_codice INTO lv_stcd2.

IF lv_stcd2 IS INITIAL.
lv_stcd2 = is_estructura_xml-fattura_elettronica_header-
cedente_prestatore-dati_anagrafici-codice_fiscale.
ENDIF.

SELECT SINGLE lifnr name1 INTO ( es_vendor-lifnr , es_vendor-


lifnr_name )
FROM lfa1 WHERE stcd2 = lv_stcd2.

IF sy-subrc IS NOT INITIAL.


SELECT SINGLE lifnr name1 INTO ( es_vendor-lifnr , es_vendor-
lifnr_name )
FROM lfa1 WHERE stceg = lv_stcd2.
ENDIF.

DATA ls_body TYPE /edge/ei_itfattura_elettronic5.


DATA ls_riepilogo TYPE /edge/ei_itdati_riepilogo_typ1.

READ TABLE is_estructura_xml-


fattura_elettronica_body INTO ls_body INDEX 1.

IF sy-subrc IS INITIAL.
IF ls_body-dati_generali-dati_generali_documento-
tipo_documento EQ 'TD04'.
es_vendor-bschl = 21.
ELSE.
es_vendor-bschl = 31.
ENDIF.
LOOP AT ls_body-dati_beni_servizi-
dati_riepilogo INTO ls_riepilogo.

es_vendor-dmbtr = es_vendor-dmbtr + ls_riepilogo-


imposta + ls_riepilogo-arrotondamento + ls_riepilogo-
imponibile_importo.
ENDLOOP.

ENDIF.

ENDMETHOD.

GET_TOTAL_AMOUNT:

METHOD /EDGE/IF_EI_IT_BADI_FI_FIELDS~GET_TOTAL_AMOUNT.

FIELD-SYMBOLS: <ls_body> LIKE LINE OF is_estructura_xml-


fattura_elettronica_body,
<ls_riepilogo> LIKE LINE OF <ls_body>-
dati_beni_servizi-dati_riepilogo.

READ TABLE is_estructura_xml-


fattura_elettronica_body ASSIGNING <ls_body> INDEX mv_seqin.
IF sy-subrc NE 0.
"TO_DO
ENDIF.
LOOP AT <ls_body>-dati_beni_servizi-
dati_riepilogo ASSIGNING <ls_riepilogo>.
ev_total_amount = ev_total_amount + <ls_riepilogo>-
imponibile_importo + <ls_riepilogo>-imposta.
ENDLOOP.

ENDMETHOD.

GET_TAX_FI:

METHOD /edge/if_ei_it_badi_fi_fields~get_tax_fi.

FIELD-SYMBOLS: <ls_body> LIKE LINE OF is_estructura_xml-


fattura_elettronica_body,
<ls_riepilogo> LIKE LINE OF <ls_body>-
dati_beni_servizi-dati_riepilogo,
<ls_tax> LIKE LINE OF et_tax.

READ TABLE is_estructura_xml-


fattura_elettronica_body ASSIGNING <ls_body> INDEX mv_seqin.
IF sy-subrc NE 0.
"TO_DO
ELSE.
LOOP AT <ls_body>-dati_beni_servizi-
dati_riepilogo ASSIGNING <ls_riepilogo>.
APPEND INITIAL LINE TO et_tax ASSIGNING <ls_tax>.
IF <ls_body>-dati_generali-dati_generali_documento-
tipo_documento EQ 'TD04'.
<ls_tax>-bschl_tax = 50.
ELSE.
<ls_tax>-bschl_tax = 40.
ENDIF.
<ls_tax>-porcentage = <ls_riepilogo>-aliquota_iva.
<ls_tax>-dmbtr = <ls_riepilogo>-imposta.
<ls_tax>-hwbas = <ls_riepilogo>-imponibile_importo.
ENDLOOP.
ENDIF.
ENDMETHOD.

GET_PAYMENT_DATA:

METHOD /edge/if_ei_it_badi_fi_fields~get_payment_data.
DATA lv_darco TYPE /edge/fc_tb901-darco.
DATA lv_brsch TYPE lfa1-brsch.
DATA ls_general_data LIKE LINE OF is_estructura_xml-
fattura_elettronica_body.
DATA ls_pagamento TYPE /edge/ei_itdati_pagamento_typ1.
DATA ls_dettaglio TYPE /edge/ei_itdettaglio_pagament1.
SELECT SINGLE brsch INTO lv_brsch FROM lfa1
WHERE lifnr = iv_lifnr.

IF sy-subrc IS INITIAL.
CASE lv_brsch.
WHEN 'CMIT'.
es_payment-zlspr = 'C'.
WHEN OTHERS.
es_payment-zlspr = 'K'.
ENDCASE.

ENDIF.

READ TABLE is_estructura_xml-


fattura_elettronica_body INTO ls_general_data INDEX 1.

IF sy-subrc IS INITIAL.
MOVE ls_general_data-dati_generali-dati_generali_documento-
data TO es_payment-zfbdt.
READ TABLE ls_general_data-
dati_pagamento INTO ls_pagamento INDEX 1.

IF sy-subrc IS INITIAL.
READ TABLE ls_pagamento-
dettaglio_pagamento INTO ls_dettaglio INDEX 1.

IF sy-subrc IS INITIAL.

IF ls_dettaglio-
modalita_pagamento EQ 'MP08' AND ( ls_general_data-dati_generali-
dati_generali_documento-tipo_documento EQ 'TD02' OR
ls_genera
l_data-dati_generali-dati_generali_documento-
tipo_documento EQ 'TD03' ).
es_payment-zlspr = 'D'.
ENDIF.
ENDIF.
ENDIF.

ENDIF.
* es_payment-zfbdt = sy-datum.

SELECT SINGLE zterm zwels INTO ( es_payment-zterm , es_payment-


zlsch ) FROM lfb1
WHERE lifnr = iv_lifnr.
ENDMETHOD.

You might also like