;** Bib_Tro ********************************************************************
;*  Biblioteca de Rotinas do Faturamento                                       *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)   
;Desenvolvido    : 31/01/2004 por Anivel Augusto Rodrigues
;Ultima Alteracao: 06/02/2006 por Davi Carrano
;Motivo Alteracao: Ajustes Dias Atraso
;Ultima Alteracao: 30/05/2006 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Dias Atraso/Pega_Preco/Descto Cliente
;Ultima Alteracao: 07/11/2007 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Tributacao IPI    
;Ultima Alteracao: 08/01/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes BCICMS/ICMS Frete                         
;Ultima Alteracao: 05/08/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Pega_Preco()
;Ultima Alteracao: 24/12/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes IsLockRecord/UnLockRecord
;Ultima Alteracao: 07/01/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cheques em Cobranca
;Ultima Alteracao: 31/03/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cartao Credito/Debito
;Ultima Alteracao: 06/05/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cheques()
;Ultima Alteracao: 09/06/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes MSG Limite Credito/Dias Atraso
;Ultima Alteracao: 19/08/2009 por Antonio Marcelo Alves
;Motivo Alteracao: Ajustes proc Limite_Credito variaveis
;Ultima Alteracao: 10/09/2009 por Cleber Alves
;Motivo Alteracao: Declaracao da variavel PARAM_LIMITE_CREDITO
;Ultima Alteracao: 24/02/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Pega_Preco() Brasil Textil
;Ultima Alteracao: 21/05/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes exlusao ESTQPRM            
;Ultima Alteracao: 08/06/2010 por Bruno Carvalho
;Motivo Alteracao: Ajustes Cheques Trocados
;Ultima Alteracao: 07/02/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Gera Duplicata                      
;Ultima Alteracao: 17/07/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Exlusao Lookupïs Calculo PIS/COFINS  
;Ultima Alteracao: 04/08/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes opcoes reducao BCICMS               
;Ultima Alteracao: 15/09/2010 por Karina Andrade
;Motivo Alteracao: Ajustes codigo cliente confec‡Æo
;Ultima Alteracao: 07/11/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes ReducÆo BCICMS apenas se houver desconto na NF
;Ultima Alteracao: 08/11/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes SEM_RED_BCICMS (Proc CALC_OF)
;Ultima Alteracao: 06/01/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cria_Ficha*()
;Ultima Alteracao: 28/03/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Frete                                           
;Ultima Alteracao: 29/03/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CALC_OF trib_ICMS                               
;Ultima Alteracao: 30/03/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Frete                                          
;Ultima Alteracao: 30/04/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Isabela Garcia Nova Codifica‡Æo
;Ultima Alteracao: 12/05/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes novas fun‡äes para confec‡äes  
;Ultima Alteracao: 28/09/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Dados dos Cheques
;Ultima Alteracao: 23/04/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes ATIVEMPR para pega_CFOP                            
;Ultima Alteracao: 26/04/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: InclusÆo "Checa_SPC"  
;Ultima Alteracao: 04/05/2012 por Bruno Carvalho
;Motivo Alteracao: Ajustes "Checa SPC" 
;Ultima Alteracao: 20/06/2012 por Bruno Carvalho
;Motivo Alteracao: Adicionado Proc Rateio_BC_Itens e Ajustes Calc_OF() 
;Ultima Alteracao: 27/06/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Calculo da nota= automatico, nÆo calcula, livre    
;Ultima Alteracao: 29/06/2012 por Bruno Carvalho
;Motivo Alteracao: Ajustes Checagem_Pagina1() "CALCULO_NF_AUTOMATICO"    
;Ultima Alteracao: 12/07/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Checagem_Pagina1() Dados destinacao    
;Ultima Alteracao: 30/08/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cria_Ficha() sem Closed                          
;Ultima Alteracao: 06/09/2012 por Bruno Carvalho
;Motivo Alteracao: Ajustes p/ quando CalcVento for parcelas fixas "PARAM_DATAS_VENCTOS"    
;Ultima Alteracao: 13/09/2012 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Uso campos INSS e IR. Calculo valor nota fiscal                            
;Ultima Alteracao: 27/05/2013 por Bruno Carvalho                           
;Motivo Alteracao: Ajustes Calc_Vencto()
;Ultima Alteracao: 11/06/2013 por Bruno Carvalho                           
;Motivo Alteracao: Ajustes Calc_Vencto()
;Ultima Alteracao: 05/08/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes nÆo deduzir descto ICMS_ST_BC                            
;Ultima Alteracao: 30/08/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Revisado table buffer ocorrido pelo sw_Cons                    
;Ultima Alteracao: 01/10/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Utiliza Forma,Cond.Pgto, dia vencimento cadastro cliente
;Ultima Alteracao: 09/10/2013 por Kamila Gomes
;Motivo Alteracao: Ajustes Pega_Preco(s)
;Ultima Alteracao: 15/10/2013 por Kamila Gomes
;Motivo Alteracao: Ajustes Pega_Preco(OpcapP) e codigo de barras
;Ultima Alteracao: 14/01/2014 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes calculo ICMS_ST_BC                            
;Ultima Alteracao: 12/02/2014 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Simples Nacional c/ calculo de ICMS, ST com redu‡Æo BC 
;Ultima Alteracao: 24/07/2014 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Soma dos items que tem rateio do total das despesas                                     
;Ultima Alteracao: 05/11/2014 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Cheques em COBRANCAPGTO nÆo esta mais em aberto/pendente a receber
;Ultima Alteracao: 04/11/2015 por Andrey Fillipe
;Motivo Alteracao: Ajustes para nao pegar aliquota do estado caso ICMS esteja em branco
;Ultima Alteracao: 05/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Verifica_Caixa()                       
;Ultima Alteracao: 07/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: exclusao referencia ao campo INSS
;Ultima Alteracao: 07/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: exclusao referencia ao campo IR se nÆo for utilizado!
;Ultima Alteracao: 17/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Calc_Venctos()                       
;Ultima Alteracao: 28/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Data_Entrada ChequeI = Data de Entrada ChequeC
;Ultima Alteracao: 11/02/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes valor total de cheques em chequec
;Ultima Alteracao: 29/02/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes UTILIZANDO_CP_FP_CLIENTE (condicao e Forma de Pagamento do cliente)
;Ultima Alteracao: 07/04/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Pega_Preco() getrecord 
;Ultima Alteracao: 07/06/2016 por Kamila Gomes
;Motivo Alteracao: Ajustes Libera_Bloqueio()                   
;Ultima Alteracao: 21/06/2016 por Kamila Gomes
;Motivo Alteracao: Ajustes GetRecord "Destinat" -> [Situacao do Cliente]
;Ultima Alteracao: 27/06/2016 por Kamila Gomes
;Motivo Alteracao: Ajustes Nova Estrutura FaturaC, FaturaI, FaturaID, FaturaIG e nota tabela FaturaCC
;Ultima Alteracao: 08/07/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CHEQUES()
;Ultima Alteracao: 11/07/2016 por Bruno Carvalho
;Motivo Alteracao: Adicionado Checagem_Pagina1() -> Verifica_Representante()
;Ultima Alteracao: 11/07/2016 por Bruno Carvalho
;Motivo Alteracao: Calcular FRETE quando [Frete Incluso na Nota]="+" -> Caso nÆo queira calcular, usar a op‡Æo "N" *Sol. 24400
;Ultima Alteracao: 02/09/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Checagem_Pagina1() liberar soimprir/reemitir
;Ultima Alteracao: 29/09/2016 por Bruno Carvalho
;Motivo Alteracao: Ajustes #0388# -> PegaCodigoRaiz()
;Ultima Alteracao: 04/11/2016 por Bruno Carvalho
;Motivo Alteracao: Checagem_Pagina1() -> Verifica‡Æo [Tipo Pessoa]=FISICA e CPF inv lido
;Ultima Alteracao: 02/12/2016 por Bruno Carvalho
;Motivo Alteracao: Ajustes #0390# -> PegaCodigoRaiz()
;Ultima Alteracao: 10/03/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado na proc Checagem_Pagina1() -> ALTERA_PRECO_TOTAL p/ permitir altera‡Æo no campo "I_PRECO_TOTAL" se CALCULO_NF_AUTOMATICO="L"
;Ultima Alteracao: 07/04/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustes #0396# -> PegaCodigoRaiz()
;Ultima Alteracao: 22/06/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustado Data_Dialog() para "Data p/ Calculo do Vencimento"
;Ultima Alteracao: 11/07/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes CL=CartÆo Parcelado
;Ultima Alteracao: 27/07/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes nÆo usar condi‡Æo pagamento por item
;Ultima Alteracao: 05/08/2017 por Bruno Carvalho
;Motivo Alteracao: Substituido [Valor IR] -> [Valor DebitoCredito] e [Valor INSS] -> [Valor TC]
;Ultima Alteracao: 11/08/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes exclusao calc_itens()
;Ultima Alteracao: 11/08/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes [Valor Servico] -> [Valor Devolucao]
;Ultima Alteracao: 19/03/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Pega_Preco() pesquisa item e depois codigoraiz
;Ultima Alteracao: 07/06/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado/ajustado Grava_LogEx() 
;Ultima Alteracao: 18/07/2018 por Bruno Carvalho
;Motivo Alteracao: Ajustes #0419# -> PegaCodigoRaiz()
;Ultima Alteracao: 23/07/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes IMPRIGERAL() -> FT_GNF
;Ultima Alteracao: 22/12/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado controle para destina‡äes inativas -> DESTIN_INATIVA
;Ultima Alteracao: 28/12/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Adicionado processos de #0427#
;Ultima Alteracao: 16/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes Numero_Lancamento("Interno","Locked_Down")
;Ultima Alteracao: 23/04/2019 por Bruno Carvalho
;Motivo Alteracao: Adicionado processos de #0388# para #0429#

@ 22,28 ?? "Gerando Biblioteca Bib_Tro.Lib"
Style Blink
?? "... "

If IsFile("\\Sistemas\\Vendas\\Bib_Tro.Lib")
   Then Run NoRefresh "Del \\Sistemas\\Vendas\\Bib_Tro.Lib>Nul"
EndIf
CreateLib "\\Sistemas\\Vendas\\Bib_Tro"

;*******************************************************************************
;* Rotina para Tabela de Preco                                                 *
;*******************************************************************************
Proc Pega_Preco(OpcaoP)
Private OpcaoP, TABPR, CPGTO, CodClie, CodRepr, CodItem, 
        PesqOk, Registro_Tab_Preco, Registro_TabPreco_CondPagto, regItens,
        wii,coditemtemp

Switch
  Case Table()="Faturai":
    If PARAM_TABPR_ITEM="S"
       Then If OpcaoP = "Cod_Barras"
               Then TABPR=[FaturaC->Codigo da Tabela]
               Else TABPR=[FaturaI->Codigo da Tabela]
            EndIf
       Else TABPR=[FaturaC->Codigo da Tabela]
    EndIf
    CPGTO=[FaturaC->Condicao de Pagamento]

    CodClie=[FaturaC->Codigo                 ]
    CodRepr=[FaturaC->Codigo do Representante]

  Case Table()="Faturaid":
    If PARAM_TABPR_ITEM="S"
       Then If OpcaoP = "Cod_Barras"
               Then TABPR=[FaturaC->Codigo da Tabela]
               Else TABPR=[FaturaID->Codigo da Tabela]
            EndIf
       Else TABPR=[FaturaC->Codigo da Tabela]
    EndIf
    CPGTO=[FaturaC->Condicao de Pagamento]

    CodClie=[FaturaC->Codigo                 ]
    CodRepr=[FaturaC->Codigo do Representante]

EndSwitch

CodClie         =[FaturaC->Codigo                 ]
CodRepr         =[FaturaC->Codigo do Representante]

CodItem         =VSD_I_Codigo_Item
ITEM_PROMOCIONAL="N"
PesqOk          =False

GetRecord "\\Sistemas\\Estoque\\Itens" CodItem To regItens
If RetVal
   Then 
        If PARAM_UTILIZA_TABPR_CLIENTE="S"
           Then 
                coditemtemp=CodItem
                for wii from 1 to 2 
                  GetRecord "\\Sistemas\\Vendas\\Tbprcit" TABPR, CodClie, coditemtemp To Registro_TabPreco_Item
                  If RetVal
                     Then CodItem=coditemtemp
                          PesqOk=True
                          quitloop
                  EndIf
                  If Not IsBlank(regItens["Codigo da Grade"])
                     Then 
                          coditemtemp=PegaCodigoRaiz(coditemtemp)
                     else
                          If SYS_CODIGO_CLIENTE="0239" Or
                             SYS_CODIGO_CLIENTE="0388" Or 
                             SYS_CODIGO_CLIENTE="0427" Or 
                             SYS_CODIGO_CLIENTE="0390" Or
                             SYS_CODIGO_CLIENTE="0396" Or
                             SYS_CODIGO_CLIENTE="0345" Or
                             SYS_CODIGO_CLIENTE="0419" Or
                             SYS_CODIGO_CLIENTE="0429"
                             Then coditemtemp=PegaCodigoRaiz(coditemtemp)
                          EndIf
                  EndIf
                  if coditemtemp=CodItem then quitloop endif
                endfor
        EndIf
        If PARAM_UTILIZA_TABPR_REPRES="S" and Not PesqOk
           Then
                coditemtemp=CodItem
                for wii from 1 to 2 
                  GetRecord "\\Sistemas\\Vendas\\Tbprrit" TABPR, CodRepr, coditemtemp To Registro_TabPreco_Item   
                  If RetVal
                     Then CodItem=coditemtemp
                          PesqOk=True
                          quitloop
                  EndIf
                  If Not IsBlank(regItens["Codigo da Grade"])
                     Then 
                          coditemtemp=PegaCodigoRaiz(coditemtemp)
                     else
                          If SYS_CODIGO_CLIENTE="0239" Or
                             SYS_CODIGO_CLIENTE="0388" Or 
                             SYS_CODIGO_CLIENTE="0427" Or 
                             SYS_CODIGO_CLIENTE="0390" Or
                             SYS_CODIGO_CLIENTE="0396" Or
                             SYS_CODIGO_CLIENTE="0345" Or
                             SYS_CODIGO_CLIENTE="0419" Or
                             SYS_CODIGO_CLIENTE="0429"
                             Then coditemtemp=PegaCodigoRaiz(coditemtemp)
                          EndIf
                  EndIf
                  if coditemtemp=CodItem then quitloop endif
                endfor
        EndIf
        If Not PesqOk
           Then
                coditemtemp=CodItem
                for wii from 1 to 2 
                  GetRecord "\\Sistemas\\Vendas\\Tbprite" TABPR, coditemtemp          To Registro_TabPreco_Item
                  If RetVal
                     Then CodItem=coditemtemp
                          PesqOk=True
                          quitloop
                  EndIf
                  If Not IsBlank(regItens["Codigo da Grade"])
                     Then 
                          coditemtemp=PegaCodigoRaiz(coditemtemp)
                     else
                          If SYS_CODIGO_CLIENTE="0239" Or
                             SYS_CODIGO_CLIENTE="0388" Or 
                             SYS_CODIGO_CLIENTE="0427" Or 
                             SYS_CODIGO_CLIENTE="0390" Or
                             SYS_CODIGO_CLIENTE="0396" Or
                             SYS_CODIGO_CLIENTE="0345" Or
                             SYS_CODIGO_CLIENTE="0419" Or
                             SYS_CODIGO_CLIENTE="0429"
                             Then coditemtemp=PegaCodigoRaiz(coditemtemp)
                          EndIf
                  EndIf
                  if coditemtemp=CodItem then quitloop endif
                endfor
        EndIf
EndIf

If PesqOK
   Then ITEM_PROMOCIONAL=Registro_TabPreco_Item["Em Promocao"]

        If OpcaoP="Checa"
           Then Return True
        EndIf

        If PARAM_PEGAPRECO_CPAGTO = "S"
           Then 
                PesqOk=False
                Moveto [Lookup_TabPreco_CondPagto]
                Ativa_Lookup()
                Moveto [Codigo da Tabela]
                Locate TABPR
                If RetVal
                   Then While [Codigo da Tabela] = TABPR
                          If [Condicao de Pagamento] = CPGTO
                             Then CopyToArray Registro_TabPreco_CondPagto
                                  PesqOK=True
                                  QuitLoop
                          EndIf
                          Skip
                          If Eot()
                             Then QuitLoop
                          Endif
                        EndWhile
                Endif
                KeyPress "ESC"
                If PesqOk
                   Then [Preco Unitario       ]=Registro_TabPreco_Item["Preco Unitario"]+
                                                NDecimal(((Registro_TabPreco_Item["Preco Unitario"]*
                                                Registro_TabPreco_CondPagto["Taxa Financeira"])/100),2)
                        [Preco Unitario Tabela]=Registro_TabPreco_Item["Preco Unitario"]+
                                                NDecimal(((Registro_TabPreco_Item["Preco Unitario"]*
                                                Registro_TabPreco_CondPagto["Taxa Financeira"])/100),2)

                        If TX_DESCTO_CLIE>0
                           Then [Preco Unitario Tabela]=[Preco Unitario]
                                [Preco Unitario       ]=Round([Preco Unitario]-(([Preco Unitario]*TX_DESCTO_CLIE)/100),2)
                        EndIf

                   Else [Preco Unitario       ]=BlankNum()
                        [Preco Unitario Tabela]=BlankNum()
                EndIf
           Else [Preco Unitario       ]=Registro_TabPreco_Item["Preco Unitario"]
                [Preco Unitario Tabela]=Registro_TabPreco_Item["Preco Unitario"]

                If TX_DESCTO_CLIE>0
                   Then [Preco Unitario Tabela]=[Preco Unitario]
                        [Preco Unitario       ]=Round([Preco Unitario]-(([Preco Unitario]*TX_DESCTO_CLIE)/100),2)
                EndIf

        EndIf
   Else [Preco Unitario       ]=BlankNum()
        [Preco Unitario Tabela]=BlankNum()
EndIf

VSD_I_Preco_Unitario=[Preco Unitario       ]
VSD_I_Preco_Tabela  =[Preco Unitario Tabela]
UnLockRecord

EndProc ;(Pega_Preco)

;*******************************************************************************
;* Rotina para Localizar Aliquota_ICMS                                         *
;*******************************************************************************
Proc Closed Checagem_Pagina1()
UseVars AutoLib, ErrorProc, UF_ALIQUOTA_ICMS, KM_FRETE, TAXA_FRETE, VRMINIMO_FRETE, CHAVEC,
        PARAM_VISITA, DESTIN_ATUALIZA_PEDIDOS, PARAM_BLOQUEIA_AUTORI,
        PARAM_DIAS_ATRASO, NOVA_DESTINACAO, NOVO_PEDIDO,  
        PARAM_CONTA_CAIXA, OPCAO_RED_BCICMS,
        ORDFAT, SYS_CHAPA_USUARIO, SYS_NOME_USUARIO, SYS_NIVEL_USUARIO, 
        SYS_NCONEXAO, SYS_ESTACAO, SYS_SCRIPT, TX_DESCTO_BLOQUEIO, TX_DESCTO_CLIE,
        TRIB_ICMS, TRIB_IPI, UF_EMPRESA, SYS_CODIGO_CLIENTE,
        UFEMPRESA_ALIQUOTA_ICMS,
        ALIQUOTA_CREDITO_ICMS_NOSN, UF_ALIQUOTA_ICMS_INTERNA,
        DP_GERA_DUPLICATA,TPEMPR,CNPJNF_e,NOMENF_e, CHECANFE_AUT, 
        GERDUP_CDESCTO, GERDUP_TXDESCTO, ATIVEMPR, CALCULO_NF_AUTOMATICO,
        PARAM_CONDPAGTO, UTILIZANDO_CP_FP_CLIENTE, ALTERA_PRECO_TOTAL

Private CAMPOS_OK, NCAMPO, CDDESTIN

NCAMPO=Field()

;*** Situacao do Cliente ***
GetRecord "\\Sistemas\\Cadastro\\Destinat" [Codigo] to REG_CLIE_PED  
If not RetVal
   Then Mensagem("Cliente Inv lido !")
        CAMPOS_Ok=False
   Else If REG_CLIE_PED["Situacao do Cliente"]="RECADASTRO"
           Then Mensagem("Verificar a Situa‡„o do Cliente !//Status="+REG_CLIE_PED["Situacao do Cliente"])
                CAMPOS_Ok=False
        EndIf
        If REG_CLIE_PED["Situacao do Cliente"]="PESSIMO"
           Then Mensagem("Verificar a Situa‡„o do Cliente com a Gerencia !")
                CAMPOS_Ok=False                                                        
        EndIf
EndIf

;*** Checagem Autorizados ***
If PARAM_BLOQUEIA_AUTORI="S" And
   [Nome Fantasia EmitDest]<>"DIVERSOS"
   Then Monta_Opcoes("Autorizado",[Codigo])
        If Not Checa_Opcoes("Autorizados",[Nome do Autorizado])
           Then Mensagem("Autorizado n„o cadastrado !")
                CAMPOS_Ok=False
        EndIf
EndIf

;*** Checagem Dias em Atraso ***
If PARAM_DIAS_ATRASO  ="S" And
   [FaturaC->Tipo    ]="C" And
   [Nome Fantasia EmitDest]<>"DIVERSOS" And
;;;Search("VIST",[FaturaC->Descricao CondPagto])=0 And
   Search("VEND",[FaturaC->Descricao da Destinacao])>0
   Then If Not Dias_Atraso()
					 Then CAMPOS_Ok=False
        EndIf
EndIf

;*** Checagem de Campos ***
CAMPOS_OK=False
Switch
  Case IsBlank([Codigo da Empresa]):       Mensagem("Empresa Invalida !")
  Case IsBlank([Codigo da Destinacao]):    Mensagem("Destinacao Invalida !")
  Case IsBlank([Codigo do Representante]): Mensagem("Representante Invalido !")
  Case IsBlank([Codigo]):                  Mensagem("Destinatario/Emitente Invalido !")
  Case IsBlank([Data de Emissao]):         Mensagem("Emissao Invalido !")
  Case IsBlank([UF]):                      Mensagem("Estado Invalido !")
  Case IsBlank([CFO]):                     Mensagem("CFOP Invalido !")
  Case IsBlank([Consumidor Final]):        Mensagem("Tipo Consumidor Invalido !")
  Case Upper([Tipo Pessoa])="FISICA" And Len(Tira_CharNum([CGC]))<>11 : Mensagem("CPF inv lido!")
  Case IsBlank([IE]):                      Mensagem("Inscri‡„o Estadual Invalida !")
                                           [IE]="ISENTO"
  OtherWise: CAMPOS_OK=True
EndSwitch

;*** Representante ********* 
If Not Verifica_Representante([FaturaC->Codigo do Representante])
   Then Mensagem("Representante/Vendedor Inativo !")
        CAMPOS_OK=False
EndIf  

;*** Checagem da Tabela de Preco ***
Moveto [Codigo da Tabela]
Ativa_Lookup()
Moveto [Codigo da Tabela]
Locate [FaturaC->Codigo da Tabela]
If RetVal
   Then If [Ativa]="N"
           Then Mensagem("Tabela de Pre‡o Inativa !")
                CAMPOS_Ok=False
        EndIf
EndIf
KeyPress "ESC"

If Search("TROCA",[Descricao da Destinacao])=0
   Then Mensagem("Somente destina‡„o de Troca !")
        CAMPOS_Ok=False
EndIf

If Not CAMPOS_OK
  Then Moveto "FaturaC"
       Moveto Field NCAMPO
       Return False
EndIf

;*** Checagem da Unidade Federativa c/ CFO ***
Moveto [Codigo da Empresa]
Ativa_Lookup()
Moveto [Codigo da Empresa]
Locate [FaturaC->Codigo da Empresa]
If RetVal
   Then Switch
          Case (SubStr([FaturaC->CFO],1,1)="1" And [FaturaC->UF]<>[UF Empresa]):
               Mensagem("O estado \""+[FaturaC->UF]+"\" de origem usado p/ o CFOP \""+[FaturaC->CFO]+"\"// ‚ diferente da sua Empresa \""+[UF Empresa]+"\" ! ")
               CAMPOS_Ok=False
          Case (SubStr([FaturaC->CFO],1,1)="5" And [FaturaC->UF]<>[UF Empresa]):
               Mensagem("O estado \""+[FaturaC->UF]+"\" de destino usado p/ o CFOP \""+[FaturaC->CFO]+"\"// ‚ diferente da sua Empresa \""+[UF Empresa]+"\" ! ")
               CAMPOS_Ok=False
          Case (SubStr([FaturaC->CFO],1,1)="2" And [FaturaC->UF]=[UF Empresa]):
               Mensagem("O estado \""+[FaturaC->UF]+"\" de origem usado p/ o CFOP \""+[FaturaC->CFO]+"\"// ‚ igual a sua Empresa \""+[UF Empresa]+"\" ! ")
               CAMPOS_Ok=False
          Case (SubStr([FaturaC->CFO],1,1)="6" And [FaturaC->UF]=[UF Empresa]):
               Mensagem("O estado \""+[FaturaC->UF]+"\" de destino usado p/ o CFOP \""+[FaturaC->CFO]+"\"// ‚ igual a sua Empresa \""+[UF Empresa]+"\" ! ")
               CAMPOS_Ok=False
        EndSwitch
EndIf
KeyPress "ESC"

If IsAssigned(REEMITIR) and IsAssigned(SOIMPRIMIR) 
   then if REEMITIR and SOIMPRIMIR
           then CAMPOS_OK=True
        endif
endif        

If Not CAMPOS_OK
  Then Moveto "FaturaC"
       Moveto Field NCAMPO
       Return False
EndIf

;*** Pega UF/Tipo Empresa Controle ***
Moveto [Codigo da Empresa]
If Busca_Lookup("Codigo da Empresa",[FaturaC->Codigo da Empresa],"Empresa: "+[FaturaC->Codigo da Empresa]+" sem UF !")
   Then UF_EMPRESA=REG_BUSCA_LOOKUP["UF Empresa"]
        TPEMPR    =REG_BUSCA_LOOKUP["Tipo da Empresa"]
        ATIVEMPR  =REG_BUSCA_LOOKUP["Atividade"]
        CNPJNF_e  =Tira_CharNum(REG_BUSCA_LOOKUP["CGC Empresa"])
        NOMENF_e  =REG_BUSCA_LOOKUP["Razao Social Empresa"]
   Else UF_EMPRESA="??"
        TPEMPR    ="??"
        ATIVEMPR  ="??"
        CNPJNF_e  ="??"
        NOMENF_e  ="??"
EndIf

;*** Aliquota do Estado ***
Moveto [UF]
If Busca_Lookup("UF",[FaturaC->UF],"")
   Then UF_ALIQUOTA_ICMS         =REG_BUSCA_LOOKUP["Aliquota de ICMS"]
        UF_ALIQUOTA_ICMS_INTERNA =REG_BUSCA_LOOKUP["Aliquota de ICMS_INTERNA"]
   Else UF_ALIQUOTA_ICMS         =BlankNum()
        UF_ALIQUOTA_ICMS_INTERNA =BlankNum()
EndIf

If Busca_Lookup("UF",UF_EMPRESA,"")
   Then UFEMPRESA_ALIQUOTA_ICMS=REG_BUSCA_LOOKUP["Aliquota de ICMS"]
   Else UFEMPRESA_ALIQUOTA_ICMS=BlankNum()
EndIf

;*** Aliquota/Tributacao/Observacao da Destinacao ***
CDDESTIN=[Codigo da Destinacao]
[Codigo da Destinacao]=""
[Codigo da Destinacao]=CDDESTIN

ALIQUOTA_CREDITO_ICMS_NOSN =BlankNum()
TRIB_ICMS=""
TRIB_IPI =""
DESTIN_ATUALIZA_PEDIDOS=""
OPCAO_RED_BCICMS="1"
DP_GERA_DUPLICATA="N"
CALCULO_NF_AUTOMATICO="A"
DESTIN_INATIVA = ""

Moveto [Codigo da Destinacao]
If Busca_Lookup("Codigo da Destinacao",[FaturaC->Codigo da Destinacao],"")
   Then DESTIN_INATIVA=REG_BUSCA_LOOKUP["Inativo Destin"]
        ALIQUOTA_CREDITO_ICMS_NOSN =REG_BUSCA_LOOKUP["Aliquota CredICMS NOSN"]
        If REG_BUSCA_LOOKUP["ICMS Aliquota do Estado"]<>"S"
           Then UF_ALIQUOTA_ICMS=REG_BUSCA_LOOKUP["Aliquota de ICMS"]
        EndIf
        CALCULO_NF_AUTOMATICO=REG_BUSCA_LOOKUP["Calcula_Nota"]
        TRIB_ICMS=REG_BUSCA_LOOKUP["Tributacao de ICMS"]
        TRIB_IPI =REG_BUSCA_LOOKUP["Tributacao de IPI"]
        DESTIN_ATUALIZA_PEDIDOS=REG_BUSCA_LOOKUP["Atualiza Pedidos"]

;;;        OBS = OBS+REG_BUSCA_LOOKUP["Observacao_Destinacao"]

        If Not IsBlank(REG_BUSCA_LOOKUP["Conta Caixa Padrao"])
           Then PARAM_CONTA_CAIXA=REG_BUSCA_LOOKUP["Conta Caixa Padrao"]
        EndIf
        OPCAO_RED_BCICMS=REG_BUSCA_LOOKUP["Sem Reducao BCICMS"]
        DP_GERA_DUPLICATA=REG_BUSCA_LOOKUP["Gera Duplicata"]
        
        If DESTIN_INATIVA="S" 
           Then Mensagem("Destina‡Æo "+[FaturaC->Codigo da Destinacao]+" est  inativa!")
                Return False 
        EndIf
EndIf
;[Aliquota de ICMS         ]=UF_ALIQUOTA_ICMS

;---- Altera Pre‡o Total se Forma de Calculo na Nota for LIVRE -----------------
ALTERA_PRECO_TOTAL = "N"
If CALCULO_NF_AUTOMATICO="L"
   Then ALTERA_PRECO_TOTAL = "S"
EnDIf

;*** Tabela de Kilometragem ***
Moveto [Codigo]
Ativa_Lookup()
Moveto [Codigo]
Locate [FaturaC->Codigo]
If RetVal
   Then If IsBlank([Km Frete])
           Then KM_FRETE=0
           Else KM_FRETE=[Km Frete]
        EndIf
        TX_DESCTO_CLIE=[Taxa_Desconto Permitido]
   Else KM_Frete=0
EndIf
KeyPress "ESC"

TAXA_FRETE=0
VRMINIMO_FRETE=0
Moveto [Lookup_Tabela_Frete]
Ativa_Lookup()
Scan
  If (KM_Frete>=[Km Inicial]) And
     (KM_Frete<=[Km Final  ])
     Then TAXA_FRETE    =[Taxa]
          VRMINIMO_FRETE=[Valor Minimo]
          QuitLoop
  EndIf
EndScan
KeyPress "ESC"

;--- Verifica Condicao/Forma de Pagamento do Cliente ---------------------------
UTILIZANDO_CP_FP_CLIENTE=PegaCondicaoeFormaPagamento("VERIFICAR", [FaturaC->Codigo])
;-------------------------------------------------------------------------------

Moveto "FaturaC"
Return True
EndProc   ;  (Checagem_Pagina1)

;*******************************************************************************
;* Rotina para Calculo de Valores da Ordem de Faturamento                      *
;*******************************************************************************
Proc Rateio_BC_Itens(TabelaRefC)
Private nitens,
        TabelaRefC, TabelaRefI, REG_TABELAREFC

;--- Seta Tabelas de Trabalho --------------------------------------------------
Moveto TabelaRefC
Switch
  Case TabelaRefC="FaturaC" : TabelaRefI="FaturaI"
EndSwitch

CopyToArray REG_TABELAREFC ; guarda dados registro mestre

Aguarde("Atualizando rateios nos itens")

Moveto TabelaRefI
nitens=0
Scan
  nitens=nitens+1

  [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_CREDSN_Aliquota     ]=It_aliq_icmscred[nitens]  
  [ICMS_CREDSN_Valor        ]=It_vr_icmscred[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]     

EndScan
If RecordStatus("Locked") Then UnLockRecord EndIf         

Moveto TabelaRefC

LimpAguarde()
EndProc   ; (Rateio_BC_Itens)

;*******************************************************************************
;* Rotina para Calculo de Valores da Ordem de Faturamento                      *
;*******************************************************************************
Proc CALC_OF()
Private TabelaRefC, TabelaRefI, CampoTab, wi,

        VRBCIPI, VRIPI, VRBCICMS, VRICMS, VRBCST, VRST, VRICMS_CREDSN,
        VRBCISSQN, VRISSQN, VRBCPIS, VRPIS, VRBCCOFINS, VRCOFINS, 

        Frete_Valor, Seguro_Valor, OutDesp_Valor, Descto_Valor,
        DIF_Descto_Valor, DIF_Frete_Valor, DIF_Seguro_Valor, DIF_OutDesp_Valor,
        OutrosRateioOk,
        VL_BC_ICMS, VL_BC_ICMS_ST, VL_ICMS_ST,
        TribCST,
        MercadoriaRateio_Valor

Aguarde("Calculando valores da nota")

Switch
  Case Table()="Faturac": TabelaRefC="FaturaC"  TabelaRefI="FaturaI"
EndSwitch

Moveto TabelaRefC
CampoTab=Field()

VRBCIPI        =0
VRIPI          =0
VRBCICMS       =0
VRICMS         =0
VRBCST         =0
VRST           =0
VRICMS_CREDSN  =0
VRBCISSQN      =0
VRISSQN        =0
VRBCPIS        =0
VRPIS          =0
VRBCCOFINS     =0
VRCOFINS       =0
VRNF           =0

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

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]-[Valor Desconto]

CopyToArray REG_TABELAREFC ; guarda dados registro mestre
                                                      
;--- Soma dos Items para rateio ------------------------------------------------
MercadoriaRateio_Valor=0
For wi From 1 to DynArraySize(It_prtotal)
  If It_tpitem[wi]="C" ;servi‡o
     Then 
          OutrosRateioOk=False    ;nÆo rateia frete e outros
     Else 
          OutrosRateioOk=True
          If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And 
             (It_cfop[wi]="5902" or It_cfop[wi]="5903") ;saida industrializa‡Æo/Devolucao Industrializacao
             Then OutrosRateioOk=False
          EndIf
  EndIf
  
  If OutrosRateioOk
     Then MercadoriaRateio_Valor=MercadoriaRateio_Valor+It_prtotal[wi]
  EndIf   
EndFor

;--- Rateio Frete, Seguro, Desconto, Despesas ----------------------------------
Frete_Valor      =0
Seguro_Valor     =0
OutDesp_Valor    =0
Descto_Valor     =0

For wi From 1 to DynArraySize(It_prtotal)

  If It_tpitem[wi]="C" ;servi‡o
     Then 
          OutrosRateioOk=False    ;nÆo rateia frete e outros
          PORC_IT_MERC=0
     Else OutrosRateioOk=True
          PORC_IT_MERC=(It_prtotal[wi]/MercadoriaRateio_Valor)*100 
          If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And It_cfop[wi]="5902" ;saida industrializa‡Æo
             Then OutrosRateioOk=False
          EndIf
  EndIf   

  If OutrosRateioOk
     Then It_txdescto[wi]=TXDESCTO_TOTAL
          It_descto[wi]  =NDecimal((REG_TABELAREFC["Valor Desconto"          ]*PORC_IT_MERC)/100,2)
          If REG_TABELAREFC["Frete Incluso na Nota"]="+"
             Then It_frete[wi]=NDecimal((REG_TABELAREFC["Valor do Frete"     ]*PORC_IT_MERC)/100,2)
             Else It_frete[wi]=0           
          EndIf
          It_seguro[wi] =NDecimal((REG_TABELAREFC["Valor do Seguro"          ]*PORC_IT_MERC)/100,2)
          It_outdesp[wi]=NDecimal((REG_TABELAREFC["Valor Despesas Acessorias"]*PORC_IT_MERC)/100,2)

          Descto_Valor  =Descto_Valor +It_descto[wi]
          Frete_Valor   =Frete_Valor  +It_frete[wi]
          Seguro_Valor  =Seguro_Valor +It_seguro[wi]
          OutDesp_Valor =OutDesp_Valor+It_outdesp[wi]

          If It_txdescto[wi]=0 Then It_txdescto[wi]=BlankNum() EndIf
          If It_descto[wi]  =0 Then It_descto[wi]  =BlankNum() EndIf
          If It_frete[wi]   =0 Then It_frete[wi]   =BlankNum() EndIf
          If It_seguro[wi]  =0 Then It_seguro[wi]  =BlankNum() EndIf
          If It_outdesp[wi] =0 Then It_outdesp[wi] =BlankNum() EndIf

     Else It_txdescto[wi]=BlankNum()
          It_descto[wi]  =BlankNum()
          It_frete[wi]   =BlankNum()
          It_seguro[wi]  =BlankNum()
          It_outdesp[wi] =BlankNum()
  EndIf

EndFor

;--- Calcular diferen‡a totalizadores ------------------------------------------
DIF_Descto_Valor       =NDecimal(REG_TABELAREFC["Valor Desconto"           ]-Descto_Valor ,2)
If REG_TABELAREFC["Frete Incluso na Nota"]="+"
   Then DIF_Frete_Valor=NDecimal(REG_TABELAREFC["Valor do Frete"           ]-Frete_Valor  ,2)
   Else DIF_Frete_Valor=0
EndIf
DIF_Seguro_Valor       =NDecimal(REG_TABELAREFC["Valor do Seguro"          ]-Seguro_Valor ,2)
DIF_OutDesp_Valor      =NDecimal(REG_TABELAREFC["Valor Despesas Acessorias"]-OutDesp_Valor,2)

If DIF_Descto_Valor <>0 Or
   DIF_Frete_Valor  <>0 Or
   DIF_Seguro_Valor <>0 Or
   DIF_OutDesp_Valor<>0 
   Then 
        For wi From 1 to DynArraySize(It_prtotal) 
              
          Switch
            Case It_tpitem[wi]="C" :  ;Igual a Seri‡o
              OutrosRateioOk=False    ;nÆo rateia frete e outros
            OtherWise              :  ;Diferente de servi‡o
              OutrosRateioOk=True     ;rateia frete e outros 
              If REG_TABELAREFC["Tipo Movimento Estoque"]="S" And It_cfop[wi]="5902" ;saida industrializa‡Æo
                 Then OutrosRateioOk=False
              EndIf
          EndSwitch
          If OutrosRateioOk 
             Then 
                  If DIF_Descto_Valor >=0 Or (DIF_Descto_Valor*-1) >=It_descto[wi]
                     Then It_descto[wi] =It_descto[wi] +DIF_Descto_Valor
                          DIF_Descto_Valor=0 
                  EndIf
                  If DIF_Frete_Valor  >=0 Or (DIF_Frete_Valor*-1)  >=It_frete[wi]
                     Then It_frete[wi]  =It_frete[wi]  +DIF_Frete_Valor
                          DIF_Frete_Valor =0
                  EndIf
                  If DIF_Seguro_Valor >=0 Or (DIF_Seguro_Valor*-1) >=It_seguro[wi]
                     Then It_seguro[wi] =It_seguro[wi] +DIF_Seguro_Valor
                          DIF_Seguro_Valor=0
                  EndIf   
                  If DIF_OutDesp_Valor>=0 Or (DIF_OutDesp_Valor*-1)>=It_outdesp[wi]
                     Then It_outdesp[wi]=It_outdesp[wi]+DIF_OutDesp_Valor
                          DIF_OutDesp_Valor=0
                  EndIf   

                  If It_txdescto[wi]=0 Then It_txdescto[wi]=BlankNum() EndIf
                  If It_descto[wi]  =0 Then It_descto[wi]  =BlankNum() EndIf
                  If It_frete[wi]   =0 Then It_frete[wi]   =BlankNum() EndIf
                  If It_seguro[wi]  =0 Then It_seguro[wi]  =BlankNum() EndIf
                  If It_outdesp[wi] =0 Then It_outdesp[wi] =BlankNum() EndIf
        
          EndIf
          If DIF_Descto_Valor =0 And
             DIF_Frete_Valor  =0 And
             DIF_Seguro_Valor =0 And
             DIF_OutDesp_Valor=0
             Then QuitLoop
          EndIf
          
        EndFor
EndIf
          
;--- Calculando Impostos -------------------------------------------------------
For wi From 1 to DynArraySize(It_prtotal)

  Switch
    Case CALCULO_NF_AUTOMATICO="A":

      ;--- Calculando IPI ----------------------------------------------------------
      If It_aliq_ipi[wi]>0
         Then It_bc_ipi[wi]=It_prtotal[wi]
              If REG_TABELAREFC["Frete Incluso na Nota"]="+" And
                 SubStr(It_cfop[wi],1,1)    ="3" And ; entrada import‡Æo  
                 SubStr(It_cst_icms[wi],1,1)="1"     ; item importa‡Æo direta
                 Then It_bc_ipi[wi]=It_bc_ipi[wi]+It_frete[wi]
              EndIf
              It_vr_ipi[wi]=Round((It_bc_ipi[wi]*It_aliq_ipi[wi])/100,2) 
         Else It_bc_ipi[wi]=BlankNum()    
              It_vr_ipi[wi]=BlankNum()    
      EndIf
      
      ;--- Calculando Base de Calculo ICMS para todas as situa‡äes -----------------
      Switch
        Case (TPEMPR="SIMPLES NACIONAL" Or TPEMPR="SIMPLES NAC. ESRB"):
          Switch
            Case It_trib_icms[wi]="S" And SubStr(It_cst_icms[wi],2,2)<>"60": 
                 VL_BC_ICMS   =It_prtotal[wi]
                 VL_BC_ICMS_ST=It_prtotal[wi]
                 
            Case It_trib_icms[wi]="S" And SubStr(It_cst_icms[wi],2,2)="60" And
                 Search("DEVOL",REG_TABELAREFC["Descricao da Destinacao"])>0:
                 VL_BC_ICMS   =It_prtotal[wi]
                 VL_BC_ICMS_ST=It_prtotal[wi]
                 
            OtherWise:
                 VL_BC_ICMS   =It_prtotal[wi]-It_descto[wi]
                 VL_BC_ICMS_ST=It_prtotal[wi]
                 
          EndSwitch      
        OtherWise:
          Switch
            Case OPCAO_RED_BCICMS=3 And It_red_icms[wi]>0 And It_txdescto[wi]>0:
                 VL_BC_ICMS   =It_prtotal[wi]
                 VL_BC_ICMS_ST=It_prtotal[wi]
                 
            OtherWise:
                 VL_BC_ICMS   =It_prtotal[wi]-It_descto[wi]
                 VL_BC_ICMS_ST=It_prtotal[wi]
                 
          EndSwitch
      EndSwitch

      VL_BC_ICMS   =VL_BC_ICMS   +It_frete[wi]+It_seguro[wi]+It_outdesp[wi]

      VL_BC_ICMS_ST=VL_BC_ICMS_ST+It_frete[wi]+It_seguro[wi]+It_outdesp[wi] 

      If REG_TABELAREFC["Consumidor Final"]="S" 
         Then VL_BC_ICMS   =VL_BC_ICMS   +it_vr_ipi[wi]
         Else VL_BC_ICMS_ST=VL_BC_ICMS_ST+It_vr_ipi[wi] 
      EndIf   
      VL_RED_BC    =NDecimal((VL_BC_ICMS*It_red_icms[wi])/100,2)
      VL_BC_ICMS   =VL_BC_ICMS-VL_RED_BC                   
      
      ;--- Calculando Credito ICMS Simples Nacional ------------------------
      If (TPEMPR="SIMPLES NACIONAL" Or TPEMPR="SIMPLES NAC. ESRB") And
         SubStr(Directory(),1,1)<>"X"                              And
         (It_csosn_icms[wi]="101" Or It_csosn_icms[wi]="201")
         Then It_vr_icmscred[wi]  =Round((VL_BC_ICMS*It_aliq_icmscred[wi])/100,2)
         Else It_aliq_icmscred[wi]  =BlankNum()
              It_vr_icmscred[wi]    =BlankNum()
      EndIf   

      ;--- Calculando ICMS ---------------------------------------------------------
      If It_aliq_icms[wi]>0 
         Then It_bc_icms[wi]    =VL_BC_ICMS
              It_vr_icms[wi]    =Round((It_bc_icms[wi]*It_aliq_icms[wi])/100,2)
         Else It_aliq_icms[wi]  =BlankNum()
              It_bc_icms[wi]    =BlankNum()
              It_vr_icms[wi]    =BlankNum()
      EndIf
    
      ;--- Calculando Substituicao Tributaria --------------------------------------
      If It_aliq_st[wi]>0
         Then
              If SYS_CODIGO_CLIENTE="0167"
                 Then VL_BC_ICMS_ST=VL_BC_ICMS_ST-It_frete[wi]     
              EndIf
        
              VL_BC_ICMS_ST=VL_BC_ICMS_ST+Round((VL_BC_ICMS_ST*It_mva[wi])/100,2)
            ;;VL_RED_BCST  =NDecimal((VL_BC_ICMS_ST*It_red_st[wi])/100,2)
            ;;VL_BC_ICMS_ST=VL_BC_ICMS_ST-VL_RED_BCST                   
       
              VL_ICMS_ST=Round((VL_BC_ICMS_ST*It_aliq_st[wi])/100,2)

              ;Comentado para nÆo pegar aliquota do estado caso ICMS esteja em branco
              VL_ICMS_ST=VL_ICMS_ST-It_vr_icms[wi]
              ;Switch
              ;  Case It_vr_icms[wi]>0 :
              ;       VL_ICMS_ST=VL_ICMS_ST-It_vr_icms[wi]
              ;  OtherWise             :
              ;     ;;VL_ICMS_ST=VL_ICMS_ST-Round((VL_BC_ICMS*UF_ALIQUOTA_ICMS)/100,2)
              ;EndSwitch
        
              It_bc_st[wi]=VL_BC_ICMS_ST
              It_vr_st[wi]=VL_ICMS_ST
      
         Else It_red_st[wi]    =BlankNum() 
              It_aliq_st[wi]   =BlankNum()
              It_bc_st[wi]     =BlankNum()
              It_vr_st[wi]     =BlankNum()
      EndIf
              
      ;--- Calculando ISSQN --------------------------------------------------------
      If It_aliq_issqn[wi]>0
         Then It_bc_issqn[wi]=It_prtotal[wi]
              It_vr_issqn[wi]=Round((It_bc_issqn[wi]*It_aliq_issqn[wi])/100,2) 
         Else It_bc_issqn[wi]=BlankNum()    
              It_vr_issqn[wi]=BlankNum()    
      EndIf
    
      ;--- Calculando PIS ----------------------------------------------------------
      If It_aliq_pis[wi]>0
         Then It_bc_pis[wi]=(It_prtotal[wi]-It_descto[wi])+It_frete[wi]+It_seguro[wi]+It_outdesp[wi]
              It_vr_pis[wi]=Round((It_bc_pis[wi]*It_aliq_pis[wi])/100,2) 
         Else It_bc_pis[wi]=BlankNum()    
              It_vr_pis[wi]=BlankNum()    
      EndIf
    
      ;--- Calculando COFINS -------------------------------------------------------
      If It_aliq_cofins[wi]>0
         Then It_bc_cofins[wi]=(It_prtotal[wi]-It_descto[wi])+It_frete[wi]+It_seguro[wi]+It_outdesp[wi]
              It_vr_cofins[wi]=Round((It_bc_cofins[wi]*It_aliq_cofins[wi])/100,2) 
         Else It_bc_cofins[wi]=BlankNum()    
              It_vr_cofins[wi]=BlankNum()    
      EndIf

    OtherWise:

  EndSwitch

  ;--- Somando Impostos --------------------------------------------------------
  VRBCIPI        =VRBCIPI      +It_bc_ipi[wi]
  VRIPI          =VRIPI        +It_vr_ipi[wi]

  If ( (TPEMPR="SIMPLES NACIONAL" Or TPEMPR="SIMPLES NAC. ESRB") And It_csosn_icms[wi]="900" )
     Or TPEMPR="DEBITO/CREDITO"
     Then 
          VRBCICMS       =VRBCICMS     +It_bc_icms[wi]
          VRICMS         =VRICMS       +It_vr_icms[wi]
  EndIf
  
  VRICMS_CREDSN  =VRICMS_CREDSN+It_vr_icmscred[wi]
  VRBCST         =VRBCST       +It_bc_st[wi]
  VRST           =VRST         +It_vr_st[wi]
  VRBCISSQN      =VRBCISSQN    +It_bc_issqn[wi]
  VRISSQN        =VRISSQN      +It_vr_issqn[wi]
  VRBCPIS        =VRBCPIS      +It_bc_pis[wi]
  VRPIS          =VRPIS        +It_vr_pis[wi]  
  VRBCCOFINS     =VRBCCOFINS   +It_bc_cofins[wi]
  VRCOFINS       =VRCOFINS     +It_vr_cofins[wi]
                                                                          
EndFor

Moveto TabelaRefC
Moveto Field CampoTab


[Valor BCICMS ]=VRBCICMS
[Valor ICMS   ]=VRICMS
[Valor IPI    ]=VRIPI
[Valor BCISSQN]=VRBCISSQN
[Valor ISSQN  ]=VRISSQN
[Valor II     ]=VRII    
[Valor PIS    ]=VRPIS
[Valor COFINS ]=VRCOFINS

[Valor BCSubstituicao ICMS]=VRBCST
[Valor Substituicao ICMS  ]=VRST

[Valor Nota Fiscal]=([Valor Mercadoria Liquido]+[Valor Despesas Acessorias]+
                     [Valor do Seguro])

VRNF=[Valor Nota Fiscal]

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

[Valor DebitoCredito]=[Valor Devolucao]-[Valor Nota Fiscal]  
If [Valor DebitoCredito]>0
   Then [Forma de Pagamento]="TC"
EndIf

If (TPEMPR="SIMPLES NACIONAL" Or TPEMPR="SIMPLES NAC. ESRB") And
   VRICMS_CREDSN>0 And ALIQUOTA_CREDITO_ICMS_NOSN>0
   Then
        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 [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

;*** 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 [Valor TC                 ]=0 Then [Valor TC                 ]=BlankNum() EndIf

Moveto TabelaRefC
Moveto Field CampoTab

LimpAguarde()
EndProc     ;  (Calc_OF)

;*******************************************************************************
;* Rotina para Chamar Calculo de Vencimentos                                   *
;*******************************************************************************
Proc CALC_VENCTOS()
   
;-- Verifica se composicao de dias ‚ correta -----------------------------------
If Not Checa_CompDias([FaturaC->Composicao de Dias])
   Then Return
EndIf      

Calcular_Vencimentos()

Release Procs Calcular_Vencimentos
EndProc   ;  (CALC_VENCTOS)

;*******************************************************************************
;* Rotina de Controle p/ ShowDialog                                            *
;*******************************************************************************
Proc Data_Dialog(Disparo,Campo,Evento,Elemento)
Temp=True
INICIO_DIALOG=True

If Not IsAssigned(OP_SHOWD) Then OP_SHOWD="" EndIf
If OP_SHOWD<>"Cheque" Then OP_SHOWD="DTBASE" EndIf

If INICIO_DIALOG
   Then INICIO_DIALOG=False
EndIf          

If Disparo="EVENT" And DynArraySize(Evento)>0 And Evento["Type"]="KEY" Then
   Switch
      Case Evento["KeyCode"] = 9:
           Temp=False
      Case Evento["KeyCode"] = 27:
           Switch
             Case Campo="Data_Base"      : CancelDialog
           EndSwitch 
      Case Evento["KeyCode"] = 13:
           Switch
             Case Campo="Data_Base":
                  VSD_Data_Base=ControlValue("Data_Base")
                  AcceptDialog
           EndSwitch
   EndSwitch
EndIf

SelectControl Campo
TECLA=" Esc=Retornar  "
MSGCAMPO=""

@ 24,0 ?? TECLA+Spaces(80-Len(TECLA))
PaintCanvas Attribute 31 24,0,24,79
Message(MSGCAMPO)
Mouse Hide
RefreshDialog
Return TEMP

EndProc ;Data_Dialog()

;*******************************************************************************
;* Rotina para Calcular de Vencimentos                                         *
;*******************************************************************************
Proc Calcular_Vencimentos()
Private NP, NPC, pos_s, AUX_NP, 
        VRVENCTO, VRDIFERE, VRENTRADA, VR_NF,
        j, i,
        DTBASE, DTVENCTO,
        NDIAS, DIA_VECTO, MES_VECTO, ANO_VECTO, ANO_AUXILIAR, CONT_NDIAS,
        vrbaseoperacao, vrtitcred, delok, seq, tementrada, temcredito

;-- Verifica se composicao de dias ‚ correta -----------------------------------
If Not Checa_CompDias([FaturaC->Composicao de Dias])
   Then Return
EndIf

If not IsAssigned(PARAM_DATA_BASE) then PARAM_DATA_BASE="" endif

;-- checa qual a data base para calculo dos vencimentos ------------------------
If [FaturaC->Tipo de Pagamento]<>"O" ; outros
   then
        If PARAM_DATA_BASE="S"
           Then 
                If Not IsAssigned(INICIO_DIALOG) Then INICIO_DIALOG=False EndIf
                If Not IsAssigned(OP_SHOWD)      Then OP_SHOWD=""         EndIf 
                VSD_Data_Base=[FaturaC->Data de Emissao]
           
                Echo Normal
                Echo Off
           
                Showdialog "Data p/ Calculo do Vencimento" Proc "Data_Dialog"
                Trigger "OPEN","ARRIVE"
                Key "TAB","ReverseTab","ENTER","ESC","ClearArea"
                @ 09,19 height 04 width 40
           
                Label  @ 1,03 "Informe a Data:" for "Data_Base"
                Accept @ 1,20  Width 13 "D" picture "#[#].##.##[##]" Tag "Data_Base" to VSD_Data_Base
           
                Enddialog
                Switch
                    Case Retval="ESC":
                         Return
                EndSwitch   
                Mouse Show
                DTBASE=VSD_Data_Base
          Else
                Switch
                  Case IsBlank([FaturaC->Data de Saida])                   : DTBASE=[FaturaC->Data de Emissao]
                  Case [FaturaC->Data de Saida]=[FaturaC->Data de Emissao] : DTBASE=[FaturaC->Data de Emissao]
                  OtherWise:
                    Echo Normal
                    Echo Off
              
                    ShowPopup " Calcular vencimentos sobre " CENTERED
                        "Data de ~E~miss„o" : " Calcula vencimentos sobre data de emiss„o":"EMISSAO",
                        "Data de ~S~aida"   : " Calcula vencimentos sobre data de saida  ":"SAIDA"
                    EndMenu
                  To Opcaoc
              
                    echo off
              
                  If Opcaoc="SAIDA"
                     Then DTBASE=[FaturaC->Data de Saida  ]
                     Else DTBASE=[FaturaC->Data de Emissao]
                  EndIf
                EndSwitch
        EndIf
endif
;-- inicializa‡Æo titulo de credito --------------------------------------------
temcredito=false
vrtitcred =0

;-- Excluir venctos existentes para gerar novos --------------------------------
Moveto "FaturaV"
Home
while true
  if RecordStatus("New")
     then quitloop
  endif   

  delok=true
  if PARAM_TITCRED="T" And 
     [Forma de Pagamento]="TC" and
     ( substr([Numero do Cartao],1,3)="CP-" or substr([Numero do Cartao],1,3)="CR-" ) 
     then temcredito=true
          delok=false
  endif
  if delok
     then unlockrecord
          del
     else skip  
          if eot() then quitloop endif   
  endif        

endwhile

if isblank([FaturaC->Valor DebitoCredito]) or [FaturaC->Valor DebitoCredito]=0 or
   [FaturaC->Tipo de Pagamento]="O" ; outros
   Then Moveto "FaturaC"
        Return
EndIf
      
;-- Soma valores p/ titulo de credito ------------------------------------------
if temcredito            
   then 
        i=0
        Moveto "FaturaV"
        Home
        while true
          if RecordStatus("New")
             then quitloop
          endif   
        
          if PARAM_TITCRED="T" And 
             [Forma de Pagamento]="TC" and
             ( substr([Numero do Cartao],1,3)="CP-" or substr([Numero do Cartao],1,3)="CR-" ) 
             then i=i+1
                  [Sequencia]=AlinhM(StrVal(i),2) ; refaz ordem da sequencia
                  vrtitcred  =vrtitcred+[Valor]
          endif
          skip   
          if eot() then quitloop endif   
        
        endwhile
endif
       
;-- Calcula Numero parcelas na operacao ----------------------------------------
NP            = [FaturaC->Numero de Parcelas] ; np da nota
NPC           = 1                             ; np base da composica
i             = 1                                  
If Not IsBlank([FaturaC->Composicao de Dias])
   Then While True
          pos_s=SearchFrom("/",[FaturaC->Composicao de Dias],i)
          If pos_s=0
             Then QuitLoop
             Else NPC=NPC+1
                  i=pos_s+1
          EndIf
        EndWhile
   Else NPC=0
EndIf

If NPC=0
   Then NP=[FaturaC->Numero de Parcelas]
   Else If NPC=1 And [FaturaC->Numero de Parcelas]>1
           Then NP=[FaturaC->Numero de Parcelas]
           Else NP=NPC
        EndIf
EndIf

;-- inicializa‡Æo da entrada ---------------------------------------------------
VRENTRADA=0
If IsAssigned(VSD_VrEntrada) 
   Then VRENTRADA=VSD_VrEntrada
        release vars VSD_VrEntrada
EndIf

If (PARAM_UTILIZA_ENTRADA="1" Or PARAM_UTILIZA_ENTRADA="2") And VRENTRADA>0
   Then tementrada=True
   Else tementrada=False
endif  
if NP=1 and tementrada Then tementrada=False endIf  
if not tementrada      Then VRENTRADA =0     endif   

;-- Valor base para parcelamentos ----------------------------------------------
vrbaseoperacao=0
if not isblank([FaturaC->Valor DebitoCredito]) and [FaturaC->Valor DebitoCredito]>0
   then vrbaseoperacao=[FaturaC->Valor DebitoCredito]
endif   
if not isblank([FaturaC->Valor DebitoCredito]) and [FaturaC->Valor DebitoCredito]<0
   then vrbaseoperacao=[FaturaC->Valor DebitoCredito]*-1
endif   
VR_NF = vrbaseoperacao

;-- Verifica Novo VR_NF para parcelamentos -------------------------------------
If tementrada
   Then VR_NF = VR_NF-VRENTRADA
EndIf
if temcredito
   then VR_NF = VR_NF-vrtitcred
endif        
If PARAM_TITCRED="T" 
   then VR_NF = VR_NF+[FaturaC->Valor TC]
endif
 
if VR_NF<=0  ; creditos > vrnf
   then Moveto "FaturaC"
        return
endif

;-- Calcula valor da parcela e diferen‡a ---------------------------------------
AUX_NP=NP
If tementrada
   Then AUX_NP=NP-1
EndIf
VRVENCTO     = NDecimal(((VR_NF)/AUX_NP),2)
VRDIFERE     = VR_NF-(VRVENCTO*AUX_NP)

;--O Calcula valor da comissao e diferen‡a -------------------------------------
; calculo de comissao ‚ feito na proc RATEIO_COMISSAO_VENCTOS()
;-------------------------------------------------------------------------------

;-- Gerar parcelas -------------------------------------------------------------
j=1
i=1
While i<=NP
  pos_s=SearchFrom("/",[FaturaC->Composicao de Dias],j)
  If pos_s=0
     Then If i>1
             Then NDIAS=NumVal(SubStr([FaturaC->Composicao de Dias],j,(Len([FaturaC->Composicao de Dias])-(j-1))))
             Else If Not IsBlank([FaturaC->Composicao de Dias])
                     Then NDIAS=NumVal(SubStr([FaturaC->Composicao de Dias],j,Len([FaturaC->Composicao de Dias])))
                     Else NDIAS=0
                  EndIf
          EndIf
     Else NDIAS=NumVal(SubStr([FaturaC->Composicao de Dias],j,pos_s-j))
          j=pos_s+1
  EndIf
  DTVENCTO=DTBASE
  
  While True
    Moveto [Sequencia]
    End
    SEQ = [Sequencia]
    Down
    [Numero da OF     ]=[FaturaC->Numero da OF]

    Moveto [Sequencia]
    Seta_Sequencia(SEQ,False)
    If not IsLockRecord()
       then quitloop
       else Del
    EndIf
  EndWhile

  ;-- calcula ndias e data vencto ----------------------------------------------
  If pos_s=0 And NPC=1 And NP>1
     Then [Numero de Dias   ]=BlankNum()
          If PARAM_DATAS_VENCTOS="F"
             Then DIA_VECTO=Day(DTVENCTO)
                  MES_VECTO=Month(DTVENCTO)
                  ANO_VECTO=Year(DTVENCTO)
                  MES_VECTO=MES_VECTO+i
                  If MES_VECTO>12
                     Then Switch
                            Case MES_VECTO>48 : ANO_AUXILIAR=4
                            Case MES_VECTO>36 : ANO_AUXILIAR=3
                            Case MES_VECTO>24 : ANO_AUXILIAR=2
                            Case MES_VECTO>12 : ANO_AUXILIAR=1
                          EndSwitch
                          MES_VECTO=MES_VECTO-(12*ANO_AUXILIAR)
                          ANO_VECTO=ANO_VECTO+(1*ANO_AUXILIAR)
                  EndIf
                  ;*********** Verificando o Ultimo dia do Mˆs *****************
                  Switch
                    Case NumVal(MES_VECTO)=2 And (NumVal(DIA_VECTO)=29 Or NumVal(DIA_VECTO)=30 Or NumVal(DIA_VECTO)=31) :
                         DIA_VECTO=SubStr(Ultimo_Dia(AlinhM(StrVal(MES_VECTO),2)+StrVal(ANO_VECTO)),1,2)
                    Case NumVal(DIA_VECTO)=31 : DIA_VECTO=SubStr(Ultimo_Dia(AlinhM(StrVal(MES_VECTO),2)+StrVal(ANO_VECTO)),1,2)
                  EndSwitch
                  [Data             ]=DateVal(AlinhM(StrVal(DIA_VECTO),2)+"."+AlinhM(StrVal(MES_VECTO),2)+"."+StrVal(ANO_VECTO))
             Else ;Quando o informar Composi‡Æo de Dias = 0 "Seria como ENTRADA"
                  If NDIAS=0 
                     Then CONT_NDIAS=i-1
                     Else CONT_NDIAS=i
                  EnDIf  
                  If Not IsAssigned(DIAS_NDIAS) Then DIAS_NDIAS=NDIAS EndIf
                  
                  [Numero de Dias   ]=DIAS_NDIAS*CONT_NDIAS
                  [Data             ]=DTVENCTO+(DIAS_NDIAS*CONT_NDIAS)
                  
                  If NDIAS=0 
                     Then DIAS_NDIAS=30
                  EndIf  
          EndIf
     Else [Numero de Dias   ]=NDIAS
          [Data             ]=DTVENCTO+NDIAS
  EndIf  

  ;-- verifica forma de pagamento ----------------------------------------------
  If i=1 And NP>1 And NDIAS=0
     Then [Forma de Pagamento]="DN" 
     Else [Forma de Pagamento]=[FaturaC->Forma de Pagamento]
  EndIf   

  ;-- verifica valores ---------------------------------------------------------
  Switch
    Case i=1 And tementrada  : [Valor            ]=VRENTRADA
                                                   
    Case i<>NP               : [Valor            ]=VRVENCTO

    Case i=NP                : [Valor            ]=VRVENCTO+VRDIFERE
  EndSwitch

;-- Pega dados do cartao -------------------------------------------------------
  If [Forma de Pagamento]="CT" Or
     [Forma de Pagamento]="CD" Or
     [Forma de Pagamento]="CL"
     Then [Nome do Cartao  ]=Nome_Cartao
          [Numero do Cartao]=Numero_Cartao
  EndIf

  UnLockRecord

  i=i+1
EndWhile

Moveto "FaturaC"
Sleep 500

EndProc


;*******************************************************************************
;* Rotina para Criar Ficha do Estoque e Parametros                             *
;*******************************************************************************
Proc Cria_Ficha(ESTQ_EMPRESA,ESTQ_ITEM,ESTQ_CONFIRMA)
Private ESTQ_EMPRESA, ESTQ_ITEM, ESTQ_CONFIRMA, ESTQ_ANO, ESTQ_MES, MSG

;---- Processo p/ utiliza‡Æo de REGRA ------------------------------------------
Verifica_Emissao_Saida([FaturaC->Data de Emissao])
Switch
  Case REGRA_DATA_ESTOQUE = "Antiga" : AUX_DATA = [FaturaC->Data de Saida  ]
                                       If IsBlank(AUX_DATA) Then AUX_DATA=[FaturaC->Data de Emissao] EndIf
  OtherWise                          : AUX_DATA = [FaturaC->Data de Emissao]
EndSwitch
;-------------------------------------------------------------------------------
ESTQ_MES = AlinhM(StrVal(Month(AUX_DATA)),2)
ESTQ_ANO = StrVal(Year(AUX_DATA))

MSG="N„o foi encontrada a ficha de estoque referente a "+ESTQ_MES+"/"+ESTQ_ANO+" !// //"
MSG=MSG+Format("W08,AL","Empresa")   +"| "+Format("W11,AL","Item")   +"//"
MSG=MSG+Format("W08,AL",ESTQ_EMPRESA)+"| "+Format("W11,AL",ESTQ_ITEM)+"//"
MSG=MSG+"Observacoes:                                                           //"
MSG=MSG+"1. Talvez n„o foi executada a transferˆncia de saldos do mˆs anterior; //"
If ESTQ_CONFIRMA
   Then MSG=MSG+"2. Se for criada agora o saldo inicial deste item ser  igual a 0.      //"
        MSG=MSG+"// "
        MSG=MSG+"Deseja cria-la agora ?"
        ConfGeral(MSG)
        If OK="N"
           Then Return False
        EndIf
   Else MSG=MSG+"2. A ficha do item ser  criada com o saldo inicial igual a 0.          //"
        Mensagem(MSG)
EndIf

Moveto "\\Sistemas\\Estoque\\SdEstq"
While True
  Moveto [Codigo da Empresa]
  Locate ESTQ_EMPRESA, ESTQ_ITEM, ESTQ_ANO, ESTQ_MES
  If Not RetVal
     Then End Down
          [Codigo da Empresa   ]=ESTQ_EMPRESA
          [Codigo do Item      ]=ESTQ_ITEM
          [Ano Referencia      ]=ESTQ_ANO
          [Mes Referencia      ]=ESTQ_MES
          If IsLockRecord()
             Then Del
             Else UnLockRecord
          EndIf
          Loop
  EndIf
  QuitLoop
EndWhile

Return True
EndProc  ; (Cria_Ficha)

;*******************************************************************************
;* Aprovacao do Limite de Credito                                              *
;*******************************************************************************
Proc Closed Limite_Credito()
UseVars AutoLib, ErrorProc, SYS_CODIGO_CLIENTE, PARAM_LIMITE_CREDITO,ORDFAT

Private CREDITO_TOTAV, CREDITO_TOTV, NLANCTO, CREDITO_TOTCQ, SOMA_CREDITO,
        CREDITO_LIMITE, CREDITO_DISPONIVEL2, CREDITO_DISPONIVEL1, MSG

Aguarde("Aguarde, Analisando Credito")

;; Titulos a Vencer e Vencidos
CREDITO_TOTAV=0
CREDITO_TOTV =0
CREDITO_TOTCQAC=0
CREDITO_TOTCQSF=0

Moveto "\\Sistemas\\CtaRec\\Duplic"
Moveto [Codigo do Destinatario]
Locate IndexOrder by "IndDup22" [FaturaC->Codigo]
If RetVal
	 Then While [Codigo do Destinatario]=[FaturaC->Codigo]
          If [Saldo do Documento]>0.01
             Then If [Data de Vencimento]>=Today()
                     Then CREDITO_TOTAV=CREDITO_TOTAV+[Saldo do Documento]
                     Else CREDITO_TOTV =CREDITO_TOTV +[Saldo do Documento]
                  EndIf
					EndIf
          Skip
          If EOT() Then QuitLoop EndIf 
          Locate IndexOrder by "IndDup22" Next [FaturaC->Codigo]
          If Not RetVal Then QuitLoop EndIf
				EndWhile
EndIf

;;; Cheques a Descontar
NLANCTO="******"
CREDITO_TOTCQ=0
Moveto "\\Sistemas\\CheqRec\\ChequeI"
Moveto [Codigo_Cliente]
Locate IndexOrder by "IndChI01" [FaturaC->Codigo]
If RetVal
   Then While [Codigo_Cliente]=[FaturaC->Codigo]
          If [Situacao]<>"LIQUIDADO"   And
             [Situacao]<>"EM COBRANCA" And
             [Situacao]<>"EM COBRANCAPGTO" And
             Search("TROCADO",[Situacao])=0     
             Then If [Situacao]="SEM FUNDO"
                     Then CREDITO_TOTCQSF=CREDITO_TOTCQSF+[Valor]
                     Else CREDITO_TOTCQ  =CREDITO_TOTCQ  +[Valor] 
                  EndIf
          EndIf
          If [Situacao]="LIQUIDADO"
             Then Switch
                    Case SYS_CODIGO_CLIENTE="0157" Or
                         SYS_CODIGO_CLIENTE="0130":
                      If [Data Vencimento]>=Today()
			     							 Then CREDITO_TOTCQAC=CREDITO_TOTCQAC+[Valor]
						    			EndIf
                    OtherWise:
                      If [Data Vencimento]>=(Today()-7)
                         Then CREDITO_TOTCQAC=CREDITO_TOTCQAC+[Valor]
                      EndIf    
									EndSwitch
					EndIf				

          Skip
          If EOT() Then QuitLoop EndIf 
          Locate IndexOrder by "IndChI01" Next [FaturaC->Codigo]
          If Not RetVal Then QuitLoop EndIf
        EndWhile
EndIf

Moveto "\\Sistemas\\Cadastro\\FichaCli"
Moveto [Codigo]
Locate [FaturaC->Codigo]
If RetVal
   Then CREDITO_LIMITE=[\Sistemas\Cadastro\FichaCli->Limite de Credito]
   Else CREDITO_LIMITE=0
        Mensagem("Cliente sem limite de credito informado na ficha financeira !")
EndIf

Moveto "FaturaC"
LimpAguarde()

CREDITO_DISPONIVEL1=CREDITO_LIMITE-(CREDITO_TOTAV+CREDITO_TOTV+CREDITO_TOTCQ+CREDITO_TOTCQAC+CREDITO_TOTCQSF)
CREDITO_DISPONIVEL2=CREDITO_DISPONIVEL1-[FaturaC->Valor Nota Fiscal]

If CREDITO_DISPONIVEL2<0
   Then MSG=    "Total Duplicatas Vencidas :"+Format("W10.2,EIC",CREDITO_TOTV)+"//"
        MSG=MSG+"Total Duplicatas a Receber:"+Format("W10.2,EIC",CREDITO_TOTAV)+"//"
        MSG=MSG+"Total Cheques a Descontar :"+Format("W10.2,EIC",CREDITO_TOTCQ)+"//"
        MSG=MSG+"Total Cheques a Compensar :"+Format("W10.2,EIC",CREDITO_TOTCQAC)+"//"
        MSG=MSG+"Total Cheques Sem Fundo   :"+Format("W10.2,EIC",CREDITO_TOTCQSF)+"//"
        MSG=MSG+"        Limite de Credito :"+Format("W10.2,EIC",CREDITO_LIMITE)+"//"
        MSG=MSG+"          Disponibilidade :"+Format("W10.2,EIC",CREDITO_DISPONIVEL1)+"//"
        MSG=MSG+"Compra Atual: "+Format("W10.2,EIC",[FaturaC->Valor Nota Fiscal])
        MSG=MSG+"  =  Indisponibilidade: "+Format("W10.2,EIC",CREDITO_DISPONIVEL2)
        If PARAM_LIMITE_CREDITO="P"
           Then Libera_Bloqueio(MSG)
                If Ok="S"
                   Then Grava_LogEx("BIB_TRO LibCred")
                        Return True
                   Else Return False
                EndIf
           Else Mensagem(MSG)
                Return False
        EndIf
   Else Return True
EndIf

EndProc    ;  (Limite_Credito)

;*******************************************************************************
;* Verificacao Maximo de Dias de Atraso                                        *
;*******************************************************************************
Proc Closed Dias_Atraso()
UseVars AutoLib, ErrorProc

Private CREDITO_TOTAV, CREDITO_TOTV, DIAS_ATRASO, MSG

Aguarde("Aguarde, Analisando Documentos c/ Dias Atrasados")

;; Titulos a Vencer e Vencidos
CREDITO_TOTAV  = 0
CREDITO_TOTV   = 0
DIAS_ATRASO    = 0

UnLockRecord
FormKey
LockRecord

Moveto "\\Sistemas\\Cadastro\\FichaCli"
Moveto [Codigo]
Locate [FaturaC->Codigo]
If Not RetVal
   Then Mensagem("Cliente sem n§ dias p/ atraso informado na ficha financeira !")
   Else DIAS_ATRASO=[Maximo Dias Atraso]
        If DIAS_ATRASO<=0
           Then MSG="Cliente sem n§ dias p/ atraso informado na ficha financeira !// //"
        EndIf
EndIf

Moveto "\\Sistemas\\Ctarec\\Duplic"
Moveto [Codigo do Destinatario]
Locate IndexOrder by "IndDup22" [FaturaC->Codigo]
If RetVal
	 Then While [Codigo do Destinatario]=[FaturaC->Codigo]
				 If [Saldo do Documento]>0.01
						Then If [Data de Vencimento]>=Today()
										Then CREDITO_TOTAV=CREDITO_TOTAV+[Saldo do Documento]
										Else If (Today()-[Data de Vencimento])>=DIAS_ATRASO
														Then CREDITO_TOTV =CREDITO_TOTV +[Saldo do Documento]
														Else CREDITO_TOTAV=CREDITO_TOTAV+[Saldo do Documento]
												 EndIf
								 EndIf
					EndIf
          Skip
          If EOT() Then QuitLoop EndIf 
          Locate IndexOrder by "IndDup22" Next [FaturaC->Codigo]
          If Not RetVal Then QuitLoop EndIf
				EndWhile
EndIf
Moveto "FaturaC"
FormKey

LimpAguarde()

If CREDITO_TOTV > 0
   Then MSG=Completa("Maximo de Dias de Atraso..:"+Format("W10",DIAS_ATRASO),38," ")+"//"
        MSG=MSG+"Duplicatas com Dias Atraso:"+Format("W10.2,EIC",CREDITO_TOTV)+"//"
        MSG=MSG+"Duplicatas a Receber      :"+Format("W10.2,EIC",CREDITO_TOTAV)+"//"
        MSG=MSG+"Total Duplicatas a Receber:"+Format("W10.2,EIC",CREDITO_TOTAV+CREDITO_TOTV)
        Mensagem(MSG)
        Return False
   Else Return True
EndIf

EndProc   ; (Dias_Atraso)

;*******************************************************************************
;* Checa Caixa                                                                 *
;*******************************************************************************
Proc Verifica_Caixa(empresa)
private empresa, reg_p_troca, reg_conta

GetRecord "\\Sistemas\\Vendas\\P_Troca" empresa To reg_p_troca
if retval
   then GetRecord "\\Sistemas\\Ctacor\\Conta" reg_p_troca["Codigo_Conta_Caixa"] To reg_conta
        if retval
           then return true
           else MENSAGEM("Conta Caixa: "+reg_p_troca["Codigo_Conta_Caixa"]+", Paramˆtro Troca n„o cadastrada !")
                return false
        endif   
   else MENSAGEM("Paramˆtro Troca Empresa: "+empresa+", n„o cadastrado !")
        return false
endif
EndProc

;*******************************************************************************
;* Atualizacao de Cheques                                                      *
;*******************************************************************************
Proc CHEQUES()
Private NUMEROL, EXISTE_CHEQUE_LIQUIDADO, primeiravez

while true

  Aguarde("Efetuando Estorno CHEQUES TERCEIROS "+Opcaoc+" "+NOTAFISC)

  NUMEROL=""
  Moveto "\\Sistemas\\CheqRec\\ChequeC"
  Moveto [Codigo da Empresa]
  Locate IndexOrder by "Indchc01" [NotaC->Codigo da Empresa],[NotaC->Tipo do Documento],[NotaC->Numero do Documento]
  if retval
    then NUMEROL=[Numero do Lancamento]
    else Moveto [Observacao do Lancamento]
         Locate "REF. "+[NotaC->Codigo da Empresa]+"/"+[NotaC->Tipo do Documento]+"/"+[NotaC->Numero do Documento]
         if retval
            then NUMEROL=[Numero do Lancamento]
         endif
  endif      
    
  if not isblank(NUMEROL)
     then
          EXISTE_CHEQUE_LIQUIDADO=false
     
         Moveto "\\Sistemas\\CheqRec\\ChequeI"
         Moveto [Numero do Lancamento]
         Locate NUMEROL
         If RetVal
            Then While [Numero do Lancamento]=NUMEROL
  
                   If [Situacao]<>"EM ABERTO"
                      Then EXISTE_CHEQUE_LIQUIDADO=True
                           quitloop
                   EndIf
                   
                   Skip
                   If EOT() Then QuitLoop EndIf
                 EndWhile
         EndIf
         
         if EXISTE_CHEQUE_LIQUIDADO
            then
                 MSG="J  existem cheques movimentados para esta Nota.//"
                 MSG=MSG+"Os cheques n„o podem ser estornados.//"
                 MSG=MSG+"Verificar no Lan‡amento de Cheques Ok !//"
                 MSG=MSG+"Lan‡amento: "+StrVal(NUMEROL)+" - "+SubStr([\Sistemas\CheqRec\ChequeC->Observacao do Lancamento],1,20)
                 Mensagem(MSG)
                 
                 quitloop
         endif
         
         Moveto "\\Sistemas\\CheqRec\\ChequeI"
         Moveto [Numero do Lancamento]
         Locate NUMEROL
         If RetVal
            Then While [Numero do Lancamento]=NUMEROL
                   del
                   If EOT() Then QuitLoop EndIf
                 EndWhile
         EndIf
         
         Moveto "\\Sistemas\\CheqRec\\ChequeC"
         Del
  endif

  Aguarde("Atualizando CHEQUES TERCEIROS "+Opcaoc+" "+NOTAFISC)

  primeiravez=true

  Moveto "NotaV"
  Moveto [Codigo da Empresa]
  Locate [NotaC->Codigo da Empresa],[NotaC->Numero do Documento],[NotaC->Serie do Documento]
  If Not RetVal
     Then quitloop            
  EndIf
  
  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 ([forma de pagamento]="CH" or [forma de pagamento]="CP") and Not IsBlank([Numero_Cheque])
       then
            if primeiravez
               then primeiravez=false
               
                    Moveto "\\Sistemas\\CheqRec\\ChequeC"
                    While True
                      End
                      Moveto [Numero do Lancamento]
                      If Numero_Lancamento("Interno","Locked_Down")
                         Then NUMEROL = PROXLANCTO_NLANC
                              Release Vars PROXLANCTO_NLANC
                              quitloop
                      EndIf    
                    EndWhile

                   ;While True
                   ;  Moveto [Numero do Lancamento]
                   ;  End
                   ;  If Numero_Lancamento("Interno","")
                   ;     Then NUMEROL = PROXLANCTO_NLANC
                   ;          Release Vars PROXLANCTO_NLANC
                   ;  EndIf
                   ;  Locate NUMEROL
                   ;  If Not Retval
                   ;     Then End Down
                   ;          [Numero do Lancamento ]=NUMEROL
                   ;          If Not IsLockRecord()
                   ;             Then QuitLoop
                   ;             Else Del
                   ;          EndIf
                   ;  EndIf
                   ;EndWhile
             
                   [Codigo da Empresa       ]=[NotaC->Codigo da Empresa       ]
                   [Data de Entrada         ]=[NotaC->Data de Emissao         ]
                   [Codigo                  ]=[NotaC->Codigo                  ]
                   [Codigo do Representante ]=[NotaC->Codigo do Representante ]
                   [Observacao do Lancamento]="REF. "+[NotaC->Codigo da Empresa]+"/"+[NotaC->Tipo do Documento]+"/"+[NotaC->Numero do Documento]
        
                   [Sistema Gerador         ]=[NotaC->Sistema Gerador         ]
                   [Tipo Docto Gerador      ]=[NotaC->Tipo do Documento       ]
                   [Numero Docto Gerador    ]=[NotaC->Numero do Documento     ]
                   [Serie Docto Gerador     ]=[NotaC->Serie do Documento      ]
                   [Numero_Carregamento_Orig]=[NotaC->Numero_Carregamento     ]
                   [Valor Total             ]=0
                   Controle_Dia()
                   UnLockRecord
                   
                   Moveto "NotaC"
                   [Numero Lancamento Cheque]=NUMEROL
                   UnLockRecord

            endif
            
            Moveto "\\Sistemas\\CheqRec\\ChequeI"
            Moveto [Numero do Lancamento]
            Locate NUMEROL, NumVal([NotaV->Sequencia])
            If Not RetVal
               Then End
                    Down
                    [Numero do Lancamento]=NUMEROL
                    [Sequencia do Cheque ]=NumVal([NotaV->Sequencia])
                    [Codigo_Banco        ]=[NotaV->Codigo_Banco   ]
                    [Agencia             ]=[NotaV->Agencia        ]
                    [Numero_Conta        ]=[NotaV->Numero_Conta   ]
                    [Numero_Cheque       ]=[NotaV->Numero_Cheque  ]
                    [CPF                 ]=[NotaV->CPF            ]
                    [Tipo_Emitente       ]=[NotaV->Tipo_Emitente  ]
                    [Titular_Cheque      ]=[NotaV->Titular_Cheque ]
                    [Cidade              ]=[NotaV->Cidade         ]
                    [UF                  ]=[NotaV->UF             ]
                    [Data Vencimento     ]=[NotaV->Data           ]
                    [Valor               ]=[NotaV->Valor          ]
                    [Observacao do Cheque]=[NotaV->Observacao     ]
                    [Codigo CMC7         ]=[NotaV->Codigo CMC7    ]
                    
                    [Sistema Origem      ]=[NotaC->Sistema Gerador     ]
                    [Tipo do Documento   ]=[NotaC->Tipo do Documento   ]
                    [Numero do Documento ]=[NotaC->Numero do Documento ]
                    [Codigo_Cliente      ]=[NotaC->Codigo              ]
                    [Data_Entrada        ]=[NotaC->Data de Emissao     ]
                    [Situacao            ]="EM ABERTO"
                    
                    [Codigo da Conta     ]=CX_CONTA_CAIXA
                    [Codigo da Empresa   ]=[NotaC->Codigo da Empresa       ]
                    Controle_Dia()
                    UnLockRecord
                    
                    Moveto "\\Sistemas\\CheqRec\\ChequeC"
                    [Valor Total         ]=[Valor Total  ]+[NotaV->Valor   ]
                    UnLockRecord
            EndIf
    endif

    moveto "NotaV"
    skip
    if eot() then quitloop endif
  endwhile

  quitloop
endwhile

Moveto "FaturaC"

EndProc    ;  (Cheques)

;*******************************************************************************
;* Rotina para Checar Comissao/Descto                                          *
;*******************************************************************************
Proc Checa_SPC()
Private NomeCampo,Retorno,DATA_SPC,BLOQUEIA_SPC

Retorno=True
NomeCampo=Field()
BLOQUEIA_SPC=False

UnLockRecord
FormKey
LockRecord

Moveto "\\Sistemas\\Cadastro\\FichaCli" 
Moveto [Codigo]
Locate [\Sistemas\Vendas\FaturaC->Codigo]
If RetVal
   Then DATA_SPC=[Data_Ultima_Consulta]
        If DATA_SPC=BlankDate() Or
           DATA_SPC+PARAM_NBLOQUEIO_SPC <= Today()
           Then BLOQUEIA_SPC=True
        EndIf   
   Else DATA_SPC=BlankDate()
        BLOQUEIA_SPC=True          
EndIf

If BLOQUEIA_SPC
   Then If DATA_SPC<>BlankDate()
           Then DATA_SPC=         "Efetuar uma nova consulta no SPC!//"
                DATA_SPC=DATA_SPC+"Ultima Consulta: "+SubsTr(StrVal([Data_Ultima_Consulta]),1,2)+"/"
                DATA_SPC=DATA_SPC+                    SubsTr(StrVal([Data_Ultima_Consulta]),4,2)+"/"
                DATA_SPC=DATA_SPC+                    SubsTr(StrVal([Data_Ultima_Consulta]),7,4)
           Else DATA_SPC=         "Efetuar uma consulta no SPC!//"
                DATA_SPC=DATA_SPC+"N„o consta nenhuma data de consulta deste cliente!"
        EndIf            
        If Not IsAssigned(MSG_SPC)
           Then MSG=    "Opera‡„o Bloqueada!//"
                MSG=MSG+DATA_SPC
                Libera_Bloqueio(MSG)
                If Ok="S"
                   Then Grava_LogEx("BIB_TRO BloqDSPC")
                   Else Retorno=False
                EndIf
           Else Mensagem(DATA_SPC)     
        EndIf
EndIf

Moveto "FaturaC"
FormKey

Moveto Field NomeCampo
Return Retorno
EndProc

;*******************************************************************************
;* Rotina para Calcular Numero de Linhas Conforme Descricao do Item            *
;*******************************************************************************
Proc Closed Calc_NLinhas_Descricao()
UseVars AutoLib, ErrorProc, VSD_I_Descricao_Item, PARAM_TAMANHO_DESCR, MSG_NUMERO_LINHAS

Private Numero_de_Linhas

MSG_NUMERO_LINHAS=StrVal(Len(VSD_I_Descricao_Item))+"C/"+StrVal(PARAM_TAMANHO_DESCR)+"TL= "
Numero_de_Linhas=Int(Len(VSD_I_Descricao_Item)/PARAM_TAMANHO_DESCR)
If (Len(VSD_I_Descricao_Item)/PARAM_TAMANHO_DESCR)>Numero_de_Linhas
   Then Numero_de_Linhas=Numero_de_Linhas+1
EndIf
MSG_NUMERO_LINHAS=MSG_NUMERO_LINHAS+StrVal(Numero_de_Linhas)+" Linha(s)"
EndProc

;******************************************************************************
;** Monta Procedures                                                        ***
;******************************************************************************
WriteLib "\\Sistemas\\Vendas\\Bib_Tro"
         Checagem_Pagina1, Calc_NLinhas_Descricao, CALC_OF,
         CALC_VENCTOS, Cria_Ficha, Limite_Credito, Dias_Atraso, Verifica_Caixa,
         CHEQUES, PEGA_PRECO, Rateio_BC_Itens, Checa_SPC,
         Calcular_Vencimentos, Data_Dialog
