;***** Verificar se o Cliente tem acesso a esta rotina *****
If Bloqueia_Rotina("P_EXPEDOF")
   Then Return
EndIf   

;** FT_EXPOF *****************************************************************
;*  Rotina de faturamento de ordem de expedicao sobre OF                       *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 30/01/2017 por Anivel Augusto Rodrigues
;Ultima Alteracao: 09/02/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes loop islockrecord
;Ultima Alteracao: 13/02/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Item da OE
;Ultima Alteracao: 30/03/2017 por Bruno Carvalho 
;Motivo Alteracao: Ajustes p/ gravar o numero da expedi‡Æo na cabe‡a da nota
;Ultima Alteracao: 05/04/2017 por Bruno Carvalho 
;Motivo Alteracao: Adicionado processo para incluir volume no faturamento
;Ultima Alteracao: 25/04/2017 por Bruno Carvalho 
;Motivo Alteracao: Adicionado CONFERENTE (usu rio que desbloqueou a OE) na Observa‡Æo na Nota Fiscal
;Ultima Alteracao: 26/04/2017 por Bruno Carvalho  
;Motivo Alteracao: Adicionado processo para faturar expedi‡Æo com pedido a partir da rotina da expedi‡Æo com of
;Ultima Alteracao: 28/04/2017 por Bruno Carvalho  
;Motivo Alteracao: Alterado ao ser impresso na OBS o usu rio, a palavra CONFERENTE para EXPEDICAO
;Ultima Alteracao: 03/05/2017 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado parƒmetro PARAM_SEQUENCIA_EXPEDICAO                                  
;Ultima Alteracao: 09/05/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajsutes p/ bloquear faturamento de pedido se faturamento for por OF
;Ultima Alteracao: 24/05/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajsutes na mensagem quando ccfp>0 *Quantidade expedida maior ou menor que a quantidade no pedido 
;Ultima Alteracao: 09/06/2017 por Bruno Carvalho                          
;Motivo Alteracao: InclusÆo da avariavel de controle FATUROU_OE p/ verificar se ordem de expedi‡Æo foi faturada
;Ultima Alteracao: 09/06/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajustes no titulo ao chamar Expedicao() 
;Ultima Alteracao: 16/06/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado processo p/ faturar expedi‡Æo sem pedido ou ordem de faturamento -> ROTINA_EXPEDICAO = "SEM_PED" 
;Ultima Alteracao: 10/07/2017 por Bruno Carvalho
;Motivo Alteracao: Adicionado Cancela_Expedicao()
;Ultima Alteracao: 11/07/2017 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado parƒmetro PARAM_SEQUENCIA_EXPEDICAO -> Conforme ‚ feito para o #0388#
;Ultima Alteracao: 12/07/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajuste na mensagem onde ‚ informado o etoque parcial, onde foi incluido COMPLETA para alinhamento
;Ultima Alteracao: 12/07/2017 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado PARAM_CHECA_ESTOQUE_SEMMENSSAGEM -> Checa_Estoque() *Fatura/Balcao/Troca/Nota
;Ultima Alteracao: 04/08/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajustado para nÆo ser verificado o estoque ao faturar ma expedi‡Æo com pedido p/ #0377# 
;Ultima Alteracao: 31/08/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes desconto item
;Ultima Alteracao: 18/10/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes PARAM_INCLUI_ITEM permitindo de acordo com o parƒmetro, expedi‡Æo de item fora do pedido
;Ultima Alteracao: 26/03/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes mensagem processando       
                                      
;*******************************************************************************
;* Faturamento de Ordem de Expedicao              
;*******************************************************************************
Proc Expedicao()
Private OK, PED_ORC_FAT, SEQI, Atualiza, ExpedOk, cc, ccfp, ccd, Itemok, qtdp, qtde, NUMOE,
        regfaturai

Moveto "FaturaI"
End
SEQI=[Item da Of]
        
OK=""
Switch
  Case ROTINA_EXPEDICAO = "OF"      : TITULO     = "Expedi‡„o/OF"  
                                      SUB_TITULO = "N§ Expedi‡„o:" 
                                      PED_ORC_FATURAR=[FaturaC->Numero da OF]
  Case ROTINA_EXPEDICAO = "SEM_PED" : TITULO     = "Expedi‡„o s/ Pedido"
                                      SUB_TITULO = "N§ Expedi‡„o:"  
                                      PED_ORC_FATURAR=""
  OtherWise                         : TITULO     = "Expedi‡„o c/ Pedido" 
                                      SUB_TITULO = "N§ do Pedido:"
                                      PED_ORC_FATURAR=[FaturaC->Numero do Pedido]
EndSwitch   
PED_ORC_FAT=""

ShowDialog TITULO proc "OPCAO" @ 09,20 height 03 width 30
  @ 0,4 ?? SUB_TITULO
  Accept @ 00,19 width 9 "A6" Picture "#*#" tag "PED_ORC_FATURAR" to PED_ORC_FATURAR

  PushButton @ 02,06 Width 10 "Sim"     OK Value "Sim" Tag "Sim" to Button
  PushButton @ 02,15 Width 10 "N„o" CANCEL Value "Nao" Tag "N„o" to Button
Enddialog

FAZ_PROCESSO=True
Switch 
  Case OK="N"                                                                         : 
       FAZ_PROCESSO=False
  Case (Rtrim(PED_ORC_FATURAR)="" And  ROTINA_EXPEDICAO <> "SEM_PED") Or (PED_ORC_FAT="" And ROTINA_EXPEDICAO = "SEM_PED"):   
       Mensagem("N„o foi poss¡vel continuar o processo.//N„o foi informado um numero de Expedi‡„o/Pedido!")
       FAZ_PROCESSO=False
  Case PED_ORC_FATURAR<>[FaturaC->Numero da OF] And ROTINA_EXPEDICAO = "OF"           :
       Mensagem("OF Expedi‡Æo difere da OF atual !")
       FAZ_PROCESSO=False
  Case ROTINA_EXPEDICAO = "OF" And [FaturaC->Numero do Pedido]<>""                    :
       ;Processo adicionado pois [quantidade faturada] no pedidoi estava ficando divergente caso ocorresse itens com faturamento parcial
       Mensagem("O pedido "+[FaturaC->Numero do Pedido]+" foi informado na OF impossibilitando o//faturamento da expedi‡„o por OF!")
       FAZ_PROCESSO=False 
EndSwitch
                                                                                                
If Not FAZ_PROCESSO
   Then Release Vars FAZ_PROCESSO
        Return 
EndIf   

Release Vars FAZ_PROCESSO,REG_EXPOF
PED_ORC_FATURAR=PED_ORC_FAT
PED_ORC_FATURAR=AlinhM(PED_ORC_FATURAR,6)

Switch
  Case ROTINA_EXPEDICAO = "SEM_PED" :
       Pedido_Empresa = [FaturaC->Codigo da Empresa]
       Pedido_Destin  = [FaturaC->Codigo da Destinacao]+[FaturaC->Descricao da Destinacao]
  Case ROTINA_EXPEDICAO = "PED"     :
       Moveto "FaturaC"
       [Numero Pedido_Orcamento]=PED_ORC_FATURAR
       Moveto "PedidoC"
       If RecordStatus("New")
          Then Mensagem("Pedido n„o Encontrado !")
               Return
          Else If [Codigo] <> [FaturaC->Codigo]
                  Then Mensagem("Pedido c/ Cliente diferente desta Fatura !")
                       Return
               EndIf
               Pedido_Empresa=[Codigo da Empresa   ]
               Pedido_Destin =[Codigo da Destinacao]+[Descricao da Destinacao]
       EndIf
EndSwitch

Moveto "FaturaC"
UnLockRecord
FormKey
IsLockRecord()

NUMOE = ""
MSG   = "Ordem de expedi‡„o [LIBERADA] n„o encontrada "+PED_ORC_FATURAR+" !"  

{TableAdd} {ExpedofC}
{TableAdd} {ExpedofI}

If ROTINA_EXPEDICAO <> "SEM_PED"
   Then {TableAdd} {PedidoI}
EnDIf
                
ExpedOk=False
Moveto "ExpedofC"
Switch
  Case ROTINA_EXPEDICAO = "OF"      : Moveto [Numero da OF    ]
  Case ROTINA_EXPEDICAO = "SEM_PED" : Moveto [Numero da OE    ]
  OtherWise                         : Moveto [Numero do Pedido] 
EndSwitch        
Locate PED_ORC_FATURAR
If Retval
   Then While True
  	      If [Situacao da OE]="LIBERADO"
             Then 
                  MSG="Ordem de expedi‡„o [LIBERADA]: // //"
                  MSG=MSG+Completa("Ordem "+[Numero da OE]+" de "+Format("D13",[Data_Inclusao])+" - "+[Hora_Inclusao],60," ")+"//"
                  MSG=MSG+Completa("Cliente "+[Codigo]+" "+[Razao Social],60," ")+"//"
                  MSG=MSG+Completa("Liberado em "+Format("D13",[Data_Liberacao])+" - "+[Hora_Liberacao],60," ")+"// //"
                  If [Codigo]<>[FaturaC->Codigo]
                      Then MSG=MSG+"Cliente desta ordem de expedi‡„o difere desta Fatura !// //"
                           If Not ConfGeral(MSG+"Procurar pr¢xima ordem de expedi‡„o liberada ?")
                              Then QuitLoop
                           EndIf
                      Else If ConfGeral(MSG+"Confirma faturar esta ordem ?")
                              Then ExpedOk=True
                                   QuitLoop
                              Else If Not ConfGeral("Procurar pr¢xima ordem de expedi‡„o liberada ?")
                                      Then QuitLoop
                                   EndIf
                           EndIf        
                  EndIf        
          EndIf

          Skip
          If EOT() Then QuitLoop EndIf

          Locate Next PED_ORC_FATURAR
          If Not Retval
             Then QuitLoop
          EndIf                                 
        EndWhile     
   Else Switch
          Case ROTINA_EXPEDICAO = "OF"      : MSG = "N„o foi localizado expedi‡„o para a OF "+PED_ORC_FATURAR+"!"
          Case ROTINA_EXPEDICAO = "SEM_PED" : MSG = "N„o foi localizado a expedi‡„o "+PED_ORC_FATURAR+"!" 
          OtherWise                         : MSG = "N„o foi localizado expedi‡„o para o pedido "+PED_ORC_FATURAR+"!"     
        EndSwitch
EndIf

If Not ExpedOk
   Then Mensagem(MSG)
        Do_It!
        Moveto "ExpedofC"  ClearImage
        Moveto "ExpedofI"  ClearImage
        If ROTINA_EXPEDICAO <> "SEM_PED"
           Then Moveto "PedidoI"   ClearImage
        EndIf   
        Moveto "FaturaC"
        CoEditKey
        FormKey
        IsLockRecord()
        Return
EndIf
                
CONT_ARRAY = 0
DynArray ITEM_EXPEDICAO[]              

SEQPED = BlankNum()
NUMOE  = [Numero da OE    ]
NPED   = [Numero do Pedido]
                                    
Switch
  Case SYS_CODIGO_CLIENTE="0345" Or
       SYS_CODIGO_CLIENTE="0388"  : PARAM_SEQUENCIA_EXPEDICAO=True
  OtherWise                       : PARAM_SEQUENCIA_EXPEDICAO=False 
EndSwitch   

Switch
  Case PARAM_SEQUENCIA_EXPEDICAO And NPED="" : 
       PARAM_SEQUENCIA_EXPEDICAO = False
  Case PARAM_SEQUENCIA_EXPEDICAO And PED_ORC_FATURAR<>"" :
       Moveto "PedidoI"
       Moveto [Numero do Pedido]
       Locate PED_ORC_FATURAR
       If Retval
          Then While [Numero do Pedido] = PED_ORC_FATURAR
                 SEQPED = [Item do Pedido]
                 Skip
                 If Eot() Then QuitLoop EndIf
               EndWhile
       EndIf
EndSwitch  

Usando_Expedicao=True
While True
	Moveto "ExpedofI"
	Moveto [Numero da OE]
	Locate [ExpedofC->Numero Da OE]
	If Not Retval
	   Then NUMOE=""
          Mensagem("Ordem de Expedicao "+[ExpedofC->Numero da OE]+" sem itens !// Verificar !")
	        QuitLoop
  endif   

  ExpedOk=True
  Switch
    case ROTINA_EXPEDICAO = "PED":
      LimpaRodape(0)
      Aguarde("Carregando itens")

      cc   = 0
      ccfp = 0
      ccd  = 0
      While [Numero Da OE]=[ExpedOfC->Numero Da OE]
       If [Quantidade_Expedida]>0 Then
          cc=cc+1
          Switch
            Case [Quantidade_Fora_OF]>0     : ccfp=ccfp+1 
            Case [Quantidade_Diferenca ]>0  : ccd =ccd +1
          EndSwitch
       EndIf   
       Skip
       If EOT() Then QuitLoop EndIf
      EndWhile
      
      If [FaturaC->Tipo Movimento Estoque]="S" And (ccfp>0 or ccd>0 or cc=0)
         Then MSG="" 
				      If ccfp>0 Then MSG=MSG+"Existe item com quantidade expedida diferente do pedido !//"  EndIf
				      If ccd >0 Then MSG=MSG+"Existe item com quantidade expedida maior que pedida !//"     EndIf
				      If cc  =0 Then MSG=MSG+"N„o existe Item com Quantidade expedida para este pedido !//" EndIf
              MSG=MSG+"//Verificar expedi‡„o e/ou corrigir pedido !//"

							If cc=0
				         Then QuitLoop
				         Else MSG=MSG+"Se Faturar assim mesmo, o Pedido ainda pode ficar 'EM ABERTO' !//"
				              MSG=MSG+"Deseja Faturar esta expedi‡„o ?"
								      If Not ConfGeral(MSG)
								         Then QuitLoop
								      EndIf   
				      EndIf   
      EndIf   
  
      qtdp=0
      qtde=0
      
      Moveto "ExpedOfI"
      Moveto [Numero da OE]
      Locate [ExpedOfC->Numero Da OE]
      While [Numero Da OE]=[ExpedOfC->Numero Da OE]
        Aguarde("Processando itens")

        qtdp=qtdp+[ExpedOfI->Quantidade_OF]
        
        PARAM_ITEM_FORA_PEDIDO="N"
        If [Quantidade_Expedida]>0 
           Then Item=[ExpedOfI->Codigo do Item]
           
                ExpedOk=False
                Moveto "PedidoI"
                Moveto [Codigo do Item]
                Locate IndexOrder by "ind_itpd" Item, PED_ORC_FATURAR
                If RetVal And
                   [Numero do Pedido]=PED_ORC_FATURAR And
                   [Codigo do Item  ]=Item
                   Then
                        ExpedOk=True
                   Else 
                        ;---- For‡ando caso tenha erro de indice --------
                        If SYS_CODIGO_CLIENTE="0377"
                           Then Moveto "PedidoI"
                                Moveto [Numero do Pedido]
                                Locate PED_ORC_FATURAR
                                If RetVal
                                   Then While PED_ORC_FATURAR = [Numero do Pedido]
                                          If [Codigo do Item]=Item
                                             Then 
                                                  ExpedOk=True
                                                  QuitLoop
                                          EndIf
                                          Skip
                                          If Eot() Then QuitLoop EndIf
                                          Locate Next PED_ORC_FATURAR
                                          If Not RetVal Then QuitLoop EndIf
                                        EndWhile  
                                EndIf
                        EndIf   
                   
                        If SYS_CODIGO_CLIENTE="0222" Or
                           SYS_CODIGO_CLIENTE="0232" Or
  												 SYS_CODIGO_CLIENTE="0079"
                           Then itemant=item
                                Switch
                                  Case SYS_CODIGO_CLIENTE="0222":
  																	Item=SubStr([ExpedOfI->Codigo do Item],1,7)+"9"+
  																			 SubStr([ExpedOfI->Codigo do Item],9,2)
                                  Case SYS_CODIGO_CLIENTE="0232":
  																	Item=SubStr([ExpedOfI->Codigo do Item],1,8)+"9"+
  																			 SubStr([ExpedOfI->Codigo do Item],10,1)																			 
  																Case SYS_CODIGO_CLIENTE="0079":
  																	Item=SubStr([ExpedOfI->Codigo do Item],1,6)+"99"+
  																			 SubStr([ExpedOfI->Codigo do Item],9,2)
                                EndSwitch              
                                ExpedOk=False
                                Moveto "PedidoI"
                                Moveto [Codigo do Item]
                                Locate IndexOrder by "ind_itpd" Item, PED_ORC_FATURAR
                                If RetVal And [Numero do Pedido]=PED_ORC_FATURAR And [Codigo do Item  ]=Item
                                   Then 
                                        ExpedOk=True
                                        item=itemant
                                EndIf
                        EndIf
                EndIf

                If Not ExpedOk
                   Then Moveto "ExpedOfI"
                        
                        ;Item fora do Pedido
                        If ROTINA_EXPEDICAO = "PED"  And PARAM_INCLUI_ITEM="S" And [Quantidade_Fora_OF]>0
                           Then COR_MENSAGEM="ALERTA"
                                MSG =       Completa("O Item "+[Codigo do Item]+" "+[Descricao do Item]+" n„o foi localizado",67," ")+"//"
                                MSG = MSG + Completa("no pedido "+[FaturaC->Numero do Pedido]+"!",67," ")+"//"
                                MSG = MSG + Completa("Deseja faturar este item assim mesmo ?",67," ")
                                If ConfGeral(MSG)
                                   Then PARAM_ITEM_FORA_PEDIDO = "S"
                                        ExpedOk=True  
                                EndIf     
                        EndIf
                           
                        If Not ExpedOk
                           Then Release Vars COR_MENSAGEM
                                Skip
                                If EOT() 
                                   Then QuitLoop
                                   Else Loop
                                EndIf
                        EndIf
                   Else If PARAM_SEQUENCIA_EXPEDICAO Then SeqItemExp =[Item do Pedido] EndIf      
                EndIf
            
  		          qtdp=0
  		          qtde=0
  		          
  		          If PARAM_SEQUENCIA_EXPEDICAO And PARAM_ITEM_FORA_PEDIDO="S"  
                   Then SEQPED = SEQPED + 1
                        SeqItemExp = SEQPED                
                Endif
  
                ExpedOk=True
                Moveto "FaturaI"
                If PARAM_SEQUENCIA_EXPEDICAO
                   Then Moveto [Numero da OF]
                        Locate [FaturaC->Numero da OF],SeqItemExp
                        If RetVal
                           Then If [Codigo do Item]=Item
                                   Then Mensagem("Ocorreu um erro ao tentar inserir o item "+Strval(SeqItemExp)+" do pedido "+PED_ORC_FATURAR+"!")
                                        ExpedOk=False
                                EndIf                
                        EndIf
                        If ExpedOk
                           Then End Down
                                [Numero da Of]=[FaturaC->Numero da Of]
                                [Item da Of  ]=SeqItemExp
                        EndIf
                   Else While True
                          End
                          SEQI=SEQI+1
                          If SEQI>900
                             Then Mensagem("Numero Maximo de Itens 900 permitidos !")
                                  ExpedOk=False
                                  QuitLoop
                          EndIf
                          Down
                          [Numero da Of]=[FaturaC->Numero da Of]
                          [Item da Of  ]=SEQI
                          If Not IsLockRecord()
                             Then QuitLoop
                             Else Del
                          EndIf   
                        EndWhile
                EndIf
                If Not ExpedOk
                   Then QuitLoop
                EndIf   

                COPIA_PED_ORC_FATURA()  

                qtde          =qtde+[ExpedOfI->Quantidade_Expedida]
                [Quantidade  ]=[ExpedOfI->Quantidade_Expedida]

                If [Valor Desconto Unitario]>0
                   Then [Tipo Desconto Item ]="U"
                        [Valor Desconto Item]=round([Quantidade]*[Valor Desconto Unitario],2)
                EndIf
                If [Preco Unitario]>0
                   Then [Preco Total]=Round([Quantidade]*[Preco Unitario],2)-[Valor Desconto Item]
                EndIf   
              
                If [Preco Total]=0 Or [Preco Total]=Blanknum()
                   Then MSG=    Completa("Numero da OF: "+[FaturaC->Numero da OF],60," ")+"// //"
                        MSG=MSG+Completa("        Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30),60," ")+"//" 
                        MSG=MSG+Completa("  Quantidade: "+Format("W11.3,EICB",[Quantidade]),60," ")+"// //"
                        MSG=MSG+Completa(Format("W60,AC",">> SEM TABELA DE PRECO INFORMADA <<"),60," ")
                        Mensagem(MSG) 
                        
                        ;item ser  incluido sem pre‡o, informando apenas ao usu rio
                        ;caso o item seja bloqueado, habilitar o processo seguinte -> Em 18.10.2017  
                        ;Del
                        ;Moveto "ExpedOfI"
                        ;Skip
                        ;If Eot() 
                        ;   Then QuitLoop 
                        ;   Else Loop
                        ;EndIf   
                EndIf                   
              
                CHAVEI=1
                ATUALIZA=True     
                PARAM_CHECA_ESTOQUE_SEMMENSSAGEM = False
                
                ;Em 04/08 foi pedido p/ nÆo verificar o estoque ao faturar uma expedi‡Æo com pedido p/ #0377#
                If SYS_CODIGO_CLIENTE<>"0377"
                    Then If Checa_Estoque()
                         Then
                              Release Vars PARAM_CHECA_ESTOQUE_SEMMENSSAGEM
                         Else
                              Release Vars PARAM_CHECA_ESTOQUE_SEMMENSSAGEM
                              MSG=    Completa("N£mero do Pedido   : "+[Numero Pedido_Orcamento]+"    Item do Pedido: "+StrVal([Item Pedido_Orcamento]),50," ")+"// //"
                              MSG=MSG+Completa("Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30),50," ")+"// //" 
                              MSG=MSG+Completa("Quantidade faturada: "+Format("W11.3,EICB",[Quantidade]),50," ")+"//"
                              MSG=MSG+Completa("- Estoque atual    : "+Format("W11.3,EICB",SALDOATUAL),50," ")+"//"
                              MSG=MSG+Completa("=                    "+Format("W11,AR","-----------"),50," ")+"//"
                              MSG=MSG+Completa("Falta em estoque   : "+Format("W11.3,EICB",NOVOSALDO*-1),50," ")+"// //"
                              If PARAM_BAIXA_PARCIAL="S"
                                 Then If SALDOATUAL<=0
                                         Then Del
                                              ATUALIZA=False
                                         Else MSG=MSG+Completa("Faturando parcial  : "+Format("W11.3,EICB",SALDOATUAL),50," ")+"//"
                                      Endif
                                 Else Del
                                      Atualiza=False
                              EndIf
                              If Not ATUALIZA
                                 Then MSG=MSG+Completa("Item n„o pode ser Faturado por Saldo Insuficiente !",50," ")+"//"
                                 Else [Quantidade]=SALDOATUAL
                    
                                      if [Valor Desconto Unitario]>0
                                         then [Tipo Desconto Item ]="U"
                                              [Valor Desconto Item]=round([Quantidade]*[Valor Desconto Unitario],2)
                                      endif   
                                      [Preco Total]=Round([Quantidade]*[Preco Unitario],2)-[Valor Desconto Item]
                                      UnLockRecord
                              EndIf
                              Mensagem(MSG)
                      EndIf
                EndIf
                
                If ATUALIZA
                   Then ESTOQUE()
                EndIf
              
                Moveto "PedidoI"
              	If [FaturaC->Tipo Movimento Estoque]="S"
  								 Then If ATUALIZA
  				                 Then If DESTIN_ATUALIZA_PEDIDOS="S"
  				                         Then [Quantidade Faturada]=[Quantidade Faturada]+[FaturaI->Quantidade]
  				                              UnlockRecord
  				                      EndIf
  				                 Else If Not ConfGeral("Continuar faturando os outros Itens desta ordem de expedi‡„o ?") 
  				                         Then Quitloop
  				                      EndIf
  				              EndIf
                EndIf
                SaveTables
        EndIf
        
        Moveto "ExpedOfI"
        Skip
        If EOT() Then QuitLoop EndIf
      EndWhile
      
      If [FaturaC->Tipo Movimento Estoque]="S" And qtde>0
         Then FATUROU_OE=True
              Moveto "ExpedOfC"
              [Situacao da OE]="FATURADO"
              [Data_Liberacao]=Today()
              [Hora_Liberacao]=Time()
              UnLockRecord
      EndIf        
                    
      If [FaturaC->Tipo Movimento Estoque]="S" And qtdp>qtde                                                              
         Then Mensagem("Ordem de expedi‡„o "+[ExpedOfC->Numero da OE]+" esta como "+[ExpedOfC->Situacao da OE]+",//por‚m h  itens sem expedi‡„o!")
      EndIf   
    
    otherwise: 
      LimpaRodape(0)
      Aguarde("Carregando itens")

      cc  =0
      While [Numero da OE]=[ExpedofC->Numero Da OE]
       If [Quantidade_Expedida]>0 
          Then cc=cc+1
       EndIf   
       Skip
       If EOT() Then QuitLoop EndIf
      EndWhile
      
      If cc=0 
         Then NUMOE="" 
              MSG="" 
				      MSG=MSG+"N„o existe Item com Quantidade expedida para esta ordem !//"
              MSG=MSG+"Verificar expedi‡„o !//"
              Mensagem(MSG)
				      QuitLoop
      EndIf   
  
      qtde=0

      Moveto "ExpedofI"
      Moveto [Numero da OE]
      Locate [ExpedofC->Numero Da OE]
      While [Numero da OE]=[ExpedofC->Numero da OE]
       Aguarde("Processando itens")

       PARAM_ITEM_FORA_PEDIDO="N"
       If [Quantidade_Expedida]>0
          Then 
               Itemok=false
               Switch
                 Case ROTINA_EXPEDICAO = "OF" : 
                      Moveto "FaturaI"
          	          Moveto [Numero da OF]
                      Locate [FaturaC->Numero da OF],[ExpedofI->Item da OE]
                      If RetVal and [Codigo do Item]=[ExpedofI->Codigo do Item]
          	             Then 
                              copytoarray regfaturai
                              Itemok=true
          	                  SEQIT =[Item da OF]
                      EndIf
                Case ROTINA_EXPEDICAO = "SEM_PED" : 
                     Item   = [Codigo do Item]
                     SEQIT  = [Item da OE    ]
                     Itemok = true
                     GetRecord "\\sistemas\\estoque\\itens" Item to regitens
                     If Not RetVal
                        Then Itemok = False
                             Mensagem("Item: "+Item+" nÆo cadastrado !")
                     EndIf        
                    
                     If Itemok
                        Then Tentativa = 0
                             Moveto "FaturaI"
              	             While True
              	               Tentativa = Tentativa + 1
                               End Down
              	               [Numero da Of  ] = [FaturaC->Numero da Of]
              	               [Item da Of    ] = SEQIT
              	               [Codigo do Item] = Item
              	               If Not IsLockRecord()
              	                  Then QuitLoop
              	                  Else Del
              	                       If Tentativa >= 10
              	                          Then Mensagem("N„o ‚ possivel adicionar o item "+Strval(SEQIT)+" da expedi‡„o "+PED_ORC_FATURA+"!")
                                               Itemok=False
                                               QuitLoop
              	                       EnDIf
              	               EndIf   
              	             EndWhile     
      	             EndIf
               EndSwitch                   		     
      		     
               If ItemOk
      		         Then CHAVEI=0
                        
  	                    Inicia_Registro()
                        
                        If ROTINA_EXPEDICAO <> "SEM_PED"
                           Then While IsLockRecord() EndWhile
                        EndIf         	                    

                        VSD_I_Codigo_Item=[Codigo do Item]   
       	                [Quantidade     ]=[ExpedofI->Quantidade_Expedida ]
       	              
       	                If ROTINA_EXPEDICAO = "SEM_PED"
                           Then Pega_Preco("Novo")
                        EndIf

                        if ROTINA_EXPEDICAO = "OF"
                           then
                                switch
                                  case [Tipo Desconto Item]="U" : [Valor Desconto Item]=round([Quantidade]*[Valor Desconto Unitario],2)
                                  case [Tipo Desconto Item]="T" :
                                       if [Taxa Desconto Unitario]>0 
                                          then [Valor Desconto Unitario]=round((round([Quantidade]*[Preco Unitario],2)*[Taxa Desconto Unitario])/100,2)
                                          else [Valor Desconto Unitario]=round((regfaturai["Valor Desconto Item"]/regfaturai["Quantidade"])*[Quantidade],2)
                                       endif
                                       [Valor Desconto Item    ]=[Valor Desconto Unitario]
                                endswitch
                        endif
                        [Preco Total]=Round([Quantidade]*[Preco Unitario],2)-[Valor Desconto Item]
                      
  				              qtde         =qtde+[ExpedofI->Quantidade_Expedida]
				            
  				              CONT_ARRAY = CONT_ARRAY + 1 
                        ITEM_EXPEDICAO[CONT_ARRAY] = AlinhM(StrVal(SEQIT),3)+Format("W10",VSD_I_Codigo_Item)
				              
  				              If ROTINA_EXPEDICAO = "SEM_PED"
                           Then If [Preco Unitario]<=0
                  	               Then If [Preco Unitario]<=0
                  				                 Then MSG="Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30)
                  				                      Mensagem(MSG+"//Item sem tabela de pre‡o !")
                  				              EndIf
                  	                    ItemOk=False
                                        Del     
                  	            EndIf
                  	            
                        EndIf
                        If ItemOk
                           Then ESTOQUE()
				                        Unlockrecord
		                            SaveTables
		                    EndIf        
    		           Else If ROTINA_EXPEDICAO = "OF"
    		                   Then MSG="Item da expedi‡Æo "+[ExpedofI->Codigo do Item]+" "+[ExpedofI->Descricao do Item]+", //"
                                MSG=MSG+"nÆo localizado nesta OF !"
    		                        Mensagem(MSG)
    		                   Else Mensagem("Ocorreu um erro ao tentar inserir o item "+Strval(SEQIT)+" da expedi‡„o "+PED_ORC_FATURAR+"!")     
    		                EndIf        
    		       Endif           
     EndIf
		 Moveto "ExpedofI"
     Skip
     If EOT() Then QuitLoop EndIf
    EndWhile

    If qtde>0
       Then FATUROU_OE=True
            Moveto "ExpedofC"
            [Situacao da OE]="FATURADO"
            [Data_Liberacao]=Today()
            [Hora_Liberacao]=Time()
            UnLockRecord
    EndIf    
  
  endSwitch
  
	QuitLoop                                  
EndWhile
Moveto "FaturaC"
Do_It!

Moveto "ExpedofC" ClearImage
Moveto "ExpedofI" ClearImage
If ROTINA_EXPEDICAO <> "SEM_PED"
   Then Moveto "PedidoI"   ClearImage
EnDIf   
Moveto "FaturaC"
CoEditKey
FormKey
IsLockRecord()

If SYS_CODIGO_CLIENTE="0377"
   Then Switch
          Case ROTINA_EXPEDICAO = "PED" :
               Moveto "PedidoI"
               If [FaturaC->Tipo Movimento Estoque]="S"
                  Then ATUA_SITUACAO_PEDIDO_ORCAMENTO()
               EndIf
               Usando_Expedicao=False
          Case ROTINA_EXPEDICAO = "OF" :
               If DynArraySize(ITEM_EXPEDICAO) > 0 And NUMOE<>""
                  Then Moveto "FaturaI"
                       Scan
                          SEQIT    = [Item da OF] 
                          AUX_ITEM = [Codigo do Item]
                                           
                          AUX_ACHOU = False
                          For ay From 1 To DynArraySize(ITEM_EXPEDICAO)
                            AUX_SEQ_ARRAY  = NumVal(SubStr(ITEM_EXPEDICAO[ay],1,3))  
                            AUX_ITEM_ARRAY = SubStr(ITEM_EXPEDICAO[ay],4,10)
                                      
                            If SEQIT=AUX_SEQ_ARRAY And AUX_ITEM=AUX_ITEM_ARRAY
                               Then AUX_ACHOU = True
                                    QuitLoop
                            EndIf   
                          Endfor
                                    
                          If Not AUX_ACHOU
                             Then GetRecord "ExpedofI" NUMOE,SEQIT To REG_OE
                                  If Not RetVal
                                     Then MSG="Item da Nota "+[Codigo do Item]+" "+[Descricao do Item]+", //"
                                          MSG=MSG+"nÆo localizado na Expedi‡„o !"
                                     Else MSG="N„o ocorreu expedi‡„o para o item "+[Codigo do Item]+" "+[Descricao do Item]+"!"
                                  EndIf
                                  ;---- Estorno do Item -----------------------------------------------
                                  CHAVEI=8
                                  
                                  ESTOQUE()
                                  ATUA_PEDIDO_ORCAMENTO()
                                  
                                  If PARAM_RATEIO_COMISSAO="I"
                                     Then Excluir_Rateio_Comissao()
                                  EndIf 
                                  
                                  Moveto "FaturaI"  
                                  [Quantidade ]=0
                                  [Preco Total]=0    
                                  ;--------------------------------------------------------------------
                      		        Mensagem(MSG)
                          EndIf
                       EndScan      
                         
                       Moveto "FaturaI"
                       Home
                       While True  
                         If [Quantidade]=0
                            Then Del
                                 Home
                         EndIf 
                         Skip
                         If Eot() Then QuitLoop EndIf  
                       EndWhile   
               EndIf
        EndSwitch       
EndIf
Usando_Expedicao=False

;---- Adicionando Numero da Expedi‡Æo na Cabe‡a da Nota -------------------------    
If NUMOE<>"" And FATUROU_OE
   Then ANT_TAB = Table()
        ANT_FIE = Field()
        
        Moveto "FaturaC"
        [Numero da Expedicao    ] = NUMOE
        [Origem da Expedicao    ] = "OF"
        
        GetRecord "ExpedofC" NUMOE To REG_EXPEDOF
        If RetVal 
           Then [Marca dos Volumes      ] = REG_EXPEDOF["Marca dos Volumes"      ]
                [Numero Ordem de Volumes] = REG_EXPEDOF["Numero Ordem de Volumes"]
                [Numero de Volumes      ] = REG_EXPEDOF["Numero de Volumes"      ]
                [Especie de Volumes     ] = REG_EXPEDOF["Especie de Volumes"     ]
                [Peso Bruto             ] = REG_EXPEDOF["Peso Bruto"             ]
                [Peso Liquido           ] = REG_EXPEDOF["Peso Liquido"           ]
                
                GetRecord "\\Sistemas\\Cadastro\\Usuarios" REG_EXPEDOF["Codigo_Usuario"] To REG_USUARIO
                If RetVal
                   Then VSDGNOMUSUARIO = REG_USUARIO["Nome"]
                   Else VSDGNOMUSUARIO = ""
                EndIf
                ;---- Caso o usu rio venha a solicitar para liberar o carregamento posterior de um nova OE
                ;PosI = Search("EXPEDICAO",Upper([Observacao na Nota Fiscal]))
                ;If PosI>0
                ;   Then [Observacao na Nota Fiscal] = Rtrim(SubStr([Observacao na Nota Fiscal],1,PosI-1)+SubStr([Observacao na Nota Fiscal],PosI,60))
                ;EndIf                                                                                       
                [Observacao na Nota Fiscal] = "EXPEDICAO: "+Format("W4",REG_EXPEDOF["Codigo_Usuario"])+" "+Format("W20",VSDGNOMUSUARIO)+"  "+
                                                            Format("D13",Strval(REG_EXPEDOF["Data_Inclusao"]))+" "+
                                                            Format("W10",StrVal(REG_EXPEDOF["Hora_Inclusao"]))
                
        EndIf
        Release Vars REG_EXPEDOF,VSDGNOMUSUARIO
        
        Moveto ANT_TAB
        Moveto Field ANT_FIE
        Release Vars ANT_TAB,ANT_FIE
EndIf        
;-------------------------------------------------------------------------------
LimpaRodape(0)
EndProc  

;*******************************************************************************
;* Rotina p/ Cancelar Expedicao                                                *
;*******************************************************************************
Proc Cancela_Expedicao()
Private REG_EXPEDOF

GetRecord "ExpedofC" [FaturaC->Numero da Expedicao] To REG_EXPEDOF
If Not RetVal
   Then Mensagem("Expedi‡„o "+[FaturaC->Numero da Expedicao]+" n„o foi localizada para CANCELAMENTO!")
        Return
   Else If REG_EXPEDOF["Numero da OF"]=""
           Then Return
        EndIf  
EndIf    

Moveto "FaturaC"
UnLockRecord
FormKey
IsLockRecord()

{TableAdd} {ExpedofC}

Moveto "ExpedofC"
Moveto [Numero da OE]
Locate [FaturaC->Numero da Expedicao]
If RetVal
   Then [Situacao da OE]="CANCELADA"   
EndIf
Do_It!
Moveto "ExpedofC"  ClearImage
Moveto "FaturaC"
CoEditKey
FormKey
IsLockRecord()
Return

EndProc ;Cancela_Expedicao()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
If Not IsAssigned(ROTINA_EXPEDICAO) Then ROTINA_EXPEDICAO="" EndIf

If ROTINA_EXPEDICAO="CANCELAR"
   Then Cancela_Expedicao()
   Else FATUROU_OE        = False
        PARAM_ALTERA_QTDE = ""
        PARAM_INCLUI_ITEM = ""
        
        If Not IsEmpty("P_Pedido") And ROTINA_EXPEDICAO="PED"
           Then GetRecord "P_Pedido" [FaturaC->Codigo da Empresa] To REG_PEDIDO
                If RetVal
                   Then PARAM_ALTERA_QTDE = REG_PEDIDO["Altera_Qtde_Expedic"]
                        PARAM_INCLUI_ITEM = REG_PEDIDO["Inclui_Item_Expedic"]
                EndIf
        EndIf        
        Expedicao()
EndIf         

Release Vars PARAM_ALTERA_QTDE,PARAM_INCLUI_ITEM
Release Procs Expedicao,Cancela_Expedicao
