0% found this document useful (0 votes)
153 views101 pages

Calculadora Externa

The FUNCTION assigns various functions to calculate the net present value (NPV) or clean price of financial instruments. It initializes variables, reads table data, performs currency conversions using exchange rates, and calculates the NPV or clean price value based on the specified valuation method, returning the result in the ENPV export parameter. Additional logic was added to retrieve additional business data from various database tables to populate fields in the internal tables used for the valuation.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
153 views101 pages

Calculadora Externa

The FUNCTION assigns various functions to calculate the net present value (NPV) or clean price of financial instruments. It initializes variables, reads table data, performs currency conversions using exchange rates, and calculates the NPV or clean price value based on the specified valuation method, returning the result in the ENPV export parameter. Additional logic was added to retrieve additional business data from various database tables to populate fields in the internal tables used for the valuation.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy