;** FT_GRUP ********************************************************************
;* Gera Rateio conforme tabela de itens ou tabela de agrupamento de itens      *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 05/09/2014 por Bruno Carvalho
;Ultima Alteracao: 15/04/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Agrupar so item com Grade/Contador Itens      
;Ultima Alteracao: 20/01/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CALCULO_NF_AUTOMATICO="L" livre, informar por item descto, frete, seguro e despaces
;Ultima Alteracao: 31/03/2016 por Bruno Carvalho
;Motivo Alteracao: [Preco Total] n„o estava calculando o valor com o desconto e foi reajustado conforme esta na digita‡Æo do item
;Ultima Alteracao: 28/06/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes ICMS Desonerado
;Ultima Alteracao: 31/08/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes desconto item
;Ultima Alteracao: 06/09/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes ICMS ST FEM
;Ultima Alteracao: 26/09/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes novos calculos da nota
;Ultima Alteracao: 10/11/2017 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes agrupamento de itens               
;Ultima Alteracao: 05/02/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes quando "NotaC" and CALCULO_NF_AUTOMATICO="L"
;Ultima Alteracao: 06/02/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes quando "NotaC" and CALCULO_NF_AUTOMATICO="L"
;Ultima Alteracao: 03/07/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes ignorar origem Balcao
;Ultima Alteracao: 25/02/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes 0167 ST E FCP
;Ultima Alteracao: 26/02/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes NCMUF             
;Ultima Alteracao: 04/04/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes nÆo usa mais o FEm tabmva
;Ultima Alteracao: 19/08/2019 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes calculo FCPST devolu‡Æo de Venda

;*******************************************************************************
;* Rotina para Adicionar itens agrupados                                       *
;*******************************************************************************
Proc AddItemPaiAgrupar()
Private ItemComGrade, CodItem, regitens

CopyToArray rgi

ItemComGrade=False
CodItem     =rgi["Codigo do Item"]

GetRecord "\\Sistemas\\Estoque\\Itens" CodItem To regitens
If Not RetVal
   Then 
        Mensagem("Item "+CodItem+" nÆo cadastrado, corrigir situa‡„o!")
   Else 
        If Not IsBlank(regitens["Codigo da Grade"])
           Then 
                CodItem     =PegaCodigoRaiz(CodItem)
               
                GetRecord "\\Sistemas\\Estoque\\Itens" CodItem To regitens
                If Not RetVal
                   Then 
                        Mensagem("Item "+CodItem+" nÆo cadastrado, corrigir situa‡„o!")
                   Else
                        ItemComGrade             = True                  
                        rgi["Codigo do Item"   ] = CodItem
                        rgi["Descricao do Item"] = regitens["Descricao do Item"] 
                EndIf  
       Endif   
EndIf   

ACHOU_ITEM = False
If ItemComGrade
  Then
       switch
         case TabelaRefC = "FaturaC":
           moveto "FaturaIG"
           Moveto [Numero da OF]
           Locate [FaturaC->Numero da OF]
           If RetVal
              Then While [Numero da OF] = [FaturaC->Numero da OF]
                     If [Codigo do Item] = CodItem and [Preco Unitario] = rgi["Preco Unitario"]
                        Then ACHOU_ITEM = True    
                             QuitLoop
                     EndIf     
                     Skip
                     If Eot() Then QuitLoop EndIf
                   EndWhile
           EndIf
         
         case TabelaRefC = "NotaC":
           moveto "NotaIG"
           Moveto [Codigo da Empresa]
           Locate [NotaC->Codigo da Empresa], [NotaC->Numero do Documento], [NotaC->Serie do Documento]
           If RetVal
              Then While [Codigo da Empresa  ] = [NotaC->Codigo da Empresa  ] And
                         [Numero do Documento] = [NotaC->Numero do Documento] And
                         [Serie do Documento ] = [NotaC->Serie do Documento ]   
                     If [Codigo do Item] = CodItem and [Preco Unitario] = rgi["Preco Unitario"]
                        Then ACHOU_ITEM = True    
                             QuitLoop
                     EndIf     
                     Skip
                     If Eot() Then QuitLoop EndIf
                   EndWhile
           EndIf

       endswitch
EndIf

switch
 case TabelaRefC = "FaturaC" : moveto "FaturaIG"
 case TabelaRefC = "NotaC"   : moveto "NotaIG"
endswitch

If Not ACHOU_ITEM
  Then 
       End 
       Down 
       CopyFromArray rgi
       
       ContadorItemDocto = ContadorItemDocto+1
       switch
         case TabelaRefC = "FaturaC" : [Item da OF       ]=ContadorItemDocto

         case TabelaRefC = "NotaC"   : [Item do Documento]=ContadorItemDocto
       
       endswitch
          
  Else
       [Quantidade             ]=[Quantidade           ]+rgi["Quantidade"          ]
  
       [Valor Desconto Item    ]=[Valor Desconto Item  ]+rgi["Valor Desconto Item" ]
       [Tipo Desconto Item     ]="T"
       [Taxa Desconto Unitario ]=blanknum()
       [Valor Desconto Unitario]=[Valor Desconto Item  ]
  
       [Preco Total            ]=round([Preco Unitario]*[Quantidade],2)-[Valor Desconto Item]
  
       [ICMS_BC                ]=[ICMS_BC               ]+rgi["ICMS_BC"              ]
       [Valor do ICMS          ]=[Valor do ICMS         ]+rgi["Valor do ICMS"        ]

       [ICMS_Valor_Desonerado  ]=[ICMS_Valor_Desonerado ]+rgi["ICMS_Valor_Desonerado"]
                                                                                  
       [ICMS_ST_BC             ]=[ICMS_ST_BC            ]+rgi["ICMS_ST_BC"           ]
       [ICMS_ST_Valor          ]=[ICMS_ST_Valor         ]+rgi["ICMS_ST_Valor"        ]
                                                                                   
       [IPI_BC                 ]=[IPI_BC                ]+rgi["IPI_BC"               ]
       [Valor do IPI           ]=[Valor do IPI          ]+rgi["Valor do IPI"         ]
                                                                                  
       [PIS_BC                 ]=[PIS_BC                ]+rgi["PIS_BC"               ]
       [PIS_Valor              ]=[PIS_Valor             ]+rgi["PIS_Valor"            ]
                                                                                   
       [COFINS_BC              ]=[COFINS_BC             ]+rgi["COFINS_BC"            ]
       [COFINS_Valor           ]=[COFINS_Valor          ]+rgi["COFINS_Valor"         ]
                                                                                   
       [ISSQN_BC               ]=[ISSQN_BC              ]+rgi["ISSQN_BC"             ]
       [Valor do ISSQN         ]=[Valor do ISSQN        ]+rgi["Valor do ISSQN"       ]
                                                                                  
       [Valor Frete Total      ]=[Valor Frete Total     ]+rgi["Valor Frete Total"    ]
       [Valor Seguro Total     ]=[Valor Seguro Total    ]+rgi["Valor Seguro Total"   ]
       [Valor OutDesp Total    ]=[Valor OutDesp Total   ]+rgi["Valor OutDesp Total"  ]
       [Valor Desconto Total   ]=[Valor Desconto Total  ]+rgi["Valor Desconto Total" ]

       [Valor TotTributos      ]=[Valor TotTributos     ]+rgi["Valor TotTributos"    ]

       [IPI Devolvido_Porcentagem]=[IPI Devolvido_Porcentagem]+rgi["IPI Devolvido_Porcentagem"]
       [IPI Devolvido_Valor      ]=[IPI Devolvido_Valor      ]+rgi["IPI Devolvido_Valor"      ]

EndIf   
UnLockRecord

endproc ;AddItemPaiAgrupar()

;*******************************************************************************
;* Rotina para Agrupar Itens                                                   *
;*******************************************************************************
Proc ItemPaiAgrupar()

;---- Excluir todas os itens agrupados -----------------------------------------
Switch
  Case TabelaRefC = "NotaC" :   
       Moveto "NotaIG"
       Moveto [Codigo da Empresa]
       Locate [NotaC->Codigo da Empresa], [NotaC->Numero do Documento], [NotaC->Serie do Documento]   
       If RetVal
          Then While [Codigo da Empresa  ] = [NotaC->Codigo da Empresa  ] And
                     [Numero do Documento] = [NotaC->Numero do Documento] And
                     [Serie do Documento ] = [NotaC->Serie do Documento ]
                 Del
                 If Eot() Then QuitLoop EndIf
               EndWhile
       EndIf   

  Case TabelaRefC = "FaturaC" :
       Moveto "FaturaIG"
       Moveto [Numero da OF]
       Locate [FaturaC->Numero da Of]
       If RetVal
           Then While [Numero da OF] = [FaturaC->Numero da Of]
                 Del
                 If Eot() Then QuitLoop EndIf
                EndWhile
       EndIf    
EndSwitch       

;---- Adicionar Registros na Tabela de Agrupamento de Itens --------------------
ContadorItemDocto=0

Switch
  Case TabelaRefC = "NotaC" : 
       Moveto "NotaI"
       Moveto [Codigo da Empresa]
       Locate [NotaC->Codigo da Empresa], [NotaC->Numero do Documento], [NotaC->Serie do Documento]   
       If RetVal
          Then While [Codigo da Empresa  ] = [NotaC->Codigo da Empresa  ] And
                     [Numero do Documento] = [NotaC->Numero do Documento] And
                     [Serie do Documento ] = [NotaC->Serie do Documento ]

                 AddItemPaiAgrupar()

                 Moveto "NotaI" 
                 Skip
                 If Eot() Then QuitLoop EndIf
               EndWhile
       EndIf        
  Case TabelaRefC = "FaturaC" :
       Moveto "FaturaI"
       Moveto [Numero da OF]                                    
       Locate [FaturaC->Numero da Of]
       If RetVal
          Then While [Numero da OF] = [FaturaC->Numero da Of]

                 AddItemPaiAgrupar()

                 Moveto "FaturaI" 
                 Skip
                 If Eot() Then QuitLoop EndIf
               EndWhile
       EndIf        
EndSwitch

EndProc ;ItemPaiAgrupar()

;*******************************************************************************
;* Rotina para Calcular Itens                                                  *
;*******************************************************************************
Proc CarregaItemArray()
private Faz_Rotina, regtabmva, regnotaicm, regncmuf

Faz_Rotina = True
If TabelaRefC = "NotaC" And [Situacao_Item]="C"
   Then Faz_Rotina = False
EndIf   

If Faz_Rotina
   Then
        If [Tipo do Item]<>"C"
           Then VRMERC=VRMERC+[Preco Total]
           Else VRSERV=VRSERV+[Preco Total] 
        EndIf

        If PARAM_CALC_COMIS_ITEM="S"
           Then VRBC_COMIS=VRBC_COMIS+Round((([Preco Total]*[Comissao do Item])/100),2)
        EndIf

        If (SubStr(PARAM_DOC_NF,1,3)="NFE" or SubStr(PARAM_DOC_NF,1,3)="NCE" ) And 
           IsBlank([Tipo Tributacao])
           Then Mensagem("Este item: //"+[Codigo do Item]+"//"+[Descricao do Item]+"// // CST/ICMS inv lido, verificar !")
        EndIf
EndIf

;-------- Variaveis para calculo imposto do item -------------------------------
nitens=nitens+1

If TabelaRefC = "FaturaC"
   then 
        It_sqitem[nitens]        =[Item da OF              ]
   else 
        It_sqitem[nitens]        =[Item do Documento       ]
endif
 
It_cditem[nitens]        =[Codigo do Item          ] 
It_tpitem[nitens]        =[Tipo do Item            ] 
It_prtotal[nitens]       =[Preco Total             ] 
It_desctoitem[nitens]    =[Valor Desconto Item     ]  

It_cfop[nitens]          =[CFO                     ] 
It_codmva[nitens]        =[Codigo MVA              ] 
It_ncm[nitens]           =[NCM                     ]

It_txdescto[nitens]      =BlankNum()

If CALCULO_NF_AUTOMATICO="L" ; livre
   then
        It_descto[nitens]        =[Valor Desconto Total]  
        It_frete[nitens]         =[Valor Frete Total   ]
        It_seguro[nitens]        =[Valor Seguro Total  ]  
        It_outdesp[nitens]       =[Valor OutDesp Total ]  
   else
        It_descto[nitens]        =BlankNum()  
        It_frete[nitens]         =BlankNum()
        It_seguro[nitens]        =BlankNum()  
        It_outdesp[nitens]       =BlankNum()  
endif   
   
It_trib_icms[nitens]     =[Tributacao de ICMS      ]
It_cst_icms[nitens]      =[Tipo Tributacao         ]
It_red_icms[nitens]      =[Aliquota Reduzida BCICMS]
It_aliq_icms[nitens]     =[Aliquota de ICMS        ]
It_bc_icms[nitens]       =[ICMS_BC                 ]
It_vr_icms[nitens]       =[Valor do ICMS           ]

It_vrdeson_icms[nitens]  =[ICMS_Valor_Desonerado   ]
It_mtdeson_icms[nitens]  =[ICMS_Motivo_Desoneracao ]

It_csosn_icms[nitens]    =[CSOSN                   ]
It_aliq_icmscred[nitens] =[ICMS_CredSN_Aliquota    ]
It_vr_icmscred[nitens]   =[ICMS_CredSN_Valor       ]

It_mva[nitens]           =[MVA                     ]
It_red_st[nitens]        =[ICMS_ST_Aliquota Reduzida]
It_aliq_st[nitens]       =[ICMS_ST_Aliquota        ]
It_bc_st[nitens]         =[ICMS_ST_BC              ]
It_vr_st[nitens]         =[ICMS_ST_Valor           ]

It_trib_ipi[nitens]      =[Tributacao de IPI       ]
It_cst_ipi[nitens]       =[IPI_CST                 ]
It_aliq_ipi[nitens]      =[Aliquota de IPI         ]
It_bc_ipi[nitens]        =[IPI_BC                  ]
It_vr_ipi[nitens]        =[Valor do IPI            ]

It_trib_ISSQN[nitens]    =[Tributacao de ISSQN     ]
It_aliq_ISSQN[nitens]    =[Aliquota de ISSQN       ]
It_bc_ISSQN[nitens]      =[ISSQN_BC                ]
It_vr_ISSQN[nitens]      =[Valor do ISSQN          ]
It_cdserv[nitens]        =[Codigo_Servico          ]

It_cst_pis[nitens]       =[PIS_CST                 ]
It_aliq_pis[nitens]      =[PIS_Aliquota            ]
It_bc_pis[nitens]        =[PIS_BC                  ]
It_vr_pis[nitens]        =[PIS_Valor               ]

It_cst_cofins[nitens]    =[COFINS_CST              ]
It_aliq_cofins[nitens]   =[COFINS_Aliquota         ]
It_bc_cofins[nitens]     =[COFINS_BC               ]
It_vr_cofins[nitens]     =[COFINS_Valor            ]

It_vr_ii[nitens]         =[II_Valor Imposto        ]

It_porc_ipidevol[nitens] =[IPI Devolvido_Porcentagem]
It_vr_ipidevol[nitens]   =[IPI Devolvido_Valor      ]

It_vr_tottrib[nitens]    =[Valor TotTributos        ] 

If (CALCULO_NF_AUTOMATICO="A" or CALCULO_NF_AUTOMATICO="N")
   Then
        It_bc_icms[nitens]      = BlankNum()
        It_vr_icms[nitens]      = BlankNum()

        It_vrdeson_icms[nitens] = BlankNum()
        It_mtdeson_icms[nitens] = ""

        It_bc_st[nitens]        = BlankNum()
        It_vr_st[nitens]        = BlankNum()

        It_vr_icmscred[nitens]  = BlankNum()

        It_bc_ipi[nitens]       = BlankNum()
        It_vr_ipi[nitens]       = BlankNum()

        It_bc_ISSQN[nitens]     = BlankNum()
        It_vr_ISSQN[nitens]     = BlankNum()

        It_bc_pis[nitens]       = BlankNum()
        It_vr_pis[nitens]       = BlankNum()

        It_bc_cofins[nitens]    = BlankNum()
        It_vr_cofins[nitens]    = BlankNum()

        It_vr_tottrib[nitens]   = BlankNum() 

        If (TPEMPR="SIMPLES NACIONAL" Or TPEMPR="SIMPLES NAC. ESRB")    And
           (It_csosn_icms[nitens]="101" Or It_csosn_icms[nitens]="201") And
           ((TabelaRefC="NotaC" And SubStr(Directory(),1,1)<>"X") Or (TabelaRefC="FaturaC" And It_aliq_icmscred[nitens]>0))
           Then VRBCICMS_CREDSN  =VRBCICMS_CREDSN+It_prtotal[nitens]
        EndIf   
EndIf

It_aliq_fcp[nitens]             = BlankNum()
It_bc_fcp[nitens]               = BlankNum()
It_vr_fcp[nitens]               = BlankNum()

It_aliq_fcpst[nitens]           = BlankNum()
It_bc_fcpst[nitens]             = BlankNum()
It_vr_fcpst[nitens]             = BlankNum()

It_pst[nitens]                  = BlankNum()
It_aliq_fcpstret[nitens]        = BlankNum()
It_bc_fcpstret[nitens]          = BlankNum()
It_vr_fcpstret[nitens]          = BlankNum()

It_aliq_fcpufdest[nitens]       = BlankNum()
It_bc_fcpufdest[nitens]         = BlankNum()
It_vr_fcpufdest[nitens]         = BlankNum()

It_aliq_icmsufdest[nitens]      = BlankNum()
It_bc_icmsufdest[nitens]        = BlankNum()
It_vr_icmsufdest[nitens]        = BlankNum()

It_aliq_icmsinter[nitens]       = BlankNum()
It_aliq_icmsinterpart[nitens]   = BlankNum()
It_vr_icmsufremet[nitens]       = BlankNum()

;--- calculo FCP ICMS ST ----------------------------------------------------- 
switch
 case TabelaRefC = "FaturaC":
    If ( [FaturaC->Tipo Movimento Estoque]="S"               and
         [ICMS_ST_Aliquota               ]>0                 and
         ( Search("VEND" ,[FaturaC->Descricao da Destinacao])>0 or 
           Search("BONIF",[FaturaC->Descricao da Destinacao])>0) )
       or
       ( [FaturaC->Tipo Movimento Estoque]="E"                  and
         [ICMS_ST_Aliquota               ]>0                    and
         Search("DEVOL" ,[FaturaC->Descricao da Destinacao])>0  )
       Then
            getrecord "\\sistemas\\estoque\\ncmuf" It_ncm[nitens],[FaturaC->UF] to regncmuf
            if retval
               then if regncmuf["FCP_ST_Aliquota"]>0
                       then It_aliq_fcpst[nitens]=regncmuf["FCP_ST_Aliquota"]
                    endif   
            endif
    endif   
 
 case TabelaRefC = "NotaC"  :
    If [NotaC->Tipo Movimento Estoque]="S"               And
       (Search("VEND" ,[NotaC->Descricao da Destinacao])>0 or
        Search("BONIF",[NotaC->Descricao da Destinacao])>0) and
       [ICMS_ST_Aliquota]>0          
       Then
            getrecord "\\sistemas\\estoque\\ncmuf" It_ncm[nitens],[NotaC->UF  ] to regncmuf
            if retval
               then if regncmuf["FCP_ST_Aliquota"]>0
                       then It_aliq_fcpst[nitens]=regncmuf["FCP_ST_Aliquota"]
                    endif   
            endif
    endif   
 
endswitch

if SYS_APLICATIVO= "BALCAO"
   then return
endif

if TabelaRefC = "NotaC" and CALCULO_NF_AUTOMATICO="L"
   then
        getrecord "\\sistemas\\vendas\\NotaICM" [NotaC->Codigo da Empresa ], [NotaC->Numero do Documento], 
                                                [NotaC->Serie do Documento], It_sqitem[nitens] to regnotaicm
        if retval
           then
                It_bc_fcp[nitens]            =regnotaicm["FCP_BC"                 ]
                It_aliq_fcp[nitens]          =regnotaicm["FCP_Aliquota"           ] 
                It_vr_fcp[nitens]            =regnotaicm["FCP_Valor"              ] 
                
                It_bc_fcpst[nitens]          =regnotaicm["FCP_ST_BC"              ]
                It_aliq_fcpst[nitens]        =regnotaicm["FCP_ST_Aliquota"        ] 
                It_vr_fcpst[nitens]          =regnotaicm["FCP_ST_Valor"           ] 
                
                It_pst[nitens]               =regnotaicm["PST Aliquota Consumidor"]
                It_bc_fcpstret[nitens]       =regnotaicm["FCP_STRet_BC"           ]
                It_aliq_fcpstret[nitens]     =regnotaicm["FCP_STRet_Aliquota"     ] 
                It_vr_fcpstret[nitens]       =regnotaicm["FCP_STRet_Valor"        ] 
                
                It_bc_fcpufdest[nitens]      =regnotaicm["FCP_UFDest_BC"          ]
                It_aliq_fcpufdest[nitens]    =regnotaicm["FCP_UFDest_Aliquota"    ]
                It_vr_fcpufdest[nitens]      =regnotaicm["FCP_UFDest_Valor"       ] 
                
                It_bc_icmsufdest[nitens]     =regnotaicm["ICMS_UFDest_BC"         ]
                It_aliq_icmsufdest[nitens]   =regnotaicm["ICMS_UFDest_Aliquota"   ]
                It_vr_icmsufdest[nitens]     =regnotaicm["ICMS_UFDest_Valor"      ] 
                
                It_aliq_icmsinter[nitens]    =regnotaicm["ICMS_Inter_Aliquota"    ]
                It_aliq_icmsinterpart[nitens]=regnotaicm["ICMS_InterPart_Aliquota"]
                It_vr_icmsufremet[nitens]    =regnotaicm["ICMS_UFRemet_Valor"     ]
        endif
endif   

EndProc ;CarregaItemArray()

;*******************************************************************************
;* Rotina para calcular os itens da OF                                         *
;*******************************************************************************
Proc MontaArrayItens(PARAM)
     
Aguarde("Somando itens")

DestruirArrayItens()

;-------- Variaveis para calculo da nota ---------------------------------------
DynArray It_sqitem[]
DynArray It_cditem[]
DynArray It_tpitem[]
DynArray It_prtotal[]
DynArray It_desctoItem[]

DynArray It_cfop[]
DynArray It_codmva[]
DynArray It_ncm[]
DynArray It_extipi[]

DynArray It_txdescto[]
DynArray It_descto[]
DynArray It_frete[]
DynArray It_seguro[]
DynArray It_outdesp[]

DynArray It_cst_icms[]
DynArray It_trib_icms[]
DynArray It_red_icms[]
DynArray It_aliq_icms[]
DynArray It_bc_icms[]
DynArray It_vr_icms[]

DynArray It_vrdeson_icms[]
DynArray It_mtdeson_icms[]

DynArray It_csosn_icms[]
DynArray It_aliq_icmscred[]
DynArray It_vr_icmscred[]

DynArray It_mva[]
DynArray It_red_st[]
DynArray It_aliq_st[]
DynArray It_bc_st[]
DynArray It_vr_st[]

DynArray It_cst_ipi[]
DynArray It_trib_ipi[]
DynArray It_aliq_ipi[]
DynArray It_bc_ipi[]
DynArray It_vr_ipi[]

DynArray It_trib_issqn[]
DynArray It_aliq_issqn[]
DynArray It_bc_issqn[]
DynArray It_vr_issqn[]
DynArray It_cdserv[]

DynArray It_cst_pis[]
DynArray It_aliq_pis[]
DynArray It_bc_pis[]
DynArray It_vr_pis[]

DynArray It_cst_cofins[]
DynArray It_aliq_cofins[]
DynArray It_bc_cofins[]
DynArray It_vr_cofins[]

DynArray It_vr_ii[]

DynArray It_aliq_fcp[]
DynArray It_bc_fcp[]
DynArray It_vr_fcp[]

DynArray It_aliq_fcpst[]
DynArray It_bc_fcpst[]
DynArray It_vr_fcpst[]

DynArray It_pst[]
DynArray It_aliq_fcpstret[]
DynArray It_bc_fcpstret[]
DynArray It_vr_fcpstret[]

DynArray It_aliq_fcpufdest[]
DynArray It_bc_fcpufdest[]
DynArray It_vr_fcpufdest[]

DynArray It_aliq_icmsufdest[]
DynArray It_bc_icmsufdest[]
DynArray It_vr_icmsufdest[]

DynArray It_aliq_icmsinter[]
DynArray It_aliq_icmsinterpart[]
DynArray It_vr_icmsufremet[]

DynArray It_vr_tottrib[]

DynArray It_vr_ipidevol[]
DynArray It_porc_ipidevol[]

;-------------------------------------------------------------------------------
VRMERC          = 0
VRSERV          = 0
VRBC_COMIS      = 0
VRBCICMS_CREDSN = 0
nitens          = 0

if PARAM = "ITENS AGRUPADOS"   
   then ItemPaiAgrupar()
endif

Switch
  Case TabelaRefC = "NotaC"   :
    if PARAM = "ITENS AGRUPADOS"   
       then moveto "NotaIG"
       else moveto "NotaI"
    endif
    Moveto [Codigo da Empresa]
    Locate [NotaC->Codigo da Empresa], [NotaC->Numero do Documento], [NotaC->Serie do Documento]   
    If RetVal
      Then While [Codigo da Empresa  ] = [NotaC->Codigo da Empresa  ] And
                 [Numero do Documento] = [NotaC->Numero do Documento] And
                 [Serie do Documento ] = [NotaC->Serie do Documento ]   
    
             CarregaItemArray()
    
             Skip
             If Eot() Then QuitLoop EndIf
           EndWhile
    EndIf

  Case TabelaRefC = "FaturaC" :
    if PARAM = "ITENS AGRUPADOS"   
       then moveto "FaturaIG"
       else moveto "FaturaI"
    endif
    Moveto [Numero da OF]
    Locate [FaturaC->Numero da Of]
    If RetVal
       Then While [Numero da OF] = [FaturaC->Numero da Of]
  
             CarregaItemArray()
  
             skip
             If Eot() Then QuitLoop EndIf
            EndWhile
    EndIf    

EndSwitch

LimpAguarde()
EndProc ;MontaArrayItens()

;*******************************************************************************
;* Rotina para C lculo do Item de Rateio                                       *
;*******************************************************************************
Proc CopiaArrayItem()       
Private Faz_Rotina

NItens     = NItens + 1 ; sempre tem que conta o item  

If TabelaRefC = "NotaC" And [Situacao_Item]="C"
   Then return
EndIf     

[Taxa Desconto Total      ]=It_txdescto[NItens]        
[Valor Desconto Total     ]=It_descto[NItens]          
[Valor Frete Total        ]=It_frete[NItens]         
[Valor Seguro Total       ]=It_seguro[NItens]          
[Valor OutDesp Total      ]=It_outdesp[NItens]         

[ICMS_BC                  ]=It_bc_icms[NItens]       
[Valor do ICMS            ]=It_vr_icms[NItens]       

[ICMS_Motivo_Desoneracao  ]=It_mtdeson_icms[NItens]       
[ICMS_Valor_Desonerado    ]=It_vrdeson_icms[NItens]       

[ICMS_CREDSN_Aliquota     ]=It_aliq_icmscred[NItens]  
[ICMS_CREDSN_Valor        ]=It_vr_icmscred[NItens]   

[ICMS_ST_Aliquota Reduzida]=It_red_st[NItens]        
[ICMS_ST_Aliquota         ]=It_aliq_st[NItens]        
[ICMS_ST_BC               ]=It_bc_st[NItens]         
[ICMS_ST_Valor            ]=It_vr_st[NItens]         

[IPI_BC                   ]=It_bc_ipi[NItens]        
[Valor do IPI             ]=It_vr_ipi[NItens]        

[ISSQN_BC                 ]=It_bc_issqn[NItens]      
[Valor do ISSQN           ]=It_vr_issqn[NItens]      

[PIS_BC                   ]=It_bc_pis[NItens]        
[PIS_Valor                ]=It_vr_pis[NItens]         

[COFINS_BC                ]=It_bc_cofins[NItens]     
[COFINS_Valor             ]=It_vr_cofins[NItens]

[Valor TotTributos        ]=It_vr_tottrib[Nitens]
UnLockRecord
  
EndProc ;CopiaArrayItem()  

;*******************************************************************************
;* Rotina para Calculo de Valores da Ordem de Faturamento/Nota                 *
;*******************************************************************************
Proc CopiarArrayParaItens()

Aguarde("Atualizando rateios nos itens")

NItens = 0

Switch
  Case TabelaRefC = "NotaC" :
    Moveto TabelaRefI
    Moveto [Codigo da Empresa]
    Locate [NotaC->Codigo da Empresa],[NotaC->Numero do Documento],[NotaC->Serie do Documento]
    If RetVal
      Then While [Codigo da Empresa  ] = [NotaC->Codigo da Empresa  ] And
                 [Numero do Documento] = [NotaC->Numero do Documento] And
                 [Serie do Documento ] = [NotaC->Serie do Documento ]        
    
             CopiaArrayItem()
    
             Skip
             If Eot() Then QuitLoop EndIf
           EndWhile
           If RecordStatus("Locked") Then UnLockRecord EndIf             
    EndIf      
  
  Case TabelaRefC = "FaturaC" : 
    Moveto TabelaRefI
    Moveto [Numero da OF]
    Locate [FaturaC->Numero da Of]
    If RetVal
      Then While [Numero da OF] = [FaturaC->Numero da Of]
    
             CopiaArrayItem()
    
             Skip
             If Eot() Then QuitLoop EndIf
           EndWhile
           If RecordStatus("Locked") Then UnLockRecord EndIf             
    EndIf      
endswitch
   
EndProc ;CopiarArrayParaItens()

;*******************************************************************************
;* Rotina para copiar complementos de itens                                    *
;*******************************************************************************
Proc CopiarArrayParaComplementoItens()       
private wi

if SYS_APLICATIVO= "BALCAO"
   then return
endif
   
Switch
  Case TabelaRefC = "NotaC" :   

       if CALCULO_NF_AUTOMATICO="L"
          then return
       endif   

       Moveto "NotaICM"
       Moveto [Codigo da Empresa]
       Locate [NotaC->Codigo da Empresa], [NotaC->Numero do Documento], [NotaC->Serie do Documento]   
       If RetVal
          Then While [Codigo da Empresa  ] = [NotaC->Codigo da Empresa  ] And
                     [Numero do Documento] = [NotaC->Numero do Documento] And
                     [Serie do Documento ] = [NotaC->Serie do Documento ]
                 Del
                 If Eot() Then QuitLoop EndIf
               EndWhile
       EndIf   

  Case TabelaRefC = "FaturaC" :

       if PARAM_CALCOF=""
          then
               Moveto "FaturICM"
               Moveto [Numero da OF]
               Locate [FaturaC->Numero da Of]
               If RetVal
                   Then While [Numero da OF] = [FaturaC->Numero da Of]
                         Del
                         If Eot() Then QuitLoop EndIf
                        EndWhile
               EndIf

          else
               return
       EndIf
           
EndSwitch       


For wi From 1 to DynArraySize(It_sqitem)

  Switch
    Case TabelaRefC = "NotaC" :
      Moveto "NotaICM"
      End
      Down 
      [Codigo da Empresa      ] = [NotaC->Codigo da Empresa  ] 
      [Numero do Documento    ] = [NotaC->Numero do Documento]
      [Serie do Documento     ] = [NotaC->Serie do Documento ]
      [Item do Documento      ] = it_sqitem[wi]
       
    Case TabelaRefC = "FaturaC" :
      Moveto "FaturICM"
      End
      Down 
      [Numero da OF           ] = [FaturaC->Numero da OF] 
      [Item da OF             ] = it_sqitem[wi]
    
  EndSwitch       

  [Codigo do Item         ] = It_cdItem[wi]
  
  [FCP_BC                 ] = It_bc_fcp[wi]
  [FCP_Aliquota           ] = It_aliq_fcp[wi] 
  [FCP_Valor              ] = It_vr_fcp[wi] 
  
  [FCP_ST_BC              ] = It_bc_fcpst[wi]
  [FCP_ST_Aliquota        ] = It_aliq_fcpst[wi] 
  [FCP_ST_Valor           ] = It_vr_fcpst[wi] 

  [PST Aliquota Consumidor] = It_pst[wi]
  [FCP_STRet_BC           ] = It_bc_fcpstret[wi]
  [FCP_STRet_Aliquota     ] = It_aliq_fcpstret[wi] 
  [FCP_STRet_Valor        ] = It_vr_fcpstret[wi] 

  [FCP_UFDest_BC          ] = It_bc_fcpufdest[wi]
  [FCP_UFDest_Aliquota    ] = It_aliq_fcpufdest[wi]
  [FCP_UFDest_Valor       ] = It_vr_fcpufdest[wi] 

  [ICMS_UFDest_BC         ] = It_bc_icmsufdest[wi]
  [ICMS_UFDest_Aliquota   ] = It_aliq_icmsufdest[wi]
  [ICMS_UFDest_Valor      ] = It_vr_icmsufdest[wi] 

  [ICMS_Inter_Aliquota    ] = It_aliq_icmsinter[wi]
  [ICMS_InterPart_Aliquota] = It_aliq_icmsinterpart[wi]
  [ICMS_UFRemet_Valor     ] = It_vr_icmsufremet[wi] 
  UnLockRecord

endfor

endproc

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
If Not IsAssigned(PARAM_CALCOF)       Then PARAM_CALCOF      = ""  EndIf
If Not IsAssigned(PARAM_FT_GRUP)      Then PARAM_FT_GRUP = ""      EndIf
If Not IsAssigned(SYS_CODIGO_CLIENTE) Then SYS_CODIGO_CLIENTE = "" EndIf

; Procs Relacionadas
; - CALC_OF(PARAM)

Switch
  Case SEARCH("AGRUPADOS",PARAM_FT_GRUP)=0: 
    Switch
      Case Table()="Notac"    : TabelaRefC="NotaC"     TabelaRefI= "NotaI"
      Case Table()="Faturac"  : TabelaRefC="FaturaC"   TabelaRefI= "FaturaI"
    EndSwitch                        

  Case SEARCH("AGRUPADOS",PARAM_FT_GRUP)>0: 
    Switch
      Case Table()="Notac"    : TabelaRefC="NotaC"     TabelaRefI= "NotaIG"
      Case Table()="Faturac"  : TabelaRefC="FaturaC"   TabelaRefI= "FaturaIG"
    EndSwitch                        
                      
EndSwitch                  

Moveto TabelaRefC
UnLockRecord
KeyPress "F7"
    
Switch
  Case PARAM_FT_GRUP = "RATEIOS"            or
       PARAM_FT_GRUP = "RATEIOS AGRUPADOS"     : CopiarArrayParaItens()
                                                 CopiarArrayParaComplementoItens()
                                                 
  Case PARAM_FT_GRUP = "ITENS"              or  
       PARAM_FT_GRUP = "ITENS AGRUPADOS"       : MontaArrayItens(PARAM_FT_GRUP)
  
EndSwitch           

Moveto TabelaRefC
KeyPress "F7"    

LimpAguarde()

Release Vars  TabelaRefC, TabelaRefI

Release procs ItemPaiAgrupar, AddItemPaiAgrupar, MontaArrayItens, CarregaItemArray, 
              CopiarArrayParaItens, CopiaArrayItem,
              CopiarArrayParaComplementoItens
