API de Movidesk - Registro de contrato de horas
20 min
Creado por Andre Azevedo Vargas en 27/01/2019 16:11
Actualizado por Karine Moreira en 24/09/2024 16:20
Importante: Nuestras API's tienen un límite de 10 solicitudes por minuto para garantizar un comportamiento saludable en su uso. Si tienes un escenario específico que requiera aumentar el uso, contacta a nuestro equipo de soporte para analizar la viabilidad. Más información sobre horarios y límites de las API's
https://api.movidesk.com/public/v1

Contrato de horas

  URL:    /timeAgreement
  Métodos: GET / POST / PATCH / DELETE

Diseño

timeAgreement

Propiedad Tipo Tamaño Obligatorio Descripción
name string 128   Nombre del contrato de horas
id int     Solo lectura 
emailSubject string      Asunto del correo electrónico
emailDescription string     Descripción del correo electrónico
emailAccount string     Remitente del correo electrónico
isActive bool   * Si el contrato está o no activo
differentiateHoursFranchise bool   Indicar si diferencia horas por actividad
differentiateHoursConsumption bool   Usado para diferenciar franquicia de horas y valores por actividad y tipos de hora

accumulateUnusedHours

bool   Habilitar para acumular horas no utilizadas.
renewalDay int 2 Día de renovación del contrato
contractedHours int   * *Obligatorio cuando differentiateHoursByFranchise = false
consumptionDeadline int 3 * Cantidad de meses límite para usar horas acumuladas. Obligatorio cuando accumulateUnusedHours = true
emailSendDay int 2   Día de envío del correo electrónico
baseAmount decimal  18,2   Valor base del contrato
createdOn datetime     Cuándo se creó el contrato. (Generado automáticamente)
disabledDate datetime     Cuándo se creó el contrato. (Generado automáticamente)
typeActivities activities   Lista de actividades del contrato de horas. ver documentación
timeTypeConsumption typeconsumption     Lista de consumo diferenciado por tiempo. ver documentación
emailDestinations destination     Lista de destinatarios. ver documentación
clients person     ✓   Lista de los clientes del ticket. ver documentación

Contrato de horas » Clientes

timeAgreement.client[n]

Propiedad Tipo Tamaño Obligatorio Descripción
id string 64 Id (Cod. ref.) de la empresa, departamento o persona relacionado como cliente. (Solo lectura).
businessName string 128   Nombre del cliente (Solo lectura).
email string 128   Correo electrónico principal del cliente (Solo lectura).
phone string 128   Teléfono principal del cliente (Solo lectura).
personType int 1 ✓  Persona = 1, Empresa = 2, Departamento = 4 (Solo lectura).
profileType int 1 ✓  Agente = 1, Cliente = 2, Agente y Cliente = 3 (Solo lectura).
isDeleted bool     Verdadero si el cliente ha sido eliminado (Solo lectura).
organization person     Organización del cliente (Solo lectura). ver documentación

Contrato de horas » Tipo de actividades

timeAgreement.typeActivities[n]

Propiedad Tipo Tamaño Obligatorio Descripción
id int   ✓  Id del ítem de franquicia de la actividad. Para crear un ítem usar id= 0 y para editar usar el id obtenido a través del GET.
workingTimeType string 128    Tipo de hora
activity string 128    Tipo de actividad
franchise int     Franquicia de horas por actividad
value decimal     Valor gastado en la actividad seleccionada
valueExceededHour decimal     Valor de las horas excedentes
shootdownContract bool     Reducir del contrato de horas
allowHoursExcedent bool     Cobranza de horas excedentes
activityId int     Asignar una actividad al contrato por el id de la actividad

Contrato de horas » Consumo diferenciado por tiempo

timeAgreement.timeTypeConsumption[n]

Propiedad Tipo Tamaño Obligatorio Descripción
id int   ✓   Id del ítem de franquicia del consumo. Para crear un ítem usar id= 0 y para editar usar el id obtenido a través del GET.
workingTimeType string  128    Tipo de hora
value decimal     Valor del tipo de hora a ser consumida de forma diferenciada.
workingTimeAgreementId int     Contiene el ID del contrato para ese consumo de horas.
typeActivities activities   ✓  Lista de actividades del contrato de horas. ver documentación

Contrato de horas » Destinatario

timeAgreement.emailDestinations[n]

Propiedad Tipo Tamaño Obligatorio Descripción
type  object     El tipo predefinido de destinatario.
email  email     Dirección de correo electrónico del destinatario 

 

Persona

timeAgreement[n].organization

Propiedad Tipo Tamaño Obligatorio Descripción
id cadena 64  ✓  Id (Cod. ref.) de la organización (Solo lectura).
businessName cadena 128   Nombre de la organización (Solo lectura).
email cadena 128   Correo electrónico principal de la organización (Solo lectura).
phone cadena 128   Teléfono principal de la organización (Solo lectura).
personType int 1   Tipo de persona: Persona = 1, Empresa = 2, Departamento = 4  (Solo lectura).
profileType int 1  

Perfil de la persona: Agente = 1, Cliente = 2, Agente y Cliente = 3  (Solo lectura).

*UTC: El Tiempo Universal Coordinado (en inglés Universal Time Coordinated) es el huso horario de referencia a partir del cual se calculan todas las demás zonas horarias del mundo. Ej: Si tu huso horario es el de Brasilia (UTC-03:00) y la hora actual es 15:30, la hora UTC será 18:30.

Trabajando con los datos

Para acceder a los datos es necesario que previamente se genere una clave para la API

Para generar una clave para la API (token), accede a Movidesk, ve a Configuración / Cuenta / Parámetros y en la pestaña de entorno haz clic en el botón "Generar nueva clave" si aún no tienes una creada.
Podrás repetir esta operación siempre que desees generar una nueva clave de acceso, pero recuerda que al generar una nueva clave, todos los programas que utilicen la clave antigua dejarán de funcionar.

Todo el flujo de datos (Visualización/Inserción/Modificación) debe tener el formato JSON como el ejemplo a continuación:

{
"name": "Contrato",
"emailSubject": "Asunto",
"emailDescription": "Correo importante",
"emailAccount": "email@movidesk.com",
"isActive": true,
"differentiateHoursFranchise": false,
"differentiateHoursConsumption": true,
"accumulateUnusedHours": false,
"renewalDay": 23,
"contractedHours": 344,
"consumptionDeadline": null,
"emailSendDay": null,
"baseAmount": 420,
"createdOn": "0001-01-01T00:00:00",
"disabledDate": null,
"typeActivities": [
{
"id": 64,
"workingTimeType": "10x5",
"activity": "Atención",
"franchise": null,
"value": 22,
"valueExceededHour": 22,
"shootdownContract": true,
"allowHoursExcedent": true
},
{
"id": 76,
"workingTimeType": "24x7",
"activity": "Atención",
"franchise": null,
"value": 33,
"valueExceededHour": 44,
"shootdownContract": true,
"allowHoursExcedent": true
}
],
"timeTypeConsumption": [
{
"id": 65,
"workingTimeType": "24x7",
"value": 4.34
}
],
"clients": [
{
"id": "937205263",
"personType": 1,
"profileType": 2,
"businessName": "Cliente 01",
"email": null,
"organization": {
"id": "51",
"personType": 2,
"profileType": 2,
"businessName": "WINDSOFT SISTEMAS",
"email": null,
"phone": "(17 )3215-6809",
"address": null,
"complement": null,
"cep": null,
"city": null,
"bairro": null,
"number": null,
"reference": null
}
},
{
"id": "1604080257",
"personType": 1,
"profileType": 3,
"businessName": "Cliente 02",
"email": "cliente02@movidesk.com",
"organization": {
"id": "1288891306",
"personType": 2,
"profileType": 3,
"businessName": "Movidesk",
"email": null,
"phone": null,
"address": null,
"complement": null,
"cep": null,
"city": null,
"bairro": null,
"number": null,
"reference": null
}
}
],
"emailDestinations": [
{
"type": 0,
"email": null
}
]
}

Obteniendo datos

Método GET

Obteniendo un único contrato de horas

GET: /timeAgreement
Parámetros: nombre, token

Ejemplo:

Obteniendo el contrato con el nombre contrato

GET: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&name=Contrato

Retorno:

  {
   "name": "Contrato",
"emailSubject": "Asunto",
"emailDescription": "Correo importante",
"emailAccount": "email@movidesk.com",
"isActive": true,
"differentiateHoursFranchise": false,
"differentiateHoursConsumption": true,
"accumulateUnusedHours": false, ... Otras columnas en el formato del diseño anterior }

Obteniendo una lista de contratos de horas

GET: /timeAgreement
Parámetros: token, $select

Ejemplo:

Obteniendo una lista de contratos de horas (es obligatorio el uso de la cláusula $select)

GET: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&$select=renewalDay,name

Retorno:

{
"renewalDay": 23,
"name": "Contrato"
},
{
"renewalDay": 23,
"name": "Contrato1"
},
{
"renewalDay": 5,
"name": "Contrato2"
},
{
"renewalDay": 1,
"name": "Contrato otro"
}, ... Otros ítems de la lista

Obteniendo contratos de horas con filtros

GET: /timeAgreement
Parámetros: token, $select

Para permitir y simplificar consultas con filtros, la API utiliza el protocolo abierto OData. Los filtros posibles son:
• $filter: la expresión especificada con este filtro es evaluada para cada ítem del retorno de la consulta y solo los ítems en los que el resultado de la expresión sea verdadero serán incluidos en el retorno final;
• $orderby: permite que los ítems del retorno de la consulta sean ordenados de manera ascendente (asc) o descendente (desc). Si no se especifica asc o desc, el valor predeterminado será asc;
• $top: permite especificar el número de ítems que deben ser incluidos en el retorno de la consulta;
• $skip: permite especificar la cantidad de ítems que deben ser ignorados y no incluidos en el retorno de la consulta;
• $select: permite especificar propiedades específicas de los ítems que deben ser llenadas en el retorno de la consulta;
• $expand: permite expandir las colecciones hijas de los ítems consultados.

Ejemplos:

Obteniendo el nombre y las horas contratadas, donde las horas contratadas son mayores que 61:

GET: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&$select=name,contractedHours&$filter=contractedHours gt 61

Retorno:
[
 {
"contractedHours": 62,
"name": "Contrato B"
},
{
"contractedHours": 65,
"name": "Contrato A"
},
... Otros ítems de la lista que tengan horas contratadas mayores que 61
]


Obteniendo el nombre y las horas contratadas, donde las horas contratadas son mayores que 61 y ordenados de forma descendente en relación con las horas contratadas:

GET: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&$select=name,contractedHours&$filter=contractedHours gt 61&$orderby=contractedHours desc

Retorno:
[
{
"contractedHours": 65,
"name": "Contrato A"
},
{
"contractedHours": 62,
"name": "Contrato B"
},
... Otros ítems de la lista que tengan horas contratadas mayores que 61 y estén ordenados de forma descendente en relación con las horas contratadas
]

 

Insertando datos

Método POST

POST: /timeAgreement
Parámetros: token
Headers: Content-Type: application/json
Cuerpo del post: {objeto JSON}
Ejemplo:
POST: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5
Headers: Content-Type: application/json {
"name": "Contrato Nuevo",
"emailSubject": null,
"emailDescription": null,
"emailAccount": null,
"isActive": true,
"differentiateHoursFranchise": false,
"differentiateHoursConsumption": true,
"accumulateUnusedHours": false,
"renewalDay": 23,
"contractedHours": 344,
... Otras columnas en el formato del diseño anterior

Retorno: Estado 200 y en el cuerpo el nombre del contrato (como id).


Actualizando datos

Método PATCH

A diferencia de la inserción de datos (POST), la actualización se realiza de forma parcial. Por lo tanto, es necesario enviar al servidor solamente los datos que se desean modificar.
Sin embargo, la modificación de las listas (objetos secundarios) siempre sobrescribe todos los ítems de la lista.


PATCH: /timeAgreement
Parámetros: token, name
Headers: Content-Type: application/json
Cuerpo: {objeto JSON}

Ejemplos:

Cambiando el asunto del correo del contrato de horas con nombre "Contrato"

PATCH: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&name=Contrato 
Headers: Content-Type: application/json
RequestBody:
{
  "subjectEmail": "Contrato nuevo"
}

Retorno: Estado 200

En el ejemplo anterior, solo se modifica el campo subjectEmail, los demás campos permanecen sin cambios.

Eliminando los consumos del contrato de horas diferenciados por tiempo con nombre "Contrato nuevo".

PATCH: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&name=Contrato nuevo
Headers: Content-Type: application/json
RequestBody:
{
  "timeTypeConsumption": []
}

Retorno: Estado 200

Dado que estos consumos están en una lista, en el ejemplo anterior, todos ellos serán eliminados. Los valores especificados en la lista siempre sobrescriben los valores previamente almacenados.
 

Eliminando contratos

Método DELETE

DELETE: /timeAgreement
Parámetros: token, name
Headers: Content-Type: application/json
Cuerpo: {objeto JSON}

Ejemplos:

Eliminando el contrato de horas con nombre "ContratoErrado"

DELETE: https://api.movidesk.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5&name=ContratoErrado
Headers: Content-Type: application/json

Retorno: Estado 200

En el ejemplo anterior, se elimina el contrato de horas con el nombre solicitado.

 

 

 

Ejemplo de código fuente en lenguaje C# para llamar a la API

Método POST

try
{
var timeAgreement = new
{
subject = "Nuevo contrato"
};
var json = JsonConvert.SerializeObject(timeAgreement);

var response = await SendAsync("http://movidesk.localhost/public/v1/timeAgreement?token=SEUTOKEN",
json, "POST", "application/json");
}
catch (WebException ex)
{
var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
}

public static async Task<string> SendAsync(string uri, string content, string method, string contentType)
{
var req = WebRequest.Create(uri);
req.ContentType = contentType;
req.Method = method;

using (var stream = await req.GetRequestStreamAsync())
using (var streamWriter = new StreamWriter(stream))
{
await streamWriter.WriteAsync(content);
}

var httpResponse = (HttpWebResponse)await req.GetResponseAsync();
using (var stream = httpResponse.GetResponseStream())
{
if (stream == null)
return null;

using (var streamReader = new StreamReader(stream))
{
return await streamReader.ReadToEndAsync();
}
}
}

En el ejemplo anterior, la inserción del contrato de horas no se realizará debido a varios errores en el cuerpo de la solicitud. Los errores se detallan en la variable response y deben ser corregidos siguiendo esta documentación.



https://api.movidesktest.com/public/v1/timeAgreement?token=3bd53482-72b0-4057-9545-3975a3423ec5
timeAgreement
¿Te ha útil este artículo?
Vistos recientemente