Um funcionário (neste cenário, o chamamos de Participante) necessita fazer uma viagem corporativa, por algum motivo, seja ele qual for (ex: atendimento/visita ao cliente, reunião de negócios, evento). Então esta rotina terá como principal objetivo registrar a solicitação dessa viagem, contemplando informações relevantes para controlar as despesas da viagem e suas políticas.
Esta rotina contempla apenas solicitações do Protheus. As viagens integradas com o Reserve não geram solicitação, pois são compradas e emitidas diretamente pela agência. |
|
Nos itens da viagem será possível selecionar e justificar/detalhar os seguintes serviços:
|
Quando parametrizadas para aprovação após a solicitação, será gerada uma pendência de aprovação para o superior dos participantes. Caso contrário esta pode ser enviada para o departamento de viagens (diretamente após a solicitação ou em um segundo momento através da opção de envio) e a viagem será gerada automaticamente.
Exemplo:
A empresa pode decidir por passar por todas as aprovações, neste caso o fluxo será:
Ou então pode ser que apenas uma das aprovações seja necessária, neste caso temos:
Quando não existir a etapa de aprovação de viagens, para que a solicitação de viagens (FW3), se torne uma viagem (FL5) e possa dar continuidade ao fluxo, a solicitação passará obrigatoriamente pelo conferencia do departamento de viagens, na rotina de solicitação de viagens (FINA666) vá em OUTRAS AÇÕES → Enc. p/ Dpto Viagens (Gerando a viagem na rotina FINA665) |
Acesso à rotina pelo caminho: Atualizações > Viagens > Solicitação de Viagem
O viajante deve informar os dados básicos da viagem no cabeçalho da sua solicitação, como origem e destino, datas de partida e chegada, cliente para atendimento (se houver), etc.
Para cada serviço deve ser informado o(s) Participante(s) e a(s) sua(s) respectiva(s) Entidade(s) de Custo.
Não é permitido incluir mesmo centro de custo no rateio de centro de custos. Caso a chave única seja: Filial + Num. Solicitação + Item + C.Custo ( FW6_FILIAL+FW6_SOLICI+FW6_ITEM+FW6_CC), não será permitido utilizar o mesmo centro de custo, mesmo que as outras entidades contábeis sejam diferentes. Na release 12.1.2410, com aplicação do pacote acumulado com data igual ou superior a 08/11/2024, o sistema passa a contemplar a alteração da chave única e do índice 1 da tabela FW6 para: FW6_FILIAL+FW6_SOLICI+FW6_ITEM+FW6_CC+FW6_ITECTA+FW6_CLVL. Dessa forma, caso a chave única seja: Filial + Num. Solicitação + Item + C.Custo + Item Contábil + Classe de Valor (FW6_FILIAL+FW6_SOLICI+FW6_ITEM+FW6_CC+FW6_ITECTA+FW6_CLVL), não será permitido utilizar a mesma combinação de entidades contábeis ( C. Custo, Item Contábil e Classe de Valor). No caso de alteração da chave única da tabela FW6, é necessário também realizar a adequação da chave única e do índice 1 da tabela FLH para: FLH_FILIAL+FLH_VIAGEM+FLH_ITEM+FLH_CC+FLH_ITECTA+FLH_CLVL As adequações das tabelas FW6 e FLH estão disponíveis a partir do pacote acumulado com data igual ou superior a 08/11/2024 exclusivamente para a release 12.1.2410. |
Além disso, na aba Adiantamentos é possível marcar quais participantes receberão adiantamento.
Se a opção "Bloqueia Adiantamento" estiver com "1=Sim", o sistema passará a não permitir a geração do adiantamento, caso exista alguma prestação de contas em aberto para o participante na filial no qual está sendo incluída a solicitação, conforme parametrização das configurações "Dias (max.)" e "Quantidade (max.)". |
O valor calculado é uma previsão e é exibido somente quando estiver parametrizado:
Exemplos de cálculo para adiantamentos
Para todos os cenários foi realizado configuração do wizard via rotina FINA691 para adiantamentos conforme tabela exemplo. Temos como fórmula para cálculo dos adiantamentos a seguinte base:
Adiantamento = Valor fixo + ( Valor diário * ( data fim - data inicio)) |
---|
Cenário 1
Campo | Conteúdo |
---|---|
Adiantamento sem Pernoite (MV_RESADSP) | 80 |
Valor diário (MV_RESADDI) | 80 |
Valor fixo (MV_RESADFX) | 0 |
Com base na configuração realizada e num cenário fictício com viagem iniciada no dia 02/12, com data fim 06/12, o cálculo de adiantamento ficaria da seguinte forma:
Adiantamento = 0 + (80 * (06/12 - 02/12))
Adiantamento = 320$
Cenário 2
Campo | Conteúdo |
---|---|
Adiantamento sem Pernoite (MV_RESADSP) | 0 |
Valor diário (MV_RESADDI) | 0 |
Valor fixo (MV_RESADFX) | 80 |
Com a fórmula temos o seguinte cálculo:
Adiantamento = 80 + (0 * (06/12 - 02/12))
Adiantamento = 80
Cenário 3
Campo | Conteúdo |
---|---|
Adiantamento sem Pernoite (MV_RESADSP) | 80 |
Valor diário (MV_RESADDI) | 80 |
Valor fixo (MV_RESADFX) | 80 |
Com a fórmula temos o seguinte cálculo:
Adiantamento = 80 + (80 * (06/12 - 02/12))
Adiantamento = 400
Caso a solicitação de viagem tenha data início e fim no mesmo dia, será utilizado como valor para adiantamento o conteúdo do campo "Adiantamento sem Pernoite". |
Para execução da rotina automática, ilustramos algumas funcionalidades como Inclusão (MyFA666Inc), Alteração (MyFA666Alt) e Exclusão (MyFA666Del), nos seguintes exemplos:
#INCLUDE "PROTHEUS.CH" #INCLUDE "FWMVCDEF.CH" //---------- Inclusao da solicitacao de viagem ----------// User Function MyFA666Inc() Local oModel := Nil Local oModelFW3 := Nil Local oModelFW4 := Nil Local oModelFW5 := Nil Local oModelFW6 := Nil Local cFilAtu := "" RpcSetEnv("T1","D MG 01 ","claudio.ribeiro","1") // Inicializa ambiente com usuario solicitante oModel := FWLoadModel("FINA666") oModelFW3 := oModel:GetModel("FW3MASTER") // Cabecalho da viagem oModelFW4 := oModel:GetModel("FW4DETAIL") // Servicos oModelFW5 := oModel:GetModel("FW5DETAIL") // Participantes oModelFW6 := oModel:GetModel("FW6DETAIL") // Centro de custo cFilAtu := xFilial("FW3") oModel:SetOperation(MODEL_OPERATION_INSERT) oModel:Activate() // Preenche cabecalho da solicitacao de viagem oModelFW3:SetValue("FW3_FILIAL",cFilAtu) oModelFW3:SetValue("FW3_NACION","1") oModelFW3:SetValue("FW3_CODORI","SP") oModelFW3:SetValue("FW3_CODDES","RJ") oModelFW3:SetValue("FW3_DTINI",StoD("20190702")) oModelFW3:SetValue("FW3_DTFIM",StoD("20190705")) oModelFW3:SetValue("FW3_CLIENT","001 ") oModelFW3:SetValue("FW3_LOJA","01") oModelFW3:SetValue("FW3_STATUS","0") // Em Aberto, status inicial // Preenche grid do servico incluso na solicitacao da viagem oModelFW4:SetValue("FW4_ITEM",StrZero(1,TamSX3("FW4_ITEM")[1])) oModelFW4:SetValue("FW4_TIPO","1") // Aereo oModelFW4:SetValue("FW4_OBS", "Visita ao cliente") // Preenche grid dos participantes viajantes oModelFW5:SetValue("FW5_ITEM",StrZero(1,TamSX3("FW4_ITEM")[1])) oModelFW5:SetValue("FW5_PARTIC","000001") oModelFW5:SetValue("FW5_ADIANT",.T.) // Adiciona adiantamento ao participante oModelFW5:AddLine() // Adiciona linha para um segundo viajante oModelFW5:SetValue("FW5_ITEM",StrZero(2,TamSX3("FW4_ITEM")[1])) oModelFW5:SetValue("FW5_PARTIC","000002") oModelFW5:SetValue("FW5_ADIANT",.T.) // Adiciona adiantamento ao participante // Preenche grid do centro de custo oModelFW6:SetValue("FW6_ITEM",StrZero(1,TamSX3("FW4_ITEM")[1])) oModelFW6:SetValue("FW6_CC","002 ") oModelFW6:SetValue("FW6_PORCEN",100) oModelFW5:GoLine(1) // Validacao e gravacao dos dados se consistentes If oModel:VldData() oModel:CommitData() Conout("Inclusao da solicitacao de viagem concluida com sucesso.") Else VarInfo("",oModel:GetErrorMessage()) Conout("Erro na validacao, solicitacao de viagem nao foi incluida.") EndIf oModel:DeActivate() oModel:Destroy() RpcClearEnv() Return //---------- Alteracao da solicitacao de viagem ----------// User Function MyFA666Alt() Local aKeyFW4 := {} Local oModel := Nil Local oModelFW5 := Nil Local oModelFW6 := Nil Local cSolic := "0000000010" RpcSetEnv("T1","D MG 01 ","richard.santos","1") // Inicializa ambiente com usuario solicitante dbSelectArea("FW3") dbSetOrder(1) dbSeek(xFilial("FW3")+cSolic) // Carrega modelo de dados com a solicitacao de viagem posicionada oModel := FWLoadModel("FINA666") oModelFW5 := oModel:GetModel("FW5DETAIL") // Participantes oModelFW6 := oModel:GetModel("FW6DETAIL") // Centro de custo // Chave de busca do participante dentro da sol. da viagem aKeyFW4 := { {"FW5_FILIAL",xFilial("FW5")},{"FW5_SOLICI",cSolic},{"FW5_ITEM","01"},{"FW5_PARTIC","000002"} } oModel:SetOperation(MODEL_OPERATION_UPDATE) oModel:Activate() // Remove um dos viajantes, no caso o participante 000002 If oModelFW5:SeekLine(aKeyFLE) oModelFW5:DeleteLine() Else Conout("Viajante nao encontrado nesta solicitacao de viagem.") EndIf // Altera o centro de custo (posicionado automaticamente no primeiro grid) oModelFW6:SetValue("FW6_CC","003 ") // Validacao e gravacao dos dados se consistentes If oModel:VldData() oModel:CommitData() Conout("Alteracao da solicitacao de viagem efetuada com sucesso.") Else VarInfo("",oModel:GetErrorMessage()) Conout("Erro na validacao, solicitacao de viagem nao foi alterada.") EndIf oModel:DeActivate() oModel:Destroy() RpcClearEnv() Return //---------- Exclusao da solicitacao de viagem ----------// User Function MyFA666Del() Local oModel := Nil Local cSolic := "0000000010" RpcSetEnv("T1","D MG 01 ","claudio.ribeiro","1") // Inicializa ambiente com usuario solicitante dbSelectArea("FW3") dbSetOrder(1) dbSeek(xFilial("FW3")+cSolic) // Carrega modelo de dados com a solicitacao de viagem posicionada oModel:= FWLoadModel("FINA666") oModel:SetOperation(MODEL_OPERATION_DELETE) oModel:Activate() // Validacao e gravacao da exclusao If oModel:VldData() oModel:CommitData() Conout("Solicitacao de viagem excluida com sucesso.") Else VarInfo("",oModel:GetErrorMessage()) Conout("Erro na validacao, solicitacao de viagem nao foi excluida.") EndIf oModel:DeActivate() oModel:Destroy() RpcClearEnv() Return |
<!-- esconder o menu --> <style> div.theme-default .ia-splitter #main { margin-left: 0px; } .ia-fixed-sidebar, .ia-splitter-left { display: none; } #main { padding-left: 10px; padding-right: 10px; overflow-x: hidden; } .aui-header-primary .aui-nav, .aui-page-panel { margin-left: 0px !important; } .aui-header-primary .aui-nav { margin-left: 0px !important; } </style> |