;** FT_DESF ********************************************************************
;*  Cancela/Desfaz Nota Fiscal Fatura/Nota/Entrada e Financeiro                *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 03/05/2011 por Karina Andrade 
;Ultima Alteracao: 12/05/2011 por Karina Andrade
;Motivo Alteracao: Add Estorno para Cancelamento p/ FATURA/BALCAO/TROCA    
;Ultima Alteracao: 10/06/2011 por Karina Andrade
;Motivo Alteracao: Add Estorno para Est_Cx_Duplic "SAIDAS"    
;Ultima Alteracao: 09/11/2011 por Karina Andrade
;Motivo Alteracao: Ajustes CHEQUES()
;Ultima Alteracao: 04/01/2012 por Karina Andrade
;Motivo Alteracao: Ajustes Situacao_Pedido_Orcamento()
;Ultima Alteracao: 12/06/2012 por Karina Andrade
;Motivo Alteracao: Ajustes Proc CHEQUES() para Est_CHEQUES()
;Ultima Alteracao: 23/08/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes controle de tabela abertas no sistema                     
;Ultima Alteracao: 12/09/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Do_It e voltar a CoeditKey Est_Transf_Troca()                               
;Ultima Alteracao: 17/09/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes otimiza‡Æo de rotinas                                                   
;Ultima Alteracao: 29/11/2013 por Kamila Gomes
;Motivo Alteracao: Ajustes Notas Denegadas e Cancelamento Extemporaneo
;Ultima Alteracao: 16/12/2013 por Karina Andrade
;Motivo Alteracao: Ajustes variavel SITUACAO
;Ultima Alteracao: 17/12/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Est_PedidoEF() localiza‡Æo do pedido                      
;Ultima Alteracao: 23/01/2014 por Bruno/Andrey
;Motivo Alteracao: Ajustes Est_Cx_Duplic, vari vel DESTINO
;Ultima Alteracao: 19/02/2014 por Andrey Fillipe
;Motivo Alteracao: Alterado na Proc Est_Cheques() (Observacao p/ Observacao do Cheque)
;Ultima Alteracao: 22/05/2015 por Kamila Gomes
;Motivo Alteracao: Alterado na Proc Est_Cx_Duplic() Venda a Vista no Cartao
;Ultima Alteracao: 30/11/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Inclusao Est_Cx_Titul                      
;Ultima Alteracao: 06/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes chamada Verifica_Caixa(empresa)                       
;Ultima Alteracao: 07/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: exclusao referencia ao campo INSS
;Ultima Alteracao: 10/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes atualizacao a receber/pagar/caixa              
;Ultima Alteracao: 21/12/2015 por Kamila Gomes
;Motivo Alteracao: Ajustes Desfazer NotaICom              
;Ultima Alteracao: 31/12/2015 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes estorno financeiro                             
;Ultima Alteracao: 05/01/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes getp_titulo() em Carrega_Parametros()
;Ultima Alteracao: 01/04/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Compra Sucata PRALUM 
;Ultima Alteracao: 20/04/2016 por Kamila Gomes
;Motivo Alteracao: Alterada Faticom e Notaicom para FaturICM e  NotaICM                          
;Ultima Alteracao: 08/07/2016 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Est_Cheques()
;Ultima Alteracao: 13/07/2016 por Bruno Carvalho
;Motivo Alteracao: Sintaxe Erro na proc Est_Cheques() -> moveto ntable() 
;Ultima Alteracao: 08/02/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes lockrecord  
;Ultima Alteracao: 06/03/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado REQ_TRANSF_DEVOLUCAO() -> Processo p/ desfazer requisi‡Æo de devolu‡Æo #0294#         
;Ultima Alteracao: 15/03/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes exclusÆo rotinas controle de pecas
;Ultima Alteracao: 28/03/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Adicionado Do_IT! e CoEditKEy ao iniciar o programa, problema estava ocorrendo ao cancelar duas notas seguidas
;Ultima Alteracao: 28/03/2017 por Bruno Carvalho          
;Motivo Alteracao: Adicionado processo p/ quando itens do pedido agrupado no faturamento -> Est_Pedido_Orcamento(), 
;                  itens com a composi‡Æo de dias contendo [*AGRUPADO*]
;Ultima Alteracao: 20/04/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Metal Minas                                
;Ultima Alteracao: 10/07/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado processo para CANCELAR automaticamente expedi‡äes quando for EXPEDICAO DE OF
;Ultima Alteracao: 11/07/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado Justificativa_Cancelamento()
;Ultima Alteracao: 13/07/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustado "NotaCF" -> "NotaR" na proc Est_Cupom() e adicionado na condi‡Æo [Modelo_Documento]="2C"
;Ultima Alteracao: 14/07/2017 por Bruno Carvalho
;Motivo Alteracao: Removido "NotaOcp"
;Ultima Alteracao: 28/07/2017 por Bruno Carvalho
;Motivo Alteracao: Foi removido o campo [Composicao de Dias] onde amarzenava um controlador p/ estornar pedidos agrupados -> [*AGRUPADO*]
;                  Adicionado um campo [Item do Pedido Agrupado] onde se tornou este controlador, substituindo o controlador citado
;Ultima Alteracao: 04/09/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustado nome de procs referente a JUSTIFICATIVA DE CANCELAMENTO p/ nÆo colidir com outras procs do sistema
;Ultima Alteracao: 11/09/2017 por Bruno Carvalho
;Motivo Alteracao: Ajustes Est_Justificativa_Cancelamento()
;Ultima Alteracao: 06/11/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: ajustes mensagem cancelamento
;Ultima Alteracao: 03/01/2018 por Bruno Carvalho
;Motivo Alteracao: Ajustes Est_Justificativa_Cancelamento() ao tentar cancelar/des-cancelar/cancelar novamente
;Ultima Alteracao: 08/06/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: ajustes desabilitar transferencia divina panela
;Ultima Alteracao: 28/06/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes TC saida/devolucao          
;Ultima Alteracao: 17/09/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes pedido faturado 0388         
;Ultima Alteracao: 26/12/2018 por Bruno Carvalho
;Motivo Alteracao: Adicionado SaveTables -> Est_Pedido_Orcamento()
;Ultima Alteracao: 28/12/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Adicionado processos de #0427#
;Ultima Alteracao: 08/01/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes cancelar duplicatas nÆo geradas automaticas !!
;Ultima Alteracao: 23/04/2019 por Bruno Carvalho
;Motivo Alteracao: Adicionado processos de #0388# para #0429#
;Ultima Alteracao: 23/04/2019 por Bruno Carvalho
;Motivo Alteracao: Adicionado PARAM_PONTOS_ROTINA="ESTORNA_RESGATE" -> Play "FT_PONTO"    
;Ultima Alteracao: 06/09/2019 por Bruno Carvalho                           
;Motivo Alteracao: Adicionado processo p/ atualizar/estonar resgate de pontos -> "FT_GRP"

TAB_Ref=Table()
;-- Opera‡Æo s¢ para Compra ----------------------------------------------------
If Tab_Ref = "Faturac"
   Then If ( sys_codigo_Cliente="0377" or sys_codigo_Cliente="0395" ) And
           [FaturaC->Tipo Movimento Estoque]="E" And
           Search("COMPRA",[FaturaC->Descricao da Destinacao])>0 And
           Search("SUCATA",[FaturaC->Descricao da Destinacao])>0
           Then Play "FT_EDESF"
                return
        EndIf   
EndIf   

;*******************************************************************************
;* Rotina p/ Estornar Movimenta‡Æo                                             *
;*******************************************************************************
Proc Estornar()
Private wi, ofok, dtdocto

Moveto "NotaC"
Moveto [Codigo da Empresa]
Locate EMPRESAFISC, NOTAFISC, SERIEFISC
If Not RetVal 
   Then Mensagem("NÆo existe registro a processar!//Opera‡Æo nÆo realizada !")
        Return
   Else If IsLockRecord() 
          Then Mensagem("Opera‡Æo nÆo realizada !")
               Return
        EndIf       
EndIf
dtdocto=[Data de Emissao]

DESTIN_ATUALIZA_PEDIDOS=""
DP_GERA_DUPLICATA      =""

GetRecord "\\Sistemas\\Vendas\\Destin" [NotaC->Codigo da Destinacao] To REG_BUSCA_LOOKUP
If RetVal
   Then DESTIN_ATUALIZA_PEDIDOS=REG_BUSCA_LOOKUP["Atualiza Pedidos"]
        DP_GERA_DUPLICATA      =REG_BUSCA_LOOKUP["Gera Duplicata"]
EndIf

If PEDIDOEF Or
   (PARAM_PEDIDO="S" And DESTIN_ATUALIZA_PEDIDOS="S")
    Then {TableAdd} {\\Sistemas\\Vendas\\PedidoI}
         {TableAdd} {\\Sistemas\\Vendas\\PedidoC}
         {TableAdd} {\\Sistemas\\Vendas\\PedidoV}
EndIf
If PARAM_ORCAMENTO="S"
   Then {TableAdd} {\\Sistemas\\Vendas\\OrcaI}
        {TableAdd} {\\Sistemas\\Vendas\\OrcaC}
EndIf        
{TableAdd} {\\Sistemas\\Vendas\\NotaR}
If Tab_Ref="Notac"
   Then {TableAdd} {\\Sistemas\\Vendas\\FaturaC}
EndIf   
If TRANSF or TROCA
   Then {TableAdd} {\\Sistemas\\Estoque\\NotaEC}
        {TableAdd} {\\Sistemas\\Estoque\\NotaEI}
EndIf

Estornar_Itens()
If CHEQUES
  Then Est_CHEQUES()
EndIf
If TRANSF or TROCA
 Then Est_Transf_Troca()
EndIf 
Est_Cx_Duplic()
Est_Cupom()
If PEDIDOEF
  Then Est_PedidoEF()
EndIf

If REQ_TRANSF_DEVOLUCAO("VERIFICA")  
   Then {TableAdd} {\\Sistemas\\Estoque\\Requisit}
        {TableAdd} {\\Sistemas\\Estoque\\RqCabeca}
        {TableAdd} {\\Sistemas\\Estoque\\Rqitem}
        
        REQ_TRANSF_DEVOLUCAO("DEVOLUCAO")
EndIf

Switch
  Case TIPO="DESFAZER":
    For wi From 1 to 7
    
      Switch
        Case wi=1 : Moveto "NotaI"
        Case wi=2 : Moveto "NotaV"
        Case wi=3 : Moveto "NotaR"
        Case wi=4 : Moveto "NotaIC"
        Case wi=5 : Moveto "NotaIDD"
        Case wi=6 : Moveto "NotaIAD"
        Case wi=7 : Moveto "NotaICM" 
      EndSwitch
      Home
      Moveto [Codigo da Empresa]
      Locate EMPRESAFISC, NOTAFISC, SERIEFISC
      If RetVal
        Then While [Codigo da Empresa  ]= EMPRESAFISC And
                   [Numero do Documento]= NOTAFISC    And
                   [Serie do Documento ]= SERIEFISC
                   Del
             EndWhile
      EndIf       
    EndFor

    Moveto "NotaC"
    Del

    ;; Fatura
    Moveto "FaturaC"
    [Numero Nota Gerada      ]=""
    [Docto Nota Gerada       ]=""
    [Serie Nota Gerada       ]=""
    [Sistema Gerador         ]=""
    unlockrecord

  Case TIPO="CANCELAR":
    Moveto "NotaC" 
    [Situacao                 ] = "C"
    If Tab_Ref = "Faturac"
       Then [Observacao na Nota Fiscal] = [FaturaC->Observacao na Nota Fiscal]
    EndIf   
    
    Switch
      Case SITUACAO="DENEGAR"      : [Sistema Gerador]="DN"
      Case SITUACAO="EXTEMPORANEO" : [Sistema Gerador]="EX"
    EndSwitch  
    UnLockRecord

    If Tab_Ref="Notac"
       Then 
            ofok=false
            Moveto "\\Sistemas\\Vendas\\FaturaC"
            Moveto [Numero Nota Gerada]
            locate NOTAFISC
            if retval
               then while true
                      If [FaturaC->Codigo da Empresa  ]=EMPRESAFISC And
                         [FaturaC->Numero Nota Gerada ]=NOTAFISC    And
                         [FaturaC->Serie Nota Gerada  ]=SERIEFISC
                          Then ORDFAT=[FaturaC->Numero da OF]
                               PARAM_PONTOS_ROTINA="ESTORNA_RESGATE"
                               Play "FT_PONTO" 
                               
                               Moveto "FaturaC"
                               [Sistema Gerador          ] = "C"
                               [Observacao na Nota Fiscal] = [NotaC->Observacao na Nota Fiscal]
                               UnLockRecord
                               QuitLoop
                      EndIf
                      
                      skip
                      if eot() then quitloop endif
                      
                      Locate Next NOTAFISC
                      
                    Endwhile
            endif
       Else ORDFAT=[FaturaC->Numero da OF]
            PARAM_PONTOS_ROTINA="ESTORNA_RESGATE"
            Play "FT_PONTO" 
             
            Moveto "FaturaC"
            [FaturaC->Sistema Gerador          ] = "C"
            [FaturaC->Observacao na Nota Fiscal] = [NotaC->Observacao na Nota Fiscal]
            UnLockRecord 
    EndIf                           

EndSwitch
Do_It!
SaveTables

If PEDIDOEF Or  
   (PARAM_PEDIDO="S" And DESTIN_ATUALIZA_PEDIDOS="S")
    Then MoveTo "\\Sistemas\\Vendas\\PedidoI" ClearImage
         MoveTo "\\Sistemas\\Vendas\\PedidoC" ClearImage
         MoveTo "\\Sistemas\\Vendas\\PedidoV" ClearImage
EndIf    
If PARAM_ORCAMENTO="S"
   Then MoveTo "\\Sistemas\\Vendas\\OrcaI"   ClearImage
        MoveTo "\\Sistemas\\Vendas\\OrcaC"   ClearImage
EndIf
Moveto "\\Sistemas\\Vendas\\NotaR" ClearImage
If Tab_Ref="Notac"
   Then MoveTo "\\Sistemas\\Vendas\\FaturaC"   ClearIMage
EndIf   
If TRANSF or TROCA
   Then Moveto "\\Sistemas\\Estoque\\NotaEC"   ClearImage
        Moveto "\\Sistemas\\Estoque\\NotaEI"   ClearImage
EndIf

If REQ_TRANSF_DEVOLUCAO("VERIFICA")  
   Then Moveto "\\Sistemas\\Estoque\\Requisit" ClearImage
        Moveto "\\Sistemas\\Estoque\\RqCabeca" ClearImage
        Moveto "\\Sistemas\\Estoque\\Rqitem"   ClearImage
EndIf

Moveto Tab_Ref
CoeditKey

if year(dtdocto)<year(today()) or
   ( month(dtdocto)<month(today()) and year(dtdocto)=year(today()) )
   then msg=    "Opera‡Æo Finalizada!// //"
        msg=msg+"* Devido a data deste documento ser referente a mˆs anterior,//"
        msg=msg+"  ser  necess rio que vocˆ reprocesse  o  estoque  at‚  hoje,//"
        msg=msg+"  para que o saldos dos mesmos fiquem corretos !             "
        Mensagem(msg)
   else 
        Mensagem("Opera‡Æo Finalizada!")
endif

EndProc ; Estornar()

;*******************************************************************************
;* Exclusao do Item                                                            *
;*******************************************************************************
Proc Estornar_Itens()
Private NLANCPC, NUMREF

Moveto "NotaI"
Moveto [Codigo da Empresa]
Locate EMPRESAFISC, NOTAFISC, SERIEFISC
If RetVal
 Then While [Codigo da Empresa  ]= EMPRESAFISC And
            [Numero do Documento]= NOTAFISC    And
            [Serie do Documento ]= SERIEFISC  
           
        Est_Estoque()
        Est_Pedido_Orcamento()

        Skip       
        If EOT() Then QuitLoop EndIf
    EndWhile
EndIf        

If (PARAM_ORCAMENTO="S") Or
   (PARAM_PEDIDO   ="S" And DESTIN_ATUALIZA_PEDIDOS="S")
   Then If (Not IsBlank([NotaC->Numero do Pedido       ])  Or Not IsBlank([NotaC->Numero do Orcamento  ]))
           Then
                Moveto "NotaI"
                Home
                Moveto [Codigo da Empresa]
                Locate EMPRESAFISC, NOTAFISC, SERIEFISC
                If RetVal
                 Then NUMREF="***"
                      While [Codigo da Empresa  ]= EMPRESAFISC And
                            [Numero do Documento]= NOTAFISC    And
                            [Serie do Documento ]= SERIEFISC  
                        
                        If [Numero Pedido_Orcamento]<>NUMREF
                           Then NUMREF=[Numero Pedido_Orcamento]
                                Est_Situacao_Pedido_Orcamento()
                        EndIf        
                
                        Skip       
                        If EOT() Then QuitLoop EndIf
                    EndWhile
                EndIf        
        EndIf        
EndIf        

EndProc     ;  (Estornar_I)    

;*******************************************************************************
;* Rotina Atualizacao do Estoque                                              **
;*******************************************************************************
Proc Est_Estoque()
Private MES_EST, ANO_EST 

Aguarde("Efetuando Estorno ESTOQUE "+NOTAFISC)

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

If [NotaC->Atualiza Estoque]<>"S" Or
   IsBlank([NotaI->Codigo do Item]) Or
   [NotaI->Tipo do Item]="C" Or [NotaI->Tipo do Item]="D" Or [NotaI->Tipo do Item]="F" Or
   [NotaI->Tipo do Item]="G" Or [NotaI->Tipo do Item]="H" Or [NotaI->Tipo do Item]="I"
   Then Return 
EndIf   

While True
  Moveto "\\Sistemas\\Estoque\\SdEstq"
  Locate [NotaC->Codigo da Empresa],
         [NotaI->Codigo do Item   ], ANO_EST, MES_EST
  If Not IsLockRecord()
     Then QuitLoop
  EndIf
EndWhile

Switch
 Case [NotaC->Tipo Movimento Estoque]="E":
      [Saldo Atual      ] = NDecimal([Saldo Atual]-[NotaI->Quantidade],3)
      [Custo Total Atual] = NDecimal([Custo Total Atual]-([NotaI->Custo Medio Unitario]*[NotaI->Quantidade]),2)
 Case [NotaC->Tipo Movimento Estoque]="S":
      [Saldo Atual      ] = NDecimal([Saldo Atual]+[NotaI->Quantidade],3)
      [Custo Total Atual] = NDecimal([Custo Total Atual]+NDecimal(([NotaI->Custo Medio Unitario]*[NotaI->Quantidade]),2),2)
EndSwitch

If ([Custo Total Atual]/[Saldo Atual])>0
   Then [Ultimo Custo Atual]=NDecimal([Custo Total Atual]/[Saldo Atual],5)
EndIf
UnLockRecord

Moveto "NotaI"
EndProc   ; (Estoque)

;*******************************************************************************
;* Atualiza Quantidade Faturada do Pedido ou Orcamento                         *
;*******************************************************************************
Proc Est_Pedido_Orcamento()

Aguarde("Efetuando Estorno PEDIDO "+NOTAFISC)

;Em 28/07/2017 foi removido o campo [Composicao de Dias] onde amarzenava um controlador p/ estornar pedidos agrupados -> [*AGRUPADO*]
;Foi adicionado um campo [Item do Pedido Agrupado] onde se tornou este controlador, substituindo o controlador citado
If (PARAM_ORCAMENTO="S") Or
   (PARAM_PEDIDO   ="S" And DESTIN_ATUALIZA_PEDIDOS="S")
   Then If (Not IsBlank([NotaC->Numero do Pedido       ])  Or Not IsBlank([NotaC->Numero do Orcamento])) 
           And 
           (Not IsBlank([NotaI->Numero Pedido_Orcamento]) And 
           (Not IsBlank([NotaI->Item Pedido_Orcamento]) Or [NotaI->Item do Pedido Agrupado]="S"))
           Then If PARAM_PEDIDO="S" And Not IsBlank([NotaC->Numero do Pedido])
                   Then Moveto "\\Sistemas\\Vendas\\PedidoI"
                        Moveto [Numero do Pedido]
                   Else Moveto "\\Sistemas\\Vendas\\OrcaI"
                        Moveto [Numero do Orcamento]
                EndIf
      
                While True
                  If [NotaI->Item do Pedido Agrupado]="S" And Search("PEDIDOI",Upper(Table()))>0 
                     Then Locate [NotaI->Numero Pedido_Orcamento]
                          If RetVal
                             Then AGRUPA_PEDIDO = True
                                  While [NotaI->Numero Pedido_Orcamento]=[Numero do Pedido]
                                    If [NotaI->Codigo do Item]=[Codigo do Item] And [Quantidade Faturada]>0
                                       Then QTD_NOTA      = [NotaI->Quantidade]
                                            While QTD_NOTA > 0 
                                              AUX_ITEM_PED = [Item do Pedido]
                                              If [NotaI->Codigo do Item]=[Codigo do Item] And 
                                                 NumVal([NotaI->Preco Unitario])=NumVal([Preco Unitario])
                                                 Then If islockrecord() Then AGRUPA_PEDIDO = False QuitLoop Endif
                                                      If [Quantidade Faturada] - QTD_NOTA >= 0
                                                         Then AUX_QTDF = [Quantidade Faturada]
                                                              [Quantidade Faturada] = [Quantidade Faturada] - QTD_NOTA
                                                              QTD_NOTA = QTD_NOTA - AUX_QTDF
                                                              Release Vars AUX_QTDF
                                                              If [Quantidade Faturada]=0 Then [Quantidade Faturada]=BlankNum() EndIf
                                                         Else QTD_NOTA = QTD_NOTA - [Quantidade Faturada]
                                                              [Quantidade Faturada] = BlankNum()
                                                      EndIf
                                                      UnLockRecord
                                                      Moveto [Numero do Pedido]
                                                      Locate [NotaC->Numero do Pedido],AUX_ITEM_PED
                                                      If QTD_NOTA=0 Then QuitLoop EndIf
                                              EndIf   
                                              If Not AGRUPA_PEDIDO Then QuitLoop EndIf
                                              Skip
                                              If Eot() Then QuitLoop EndIf
                                              If [NotaI->Numero Pedido_Orcamento]<>[Numero do Pedido]
                                                 Then QuitLoop
                                              EndIf   
                                            EndWhile
                                            If Not AGRUPA_PEDIDO Then QuitLoop EndIf
                                    EndIf
                                    Skip
                                    If Eot() Then QuitLoop EndIf
                                  EndWhile
                                  If Not AGRUPA_PEDIDO Then Loop EndIf
                                  Release Vars AGRUPA_PEDIDO
                          EndIf
                          UnLockRecord                
                     Else Locate [NotaI->Numero Pedido_Orcamento], [NotaI->Item Pedido_Orcamento]
                          If RetVal
                             Then If [Quantidade Faturada]>0
            								         Then 
            								              if islockrecord() then loop endif
            								              
                                          [Quantidade Faturada]=[Quantidade Faturada]-[NotaI->Quantidade]
                                          UnLockRecord
                                  EndIf
                          EndIf
                  EndIf
                  quitloop
                endwhile
                SaveTables
                Moveto "NotaI"
        EndIf
EndIf

EndProc   ; (Est_Pedido_Orcamento)

;*******************************************************************************
;* Atualiza Situacao do Pedido ou Orcamento                                    *
;*******************************************************************************
Proc Est_Situacao_Pedido_Orcamento()
Private WC_NUMPED, WC_PEDFAT,TemItemFaturado

If IsBlank(NUMREF)
   Then Return
EndIf

TemItemFaturado=False
 
WC_NUMPED=0
WC_PEDFAT=0
Switch
  Case PARAM_PEDIDO="S" And Not IsBlank([NotaC->Numero do Pedido   ]): 
    Moveto "\\Sistemas\\Vendas\\PedidoI"
    Moveto [Numero do Pedido   ]

  Case Not IsBlank([NotaC->Numero do Orcamento]): 
    Moveto "\\Sistemas\\Vendas\\OrcaI"
    Moveto [Numero do Orcamento]
EndSwitch
Home
Locate NUMREF
If RetVal
   Then While True
          Switch
            Case PARAM_PEDIDO="S" And Not IsBlank([NotaC->Numero do Pedido   ]) And [Numero do Pedido   ]<>NUMREF: QuitLoop
            Case Not IsBlank([NotaC->Numero do Orcamento]) And [Numero do Orcamento]<>NUMREF                     : QuitLoop
          EndSwitch
          WC_NUMPED=WC_NUMPED+1
          If [Quantidade Faturada]>0
             Then If ([Quantidade]-[Quantidade Faturada])<=0
        				     Then WC_PEDFAT=WC_PEDFAT+1
        				  EndIf
          EndIf
          If [Quantidade Faturada]>0
             Then TemItemFaturado=True
          EndIf

          Skip
          If EOT() Then QuitLoop EndIf
        EndWhile
EndIf

If WC_NUMPED>0
   Then Switch
          Case PARAM_PEDIDO="S" And Not IsBlank([NotaC->Numero do Pedido   ]):
            Moveto "\\Sistemas\\Vendas\\PedidoC"
            Moveto [Numero do Pedido]
            while true
              Locate NUMREF
              if retval
                 then 
                			if islockrecord() then loop endif
  
                      If WC_NUMPED=WC_PEDFAT
                         Then [Situacao do Pedido   ]="FATURADO"
                         Else [Situacao do Pedido   ]="ABERTO"
                              If TemItemFaturado And 
                                 (SYS_CODIGO_CLIENTE = "0377" Or
                                  SYS_CODIGO_CLIENTE = "0345" Or
                                  SYS_CODIGO_CLIENTE = "0388" Or
                                  SYS_CODIGO_CLIENTE = "0427" Or
                                  SYS_CODIGO_CLIENTE = "0419" Or
                                  SYS_CODIGO_CLIENTE = "0429" ) 
                                 Then [Situacao do Pedido   ]="FATURADO"
                              EndIf
                      EndIf
                      UnLockRecord
              endif
              quitloop
            endwhile
            
          Case Not IsBlank([NotaC->Numero do Orcamento]):
            Moveto "\\Sistemas\\Vendas\\OrcaC"
            Moveto [Numero do Orcamento]
            while true
              Locate NUMREF
              if retval
                 then 
                			if islockrecord() then loop endif
            
                      If WC_NUMPED=WC_PEDFAT
                         Then [Situacao do Orcamento]="FATURADO"
                         Else [Situacao do Orcamento]="ABERTO"
                      EndIf
                      UnLockRecord
              endif
              quitloop
            endwhile

        EndSwitch
EndIf
Moveto "NotaI"
     
EndProc ;Est_Situacao_Pedido_Orcamento()

;*******************************************************************************
;* Estorna Pedido Entrega Futura                                               *
;*******************************************************************************
Proc Est_PedidoEF()
Private itfat, PED_ENCONTRADO

Aguarde("Efetuando Estorno PEDIDO ENTREGA FUTURA "+NOTAFISC) 

PED_ENCONTRADO=False

Moveto "PedidoC"
Moveto [Numero do Pedido]
Locate NOTAFISC
If RetVal
   Then 
        itfat=false
        Moveto "PedidoI"
        Moveto [Numero do Pedido]
        Locate [PedidoC->Numero do Pedido]
        If RetVal
           Then While [Numero do Pedido]=[PedidoC->Numero do Pedido]
                  If Not IsBlank([Quantidade Faturada]) And
                     [Quantidade Faturada]<>0 
                     Then itfat=true
                  EndIf   
                  Skip
                  If EOT() Then QuitLoop EndIf
                EndWhile
        EndIf
        If [PedidoC->Codigo da Empresa        ]=[NotaC->Codigo da Empresa        ] And
           [PedidoC->Data de Emissao          ]=[NotaC->Data de Emissao          ] And
           [PedidoC->Codigo                   ]=[NotaC->Codigo                   ] And
           [PedidoC->Situacao do Pedido       ]="ABERTO"                           And
           Not itfat
           Then PED_ENCONTRADO=True
        EndIf

EndIf

If Not PED_ENCONTRADO
   Then Mensagem("Pedido de entregue futura nÆo confere! //Verificar pedido, estorno nÆo foi realizado !")
   Else 
        Moveto "PedidoI"
        Moveto [Numero do Pedido]
        Locate [PedidoC->Numero do Pedido]
        If RetVal
           Then While [Numero do Pedido]=[PedidoC->Numero do Pedido]
    							if not islockrecord() then del endif
                EndWhile
        EndIf

        Moveto "PedidoV"
        Moveto [Numero do Pedido]
        Locate [PedidoC->Numero do Pedido]
        If RetVal
           Then While [Numero do Pedido]=[PedidoC->Numero do Pedido]
    							if not islockrecord() then del endif
                EndWhile
        EndIf

        Moveto "PedidoC"
        while true
    			if not islockrecord() 
             then del
                  quitloop
          endif
        endwhile
EndIf
Moveto "NotaC"
     
EndProc ;Est_PedidoEF()

;*******************************************************************************
;* Rotina Estorna Caixa/Banco e Titulos a Receber/ Titulos a Pagar             *
;*******************************************************************************
Proc Est_Cx_Duplic()
Private tpmovest

If Tab_Ref = "Faturac"
   then 
        tpmovest   =[FaturaC->Tipo Movimento Estoque]
           
        EMPRESAFISC=[FaturaC->Codigo da Empresa  ]
        NOTAFISC   =[FaturaC->Numero Nota Gerada ]
        SERIEFISC  =[FaturaC->Serie Nota Gerada  ]
   
        APLIC_ORIGEM="FATURA"
   
   else 
        tpmovest   =[NotaC->Tipo Movimento Estoque]
        
        EMPRESAFISC=[NotaC->Codigo da Empresa   ]
        NOTAFISC   =[NotaC->Numero do Documento ]
        SERIEFISC  =[NotaC->Serie do Documento  ]
        
        APLIC_ORIGEM="NOTA"
        
endif

if TIPO="CANCELAR"
   then CANCELA_DUP    =True
   else CANCELA_DUP    =false
endif
CX_CONTA_CAIXA  =PARAM_CONTA_CAIXA

;-- Estorno de Movimenta‡Æo Financeira -----------------------------------------
If DP_GERA_DUPLICATA="S"
   then

       Do_It!
       SaveTables
        
       View NOWINDOW "\\Sistemas\\Ctapag\\Titulos"  
       View NOWINDOW "\\Sistemas\\Ctapag\\Titbaixa" 
   
       View NOWINDOW "\\Sistemas\\CtaRec\\Duplic"
       View NOWINDOW "\\Sistemas\\CtaRec\\Dupbaixa"

       View NOWINDOW "\\Sistemas\\CtaCor\\SaldCont"
       View NOWINDOW "\\Sistemas\\CtaCor\\MovCont"
   
       View NOWINDOW "DupC"
       View NOWINDOW "DupI"
       View NOWINDOW "DupNF"
       
       CoEditKey
       
        ;-- Estorno da Gera‡Æo de Movimenta‡Æo Financeira ----------------------
        OP_MOVCX        ="ESTORNAR"
        OP_MOVDP        ="ESTORNAR"

        ;-- saidas -------------------------------------------------------------
        Estorno_CR_Ok   =True
        Estorno_CPTC_Ok =True
        Estorno_CPRP_Ok =True
        
        If PARAM_AVISTAAUTOMAT="S"
           Then Play("FT_CAIXA")
        EndIf
        If PARAM_APRAZOAUTOMAT="S"
           Then If PARAM_AVISTADUPLIC="S"
                   Then Play("FT_CAIXA")
                EndIf
        EndIf
        
        Play("FT_DUPLI") ; estornar duplicatas geradas automaticamente ou nÆo 
                      
        ;-- Entradas -----------------------------------------------------------
        Estorno_CP_Ok  =True
        Estorno_CRTC_Ok=True
        
        If PARAM_AVISTAAUTOMAT="S"
           Then Play("FT_CXAS")
        EndIf
        If PARAM_APRAZOAUTOMAT="S"
           Then If PARAM_AVISTADUPLIC="S"
                   Then Play("FT_CXAS")
                EndIf
                Play("FT_TITUL")
        EndIf
        
       ;-- Titulo de Credito --------------------------------------------------
       Play("FT_GTCS")  ;Titulo de Cr‚dito
       Play("FT_GRP")   ;Resgate de Pontos

       Do_It!
       SaveTables
        
       Moveto "\\Sistemas\\Ctapag\\Titulos"   ClearImage
       Moveto "\\Sistemas\\Ctapag\\Titbaixa"  ClearImage
   
       Moveto "\\Sistemas\\CtaRec\\Duplic"    ClearImage
       Moveto "\\Sistemas\\CtaRec\\Dupbaixa"  ClearImage

       Moveto "\\Sistemas\\CtaCor\\SaldCont"  ClearImage
       Moveto "\\Sistemas\\CtaCor\\MovCont"   ClearImage
       
       Moveto "DupC"  ClearImage
       Moveto "DupI"  ClearImage
       Moveto "DupNF" ClearImage
   
       CoEditKey  
        
endif
;-------------------------------------------------------------------------------
        
EndProc ; Est_Cx_Duplic()

;*******************************************************************************
;* Atualizacao de Cheques                                                      *
;*******************************************************************************
Proc Est_Cheques()
Private NUMEROL, EXISTE_CHEQUE_LIQUIDADO, ntable

Aguarde("Efetuando Estorno CHEQUES "+NOTAFISC)

ntable=table()
       
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      

while not isblank(NUMEROL)
   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=True
      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

   quitloop
endwhile                  

moveto ntable
EndProc ;Est_Cheques()

;*******************************************************************************
;* Rotina Estorna Transferencia/Troca                                          *
;*******************************************************************************
Proc Est_Transf_Troca()
Private COD, NUMEROL, MES_EST, ANO_EST

Aguarde("Efetuando Estorno TRANSFERENCIA "+NOTAFISC) 
      
If TROCA
  Then COD=[NotaC->Codigo]
  Else COD=[NotaC->Codigo da Empresa]
EndIf
    
Moveto "\\Sistemas\\Estoque\\NotaEC"
Moveto [Codigo]
Locate IndexOrder By "NotaEC01" COD,NOTAFISC,SERIEFISC
If RetVal
   Then MES_EST=AlinhM(StrVal(Month([\Sistemas\Estoque\NotaEC->Data de Entrada])),2)
        ANO_EST=StrVal(Year([\Sistemas\Estoque\NotaEC->Data de Entrada]))

        Moveto "\\Sistemas\\Estoque\\NotaEI"
        Moveto [Numero do Lancamento]
        Locate [\Sistemas\Estoque\NotaEC->Numero do Lancamento]
        If RetVal
           Then While [Numero do Lancamento]=[\Sistemas\Estoque\NotaEC->Numero do Lancamento]

                  Moveto "\\Sistemas\\Estoque\\SdEstq"
                  Locate [\Sistemas\Estoque\NotaEI->Codigo da Empresa],
                         [\Sistemas\Estoque\NotaEI->Codigo do Item], ANO_EST, MES_EST
                  If RetVal
                     Then While True
                            If Not IsLockRecord()
                               Then QuitLoop
                            EndIf
                          EndWhile

                          [Saldo Atual      ]=NDecimal([Saldo Atual      ]-[\Sistemas\Estoque\NotaEI->Quantidade ],3)
                          [Custo Total Atual]=NDecimal([Custo Total Atual]-([\Sistemas\Estoque\NotaEI->Custo Medio Unitario]*[\Sistemas\Estoque\NotaEI->Quantidade ]),2)
                          If ([Custo Total Atual]/[Saldo Atual])>0
                             Then [Ultimo Custo Atual]=NDecimal([Custo Total Atual]/[Saldo Atual],5)
                          EndIf
                          UnLockRecord
                  EndIf

                  Moveto "\\Sistemas\\Estoque\\NotaEI"
                  Del
                EndWhile
        EndIf
        Moveto "\\Sistemas\\Estoque\\NotaEC"
        Del
EndIf  

Moveto "NotaI"

EndProc ; Est_Transf_Troca()

;*******************************************************************************
;* Atualizacao Cupom                                                           *
;*******************************************************************************
Proc Est_Cupom()

Moveto "\\Sistemas\\Vendas\\NotaR"
If Recno()>0
   Then Moveto [Codigo da Empresa]
        Locate EMPRESAFISC, NOTAFISC, SERIEFISC
        If Retval 
           Then While [Codigo da Empresa  ]= EMPRESAFISC And [Numero do Documento]= NOTAFISC And [Serie do Documento ]= SERIEFISC  
                  EXCLUI_REGISTRO=False
                  If [Modelo_Documento   ]= "2C" And [NotaC->Cupom Fiscal Faturado]=""
                     Then If TIPO="DESFAZER"
                             Then EXCLUI_REGISTRO=True
                          EndIf   
                  EndIf
                  If EXCLUI_REGISTRO
                     Then Del   
                     Else Skip
                          If EOT() Then QuitLoop EndIf
                  EndIf
                 EndWhile
                 Release Vars EXCLUI_REGISTRO
        EndIf
EndIf

EndProc ;Est_Cupom()

;*******************************************************************************
;* Rotina p/ Estornar Movimenta‡Æo                                             *
;*******************************************************************************
Proc REQ_TRANSF_DEVOLUCAO(PARAM)
Private TEMP

Return False

If SYS_CODIGO_CLIENTE<>"0294" Or Upper(SubStr(Directory(),1,2))<>"X:"
   Then Return False
EndIf   

If PARAM="VERIFICA"
   Then TEMP=False
        Switch     
           Case Upper(Tab_Ref)="NOTAC" And ([NotaC->Codigo da Empresa]="0001"   And 
                                            [NotaC->Tipo Movimento Estoque]="E" And 
                                            Search("DEVOL",Upper([NotaC->Descricao da Destinacao]))>0)   :
                TEMP=True
           Case Upper(Tab_Ref) = "FATURAC" And ([FaturaC->Codigo da Empresa]="0001"   And 
                                                [FaturaC->Tipo Movimento Estoque]="E" And
                                                Search("DEVOL",Upper([FaturaC->Descricao da Destinacao]))>0) :
                TEMP=True      
        EndSwitch
        Return TEMP
EndIf   

TIPO_REQUISICAO = PARAM
Play "FT_RQNC"

Release Vars TIPO_REQUISICAO

EndProc ;REQ_TRANSF_DEVOLUCAO

;*******************************************************************************
;* Dialgo da Justificativa de Cancelamento                                     *
;*******************************************************************************
Proc Est_SD_Justificativa(Disparo,Campo,Evento,Elemento)
Temp=True
TECLA    =""
MSG_CAMPO=""

If INICIO_DIALOG
   Then Campo="TG_JUST"
        INICIO_DIALOG = False
EndIf

If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] =  27: 
          Temp=False
          Switch
            Case Campo="TG_JUST"           : Campo="NO"
            Case Campo="TG_USUARIO"        : Campo="TG_JUST"
            Case Campo="TG_NOMUSUARIO"     : Campo="TG_JUST"
            Case Campo="TG_DATA"           : Campo="TG_USUARIO"
            Case Campo="TG_HORA"           : Campo="TG_DATA"
            Case Campo="YES" Or Campo="NO" : Campo="TG_JUST"
          EndSwitch
     Case Evento["KeyCode"] = 13: 
          Temp=False
          If Checa_TAG()      
             Then Switch
                     Case Campo="TG_USUARIO" : 
                          VSDGUSUARIO = ControlValue("TG_USUARIO")
                          GetRecord "\\Sistemas\\Cadastro\\Usuarios" VSDGUSUARIO To reg_usuarios  
                          If RetVal
                             Then VSDGNOMUSUARIO = REG_USUARIOS["Nome"]
                                  Campo="TG_DATA"
                             Else MENSAGEM("Usu rio n„o cadastrado !")
                          EndIf
                     Case Campo="TG_DATA"    : Campo="TG_HORA"
                          VSDGDATA = ControlValue("TG_DATA")
                          If Isblank(VSDGDATA)
                             Then VSDGDATA= Today()
                          EndIf   
                          VSDGHORA   = SubStr(Time(),1,5)
                     Case Campo="TG_HORA"    : Campo="TG_JUST"  
                          VSDGHORA=RTrim(LTrim(ControlValue("TG_HORA")))
                          If IsBlank(VSDGHORA)
                              Then VSDGHORA = SubStr(Time(),1,5)
                          EndIf
                     Case Campo="TG_JUST"    : Campo="YES"
                          VSDGJUST = ControlValue("TG_JUST")
                          If IsBlank(VSDGJUST)
                             Then Campo="TG_JUST"
                             Else MSG = ""
                                  Switch
                                    Case Rtrim(VSDGJUST)=""      : MSG = MSG_VAZIO
                                    Case Len(Rtrim(VSDGJUST))<15 : MSG = MSG_MIN_CARACETER 
                                  EndSwitch
                                  If MSG<>""
                                     Then Campo="TG_JUST"
                                          Mensagem(MSG)
                                  EndIf                     
                          EndIf
                     Case Campo="YES" : AcceptDialog
                               
                  EndSwitch
          EnDIf
          RefreshDialog   
   EndSwitch
EndIf

SelectControl Campo
RefreshDialog

Return Temp

EndProc  ; Est_SD_Justificativa()

;*******************************************************************************
;* Digitacao da Justificativa de Cancelamento                                  *
;*******************************************************************************
Proc Est_Justificativa_Cancelamento()
Private ncampo

MSG_VAZIO         = "Informe uma justificativa para cancelamento!"
MSG_MIN_CARACETER = "A justificativa deve ser maior que 15 caracteres!"

GetRecord "\\Sistemas\\Cadastro\\Usuarios" SYS_CHAPA_USUARIO To NOME_USUARIO
If RetVal
   Then NOME_USUARIO=NOME_USUARIO["Nome"]
   Else NOME_USUARIO="" 
EndIf

VSDGUSUARIO    = SYS_CHAPA_USUARIO
VSDGNOMUSUARIO = ""
VSDGNOMUSUARIO = NOME_USUARIO
VSDGDATA       = Today()
VSDGHORA       = SubStr(Time(),1,5)
VSDGJUST       = ""

Echo Normal
Echo Off

While True           
  INICIO_DIALOG=True
  
  Showdialog "Justificativa para Cancelamento" Proc "Est_SD_Justificativa"
     Trigger "OPEN","ARRIVE"
      Key "ENTER","ESC","ClearArea"
       @ 08,09 height 09 width 63

     Label  @ 00,00 "Usu rio" for "TG_USUARIO"
     Accept @ 01,01 Width 7 "A4" picture "#*#" Tag "TG_USUARIO" to VSDGUSUARIO
     Accept @ 01,06 Width 31 "A30" picture "#*#" Tag "TG_NOMUSUARIO" to VSDGNOMUSUARIO

     Label  @ 00,37 "Data" For "TG_DATA"
     Accept @ 01,38  Width 13 "D"  Picture "#[#];.##;.##[##]" Tag "TG_DATA" To VSDGDATA
     Label  @ 00,51 "Hora" For "TG_HORA"
     Accept @ 01,52 Width 8 "A5"  Picture "##:##" Tag "TG_HORA" To VSDGHORA

     Label  @ 02,00 "Justificativa" For "TG_JUST"
     Accept @ 03,01 Width 59 "A255"  Picture "!*!" Tag "TG_JUST" To VSDGJUST  

     Pushbutton @ 05,20 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
     Pushbutton @ 05,34 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  Enddialog
  
  If Not RetVal
     Then If ConfGeral("Deseja sair deste processo sem realizar o cancelamento do documento?")
             Then Return False
             Else Loop
          EndIf
  EndIf  

  GetRecord "\\Sistemas\\Cadastro\\Usuarios" VSDGUSUARIO To reg_usuarios  
  If Not RetVal
     Then MENSAGEM("Usu rio n„o cadastrado !")
          Loop
  EndIf

  If IsBlank(VSDGDATA) Or IsBlank(VSDGHORA)
     Then Mensagem("Data/Hora nÆo informado!")
          Loop
  EndIf        

  MSG = ""
  Switch
    Case Rtrim(VSDGJUST)=""      : MSG = MSG_VAZIO
    Case Len(Rtrim(VSDGJUST))<15 : MSG = MSG_MIN_CARACETER 
  EndSwitch
  
  If MSG<>""
     Then Mensagem(MSG)
          Loop
  EndIf     
  Release Vars MSG,MSG_VAZIO,MSG_MIN_CARACETER
  
  If Ltrim(Rtrim(VSDGJUST))<>""
     Then VSDGJUST = "CANCELADO POR: "+Rtrim(VSDGUSUARIO) + Spaces(1) + Rtrim(VSDGNOMUSUARIO) + Spaces(1) +  
                                       StrVal(VSDGDATA) + Spaces(1) + StrVal(VSDGHORA) + Spaces(1) + Ltrim(Rtrim(VSDGJUST))
                                       
          ;---- Formata‡Æo da Justificativa para ser localizada --------------------------
          VSDGJUST = "[**" + VSDGJUST + "**]" 
          OBS = Ltrim(Rtrim([Observacao na Nota Fiscal]))
          
          If OBS<>""
             Then If SubStr(OBS,Len(OBS),1)<>"\n" And SubStr(OBS,Len(OBS),1)<>"//" 
                     Then OBS = OBS + " " + VSDGJUST
                     Else OBS = OBS + VSDGJUST
                  EndIf   
             Else OBS = VSDGJUST
          EndIf
          [Observacao na Nota Fiscal] = OBS
          UnLockRecord
          Release Vars OBS
  Endif
  QuitLoop
EndWhile

Return True

EndProc ;Est_Justificativa_Cancelamento()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
If Not IsAssigned(SITUACAO)          Then SITUACAO=""              EndIf
If Not IsAssigned(SYS_CHAPA_USUARIO) Then SYS_CHAPA_USUARIO="9999" EndIf
    
;---- Justificativa para Cancelamento ------------------------------------------
If Not Est_Justificativa_Cancelamento()
   Then Mensagem("N„o foi poss¡vel cancelar o documento.//A justificativa n„o foi informada!")
        Return
EndIf

EMPRESAFISC=[Codigo da Empresa]
If Tab_Ref = "Faturac"
  Then NOTAFISC =[Numero Nota Gerada ]
       SERIEFISC=[Serie Nota Gerada  ]
  Else NOTAFISC =[Numero do Documento]
       SERIEFISC=[Serie do Documento ]
EndIf

Aguarde("Efetuando Estorno Documento "+NOTAFISC)

If PARAM_CHEQUES="S"
  Then CHEQUES=True
  Else CHEQUES=False
EndIf

If PARAM_TRANSFERENCIA="S" And 
   Search("TRANSF",[Descricao da Destinacao])>0 And
   [Tipo]="E" And 
   [Tipo Movimento Estoque]="S" And
   [Codigo da Empresa]<>[Codigo]
  Then TRANSF=True
  Else TRANSF=False 
EndIf

If Search("TROCA",[Descricao da Destinacao])>0 And 
   [Tipo Movimento Estoque]="S" And
   [Codigo da Empresa]<>[Codigo]
   Then TROCA=True
   Else TROCA=False 
EndIf

If Search("VENDA ENTREGA FUTURA",[Descricao da Destinacao])>0 And 
   [Tipo Movimento Estoque]="S" 
   Then PEDIDOEF=True 
   Else PEDIDOEF=False
EndIf

UnLockRecord
Do_IT!
KeyPress "F7"
CoEditKEy
IsLockRecord()

Estornar()

Moveto Tab_Ref
KeyPress "F7"
UnLockRecord

;---- Cancelamento Autom tico da Expedi‡Æo quando for EXPEDICAO DE OF ----------
If Rtrim([FaturaC->Numero da Expedicao])<>"" And
   Rtrim([FaturaC->Origem da Expedicao])="OF"
   Then ROTINA_EXPEDICAO="CANCELAR"
        Play "Ft_ExpOF"
EndIf

Release Vars EMPRESAFISC,NOTAFISC,SERIEFISC,TIPO,Tab_Ref,CHEQUES,
             TRANSF,TROCA,APLIC_ORIGEM,OP_MOVCX,OP_MOVDP,CANCELA_DUP,
             NUMREF,PEDIDOEF,SITUACAO
             
Release Procs Estornar, Estornar_Itens, Est_Estoque, Est_Pedido_Orcamento,
              Est_Situacao_Pedido_Orcamento, Est_Trans_Troca, Est_Cx_Duplic,
              Est_Cheques, Est_Cupom, Est_PedidoEF,Est_Justificativa_Cancelamento,Est_SD_Justificativa
