;*******************************************************************************
;* Rotina para Calculo de Valores da Ordem de Faturamento                      *
;*******************************************************************************
Proc Closed CALC_OF()
UseVars AutoLib, ErrorProc, VRMERC, VRSERV, VRDESCTO, TXDESCTO_TOTAL, AICMS, AIPI, AISSQN, AINSS, AIR,
        VRBCICMS, VRICMS, VRINSS, VRNF, VRBIPI, VRIPI, VRIR, BCIR,
        BCICMS, BCIPI, BCISSQN, BCINSS, RICMS, VIINSS, VISSQN, VIIPI, VIICMS,
        UF_ALIQUOTA_ICMS, SYS_CODIGO_CLIENTE,VIISSQN,VIIR,
        PARAM_UTILIZA_COMISSAO_VENDEDOR, PARAM_UTILIZA_COMISSAO_VENDREAL,
        UFEMPRESA_ALIQUOTA_ICMS,
        VRIPI_SUBST, VRBCICMS_CREDSN, VRICMS_CREDSN,
        ALIQUOTA_CREDITO_ICMS_SUBST, ALIQUOTA_CREDITO_ICMS_NOSN,
        MSG_AUTOMATICA,
        AMVA, BCMVA, VRIPIMVA, CALCULA_ST,
        TRIB_ICMS, OPCAO_RED_BCICMS, UF_ALIQUOTA_ICMS_INTERNA,
        TXACRES, TXACRES_ST, VRRATEIO_ACRES, VRRATEIO_ACRESST,
        APIS,ACOFINS,BCPIS,BCCOFINS,VIPIS,VICOFINS,VRPIS,VRCOFINS,VRII, VRBCISSQN,
        TabelaRefC, REG_TABELAREFC,
        VRRATEIO_BCICMS,VRSOMA_ST
        
Private VBC, VRBCST1, VRBCST2,
        tx_PISCOFINS, bc_PISCOFINS

MSG_AUTOMATICA=""

[Valor Mercadoria]=VRMERC
If [Descricao da Destinacao]="COMPLEMENTO IPI SBC" Or
   [Descricao da Destinacao]="COMPLEMENTO IPI CBC" Or
   [Descricao da Destinacao]="COMPLEMENTO ST"
   Then [Valor Mercadoria  ]=BlankNum()
EndIf
[Valor Servico   ]=VRSERV
If [Taxa de Desconto]>0
   Then VRDESCTO=Round((VRMERC*[Taxa de Desconto])/100,2)
        TXDESCTO_TOTAL=[Taxa de Desconto]
   Else VRDESCTO=[Valor do Desconto]
        TXDESCTO_TOTAL=(VRDESCTO/VRMERC)*100
EndIf
[Valor Desconto          ]=VRDESCTO
[Valor Mercadoria Liquido]=[Valor Mercadoria]-VRDESCTO

VRRATEIO_ACRES  =[Valor Despesas Acessorias]+[Valor do Seguro]
If [Frete Incluso na Nota]="+"
   Then VRRATEIO_ACRES=VRRATEIO_ACRES+[Valor do Frete]
EndIf
TXACRES=NDecimal((VRRATEIO_ACRES/VRMERC)*100,12)

VRRATEIO_ACRESST=[Valor Despesas Acessorias]+[Valor do Seguro]+[Valor do Frete]
If SYS_CODIGO_CLIENTE="0167"
   Then VRRATEIO_ACRESST=VRRATEIO_ACRESST-[Valor do Frete]     
EndIf
TXACRES_ST=NDecimal((VRRATEIO_ACRESST/VRSOMA_ST)*100,12)

VRBCICMS =0
VRICMS   =0
VRIPI    =0
VRIR     =0
VRBCISSQN=0
VRISSQN  =0
VRINSS   =0
VRNF     =0
VRBCST1  =0
VRBCST2  =0
VRPIS    =0
VRCOFINS =0

VRICMS_CREDSN  =0
VRRATEIO_BCICMS=0

If TRIB_ICMS="D"
   Then VRRATEIO_BCICMS=[Valor Despesas Acessorias]+[Valor do Seguro]
        If VRRATEIO_BCICMS>0
           Then VBC     =VRRATEIO_BCICMS
                VRBCICMS=VRBCICMS+VBC
                VRICMS  =Round(VRICMS+((VBC*UF_ALIQUOTA_ICMS)/100),2)
        EndIf            
        
        If [Frete Incluso na Nota]="+"
           Then If [Aliquota de ICMS Frete]>0
                   Then VBC     =[Valor do Frete]
                        VBC     =Round(VBC-((VBC*[Aliquota BCICMS Frete])/100),2)
                        VRBCICMS=VRBCICMS+VBC
                        VRICMS  =Round(VRICMS+((VBC*[Aliquota de ICMS Frete])/100),2)
                        VRRATEIO_BCICMS=VRRATEIO_BCICMS+VBC
                EndIf
        EndIf
        
        If VRII>0
           Then VBC     =VRII
                VRBCICMS=VRBCICMS+VBC
                VRICMS  =Round(VRICMS+((VBC*UF_ALIQUOTA_ICMS)/100),2)
        EndIf                
EndIf

For I From 1 To 10
    If Not IsBlank(AICMS[I])
       Then If BCICMS[I]>0
               Then Switch
                      Case OPCAO_RED_BCICMS="3" And RICMS[I]>0 And TXDESCTO_TOTAL>0:
                           VBC=BCICMS[I]
                      OtherWise:
                           VBC=BCICMS[I]-Round(((BCICMS[I]*TXDESCTO_TOTAL)/100),2)
                    EndSwitch
                    VBC=Round(VBC-((VBC*RICMS[I])/100),2)
                    VRBCICMS=VRBCICMS+VBC
                    VRICMS=Round(VRICMS+((VBC*AICMS[I])/100),2)
               Else VRICMS=VRICMS+VIICMS[I]
            EndIf
    EndIf
    If Not IsBlank(AIPI[I])
       Then If BCIPI[I]>0
               Then VBC=BCIPI[I]
                    VRIPI=Round(VRIPI+((VBC*AIPI[I])/100),2)
               Else VRIPI=VRIPI+VIIPI[I]
            EndIf
    EndIf
    If Not IsBlank(AISSQN[I])
       Then If BCISSQN[I]>0
               Then VRBCISSQN=VRBCISSQN+BCISSQN[I]
                    VRISSQN  =Round(VRISSQN+((BCISSQN[I]*AISSQN[I])/100),2)
               Else VRISSQN  =VRISSQN+VIISSQN[I]
            EndIf
    EndIf
    If Not IsBlank(AINSS[I])
       Then If BCINSS[I]>0
               Then VRINSS=VRINSS+Round((((BCINSS[I]-((BCINSS[I]*TXDESCTO_TOTAL)/100))*AINSS[I])/100),2)
               Else VRINSS=VRINSS+VIINSS[I]
            EndIf
    EndIf
    If Not IsBlank(AIR[I])
       Then If BCIR[I]>0
               Then VRIR=Round(VRIR+((BCIR[I]*AIR[I])/100),2)
               Else VRIR=VRIR+VIIR[I]
            EndIf
    EndIf
    
    If Not IsBlank(AMVA[I])
       Then If BCMVA[I]>0
               Then VRBCST1=VRBCST1+BCMVA[I] 

                    VBC=BCMVA[I]
                    VBC=Round(VBC+((BCMVA[I]*TXACRES_ST)/100),2)
                    VBC=VBC+VRIPIMVA[I]
                    
                    VBC=VBC+Round((VBC*AMVA[I])/100,2)
                    VRBCST2=VRBCST2+VBC 
            EndIf
    EndIf

EndFor


If (Search("VENDA",[Descricao da Destinacao])>0 And [Tipo Movimento Estoque]="S" And VRBCST2>0) Or
   (Search("DEVOL",[Descricao da Destinacao])>0 And [Tipo Movimento Estoque]="E" And VRBCST2>0)
   Then If CALCULA_ST="S"
           Then VRBCST1=VRBCST1+VRRATEIO_ACRES

                [Valor BCSubstituicao ICMS]=VRBCST2
                [Valor Substituicao ICMS  ]=Round(([Valor BCSubstituicao ICMS]*UF_ALIQUOTA_ICMS_INTERNA)/100,2)
                [Valor Substituicao ICMS  ]=[Valor Substituicao ICMS  ]-Round((VRBCST1*UF_ALIQUOTA_ICMS)/100,2)
                
        EndIf
EndIf

[Valor BCICMS ]=VRBCICMS
[Valor ICMS   ]=VRICMS
[Valor IPI    ]=VRIPI
[Valor BCISSQN]=VRBCISSQN
[Valor ISSQN  ]=VRISSQN
[Valor INSS   ]=VRINSS
[Valor IR     ]=VRIR
[Valor II     ]=VRII    

[Valor Nota Fiscal]=([Valor Mercadoria Liquido]+[Valor IPI]+[Valor Servico]+[Valor Despesas Acessorias]+
                    [Valor Substituicao ICMS]+[Valor do Seguro]+[Valor II])-([Valor INSS]+[Valor IR])

If SYS_CODIGO_CLIENTE="0057"
   Then If [Codigo da Destinacao]="036"
           Then [Valor Nota Fiscal]=([Valor Mercadoria Liquido]+[Valor IPI]+[Valor Servico]+[Valor Despesas Acessorias]+
                                    [Valor do Seguro])-([Valor INSS]+[Valor IR])
        EndIf
EndIf

VRNF=[Valor Nota Fiscal]

If [Frete Incluso na Nota]="+"
   Then [Valor Nota Fiscal]=[Valor Nota Fiscal]+[Valor do Frete]
EndIf

If VRBCICMS_CREDSN>0 And ALIQUOTA_CREDITO_ICMS_NOSN>0
   Then
        If [Consumidor Final]="S"
           Then VRBCICMS_CREDSN=[Valor Nota Fiscal]
           Else VRBCICMS_CREDSN=VRBCICMS_CREDSN-((VRBCICMS_CREDSN*[Valor Desconto])/[Valor Mercadoria])
                VRBCICMS_CREDSN=VRBCICMS_CREDSN+((VRBCICMS_CREDSN*VRRATEIO_ACRES  )/[Valor Mercadoria])
        EndIf
        VRICMS_CREDSN  =Round((VRBCICMS_CREDSN*ALIQUOTA_CREDITO_ICMS_NOSN)/100,2)

        MSG_AUTOMATICA=" ** PERMITE O APROVEITAMENTO DO CREDITO DE ICMS NO VALOR DE RS "+
                       LTRIM(Format("W12.2,EIC",VRICMS_CREDSN))+
                       " , CORRESPONDENTE A ALIQUOTA DE "+
                       LTRIM(Format("W12.2,EIC",ALIQUOTA_CREDITO_ICMS_NOSN))+
                       "% NOS TERMOS DO ARTIGO 23 DA LC123/2006 * "+
                       " NAO GERA DIREITO A CREDITO FISCAL DE ISS E IPI"
EndIf

If [Consumidor Final]="S" And [Valor BCICMS]>0
   Then [Valor BCICMS]=[Valor Nota Fiscal]
        [Valor ICMS  ]=Round(([Valor BCICMS]*UF_ALIQUOTA_ICMS)/100,2)
EndIf

If [Descricao da Destinacao]="COMPLEMENTO ICMS SBC" Or
   [Descricao da Destinacao]="COMPLEMENTO ICMS CBC"
   Then [Valor Nota Fiscal       ]=BlankNum()
        [Valor Mercadoria        ]=BlankNum()
        [Valor Mercadoria Liquido]=BlankNum()
EndIf
If [Descricao da Destinacao]="COMPLEMENTO ICMS SBC"
   Then [Valor BCICMS            ]=BlankNum()
EndIf
If [Descricao da Destinacao]="COMPLEMENTO ST" 
   Then [Valor Mercadoria        ]=BlankNum()
        [Valor Mercadoria Liquido]=BlankNum()
EndIf

If SYS_CODIGO_CLIENTE="0075"
   Then If [Codigo da Destinacao]="022"
           Then [Valor Despesas Acessorias]=Round(([Valor Mercadoria Liquido]*2.5)/100,2)
                [Valor Nota Fiscal        ]=[Valor Mercadoria Liquido]+[Valor Despesas Acessorias]
                [Valor INSS               ]=Round(([Valor Nota Fiscal]*2.3)/100,2)

                [Valor BCSubstituicao ICMS]=[Valor ICMS]
                [Valor Substituicao ICMS  ]=Round(([Valor BCSubstituicao ICMS]*5)/100,2)

                If [Data de Emissao]>=DateVal("31.05.2003")
                   Then [Valor Nota Fiscal        ]=[Valor Nota Fiscal       ]-([Valor INSS]+[Valor Substituicao ICMS])
                   Else [Valor Nota Fiscal        ]=[Valor Nota Fiscal       ]- [Valor INSS]
                EndIf
        EndIf
EndIf

If SYS_CODIGO_CLIENTE="0057"
   Then If [Codigo da Destinacao]="036"
           Then [Valor BCSubstituicao ICMS]=[Valor Mercadoria]
                [Valor Substituicao ICMS  ]=Round(([Valor BCSubstituicao ICMS]*[Aliquota de ICMS])/100,2)
        EndIf
EndIf


;*** Calculo PIS/COFINS ********************************************************
If [Valor Nota Fiscal]>0 And [Valor Mercadoria]>0
   Then tx_PISCOFINS=(100*[Valor Nota Fiscal])/[Valor Mercadoria]
        tx_PISCOFINS=tx_PISCOFINS-100
        For I From 1 To 10
            If Not IsBlank(APIS[I])
               Then If BCPIS[I]>0
                       Then bc_PISCOFINS=BCPIS[I]
                            Switch
                              Case tx_PISCOFINS>0: bc_PISCOFINS=Round(BCPIS[I]+((BCPIS[I]*tx_PISCOFINS)/100),2)
                              Case tx_PISCOFINS<0: bc_PISCOFINS=Round(BCPIS[I]-((BCPIS[I]*(tx_PISCOFINS*-1))/100),2)
                            EndSwitch
                            VRPIS=Round(VRPIS+((bc_PISCOFINS*APIS[I])/100),2)
                       Else VRPIS=VRPIS+VIPIS[I]
                    EndIf
            EndIf
            If Not IsBlank(ACOFINS[I])
               Then If BCCOFINS[I]>0
                       Then bc_PISCOFINS=BCCOFINS[I]
                            Switch
                              Case tx_PISCOFINS>0: bc_PISCOFINS=Round(BCCOFINS[I]+((BCCOFINS[I]*tx_PISCOFINS)/100),2)
                              Case tx_PISCOFINS<0: bc_PISCOFINS=Round(BCCOFINS[I]-((BCCOFINS[I]*(tx_PISCOFINS*-1))/100),2)
                            EndSwitch
                            VRCOFINS=Round(VRCOFINS+((bc_PISCOFINS*ACOFINS[I])/100),2)
                       Else VRCOFINS=VRCOFINS+VICOFINS[I]
                    EndIf
            EndIf
        EndFor
EndIf
[Valor PIS   ]=VRPIS
[Valor COFINS]=VRCOFINS

;*** 0=BlankNum() **************************************************************
If [Valor BCICMS             ]=0 Then [Valor BCICMS             ]=BlankNum() EndIf
If [Valor ICMS               ]=0 Then [Valor ICMS               ]=BlankNum() EndIf
If [Valor BCSubstituicao ICMS]=0 Then [Valor BCSubstituicao ICMS]=BlankNum() EndIf
If [Valor Substituicao ICMS  ]=0 Then [Valor Substituicao ICMS  ]=BlankNum() EndIf
If [Valor IPI                ]=0 Then [Valor IPI                ]=BlankNum() EndIf
If [Valor BCISSQN            ]=0 Then [Valor BCISSQN            ]=BlankNum() EndIf
If [Valor ISSQN              ]=0 Then [Valor ISSQN              ]=BlankNum() EndIf
If [Valor do Frete           ]=0 Then [Valor do Frete           ]=BlankNum() EndIf
If [Valor do Seguro          ]=0 Then [Valor do Seguro          ]=BlankNum() EndIf
If [Valor Despesas Acessorias]=0 Then [Valor Despesas Acessorias]=BlankNum() EndIf
If [Valor PIS                ]=0 Then [Valor PIS                ]=BlankNum() EndIf
If [Valor COFINS             ]=0 Then [Valor COFINS             ]=BlankNum() EndIf
If [Valor II                 ]=0 Then [Valor II                 ]=BlankNum() EndIf

If PARAM_UTILIZA_COMISSAO_VENDEDOR="S" Or
   PARAM_UTILIZA_COMISSAO_VENDREAL="S"
   Then Checa_Comissao_Vendedor()
EndIf

EndProc     ;  (Calc_OF)

;*******************************************************************************
;* Rotina para Calculo de Valores da Ordem de Faturamento                      *
;*******************************************************************************
Proc Closed Rateio_BC_Itens(TabelaRefC)
UseVars AutoLib, ErrorProc, 
        UF_ALIQUOTA_ICMS, SYS_CODIGO_CLIENTE,
        UFEMPRESA_ALIQUOTA_ICMS,
        CALCULA_ST, OPCAO_RED_BCICMS, UF_ALIQUOTA_ICMS_INTERNA,
        TXDESCTO_TOTAL, TXACRES_ST,
        ALIQUOTA_CREDITO_ICMS_NOSN, VRICMS_CREDSN,
        VRRATEIO_ACRESST,VRRATEIO_BCICMS
        
Private ICMS_BC, ICMS_Valor, ICMS_ST_BC, ICMS_ST_Valor, ICMS_CredSN_Valor, 
        IPI_Valor, PIS_Valor, COFINS_Valor, ISSQN_BC, ISSQN_Valor, 
        Frete_Valor, Seguro_Valor, OutDesp_Valor, Descto_Valor,
        SOMA_ITENS_ST, SOMA_ITENS_PIS, SOMA_ITENS_COFINS,
        PORC_IT_ST, PORC_IT_MERC, PORC_IT_PIS_COF,
        VR_ACRESC, VR_ACRESCST, VL_ITEM, VL_DESC, VL_IPI, ALIQ_ICMS, ALIQ_RD_ICMS, MVA_ST,ALIQ_ST,
        VL_BC_ICMS , VL_RED_BC , VL_ICMS , VL_BC_ICMS_ST, VL_ICMS_ST, 
        VL_BC_ICMS2, VL_RED_BC2, VL_ICMS2, 
        VL_BC_PIS, VL_PIS, VL_BC_COFINS, VL_COFINS,VL_II,
        DIF_ICMS_BC, DIF_ICMS_Valor, DIF_ICMS_ST_BC,DIF_ICMS_ST_Valor,DIF_ICMS_CredSN_Valor,
        DIF_IPI_Valor, DIF_PIS_BC, DIF_COFINS_BC, DIF_PIS_Valor, DIF_COFINS_Valor,
        DIF_ISSQN_BC, DIF_ISSQN_Valor,
        DIF_Descto_Valor, DIF_Frete_Valor, DIF_Seguro_Valor, DIF_OutDesp_Valor,
        ICMSOk, ICMSSTOk, ICMSCredSNOk, IPIOk, PISOk, COFINSOk, ISSQNOk, 
        DesctoOk, FreteOk, SeguroOk, OutDespOk,
        TabelaRefC, TabelaRefI, REG_TABELAREFC, OutrosRateioOk

;--- Seta Tabelas de Trabalho --------------------------------------------------
Moveto TabelaRefC
CopyToArray REG_TABELAREFC ; guarda dados registro mestre

Switch
  Case TabelaRefC="FaturaC": TabelaRefI="FaturaI"
  Case TabelaRefC="NotaC"  : TabelaRefI="NotaI"
EndSwitch

;--- Totalizadores -------------------------------------------------------------
ICMS_BC          =0
ICMS_Valor       =0 
ICMS_ST_BC       =0
ICMS_ST_Valor    =0
ICMS_CredSN_Valor=0
IPI_Valor        =0 
PIS_BC           =0
PIS_Valor        =0
COFINS_BC        =0 
COFINS_Valor     =0 
ISSQN_BC         =0 
ISSQN_Valor      =0 
Frete_Valor      =0
Seguro_Valor     =0
OutDesp_Valor    =0
Descto_Valor     =0

SOMA_ITENS_ST    =0
SOMA_ITENS_PIS   =0
SOMA_ITENS_COFINS=0

;--- Somar Itens ST,PIS,COFINS -------------------------------------------------
Moveto TabelaRefI
Scan

  If ([Tributacao de ICMS]="S" And SubStr([Tipo Tributacao],2,2)<>"60") 
     Or
     (Search("DEVOL",[NotaC->Descricao da Destinacao])>0 And
      [Tributacao de ICMS]="S" And SubStr([Tipo Tributacao],2,2)="60")
   Then SOMA_ITENS_ST    =SOMA_ITENS_ST    +[Preco Total]
  EndIf    

  If [PIS_Aliquota]>0   
     Then SOMA_ITENS_PIS   =SOMA_ITENS_PIS   +[Preco Total]
  EndIf

  If [COFINS_Aliquota]>0   
     Then SOMA_ITENS_COFINS=SOMA_ITENS_COFINS+[Preco Total]
  EndIf

EndScan
     
Moveto TabelaRefI
Scan

;--- Calcular impostos e rateios proporcionais ---------------------------------
  PORC_IT_ST     =([Preco Total]/SOMA_ITENS_ST)*100 
  PORC_IT_MERC   =([Preco Total]/REG_TABELAREFC["Valor Mercadoria"])*100 
  PORC_IT_PIS_COF=(100*REG_TABELAREFC["Valor Nota Fiscal"])/REG_TABELAREFC["Valor Mercadoria"]
  PORC_IT_PIS_COF=PORC_IT_PIS_COF-100

  VR_ACRESC      =NDecimal((VRRATEIO_BCICMS *PORC_IT_MERC)/100,2)
  VR_ACRESCST    =NDecimal((VRRATEIO_ACRESST*PORC_IT_MERC)/100,2)

  VL_ITEM        =[Preco Total             ]
  VL_DESC        =NDecimal((VL_ITEM*TXDESCTO_TOTAL)/100,2)

  If [Aliquota de IPI]>0
     Then [IPI_BC]=VL_ITEM
     Else [IPI_BC]=BlankNum()    
  EndIf
  VL_IPI          =[Valor do IPI]
  VL_II           =[II_Valor Imposto]
  
  ALIQ_ICMS      =[Aliquota de ICMS        ]
  ALIQ_RD_ICMS   =[Aliquota Reduzida BCICMS]
  MVA_ST         =[MVA         ]
  ALIQ_ST        =UF_ALIQUOTA_ICMS_INTERNA
  If [Aliquota de ICMS]>0 
     Then Switch
            Case OPCAO_RED_BCICMS=3 And ALIQ_RD_ICMS>0 And TXDESCTO_TOTAL>0:
              VL_BC_ICMS=VL_ITEM
            OtherWise:
              VL_BC_ICMS=VL_ITEM
              VL_BC_ICMS=VL_BC_ICMS-VL_DESC
          EndSwitch
          VL_RED_BC =NDecimal((VL_BC_ICMS*ALIQ_RD_ICMS)/100,2)
          VL_BC_ICMS=VL_BC_ICMS-VL_RED_BC                   
          Switch
            Case REG_TABELAREFC["Consumidor Final"]="S" And 
                 REG_TABELAREFC["Valor BCICMS"]>0:
                  VL_BC_ICMS=VL_BC_ICMS+VR_ACRESC+VL_IPI+VL_II                 
            OtherWise:
                  VL_BC_ICMS=VL_BC_ICMS+VR_ACRESC+VL_II            
          EndSwitch
          VL_ICMS   =NDecimal((VL_BC_ICMS*ALIQ_ICMS)/100,2)
          [ICMS_BC      ]=VL_BC_ICMS
          [Valor do ICMS]=VL_ICMS

          [ICMS_CredSN_Aliquota]=BlankNum()
          [ICMS_CredSN_Valor   ]=BlankNum()
     Else 
          VL_ICMS        =[Valor do ICMS]
          [ICMS_BC      ]=BlankNum()    
          [Valor do ICMS]=VL_ICMS

          If [Tipo do Item]<>"C" And ([Tributacao de ICMS]="O" Or [Tributacao de ICMS]="N") And
             ALIQUOTA_CREDITO_ICMS_NOSN>0 And REG_TABELAREFC["Valor BCICMS"]<=0
             Then VL_BC_ICMS2=VL_ITEM-VL_DESC
                  Switch
                    Case REG_TABELAREFC["Consumidor Final"]="S" And 
                         REG_TABELAREFC["Valor BCICMS"]<=0:
                          VL_BC_ICMS2=VL_BC_ICMS2+VR_ACRESC+VL_IPI
                    OtherWise:
                          VL_BC_ICMS2=VL_BC_ICMS2+VR_ACRESC
                  EndSwitch
                  [ICMS_CredSN_Aliquota]=ALIQUOTA_CREDITO_ICMS_NOSN
                  [ICMS_CredSN_Valor   ]=NDecimal((VL_BC_ICMS2*ALIQUOTA_CREDITO_ICMS_NOSN)/100,2)
             Else [ICMS_CredSN_Aliquota]=BlankNum()
                  [ICMS_CredSN_Valor   ]=BlankNum()
          EndIf   
  EndIf

	If (REG_TABELAREFC["Valor Substituicao ICMS"]>0 And
      [Tributacao de ICMS]="S" And SubStr([Tipo Tributacao],2,2)<>"60") 
      Or
	   (REG_TABELAREFC["Valor Substituicao ICMS"]>0 And
      Search("DEVOL",REG_TABELAREFC["Descricao da Destinacao"])>0 And
      [Tributacao de ICMS]="S" And SubStr([Tipo Tributacao],2,2)="60")
	   Then If CALCULA_ST="S" And MVA_ST>0 And VL_ITEM>0
   	         Then 
	                If VL_ICMS>0
	                   Then VL_ICMS2=VL_ICMS
	                   Else VL_BC_ICMS2=VL_ITEM
                          VL_BC_ICMS2=VL_BC_ICMS2-VL_DESC 
                          VL_RED_BC2 =NDecimal((VL_BC_ICMS2*ALIQ_RD_ICMS)/100,2)
                          VL_BC_ICMS2=VL_BC_ICMS2-VL_RED_BC2                   
                          Switch
                            Case REG_TABELAREFC["Consumidor Final"]="S" And 
                                 REG_TABELAREFC["Valor BCICMS"]>0:
                                  VL_BC_ICMS2=VL_BC_ICMS2+VR_ACRESCST+VL_IPI
                            OtherWise:
                                  VL_BC_ICMS2=VL_BC_ICMS2+VR_ACRESCST
                          EndSwitch
                          VL_ICMS2  =NDecimal((VL_BC_ICMS2*REG_TABELAREFC["Aliquota de ICMS"])/100,2)
                  EndIf

	                VL_BC_ICMS_ST=VL_ITEM
	                VL_BC_ICMS_ST=Round(VL_BC_ICMS_ST+((VL_ITEM*TXACRES_ST)/100),2)
	                VL_BC_ICMS_ST=VL_BC_ICMS_ST+VL_IPI
	                VL_BC_ICMS_ST=VL_BC_ICMS_ST+Round((VL_BC_ICMS_ST*MVA_ST)/100,2)
                  VL_RED_BC2   =NDecimal((VL_BC_ICMS_ST*ALIQ_RD_ICMS)/100,2)
                  VL_BC_ICMS_ST=VL_BC_ICMS_ST-VL_RED_BC2                  
	                VL_ICMS_ST   =Round((VL_BC_ICMS_ST*ALIQ_ST)/100,2)
	                VL_ICMS_ST   =VL_ICMS_ST-VL_ICMS2
	
             Else VL_BC_ICMS_ST=NDecimal((REG_TABELAREFC["Valor BCSubstituicao ICMS"]*PORC_IT_ST)/100,2)
                  VL_ICMS_ST   =NDecimal((REG_TABELAREFC["Valor Substituicao ICMS"  ]*PORC_IT_ST)/100,2)
          EndIf
     Else VL_BC_ICMS_ST     =BlankNum()
          VL_ICMS_ST        =BlankNum()
          ALIQ_ST           =BlankNum()
	EndIf
  [ICMS_ST_BC      ]=VL_BC_ICMS_ST
  [ICMS_ST_Valor   ]=VL_ICMS_ST
  [ICMS_ST_Aliquota]=ALIQ_ST

  If [PIS_Aliquota]>0 And REG_TABELAREFC["Valor PIS"]>0 
     Then VL_BC_PIS=(VL_ITEM-VL_DESC)+VL_IPI+VL_ICMS_ST+VR_ACRESCST
          VL_PIS   =NDecimal((VL_BC_PIS*[PIS_Aliquota])/100,2)
     Else VL_BC_PIS  =BlankNum()
          VL_PIS     =BlankNum()
  EndIf
  [PIS_BC   ]=VL_BC_PIS
  [PIS_Valor]=VL_PIS

  If [COFINS_Aliquota]>0 And REG_TABELAREFC["Valor COFINS"]>0 
     Then VL_BC_COFINS=(VL_ITEM-VL_DESC)+VL_IPI+VL_ICMS_ST+VR_ACRESCST
          VL_COFINS=NDecimal((VL_BC_COFINS*[COFINS_Aliquota])/100,2)
     Else VL_BC_COFINS  =BlankNum()
          VL_COFINS     =BlankNum()
  EndIf
  [COFINS_BC   ]=VL_BC_COFINS
  [COFINS_Valor]=VL_COFINS

  If [Aliquota de ISSQN]>0
     Then [ISSQN_BC] =VL_ITEM
     Else [ISSQN_BC] =BlankNum()    
  EndIf

;--- Rateio Frete, Seguro, Desconto, Despesas ----------------------------------
  OutrosRateioOk=True 
  Switch
    Case [Tipo do Item]="C":  ;Igual a Seri‡o
      OutrosRateioOk=False    ;nÆo rateia frete e outros
    ;;If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And [CFO]="5124" ; servi‡o de insdustrializa‡Æo
    ;;   Then OutrosRateioOk=True
    ;;EndIf
    OtherWise              :  ;Diferente de servi‡o
      OutrosRateioOk=True     ;rateia frete e outros 
      If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And [CFO]="5902" ;retorno industrializa‡Æo
         Then OutrosRateioOk=False
      EndIf
  EndSwitch
  If OutrosRateioOk
     Then [Taxa Desconto Total ]=TXDESCTO_TOTAL
          [Valor Desconto Total]=VL_DESC
          If REG_TABELAREFC["Frete Incluso na Nota"]="+"
             Then [Valor Frete Total]=NDecimal((REG_TABELAREFC["Valor do Frete"     ]*PORC_IT_MERC)/100,2)
             Else [Valor Frete Total]=BlankNum()
          EndIf
          [Valor Seguro Total ]=NDecimal((REG_TABELAREFC["Valor do Seguro"          ]*PORC_IT_MERC)/100,2)
          [Valor OutDesp Total]=NDecimal((REG_TABELAREFC["Valor Despesas Acessorias"]*PORC_IT_MERC)/100,2)

          Descto_Valor =Descto_Valor +[Valor Desconto Total]
          Frete_Valor  =Frete_Valor  +[Valor Frete Total   ]
          Seguro_Valor =Seguro_Valor +[Valor Seguro Total  ]
          OutDesp_Valor=OutDesp_Valor+[Valor OutDesp Total ]
     Else [Taxa Desconto Total ]=BlankNum()
          [Valor Desconto Total]=BlankNum()
          [Valor Frete Total   ]=BlankNum()
          [Valor Seguro Total  ]=BlankNum()
          [Valor OutDesp Total ]=BlankNum()
  EndIf

;--- Somar totalizadores -------------------------------------------------------
  ICMS_BC          =ICMS_BC          +[ICMS_BC]
  ICMS_Valor       =ICMS_Valor       +[Valor do ICMS] 
  ICMS_ST_BC       =ICMS_ST_BC       +[ICMS_ST_BC]
  ICMS_ST_Valor    =ICMS_ST_Valor    +[ICMS_ST_Valor]
  ICMS_CredSN_Valor=ICMS_CredSN_Valor+[ICMS_CredSN_Valor]
  IPI_Valor        =IPI_Valor        +[Valor do IPI] 
  PIS_BC           =PIS_BC           +[PIS_BC   ] 
  PIS_Valor        =PIS_Valor        +[PIS_Valor] 
  COFINS_BC        =COFINS_BC        +[COFINS_BC   ] 
  COFINS_Valor     =COFINS_Valor     +[COFINS_Valor] 
  ISSQN_BC         =ISSQN_BC         +[ISSQN_BC] 
  ISSQN_Valor      =ISSQN_Valor      +[Valor do ISSQN] 

EndScan


Moveto TabelaRefC
;--- Calcular diferen‡a totalizadores ------------------------------------------
DIF_ICMS_BC          =[Valor BCICMS             ]-ICMS_BC      
DIF_ICMS_Valor       =[Valor ICMS               ]-ICMS_Valor  
DIF_ICMS_ST_BC       =[Valor BCSubstituicao ICMS]-ICMS_ST_BC   
DIF_ICMS_ST_Valor    =[Valor Substituicao ICMS  ]-ICMS_ST_Valor
DIF_ICMS_CredSN_Valor=VRICMS_CREDSN              -ICMS_CredSN_Valor
DIF_IPI_Valor        =[Valor IPI                ]-IPI_Valor  
DIF_PIS_BC           =[Valor Nota Fiscal        ]-PIS_BC     
DIF_PIS_Valor        =[Valor PIS                ]-PIS_Valor  
DIF_COFINS_BC        =[Valor Nota Fiscal        ]-COFINS_BC     
DIF_COFINS_Valor     =[Valor COFINS             ]-COFINS_Valor  
DIF_ISSQN_BC         =[Valor BCISSQN            ]-ISSQN_BC
DIF_ISSQN_Valor      =[Valor ISSQN              ]-ISSQN_Valor  
DIF_Descto_Valor     =[Valor Desconto           ]-Descto_Valor
If [Frete Incluso na Nota]="+"
   Then DIF_Frete_Valor  =[Valor do Frete   ]-Frete_Valor
   Else DIF_Frete_Valor  =0
EndIf
DIF_Seguro_Valor     =[Valor do Seguro          ]-Seguro_Valor
DIF_OutDesp_Valor    =[Valor Despesas Acessorias]-OutDesp_Valor

ICMSOk       =True
ICMSSTOk     =True
ICMSCredSNOk =True
IPIOk        =True
PISOk        =True
COFINSOk     =True
ISSQNOk      =True
DesctoOk     =True
FreteOk      =True
SeguroOk     =True
OutDespOk    =True

If DIF_ICMS_BC          <>0.00 Then ICMSOk       =False EndIf
If DIF_ICMS_Valor       <>0.00 Then ICMSOk       =False EndIf
If DIF_ICMS_ST_BC       <>0.00 Then ICMSSTOk     =False EndIf
If DIF_ICMS_ST_Valor    <>0.00 Then ICMSSTOk     =False EndIf
If DIF_ICMS_CredSN_Valor<>0.00 Then ICMSCredSNOk =False EndIf
If DIF_IPI_Valor        <>0.00 Then IPIOk        =False EndIf
If DIF_PIS_Valor        <>0.00 Then PISOk        =False EndIf
If DIF_PIS_BC           <>0.00 Then PISOk        =False EndIf
If DIF_COFINS_BC        <>0.00 Then COFINSOk     =False EndIf
If DIF_COFINS_Valor     <>0.00 Then COFINSOk     =False EndIf
If DIF_ISSQN_BC         <>0.00 Then ISSQNOk      =False EndIf
If DIF_ISSQN_Valor      <>0.00 Then ISSQNOk      =False EndIf
If DIF_Descto_Valor     <>0.00 Then DesctoOk     =False EndIf
If DIF_Frete_Valor      <>0.00 Then FreteOk      =False EndIf
If DIF_Seguro_Valor     <>0.00 Then SeguroOk     =False EndIf
If DIF_OutDesp_Valor    <>0.00 Then OutDespOk    =False EndIf

Moveto TabelaRefI
Scan
      
  If [Aliquota de ICMS]>0 And Not ICMSOk
    Then [ICMS_BC      ]=[ICMS_BC        ]+DIF_ICMS_BC
         [Valor do ICMS]=[Valor do ICMS  ]+DIF_ICMS_Valor
         ICMSOk=True
  EndIf  

  If [Tipo do Item]<>"C" And ([Tributacao de ICMS]="O" Or [Tributacao de ICMS]="N") And
     ALIQUOTA_CREDITO_ICMS_NOSN>0 And REG_TABELAREFC["Valor BCICMS"]<=0 And
     Not ICMSCredSNOk
    Then [ICMS_CredSN_Valor]=[ICMS_CredSN_Valor]+DIF_ICMS_CredSN_Valor
         ICMSCredSNOk=True
  EndIf  
  
  If ([Tributacao de ICMS]="S" And SubStr([Tipo Tributacao],2,2)<>"60" And Not ICMSSTOk)
     Or
     (Search("DEVOL",REG_TABELAREFC["Descricao da Destinacao"])>0 And
      [Tributacao de ICMS]="S" And SubStr([Tipo Tributacao],2,2)="60"  And Not ICMSSTOk)
    Then [ICMS_ST_BC   ]=[ICMS_ST_BC     ]+DIF_ICMS_ST_BC
         [ICMS_ST_Valor]=[ICMS_ST_Valor  ]+DIF_ICMS_ST_Valor
         ICMSSTOK=True
  EndIf  
  
  If [Aliquota de IPI]>0 And Not IPIOk
    Then [Valor do IPI]=[Valor do IPI  ]+DIF_IPI_Valor
         IPIOk=True
  EndIf  
  
  If [PIS_Aliquota]>0 And Not PISOk
    Then [PIS_BC   ]=[PIS_BC   ]+DIF_PIS_BC    
         [PIS_Valor]=[PIS_Valor]+DIF_PIS_Valor
         PISOk=True
  EndIf  
  
  If [COFINS_Aliquota]>0 And Not COFINSOk
    Then [COFINS_BC   ]=[COFINS_BC   ]+DIF_COFINS_BC    
         [COFINS_Valor]=[COFINS_Valor]+DIF_COFINS_Valor
         COFINSOk=True
  EndIf  
  
  If [Aliquota de ISSQN]>0 And Not ISSQNOk
    Then [ISSQN_BC      ]=[ISSQN_BC      ]+DIF_ISSQN_BC
         [Valor do ISSQN]=[Valor do ISSQN]+DIF_ISSQN_Valor
         ISSQNOk=True
  EndIf  

  OutrosRateioOk=True 
  Switch
    Case [Tipo do Item]="C":  ;Igual a Seri‡o
      OutrosRateioOk=False    ;nÆo rateia frete e outros
    ;;If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And [CFO]="5124" ; servi‡o de insdustrializa‡Æo
    ;;   Then OutrosRateioOk=True
    ;;EndIf
    OtherWise              :  ;Diferente de servi‡o
      OutrosRateioOk=True     ;rateia frete e outros 
      If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And [CFO]="5902" ;retorno industrializa‡Æo
         Then OutrosRateioOk=False
      EndIf
  EndSwitch
  If OutrosRateioOk And 
     (Not DesctoOk Or Not FreteOk Or Not SeguroOk Or Not OutDespOk)
     Then [Valor Desconto Total]=[Valor Desconto Total]+DIF_Descto_Valor
          If REG_TABELAREFC["Frete Incluso na Nota"]="+"
             Then [Valor Frete Total]=[Valor Frete Total]+DIF_Frete_Valor
          EndIf
          [Valor Seguro Total  ]=[Valor Seguro Total  ]+DIF_Seguro_Valor
          [Valor OutDesp Total ]=[Valor OutDesp Total ]+DIF_OutDesp_Valor
          DesctoOk =True
          FreteOk  =True
          SeguroOk =True
          OutDespOk=True
  EndIf

  If ICMSOk And ICMSSTOk And ICMSCredSNOk And IPIOk And PISOk And COFINSOk And ISSQNOk And
     DesctoOk And FreteOk And SeguroOk And OutDespOk
     Then QuitLoop
  EndIf   

EndScan
If RecordStatus("Locked") Then UnLockRecord EndIf         
          
Moveto TabelaRefC

EndProc   ; (Rateio_BC_Itens)
