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). | |
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. | ||
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). | |
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
Ejemplo:
Parámetros: token, $select
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
Para permitir y simplificar consultas con filtros, la API utiliza el protocolo abierto OData. Los filtros posibles son:
Parámetros: token, $select
• $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}
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.