Módulo: CÂMBIO EXPORTAÇÃO
Funcionalidade: Associação Ordem de Pagamento
Data/Hora da Publicação: 17/12/2007 00:00:00
Data/Hora Última Alteração: 10/03/2010 17:39:18
Descrição da Nota: DA - ASSOCIAÇÃO DE ORDENS DE PAGAMENTO
Sintoma
DA - Associação de Ordens de Pagamento
Solução
DA - Associação de Ordens de Pagamento
7.0
Produto:
Nota
Descrição
Informações Complementares
----------------------------------------------------------------------------------------------------
Nota Número 05478 Data: 17/12/2007 Hora: 11:56:37
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
Nota Número : 05478
Categoria : Melhoria
Prioridade : Alta
Versão PW.CE : 7.0
Pacote : 00003
Agrupamento : 00027
----------------------------------------------------------------------------------------------------
Referência às notas relacionadas:
Número - Ordem - Descrição Breve
----------------------------------------------------------------------------------------------------
DA - ASSOCIAÇÃO DE ORDENS DE PAGAMENTO
----------------------------------------------------------------------------------------------------
Palavras Chave:
DA - ASSOCIAÇÃO DE ORDENS DE PAGAMENTO
----------------------------------------------------------------------------------------------------
Objetos da nota:
REPS /PWS/MZYCB035F01
REPS /PWS/MZYCB035F02
REPS /PWS/MZYCB035F03
REPS /PWS/MZYCB035T02
REPS /PWS/MZYCB035TOP
----------------------------------------------------------------------------------------------------
Modificações efetuadas em REPS /PWS/MZYCB035F01
...
USING '/PWS/ZYGLP115' '<FS_ZYCBT228A>-NRSEQ'
CHANGING itab_parameter.
PERFORM adiciona_drilldown USING
'/PWS/ZYCBE228A-NRSEQ' '/PWS/ZYCB034_E' 'DRILLDOWN_ZYCB034' 'X'
itab_parameter.
FREE itab_parameter.
PERFORM adiciona_parameter
USING 'BLN' '<FS_ZYCBT228A>-BELNR'
CHANGING itab_parameter.
PERFORM adiciona_parameter
* >> Início da exclusão: FORM CONS_DEFINE_DRILLDOWN
USING 'GJR' '<FS_ZYCBT228A>-GJAHR'
* << Fim da exclusão
* >> Início da inclusão: FORM CONS_DEFINE_DRILLDOWN
USING 'GJR' '/PWS/ZYCBE227A-DTASSOC(4)'
* << Fim da inclusão
CHANGING itab_parameter.
PERFORM adiciona_parameter
USING 'BUK' '/PWS/ZYCBE227A-BUKRS'
CHANGING itab_parameter.
PERFORM adiciona_drilldown USING
'/PWS/ZYCBE228A-BELNR' 'FB03' space 'X' itab_parameter.
ENDFORM.
FORM adiciona_parameter
USING
value(p_param_id) TYPE t_s_parameter-param_id
...
...
ELSE.
EXIT.
ENDIF.
ENDIF.
ENDDO.
ENDIF.
FREE: wa_dynpread, itab_dynpread.
PERFORM transfere_campos_sh_ordem
USING itab_nrseq
CHANGING v_linha itab_dynpread.
* >> Início da inclusão: FORM AJUDA_ORDEM_VENDA
Select * From /pws/zycbt238
APPENDING TABLE itab_disponibilidade
FOR ALL ENTRIES IN itab_nrseq
WHERE nrseq = itab_nrseq-table_line.
Select * From /pws/zycbt241
APPENDING TABLE itab_zycbt241
FOR ALL ENTRIES IN itab_nrseq
WHERE nrseq = itab_nrseq-table_line.
* << Fim da inclusão
IF NOT itab_dynpread IS INITIAL.
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = c_programa
dynumb = sy-dynnr
TABLES
dynpfields = itab_dynpread
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
...
----------------------------------------------------------------------------------------------------
Modificações efetuadas em REPS /PWS/MZYCB035F02
...
PERFORM seleciona_dados_ordem_pagto.
PERFORM transfere_associacao_itab.
ENDIF.
ENDFORM.
FORM seleciona_dados_fatura
USING value(p_wa_fatura) TYPE t_s_fatura.
CHECK NOT p_wa_fatura IS INITIAL.
SELECT SINGLE
nrinvoic nrparcf gsberf nremb bukrs dtinvoic dtbl kunag zterm
werks j_1bbranch
* >> Início da inclusão: FORM SELECIONA_DADOS_FATURA
vlslf
* << Fim da inclusão
FROM /pws/zycbt017
INTO wa_zycbt017
WHERE
nrinvoic = p_wa_fatura-nrinvoic AND
nrparcf = p_wa_fatura-nrparcf AND
gsberf = p_wa_fatura-gsberf.
SELECT SINGLE nrinvoic nrparcf gsberf belnr waers belnr6 budat
vlsltrans
* >> Início da inclusão: FORM SELECIONA_DADOS_FATURA
vlslliq
* << Fim da inclusão
FROM /pws/zycbt030
INTO wa_zycbt030
WHERE
nrinvoic = p_wa_fatura-nrinvoic AND
nrparcf = p_wa_fatura-nrparcf AND
gsberf = p_wa_fatura-gsberf.
ENDFORM.
FORM seleciona_dados_remessa
USING value(p_nrseq) TYPE /pws/zycbt229-nrseq_remessa.
CHECK NOT p_nrseq IS INITIAL.
...
...
WHERE nrseq = itab_zycbt227-nrseq.
ELSEIF NOT itab_zycbt229 IS INITIAL.
SELECT nrseq gsberf bukrs werks j_1bbranch kunag waers sld_associar
dtcredext dtlancto dtincl dtlimite ref_op obs belnr_op
conta_contabil rze tp_conta belnr_assoc dt_assoc
FROM /pws/zycbt226
INTO TABLE itab_zycbt226
FOR ALL ENTRIES IN itab_zycbt229
WHERE nrseq = itab_zycbt229-nrseq.
ENDIF.
* >> Início da inclusão: FORM SELECIONA_DADOS_ORDEM_PAGTO
IF NOT itab_zycbt226[] IS INITIAL.
SELECT * FROM /pws/zycbt238
INTO TABLE itab_disponibilidade
FOR ALL ENTRIES IN itab_zycbt226
WHERE nrseq = itab_zycbt226-nrseq.
SELECT * FROM /pws/zycbt241
INTO TABLE itab_zycbt241
FOR ALL ENTRIES IN itab_zycbt226
WHERE nrseq = itab_zycbt226-nrseq.
ENDIF.
* << Fim da inclusão
ENDFORM.
FORM authority_check
USING
value(p_objeto)
value(p_campo_obj)
value(p_campo)
value(p_acao).
AUTHORITY-CHECK
OBJECT p_objeto ID p_campo_obj DUMMY ID 'ACTVT' FIELD p_acao.
IF sy-subrc NE 0.
...
...
ENDFORM.
FORM atualiza_tabelas.
PERFORM atualiza_dados_fatura_remessa.
PERFORM atualiza_dados_ordem_pagto.
PERFORM atualiza_dados_associacao.
ENDFORM.
FORM atualiza_dados_fatura_remessa.
IF wa_controle-processo = c_flag_embarque.
UPDATE /pws/zycbt030
SET
* >> Início da inclusão: FORM ATUALIZA_DADOS_FATURA_REMESSA
vlslliq = wa_zycbt030-vlslliq
* << Fim da inclusão
vlsltrans = wa_zycbt030-vlsltrans
belnr6 = wa_zycbt030-belnr6
budat = wa_zycbt030-budat
* >> Início da inclusão: FORM ATUALIZA_DADOS_FATURA_REMESSA
WHERE
nrinvoic = /pws/zycbe227a-nrinvoic AND
nrparcf = /pws/zycbe227a-nrparcf AND
gsberf = /pws/zycbe227a-gsberf.
UPDATE /pws/zycbt017
SET
vlslf = wa_zycbt017-vlslf
* << Fim da inclusão
WHERE
nrinvoic = /pws/zycbe227a-nrinvoic AND
nrparcf = /pws/zycbe227a-nrparcf AND
gsberf = /pws/zycbe227a-gsberf.
* >> Início da inclusão: FORM ATUALIZA_DADOS_FATURA_REMESSA
UPDATE /pws/zycbt238 FROM TABLE itab_disponibilidade.
UPDATE /pws/zycbt241 FROM TABLE itab_zycbt241.
* << Fim da inclusão
PERFORM atualiza_dados_liq_and.
ELSE.
...
...
wa_zycbt227-mandt = sy-mandt.
wa_zycbt227-nrseq = p_wa_zycbt228a-nrseq.
wa_zycbt227-nrinvoic = /pws/zycbe227a-nrinvoic.
wa_zycbt227-gsberf = /pws/zycbe227a-gsberf.
wa_zycbt227-dtassoc = /pws/zycbe227a-dtassoc.
wa_zycbt227-nrparcf = /pws/zycbe227a-nrparcf.
wa_zycbt227-nremb = /pws/zycbe227a-nremb.
wa_zycbt227-dtlancto = /pws/zycbe227a-budat.
wa_zycbt227-waers = /pws/zycbe227a-waers.
wa_zycbt227-vlr_associado = p_wa_zycbt228a-vlr_associado.
* >> Início da inclusão: FORM ATUALIZA_ASSOC_EMBARQUE
wa_zycbt227-saldo = p_wa_zycbt228a-saldo.
* << Fim da inclusão
CASE p_wa_zycbt228a-oper.
WHEN c_alterado.
INSERT wa_zycbt227 INTO TABLE p_itab_zycbt227_a.
WHEN c_eliminado.
CHECK NOT p_wa_zycbt228a-belnr IS INITIAL.
INSERT wa_zycbt227 INTO TABLE p_itab_zycbt227_e.
WHEN c_novo.
INSERT wa_zycbt227 INTO TABLE p_itab_zycbt227_i.
ENDCASE.
LOOP AT itab_zycbt228
...
----------------------------------------------------------------------------------------------------
Modificações efetuadas em REPS /PWS/MZYCB035F03
...
v_saldo TYPE /pws/zycbt227-vlr_associado.
FIELD-SYMBOLS
<fs_zycbt228a> LIKE LINE OF itab_zycbt228a.
FREE itab_mensagem.
PERFORM seleciona_dados_ordem_pagto.
LOOP AT itab_zycbt228a
ASSIGNING <fs_zycbt228a>.
CASE <fs_zycbt228a>-oper.
WHEN c_novo.
v_saldo = <fs_zycbt228a>-vlr_associado.
* >> Início da inclusão: FORM EFETUA_CONTABILIZACOES
PERFORM saldo_disp_cont
CHANGING <fs_zycbt228a>.
* << Fim da inclusão
PERFORM efetua_desmemb_liq_and
USING <fs_zycbt228a>-nrseq <fs_zycbt228a>-gjahr
CHANGING v_saldo.
IF v_saldo > 0.
PERFORM efetua_desmemb_cliente
USING <fs_zycbt228a>-nrseq <fs_zycbt228a>-gjahr v_saldo.
ENDIF.
PERFORM efetua_desmemb_ordem_pagto
USING <fs_zycbt228a>.
PERFORM efetua_comp_associacao
USING <fs_zycbt228a>.
WHEN c_eliminado.
* >> Início da inclusão: FORM EFETUA_CONTABILIZACOES
PERFORM saldo_disp_cont
CHANGING <fs_zycbt228a>.
* << Fim da inclusão
PERFORM efetua_estorno_associacao
USING <fs_zycbt228a>-nrseq <fs_zycbt228a>-belnr.
PERFORM efetua_clearing_ordem_pagto
USING <fs_zycbt228a>.
PERFORM efetua_clearing_cliente
USING <fs_zycbt228a>.
PERFORM efetua_clearing_liq_and
USING <fs_zycbt228a>.
ENDCASE.
ENDLOOP.
...
...
WHERE nrinvoic = p_wa_fatura-nrinvoic
AND nrparcf = p_wa_fatura-nrparcf
AND gsberf = p_wa_fatura-gsberf
AND pendcomm = 'X'.
IF sy-subrc EQ 0.
MESSAGE i061 WITH text-M53
p_wa_fatura-nrinvoic
text-M54.
ENDIF.
endform.
* >> Início da inclusão:
FORM saldo_disp_cont
CHANGING p_zycbt228a TYPE t_s_zycbt228a.
DATA:
wa_zycbt227 TYPE t_s_zycbt227,
v_total TYPE t_s_disponibilidade-vldisp,
v_total2 TYPE t_s_disponibilidade-vldisp.
FIELD-SYMBOLS:
<fs_disp> TYPE t_s_disponibilidade,
<fs_zycbt241> TYPE t_s_zycbt241.
CASE p_zycbt228a-oper.
WHEN c_novo.
CLEAR:
v_total,
v_total2.
LOOP AT itab_disponibilidade ASSIGNING <fs_disp>
WHERE nrseq = p_zycbt228a-nrseq
AND saldo > 0.
v_total = v_total + <fs_disp>-saldo.
ENDLOOP.
IF sy-subrc EQ 0.
IF p_zycbt228a-vlr_associado GE v_total.
wa_zycbt017-vlslf = wa_zycbt017-vlslf - v_total.
wa_zycbt030-vlslliq = wa_zycbt030-vlslliq - v_total.
p_zycbt228a-saldo = p_zycbt228a-vlr_associado - v_total.
LOOP AT itab_disponibilidade ASSIGNING <fs_disp>
WHERE nrseq = p_zycbt228a-nrseq
AND saldo > 0.
CLEAR:
<fs_disp>-saldo.
ENDLOOP.
ELSE.
wa_zycbt017-vlslf =
wa_zycbt017-vlslf - p_zycbt228a-vlr_associado.
wa_zycbt030-vlslliq =
wa_zycbt030-vlslliq - p_zycbt228a-vlr_associado.
CLEAR:
p_zycbt228a-saldo.
LOOP AT itab_disponibilidade ASSIGNING <fs_disp>
WHERE nrseq = p_zycbt228a-nrseq
AND saldo > 0.
v_total2 = v_total2 + <fs_disp>-saldo.
IF v_total2 GT p_zycbt228a-vlr_associado.
<fs_disp>-saldo = v_total2 - p_zycbt228a-vlr_associado.
EXIT.
ELSE.
CLEAR:
<fs_disp>-saldo.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
LOOP AT itab_zycbt241 ASSIGNING <fs_zycbt241>
WHERE nrseq = p_zycbt228a-nrseq
AND sld_assoc > 0.
v_total = v_total + <fs_zycbt241>-sld_assoc.
ENDLOOP.
IF sy-subrc EQ 0.
IF p_zycbt228a-vlr_associado GE v_total.
wa_zycbt017-vlslf = wa_zycbt017-vlslf - v_total.
wa_zycbt030-vlslliq = wa_zycbt030-vlslliq - v_total.
p_zycbt228a-saldo = p_zycbt228a-vlr_associado - v_total.
LOOP AT itab_zycbt241 ASSIGNING <fs_zycbt241>
WHERE nrseq = p_zycbt228a-nrseq
AND sld_assoc > 0.
CLEAR:
<fs_zycbt241>-sld_assoc.
ENDLOOP.
ELSE.
wa_zycbt017-vlslf =
wa_zycbt017-vlslf - p_zycbt228a-vlr_associado.
wa_zycbt030-vlslliq =
wa_zycbt030-vlslliq - p_zycbt228a-vlr_associado.
CLEAR:
p_zycbt228a-saldo.
LOOP AT itab_zycbt241 ASSIGNING <fs_zycbt241>
WHERE nrseq = p_zycbt228a-nrseq
AND sld_assoc > 0.
v_total2 = v_total2 + <fs_zycbt241>-sld_assoc.
IF v_total2 GT p_zycbt228a-vlr_associado.
<fs_zycbt241>-sld_assoc = v_total2 -
p_zycbt228a-vlr_associado.
EXIT.
ELSE.
CLEAR:
<fs_zycbt241>-sld_assoc.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
p_zycbt228a-saldo = p_zycbt228a-vlr_associado.
ENDIF.
ENDIF.
WHEN c_eliminado.
READ TABLE itab_zycbt227 INTO wa_zycbt227
WITH KEY nrseq = p_zycbt228a-nrseq.
MOVE wa_zycbt227-saldo TO p_zycbt228a-saldo.
IF p_zycbt228a-vlr_associado NE p_zycbt228a-saldo.
v_total = p_zycbt228a-vlr_associado - p_zycbt228a-saldo.
wa_zycbt017-vlslf = wa_zycbt017-vlslf + v_total.
wa_zycbt030-vlslliq = wa_zycbt030-vlslliq + v_total.
LOOP AT itab_disponibilidade ASSIGNING <fs_disp>
WHERE nrseq = p_zycbt228a-nrseq.
v_total2 = v_total2 + <fs_disp>-vldisp.
IF v_total2 < p_zycbt228a-vlr_associado.
<fs_disp>-saldo = <fs_disp>-vldisp.
ELSE.
<fs_disp>-saldo = p_zycbt228a-vlr_associado -
( v_total2 - <fs_disp>-vldisp ) + <fs_disp>-saldo.
ENDIF.
ENDLOOP.
LOOP AT itab_zycbt241 ASSIGNING <fs_zycbt241>
WHERE nrseq = p_zycbt228a-nrseq.
v_total2 = v_total2 + <fs_zycbt241>-vlr_ord.
IF v_total2 < p_zycbt228a-vlr_associado.
<fs_zycbt241>-sld_assoc = <fs_zycbt241>-vlr_ord.
ELSE.
<fs_zycbt241>-sld_assoc = p_zycbt228a-vlr_associado -
( v_total2 - <fs_zycbt241>-vlr_ord ) +
<fs_zycbt241>-sld_assoc.
ENDIF.
ENDLOOP.
ENDIF.
ENDCASE.
ENDFORM.
* << Fim da inclusão
----------------------------------------------------------------------------------------------------
Modificações efetuadas em REPS /PWS/MZYCB035T02
...
nrparcf TYPE /pws/zycbt017-nrparcf,
gsberf TYPE /pws/zycbt017-gsberf,
nremb TYPE /pws/zycbt017-nremb,
bukrs TYPE /pws/zycbt017-bukrs,
dtinvoic TYPE /pws/zycbt017-dtinvoic,
dtbl TYPE /pws/zycbt017-dtbl,
kunag TYPE /pws/zycbt017-kunag,
zterm TYPE /pws/zycbt017-zterm,
werks TYPE /pws/zycbt017-werks,
j_1bbranch TYPE /pws/zycbt017-j_1bbranch,
* >> Início da inclusão:
vlslf TYPE /pws/zycbt017-vlslf,
* << Fim da inclusão
END OF t_s_zycbt017,
* >> Início da inclusão:
t_t_zycbt017 TYPE SORTED TABLE OF t_s_zycbt017
WITH UNIQUE KEY nrinvoic nrparcf gsberf,
* << Fim da inclusão
BEGIN OF t_s_zycbt030,
nrinvoic TYPE /pws/zycbt030-nrinvoic,
nrparcf TYPE /pws/zycbt030-nrparcf,
gsberf TYPE /pws/zycbt030-gsberf,
belnr TYPE /pws/zycbt030-belnr,
waers TYPE /pws/zycbt030-waers,
belnr6 TYPE /pws/zycbt030-belnr6,
budat TYPE /pws/zycbt030-budat,
vlsltrans TYPE /pws/zycbt030-vlsltrans,
* >> Início da inclusão:
vlslliq TYPE /pws/zycbt030-vlslliq,
* << Fim da inclusão
END OF t_s_zycbt030,
* >> Início da inclusão:
t_t_zycbt030 TYPE SORTED TABLE OF t_s_zycbt030
WITH UNIQUE KEY nrinvoic nrparcf gsberf,
* << Fim da inclusão
BEGIN OF t_s_zycbt124,
nrseq TYPE /pws/zycbt124-nrseq,
nrfech TYPE /pws/zycbt124-nrfech,
bukrs TYPE /pws/zycbt124-bukrs,
gsber TYPE /pws/zycbt124-gsber,
...
...
t_t_zycbt229 TYPE SORTED TABLE OF t_s_zycbt229
WITH UNIQUE KEY nrseq nrseq_remessa dtassoc,
t_s_zycbt230 TYPE /pws/zycbt230,
t_t_zycbt230 TYPE SORTED TABLE OF t_s_zycbt230
WITH UNIQUE KEY nrseq dtassoc bukrs belnr gjahr,
BEGIN OF t_s_zycbt228a.
INCLUDE STRUCTURE /pws/zycbe228a.
TYPES:
oper(1) TYPE c,
mark(1) TYPE c,
* >> Início da inclusão:
saldo TYPE /PWS/ZYCBT227-saldo,
* << Fim da inclusão
END OF t_s_zycbt228a,
t_t_zycbt228a TYPE STANDARD TABLE OF t_s_zycbt228a
WITH NON-UNIQUE KEY nrseq,
BEGIN OF t_s_zycbe228a_comp,
nrseq TYPE /pws/zycbe228a-nrseq,
icone TYPE icon-name,
oper(1) TYPE c,
mark(1) TYPE c,
END OF t_s_zycbe228a_comp,
BEGIN OF t_s_fatura,
...
----------------------------------------------------------------------------------------------------
Modificações efetuadas em REPS /PWS/MZYCB035TOP
...
nrinvoic TYPE /pws/zycbt228-nrinvoic,
nrparcf TYPE /pws/zycbt228-nrparcf,
gsberf TYPE /pws/zycbt228-gsberf,
belnr TYPE /pws/zycbt228-belnr,
dtcont TYPE d,
tpmsg TYPE /pws/zycbt032-tpmsg,
msg TYPE /pws/zycbt032-msg,
END OF t_s_mensagem,
t_t_mensagem TYPE STANDARD TABLE OF t_s_mensagem
WITH NON-UNIQUE DEFAULT KEY,
* >> Início da inclusão:
BEGIN OF t_s_disponibilidade.
INCLUDE STRUCTURE /pws/zycbt238.
TYPES:
indice TYPE sy-index,
mark(1) TYPE c,
operacao(1) TYPE c,
END OF t_s_disponibilidade,
t_t_disponibilidade TYPE STANDARD TABLE OF t_s_disponibilidade
WITH NON-UNIQUE DEFAULT KEY,
BEGIN OF t_s_zycbt241.
INCLUDE STRUCTURE /pws/zycbt241.
TYPES:
END OF t_s_zycbt241,
t_t_zycbt241 TYPE STANDARD TABLE OF t_s_zycbt241
WITH NON-UNIQUE DEFAULT KEY,
* << Fim da inclusão
t_t_dynpread TYPE STANDARD TABLE OF dynpread
WITH NON-UNIQUE DEFAULT KEY.
TABLES:
/pws/zycbe227a,
/pws/zycbe228a,
/pws/zycbe229a.
DATA:
btn_embarque(1) TYPE c VALUE 'X',
btn_remessa(1) TYPE c VALUE space,
v_nr_ordem TYPE STRING,
ok_code TYPE sy-ucomm.
CONTROLS:
tc_ordens TYPE TABLEVIEW USING SCREEN 0102.
DATA:
itab_tabstrip TYPE t_t_tabstrip,
itab_tbcontrol TYPE t_t_tbcontrol,
itab_drilldown TYPE t_t_drilldown,
itab_mensagem TYPE t_t_mensagem,
wa_controle TYPE t_s_controle,
* >> Início da inclusão:
itab_disponibilidade TYPE t_t_disponibilidade,
itab_zycbt241 TYPE t_t_zycbt241,
* << Fim da inclusão
wa_tabstrip LIKE LINE OF itab_tabstrip. "#EC NEEDED
Referência às notas relacionadas:
Número - Ordem - Descrição Breve
03379 - 00001 - ASSOCIAÇÃO DE ORDENS DE PAGAMENTO - DES. ADIC. REMESSA
05469 - 00002 - DESENVOLVIMENTO ADICIONAL - SAÍDA DE PAGAMENTO UTILIZANDO CONTA CORRENTE
05470 - 00003 - RELATÓRIO VALORES RECEBIDOS EM C/C NO EXTERIOR
05471 - 00004 - DEREX - AJUSTES PARA NOVA ORDEM DE PAGAMENTO
05475 - 00005 - RELATÓRIO DE PAGAMENTOS COM RECURSOS NO EXTERIOR
05479 - 00006 - CAPTAÇÂO - ORDEM DE PAGAMENTO
05482 - 00007 - VALORES MANTIDOS NO EXTERIOR - DA COMPLETO