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

;*******************************************************************************
;* Faturamento de Ordem de Expedicao              
;*******************************************************************************
Proc Expedicao()
Private OK, PED_ORC_FAT, SEQI, Atualiza, ExpedOk, cc, ccfp, ccd, Item, qtdp, qtde
If PARAM_PEDIDO<>"S"
   Then Return
EndIf   

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

PED_ORC_FATURAR=[FaturaC->Numero do Pedido   ]

OK=""
PED_ORC_FAT=""
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
PED_ORC_FATURAR=PED_ORC_FAT
If OK="N"
   Then Return
EndIf
PED_ORC_FATURAR=AlinhM(PED_ORC_FATURAR,6)
debug
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
EndIf

Moveto "FaturaC"
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+" !")
        Do_It!
        Moveto "ExpedC"  ClearImage
        Moveto "ExpedI"  ClearImage
        Moveto "PedidoI" ClearImage
        Moveto "FaturaC"
        CoEditKey
        FormKey
        IsLockRecord()
        Return
EndIf
Usando_Expedicao=True
While True
  Moveto "ExpedI"
  Moveto [Numero da OE]
  Locate [ExpedC->Numero Da OE]
  If Not Retval
     Then Mensagem("Ordem de Expedicao "+[ExpedC->Numero Da OE]+" sem itens !// Verificar !")
     Else 
          ExpedOk=True
          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_Pedido]>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 expedido 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 "ExpedI"
          Moveto [Numero da OE]
          Locate [ExpedC->Numero Da OE]
          While [Numero Da OE]=[ExpedC->Numero Da OE]
          
           qtdp=qtdp+[ExpedI->Quantidade_Pedido]

           If [Quantidade_Expedida]>0 Then
      
              
              Item=[ExpedI->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 If SearCh("LUPUS",NOMEMPRESA)>0
                         Then
                              itemant=item
                              Item=SubStr([ExpedI->Codigo do Item],1,7)+"9"+
                                   SubStr([ExpedI->Codigo do Item],9,2)

                              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 "ExpedI"
                      Skip
                      If EOT() 
                         Then QuitLoop
                         Else Loop
                      EndIf
              EndIf
          
		          qtdp=0
		          qtde=0

              ExpedOk=True
              Moveto "FaturaI"
              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
              If Not ExpedOk
                 Then QuitLoop
              EndIf   
      
      
              qtde          =qtde+[ExpedI->Quantidade_Expedida]
              [Quantidade  ]=[ExpedI->Quantidade_Expedida]
            
              COPIA_PED_ORC_FATURA()
            
              CHAVEI=1
              ATUALIZA=True
              If Not Checa_Estoque()
                 Then MSG=    "NŁmero do Pedido   : "+[Numero Pedido_Orcamento]+"    Item do Pedido: "+StrVal([Item Pedido_Orcamento])+"// //"
                      MSG=MSG+"Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30)+"// //"
                      MSG=MSG+"Quantidade faturada: "+StrVal(Format("W11.3,EICB",[Quantidade]))+"//"
                      MSG=MSG+"- Estoque atual    : "+StrVal(Format("W11.3,EICB",SALDOATUAL))  +"//"
                      MSG=MSG+"                     -------------"                             +"//"
                      MSG=MSG+"Falta em estoque   : "+StrVal(Format("W11.3,EICB",NOVOSALDO*-1))+"// //"
                      If PARAM_BAIXA_PARCIAL="S"
                         Then If SALDOATUAL<=0
                                 Then Del
                                      ATUALIZA=False
                                 Else MSG=MSG+"Faturando parcial  : "+StrVal(Format("W11.3,EICB",SALDOATUAL))  +"//"
                              Endif
                         Else Del
                              Atualiza=False
                      EndIf
            
                      If Not ATUALIZA
                         Then MSG=MSG+"Item n„o pode ser Faturado por Saldo Insuficiente !//"
                         Else [Quantidade]=SALDOATUAL
                              If [Quantidade]>0 and [Preco Unitario]>0
                                  Then [Preco Total]=Round([Quantidade]*([Preco Unitario]-[Valor Desconto Unitario]),2)
                                  Else If [Preco Unitario]>0
                                          Then [Preco Total]=Round([Preco Unitario]-[Valor Desconto Unitario],2)
                                       EndIf
                              EndIf
            
                              If PARAM_COMIS_MARCA="S"
                                Then If Search("VEND",[FaturaC->Descricao da Destinacao])>0 And
                                        (VSD_I_Tipo_Item="P" Or VSD_I_Tipo_Item="T")
                                        Then If [Quantidade]>0 and [Preco Unitario]>0
                                                 Then [Preco Total]=Round([Quantidade]*([Preco Unitario]),2)
                                                 Else If [Preco Unitario]>0
                                                         Then [Preco Total]=Round([Preco Unitario],2)
                                                      EndIf
                                             EndIf
                                     EndIf
                              EndIf
            
                              If [Tributacao de ICMS]<>"D"
                                 Then If Not IsBlank([Tributacao de ICMS      ])
                                          Then [Aliquota Reduzida BCICMS]=BlankNum()
                                               [Aliquota de ICMS        ]=BlankNum()
                                               [Valor do ICMS           ]=BlankNum()
                                       EndIf
                              EndIf
            
                              If [Aliquota Reduzida BCICMS]>0 And
                                 [Aliquota de ICMS        ]>0
                                 Then [Valor do ICMS]=NDecimal((([Preco Total]-(([Preco Total]*[Aliquota Reduzida BCICMS])/100))*[Aliquota de ICMS])/100,2)
                                 Else [Valor do ICMS]=NDecimal(([Preco Total]*[Aliquota de ICMS])/100,2)
                              EndIf
            
                              If [Aliquota Reduzida BCIPI ]>0 And
                                 [Aliquota de IPI         ]>0
                                 Then [Valor do IPI ]=NDecimal((([Preco Total]-(([Preco Total]*[Aliquota Reduzida BCIPI ])/100))*[Aliquota de IPI])/100,2)
                                 Else [Valor do IPI ]=NDecimal(([Preco Total]*[Aliquota de IPI ])/100,2)
                              EndIf
                              UnLockRecord
                      EndIf
                      Mensagem(MSG)
              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 "ExpedI"
          
            Skip
            If EOT() Then QuitLoop EndIf
          EndWhile
      
          If [FaturaC->Tipo Movimento Estoque]="S" And qtde>0
             Then 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]+" continua em "+[ExpedC->Situacao da OE]+", faturado parcial !")
          EndIf   

          QuitLoop
  EndIf
  QuitLoop
EndWhile
Do_It!
Moveto "ExpedC" ClearImage
Moveto "ExpedI" ClearImage
Moveto "PedidoI" ClearImage
Moveto "FaturaC"
CoEditKey
FormKey
IsLockRecord()
Usando_Expedicao=False

Moveto "PedidoI"
If [FaturaC->Tipo Movimento Estoque]="S"
   Then ATUA_SITUACAO_PEDIDO_ORCAMENTO()
EndIf
   
EndProc   ;  (Fatura_Pedido_Orcamento)



;**** Rotina Principal *****
Expedicao()
Release Procs Expedicao
