;** RM_0070A  ******************************************************************
;* Gera ordem de compra autom tica conforme estoque minimo - A partir RM_0070  *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 25/10/2019 por Bruno Carvalho          
;Ultima Alteracao:   /  /     por                     
;Motivo Alteracao: 

;Gera Ordem de Compra a partir do script RM_0070, conforme opÆo 1 [Menor/Igual ao M¡nimo]

;*******************************************************************************
;* Rotina para Localizar Registro                                              *
;*******************************************************************************
Proc CHAVEOC()

CHAVEOC=0
While True
  SetaCorRegistro("Editar")

  Moveto [Codigo do Item]
  End
  CODIGO_ITEM=[Codigo do Item]
  Down
  SetaCorRegistro("Editar")

  While True
    MSGCAMPO=""
    TECLA=""
    AguardaTeclasPadrao()
  
    If RetVal=-33
       Then ShowPopup " Funes VISE" CENTERED
             "[F8] ~G~erar Ordem de Compra" : " GeraÆo autom tica de Ordem de Compra     " :"F8",
             Separator,
             "~C~ancelar                  " : " Cancelar a Operao                       " : "CANCELAR"
             EndMenu
             To MenuVar
             
             Echo Off
             If MenuVar="CANCELAR" or MenuVar="Esc"
                Then Loop
             EndIf                                         
             RetVal=MenuVar
    EndIf   
  
    Switch
    Case RetVal="F3": SemFicha()
    Case RetVal=-94 : MsgTeclasPadrao()
    Case RetVal="F8": Del
                      If ConfGeral("Deseja gerar uma ordem de compra para esta relaÆo de itens?")
                         Then Gera_OC()
                              CHAVEOC=9                      
                              Return   
                      EndIf
    Case RetVal="F7" Or RetVal="UP" Or RetVal="PGUP" Or RetVal="HOME":
         While True
           PAGINA(Tabela_OC,"MR")
           If EDITAR="S"
              Then Controla_EdicaoC()
              Else If EXCLUIR="S"
                      Then If QuerExcluir("")
                              Then DEL
                              Else UnLockRecord
                           EndIf
                      Else QuitLoop
                   EndIf
           EndIf
           SetaPosForm()
         EndWhile
         QuitLoop
    Case Retval="ESC":
         If ConfGeral("Deseja abortar este processo?")
            Then CHAVEOC=9
                 Del 
                 Return
         EndIf            
    Case RetVal="ENTER":
         FastMsg("InclusÆo nÆo permitida")
         Loop  
    EndSwitch
  EndWhile
EndWhile

EndProc ;CHAVEOC()

;*******************************************************************************
;* Rotina para Digitacao das Informacoes                                       *
;*******************************************************************************
Proc DIGITA()

Moveto [Quantidade]
While True
  TECLA=" Esc=Retornar  "
  TECLA=TECLA+"Del=Excluir  "
  
  Prompt TECLA
  SetaCorRegistro("Editando")
  Wait Field
       Message Field()
       Until "ESC","ENTER","DEL","FIELDVIEW","F35"
                          
  Switch
  Case Retval="ESC":
       Switch
         Case Field()="Quantidade" :
              If QuerDesfazer("")
                 Then If RecordStatus("Modified")
                         Then Undo
                      EndIf
                      CHAVEOC=9
                      QuitLoop
              EndIf
         Case Field()="Valor Unitario" : Moveto [Quantidade]  
       EndSwitch
  Case Retval="ENTER":
       Switch
         Case Field()="Quantidade"     : Moveto [Valor Unitario]
         Case Field()="Valor Unitario" : QuitLoop
       EndSwitch   
  Case Retval="FIELDVIEW" or Retval="F35":
       EDITFIELD()
       
  Case Retval="DEL":
       If QuerExcluir("")
          Then DEL
               QuitLoop
       EndIf
  EndSwitch
EndWhile

EndProc ;DIGITA()

;*******************************************************************************
;* Rotina para controlar Edicao do registro                                    *
;*******************************************************************************
Proc Controla_EdicaoC()
DIGITA()
If RecordStatus("Locked") Then UnLockRecord EndIf         
EndProc

;*******************************************************************************
;* Rotina p/ Gerar Ordem de Compra                                             *
;*******************************************************************************
Proc Gera_OC()
Private LANCTO,REG_TABELA,CONTADOR,GEROU_OC

GEROU_OC=False

Do_it!
ClearAll
   
CONTADOR = 0                  
LANCTO   = ""
View "\\Sistemas\\Compras\\OCC"
End 
If IsBlank([Numero da OC])
   Then LANCTO = 1
   Else LANCTO = NumVal([Numero da OC])+1 
EndIf
LANCTO = AlinhM(StrVal(LANCTO),6)
     
View "\\Sistemas\\Compras\\OCI" 
CoEdit Tabela_OC
Scan
  Barra(NRecords(Tabela_OC), RecNo())
  Aguarde("Aguarde, gerando ordem de compra "+LANCTO+" "+BARRA_STRING)
  
  CopyToArray REG_TABELA
  If [Quantidade]<=0 Then Loop EndIf
  
  If CONTADOR=0
     Then Moveto "\\Sistemas\\Compras\\OCC"
          End Down
          [Numero da OC            ] = LANCTO
          [Codigo da Empresa       ] = VSDGEMPRESA
          [Codigo                  ] = VSDGDESTINAT
          [Data de Emissao         ] = Today()
          [Data de Entrega         ] = Today()
          ;[Aliquota de ICMS         ] =
          ;[CFO                      ] =
          ;[Valor Mercadoria         ] =
          ;[Valor Mercadoria Liquido ] =
          ;[Valor BCICMS             ] =
          ;[Valor ICMS               ] =
          ;[Valor IPI                ] =
          ;[Valor Nota Fiscal        ] =
          ;[Valor Despesas Acessorias] =
          ;[Frete Incluso na Nota    ] =
          ;[Valor do Frete           ] =
          ;[Aliquota de ICMS Frete   ] =
          ;[CFO Frete                ] =
          [Codigo da Transportadora] = "0001"
          ;[Frete por Conta          ] =
          [Tipo de Pagamento       ] = "P"
          ;[Condicao de Pagamento    ] =
          ;[Descricao CondPagto      ] =
          ;[Numero de Parcelas       ] =
          ;[Composicao de Dias       ] =
          ;[Forma de Pagamento       ] =
          ;[Codigo do Comprador      ] =
          ;[Nome do Comprador        ] =
          [Situacao da OC          ] = "ABERTO"
          [Observacoes da OC       ] = "[** GERADO AUTOMATICAMENTE A PARTIR DO RELATORIO >> 10. ESTOQUE MINIMO/MAXIMO/PONTOREPOSIO"+
                                       " << PELA OPCAO MENOR/IGUAL AO MÖNIMO **]"
          ;[ICMS sobre Total NF      ] =
          [Codigo_Usuario          ] = ""
          [Data_Inclusao           ] = Today()
          [Hora_Inclusao           ] = StrVal(Time())
          [Numero_Controle_Dia     ] = ""
          [Codigo do Requisitante  ] = ""
          [Descricao Requisitante  ] = ""
          ;[Contato                  ] =
          ;[Codigo da Tabela         ] =
          ;[Numero do Pedido         ] =
          ;[Numero_Carregamento_Occ] =
          [Tipo da Operacao OC     ] = "O"
          [Descricao da Operacao OC] = "OUTROS"
          UnLockRecord
  EndIF
  
  CONTADOR = CONTADOR + 1 
  Moveto "\\Sistemas\\Compras\\OCI"
  End Down
  [Numero da OC            ] = LANCTO
  [Item da OC              ] = CONTADOR 
  [Codigo da Empresa       ] = VSDGEMPRESA
  [Codigo do Item          ] = REG_TABELA["Codigo do Item"] 
  [Quantidade              ] = REG_TABELA["Quantidade"] 
  [Preco Unitario          ] = REG_TABELA["Valor Unitario"] 
  If REG_TABELA["Valor Unitario"] >0 
     Then  [Preco Total    ] = REG_TABELA["Quantidade"] * REG_TABELA["Valor Unitario"] 
  EndIf   
  [Fator de Conversao      ] = 1 
 ;[CFO                     ] =
  UnLockRecord
  
  If Not GEROU_OC
     THen GEROU_OC=True
  EndIf               
                            
  Moveto Tabela_OC
EndScan
Do_it!
ClearAll

If GEROU_OC
   Then Mensagem("Ordem de Compra "+LANCTO+" foi gerada no sistema!")
EndIf     

EndProc ;Gera_OC()

;*******************************************************************************
;* Rotina p/ Carregar Tabela                                                   *
;*******************************************************************************
Proc Carrega_Tabela()

CoEdit Tabela_OC
PickForm "F"

EndProc ;Carrega_Tabela()

;*******************************************************************************
;* Rotina p/ Selecionar e Ordernar Registros                                   *
;*******************************************************************************
Proc Gera_Relacao()
Private CONTA_ITEM

Do_it!
ClearAll

CONTA_ITEM=0

Tabela_OC=Cria_Temp(PrivDir())
Copy "\\Base\\Sistemas\\Estoque\\RM_0070A" Tabela_OC

View "\\Sistemas\\Estoque\\Cotacao"
View Tabela_OC 
CoEdit TabelaP
Scan
  Barra(NRecords(TabelaP), RecNo())
  Aguarde("Aguarde, montando registro para ordem de compra "+BARRA_STRING)
  
  CopyToArray REGISTRO
  If [Sugestao]<=0 Then Loop EndIf
  
  CONTA_ITEM = CONTA_ITEM + 1
  VALOR_UNITARIO = BlankNum()
  GetRecord "\\Sistemas\\Estoque\\Cotacao" REGISTRO["Codigo do Item"],VSDGDESTINAT To REG_FORN
  If RetVal
     Then VALOR_UNITARIO = REG_FORN["Valor Unitario"]
     Else ;**** SugestÆo de Preo ********************************************** 
          Moveto "\\Sistemas\\Estoque\\Cotacao"
          Moveto [Codigo do Item]
          Locate REGISTRO["Codigo do Item"]
          If RetVal
             Then DATA_COMPRA    = [Data de Compra]
                  VALOR_UNITARIO = [Valor Unitario]
                  While [Codigo do Item] = REGISTRO["Codigo do Item"]
                     If [Data de Compra] > DATA_COMPRA
                        Then DATA_COMPRA    = [Data de Compra]
                             VALOR_UNITARIO = [Valor Unitario]
                     EndIf
                     Skip
                     If Eot() Then QuitLoop EndIf
                     Locate Next REGISTRO["Codigo do Item"]
                     If Not RetVal Then QuitLoop EndIf 
                   EndWhile
          EndIf 
  EndIf    

  Moveto Tabela_OC
  End Down
  [Codigo do Item   ] = REGISTRO["Codigo do Item"]
  [Descricao do Item] = REGISTRO["Descricao do Item"]
  [Quantidade       ] = REGISTRO["Sugestao"] 
  [Sugestao         ] = REGISTRO["Sugestao"]
  [Valor Unitario   ] = VALOR_UNITARIO
  UnLockRecord
  
  Moveto TabelaP
EndScan
Do_it!
ClearAll

If CONTA_ITEM=0
   Then MENSAGEM("No existem registros a processar")
        Delete Tabela_OC    
        Return  
EndIf   

Carrega_Tabela()
While True
  CHAVEOC()
  If CHAVEOC=9 Then QuitLoop EndIf
  If CHAVEOC=7 
     Then Carrega_Tabela()
          Loop     
  EndIf
  Controla_EdicaoC()
EndWhile
Do_It!
ClearAll

Delete Tabela_OC

EndProc ;Gera_Relacao()

;*******************************************************************************
;* Rotina                                                                      *
;*******************************************************************************
Proc SD_Dialog_Forn(Disparo,Campo,Evento,Elemento)
Temp=True
MSG_CAMPO=""
TECLA=""
If Disparo="OPEN"  Then AoCriarShowDialog() EndIf
If Disparo="EVENT" And Evento["Type"]="KEY" Then
   Switch
     Case Evento["KeyCode"] = 9: Temp=False
     Case Evento["KeyCode"] = -59: Dialog_F1()
     Case Evento["KeyCode"] =  27:
          Temp=False
          Switch
            Case Campo="TG_DESTINAT"       : Campo="NO"
            Case Campo="YES" Or Campo="NO" : Campo="TG_DESTINAT"
          EndSwitch
     Case (Evento["KeyCode"] <= -104 And Evento["KeyCode"] >= -113) Or 
           Evento["KeyCode"]  = -139 Or  Evento["KeyCode"]  = -140:
           SYS_TECLA_ACIONADA=Evento["KeyCode"]
           Seta_Tecla_Acionada()
           CancelDialog
     Case Evento["KeyCode"] = 13:
          Temp=False
          If Checa_TAG()
             Then Switch
                    Case Campo="TG_DESTINAT" : Campo="YES"
                  EndSwitch
          EndIf
          RefreshDialog
   EndSwitch
EndIf

Monta_Prompt(MSG_CAMPO,TECLA)
Return Temp

EndProc ;SD_Dialog_Forn()

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
Proc Fornecedor()

Do_it!
ClearAll

VSDGDESTINAT = ""
VSDGNOMDEST  = ""

While True
  Echo Normal
  Echo Off
  ShowDialog "Informe o Fornecedor" Proc "SD_Dialog_Forn"
  Trigger "OPEN","ARRIVE"
  Key "F1","ENTER","ESC","TAB",
      -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -139, -140  
   @ 05,12   Height 07 Width 42

    Label  @ 00,00 "Pessoa"  For "TG_DESTINAT"
    Accept @ 01,01 Width 07 "A4"  Picture "[&,#][#*#]" Tag "TG_DESTINAT" To VSDGDESTINAT
    Accept @ 01,09 Width 25 "A20" Picture "!*!" Tag "TG_NOMDEST"  To VSDGNOMDEST

    Pushbutton @ 03,07 width 11 "~O~k"      OK     Default Value "Ok" Tag "YES" To BottonValue
    Pushbutton @ 03,21 width 11 "~C~ancela" CANCEL                    Tag "NO"  To BottonValue

  EndDialog
  Echo Off
  If Not RetVal 
     Then Return False 
  EndIf
  If VSDGDESTINAT=""
     Then FastMsg("Informe o Fornecedor!")
          Loop
  EndIf
  QuitLoop
EndWhile
ClearAll

Return True

EndProc ;Fornecedor()
  
;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************
; solicitado o fornecedor no inicio a fim de verificar o valor unitario do item na cotacao, referente  este fornecedor.
;Caso o preo unitario nÆo seja localizado,  verificado em outros fornecedores, conferido a partir da ultima data de compra localizado.

If Fornecedor()
   Then Gera_Relacao()
EndIf

Release Procs Gera_Relacao,Gera_OC,Fornecedor,CHAVEOC,DIGITA,Controla_EdicaoC,SD_Dialog_Forn
Release Vars REGISTRO,GEROU_OC,TEMP,VSDGDESTINAT,VSDGNOMDEST,Tabela_OC,CODIGO_ITEM,LANCTO,CONTA_ITEM