| Índice | ||||
|---|---|---|---|---|
|
...
| Informações | ||
|---|---|---|
| ||
Esta rutina considera solamente solicitudes del Protheus. Los viajes integrados con el Reserve no generan solicitud, porque se compran y emiten directamente en la agencia. |
En los ítems del viaje se podrán seleccionar y justificar/detallar los siguientes servicios:
...
| Aviso | ||
|---|---|---|
| ||
|
Cuando se parametrizan para aprobación después de solicitarlas, se generará un asunto pendiente de aprobación para el superior de los participantes. En caso contrario, esta se puede enviar al departamento de viajes (directamente después de la solicitud o en un segundo momento a través de la opción de envío) y el viaje se generará automáticamente.
Ejemplo:
|
En los ítems del viaje se podrán seleccionar y justificar/detallar los siguientes servicios:
| Aviso | ||
|---|---|---|
| ||
|
Cuando se parametrizan para aprobación después de solicitarlas, se generará un asunto pendiente de aprobación para el superior de los participantes. En caso contrario, esta se puede enviar al departamento de viajes (directamente después de la solicitud o en un segundo momento a través de la opción de envío) y el viaje se generará automáticamente.
Ejemplo:
La empresa puede decidir por pasar por todas las aprobaciones, en este caso el flujo será:
...
| Aviso | ||
|---|---|---|
| ||
Cuando no exista la etapa de aprobación de viajes, para que la solicitud de viajes (FW3), se vuelva un viaje (FL5) y logre dar continuidad al flujo, la solicitud pasará obligatoriamente por la verificación del departamento de viajes, en la rutina de solicitud de viajes (FINA666) vaya a OTRAS ACCIONES → Enc. p/ Depart Viajes (Generando el viaje en la rutina FINA665). |
...
de solicitud de viajes (FINA666) vaya a OTRAS ACCIONES → Enc. p/ Depart Viajes (Generando el viaje en la rutina FINA665). |
Acceso a la rutina por el camino: Actualizaciones > Viajes > Solicitud de viaje
El viajero debe informar los datos básicos del viaje en el encabezado de su solicitud, como origen y destino, fechas de partida y llegada, cliente para atención (si hubiera), etc.
Para cada servicio se deben informar lo(s) Participante(s) y su(s) respectivo(s) Ente(s) de costo.
| Aviso | ||
|---|---|---|
| ||
No se permite incluir el mismo centro de costo en el prorrateo de centro de costos. Si la clave única fuera: Sucursal + Núm. Solicitud + Ítem + C.Costo ( FW6_FILIAL+FW6_SOLICI+FW6_ITEM+FW6_CC), no se permitirá utilizar el mismo centro de costo, aunque los otros entes contables sean diferentes. En la release 12.1.2410, con aplicación del paquete acumulado con fecha igual o superior al 08/11/2024, el sistema pasa a considerar la modificación de la clave única y del índice 1 de la tabla FW6 para: FW6_FILIAL+FW6_SOLICI+FW6_ITEM+FW6_CC+FW6_ITECTA+FW6_CLVL. De esta manera, si la clave única es: Sucursal + Núm. Solicitud + Ítem + C.Costo + Ítem contable + Clase de valor (FW6_FILIAL+FW6_SOLICI+FW6_ITEM+FW6_CC+FW6_ITECTA+FW6_CLVL), no se permitirá utilizar la misma combinación de entes contables ( C. Costo, Ítem contable y Clase de valor). Si se modifica la clave única de la tabla FW6, es necesario realizar también la adecuación de la clave única y del índice 1 de la tabla FLH a: FLH_FILIAL+FLH_VIAGEM+FLH_ITEM+FLH_CC+FLH_ITECTA+FLH_CLVL Las adecuaciones de las tablas FW6 y FLH están disponibles a partir del paquete acumulado con fecha igual o superior al 08/11/2024 exclusivamente para la release 12.1.2410. |
Además, en la solapa Anticipos se pueden marcar los participantes que recibirán el anticipo.
| Informações | ||||
|---|---|---|---|---|
| ||||
Si la opción "Bloquea anticipo" estuviera com "1=Sí", el sistema no permitirá generar el anticipo, si existiera alguna rendición de cuentas pendiente para el participante en la sucursal donde se está incluyendo la solicitud, de acuerdo con la parametrización de las configuraciones "Días (máx.)" y "Cantidad (máx.)". |
El valor calculado es una previsión y se muestra solamente si estuviera parametrizado:
Ejemplos de cálculo para anticipos
Para todos los escenarios se realizó una configuración del wizard vía rutina FINA691 para anticipos de acuerdo con la tabla ejemplo. Tenemos como fórmula para cálculo de los anticipos la siguiente base:
| Anticipo = Valor fijo + ( Valor diario * ( fecha final - fecha inicial)) |
|---|
Escenario 1
Campo | Contenido |
|---|---|
| Anticipo sin pernoctar (MV_RESADSP) | 80 |
| Valor diario (MV_RESADDI) | 80 |
| Valor fijo (MV_RESADFX) | 0 |
Con base en la configuración realizada y en un escenario ficticio con viaje iniciado el día 02/12, con fecha final el 06/12, el cálculo de anticipo quedaría de la siguiente manera:
Anticipo = 0 + (80 * (06/12 - 02/12))
Anticipo = 320$
Escenario 2
Campo | Contenido |
|---|---|
| Anticipo sin pernoctar (MV_RESADSP) | 0 |
| Valor diario (MV_RESADDI) | 0 |
| Valor fijo (MV_RESADFX) | 80 |
Con la fórmula tenemos el siguiente cálculo:
Anticipo = 80 + (0 * (06/12 - 02/12))
Anticipo = 80
Escenario 3
Campo | Contenido |
|---|---|
| Anticipo sin pernoctar (MV_RESADSP) | 80 |
| Valor diario (MV_RESADDI) | 80 |
| Valor fijo (MV_RESADFX) | 80 |
Con la fórmula tenemos el siguiente cálculo:
Anticipo = 80 + (80 * (06/12 - 02/12))
Anticipo = 400
| Informações | ||||
|---|---|---|---|---|
| ||||
Si la configuración "Bloquea anticipo" estuviera com "1=Sí", el sistema no permitirá la generación del anticipo, si existiera alguna rendición de cuentas pendiente para el participante en la sucursal en la cual se está incluyendo la solicitud , de acuerdo con la parametrización de las configuraciones "Días (máx.)" y "Cantidad (máx.)". |
...
de viaje tenga fecha inicial y final en el mismo día, se utilizará como valor para anticipo el contenido del campo "Anticipo sin pernoctar". |
Para ejecutar la rutina automática, ilustramos algunas funcionalidades como Inclusión (MyFA666Inc), Modificación (MyFA666Alt) y Borrado (MyFA666Del), en los siguientes ejemplos:
...
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
//---------- Inclusión de la solicitud de viaje ----------//
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 entorno con usuario solicitante
oModel := FWLoadModel("FINA666")
oModelFW3 := oModel:GetModel("FW3MASTER") // Encabezado del viaje
oModelFW4 := oModel:GetModel("FW4DETAIL") // Servicios
oModelFW5 := oModel:GetModel("FW5DETAIL") // Participantes
oModelFW6 := oModel:GetModel("FW6DETAIL") // Centro de costo
cFilAtu := xFilial("FW3")
oModel:SetOperation(MODEL_OPERATION_INSERT)
oModel:Activate()
// Informa el encabezado de la solicitud de viaje
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") // Pendiente, Estatus inicial
// Informa la cuadrícula del servicio incluso en la solicitud del viaje
oModelFW4:SetValue("FW4_ITEM",StrZero(1,TamSX3("FW4_ITEM")[1]))
oModelFW4:SetValue("FW4_TIPO","1") // Aéreo
oModelFW4:SetValue("FW4_OBS", "Visita al cliente")
// Informa la cuadrícula de los participantes viajeros
oModelFW5:SetValue("FW5_ITEM",StrZero(1,TamSX3("FW4_ITEM")[1]))
oModelFW5:SetValue("FW5_PARTIC","000001")
oModelFW5:SetValue("FW5_ADIANT",.T.) // Agrega anticipo al participante
oModelFW5:AddLine() // Agrega línea para un segundo viajero
oModelFW5:SetValue("FW5_ITEM",StrZero(2,TamSX3("FW4_ITEM")[1]))
oModelFW5:SetValue("FW5_PARTIC","000002")
oModelFW5:SetValue("FW5_ADIANT",.T.) // Agrega anticipo al participante
// Informa la cuadrícula del centro de costo
oModelFW6:SetValue("FW6_ITEM",StrZero(1,TamSX3("FW4_ITEM")[1]))
oModelFW6:SetValue("FW6_CC","002 ")
oModelFW6:SetValue("FW6_PORCEN",100)
oModelFW5:GoLine(1)
// Validación y grabación de los datos si fueran consistentes
If oModel:VldData()
oModel:CommitData()
Conout("Inclusión de la solicitud del viaje finalizada con éxito.")
Else
VarInfo("",oModel:GetErrorMessage())
Conout("Error en la validación, solicitud de viaje no se incluyó.")
EndIf
oModel:DeActivate()
oModel:Destroy()
RpcClearEnv()
Return
//---------- Modificación de la solicitud de viaje ----------//
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 entorno con usuario solicitante
dbSelectArea("FW3")
dbSetOrder(1)
dbSeek(xFilial("FW3")+cSolic)
// Carga modelo de datos con la solicitud de viaje marcada
oModel := FWLoadModel("FINA666")
oModelFW5 := oModel:GetModel("FW5DETAIL") // Participantes
oModelFW6 := oModel:GetModel("FW6DETAIL") // Centro de costo
// Clave de búsqueda del participante dentro de la Sol. de Viaje
aKeyFW4 := { {"FW5_FILIAL",xFilial("FW5")},{"FW5_SOLICI",cSolic},{"FW5_ITEM","01"},{"FW5_PARTIC","000002"} }
oModel:SetOperation(MODEL_OPERATION_UPDATE)
oModel:Activate()
// Retira uno de los viajeros, en este caso el participante 000002
If oModelFW5:SeekLine(aKeyFLE)
oModelFW5:DeleteLine()
Else
Conout("Viajero no encontrado en esta solicitud de viaje.")
EndIf
// Modifica el centro de costo (marcado automáticamente en la primera cuadrícula)
oModelFW6:SetValue("FW6_CC","003 ")
// Validación y grabación de los datos si fueran consistentes
If oModel:VldData()
oModel:CommitData()
Conout("Modificación de la solicitud de viaje efectuada con éxito.")
Else
VarInfo("",oModel:GetErrorMessage())
Conout("Error en la validación, solicitud de viaje no se modificó.")
EndIf
oModel:DeActivate()
oModel:Destroy()
RpcClearEnv()
Return
//---------- Borrado de la solicitud de viaje ----------//
User Function MyFA666Del()
Local oModel := Nil
Local cSolic := "0000000010"
RpcSetEnv("T1","D MG 01 ","claudio.ribeiro","1") // Inicializa entorno con usuario solicitante
dbSelectArea("FW3")
dbSetOrder(1)
dbSeek(xFilial("FW3")+cSolic)
// Carga modelo de datos con la solicitud de viaje marcada
oModel:= FWLoadModel("FINA666")
oModel:SetOperation(MODEL_OPERATION_DELETE)
oModel:Activate()
// Validación y grabación del borrado
If oModel:VldData()
oModel:CommitData()
Conout("Solicitud de viaje borrada con éxito.")
Else
VarInfo("",oModel:GetErrorMessage())
Conout("Error en la validación, solicitud de viaje no se borró.")
EndIf
oModel:DeActivate()
oModel:Destroy()
RpcClearEnv()
Return
|
...