;** FT_EXPED *******************************************************************
;*  Rotina de faturamento de ordem de expedicao                                *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 02/12/2009 por Anivel Augusto Rodrigues
;Ultima Alteracao: 02/01/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes localizar pedido/expedicao
;Ultima Alteracao: 10/03/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes sequencia item faturaI      
;Ultima Alteracao: 06/04/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Faturar sim/nao expedicao<>pedido
;Ultima Alteracao: 14/04/2010 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Faturar expedicao SORTIDO LUPUS
;Ultima Alteracao: 06/05/2010 por Bruno Carvalho
;Motivo Alteracao: Ajustes Usar Pedido/Expedicao para Entrada
;Ultima Alteracao: 21/05/2011 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes SORTIDOS Isabela Garcia  
;Ultima Alteracao: 26/07/2013 por Karina/Bruno
;Motivo Alteracao: Ajustes SORTIDOS Zuggy_zi #0232#
;Ultima Alteracao: 24/09/2013 por Bruno Carvalho
;Motivo Alteracao: Ajustes variavel "Pedido_Empresa"
;Ultima Alteracao: 26/09/2013 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Usando_Expedicao 
;Ultima Alteracao: 13/02/2014 por Andrey Fillipe
;Motivo Alteracao: Adicionado campo observacao                  
;Ultima Alteracao: 16/12/2014 por Bruno Carvalho
;Motivo Alteracao: Criado CODIGO_FATURA p/ guardar [CODIGO] FaturaC (Solicita‡Æo 14074).
;Ultima Alteracao: 13/03/2015 por Andrey Fillipe
;Motivo Alteracao: Retiraddo variavel CODIGO_FATURA estava dando erro ao fatura expedicao
;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: 03/05/2017 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado parƒmetro PARAM_SEQUENCIA_EXPEDICAO
;Ultima Alteracao: 05/05/2017 por Bruno Carvalho                          
;Motivo Alteracao: Ajustes ao identificar item duplicidade na expedi‡Æo
;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: 24/05/2017 por Rafael Matos                         
;Motivo Alteracao: Retirado debug linha 157 
;Ultima Alteracao: 13/06/2017 por Bruno Carvalho                          
;Motivo Alteracao: InclusÆo da variavel de controle FATUROU_OE p/ verificar se ordem de expedi‡Æo foi faturada
;Ultima Alteracao: 11/07/2017 por Bruno Carvalho  
;Motivo Alteracao: Adicionado 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: 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: 05/12/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes mensagem item que nÆo esta no pedido
;Ultima Alteracao: 12/12/2017 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes nova logica
;Ultima Alteracao: 26/03/2018 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes mensagem processando       
;Ultima Alteracao: 11/02/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes #0425 sortido              
;Ultima Alteracao: 12/02/2019 por Bruno Carvalho                           
;Motivo Alteracao: Adicionado processo de #0222# p/ #0425# sortido -> onde foi adicionado anteriormente o sys_codigo_cliente 
;Ultima Alteracao: 30/04/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Ajustes #0428 sortido              
;Ultima Alteracao: 06/05/2019 por Anivel Augusto Rodrigues                           
;Motivo Alteracao: Add ClienteUsaItemSortido() e PegaItemSortido()

;*******************************************************************************
;* Faturamento de Ordem de Expedicao/Itens        
;*******************************************************************************
Proc ItensExpedicao()
Private cc, ccfp, ccd, Item, qtde, MSG, ItemPedidoOk,s

cc  =0
ccfp=0
ccd =0

Moveto "ExpedI"
Moveto [Numero da OE]
Locate [ExpedC->Numero Da OE]
If Retval
   Then 
        LimpaRodape(0)
        Aguarde("Carregando itens")

        While [Numero Da OE]=[ExpedC->Numero Da OE]
         If [Quantidade_Expedida]>0 
            Then
                cc=cc+1
                Switch
                  Case [Quantidade_Fora_Pedido]>0 : ccfp=ccfp+1 
                  Case [Quantidade_Diferenca ]>0  : ccd =ccd +1
                EndSwitch
         EndIf   
        
         Skip
         If EOT() Then QuitLoop EndIf
        EndWhile
endif

If cc=0 or ( [FaturaC->Tipo Movimento Estoque]="S" And (ccfp>0 or ccd>0) )
   Then 
        switch
          case cc=0: 
            MSG=""
            MSG=MSG+"Ordem de Expedi‡Æo "+[ExpedC->Numero da OE]+"// //"
	          MSG=MSG+"N„o existe item com quantidade expedida !// //" 
            MSG=MSG+"Verificar dados da expedi‡„o !"
            mensagem(MSG)
            return false
            
          otherwise:
            MSG=""
            MSG=MSG+"Ordem de Expedi‡Æo "+[ExpedC->Numero da OE]+"// //"
            if ccd>0
               then MSG=MSG+"Existe item com quantidade expedida maior que do pedido !// //"   
            endif
            if ccfp>0
               then MSG=MSG+"Existe item expedido diferente do pedido !// //"
            endif
            MSG=MSG+"Verificar dados da expedi‡„o e/ou do pedido !// //"
            MSG=MSG+"Se faturar assim mesmo, o pedido ainda pode ficar 'EM ABERTO' !//"
            MSG=MSG+"Deseja faturar esta expedi‡„o ?"

            if ccd>0 or ccfp>0
               then
        			      If Not ConfGeral(MSG)
        			         Then return false
        			      EndIf   
			      EndIf
            MSG=""

        endswitch
EndIf   

qtde = 0

Moveto "ExpedI"
Moveto [Numero da OE]
Locate [ExpedC->Numero Da OE]
If Not Retval
   Then return false
endif
While [Numero Da OE]=[ExpedC->Numero Da OE]
  Aguarde("Processando itens")
 
  If [Quantidade_Expedida]<=0
    Then
         Skip
         If EOT() 
            Then QuitLoop
            else Loop 
         EndIf          
  endif
  qtde =qtde+[ExpedI->Quantidade_Expedida]

  item=[ExpedI->Codigo do Item] ; usa tambem no COPIA_PED_ORC_FATURA()
  for cc from 1 to 2

    PARAM_ITEM_FORA_PEDIDO="N"  ; usa tambem no COPIA_PED_ORC_FATURA()    
    ItemPedidoOk          =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 
            ItemPedidoOk=True
            quitloop
  
       Else 
            if cc=2
               then PARAM_ITEM_FORA_PEDIDO="S" 
                    quitloop
            endif   
            
            if ClienteUsaItemSortido()
               Then
    							  CODIT=[ExpedI->Codigo do Item]
                    PegaItemSortido()
                    Item=CODIT               
               else
                    PARAM_ITEM_FORA_PEDIDO="S"
                    quitloop
            EndIf
    EndIf
  endfor

  SEQI   =SEQI+1      
  CHAVEI =1 ; usa no estoque()
  QUANT  =0 ; usa no estoque()
  CTTOTAL=0 ; usa no estoque()

  Moveto "FaturaI"
  End Down
  [Numero da Of]=[FaturaC->Numero da Of      ]
  [Item da Of  ]=SEQI
  [Quantidade  ]=[ExpedI->Quantidade_Expedida] 
  if PARAM_ITEM_FORA_PEDIDO="S" 
     then
          item  =[ExpedI->Codigo do Item     ] ; usa tambem no COPIA_PED_ORC_FATURA()                        
  EndIf   
  COPIA_PED_ORC_FATURA() ; nesta rotina acerta codigo do item !!
  If ItemPedidoOk And [FaturaC->Tipo Movimento Estoque]="S" and DESTIN_ATUALIZA_PEDIDOS="S"
    Then 
         Moveto "PedidoI" 
         [Quantidade Faturada]=[Quantidade Faturada]+[FaturaI->Quantidade]
         UnlockRecord
  EndIf
  ESTOQUE()

  s=""
  if PARAM_ITEM_FORA_PEDIDO="S" 
     then s=s+">> ITEM N¶O EXISTE NO PEDIDO "+PED_ORC_FATURAR+"   <<//"
  EndIf   
  If [Preco Total]=0 Or [Preco Total]=Blanknum()
     Then s=s+">> ITEM SEM TABELA DE PRECO INFORMADA <<//"
  EndIf   
  if s<>""
     then
          MSG=""
          MSG=MSG+"Ordem de Expedi‡Æo "+[ExpedC->Numero da OE]+"// //"
          MSG=MSG+Completa("      Item: "+[ExpedI->Codigo do Item]+" - "+SubStr([ExpedI->Descricao do Item ],1,30),60," ")+"//"
          MSG=MSG+Completa("Referencia: "+Format("W13,AL",[ExpedI->Referencia])+
                                         [ExpedI->Codigo da Cor_Tecido]+" "+[ExpedI->Descricao da Cor_Tecido],60," ")+"//"
          if [ExpedI->Quantidade_Expedida]-int([ExpedI->Quantidade_Expedida])>0
             then MSG=MSG+Completa("Quantidade: "+ltrim(Format("W11.3,EICB",[ExpedI->Quantidade_Expedida])+" /"+[ExpedI->Unidade Fiscal]),60," ")+"// //"
             else MSG=MSG+Completa("Quantidade: "+ltrim(Format("W11,EICB"  ,[ExpedI->Quantidade_Expedida])+" /"+[ExpedI->Unidade Fiscal]),60," ")+"// //"
          endif   
          MSG=MSG+s
          Mensagem(MSG)
  endif
  
  SaveTables
  Moveto "ExpedI"
  
  Skip
  If EOT() Then QuitLoop EndIf          
EndWhile

If qtde>0
   Then 
        Moveto "ExpedC"
        [Situacao da OE]="FATURADO"
        [Data_Liberacao]=Today()
        [Hora_Liberacao]=Time()
        UnLockRecord
        
        return true
   else
        return false
EndIf        
        
endproc ;ItensExpedicao()

;*******************************************************************************
;* Faturamento de Ordem de Expedicao              
;*******************************************************************************
Proc Expedicao()
Private OK, ExpedOk, PedidoOK
        
PED_ORC_FATURAR=[FaturaC->Numero do Pedido]
PED_ORC_FAT    =""
OK             =""

ShowDialog "Expedi‡„o" proc "OPCAO" @ 09,20 height 03 width 30
  @ 0,4 ?? "N§ Pedido:"
  Accept @ 00,16 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
If OK="N"
   Then Return
EndIf
PED_ORC_FATURAR=AlinhM(PED_ORC_FAT,6)

PedidoOK=true
Moveto "FaturaC"
[Numero Pedido_Orcamento]=PED_ORC_FATURAR

Moveto "PedidoC"
If RecordStatus("New")
   Then 
        PedidoOK=False
        Mensagem("Pedido n„o Encontrado !")
   Else 
        If [Codigo] <> [FaturaC->Codigo] 
           Then 
                Mensagem("Pedido informado c/ Cliente diferente desta Fatura !")
                PedidoOK=False
           else     
                Pedido_Empresa=[Codigo da Empresa   ]
                Pedido_Destin =[Codigo da Destinacao]+[Descricao da Destinacao]
        EndIf
EndIf
if not PedidoOK
   then
        Moveto "FaturaC"
        [Numero Pedido_Orcamento]=""
        
        return
endif

Moveto "FaturaI"
End
SEQI=[Item da Of]

Moveto "FaturaC"
Moveto [Numero da OF]
UnLockRecord
FormKey
IsLockRecord()
 
{TableAdd} {ExpedC}
{TableAdd} {ExpedI}
{TableAdd} {PedidoI}

ExpedOk=False
Moveto "ExpedC"
Moveto [Numero do Pedido]
Locate PED_ORC_FATURAR
If Retval
   Then While True
				If [FaturaC->Tipo Movimento Estoque]="E"
				   Then 
                ExpedOk=True
				        QuitLoop
					 Else 
                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]+" , Carregamento "+[Numero_Carregamento],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
          EndIf
          Skip
          If EOT() Then QuitLoop EndIf

          Locate Next PED_ORC_FATURAR
          If Not Retval
             Then QuitLoop
          EndIf                                 
        EndWhile
EndIf

If not ExpedOk
   Then 
        Mensagem("Ordem de expedi‡„o [LIBERADA] n„o encontrada para o pedido "+PED_ORC_FATURAR+" !")
   else
        ExpedOK   =ItensExpedicao()
        If ExpedOK 
           then
                Moveto "FaturaC"
                [Numero da Expedicao    ] = [ExpedC->Numero da OE            ]
                [Origem da Expedicao    ] = "IC"
                [Marca dos Volumes      ] = [ExpedC->Marca dos Volumes       ]
                [Numero Ordem de Volumes] = [ExpedC->Numero Ordem de Volumes ]
                [Numero de Volumes      ] = [ExpedC->Numero de Volumes       ]
                [Especie de Volumes     ] = [ExpedC->Especie de Volumes      ]
                [Peso Bruto             ] = [ExpedC->Peso Bruto              ]
                [Peso Liquido           ] = [ExpedC->Peso Liquido            ]      
                UnLockrecord
        endif
EndIf

Do_It!
Moveto "ExpedC"  ClearImage
Moveto "ExpedI"  ClearImage
Moveto "PedidoI" ClearImage
Moveto "FaturaC"
CoEditKey
FormKey
IsLockRecord()

If ExpedOK and [FaturaC->Tipo Movimento Estoque]="S" and DESTIN_ATUALIZA_PEDIDOS="S"
   Then 
        Moveto "PedidoI" 
        ATUA_SITUACAO_PEDIDO_ORCAMENTO() ;form em que pedidoc e pedidoi linked no FaturaC !!
EndIf

LimpaRodape(0)
EndProc   ;Expedicao()

;*******************************************************************************
;*  Rotina principal                                                           *
;*******************************************************************************

If PARAM_PEDIDO="S"
   Then 
        Usando_Expedicao=True
        Expedicao()
EndIf   

Release Vars Usando_Expedicao,PED_ORC_FATURAR,PED_ORC_FAT

Release Procs Expedicao,ItensExpedicao