Cómo agregar eventos de programación (como PTO) a través del CommunityWebAPI desde un sistema externo. El uso de las funciones de la API RESTful requiere que el lector entienda cómo crear solicitudes HTTP y cómo consumir datos en formato JSON.
Integración de Eventos Comunitarios
Community admite una función de API expuesta por el servicio RESTful CommunityWebAPI. La información a continuación debería permitirle agregar eventos exitosamente a través del servicio RESTful de manera programática.
Esta interfaz describe la creación de "eventos recurrentes", que pueden ser eventos de un solo día (vacaciones, enfermedad, etc.) o eventos que se repiten durante un largo período de tiempo, pero solo en días específicos (por ejemplo, entre el 1 de enero y el 31 de marzo, tengo una cita médica recurrente todos los viernes entre las 9:00 AM y las 11:00 AM).
En los casos en que el evento sea de un solo día, simplemente proporcione las mismas fechas y horas de inicio y fin, pero asegúrese de que todas las banderas d? estén configuradas en verdadero.
En el ejemplo más complejo, el valor de la fecha de inicio sería "2017/01/01"; el valor de la fecha de fin sería "2017/03/31"; el valor de la hora de inicio sería "09:00:00"; el valor de la hora de fin sería "11:00:00"; y las banderas d? serían (asumiendo que el día de inicio de la semana es lunes) d1=false d2=false d3=false d4=false d5=true d6=false d7=false.
Interfaz de API
El verbo es POST y el punto de entrada es http://<servername>/CommunityWebApi/api/SingleRecurringEvent
La ejecución de la llamada devuelve un objeto WebApiResult estándar de WFMSG (en formato JSON) que incluye los siguientes miembros:
Éxito – booleano que indica que la operación fue exitosa.
Datos – si es exitoso, contiene el objeto RecurringEvent recién creado (descrito a continuación). Si no es exitoso, este miembro es NULL.
Mensaje – si no es exitoso, contiene la excepción lanzada; de lo contrario, este miembro está vacío.
ResultadoExcepción – si se lanza una excepción, este es el cuerpo completo de la excepción; de lo contrario, este miembro es NULL.
*Tenga en cuenta que Community admite el uso de implementaciones concurrentes de CommunityWebAPI para la integración dentro de una arquitectura segura, así como la implementación en DMZ o en un dispositivo dedicado para interfaces externas.
Encabezado de Autenticación Requerido
La versión 4.3 y superiores de Community Web API requieren un token de autenticación para cada punto de entrada pasado como un valor de encabezado personalizado. Las aplicaciones cliente pueden recuperar el token de autenticación inicial de la llamada POST AuthenticateEx (descrita en otro documento) en una variable miembro llamada “authToken.” Las aplicaciones cliente luego pasan este valor en el encabezado personalizado “WFMSGAPIKEY” en llamadas posteriores. Tenga en cuenta que el token de autenticación caducará después de 20 minutos.
Además, las aplicaciones cliente pueden recuperar la versión “actualizada” del token en cada llamada leyendo el valor del encabezado personalizado del mismo nombre (“WFMSGAPIKEY”).
Pares Nombre/Valor
La siguiente tabla contiene los pares nombre/valor que deben incluirse en el envío del formulario para la llamada RESTful. Tenga en cuenta que para insertar nuevos agentes en la base de datos, el valor de transactionFlagId debe establecerse en 1.
| Miembro de la Clase | Tipo | ¿Req? | Descripción |
| transactionFlagId | Int | Sí |
Indica el tipo de transacción POST a realizar. Los valores válidos son: 1: Insertar |
| agentId | Int | Sí | Sa_agent_id para asignar al(los) nuevo(s) evento(s) creado(s). |
| eventTypeId | Int | Sí | Sa_exception_type_id de los eventos. |
| startTime | DateTime | Sí |
Un par de fecha/hora en formato YYYY/MM/DD HH:MM (reloj de 24 horas) que indica la hora de inicio del evento. Tenga en cuenta que, para este miembro, la aplicación ignora la parte de la fecha. Ejemplo: iniciar un evento a las 8:00 AM 1900-01-01 08:00:00 |
| endTime | DateTime | Sí |
Un par de fecha/hora en formato YYYY/MM/DD HH:MM (reloj de 24 horas) que indica la hora de finalización del evento. Tenga en cuenta que, para este miembro, la aplicación ignora la parte de la fecha.
Ejemplo: finalizar un evento a las 5:00 PM 1900-01-01 17:00:00 |
| description | String | No | Proporciona el campo de descripción en el evento |
| location | String | No | Proporciona el campo de ubicación en el evento |
| scheduleId | Int | No | Si es NULL, entonces este evento se coloca en el horario publicado. Si no es NULL, entonces este evento se coloca en el horario de trabajo donde sa_schedule_id = este valor. |
| startDate | DateTime | Sí |
Un valor de fecha en formato YYYY/MM/DD que indica la fecha de inicio del evento. Tenga en cuenta que, para este miembro, la aplicación ignora la parte de la hora (si se proporciona). Ejemplo: iniciar el evento el 1 de mayo de 2017 2017/05/01 |
| endDate | DateTime | Sí |
Un valor de fecha en formato YYYY/MM/DD que indica la fecha de finalización del evento. Tenga en cuenta que, para este miembro, la aplicación ignora la parte de la hora (si se proporciona). Ejemplo: finalizar el evento el 4 de mayo de 2017 2017/05/04 |
| d1 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el primer día de la semana (típicamente lunes). |
| d2 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el segundo día de la semana. |
| d3 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el tercer día de la semana. |
| d4 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el cuarto día de la semana. |
| d5 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el quinto día de la semana. |
| d6 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el sexto día de la semana. |
| d7 | Bool | Sí | Un valor booleano que indica si este evento debe ocurrir el séptimo día de la semana. |
| timeZoneId | Int | No | La zona horaria del evento; típicamente, será la hora local del agente, pero si es NULL, la aplicación usará por defecto la zona horaria corporativa. |
| responsibleUserId | Int | Sí | El sa_agent_id del usuario con privilegios suficientes para realizar cambios en el horario de este agente. |
Declaración de clase de ejemplo para los pares de nombre/valor
(como se describe en la tabla anterior)
public class SingleRecurringEventPostParams
{
/// <summary>
/// transactionFlagId dicta cómo se modificará el evento.
/// </summary>
public int transactionFlagId { get; set; }
/// <summary>
/// agentId
/// </summary>
public int agentId { get; set; }
/// <summary>
/// eventTypeId
/// </summary>
public int eventTypeId { get; set; }
/// <summary>
/// startTime
/// </summary>
public DateTime startTime { get; set; }
/// <summary>
/// endTime
/// </summary>
public DateTime endTime { get; set; }
/// <summary>
/// description
/// </summary>
public string description { get; set; }
/// <summary>
/// location
/// </summary>
public string location { get; set; }
/// <summary>
/// scheduleId
/// </summary>
public int? scheduleId { get; set; }
/// <summary>
/// startDate
/// </summary>
public DateTime startDate { get; set; }
/// <summary>
/// endDate
/// </summary>
public DateTime endDate { get; set; }
/// <summary>
/// d1
/// </summary>
public bool d1 { get; set; }
/// <summary>
/// d2
/// </summary>
public bool d2 { get; set; }
/// <summary>
/// d3
/// </summary>
public bool d3 { get; set; }
/// <summary>
/// d4
/// </summary>
public bool d4 { get; set; }
/// <summary>
/// d5
/// </summary>
public bool d5 { get; set; }
/// <summary>
/// d6
/// </summary>
public bool d6 { get; set; }
/// <summary>
/// d7
/// </summary>
public bool d7 { get; set; }
/// <summary>
/// timeZoneId
/// </summary>
public int? timeZoneId { get; set; }
/// <summary>
/// ID de usuario de la parte responsable - utilizado para fines de auditoría.
/// </summary>
public int? responsibleUserId { get; set; }
}
Definición de la clase RecurringEvent
(miembro WebApiResult.Data del verbo POST con los parámetros anteriores)
#region Miembros de la Clase
[DataMember]
/// <summary>
/// Del Procedimiento Get, parámetro @StartTime [6] [No es una Clave]
/// </summary>
public DateTime? StartTime { get; set; }
[DataMember]
/// <summary>
/// Del Procedimiento Get, parámetro @CreateDate [18] [No es una Clave]
/// </summary>
public DateTime? CreateDate { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @AssignmentType [20] [No es una clave]
/// </summary>
public RecurringEventAssignmentTypes AssignmentType { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @RecurringEventId [0] [No es una clave]
/// </summary>
public int? RecurringEventId { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @EndDate [8] [No es una clave]
/// </summary>
public DateTime? EndDate { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @AllDay [9] [No es una clave]
/// </summary>
public bool? AllDay { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @TimeZoneId [0] [No es una clave]
/// </summary>
public int? TimeZoneId { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @ScheduleId [1] [No es una clave]
/// </summary>
public int? ScheduleId { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @ProcessAgentId [23] [No es una clave]
/// </summary>
public int? ProcessAgentId { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @ProcessDate [22] [No es una clave]
/// </summary>
public DateTime? ProcessDate { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @Description [5] [No es una clave]
/// </summary>
public string Description { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @StartDate [7] [No es una clave]
/// </summary>
public DateTime? StartDate { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @ExceptionTypeId [2] [No es una clave]
/// </summary>
public int? ExceptionTypeId { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @BaseDate [17] [No es una clave]
/// </summary>
public DateTime? BaseDate { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek4 [13] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek4 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek5 [14] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek5 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek6 [15] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek6 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek7 [16] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek7 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @Location [4] [No es una clave]
/// </summary>
public string Location { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek1 [10] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek1 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek2 [11] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek2 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @IncludeDayOfWeek3 [12] [No es una clave]
/// </summary>
public bool? IncludeDayOfWeek3 { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @LastUpdate [19] [No es una clave]
/// </summary>
public DateTime? LastUpdate { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @Duration [3] [No es una clave]
/// </summary>
public double? Duration { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @ProcessAgentName [24] [No es una clave]
/// </summary>
public string ProcessAgentName { get; set; }
[DataMember]
/// <summary>
/// Del procedimiento Get, parámetro @Processed [21] [No es una clave]
/// </summary>
public bool? Processed { get; set; }
public DataTable ValidationResults { get; set; }
public DataTable AdjustedEvents { get; set; }
public DataTable CreatedEvents { get; set; }
/// <summary>
/// Crear una clave dinámica para usar en servicios de auditoría.
/// </summary>
private dynamic key = new System.Dynamic.ExpandoObject();
#endregion