Escolar Documentos
Profissional Documentos
Cultura Documentos
Identificação do Desenvolvimento
1
Definição do Desenvolvimento do ABAP
Serão desenvolvidas funções, fórmulas, tabelas, visões e transações para efetuar o cálculo
dos impostos inclusos no preço bruto (ICMS, PIS e COFINS) com base nas configurações
efetuadas na J1BTAX. Após inserir o preço bruto unitário e o IVA, o preço líquido será calculado
automaticamente pela Pricing ZBRUTO a partir da retirada dos impostos inclusos no preço bruto
do material ou serviço (ou seja, do ICMS, PIS e COFINS). Estão previstos:
Criação e adaptação da fórmula de valor de condição 959, disponibilizada pela Nota SAP
1551566. Nesta fórmula os impostos serão exportados para uma tabela interna
compartilhada dentro do grupo de função J_1B_PO_TAX_MAP e a partir da chamada do
módulo de função J_1B_WRITE_TAX_TO_MEMORY.
Criação da função ZJ_1B_READ_FROM_MEMORY_TO_PO com base na standard
J_1B_READ_FROM_MEMORY_TO_PO.
Criação e adaptação da fórmula de valor de condição 960, disponibilizada pela Nota SAP
1551566. Nesta fórmula os impostos serão importados para uma tabela interna
compartilhada dentro do grupo de função J_1B_PO_TAX_MAP e a partir da chamada do
módulo de função ZJ_1B_READ_FROM_MEMORY_TO_PO.
Criação da fórmula de requisito de determinação de preço 904 para eliminar valores
duplicados na pricing de compras quando criado um pedido com referência a uma
solicitação de cotação ou contrato.
Configuração da atribuição da fórmula 959 às condições de percentuais de impostos
(ICMS, IPI, SUBTRIB, PIS e COFINS) na pricing de impostos TAXBRA.
Configuração de uma nova pricing de compras ZBRUTO com condições Z de impostos
vinculadas à formula de valor de condição 960.
Criação de transação Z para chamada da visão J_1B_PO_TAX_MAPV pela SM30.
Preenchimento da visão J_1B_PO_TAX_MAPV através da transação SM30. Deve ser
informada a relação DE PARA entre as condições Z da pricing de compras ZBRUTO e as
condições standard da pricing de impostos TAXBRA que representam os parâmetros
percentuais de impostos (2º grupo). Isso servirá para buscar as configurações de impostos
feitas na J1BTAX aproveitando a lógica da própria TAXBRA.
Criação da tabela ZJ_1B_PO_TAX_MAP e consequente visão ZJ_1B_PO_TAX_MAP para
atualização na transação SM30. Devem ser informadas as condições da pricing de
compras ZBRUTO em relação às condições standard da pricing de impostos TAXBRA que
representam os impostos na nota fiscal (4º grupo). Isso servirá para considerar apenas as
condições ativadas pelo IVA de MM.
Implementação da classe ZCL_IM_ME_DEFINE_CALCTYPE da BADI DEFINE_CALCTYPE para
determinação automática da atualização da pricing se algum campo relevante sofrer modificação.
Implementação de enhancement na fórmula 320 da TAXBRA para ajuste do valor de PIS e COFINS
nas compras de material para revenda com cálculo de IPI.
2
Criação e adaptação da fórmula de valor de condição 959
Transação VOFM
Lógica de Processamento
FORM FRM_KONDI_WERT_959.
*ADAPTAÇÃO DAS FÓRMULAS 342 E 343
CONSTANTS:
lc_bco1 TYPE komv-kschl VALUE 'BCO1', "Condição BCO1 – Valor da COFINS
lc_bco3 TYPE komv-kschl VALUE 'BCO3', "Condição BCO3 – Base de cálculo da COFINS revenda
lc_bcop TYPE komv-kschl VALUE 'BCOP', "Condição BCOP – Base de cálculo da COFINS pauta
lc_bco4 TYPE komv-kschl VALUE 'BCO4', "Condição BCO4 – Base de cálculo da COFINS pauta revenda
lc_bpi1 TYPE komv-kschl VALUE 'BPI1', "Condição BPI1 – Valor do PIS
lc_bpi3 TYPE komv-kschl VALUE 'BPI3', "Condição BPI3 – Base de cálculo do PIS revenda
lc_bpip TYPE komv-kschl VALUE 'BPIP', "Condição BPIP – Base de cálculo do PIS pauta
lc_bpi4 TYPE komv-kschl VALUE 'BPI4'. "Condição BPI4 – Base de cálculo do PIS pauta revenda
DATA: lx_minimum TYPE xfeld.
IF xkomv-kschl = lc_bco1.
*del[...]: Coding revomed by SAP Note 1792089 "1792089
* INCLUDE j_1b_kondi_wert_342. "1792089
CALL FUNCTION 'J_1B_SET_CHECK_MIN_STEP_NUMBER'
EXPORTING
iv_mode = 'SET'
iv_xkomv_kolnr = xkomv-kolnr.
ELSEIF xkomv-kschl = lc_bco3 OR xkomv-kschl = lc_bcop OR xkomv-kschl = lc_bco4.
*del[...]: Coding moved by SAP Note 1792089 "1792089
* INCLUDE j_1b_kondi_wert_343. "1792089
CALL FUNCTION 'J_1B_SET_CHECK_MIN_STEP_NUMBER'
EXPORTING
iv_mode = 'CHECK'
iv_xkomv_kolnr = xkomv-kolnr
IMPORTING
cx_minimum = lx_minimum.
IF lx_minimum IS INITIAL.
CLEAR: xkwert,
3
xkomv-kwert, xkomv-kmein, xkomv-kpein.
* Condition will be removed from table xkomv:
xkomv-kinak = 'Z'.
ENDIF.
ELSEIF xkomv-kschl = lc_bpi1.
*del[...]: Coding revomed by SAP Note 1792089 "1792089
* INCLUDE j_1b_kondi_wert_342. "1792089
CALL FUNCTION 'J_1B_SET_CHECK_MIN_STEP_NUMBER'
EXPORTING
iv_mode = 'SET'
iv_xkomv_kolnr = xkomv-kolnr.
ELSEIF xkomv-kschl = lc_bpi3 OR xkomv-kschl = lc_bpip OR xkomv-kschl = lc_bpi4.
*del[...]: Coding moved by SAP Note 1792089 "1792089
* INCLUDE j_1b_kondi_wert_343. "1792089
CALL FUNCTION 'J_1B_SET_CHECK_MIN_STEP_NUMBER'
EXPORTING
iv_mode = 'CHECK'
iv_xkomv_kolnr = xkomv-kolnr
IMPORTING
cx_minimum = lx_minimum.
IF lx_minimum IS INITIAL.
CLEAR: xkwert,
xkomv-kwert, xkomv-kmein, xkomv-kpein.
* Condition will be removed from table xkomv:
xkomv-kinak = 'Z'.
ENDIF.
ENDIF.
*ADAPTAÇÃO DA FÓRMULA 959
*INCLUDE J_1B_FORM_WRITE_TO_MEMORY.
* transfer actual condition value from rettxkomv to memory
CALL FUNCTION 'J_1B_WRITE_TAX_TO_MEMORY'
EXPORTING
is_komv = rettxkomv.
ENDFORM.
4
Criação da função ZJ_1B_READ_FROM_MEMORY_TO_PO e atribuição no grupo
de função J_1B_PO_TAX_MAP
Lógica de Processamento
FUNCTION ZJ_1B_READ_FROM_MEMORY_TO_PO.
*"--------------------------------------------------------------------
*"*"Interface local:
*" IMPORTING
*" REFERENCE(IV_KAPPL) TYPE KAPPL
*" REFERENCE(IV_KSCHL) TYPE KSCHL
*" REFERENCE(IV_KPOSN) TYPE KPOSN
*" REFERENCE(IV_MWSKZ) TYPE MWSKZ
*" EXPORTING
*" REFERENCE(ES_KOMV) TYPE KOMV
*" EXCEPTIONS
*" NO_DATA_FOUND
*"--------------------------------------------------------------------
CONSTANTS: "1892623
lc_koaid_tax TYPE koaid VALUE 'D'. "Condition ID Taxes "1892623
DATA: ls_price_tax_item TYPE j_1b_po_tax_map.
* check if mapping from tax condition to pricing condition exists
SELECT SINGLE * FROM j_1b_po_tax_map
INTO ls_price_tax_item
WHERE kappl_po = iv_kappl
AND kschl_po = iv_kschl.
IF sy-subrc IS INITIAL.
* return corresponding tax condition value from memory
* 1. read with MWSKZ "1892623
* if found: condition is tax value "1892623
* 2. read w/o MWSKZ "1892623
* condition is tax rate or not relevant for tax code "1892623
READ TABLE gt_komv_exchange INTO es_komv
WITH KEY kappl = ls_price_tax_item-kappl_tax
kschl = ls_price_tax_item-kschl_tax
mwsk1 = iv_mwskz "1596085
kposn = iv_kposn.
IF sy-subrc <> 0. "1724550
READ TABLE gt_komv_exchange INTO es_komv "1724550
WITH KEY kappl = ls_price_tax_item-kappl_tax "1724550
kschl = ls_price_tax_item-kschl_tax "1724550
kposn = iv_kposn. "1724550
IF es_komv-koaid = lc_koaid_tax. "1892623
" tax not relevant for tax code -> set value to 0 "1892623
CLEAR es_komv-kwert. "1892623
ENDIF. "1892623
ENDIF. "1724550
ENDIF.
IF es_komv IS INITIAL. "1855267
RAISE no_data_found. "1855267
ENDIF. "1855267
ENDFUNCTION.
5
Criação da tabela ZJ_1B_PO_TAX_MAP e consequente visão ZJ_1B_PO_TAX_MAP
para atualização na transação SM30
6
Criação e adaptação da fórmula de valor de condição 960
Transação VOFM
Lógica de Processamento
FORM FRM_KONDI_WERT_960.
CONSTANTS:
lc_icm0 TYPE j_1baj-taxtyp VALUE 'ICM0', "Condição ICM0 – Sem cálculo do ICMS
lc_ipi0 TYPE j_1baj-taxtyp VALUE 'IPI0', "Condição IPI0 – Sem cálculo do IPI
lc_zbii TYPE j_1baj-taxtyp VALUE 'ZBII', "Condição ZBII – Base ICMS Industr./Revenda
lc_zbic TYPE j_1baj-taxtyp VALUE 'ZBIC', "Condição ZBIC – Base ICMS Consumo/Ativo
lc_zbpi TYPE j_1baj-taxtyp VALUE 'ZBPI', "Condição ZBPI – Base PIS/COFINS Industr./Revenda
lc_zbpc TYPE j_1baj-taxtyp VALUE 'ZBPC'. "Condição ZBPC – Base PIS/COFINS Consumo/Ativo
*ADAPTAÇÃO DA FÓRMULA 960
*INCLUDE J_1B_FORM_READ_FROM_MEMORY.
DATA: ti_j_1baj TYPE STANDARD TABLE OF j_1baj WITH HEADER LINE,
ti_a003 TYPE STANDARD TABLE OF a003 WITH HEADER LINE,
ti_zj1b_po_tax_map TYPE TABLE OF zj1b_po_tax_map WITH HEADER LINE,
xkomv_aux TYPE STANDARD TABLE OF komv_index WITH HEADER LINE INITIAL SIZE 50,
xkomv_aux2 TYPE STANDARD TABLE OF komv_index WITH HEADER LINE INITIAL SIZE 50,
lv_calc1 TYPE p DECIMALS 2,
lv_calc2 TYPE p DECIMALS 2,
lv_calc3 TYPE p DECIMALS 2,
ls_komv TYPE komv.
SELECT * FROM j_1baj
INTO TABLE ti_j_1baj.
SORT ti_j_1baj BY taxtyp.
DELETE ti_j_1baj WHERE taxtyp = lc_icm0 OR taxtyp = lc_ipi0.
SORT ti_j_1baj.
CHECK NOT ti_j_1baj[] IS INITIAL.
SELECT * FROM a003
INTO TABLE ti_a003
FOR ALL ENTRIES IN ti_j_1baj
WHERE kappl = 'TX'
AND kschl = ti_j_1baj-taxtyp
AND aland = 'BR'
7
AND mwskz = komp-mwskz.
SELECT * FROM zj1b_po_tax_map
INTO TABLE ti_zj1b_po_tax_map
WHERE kschl_po = xkomv-kschl.
SORT ti_zj1b_po_tax_map BY kschl_tax.
LOOP AT ti_a003.
READ TABLE ti_zj1b_po_tax_map WITH KEY kschl_tax = ti_a003-kschl.
IF NOT sy-subrc IS INITIAL.
DELETE ti_a003.
ENDIF.
ENDLOOP.
IF ti_a003[] IS INITIAL.
xkomv-kbetr = 0.
xkomv-kwert = 0.
xkwert = 0.
MODIFY xkomv.
ELSE.
CALL FUNCTION 'ZJ_1B_READ_FROM_MEMORY_TO_PO'
EXPORTING
iv_kappl = rettxkomv-kappl
iv_kschl = rettxkomv-kschl
iv_kposn = rettxkomv-kposn
iv_mwskz = komp-mwskz "1596085
IMPORTING
es_komv = ls_komv
EXCEPTIONS "1855267
OTHERS = 4. "1855267
CHECK sy-subrc = 0. "1855267
* depending on from where formula is called,
* either rettxkomv or xkomv has to be overwritten
rettxkomv-kbetr = ls_komv-kbetr.
rettxkomv-kawrt = ls_komv-kawrt.
rettxkomv-kwert = ls_komv-kwert.
rettxkomv-kpein = ls_komv-kpein.
* write tax values back to xkomv;
* overwriting xkwert instead of xkomv-kwert since
* xkomv-kwert is overwritten with xkwert after call of formula
xkomv-kbetr = ls_komv-kbetr.
xkomv-kawrt = ls_komv-kawrt.
xkwert = ls_komv-kwert.
xkomv-kpein = ls_komv-kpein.
xkomv_aux[] = xkomv[].
CLEAR: lv_calc1, lv_calc2, lv_calc3.
LOOP AT xkomv_aux WHERE kposn = xkomv-kposn.
IF xkomv-krech = 'A'.
IF xkomv-stun2 IS INITIAL.
IF ( xkomv_aux-stunr = xkomv-stunb ).
lv_calc1 = lv_calc1 + xkomv_aux-kwert.
ENDIF.
ELSE.
IF ( xkomv_aux-stunr => xkomv-stunb ) AND
( xkomv_aux-stunr =< xkomv-stun2 ).
lv_calc1 = lv_calc1 + xkomv_aux-kwert.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
8
IF xkomv-krech = 'A'.
lv_calc2 = xkomv-kbetr * 100.
lv_calc3 = lv_calc1 * ( lv_calc2 / 100 ).
xkomv-kwert = lv_calc3 / 100000.
ELSEIF xkomv-krech = 'C'.
lv_calc1 = xkomv-kawrt * 10.
lv_calc2 = lv_calc1 * xkomv-kbetr.
xkomv-kwert = lv_calc2 / ( xkomv-kpein * 10000 ).
ENDIF.
IF xkomv-kofra = '164'.
xkomv-kwert = xkomv-kwert * ( -1 ).
ENDIF.
IF xkomv-kschl = lc_zbii.
IF komp-mtuse NE '0' AND komp-mtuse NE '1'.
xkomv-kbetr = 0.
xkomv-kwert = 0.
ENDIF.
ELSEIF xkomv-kschl = lc_zbic.
IF komp-mtuse NE '2' AND komp-mtuse NE '3'.
xkomv-kbetr = 0.
xkomv-kwert = 0.
ENDIF.
ELSEIF xkomv-kschl = lc_zbpi.
IF komp-mtuse NE '1'.
xkomv-kbetr = 0.
xkomv-kwert = 0.
ENDIF.
ELSEIF xkomv-kschl = lc_zbpc.
IF komp-mtuse NE '0' AND komp-mtuse NE '2' AND komp-mtuse NE '3'.
xkomv-kbetr = 0.
xkomv-kwert = 0.
ENDIF.
ENDIF.
xkwert = xkomv-kwert.
MODIFY xkomv.
ENDIF.
ENDFORM.
9
Criação da fórmula de requisito 904
Transação VOFM
Lógica de Processamento
FORM KOBED_904.
CONSTANTS:
lc_navm TYPE j_1baj-taxtyp VALUE 'NAVM', "Condição NAVM – Impostos não recuperáveis
lc_skto TYPE j_1baj-taxtyp VALUE 'SKTO', "Condição ZKTO – Desconto financeiro
lc_pb00 TYPE j_1baj-taxtyp VALUE 'PB00', "Condição PB00 – Preço bruto pedido com referência
lc_pbxx TYPE j_1baj-taxtyp VALUE 'PBXX'. "Condição PBXX – Preço bruto pedido sem referência
DATA: lv_tot_cond_enc TYPE i, "Total de condições encontradas
lv_tot_cond_pre TYPE i, "Total de condições preenchidas
st_tkomv LIKE tkomv OCCURS 0 WITH HEADER LINE,
st_tkomv_aux LIKE tkomv OCCURS 0 WITH HEADER LINE.
sy-subrc = 0.
IF komt1-kschl = lc_navm.
sy-subrc = 4.
IF komp-kposn NE 0.
CHECK komp-kznep NE 'N'.
ENDIF.
sy-subrc = 0.
ELSEIF komt1-kschl = lc_skto.
sy-subrc = 4.
IF komp-kposn NE 0.
CHECK komp-sktof = ' '.
ENDIF.
10
sy-subrc = 0.
ENDIF.
CHECK tkomv IS REQUESTED.
CLEAR: lv_tot_cond_enc, lv_tot_cond_pre.
LOOP AT tkomv INTO st_tkomv
WHERE kschl = komt1-kschl
AND kposn = komp-kposn.
IF NOT st_tkomv-kbetr IS INITIAL.
ADD 1 TO lv_tot_cond_pre.
ENDIF.
ADD 1 TO lv_tot_cond_enc.
ENDLOOP.
IF lv_tot_cond_enc > 1.
IF lv_tot_cond_pre = lv_tot_cond_enc.
DELETE tkomv WHERE kschl = komt1-kschl AND
kposn = komp-kposn AND
kherk <> 'F'.
ELSE.
DELETE tkomv WHERE kschl = komt1-kschl AND
kposn = komp-kposn AND
kbetr IS INITIAL.
ENDIF.
ENDIF.
CLEAR: lv_tot_cond_enc, lv_tot_cond_pre.
IF komt1-kschl = lc_pb00 OR komt1-kschl = lc_pbxx.
LOOP AT tkomv INTO st_tkomv_aux
WHERE kposn = komp-kposn AND
( kschl = lc_pb00 OR
kschl = lc_pbxx ).
APPEND st_tkomv_aux.
IF NOT st_tkomv_aux-kbetr IS INITIAL.
ADD 1 TO lv_tot_cond_pre.
ENDIF.
ADD 1 TO lv_tot_cond_enc.
ENDLOOP.
IF lv_tot_cond_enc = 2.
IF lv_tot_cond_pre = 1.
DELETE tkomv WHERE ( kschl = lc_pb00 OR
kschl = lc_pbxx ) AND
kposn = komp-kposn AND
kbetr IS INITIAL.
ELSEIF lv_tot_cond_pre = 2.
DELETE tkomv WHERE kschl = lc_pbxx AND
kposn = komp-kposn.
ELSEIF lv_tot_cond_pre = 0.
DELETE tkomv WHERE kschl = lc_pb00 AND
kposn = komp-kposn.
ENDIF.
ENDIF.
ENDIF.
sy-subrc = 0.
ENDFORM.
11
FORM KOBEV_904.
CONSTANTS:
lc_navm TYPE j_1baj-taxtyp VALUE 'NAVM', "Condição NAVM – Impostos não recuperáveis
lc_skto TYPE j_1baj-taxtyp VALUE 'SKTO', "Condição ZKTO – Desconto financeiro
IF ( komt1-kschl = lc_navm OR komt1-kschl = lc_skto ).
sy-subrc = 0.
ENDIF.
ENDFORM.
Lógica de Processamento
method IF_EX_ME_DEFINE_CALCTYPE~DEFINE_CALCTYPE.
* Declarações
CONSTANTS:
lc_pb00 TYPE j_1baj-taxtyp VALUE 'PB00', "Condição PB00 – Preço bruto pedido com referência
lc_pbxx TYPE j_1baj-taxtyp VALUE 'PBXX'. "Condição PBXX – Preço bruto pedido sem referência
DATA: lv_brtwr1 TYPE komv-kbetr,
lv_brtwr2 TYPE komv-kbetr,
lv_pbruto(1) TYPE c.
FIELD-SYMBOLS: <tkomv> TYPE tax_xkomv_tab.
FIELD-SYMBOLS: <komv> TYPE komv_index.
* Leitura do preço bruto informado na tela do pedido
CLEAR: lv_pbruto, lv_brtwr1, lv_brtwr2.
* Verificar se atualização de preço é diferente de B (Redetermina preço)
CHECK ch_x_lf_calctype NE 'B'.
ASSIGN ('(SAPLV61A)XKOMV[]') TO <tkomv>.
IF sy-subrc IS INITIAL.
LOOP AT <tkomv> ASSIGNING <komv> WHERE kschl = lc_pb00 OR kschl = lc_pbxx.
lv_pbruto = 'X'.
lv_brtwr1 = <komv>-kbetr.
IF im_x_nbekpo-menge = 0.
lv_brtwr2 = 0.
ELSE.
lv_brtwr2 = im_x_obekpo-brtwr / im_x_nbekpo-menge.
ENDIF.
EXIT.
ENDLOOP.
ENDIF.
12
13
* Reprecificar quando os parâmetros abaixo forem alterados
IF ( im_x_obekpo-mwskz NE im_x_nbekpo-mwskz ) OR "IVA
( im_x_obekpo-menge NE im_x_nbekpo-menge ) OR "Quantidade
( im_x_obekpo-j_1bnbm NE im_x_nbekpo-j_1bnbm ) OR "NCM
( im_x_obekpo-peinh NE im_x_nbekpo-peinh ) OR "Dividido por
( im_x_obekpo-j_1bmatorg NE im_x_nbekpo-j_1bmatorg ) OR "Origem
( lv_pbruto = 'X' AND ( lv_brtwr1 NE lv_brtwr2 ) )."Preço bruto total
ch_x_lf_calctype = 'C'.
ELSEIF sy-ucomm = 'MESAVE' OR
sy-ucomm = 'MECHECKDOC'.
ch_x_lf_calctype = 'C'.
ENDIF.
endmethod.
Lógica de Processamento
Classe CL_TAX_CALC_BR – Início do método CALC_ICMS_INDUS.
IF ms_komk-kappl = 'TX'. "Válido somente para MM
* Cálculo do PIS e COFINS de Revenda com IPI Alíquota
IF check_ipi_active( ) = 'X' AND
ms_komp-mtuse_marc = '0'.
mv_additional_rate = mv_additional_rate +
( mv_additional_rate *
( ms_tax_data-ipirate * ms_tax_data-ipibase ) ).
ENDIF.
* Cálculo do PIS e COFINS de Revenda com IPI Pauta
IF NOT ms_tax_data-ipipauta-kwert IS INITIAL AND
ms_komp-mtuse_marc = '0'.
ms_tax_data-net_amount = ms_tax_data-net_amount +
( ms_tax_data-ipipauta-kwert * mv_additional_rate ).
ENDIF.
ENDIF.
14
Plano de Teste Específico
Ambiente/Mandante:
SBX
TESTE 1
Parâmetros de Seleção:
Criação de pedidos de compras de material de revenda, industrialização, consumo e ativo fixo,
informando o preço bruto unitário e IVA de MM.
Resultado esperado:
Condições de impostos e preço líquido de compras atualizados automaticamente na aba
condições do pedido de compras.
TESTE 2
Parâmetros de Seleção:
Modificação do preço bruto unitário, quantidade, IVA, origem e NCM do material no item do
pedido de compras já criado.
Resultado esperado:
Condições de impostos e preço líquido de compras atualizados automaticamente na aba
condições do pedido de compras.
15