;***** 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 p/ #0345# 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       
;Ultima Alteracao: 18/07/2018 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado p/ #0419# parƒmetro PARAM_SEQUENCIA_EXPEDICAO -> Conforme ‚ feito para o #0388#                                      
;Ultima Alteracao: 28/12/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Adicionado processos de #0427#
;Ultima Alteracao: 21/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajuste #0377# obs expedicao
;Ultima Alteracao: 29/03/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajuste #0377# pegar preco de custo para saida industrializa‡Æo
;Ultima Alteracao: 06/05/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajuste #0377# checar estoque e nÆo carregar expedi‡Æo se estoque negativo
;Ultima Alteracao: 06/06/2019 por Bruno Carvalho
;Motivo Alteracao: Alterado todo o processo onde antes utilizava a tabela "ExpedOfC", que a partir de entÆo passou a ser "ExpedC"
;Ultima Alteracao: 24/09/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes tabela preco faturai=faturac  
;Ultima Alteracao: 21/10/2019 por Bruno Carvalho 
;Motivo Alteracao: Ajustes p/ nÆo excluir da fatura itens com [quantidade]=0 e [quantidade solicitada]>0
;Ultima Alteracao: 05/12/2019 por Bruno Carvalho
;Motivo Alteracao: Adicionado processos de #0388# para #0444# 
;Ultima Alteracao: 28/04/2020 por Bruno Carvalho
;Motivo Alteracao: Adicionado TipoItem_ControlaEstoque()
;Ultima Alteracao: 28/04/2020 por Bruno Carvalho
;Motivo Alteracao: Removido processo de altera‡Æo do item p/ item sortido #0222# #0232# #0079# *NÆo h  utiliza‡Æo deste processo nesta rotina
;Ultima Alteracao: 20/05/2020 por Bruno Carvalho
;Motivo Alteracao: Removido um "Or" sobrando na proc SoCheca_Estoque()  

;*******************************************************************************
;* Faturamento de Ordem de Expedicao              
;*******************************************************************************
Proc Expedicao()
Private OK, PED_ORC_FAT, SEQI, Atualiza, ExpedOk, cc, ccfp, ccd, Itemok, qtdp, qtde, NUMOE,
        regfaturai, bloquearfatura

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} {ExpedC}
{TableAdd} {ExpedofI}

If ROTINA_EXPEDICAO <> "SEM_PED"
   Then {TableAdd} {PedidoI}
EnDIf
                
ExpedOk=False
Moveto "ExpedC"
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 "ExpedC"    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" Or
       SYS_CODIGO_CLIENTE="0427" Or
       SYS_CODIGO_CLIENTE="0419" Or
       SYS_CODIGO_CLIENTE="0444"  : 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  

bloquearfatura  =false
Usando_Expedicao=True

While True
	Moveto "ExpedofI"
	Moveto [Numero da OE]
	Locate [ExpedC->Numero Da OE]
	If Not Retval
	   Then NUMOE=""
          Mensagem("Ordem de Expedicao "+[ExpedC->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]=[ExpedC->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   


      If SYS_CODIGO_CLIENTE="0377"
         then
              Aguarde("Verificando estoque")
              MSG=""
         
              Moveto "ExpedOfI"
              Moveto [Numero da OE]
              Locate [ExpedC->Numero Da OE]
              While [Numero Da OE]=[ExpedC->Numero Da OE]
        
                if [Quantidade_Expedida]>0
                   then 
                        SoCheca_Estoque([Quantidade_Expedida],0)
                endif
                 
                Moveto "ExpedOfI"
                Skip
                If EOT() Then QuitLoop EndIf
            EndWhile
            LimpAguarde()
            
            If not Isblank(MSG)
               then 
                    Mensagem("Expedi‡Æo com estoque Insuficiente !// //"+
                    "Item                                         Expedido      Estoque   "+"//"+MSG)
                    quitloop
            endif        
      endif
  
      qtdp=0
      qtde=0
      
      Moveto "ExpedOfI"
      Moveto [Numero da OE]
      Locate [ExpedC->Numero Da OE]
      While [Numero Da OE]=[ExpedC->Numero Da OE]
        Aguarde("Processando itens")

        qtdp=qtdp+[ExpedOfI->Quantidade_OF]
        
        PARAM_ITEM_FORA_PEDIDO="N"
        
        while [Quantidade_Expedida]>0 

          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
          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]

        
          CHAVEI=1
          ATUALIZA=True     
          PARAM_CHECA_ESTOQUE_SEMMENSSAGEM = False

          switch
            case SYS_CODIGO_CLIENTE="0377":

             ;Em 04/08 foi pedido p/ nÆo verificar o estoque ao faturar uma expedi‡Æo com pedido p/ #0377#
              if [FaturaC->Tipo Movimento Estoque]="S" and
                 Search("INDUSTR",[FaturaC->Descricao da Destinacao])>0 And
                 search([Tipo do Item],"P,S,T")>0
                 Then 
                      bkp_PARAM_BLOQUEIA_NEG          =PARAM_BLOQUEIA_NEG
                      PARAM_CHECA_ESTOQUE_SEMMENSSAGEM=false
                      PARAM_BLOQUEIA_NEG="N"
                      Checa_Estoque()

                      [Preco Unitario]=ULTIMO_CTENTRADA

                      PARAM_BLOQUEIA_NEG=bkp_PARAM_BLOQUEIA_NEG
              EndIf
          
            otherwise:
              Checa_Estoque()
              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)
          
          endswitch
          Release Vars PARAM_CHECA_ESTOQUE_SEMMENSSAGEM

          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                   
          
          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
          quitloop

        Endwhile
        
        Moveto "ExpedOfI"
        Skip
        If EOT() Then QuitLoop EndIf
      EndWhile
      
      If [FaturaC->Tipo Movimento Estoque]="S" And qtde>0
         Then FATUROU_OE=True
              Moveto "ExpedC"
              [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 "+[ExpedC->Numero da OE]+" esta como "+[ExpedC->Situacao da OE]+",//por‚m h  itens sem expedi‡„o!")
      EndIf   
    
    otherwise:                     ;-------------------------------------------- 
      LimpaRodape(0)
      Aguarde("Carregando itens")

      cc  =0
      While [Numero da OE]=[ExpedC->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   

      If SYS_CODIGO_CLIENTE="0377"
         then
              Aguarde("Verificando estoque")
              MSG=""
         
              Moveto "ExpedOfI"
              Moveto [Numero da OE]
              Locate [ExpedC->Numero Da OE]
              While [Numero Da OE]=[ExpedC->Numero Da OE]
        
                if [Quantidade_Expedida]>0
                   then
                        switch 
                          Case ROTINA_EXPEDICAO = "OF" : 
                            qtde=0
                            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
                                  qtde=[FaturaI->Quantidade]                                  
                            EndIf

                            Moveto "ExpedOfI"
                            SoCheca_Estoque([Quantidade_Expedida],qtde)
                       
                          otherwise :
                            SoCheca_Estoque([Quantidade_Expedida],0)
                            
                        endswitch 
                endif
                 
                Moveto "ExpedOfI"
                Skip
                If EOT() Then QuitLoop EndIf
            EndWhile
            LimpAguarde()
            
            If not Isblank(MSG)
               then 
                    Mensagem("Expedi‡Æo com estoque Insuficiente !// //"+
                    "Item                                         Expedido      Estoque   "+"//"+MSG)
                    quitloop
            endif        
      endif
  
      qtde=0
      
      Moveto "ExpedofI"
      Moveto [Numero da OE]
      Locate [ExpedC->Numero Da OE]
      While [Numero da OE]=[ExpedC->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 not ItemOk
                   then 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        
      		         else
                        CHAVEI=0
                        
  	                    Inicia_Registro()
                        
                        VSD_I_Codigo_Item=[Codigo do Item]   
       	                [Quantidade     ]=[ExpedofI->Quantidade_Expedida ]



       	              
       	                If ROTINA_EXPEDICAO = "SEM_PED"
                           Then 
	                              [Codigo da Tabela        ]=[FaturaC->Codigo da Tabela]
                                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        
    		       Endif
                          
        EndIf

	 	    Moveto "ExpedofI"
        Skip
        If EOT() Then QuitLoop EndIf
      EndWhile

      release vars bkp_PARAM_BLOQUEIA_NEG

      if bloquearfatura
         then qtde =0
              NUMOE=""
      endif

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

Moveto "ExpedC" 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 Exclui_Item=True
                                 GetRecord "FaturaI" [Numero da Of],[Item da OF] To REG_FATURAI
                                 If REG_FATURAI["Quantidade Solicitada"]>0
                                    Then Exclui_Item=False
                                 EndIf
                                 If Exclui_Item
                                    Then Del
                                         Home
                                 EndIf      
                         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 "ExpedC" 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

                If SYS_CODIGO_CLIENTE="0377" and not isblank(REG_EXPEDOF["Observacao"]) 
                   then if not isblank([Observacao na Nota Fiscal])
                           then [Observacao na Nota Fiscal] = [Observacao na Nota Fiscal]+", "
                        endif   
                        [Observacao na Nota Fiscal] = [Observacao na Nota Fiscal]+REG_EXPEDOF["Observacao"]   
                endif   

                if not isblank([Observacao na Nota Fiscal])
                   then [Observacao na Nota Fiscal] = [Observacao na Nota Fiscal]+", "
                endif   
                [Observacao na Nota Fiscal] = [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 "ExpedC" [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} {ExpedC}

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

EndProc ;Cancela_Expedicao()

;*******************************************************************************
;* Rotina p/ Checagem de Estoque Negativo                                     **
;*******************************************************************************
Proc SoCheca_Estoque(qtdexp, qtdest)
Private qtdexp,qtdest,MES_EST,ANO_EST, SALDOATUAL

If [FaturaC->Atualiza Estoque]<>"S" Or [FaturaC->Tipo Movimento Estoque]="E" Or IsBlank([Expedofi->Codigo do Item])
   Then Return True
EndIf

If Not TipoItem_ControlaEstoque([ExpedOFi->Tipo do Item])
   Then Return True
EndIf

MES_EST = AlinhM(StrVal(Month([FaturaC->Data de Emissao])),2)
ANO_EST =        StrVal( Year([FaturaC->Data de Emissao]))   

SALDOATUAL=0
Moveto "\\Sistemas\\Estoque\\SdEstq"
Locate [FaturaC->Codigo da Empresa],
       [Expedofi->Codigo do Item  ], ANO_EST, MES_EST
If RetVal
   Then SALDOATUAL=[Saldo Atual]
EndIf

If IsBlank(SALDOATUAL)
   Then SALDOATUAL=0
EndIf

SALDOATUAL=SALDOATUAL+qtdest
SALDOATUAL=NDecimal(SALDOATUAL-qtdexp,3)
If SALDOATUAL<0
   Then
        MSG=MSG+Format("W44,AL",[Expedofi->Codigo do Item]+" - "+SubStr([Expedofi->Descricao do Item ],1,30))+
                Format("W13.3,EIC",qtdexp)+
                Format("W13.3,EIC",SALDOATUAL)+"//"
EndIf

EndProc    ; (SoCheca_Estoque)


;*******************************************************************************
;* 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,SoCheca_Estoque
