;** FT_EXPIQ *******************************************************************
;*  COPIA INICIAL DO FT_EXPED - Faturamento de ordem de expedicao - etiqueta   *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 03/02/2017 por Bruno Carvalho            
;Ultima Alteracao: 02/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: 09/05/2017 por Bruno Carvalho                          
;Motivo Alteracao: Adicionado msg de alerta para quando o item nÆo for localizado no pedido
;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: 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, Item, qtdp, qtde,NOF
If PARAM_PEDIDO<>"S"
   Then Return
EndIf   

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

NOF = [Numero 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)

If SYS_CODIGO_CLIENTE="0388" Or SYS_CODIGO_CLIENTE="0390" Or SYS_CODIGO_CLIENTE="0345"
   Then If [FaturaC->Numero do Pedido]<>"" And [FaturaC->Numero do Pedido]<>PED_ORC_FATURAR
           Then Mensagem("Pedido "+PED_ORC_FATURAR+" ‚ diferente do informado na FATURA!")
                Return
        EndIf        
EndIf   

Moveto "FaturaC"
[Numero Pedido_Orcamento]=PED_ORC_FATURAR
Moveto "PedidoC"
If RecordStatus("New")
   Then Mensagem("Pedido n„o Encontrado !")
        Return
   Else ;If Not IsAssigned(CODIGO_FATURA)
        ;   Then CODIGO_FATURA = [FaturaC->Codigo]
        ;EndIf    
        If [Codigo] <> [FaturaC->Codigo] ;CODIGO_FATURA
           Then Mensagem("Pedido c/ Cliente diferente desta Fatura !")
                Return
        EndIf
        Pedido_Empresa=[Codigo da Empresa   ]
        Pedido_Destin =[Codigo da Destinacao]+[Descricao da Destinacao]
EndIf

Moveto "FaturaC"
UnLockRecord
FormKey
IsLockRecord()

{TableAdd} {ExpedC}
{TableAdd} {ExpedIQ}
{TableAdd} {PedidoI}

Moveto "FaturaC"
Moveto [Numero da OF]
Locate NOF
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 "ExpedIQ" ClearImage
        Moveto "PedidoI" ClearImage
        Moveto "FaturaC"
        CoEditKey
        FormKey
        IsLockRecord()
        Return
EndIf

SEQPED = BlankNum()
NUMOE  = [Numero da OE    ]
OBS    = [Observacao      ]
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 "ExpedIQ"
  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 
          LimpaRodape(0)
          Aguarde("Carregando itens")

          ExpedOk=True
          cc  =0
          ccfp=0
          ccd =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 [FaturaC->Tipo Movimento Estoque]="S" And cc=0
             Then MSG="" 
						      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 NUMOE=""
                          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 NUMOE=""
                                  QuitLoop
										      EndIf   
						      EndIf   
          EndIf   
      
          qtdp=0
          qtde=0
          
          Moveto "ExpedIQ"
          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 
              Item=[ExpedIQ->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 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([ExpedIQ->Codigo do Item],1,7)+"9"+
																			 SubStr([ExpedIQ->Codigo do Item],9,2)
                                Case SYS_CODIGO_CLIENTE="0232":
																	Item=SubStr([ExpedIQ->Codigo do Item],1,8)+"9"+
																			 SubStr([ExpedIQ->Codigo do Item],10,1)																			 
																Case SYS_CODIGO_CLIENTE="0079":
																	Item=SubStr([ExpedIQ->Codigo do Item],1,6)+"99"+
																			 SubStr([ExpedIQ->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 "ExpedIQ"
      
                      ;Item fora do Pedido
                      If PARAM_INCLUI_ITEM="S" And [Quantidade_Fora_Pedido]>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
                         Else Mensagem("O item "+item+" n„o foi localizado no pedido "+PED_ORC_FATURAR+",//n„o ocorrer  faturamento para este item!")     
                      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
              
              Duplicidade=False
              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 MSG =       Completa("Pedido: "+PED_ORC_FATURAR,65," ")+"////"
                                      MSG = MSG + Completa("Foi identificado que o item "+[ExpedIQ->Codigo do Item]+" j  foi lan‡ado na rela‡„o",65," ")+"//"
                                      MSG = MSG + Completa("dos itens.",65," ")+"////"
                                      MSG = MSG + Completa("A quantidade deste item ser  ajustada nesta rela‡„o!",65," ")
                                      Duplicidade=True                 
                              EndIf                
                      EndIf
                      If ExpedOk And Not Duplicidade
                         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
              
              item = [ExpedIQ->Codigo do Item]   
              qtde = qtde + [ExpedIQ->Quantidade_Expedida]
              If PARAM_SEQUENCIA_EXPEDICAO And Duplicidade
                 Then [Quantidade] = [Quantidade] + [ExpedIQ->Quantidade_Expedida]
                 Else [Quantidade] = [ExpedIQ->Quantidade_Expedida]
              EndIf
            
              COPIA_PED_ORC_FATURA()
              
              If [Preco Total]=0 Or [Preco Total]=Blanknum()
                 Then MSG=    Completa("N£mero da Expedicao: "+[ExpedC->Numero da OE],60," ")+"// //"
                      MSG=MSG+Completa("               Item: "+[Codigo do Item]+" - "+SubStr([Descricao do Item ],1,30),60," ")+"//" 
                      MSG=MSG+Completa("Quantidade Expedida: "+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 "ExpedIQ"
                      ;Skip
                      ;If Eot() 
                      ;   Then QuitLoop 
                      ;   Else Loop
                      ;EndIf   
              EndIf                   
            
              CHAVEI=1
              ATUALIZA=True
              PARAM_CHECA_ESTOQUE_SEMMENSSAGEM = False
              
              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  : "+StrVal(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]

                              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 "ExpedIQ"
          
            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]+" continua em "+[ExpedC->Situacao da OE]+", faturado parcial !")
          EndIf   

          QuitLoop
  EndIf
  QuitLoop
EndWhile

Moveto "FaturaC"
OBS1 = [Observacao na Nota Fiscal]
Switch
   Case OBS<>"" And OBS1="" :
        [Observacao na Nota Fiscal] = "OBS. EXPEDICAO: "+OBS
   Case OBS<>"" And OBS1<>"":
        [Observacao na Nota Fiscal] = OBS1+"\n"+"OBS. EXPEDICAO: "+OBS
EndSwitch
Do_It!

Moveto "ExpedC"  ClearImage
Moveto "ExpedIQ" ClearImage
Moveto "PedidoI" ClearImage
Moveto "FaturaC"
CoEditKey
FormKey
IsLockRecord()

Moveto "PedidoI"
If [FaturaC->Tipo Movimento Estoque]="S"
   Then ATUA_SITUACAO_PEDIDO_ORCAMENTO()
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] = "IQ"
        
        GetRecord "ExpedC" NUMOE To REG_EXPEDC
        If RetVal 
           Then [Marca dos Volumes      ] = REG_EXPEDC["Marca dos Volumes"      ]
                [Numero Ordem de Volumes] = REG_EXPEDC["Numero Ordem de Volumes"]
                [Numero de Volumes      ] = REG_EXPEDC["Numero de Volumes"      ]
                [Especie de Volumes     ] = REG_EXPEDC["Especie de Volumes"     ]
                [Peso Bruto             ] = REG_EXPEDC["Peso Bruto"             ]
                [Peso Liquido           ] = REG_EXPEDC["Peso Liquido"           ]      
        EndIf
        Release Vars REG_EXPEDC
        
        Moveto ANT_TAB
        Moveto Field ANT_FIE
        Release Vars ANT_TAB,ANT_FIE
EndIf        
;---------------------------------------------------------------------------------
   
LimpaRodape(0)
EndProc   ;  (Expedicao)

;**** Rotina Principal *****
FATUROU_OE        = False
PARAM_ALTERA_QTDE = ""
PARAM_INCLUI_ITEM = ""

If Not IsEmpty("P_Pedido")
   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()

Release Vars PARAM_ALTERA_QTDE,PARAM_INCLUI_ITEM
Release Procs Expedicao
