You are on page 1of 101

Atribuir as funções abaixo da seguinte forma:

Repetir em todas as regras de avaliação.

Função Z_BARWERT_ANALYSE
Texto fonte:

FUNCTION ZGCTP_BARWERT_USEREXIT_ANALYSE.

*"----------------------------------------------------------------------

*"*"Interface local:

*" IMPORTING

*" VALUE(I_EXPAR) LIKE VTVEXFM STRUCTURE VTVEXFM


*" TABLES

*" I_KOET STRUCTURE JBIKOET08

*" I_OPTI STRUCTURE JBIOPTI08

*" I_BEWEG STRUCTURE JBIBEWEG08

*" I_FML STRUCTURE JBIFML08

*" I_HIER STRUCTURE JBIHIER08

*" I_MSEG STRUCTURE JBIMSEG08

*" E_YC STRUCTURE VTVMDSIN

*" E_CR STRUCTURE VTVMDSCR

*" E_WP STRUCTURE VTVMDSWP

*" E_IX STRUCTURE VTVMDSIX

*" E_VO STRUCTURE VTVMDSVO

*" E_RF STRUCTURE VTVMDSRF

*" E_MESSAGES STRUCTURE VTVPVUEMSG

*"----------------------------------------------------------------------

vg_cenario = i_expar-scenario.

READ TABLE i_koet WITH KEY ngidnr = 1.

READ TABLE i_mseg WITH KEY ngidnr = 1.

READ TABLE i_beweg WITH KEY ngidnr = 1 ncfnr = 1.

* O código abaixo foi inserido:

FIELD-SYMBOLS:

<beweg> TYPE jbibeweg08.

DATA:
vl_ridxrt TYPE jbrdbbeweg-ridxrt, " No. interno da transação genérica

l_nrobj TYPE J_OBJNR,

l_bukrs TYPE vtbfha-bukrs,

l_rfha TYPE vtbfha-rfha,

l_rfhazunr TYPE vtbfha-rfhazunr,

l_rfhazul TYPE vtbfha-rfhazul,

l_sformref TYPE vtbfinko-sformref,

l_rkondgr TYPE vtbfinko-rkondgr,

l_rkond TYPE vtbfinko-rkond,

l_dguel_kp TYPE vtbfinko-dguel_kp,

l_pkond TYPE vtbafinko-pkond,

l_wyref TYPE i73gpa1-wyref.

* Busca algumas informações necessárias para o negócio.

LOOP AT i_beweg ASSIGNING <beweg>.

if <beweg>-objnr IS ASSIGNED.

l_nrobj = <beweg>-objnr.

else.

clear l_nrobj.

endif.

CLEAR: l_pkond, l_wyref.

Select SINGLE

bukrs

rfha

RFHAZUL

INTO (l_bukrs,

l_rfha,
l_rfhazul)

FROM VTBFHA

WHERE objnr = l_nrobj.

IF sy-subrc IS INITIAL.

SELECT SINGLE

sformref

rkondgr

rkond

dguel_kp

ppayment

szsref "VSI03+

INTO (l_sformref,

l_rkondgr,

l_rkond,

l_dguel_kp,

l_pkond,

l_wyref) "VSI03+

FROM vtbfinko

WHERE bukrs = l_bukrs AND

rfha = l_rfha AND

rfhazu = l_rfhazul AND

RKONDGR = i_BEWEG-rkondgr AND "VSI03+

( sbktyp = '15' OR

sbktyp = '20' ) AND

dguel_kp <= i_expar-evaldate.


IF sy-subrc IS INITIAL.

SELECT SINGLE

pkond

INTO l_pkond

FROM vtbafinko

WHERE bukrs = l_bukrs AND

rfha = l_rfha AND

rfhazu = l_rfhazul AND

rkondgr = l_rkondgr AND

rkond = l_rkond AND

dguel_kp = l_dguel_kp AND

sformref = l_sformref AND

svarname = 'V3'.

* IF sy-subrc IS INITIAL.

ENDIF.

ENDIF.

* SELECT SINGLE "VSI03-

* wyref "VSI03-

* INTO l_wyref "VSI03-

* FROM i73gpa1 "VSI03-

* WHERE objnr = l_nrobj. "VSI03-

* if sy-subrc IS NOT INITIAL. "VSI03-

* clear l_wyref. "VSI03-

* endif. "VSI03-

* ENDIF. "VSI03-

* ENDIF. "VSI03-
* ENDIF. "VSI03-

<beweg>-szsref = l_wyref.

<beweg>-soffset = l_pkond.

ENDLOOP.

LOOP AT i_beweg WHERE snwhr NE space.

CLEAR e_cr.

CLEAR e_yc.

IF i_beweg-snwhr NE i_expar-currency.

e_cr-fcurr = i_beweg-snwhr.

e_cr-tcurr = i_expar-currency.

APPEND e_cr.

ENDIF.

e_yc-waers = i_beweg-scwhr.

e_yc-szkart = i_mseg-bcurve.

APPEND e_yc.

ENDLOOP.

SORT e_cr.
DELETE ADJACENT DUPLICATES FROM e_cr.

SORT e_yc.

DELETE ADJACENT DUPLICATES FROM e_yc.

** LOOP AT i_beweg WHERE snwhr NE i_expar-currency

** AND snwhr NE space.

**

** CLEAR e_cr.

**

** e_cr-fcurr = i_beweg-snwhr.

** e_cr-tcurr = i_expar-currency.

**

** APPEND e_cr.

**

** ENDLOOP.

**

** SORT e_cr.

**

** DELETE ADJACENT DUPLICATES FROM e_cr.

**

** CLEAR e_yc.

**

** e_yc-waers = i_beweg-scwhr.

** e_yc-szkart = i_mseg-bcurve.

**

** APPEND e_yc.
ENDFUNCTION.

Função Z_BARWERT_BEWERTUNG
Texto Fonte:

FUNCTION zfctp_barwert_userexit_bewert.

*"--------------------------------------------------------------------
--

*"*"Interface local:

*" IMPORTING

*" VALUE(I_EXPAR) LIKE VTVEXFM STRUCTURE VTVEXFM


*" EXPORTING

*" VALUE(ENPV) LIKE VTVPVUEDATATYPES-RESULT

*" VALUE(E_CURRENCY) LIKE TCURC-WAERS

*" TABLES

*" I_KOET STRUCTURE JBIKOET08

*" I_OPTI STRUCTURE JBIOPTI08

*" I_BEWEG STRUCTURE JBIBEWEG08

*" I_FML STRUCTURE JBIFML08

*" I_HIER STRUCTURE JBIHIER08

*" I_MSEG STRUCTURE JBIMSEG08

*" I_YCURVE STRUCTURE VTVMDVIN

*" I_CURR STRUCTURE VTVMDVCR

*" I_RATE STRUCTURE VTVMDVWP

*" I_INDEX STRUCTURE VTVMDVIX

*" I_VOLA STRUCTURE VTVMDVVO

*" I_RF STRUCTURE VTVMDVRF

*" E_MESSAGES STRUCTURE VTVPVUEMSG

*" E_DETAIL STRUCTURE VTVDPROT

*"--------------------------------------------------------------------
--

* Global data declarations

tg_curr[] = i_curr[].

IF i_expar-currency IS INITIAL.

i_expar-currency = 'BRL'.

ENDIF.

* Inicializa variáveis.

CLEAR:

vg_nok,
vg_meth,

vg_log_flg,

vg_vf,

tg_curr,

vg_vp_aux,

tg_curr[],

tg_beweg[],

vg_cabec_log_flg,

tg_detail,

tg_detail[].

TYPE-POOLS: tv1, tvs, tvm, tvmz, rmsva.

DATA: prot_itab TYPE TABLE OF rmdprot WITH HEADER


LINE,

t_meo TYPE tvm_meo_tab WITH HEADER


LINE,

t_meth TYPE TABLE OF vtvfima WITH HEADER


LINE,

t_fob TYPE TABLE OF jbrfob WITH HEADER


LINE,

t_income TYPE ZCTCTP_INCOME,

e_eodd TYPE TABLE OF vtveodd,

t_error TYPE TABLE OF bapierr,

t_root TYPE tv1_knot_id,

t_sfgdt TYPE tvs_sfgdt_tab,

e_sfgdt TYPE tvs_sfgdt_typ,

wa_sfgdt TYPE LINE OF tvs_sfgdt_tab,

wa_mez TYPE LINE OF tvmz_mez_tab,

wa_fget TYPE tv1_fget_typ, " Master-FGET

con_gid_root TYPE tv1_knot_id,

rmfima_mez TYPE tvmz_mez_tab,


spara TYPE rmsva_spara,

t_mez TYPE tvmz_mez_tab,

t_fgdt TYPE tvv_fgdt_typ,

wa_result LIKE LINE OF t_meo-result_tab,

for_capfac TYPE TABLE OF zvtvmdvin WITH HEADER LINE.

DATA: wa_beweg LIKE i_beweg OCCURS 0 WITH HEADER LINE,

t_beweg_nxt LIKE i_beweg OCCURS 0 WITH HEADER LINE, "VSI01+

wa_beweg_nxt LIKE LINE OF t_beweg_nxt, "VSI01+

w_income LIKE LINE OF t_income.

DATA: BEGIN OF e_eval,

accrual TYPE f,

mtm_date TYPE tv_horizon,

n TYPE f,

cf TYPE f,

cdi TYPE f,

cdi_% TYPE f,

cf_% TYPE f,

fv TYPE f,

pv TYPE f,

END OF e_eval.

*** Variáveis ***

DATA: v_flag_standard_calc TYPE char1,

v_flag_swap_initial TYPE char1,

v_new TYPE char1,

v_objnr TYPE vtbfha-objnr,

v_glpar TYPE jbrglpar,


v_status TYPE sy-subrc,

v_szsrefvz TYPE char10,

v_soffset TYPE char12,

v_sign TYPE char1,

v_clean_price TYPE f,

v_rc TYPE sy-subrc,

vl_tabix TYPE i,

v_text TYPE t5nk9-message,

v_bcurve TYPE num4,

v_bcurveb TYPE num4,

v_index TYPE sy-tabix, "VSI01+

v_coef(15) TYPE p DECIMALS 7, "VSI01+

v_data2 TYPE datum,

v_key_date TYPE datum,

v_position_curr TYPE WAERS.

DATA : c_000(08) TYPE c VALUE '00000000'.

DATA : v_log_flg TYPE flag,

v_calc(15) TYPE p DECIMALS 2.

DATA : enpv2 TYPE vtvpvuedatatypes-result.

DATA : T_DIF_POS_IDENT TYPE DIFY_POS_IDENT_STANDARD,

st_dif_pos_ident LIKE LINE OF t_dif_pos_ident,

ID_TRANSACOES TYPE TPMY_GUID,

v_company_code TYPE bukrs,

v_DEAL_NUMBER TYPE TB_RFHA,

v_trans(32) TYPE c,

v_tab_flowt TYPE TRGR_DIS_FLOWTYPE,


t_ex_prot_tab_header TYPE TABLE OF trlis_ad_list_header,

st_ex_prot_tab_header TYPE LINE OF TRLIY_AD_LIST_HEADER,

v_sum TYPE TPM_AD_DELTA_PC,

v_foreign_amount TYPE p DECIMALS 2,

st_bukrs_deal TYPE ZTRGS_BUKRS_DEALNUMBER,

t_bukrs_deal TYPE TABLE OF trgs_bukrs_dealnumber.

DATA : R_RNGVALAREAS TYPE TABLE OF trgs_valuation_area,

R_line LIKE LINE OF r_rngvalareas.

* Esta função calcula o valor do NPV ou do Clean Price e retorna o


valor

* calculado na variável ENPV

* Se método 100 calcula o valor do NPV( Net Present Value)

* Se método 120 calcula o valor do Clean Price

break ct005992.

break ct006045.

r_line-sign = 'I'.

r_line-option = 'EQ'.

r_line-low = '001'.

r_line-high = '000'.

append r_line to r_rngvalareas.

READ TABLE i_koet INDEX 1.

CHECK i_expar-methode = '100' OR "NPV

( i_expar-methode = '120' AND

i_koet-gform = '001' ).

* Inícia as varáveis

FREE: t_meth,
t_sfgdt.

CLEAR: v_flag_standard_calc,

v_flag_swap_initial,

v_new,

v_objnr.

* READ TABLE i_koet INDEX 1.

*==> Rotina standard para recuperar os dados


--------------------------*

CALL FUNCTION 'RM_HSSPAR_FILL_FOR_SVA'

EXPORTING

i_analysis_type = '01'

* i_eval = '1010'

i_curr = i_expar-currency

i_hori = i_expar-horizon

i_date = i_expar-horizon

IMPORTING

e_spara_w = spara.

CALL FUNCTION 'RM_EVAL_INITIALIZE'

EXPORTING

i_spara = spara

EXCEPTIONS

init_error = 1

OTHERS = 2.

CALL FUNCTION 'RM_PROT_REPORT'

EXPORTING

date = spara-datum
hori = spara-horizont

eval = spara-auswertung

szen = spara-szenari

curr = spara-waers

EXCEPTIONS

OTHERS = 1.

CALL FUNCTION 'RM_FIMA_INITIALIZE'.

CLEAR t_meth.

t_meth-methode = i_expar-methode.

t_meth-horizont = i_expar-horizon.

APPEND t_meth.

t_meth-methode = '300'.

APPEND t_meth.

CALL FUNCTION 'ISB_ZUSPROT_INITIALIZE'

EXPORTING

level = 1

EXCEPTIONS

OTHERS = 1.

* Inicio nova versão - Vitor - 01/08/2011 <=======================

* CLEAR t_meth.

* wa_meth-methode = i_expar-methode.

* wa_meth-horizont = i_expar-horizon.

* APPEND wa_meth TO t_meth.

* LOOP AT e_t_beweg INTO wa_beweg

* WHERE ( ( szinsart EQ con_cf_var ) OR


* ( ( szsref NE space ) AND

* ( cfknz = con_8 ) ) ) AND

* ( ( ddispo IS INITIAL AND

* dfaell GE i_expar-evaldate )

* OR ddispo GE i_expar-evaldate ) .

* wa_jbrfob-objnr = wa_beweg-objnr.

* vl_objnr = wa_beweg-objnr.

* APPEND wa_jbrfob TO t_jbrfob.

* IF wa_beweg-dzfest GE i_expar-evaldate.

* DELETE e_t_beweg.

* ELSE.

** Referenzzins hätte schon gefixt sein müssen.

* miss_fix = con_1.

* ENDIF.

* ENDLOOP.

* SORT t_jbrfob.

* DELETE ADJACENT DUPLICATES FROM t_jbrfob COMPARING ALL FIELDS.

* BREAK-POINT.

* CALL FUNCTION 'RM_FIMA_EVAL_SELECTION'

* EXPORTING

* i_date = i_expar-evaldate

* i_anwtyp = '1'

* i_sicht = vl_sicht

* IMPORTING

* e_sfgdt = t_sfgdt

* TABLES

* i_jbrfob = t_jbrfob

* CHANGING
* c_done = vl_done.

* CALL FUNCTION 'RM_FG_EVAL_ENRICH'

* EXPORTING

* spara = spara

* TABLES

* i_meth = t_meth

* CHANGING

* m_sfgdt = t_sfgdt.

* LOOP AT t_sfgdt INTO wa_sfgdt.

* READ TABLE t_sfgdt INTO wa_sfgdt INDEX 1.

* t_fgdt = wa_sfgdt-fgdt.

* t_fget_t = t_fgdt-fget_t.

* READ TABLE t_fget_t INTO wa_fget_t INDEX 1.

* t_gid = wa_fget_t-gid.

* READ TABLE t_gid INTO wa_gid INDEX 1.

* vl_ngidnr = wa_gid.

* t_beweg_aux = wa_fget_t-beweg_t.

* t_mseg = wa_fget_t-mseg.

* t_best = wa_fget_t-best.

* LOOP AT t_beweg_aux INTO wa_beweg_aux.

* IF wa_beweg_aux-cashflow-dzfest LT i_expar-evaldate.

* DELETE t_beweg_aux INDEX sy-tabix.

* ENDIF.

* ENDLOOP.

* CALL FUNCTION 'RM_MM_FILL_VARIABLE_CASHFLOW'

* EXPORTING
* i_akt_datum = i_expar-evaldate

* i_ausw_datum = i_expar-evaldate

* i_res_curr = i_expar-currency

* i_bssign = '-'

* i_mseg = t_mseg

* vari_i_fgcf = t_beweg_aux

* i_best = t_best

* IMPORTING

* vari_e_fgcf = t_beweg_imp.

* ENDLOOP.

* SORT t_beweg_imp BY cashflow-ssign ASCENDING

* cashflow-bcwhr ASCENDING

* cashflow-dfaell ASCENDING.

* LOOP AT t_beweg_imp INTO wa_beweg_aux.

* MOVE-CORRESPONDING wa_beweg_aux-cashflow TO wa_beweg.

* wa_beweg-objnr = vl_objnr.

* APPEND wa_beweg TO e_t_beweg.

* ENDLOOP.

* Final nova versão - Vitor - 01/08/2011


<=======================

DATA: v_datastr TYPE jbrrmbid,

v_anwtyp_c TYPE afwch_segmchartype,

v_anwtyp_n TYPE tv_anwtyp,

v_internal_view TYPE jbrsichtid.

CALL FUNCTION 'AFWCH_ACTIVE_DATASTR_GET'

IMPORTING

e_datastr = v_datastr

e_segm_char_type = v_anwtyp_c
e_internal_view = v_internal_view.

*-- Zeitmesspunkt Selektion Anfang

CALL FUNCTION 'RM_ZZ_TIME_AT_BEGIN'

EXPORTING

tmekey = '1001'

name = 'SELECTION'.

DATA: f1(12),

f2.

v_anwtyp_n = v_anwtyp_c.

CLEAR t_fob.

t_fob-objnr = i_koet-objnr.

APPEND t_fob.

CALL FUNCTION 'RM_FIMA_EVAL_SELECTION'

EXPORTING

i_date = i_expar-evaldate

i_anwtyp = v_anwtyp_n

i_sicht = v_internal_view

IMPORTING

e_sfgdt = t_sfgdt

TABLES

i_jbrfob = t_fob

CHANGING

c_bpid = f1

c_done = f2.
*-- Zeitmesspunkt Anreicherung Ende

CALL FUNCTION 'RM_ZZ_TIME_AT_END'

EXPORTING

tmekey = '1001'.

*-- Zeitmesspunkt Anreicherung Anfang

CALL FUNCTION 'RM_ZZ_TIME_AT_BEGIN'

EXPORTING

tmekey = '1002'

name = 'ENRICHMENT'.

CALL FUNCTION 'RM_FG_EVAL_ENRICH'

EXPORTING

spara = spara

TABLES

i_meth = t_meth

CHANGING

m_sfgdt = t_sfgdt.

DATA: t_beweg_aux TYPE jbry_beweg,

t_mseg TYPE tv0_mseg_typ,

t_best TYPE tv0_best_typ,

t_beweg_imp TYPE tv0_beweg_tab,

t_fget_t TYPE jbry_fget,

t_gid TYPE jbry_int4.

DATA: wa_beweg_aux TYPE jbrs_beweg,

wa_fget_t TYPE LINE OF jbry_fget,

wa_gid TYPE LINE OF jbry_int4.


DATA: vl_ngidnr TYPE jbibeweg08-ngidnr.

LOOP AT t_sfgdt INTO wa_sfgdt.

READ TABLE t_sfgdt INTO wa_sfgdt INDEX 1.

t_fgdt = wa_sfgdt-fgdt.

t_fget_t = t_fgdt-fget_t.

READ TABLE t_fget_t INTO wa_fget_t INDEX 1.

t_gid = wa_fget_t-gid.

READ TABLE t_gid INTO wa_gid INDEX 1.

vl_ngidnr = wa_gid.

t_beweg_aux = wa_fget_t-beweg_t.

t_mseg = wa_fget_t-mseg.

t_best = wa_fget_t-best.

LOOP AT t_beweg_aux INTO wa_beweg_aux.

IF wa_beweg_aux-cashflow-dzfest LT i_expar-evaldate.

DELETE t_beweg_aux INDEX sy-tabix.

ENDIF.

ENDLOOP.

ENDLOOP.

break ct006399.

sort i_beweg by rkondgr bnwhr.

t_beweg_nxt[] = i_beweg[].

* Determinação de coeficiente para juros variáveis.

LOOP AT i_beweg WHERE cfknz = 1.

v_index = sy-tabix + 1.

DO.

READ TABLE t_beweg_nxt INTO wa_beweg_nxt INDEX v_index.


IF wa_beweg_nxt-cfknz = 1 or

sy-subrc IS NOT INITIAL.

exit.

ELSE.

v_index = v_index + 1.

ENDIF.

ENDDO.

IF sy-subrc = 0 AND

i_beweg-rkondgr = wa_beweg_nxt-rkondgr.

if i_beweg-bcwhr = 0.

i_beweg-bcwhr = wa_beweg_nxt-bnwhr - i_beweg-bnwhr.

IF i_beweg-bnwhr <> 0.

v_coef = i_beweg-bcwhr / i_beweg-bnwhr.

ELSE.

v_coef = 1.

ENDIF.

MODIFY i_beweg.

ENDIF.

ELSE.

if i_beweg-bcwhr = 0 AND

i_beweg-cfknz = 1.

i_beweg-bcwhr = i_beweg-bnwhr * v_coef.

MODIFY i_beweg.

endif.

ENDIF.

ENDLOOP.

sort i_beweg by rkondgr ncfnr.


* LOOP AT t_beweg_imp INTO wa_beweg_aux.

* MOVE-CORRESPONDING wa_beweg_aux-cashflow TO wa_beweg.

* wa_beweg-objnr = vl_objnr.

* APPEND wa_beweg TO e_t_beweg.

* ENDLOOP.

*-- Zeitmesspunkt Anreicherung Ende

CALL FUNCTION 'RM_ZZ_TIME_AT_END'

EXPORTING

tmekey = '1002'.

READ TABLE t_sfgdt INDEX 1 INTO wa_sfgdt.

CLEAR v_glpar.

t_fgdt = wa_sfgdt-fgdt.

MOVE-CORRESPONDING spara TO v_glpar.

REFRESH t_root.

APPEND 1 TO t_root.

*-- Zeitmesspunkt Bewertung Anfang

CALL FUNCTION 'RM_ZZ_TIME_AT_BEGIN'

EXPORTING

tmekey = '1003'

name = 'VALUATION'.

*-- Detailprotokoll Anfang Geschäft

PERFORM prot_sfgdt_begin(saplrmpr) USING wa_sfgdt-abest-bpid.


PERFORM prot_sfgdt_head(saplrmpr) USING wa_sfgdt.

REFRESH t_meo.

CALL FUNCTION 'RM_MD_INITIALIZE_CACHE'

EXPORTING

datum = sy-datum

df_zins = '20080114'

cr_kurst_g = 'BRL'

cr_kurst_b = 'BRL'.

CALL FUNCTION 'RM_FIMA_BASIS'

EXPORTING

glpar = v_glpar

meth = t_meth[]

fgets = t_fgdt-fget_t

root = t_root

IMPORTING

meo = t_meo[]

status = v_status.

*<== Rotina Standard --------------------------------------------*

* Verifica se é uma transação de CDI, Swap ou termo de moeda se não


for fazer o cálculo

* standard

IF i_koet-gform = '001' OR

i_koet-gform = '041' OR

i_koet-gform = '051'.
* Se não tiver curva para o dia da valorização buscar do dia anterior

DATA: v_data_aux LIKE sy-datum.

wa_beweg[] = i_beweg[].

READ TABLE t_meo WITH KEY method = 300.

DESCRIBE TABLE i_beweg LINES vg_lines.

* Necessário para posterior utilização. Não toque!!!

CLEAR: tg_beweg[], tg_beweg.

LOOP AT i_beweg.

MOVE-CORRESPONDING i_beweg TO tg_beweg.

APPEND tg_beweg.

CLEAR tg_beweg.

ENDLOOP.

* Variáveis para Cálculos de Cenário.

DATA:

vl_bcurve TYPE numc4,

vl_bcurveb TYPE numc4,

h_reg TYPE jbrreg,

v_enpv2 LIKE enpv,

tl_messages TYPE TABLE OF vtvpvuemsg,

tl_detail TYPE TABLE OF vtvdprot,

h_jbd11 LIKE jbd11 OCCURS 0 WITH HEADER LINE,

h_jbd11_aux LIKE jbd11 OCCURS 0 WITH HEADER LINE,

h_ycurve TYPE TABLE OF vtvmdvin WITH HEADER LINE,

l_expar LIKE i_expar,

vl_cenario_flg TYPE flag,


vl_objnr_aux LIKE i_beweg-objnr.

**********************************************************************
**

* ********************************************************************
*

* * I N Í C I O D O C Á L C U L O D E E N P V *
*

* ********************************************************************
*

**********************************************************************
**

**********************************************************************
**

* LOOP AT I_BEWEG...
*

**********************************************************************
**

LOOP AT i_beweg." WHERE dfaell Ge i_expar-evaldate.

IF i_beweg-dfaell < i_expar-evaldate.

CONTINUE.

* ELSEIF i_beweg-dfaell = i_expar-evaldate.

* enpv = enpv + i_beweg-bnwhr.

* CONTINUE.

ENDIF.

vl_tabix = sy-tabix.

READ TABLE wa_beweg WITH KEY objnr = i_koet-objnr.


MOVE: wa_beweg-soffset TO e_eval-cdi_%,

wa_beweg-szsrefvz TO v_szsrefvz.

IF e_eval-cdi_% IS INITIAL.

e_eval-cdi_% = 1.

ELSE.

e_eval-cdi_% = e_eval-cdi_% / 100.

ENDIF.

READ TABLE i_koet WITH KEY ngidnr = 1.

* Verifica se existe Moeda montante nominal.

IF i_koet-snomwhr IS INITIAL.

e_messages-text = text-m01.

APPEND e_messages.

CLEAR: enpv, enpv2.

EXIT.

ENDIF.

SELECT SINGLE bcurve

bcurveb

FROM atrmo

INTO (v_bcurve, v_bcurveb)

WHERE rmbewreg EQ i_koet-rmbewreg.

READ TABLE i_mseg WITH KEY ngidnr = 1.

CLEAR v_text.

PERFORM f_get_fwd_rate TABLES for_capfac

i_koet
USING v_bcurve

v_bcurveb

* i_koet-snomwhr "VSI03-

i_beweg-snwhr "VSI03+

i_expar-evaldate

i_beweg-dfaell

i_koet-objnr

i_koet-gform "VSI03+

CHANGING v_rc

v_text.

* IF v_rc <> 0.

IF NOT v_text IS INITIAL.

e_messages-text = v_text.

APPEND e_messages.

CLEAR: enpv, enpv2.

EXIT.

ELSE.

READ TABLE for_capfac INDEX 1.

ENDIF.

* PERFORM: f_calc_npv USING for_capfac "VSI- 27/10/11

PERFORM: f_calc_npv TABLES for_capfac "VSI+ 27/10/11

using i_beweg

i_koet-gform "VSI03+

CHANGING enpv.

* Atualiza o valor presente para posterior utilização


------------------

READ TABLE tg_beweg WITH KEY objnr = i_beweg-objnr

ncfnr = i_beweg-ncfnr.

IF sy-subrc = 0.
tg_beweg-bcwhr = vg_vf.

tg_beweg-bnwhr = vg_enpv.

tg_beweg-fatded = for_capfac-capfact.

write vg_meth to tg_beweg-abastage.

tg_beweg-nok = vg_nok.

MODIFY tg_beweg INDEX sy-tabix.

ENDIF.

* Guarda dados que serão utilizados na sub-rotina f_construir_log.

CLEAR eg_beweg.

eg_beweg = i_beweg.

eg_beweg-bcwhr = vg_vf.

* Constrói o log

PERFORM f_construir_log TABLES i_curr "VSI02+

USING

v_bcurve

v_bcurveb

i_mseg-kurstg

i_expar-methode

i_expar-evaldate

vl_tabix

enpv

i_expar-currency

i_curr-rate

i_koet-snomwhr "VSI02+

i_koet-gform "VSI03+

i_mseg-kurstb. "VSI03+

* PERFORM: f_conv_curr_cenario TABLES i_curr "VSI-


27/10/11
* USING i_koet-snomwhr "VSI-
27/10/11

* i_expar-currency "VSI-
27/10/11

* i_expar-scenario "VSI-
27/10/11

* CHANGING enpv. "VSI-


27/10/11

IF i_expar-methode = '100'. "VSI+


27/10/11

PERFORM: f_conv_curr_cenario TABLES i_curr "VSI-


27/10/11

USING i_koet-snomwhr "VSI-


27/10/11

i_expar-currency "VSI-
27/10/11

i_expar-scenario "VSI-
27/10/11

CHANGING enpv. "VSI-


27/10/11

ENDIF. "VSI-
27/10/11

* Se operação de swap calcular o valor do npv

* NPV = aplicação BRL + aplicação USD

*** IF i_koet-objnr+01(01) = 6. "VSI02-

*** IF v_sign EQ '+'. "VSI02-

*** LOOP AT t_meo-result_tab INTO wa_result WHERE amount LT


0.

*** PERFORM f_conv_curr TABLES i_curr


"VSI02-

*** USING wa_result-curr


"VSI02-
*** i_expar-currency
"VSI02-

*** CHANGING wa_result-amount.


"VSI02-

*** ADD wa_result-amount TO enpv.


"VSI02-

*** ENDLOOP.
"VSI02-

*** ELSE.
"VSI02-

*** enpv = enpv * ( - 1 ).


"VSI02-

*** LOOP AT t_meo-result_tab INTO wa_result WHERE amount GT


0.

*** PERFORM f_conv_curr TABLES i_curr


"VSI02-

*** USING wa_result-curr


"VSI02-

*** i_expar-currency
"VSI02-

*** CHANGING wa_result-amount.


"VSI02-

*** ADD wa_result-amount TO enpv.


"VSI02-

*** ENDLOOP.
"VSI02-

*** ENDIF.
"VSI02-

*** ENDIF.
"VSI02-

vl_objnr_aux = i_beweg-objnr.

ENDLOOP.

* Se operação de swap / termo de moeda calcular o valor do npv

IF i_koet-gform = '041' OR "VSI02+

i_koet-gform = '051'. "VSI02+


CLEAR : enpv, v_calc. "VSI02+

LOOP AT tg_beweg. "VSI02+

* PERFORM: f_conv_curr TABLES i_curr "VSI02+

* USING tg_beweg-snwhr "VSI02+

* i_expar-currency "VSI02+

* CHANGING tg_beweg-bnwhr. "VSI02+

CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' "VSI03+

EXPORTING "VSI03+

DATE = i_expar-evaldate "VSI03+

FOREIGN_AMOUNT = tg_beweg-bnwhr "VSI03+

FOREIGN_CURRENCY = tg_beweg-snwhr "VSI03+

LOCAL_CURRENCY = i_koet-snomwhr "VSI03+

TYPE_OF_RATE = i_mseg-kurstb "VSI03+

IMPORTING "VSI03+

LOCAL_AMOUNT = tg_beweg-bnwhr. "VSI03+

IF SY-SUBRC <> 0.

* message error

ENDIF.

enpv = enpv + tg_beweg-bnwhr. "VSI02+

v_calc = v_calc + tg_beweg-bnwhr. "VSI03+

ENDLOOP. "VSI02+

CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' "VSI03+

EXPORTING "VSI03+

DATE = i_expar-evaldate "VSI03+

FOREIGN_AMOUNT = v_calc "VSI03+

FOREIGN_CURRENCY = i_koet-snomwhr "VSI03+

LOCAL_CURRENCY = i_expar-currency "VSI03+


TYPE_OF_RATE = i_mseg-kurstb "VSI03+

IMPORTING "VSI03+

LOCAL_AMOUNT = v_calc. "VSI03+

IF SY-SUBRC = 0.

enpv = v_calc.

ENDIF.

ENDIF. "VSI02+

IF i_expar-methode = '120' AND

i_koet-gform = '001'.

SELECT SINGLE WYCCD RFHA

FROM i73gpa1

INTO (ST_BUKRS_DEAL-COMPANY_CODE,

ST_BUKRS_DEAL-DEAL_NUMBER)

WHERE objnr = i_koet-objnr.

APPEND st_bukrs_deal TO t_bukrs_deal.

CALL FUNCTION 'TPM_AD_SELECT_TRL_POSITIONS'

EXPORTING

* IM_FLG_SECURITIES =

* IM_FLG_LOANS =

* IM_FLG_OPTION_FUTURE =

IM_FLG_DEALS = 'X'

* IM_RNGCOMPANYCODES =

IM_RNGVALAREAS = r_rngvalareas

* IM_RNGPRODUCTTYPES =

* IM_RNGVALCLASSES =

* IM_RNG_FUND =

* IM_RNG_GRANT_NBR =

* IM_RNGSECURITYIDS =
* IM_RNGSECURITYACCOUNTS =

* IM_RNGACCOUNTGROUPS =

* IM_RNGPORTFOLIOS =

* IM_RNGTRADERS =

* IM_RNGLOANCONTRACTS =

* IM_RNGSECURITYPIDS =

* IM_RNGPOSITIONACCOUNTS =

IM_TAB_BUKRS_DEALNUMBER = T_BUKRS_DEAL

* IM_RNG_PRODUCT_CATS =

* IM_RNG_POSITION_CURR =

* IM_RNG_ACCOUNT_REF =

* IM_RNG_CHANGENAME =

* IM_RNG_CHANGEDATE =

* IM_RNG_TRANSACTION_CURR =

* IM_RNG_EXT_REF =

IM_KEY_DATE = i_expar-evaldate

IMPORTING

* EX_TAB_POSITION_GUID =

EX_TAB_DIF_POS_IDENT = T_DIF_POS_IDENT.

loop at t_dif_pos_ident INTO st_dif_pos_ident.

move st_dif_pos_ident-identified_oid to v_trans.

append v_trans to
id_transacoes.

endloop.

v_data2 = c_000.

*** CALL FUNCTION 'TPM_AD_ACCRUAL_DEFERRAL'

*** EXPORTING

*** IM_PROGR = 'X'

*** IM_KEYDAT = i_expar-evaldate

*** IM_INCLUD = 'X'


*** IM_ULTIMO = space

*** IM_TEST = 'X'

*** IM_FIDATE = v_data2

*** IM_RDATE = v_data2

*** IM_RFIDAT = v_data2

*** IM_DOCDAT = v_data2

*** IM_FIPER = '00'

*** IM_RDOC = v_data2

*** IM_RFIPER = '00'

*** IM_TAB_FLOWT = v_tab_flowt

*** IM_FLG_POST = space

*** IM_TAB_POSITIONS_GUID = id_transacoes

**** IM_TCODE =

*** IMPORTING

**** EX_FLG_ACCRUED =

*** EX_PROT_TAB_HEADER = t_ex_prot_tab_header.

**** EX_PROT_TAB_ITEM =

**** EX_TAB_PH_MESSAGE =

**** EX_TAB_ACCP =

**** EX_TAB_ACCR =

*** clear v_sum.

*** LOOP AT t_ex_prot_tab_header INTO st_ex_prot_tab_header.

*** v_sum = v_sum + st_ex_prot_tab_header-position_amt.

*** v_key_date = st_ex_prot_tab_header-key_date.

*** v_position_curr = st_ex_prot_tab_header-position_curr.

***

*** ENDLOOP.

CALL FUNCTION 'ZTPM_AD_ACCRUAL_DEFERRAL'

EXPORTING

im_keydat = i_expar-evaldate
im_includ = 'X'

im_ultimo = space

im_test = 'X'

im_tab_flowt = v_tab_flowt

im_tab_positions_guid = id_transacoes

IMPORTING

ex_tab_income = t_income

EXCEPTIONS

erro = 1

OTHERS = 2.

LOOP AT t_income INTO w_income.

v_sum = v_sum + w_income-position_amt.

v_key_date = w_income-key_date.

if w_income-position_curr IS NOT INITIAL.

v_position_curr = w_income-position_curr.

endif.

ENDLOOP.

if v_position_curr IS NOT INITIAL.

CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'

EXPORTING

* CLIENT = SY-MANDT

DATE = V_KEY_DATE

FOREIGN_CURRENCY = i_expar-currency

LOCAL_AMOUNT = v_sum

LOCAL_CURRENCY = V_POSITION_CURR

* RATE = 0

TYPE_OF_RATE = i_mseg-kurstb

* READ_TCURR = 'X'
IMPORTING

* EXCHANGE_RATE =

FOREIGN_AMOUNT = v_foreign_amount.

* FOREIGN_FACTOR =

* LOCAL_FACTOR =

* EXCHANGE_RATEX =

* DERIVED_RATE_TYPE =

* FIXED_RATE =

* EXCEPTIONS

* NO_RATE_FOUND = 1

* OVERFLOW = 2

* NO_FACTORS_FOUND = 3

* NO_SPREAD_FOUND = 4

* DERIVED_2_TIMES = 5

* OTHERS = 6

IF SY-SUBRC = 0.

enpv = enpv - v_foreign_amount.

ENDIF.

endif.

ENDIF.

**********************************************************************
**

* ********************************************************************
*

* * F I M D O C Á L C U L O D E E N P V *
*

* ********************************************************************
*
**********************************************************************
**

ENDIF.

* Exporta os dados para a construção do Log.

CLEAR:

e_detail,

e_detail[].

e_detail[] = tg_detail[].

ENDFUNCTION.

*&--------------------------------------------------------------------
-*

*& Form f_get_in_param

*&--------------------------------------------------------------------
-*

* text

*---------------------------------------------------------------------
-*

* <->I_KOET text

* <->I_MSEG text

* <->I_BEWEG text

* -->EVALDATE text

* -->OBJNR text

* <--ACCRUAL text

* <--%_CDI text

*---------------------------------------------------------------------
-*
FORM f_get_in_param TABLES i_koet STRUCTURE jbikoet08

i_mseg STRUCTURE jbimseg08

i_beweg STRUCTURE jbibeweg08

USING evaldate

objnr

CHANGING accrual

%_cdi TYPE f.

READ TABLE i_koet WITH KEY ngidnr = 1.

READ TABLE i_mseg WITH KEY ngidnr = 1.

READ TABLE i_beweg WITH KEY dberbis = evaldate.

accrual = i_beweg-bnwhr.

SELECT SINGLE ppayment

FROM vtbfinko

INTO %_cdi

WHERE bukrs EQ objnr+02(04)

AND rfha EQ objnr+06(13)

AND rfhazu EQ 2

AND skoart EQ 8021.

IF %_cdi IS INITIAL.

%_cdi = 1.

ELSE.

%_cdi = %_cdi / 100.

ENDIF.

ENDFORM. " f_get_in_param


*&--------------------------------------------------------------------
-*

*& Form f_get_fwd_rate

*&--------------------------------------------------------------------
-*

* text

*---------------------------------------------------------------------
-*

* <--FOR_RATES text

* -->SIGN text

* -->CURVETYPE text

* -->CURVETYPE_B text

* -->CURRENCY text

* -->VALUEDATE text

* -->GRIDDATE text

* <--RC text

*---------------------------------------------------------------------
-*

FORM f_get_fwd_rate TABLES for_capfac STRUCTURE zvtvmdvin

for_koet STRUCTURE JBIKOET08

USING bcurve

bcurveb

currency

valuedate

griddate

objnr

vgform "VSI03+

CHANGING rc

text TYPE t5nk9-message.

* Define Yield Curve data

CLEAR for_capfac.
REFRESH for_capfac. "ALT

for_capfac-curvetype = bcurve. "Yield Curve Type

for_capfac-currency = currency. "Currency of transaction

for_capfac-valuedate = valuedate. "Yield curve date

for_capfac-griddate = griddate.

for_capfac-objnr = objnr.

APPEND for_capfac.

* call function 'ZFORWARD_RATES' "Vitor -

CALL FUNCTION 'ZFCTP_FORWARD_RATES' "Vitor +

EXPORTING

valuedate = valuedate

IMPORTING

valuetext = text

e_nok = vg_nok

e_meth = vg_meth

TABLES

request = for_capfac

i_koet = for_koet

EXCEPTIONS

error_found = 1

OTHERS = 2.

IF NOT text IS INITIAL.

EXIT.

ENDIF.

rc = sy-subrc.
DATA: v_cf TYPE zvtvmdvin-capfact,

v_cf2 TYPE zvtvmdvin-capfact,

v_forma TYPE i73gpa1-WYFCJ.

READ TABLE for_capfac INDEX 1.

v_cf = for_capfac-capfact.

IF bcurve NE bcurveb AND bcurveb NE space.

* Define Yield Curve data

CLEAR for_capfac.

REFRESH for_capfac. "ALT

for_capfac-curvetype = bcurveb. "Yield Curve Type

for_capfac-currency = currency. "Currency of transaction

for_capfac-valuedate = valuedate. "Yield curve date

for_capfac-griddate = griddate.

for_capfac-objnr = objnr.

APPEND for_capfac.

* call function 'ZFORWARD_RATES' "Vitor -

CALL FUNCTION 'ZFCTP_FORWARD_RATES' "Vitor +

EXPORTING

valuedate = valuedate

IMPORTING

valuetext = text
e_nok = vg_nok

e_meth = vg_meth

TABLES

request = for_capfac

EXCEPTIONS

error_found = 1

OTHERS = 2.

IF NOT text IS INITIAL.

EXIT.

ENDIF.

rc = sy-subrc.

READ TABLE for_capfac INDEX 1.

v_cf2 = for_capfac-capfact.

SELECT SINGLE WYFCJ

FROM i73gpa1

INTO v_forma

WHERE objnr = objnr.

IF v_forma = '0' OR "VSI02+

( ( vgform = '041' OR "VSI03+

vgform = '051' ) AND "VSI03+

currency NE 'BRL' ). "VSI03+

v_cf = ( v_cf + v_cf2 ) - 1.

ELSE.
v_cf = ( v_cf * v_cf2 ).

ENDIF.

MOVE: v_cf TO for_capfac-capfact.

MODIFY for_capfac INDEX 1.

ENDIF.

ENDFORM. " f_get_fwd_rate

*&--------------------------------------------------------------------
-*

*& Form f_calc_npv

*&--------------------------------------------------------------------
-*

* text

*---------------------------------------------------------------------
-*

* -->FOR_CAPFAC text

* <--ENPV text

* <--EV text

*---------------------------------------------------------------------
-*

FORM f_calc_npv

* USING "VSI- 27/10/22

* for_capfac STRUCTURE zvtvmdvin "VSI- 27/10/22

TABLES "VSI+ 27/10/22

for_capfac STRUCTURE zvtvmdvin "VSI+ 27/10/22


USING

i_beweg TYPE jbibeweg08

vgform
"VSI03+

CHANGING

enpv.

DATA: cf LIKE for_capfac-capfact,

cf_% LIKE for_capfac-capfact,

vl_enpv_aux LIKE vg_enpv,

n LIKE for_capfac-griddays,

pc LIKE vtbfinko-ppayment.

DATA: BEGIN OF ev,

accrual TYPE f,

mtm_date TYPE tv_horizon,

n TYPE f,

cf TYPE f,

cdi TYPE f,

cdi_% TYPE f,

cf_% TYPE f,

fv TYPE f,

pv TYPE f,

END OF ev.

DATA: vl_14d(10) TYPE p DECIMALS 14.

ev-n = for_capfac-griddays.

ev-cf = for_capfac-capfact.
ev-mtm_date = for_capfac-valuedate.

DATA: fxexposure TYPE ais_fxexp.

FIELD-SYMBOLS:

<beweg> LIKE i_beweg.

ASSIGN i_beweg TO <beweg>.

**********************************************************************
**

* Faz o cálculo do valor futuro e valor presente


*

**********************************************************************
**

* IF NOT <beweg>-szsref IS INITIAL.

** Lógica 1

* IF <beweg>-pkond <> 0 AND <beweg>-soffset <> 0.

* IF NOT vg_meth IS INITIAL AND

* NOT vg_nok IS INITIAL.

* vg_vf =

* ( ( ( ( ( for_capfac-capfact ** ( 1 / vg_nok ) ) - 1 ) *

* ( <beweg>-soffset / 100 ) + 1 ) ** vg_nok ) *

* ( ( ( <beweg>-pkond / 100 ) + 1 ) ** ( vg_nok / vg_meth ) ) )

* * <beweg>-bcwhr.

*
* PERFORM f_update_beweg USING <beweg>.

** Calcula o valor presente.

* enpv = vg_vf / for_capfac-capfact.

* vg_enpv = enpv.

* vg_vp_aux = vg_vp_aux + enpv.

* enpv = vg_vp_aux.

* EXIT.

* ENDIF.

* ENDIF.

** Lógica 2

* IF <beweg>-pkond <> 0.

* IF NOT vg_meth IS INITIAL AND NOT vg_nok IS INITIAL.

** Busca a Forma de Cálculo

* DATA vl_WYFCJ TYPE i73gpa1-WYFCJ.

* SELECT SINGLE WYFCJ

* FROM i73gpa1

* INTO vl_WYFCJ

* WHERE objnr = <beweg>-objnr.

** IF vl_WYFCJ = '1'. "VSI02+

* If vl_WYFCJ = '0' OR "VSI03+

* ( ( vgform = '041' OR "VSI03+

* vgform = '051' ) AND "VSI03+


* <beweg>-scwhr NE 'BRL' ). "VSI03+

* vg_vf =

* ( ( ( ( <beweg>-pkond / 100 ) + 1 ) **

* ( vg_nok / vg_meth ) ) * ( for_capfac-capfact ) )

* * <beweg>-bcwhr.

* PERFORM f_update_beweg USING <beweg>.

** Calcula o valor presente.

* enpv = vg_vf / for_capfac-capfact.

* vg_enpv = enpv.

* vg_vp_aux = vg_vp_aux + enpv.

* enpv = vg_vp_aux.

* EXIT.

* ELSE.

* vg_vf =

* ( ( ( ( <beweg>-pkond / 100 ) * ( vg_nok / vg_meth ) + 1 )


+

* ( for_capfac-capfact ) ) - 1 ) * <beweg>-bnwhr.

* PERFORM f_update_beweg USING <beweg>.

** Calcula o valor presente.

* enpv = vg_vf / for_capfac-capfact.

* vg_enpv = enpv.

* vg_vp_aux = vg_vp_aux + enpv.

* enpv = vg_vp_aux.

* EXIT.
* ENDIF.

* ENDIF.

* ENDIF.

** Lógica 3

* IF <beweg>-pkond = 0 AND <beweg>-soffset <> 0.

* IF NOT vg_nok IS INITIAL.

* vg_vf =

* ( ( ( ( ( for_capfac-capfact ** ( 1 / vg_nok ) ) - 1 ) *

* ( <beweg>-soffset / 100 ) ) + 1 ) ** vg_nok )

* * <beweg>-bcwhr.

* PERFORM f_update_beweg USING <beweg>.

** Calcula o valor presente.

* enpv = vg_vf / for_capfac-capfact.

* vg_enpv = enpv.

* vg_vp_aux = vg_vp_aux + enpv.

* enpv = vg_vp_aux.

* EXIT.

* ENDIF.

* ENDIF.

** Lógica 4
* IF <beweg>-pkond = 0 AND <beweg>-soffset = 0.

* vg_vf = for_capfac-capfact * <beweg>-bcwhr.

* PERFORM f_update_beweg USING <beweg>.

** Calcula o valor presente.

* enpv = vg_vf / for_capfac-capfact.

* vg_enpv = enpv.

* vg_vp_aux = vg_vp_aux + enpv.

* enpv = vg_vp_aux.

* EXIT.

* ENDIF.

** Lógica 5

* IF <beweg>-szsref = 'CDI' OR <beweg>-szsref = cg_cdipre.

* IF NOT vg_meth IS INITIAL AND

* NOT vg_nok IS INITIAL AND

* <beweg>-pkond <> 0.

* vg_vf =

* ( ( ( ( ( ( for_capfac-capfact * ( ( ( <beweg>-pkond / 100 )

* + 1 ) ** ( vg_nok / vg_meth ) ) ) ** ( 1 / vg_nok ) ) - 1 ) *

* ( <beweg>-soffset / 100 ) ) + 1 ) ** vg_nok ) * <beweg>-bcwhr.

* PERFORM f_update_beweg USING <beweg>.


*

** Calcula o valor presente.

* enpv = vg_vf / for_capfac-capfact.

* vg_enpv = enpv.

* vg_vp_aux = vg_vp_aux + enpv.

* enpv = vg_vp_aux.

* EXIT.

* ENDIF.

* ENDIF.

* ELSE. " <beweg>-szsref igual a vazio

* Calcula o valor presente.

vg_vf = <beweg>-bcwhr.

* enpv = vg_vf / for_capfac-capfact. "VSI- 27/10/11

IF <beweg>-SZSREF = 'CDI' AND

( <beweg>-DBERVON > FOR_CAPFAC-VALUEDATE OR

<beweg>-DBERVON = ' ') AND

( <beweg>-CFKNZ = '0' OR

<beweg>-CFKNZ = '1' ) AND

for_capfac-capfact = 1.

enpv = 0.

for_capfac-capfact = 0.

MODIFY for_capfac INDEX 1.

ELSE.
enpv = vg_vf / for_capfac-capfact.

ENDIF.

vg_enpv = enpv.

vg_vp_aux = vg_vp_aux + enpv.

enpv = vg_vp_aux.

* ENDIF.

ENDFORM. " f_calc_npv

*&--------------------------------------------------------------------
-*

*& Form f_update_beweg

*&--------------------------------------------------------------------
-*

FORM f_update_beweg

USING

p_beweg TYPE jbibeweg08.

DATA:

el_beweg TYPE jbrdbbeweg,

vl_ridxrt TYPE jbrdbbeweg-ridxrt.

vl_ridxrt = p_beweg-objnr+2.

SELECT *

UP TO 1 ROWS
FROM jbrdbbeweg

INTO el_beweg

WHERE ridxrt = vl_ridxrt

AND ngidnr = p_beweg-ngidnr

AND ncfnr = p_beweg-ncfnr.

ENDSELECT.

IF sy-subrc = 0.

el_beweg-bcwhr = vg_vf.

UPDATE jbrdbbeweg FROM el_beweg.

ENDIF.

ENDFORM. "f_update_beweg

*&--------------------------------------------------------------------
-*

*& Form f_conv_curr

*&--------------------------------------------------------------------
-*

* text

*---------------------------------------------------------------------
-*

* -->I_CURR text

* -->FCURR text

* -->TCURR text

* <--ENPV text

*---------------------------------------------------------------------
-*

FORM f_conv_curr TABLES i_curr STRUCTURE vtvmdvcr

USING fcurr

tcurr

CHANGING enpv.
DATA: rate LIKE vtvmdvcr-rate.

CHECK NOT fcurr IS INITIAL.

IF fcurr NE tcurr.

READ TABLE i_curr WITH KEY fcurr = fcurr

tcurr = tcurr.

IF sy-subrc <> 0.

enpv = 0.

EXIT.

ENDIF.

IF i_curr-rate < 0.

rate = -1 / i_curr-rate.

ELSE.

rate = i_curr-rate.

ENDIF.

rate = rate * i_curr-tfact / i_curr-ffact.

enpv = enpv * rate.

ENDIF.

ENDFORM. " f_conv_curr

*&--------------------------------------------------------------------
-*

*& Form f_conv_curr

*&--------------------------------------------------------------------
-*

FORM f_conv_curr_cenario TABLES i_curr STRUCTURE vtvmdvcr

USING fcurr

tcurr

cenario
CHANGING enpv.

DATA: rate LIKE vtvmdvcr-rate.

CHECK NOT fcurr IS INITIAL.

IF fcurr NE tcurr.

READ TABLE i_curr WITH KEY fcurr = fcurr

tcurr = tcurr.

IF sy-subrc <> 0.

enpv = 0.

EXIT.

ENDIF.

IF i_curr-rate < 0.

rate = -1 / i_curr-rate.

ELSE.

rate = i_curr-rate.

ENDIF.

* Usa a taxa de câmbio do cenário, caso exista.

IF NOT cenario IS INITIAL.

DATA: wa TYPE vtvszcr.

SELECT SINGLE *

FROM vtvszcr

INTO wa

WHERE szenari = cenario

AND fcurr = tcurr

AND tcurr = fcurr.

IF sy-subrc = 0.
rate = wa-bukurs.

ENDIF.

ENDIF.

rate = rate * i_curr-tfact / i_curr-ffact.

enpv = enpv * rate.

ENDIF.

ENDFORM. "f_conv_curr_cenario

*&--------------------------------------------------------------------
-*

*& Form f_construir_log

*&--------------------------------------------------------------------
-*

* Constrói o log HTML para o OBJNR corrente

*---------------------------------------------------------------------
-*

FORM f_construir_log TABLES i_curr STRUCTURE vtvmdvcr "VSI02+

USING

p_curve

p_curveb

p_kurstg

p_methode

p_evaldate

p_tabix

p_enpv

p_currency

p_rate

p_curr_pos "VSI02+
vgform "VSI03+

v_type_of_rate. "VSI03+

*---------------------------------------------------------------------
-*

* Declarações Locais

*---------------------------------------------------------------------
-*

DATA:

BEGIN OF el_fluxo_caixa_fix, " Largura Total: 75 Caracteres

c1(10), " Data de

c2(10), " Data Até

c3(4), " Dias

c4(5), " DiasC

c5(8), " Tx.Juros

c6(15), " Nominal

c7(5), " Moeda

c8(15), " Mont.

c9(5), " Moeda

END OF el_fluxo_caixa_fix,

BEGIN OF el_curvjuros, " Largura Total: 78 Caracteres

c2(10), " Data (1)

c8(15), " Mont. (2)

c10(11), " Bônus par (3)

c11(11), " Cupom Zero (4)

c12(11), " Fat.Ded. (5)

c13(15), " VAL (6)

c9(5), " Moeda (7)

END OF el_curvjuros,
BEGIN OF el_val_atual, " Largura Total: 46 Caracteres

c13(15), " VAL

c14(5), " Moeda

c15(11), " T/C

c16(18), " ValAtual em moedEx

END OF el_val_atual,

vl_text TYPE text50,

vl_valor TYPE char15,

vl_valor_exp TYPE char20,

vl_14d(10) TYPE p DECIMALS 14,

vl_taxa TYPE tcurr-ukurs,

vl_val_total LIKE tg_beweg-bnwhr,

vl_val_total2 LIKE tg_beweg-bnwhr,

vl_cupomzero TYPE vtvpvuedatatypes-result,

vl_neg_posit TYPE char20,

vl_aux TYPE char50,

vl_data TYPE char10.

* I N Í C I O D A C O N S T R U Ç Ã O D O L O G
*

**********************************************************************
**

* Busca a Forma de Cálculo

DATA vl_WYFCJ TYPE i73gpa1-WYFCJ.

SELECT SINGLE WYFCJ

FROM i73gpa1

INTO vl_WYFCJ

WHERE objnr = eg_beweg-objnr.


* IF p_tabix = 1 . " vg_cabec_log_flg IS INITIAL.

IF vg_log_flg IS INITIAL.

vg_log_flg = 'X'.

*---------------------------------------------------------------------
-*

* Dds. Mercado

*---------------------------------------------------------------------
-*

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

* Linha azul
-----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_new.

APPEND tg_detail.

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_text.

tg_detail-text = 'Dds. Mercado'(001).

APPEND tg_detail.
*---------------------------------------------------------------------
-*

* Tps. Curva Juros

*---------------------------------------------------------------------
-*

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_heading.

tg_detail-text = 'Tps. Curva Juros'(002).

APPEND tg_detail.

* Curva 1
--------------------------------------------------------------

* Busca a descrição da curva

CLEAR jbd1t.

SELECT SINGLE xzkart

FROM jbd1t

INTO jbd1t-xzkart

WHERE spras = sy-langu

AND szkart = p_curve.

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_list.

CONCATENATE 'Proc'(003) p_curve jbd1t-xzkart

INTO tg_detail-text SEPARATED BY ''.

APPEND tg_detail.

* Curva 2
--------------------------------------------------------------
IF NOT p_curveb IS INITIAL.

* Busca a descrição da curva

CLEAR jbd1t.

SELECT SINGLE xzkart

FROM jbd1t

INTO jbd1t-xzkart

WHERE spras = sy-langu

AND szkart = p_curve.

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_list.

CONCATENATE 'PrçVd'(004) p_curveb jbd1t-xzkart

INTO tg_detail-text SEPARATED BY ''.

APPEND tg_detail.

ENDIF.

*---------------------------------------------------------------------
-*

* Taxas de Câmbio

*---------------------------------------------------------------------
-*

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

CLEAR tg_detail.
tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_heading.

tg_detail-text = 'Taxas de Câmbio'(029).

APPEND tg_detail.

* Busca a descrição da taxa

CLEAR tcurw.

SELECT SINGLE curvw

FROM tcurw

INTO tcurw-curvw

WHERE spras = sy-langu

AND kurst = p_kurstg.

* Taxa 1
--------------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_list.

CONCATENATE 'Proc'(003) p_kurstg tcurw-curvw

INTO tg_detail-text SEPARATED BY ''.

APPEND tg_detail.

* Taxa 2
--------------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_list.

CONCATENATE 'PrçVd'(004) p_kurstg tcurw-curvw

INTO tg_detail-text SEPARATED BY ''.

APPEND tg_detail.
* ENDIF.

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

* Linha azul
-----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_new.

APPEND tg_detail.

*---------------------------------------------------------------------
-*

* Avaliação

*---------------------------------------------------------------------
-*

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_text.

tg_detail-text = 'Avaliação'(005).

APPEND tg_detail.

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_heading.

tg_detail-text = 'MétCálc DatCond Cenário'(006).


APPEND tg_detail.

IF p_methode = '100'.

vl_text = 'Valor atual líquido'(007).

ELSEIF p_methode = '120'.

vl_text = 'Preço efetivo'(008).

ENDIF.

WRITE p_evaldate TO vl_data.

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_list.

CONCATENATE p_methode vl_text vl_data

INTO tg_detail-text SEPARATED BY ''.

APPEND tg_detail.

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

*---------------------------------------------------------------------
-*

* Flxs.caix.fix.:

*---------------------------------------------------------------------
-*

CLEAR tg_detail.
tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_text.

tg_detail-text = 'Flxs.caix.fix.:'(009).

APPEND tg_detail.

*=====================================================================
=*

* Início da Construção da Primeira tabela do Log

*=====================================================================
=*

CLEAR el_fluxo_caixa_fix.

el_fluxo_caixa_fix-c1 = 'Data de'(010). " Data de

el_fluxo_caixa_fix-c2 = 'Data Até'(011). " Data Até

el_fluxo_caixa_fix-c3 = 'Dias'(012). " Dias

el_fluxo_caixa_fix-c4 = 'DiasC'(013). " DiasC

el_fluxo_caixa_fix-c5 = 'Tx.Juros'(014). " Tx.Juros

el_fluxo_caixa_fix-c6 = 'Nominal'(015). " Nominal

el_fluxo_caixa_fix-c7 = 'Moeda'(016). " Moeda

el_fluxo_caixa_fix-c8 = 'Mont.'(017). " Mont.

el_fluxo_caixa_fix-c9 = 'Moeda'(016). " Moeda

* Prepara as Colunas da tabela


-----------------------------------------

CLEAR tg_detail.

tg_detail-type = con_cols.

tg_detail-width = 75.

tg_detail-keywidth = 20.

tg_detail-border = 'X'.

CALL FUNCTION 'RM_PROT_GEN_STRING'


EXPORTING

i_ref = el_fluxo_caixa_fix

CHANGING

c_text = tg_detail-text.

APPEND tg_detail.

* Títulos das Colunas (Cabeçalho)


--------------------------------------

CLEAR tg_detail.

tg_detail-type = con_heading.

tg_detail-width = 75.

tg_detail-keywidth = 20.

tg_detail-border = 'X'.

WRITE el_fluxo_caixa_fix TO tg_detail-text.

APPEND tg_detail.

ENDIF. " Até aqui só escreve uma vez...

*---------------------------------------------------------------------
--

* Registros da tabela

*---------------------------------------------------------------------
--

CLEAR el_fluxo_caixa_fix.

WRITE p_evaldate TO vl_data.

el_fluxo_caixa_fix-c1 = vl_data. " Data de

WRITE eg_beweg-dfaell TO vl_data.


el_fluxo_caixa_fix-c2 = vl_data. " Data Até

MOVE vg_nok TO vl_valor.

SHIFT vl_valor LEFT DELETING LEADING '0'.

el_fluxo_caixa_fix-c3 = vl_valor. " Dias

* el_fluxo_caixa_fix-c4 = vl_valor. " DiasC

WRITE eg_beweg-pkond TO vl_valor.

el_fluxo_caixa_fix-c5 = vl_valor. " Tx.Juros

WRITE eg_beweg-bnwhr TO vl_valor.

el_fluxo_caixa_fix-c6 = vl_valor. " Nominal

el_fluxo_caixa_fix-c7 = eg_beweg-snwhr. " Moeda

WRITE eg_beweg-bcwhr TO vl_valor.

el_fluxo_caixa_fix-c8 = vl_valor. " Mont.

el_fluxo_caixa_fix-c9 = eg_beweg-scwhr. " Moeda

CLEAR tg_detail.

tg_detail-type = con_list.

tg_detail-width = 73.

tg_detail-keywidth = 10.

WRITE el_fluxo_caixa_fix TO tg_detail-text.

APPEND tg_detail.

*=====================================================================
=*

* Fim da Construção da Primeira tabela do Log


*=====================================================================
=*

*=====================================================================
=*

* END-OF-PAGE

*=====================================================================
=*

IF p_tabix = vg_lines. " END-OF-PAGE

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

LOOP AT tg_beweg.

IF sy-tabix = 1.

* Cálc.valor atual: Cashflows ...


----------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_text.

IF tg_beweg-bcwhr < 0.

vl_neg_posit = 'negativ.'.

ELSE.

vl_neg_posit = 'positiv.'.

ENDIF.
CONCATENATE

'Cálc.valor atual: Cashflows'(018)

vl_neg_posit

tg_beweg-scwhr " Moeda

INTO tg_detail-text SEPARATED BY ''.

APPEND tg_detail.

* CurvJuros: ...
-------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_text.

IF NOT p_curveb IS INITIAL.

CONCATENATE p_curve '/' p_curveb INTO vl_neg_posit.

ELSE.

vl_neg_posit = p_curve.

ENDIF.

WRITE p_evaldate TO vl_data.

CONCATENATE

'CurvJuros:'(019)

vl_neg_posit " Curva

tg_beweg-scwhr " Moeda

vl_data

INTO tg_detail-text SEPARATED BY ''.


APPEND tg_detail.

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

*=====================================================================
=*

* Início da Construção da Segunda tabela do Log

*=====================================================================
=*

CLEAR el_curvjuros.

el_curvjuros-c2 = 'Data'. " Data (1)

el_curvjuros-c8 = 'Mont.'(017). " Mont. (2)

el_curvjuros-c10 = 'Bônus par'(022). " Bônus par (3)

el_curvjuros-c11 = 'Cupom Zero'(023). " Cupom Zero (4)

el_curvjuros-c12 = 'Fat.Ded.'(024). " Fat.Ded. (5)

el_curvjuros-c13 = 'VAL'(025). " VAL (6)

el_curvjuros-c9 = 'Moeda'(016). " Moeda (7)

* Prepara as Colunas da segunda tabela


---------------------------------

CLEAR tg_detail.

tg_detail-type = con_cols.

tg_detail-width = 78.

tg_detail-keywidth = 10.

tg_detail-border = 'X'.
CALL FUNCTION 'RM_PROT_GEN_STRING'

EXPORTING

i_ref = el_curvjuros

CHANGING

c_text = tg_detail-text.

APPEND tg_detail.

* Cabeçalho da segunda tabela


------------------------------------------

CLEAR tg_detail.

tg_detail-type = con_heading.

tg_detail-width = 78.

* tg_detail-keywidth = 10.

tg_detail-border = 'X'.

WRITE el_curvjuros TO tg_detail-text.

APPEND tg_detail.

ENDIF.

*---------------------------------------------------------------------
--

* Registros da tabela

*---------------------------------------------------------------------
--

CLEAR el_curvjuros.

WRITE tg_beweg-dfaell TO vl_data.

el_curvjuros-c2 = vl_data. " Data (1)

*
WRITE tg_beweg-bcwhr TO vl_valor.

el_curvjuros-c8 = vl_valor. " Mont.


(2)

* Bônus par e Cupom Zero


-----------------------------------------------

IF NOT tg_beweg-nok IS INITIAL.

IF vl_WYFCJ = '0' OR
"VSI02+

( ( vgform = '041' OR
"VSI03+

vgform = '051' ) AND


"VSI03+

tg_beweg-scwhr NE 'BRL' ).
"VSI03+

vl_14d =

( ( tg_beweg-fatded - 1 ) * ( vg_meth / tg_beweg-nok ) ) *


100.

ELSEIF vl_WYFCJ = '1'. "VSI02+

vl_14d =

( ( tg_beweg-fatded ** ( tg_beweg-abastage / tg_beweg-nok ) )


- 1 ) * 100.

ENDIF.

ELSE.

vl_14d = 0.

ENDIF.

WRITE vl_14d TO vl_valor_exp.

CONDENSE vl_valor_exp NO-GAPS.

el_curvjuros-c10 = vl_valor_exp. " Bônus par (3)

el_curvjuros-c11 = vl_valor_exp. " Cupom Zero (4)

IF NOT tg_beweg-fatded IS INITIAL.


tg_beweg-fatded = 1 / tg_beweg-fatded. " for_capfac-capfact.

ELSE.

tg_beweg-fatded = 0.

ENDIF.

WRITE tg_beweg-fatded TO vl_valor_exp.

CONDENSE vl_valor_exp NO-GAPS.

el_curvjuros-c12 = vl_valor_exp. " Fat.Ded. (5)

WRITE tg_beweg-bnwhr TO vl_valor.

el_curvjuros-c13 = vl_valor. " VAL (6 )

*** PERFORM: f_conv_curr TABLES i_curr


"VSI02+

*** USING tg_beweg-scwhr


"VSI02+

*** p_curr_pos
"VSI02+

*** CHANGING tg_beweg-bnwhr.


"VSI02+

CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' "VSI02+

EXPORTING "VSI02+

DATE = p_evaldate "VSI02+

FOREIGN_AMOUNT = tg_beweg-bnwhr "VSI02+

FOREIGN_CURRENCY = tg_beweg-scwhr "VSI02+

LOCAL_CURRENCY = p_curr_pos "VSI02+

TYPE_OF_RATE = v_type_of_rate "VSI02+

IMPORTING

LOCAL_AMOUNT = tg_beweg-bnwhr. "VSI02+

IF SY-SUBRC <> 0.

message 'Erro 0002 ' TYPE 'E'.


ENDIF.

vl_val_total = vl_val_total + tg_beweg-bnwhr.

el_curvjuros-c9 = tg_beweg-scwhr. " Moeda


(6)

CLEAR tg_detail.

tg_detail-type = con_list.

tg_detail-width = 78.

WRITE el_curvjuros TO tg_detail-text.

APPEND tg_detail.

*=====================================================================
=*

* Fim da Construção da Segunda tabela do Log

*=====================================================================
=*

AT LAST.

DO 2 TIMES.

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

IF sy-index = 2.

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.
tg_detail-type = con_text.

tg_detail-text =

'Val.atual líquido total em moeda aval.'(028).

APPEND tg_detail.

ENDIF.

*=====================================================================
=*

* Início da Construção da Terceira e Quarta Tabelas tabela do Log

*=====================================================================
=*

CLEAR el_val_atual.

el_val_atual-c13 = 'VAL'(025).

el_val_atual-c14 = 'Moeda'(016).

el_val_atual-c15 = 'T/C'(026).

el_val_atual-c16 = 'ValAtual em moedEx'(027).

* Prepara as Colunas da segunda tabela


---------------------------------

CLEAR tg_detail.

tg_detail-type = con_cols.

tg_detail-width = 49.

tg_detail-border = 'X'.

CALL FUNCTION 'RM_PROT_GEN_STRING'

EXPORTING

i_ref = el_val_atual

CHANGING

c_text = tg_detail-text.
APPEND tg_detail.

* Cabeçalho da segunda tabela


------------------------------------------

CLEAR tg_detail.

tg_detail-type = con_heading.

tg_detail-width = 49.

tg_detail-border = 'X'.

WRITE el_val_atual TO tg_detail-text.

APPEND tg_detail.

*---------------------------------------------------------------------
--

* Registros da tabela

*---------------------------------------------------------------------
--

CLEAR el_val_atual.

WRITE vl_val_total TO vl_valor.

el_val_atual-c13 = vl_valor.

el_val_atual-c14 = p_curr_pos. "VSI02+

* Obtêm a Taxa de Câmbio


-----------------------------------------------

CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' "VSI02+

EXPORTING "VSI02+

* CLIENT = SY-MANDT

DATE = p_evaldate "VSI02+

FOREIGN_AMOUNT = vl_val_total "VSI02+

FOREIGN_CURRENCY = p_curr_pos "VSI02+

LOCAL_CURRENCY = p_currency "VSI02+


* RATE = 0

TYPE_OF_RATE = v_type_of_rate "VSI02+

* READ_TCURR = 'X'

IMPORTING

EXCHANGE_RATE = vl_taxa "VSI02+

* FOREIGN_FACTOR =

LOCAL_AMOUNT = vl_val_total2. "VSI02+

* LOCAL_FACTOR =

* EXCHANGE_RATEX =

* FIXED_RATE =

* DERIVED_RATE_TYPE =

* EXCEPTIONS

* NO_RATE_FOUND = 1

* OVERFLOW = 2

* NO_FACTORS_FOUND = 3

* NO_SPREAD_FOUND = 4

* DERIVED_2_TIMES = 5

* OTHERS = 6

IF SY-SUBRC <> 0.

message 'erro 001 ' TYPE 'E'.

STOP.

ENDIF.

*** PERFORM f_get_taxa


"VSI02-

*** USING
"VSI02-

*** 'B' " Categoria de taxa de câmbio


"VSI02-

*** eg_beweg-scwhr " Moeda de procedência


"VSI02-
*** p_currency " Moeda de destino
"VSI02-

*** p_evaldate " Data a partir da qual o câmbio é


válido

*** CHANGING
"VSI02-

*** vl_taxa.
"VSI02-

WRITE vl_taxa TO el_val_atual-c15.

*** vl_val_total2 = vl_taxa * vl_val_total.


"VSI02-

WRITE vl_val_total2 TO vl_valor.

el_val_atual-c16 = vl_valor.

CLEAR tg_detail.

tg_detail-type = con_sum.

tg_detail-width = 49.

WRITE el_val_atual TO tg_detail-text.

APPEND tg_detail.

*=====================================================================
=*

* Fim da Construção da Terceira e Quarta tabelas do Log

*=====================================================================
=*

ENDDO.

ENDAT.
ENDLOOP.

* Linha vazia
----------------------------------------------------------

CLEAR tg_detail.

tg_detail-objnr = eg_beweg-objnr.

tg_detail-type = con_empty.

APPEND tg_detail.

ENDIF.

ENDFORM. "f_construir_log

****&-----------------------------------------------------------------
----*

****& Form f_get_taxa

****&-----------------------------------------------------------------
----*

***FORM f_get_taxa "VSI02-

*** USING

*** p_1 " Categoria de taxa de câmbio

*** p_2 " Moeda de procedência

*** p_3 " Moeda de destino

*** p_4 " Data a partir da qual o câmbio é válido

*** CHANGING

*** p_taxa.

***

*** DATA vl_gdatu TYPE tcurr-gdatu.

*** DATA vl_data TYPE char10.

***

*** IF p_2 = p_3.


*** p_taxa = '1.0000000'.

*** ELSE.

***

*** WRITE p_4 TO vl_data.

***

*** CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'

*** EXPORTING

*** input = vl_data

*** IMPORTING

*** output = vl_gdatu.

***

*** SELECT SINGLE ukurs

*** INTO tcurr-ukurs

*** FROM tcurr

*** WHERE kurst = p_1

*** AND fcurr = p_2

*** AND tcurr = p_3

*** AND gdatu = vl_gdatu.

*** IF sy-subrc = 0.

*** p_taxa = tcurr-ukurs.

*** ENDIF.

***

*** ENDIF.

***

***ENDFORM. "f_get_taxa "VSI02-

Função FOWARD_RATES (Esta função está contida em Função Z_BARWERT_BEWERTUNG)


Texto Fonte:

FUNCTION zfctp_forward_rates.

*"----------------------------------------------------------------------

*"*"Interface local:

*" IMPORTING

*" REFERENCE(VALUEDATE) LIKE VTVMDVIN-VALUEDATE

*" EXPORTING

*" REFERENCE(VALUETEXT) TYPE T5NK9-MESSAGE

*" REFERENCE(E_NOK) TYPE TB_LFZEIT

*" REFERENCE(E_METH) TYPE CHAR3

*" TABLES

*" REQUEST STRUCTURE ZTBCTP_VTVMDVIN

*" I_KOET STRUCTURE JBIKOET08

*" EXCEPTIONS

*" ERROR_FOUND

*"----------------------------------------------------------------------

* Global data declarations


DATA: curve_def LIKE jbd14 OCCURS 0 WITH HEADER LINE,

curve_data LIKE jbd11 OCCURS 0 WITH HEADER LINE,

long_rate LIKE jbd11,

short_rate LIKE jbd11,

term_days LIKE jbd11-ntage.

* t_jbd14 LIKE jbd14 OCCURS 0 WITH HEADER LINE, "VSI03+

* t_jbd15 LIKE jbd15 OCCURS 0 WITH HEADER LINE. "VSI03+

DATA: vl_taxa TYPE jbifr.

* ordne Anforderungen, die sich auf die gleiche Zinskurve

* beziehen, untereinander an

SORT request BY curvetype currency valuedate.

LOOP AT request.

IF ( request-curvetype NE curve_def-szkart )

OR ( request-currency NE curve_def-wwaer ) .

* neue Kurve, hole die Daten

CALL FUNCTION 'ISB_JBD11_GET'

EXPORTING

konddatum = valuedate

kurvenart = request-curvetype

waehrung = request-currency
zurueck_suchen = 1

IMPORTING

e_jbd14 = curve_def

TABLES

e_jbd11 = curve_data

EXCEPTIONS

not_found =1

OTHERS = 2.

IF sy-subrc <> 0.

valuetext = text-m02.

EXIT.

ENDIF.

ENDIF.

* Begin - Custom Interpolation

DATA: v_stgmeth LIKE vtbbewe-stgmeth,

nok LIKE request-griddays.

CALL FUNCTION 'FIMA_INTEREST_METHOD_CONVERT'

EXPORTING

i_szbmeth = curve_def-szbmeth

IMPORTING

e_stgmeth = v_stgmeth.

* Calculate the work days between valuation date and date end
* transaction using calendar CF

CALL FUNCTION 'FIMA_DAYS_BETWEEN_TWO_DATES'

EXPORTING

i_datum_von = request-valuedate

i_datum_bis = request-griddate

i_kz_ult_bis = 'X'

i_stgmeth = v_stgmeth

i_szbmeth = curve_def-szbmeth

i_skalid = curve_def-skalid

IMPORTING

e_tage = nok.

e_nok = nok.

DATA:

* Resulting Capitalization Factor

cf LIKE request-capfact,

* Number of Days (fr -> From; to -> To)

nfr LIKE curve_data-ntage,

nto LIKE curve_data-ntage,

* Capitalization Factors (fr -> From; to -> To)

ffr LIKE request-capfact,

fto LIKE request-capfact,

tax_ext LIKE curve_data-ifr,

* Table Index

v_tabix LIKE sy-tabix,

v_meth TYPE char3,


v_WYFCJ TYPE TFMSINTCALC,

v_nok TYPE tb_lfzeit,

v_subrc TYPE sy-subrc.

CLEAR: cf,

nfr,

nto,

ffr,

fto,

v_tabix,

v_meth,

v_WYFCJ,

v_nok.

IF curve_def-szbmeth = '2'.

v_meth = '360'.

ELSEIF curve_def-szbmeth = '3'.

v_meth = '365'.

ELSE.

v_meth = '252'.

ENDIF.

e_meth = v_meth.

SELECT SINGLE WYFCJ

FROM i73gpa1

INTO v_WYFCJ
WHERE objnr = request-objnr.

""break br3ros.

READ TABLE I_KOET INDEX 1. "VSI03+

IF curve_def-szbmeth = 'A' AND nok LE 504.

* v_nok = nok + 1.

v_nok = nok.

LOOP AT curve_data WHERE ntage >= v_nok.

v_tabix = sy-tabix.

EXIT.

ENDLOOP.

v_subrc = sy-subrc.

IF sy-subrc <> 0.

* Erro. Não existe vértice para a data de vencimento.

valuetext = text-m01.

EXIT.

ENDIF.

ELSE.

LOOP AT curve_data WHERE ntage >= nok.

v_tabix = sy-tabix.

EXIT.

ENDLOOP.
v_subrc = sy-subrc.

ENDIF.

DATA:

vl_extrapolacao_flg TYPE flag.

IF v_subrc <> 0.

IF ( nok > 2514 AND v_meth = 252 ) OR

( nok > 3652 AND v_meth = 360 ) OR

( nok > 3652 AND v_meth = 365 ).

vl_extrapolacao_flg = 'X'.

ENDIF.

IF vl_extrapolacao_flg IS INITIAL.

* Erro. Não existe vértice para a data de vencimento.

valuetext = text-m01.

EXIT.

ENDIF.

ELSE.

CLEAR vl_extrapolacao_flg. " Fazer interpolação

ENDIF.

* break br3ros.
vl_taxa = curve_data-ifr.

EXPORT vl_taxa TO MEMORY ID 'TAXA'.

IF vl_extrapolacao_flg = 'X'. " Faz a extrapolação

DESCRIBE TABLE curve_data LINES v_tabix.

IF v_tabix LT 2.

* Erro na extrapolação - curva para a data de valorização não encontrada

valuetext = text-m02.

EXIT.

ENDIF.

IF curve_def-szbmeth = 'A'.

READ TABLE curve_data INDEX v_tabix.

IF curve_data-ntage GT '504'.

nto = curve_data-ntage.

fto = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nto / v_meth ).

v_tabix = v_tabix - 1.

IF v_tabix LT 1.

v_tabix = 1.

ENDIF.
READ TABLE curve_data INDEX v_tabix.

nfr = curve_data-ntage.

ffr = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nfr / v_meth ).

tax_ext = ( ( ( ( fto / ffr ) ** ( v_meth / ( nto - nfr ) ) )

- 1 ) * 100 ).

cf = ( ( tax_ext / 100 ) + 1 ) ** ( nok / v_meth ).

ELSE.

* nto = curve_data-ntage - 1.

nto = curve_data-ntage.

fto = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nto / v_meth ).

v_tabix = v_tabix - 1.

IF v_tabix LT 1.

v_tabix = 1.

ENDIF.

READ TABLE curve_data INDEX v_tabix.

* nfr = curve_data-ntage - 1.

nfr = curve_data-ntage.

ffr = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nfr / v_meth ).

tax_ext = ( ( ( ( fto / ffr ) ** ( v_meth / ( nto - nfr ) ) )

- 1 ) * 100 ).

cf = ( ( tax_ext / 100 ) + 1 ) ** ( nok / v_meth ).

ENDIF.
ELSEIF v_WYFCJ = 0 OR "VSI02+

( ( i_koet-gform = '041' OR "VSI03+

i_koet-gform = '051' ) AND "VSI03+

request-currency NE 'BRL' ). "VSI03+

READ TABLE curve_data INDEX v_tabix.

nto = curve_data-ntage.

fto = ( ( curve_data-ifr / 100 ) * ( nto / v_meth ) + 1 ).

v_tabix = v_tabix - 1.

IF v_tabix LT 1.

v_tabix = 1.

ENDIF.

READ TABLE curve_data INDEX v_tabix.

nfr = curve_data-ntage.

ffr = ( ( curve_data-ifr / 100 ) * ( nfr / v_meth ) + 1 ).

tax_ext = ( ( ( ( ( fto - 1 ) - ( ffr - 1 ) ) / ( nto - nfr ) )

* v_meth ) * 100 ).

cf = ( ( tax_ext / 100 ) * ( nok / v_meth ) ) + 1.

ELSEIF v_WYFCJ = 1. "VSI02+

READ TABLE curve_data INDEX v_tabix.

nto = curve_data-ntage.

fto = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nto / v_meth ).

v_tabix = v_tabix - 1.
IF v_tabix LT 1.

v_tabix = 1.

ENDIF.

READ TABLE curve_data INDEX v_tabix.

nfr = curve_data-ntage.

ffr = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nfr / v_meth ).

tax_ext = ( ( ( ( fto / ffr ) ** ( v_meth / ( nto - nfr ) ) ) -

1 ) * 100 ).

cf = ( ( tax_ext / 100 ) + 1 ) ** ( nok / v_meth ).

ENDIF.

request-griddays = nok.

request-capfact = cf.

MODIFY request.

ELSE.

* fazer "interpolacao".

"break-point.

IF curve_def-szbmeth = 'A'.

IF curve_data-ntage <= 505.

* nto = curve_data-ntage - 1.
nto = curve_data-ntage.

ELSE.

nto = curve_data-ntage.

ENDIF.

fto = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nto / v_meth ).

v_tabix = v_tabix - 1.

ELSEIF v_WYFCJ = 0 OR "VSI02+

( ( i_koet-gform = '041' OR "VSI03+

i_koet-gform = '051' ) AND "VSI03+

request-currency NE 'BRL' ). "VSI03+

nto = curve_data-ntage.

fto = ( ( curve_data-ifr / 100 ) * ( nto / v_meth ) + 1 ).

v_tabix = v_tabix - 1.

ELSEIF v_WYFCJ = 1. "VSI02+

nto = curve_data-ntage.

fto = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nto / v_meth ).

v_tabix = v_tabix - 1.

ENDIF.

* Penultimo dia

IF nok = 1.

cf = fto.
ELSE.

if nok = 0.

cf = 1.

else.

* teste rodrigo

if v_tabix = 0.

v_tabix = 1.

endif.

READ TABLE curve_data INDEX v_tabix.

IF sy-subrc EQ 0.

IF curve_def-szbmeth = 'A'.

IF curve_data-ntage = v_nok.

cf = ( ( ( curve_data-ifr / 100 ) + 1 ) ** ( nok /

v_meth ) ).

ELSE.

* nfr = curve_data-ntage - 1.

nfr = curve_data-ntage.

ffr = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nfr / v_meth )

cf = ffr * ( fto / ffr ) ** ( ( nok - nfr ) / ( nto - nfr

) ).

ENDIF.

request-griddays = nok.

request-capfact = cf.
MODIFY request.

CONTINUE.

ELSE.

IF curve_data-ntage = nok.

IF v_WYFCJ = 0 OR "VSI02+

( ( i_koet-gform = '041' OR "VSI03+

i_koet-gform = '051' ) AND "VSI03+

request-currency NE 'BRL' ). "VSI03+

cf = 1 / ( ( curve_data-ifr / 100 ) * ( nok / v_meth ) +

1 ).

ELSE.

cf = ( ( ( curve_data-ifr / 100 ) + 1 ) ** ( nok /

v_meth ) ).

ENDIF.

request-griddays = nok.

request-capfact = cf.

MODIFY request.

CONTINUE.

ENDIF.

ENDIF.

ENDIF.

READ TABLE curve_data INDEX v_tabix.

IF sy-subrc EQ 0.

IF v_WYFCJ = 0 OR "VSI02+

( ( i_koet-gform = '041' OR "VSI03+


i_koet-gform = '051' ) AND "VSI03+

request-currency NE 'BRL' ). "VSI03+

nfr = curve_data-ntage.

ffr = ( ( curve_data-ifr / 100 ) * ( nfr / v_meth ) + 1 ).

cf = ( ( ffr - 1 ) + ( ( ( ( fto - 1 ) - ( ffr - 1 ) ) / (

nto - nfr ) ) * ( nok - nfr ) ) ) + 1.

ELSEIF v_WYFCJ = 1. "VSI02+

nfr = curve_data-ntage.

ffr = ( 1 + ( curve_data-ifr / 100 ) ) ** ( nfr / v_meth ).

cf = ffr * ( fto / ffr ) ** ( ( nok - nfr ) / ( nto - nfr )

).

ELSE.

* Erro na interpolação - curva para a data de valorização não encontrada

valuetext = text-m02.

EXIT.

ENDIF.

ENDIF.

endif.

ENDIF.

request-griddays = nok.

request-capfact = cf.

MODIFY request.

* End - Custom Interpolation


ENDIF.

ENDLOOP.

ENDFUNCTION.---------------------------------------------------------------------------------------------------------
---------------------

Criar tabelas abaixo.

ZTBCTP_VTVMDVIN .:. Atribuir a FORWARD RATES

You might also like