Satmovil API
La API de SATMovil ofrece un potente conjunto de criterios para la búsqueda, lectura y actualización de contenidos. Este documento describe cómo usar un estilo llamado REST para acceder y editar los datos de SATMovil. La API de SATMovil puede ser útil para varios proyectos de integración con las aplicaciones web u otras aplicaciones. Por ejemplo, puede utilizar la API de SATMovil para sincronizar los datos con una aplicación de escritorio.
Operaciones
Puede invocar cinco métodos diferentes, tal como se describe en la siguiente tabla.
Operación | Descripción | Petición |
---|---|---|
listar | Se obtiene la lista de registros de una colección | GET |
insertar | Se crea un nuevo registro dentro de una colección | POST donde se pasarán los datos del recurso |
obtener | Se obtiene un registro especifico | GET donde se pasará el identificador del registro |
actualizar | Se actualizar un registro especifico | PUT donde se pasarán los datos del recurso con su identificador |
eliminar | Se elimina un registro especifico | DELETE donde se pasará el identificador del registro |
Autenticación
Todas las peticiones que se realicen requieren la autenticación del usuario. Una vez realizada la autenticación se devolverá un "token" que se deberá enviar en cada petición.
Petición
Parámetros
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
usuario | string | Usuario de acceso a la aplicación |
clave | string | Clave de acceso a la aplicación |
Respuesta
Sí es satisfactoria devolverá un cadena de caracteres (token). Esta cadena se deberá enviar en cada petición que se realice y tendrá validez durante el día que se ha obtenido (para no tener que autenticarse en cada petición).
Listar
Se obtiene la lista de registros de una colección.
Petición
Parámetros
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
token | string | Cadena obtenida en la autenticación |
colección | string | Nombre de la colección - Ver listado de colecciones |
Parámetros opcionales | ||
extension | string |
Formato de los datos de respuesta. vacío: respuesta en formato json "xml": respuesta en formato xml |
Ver listado de colecciones para ver los parámetros opcionales para cada colección. |
Respuesta
Sí es satisfactoria la petición, devolverá el listado de registros de la colección en el formato seleccionado.
{
"id": "25",
"nombre": "Nombre 25",
....
},
...
]
<object id="0">
<id>25</id>
<nombre>Nombre 25</nombre>
....
</object>
...
</objects>
Insertar
Se crea un nuevo registro dentro de una colección.
Petición
Parámetros
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
token | string | Cadena obtenida en la autenticación |
colección | string | Nombre de la colección - Ver listado de colecciones |
Parámetros opcionales | ||
extension | string |
Formato de los datos de respuesta. vacío: respuesta en formato json "xml": respuesta en formato xml |
Cuerpo Petición
En el cuerpo de la petición se deben enviar los parámetros específicos para cada colección. Ver listado de colecciones
Respuesta
Sí es satisfactoria la petición, devolverá los datos del registro creado en el formato seleccionado.
"id": "25",
"nombre": "Nombre 25",
....
}
<id>25</id>
<nombre>Nombre 25</nombre>
....
</object>
Obtener
Se obtiene un registro especifico de una colección.
Petición
Parámetros
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
token | string | Cadena obtenida en la autenticación |
colección | string | Nombre de la colección - Ver listado de colecciones |
id | integer | Identificador numérico del registro a obtener |
Parámetros opcionales | ||
extension | string |
Formato de los datos de respuesta. vacío: respuesta en formato json "xml": respuesta en formato xml |
Respuesta
Sí es satisfactoria la petición, devolverá los datos del registro seleccionado en el formato seleccionado.
"id": "25",
"nombre": "Nombre 25",
....
}
<id>25</id>
<nombre>Nombre 25</nombre>
....
</object>
Actualizar
Se actualizará un registro existente de una colección.
Petición
Parámetros
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
token | string | Cadena obtenida en la autenticación |
colección | string | Nombre de la colección - Ver listado de colecciones |
id | integer | Identificador numérico del registro a actualizar |
Parámetros opcionales | ||
extension | string |
Formato de los datos de respuesta. vacío: respuesta en formato json "xml": respuesta en formato xml |
Cuerpo Petición
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
sf_method | string | Su valor debe ser "PUT" |
Parámetros opcionales | ||
Ver listado de colecciones para ver los parámetros opcionales para cada colección. |
Respuesta
Sí es satisfactoria la petición, devolverá los datos del registro actualizado en el formato seleccionado.
"id": "25",
"nombre": "Nombre 25",
....
}
<id>25</id>
<nombre>Nombre 25</nombre>
....
</object>
Eliminar
Se elimina un registro especifico de una colección.
Petición
Parámetros
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
token | string | Cadena obtenida en la autenticación |
colección | string | Nombre de la colección - Ver listado de colecciones |
id | integer | Identificador numérico del registro a eliminar |
Parámetros opcionales | ||
extension | string |
Formato de los datos de respuesta. vacío: respuesta en formato json "xml": respuesta en formato xml |
Cuerpo Petición
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
sf_method | string | Su valor debe ser "DELETE" |
Respuesta
Sí la petición no ha sido satisfactoria, la respuesta se devolverá en el formato seleccionado con los errores que han causado el fallo. Sí un elemento esta ya relacionado, no se podrá borrar el elemento. Por ejemplo, si un Aviso tiene intervenciones realizadas, ya no se podrá eliminar el aviso.
Colecciones
En la siguiente tabla se muestran las colecciones disponibles para la api y que métodos están disponibles para cada una de ellas. Para cada colección existen varios parámetros que se pueden usar en los diferentes métodos.
Nombre | Descripción | Listar | Insertar | Obtener | Actualizar | Eliminar |
---|---|---|---|---|---|---|
Cliente | clientes | |||||
Direccion | ubicaciones de los clientes | |||||
Contacto | contactos de los clientes | |||||
Almacen | almacenes | |||||
Empleado | empleados | |||||
Grupos de empleados | empleados | |||||
Familia | familias de artículos | |||||
Subfamilia | Subfamilias de artículos | |||||
Articulo | artículos | |||||
ArticulosAlmacen | stock de artículos en los almacenes | |||||
Equipo | elementos de los clientes | |||||
Aviso | avisos | |||||
Intervencion | intervenciones de los avisos | |||||
TipoContacto | tipos de contactos | |||||
TipoContrato | tipos de contratos | |||||
TipoGasto | tipos de gastos | |||||
TipoHora | tipos de horas | |||||
TipoIntervencion | tipos de intervención | |||||
TipoNota | tipos de notas de aceptación (Intervención) | |||||
TipoProblema | tipos de problema | |||||
Tarifa | tipos de tarifas | |||||
Contrato | contratos de mantenimiento |
Cliente
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
codigo | string (25) | Código del cliente, debe ser único. |
nombre | string (100) | Nombre del cliente. |
Parámetros opcionales | ||
cif | string (25) | El cif del cliente |
cpais | string (2) | El código del país en formato ISO 3166-1 alpha-2. Ver códigos |
estado | string (50) | Estado o provincia |
poblacion | string (100) | Población del cliente |
cpostal | string (20) | Código postal |
direccion | string (100) | Dirección principal |
telefono | string (25) | Número de teléfono |
fax | string (25) | Número de fax |
string (100) | Dirección de correo electrónico | |
web | string (150) | Página web del cliente |
kilómetros | float (18,2) | Distancia en kilómetros hasta el cliente |
horario | text | Horario del cliente |
notas | text | Notas |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Direccion
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
cliente | integer | Id de un registro de la colección Cliente |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
cliente_id | integer | Id del cliente. |
nombre | string (100) | Nombre de la dirección. |
Parámetros opcionales | ||
cpais | string (2) | El código del país en formato ISO 3166-1 alpha-2. Ver códigos |
estado | string (50) | Estado o provincia |
poblacion | string (100) | Población |
cpostal | string (20) | Código postal |
direccion | string (100) | Dirección |
telefono | string (25) | Número de teléfono |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Contacto
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
cliente | integer | Id de un registro de la colección Cliente |
ubicacion | integer | Id de un registro de la colección Direccion |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
cliente_id | integer | Id del cliente al que pertenece el contacto. |
nombre | string (100) | Nombre del contacto. |
Parámetros opcionales | ||
string (100) | Dirección de correo electrónico | |
telefono | string (25) | Número de teléfono |
movil | string (25) | Número de móvil |
direccion_id | integer | Id de la ubicación a la que pertenece el contacto |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Almacen
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
codigo | string (25) | Código del almacén, debe ser único. |
descripcion | string (255) | Descripción del almacén. |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Empleado
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
almacen | integer | Id de un registro de la colección Almacen |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
nombre | string (100) | Nombre del empleado. |
Parámetros opcionales | ||
codigo | string (25) | El código del empleado |
telefono | string (25) | Número de teléfono |
string (100) | Dirección de correo electrónico | |
color | string (7) | Color asignado al empleado. El código del color en formato HEX. Ver códigos |
almacen_id | integer | Id del almacen por defecto del empleado |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Grupo de empleado
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
almacen | integer | Id de un registro de la colección Almacen |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
nombre | string (100) | Nombre del empleado. |
Parámetros opcionales | ||
color | string (7) | Color asignado al empleado. El código del color en formato HEX. Ver códigos |
almacen_id | integer | Id del almacen por defecto del empleado |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Familia
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
codigo | string (25) | Código de la familia, debe ser único. |
descripcion | string (100) | Descripción de la familia. |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Subamilia
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
codigo | string (25) | Código de la subfamilia, debe ser único. |
descripcion | string (100) | Descripción de la subfamilia. |
familia_id | bigint (20) | id de la familia. |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Articulo
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
familia | integer | Id de un registro de la colección Familia |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
codigo | string (25) | El código del artículo |
familia_id | integer | Id de un registro de la colección Familia |
descripcion | string (100) | Descripción del artículo |
Parámetros opcionales | ||
imagen_url | string (255) | Dirección web de la imagen del artículo |
precio | float (18,2) | Precio de venta |
precio_coste | float (18,2) | Precio de compra |
marca | string(20) | Marca del artículo |
modelo | string(20) | Modelo del artículo |
ubicacion | string(255) | Lugar donde se coloca el artículo |
garantia | integer | Meses de garantía |
notas | text | Notas |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
ArticulosAlmacen
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
articulo | integer | Id de un registro de la colección Articulo |
almacen | integer | Id de un registro de la colección Almacen |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
almacen_id | integer | Id de un registro de la colección Almacen |
articulo_id | integer | Id de un registro de la colección articulo |
cantidad | float (18,2) | Cantidad traspasada |
Parámetros opcionales | ||
fecha | date | Fecha del movimiento, por defecto la fecha actual (yyyy-mm-dd) |
entrada | integer(1) | Tipo de movimiento: 0 = Salida; 1 = Entrada; Por defecto "0" (Salida) |
concepto | text | Concepto del movimiento |
Equipo
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
articulo | integer | Id de un registro de la colección Articulo |
ubicacion | integer | Id de un registro de la colección Direccion |
empleado | integer | Id de un registro de la colección Empleado |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
direccion_id | integer | Id de un registro de la colección Direccion |
n_serie | string (255) | Nº de serie del elemento. Solo es obligatorio sí en la configuración general no se ha activado la opción "Códigos Autonuméricos" para los elementos. |
Parámetros opcionales | ||
descripcion | text | Descripción del elemento. |
articulo_id | integer | Id de un registro de la colección Articulo |
empleado_id | integer | Id de un registro de la colección Empleado. El empleado que ha instalado el elemento. |
f_instalacion | date | Fecha de instalación del elemento (yyyy-mm-dd) |
marca | string(20) | Marca del artículo |
modelo | string(20) | Modelo del artículo |
ubicacion | string(255) | Lugar donde se coloca el artículo |
f_garantia_i | date | Fecha de inicio de la garantía (yyyy-mm-dd). |
f_garantia_f | date | Fecha final de la garantía (yyyy-mm-dd). |
notas | text | Notas |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Aviso
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
cliente | integer | Id de un registro de la colección Cliente |
ubicacion | integer | Id de un registro de la colección Direccion |
elemento | integer | Id de un registro de la colección Equipo |
empleado | integer | Id de un registro de la colección Empleado |
f_cierre | DATE | fecha de cierre en formato yyyy-mm-dd |
estado | integer | estado=0: avisos cerrados; estado=1: avisos abiertos |
fecha_prevista | DATE | fecha prevista en formato yyyy-mm-dd |
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
cliente_id | integer | Id del cliente al que pertenece el contacto. |
Parámetros opcionales | ||
equipo_id | integer | Id del elemento al que pertenece el aviso |
direccion_id | integer | Id de la ubicación a la que pertenece el aviso |
contacto_id | integer | Id del contacto del aviso |
n_referencia | varchar(255) | Número de aviso externo |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Intervención
Listar
Nombre | Valor | Descripción |
---|---|---|
Parámetros opcionales | ||
cliente | integer | Id de un registro de la colección Cliente |
aviso | integer | Id de un registro de la colección Aviso |
empleado | integer | Id de un registro de la colección Empleado |
desde | date | Fecha inicio intervalo |
hasta | date | Fecha fin intervalo |
fmodif | date | Modificados a partir de la fecha |
TipoContacto
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tipo | string (50) | Nombre del tipo |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
TipoContrato
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tipo_contrato | string (50) | Nombre del tipo |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
TipoGasto
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tipo_gasto | string (50) | Nombre del tipo |
precio | float (15,5) | precio |
visible_cliente | integer(1) | gasto interno (No visible al cliente) |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
TipoHora
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tarifa_id | integer | Id de la tarifa a la que pertenece |
tipo_hora | string (50) | Nombre del tipo |
precio | float (15,5) | precio |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
TipoIntervencion
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tipo | string (50) | Nombre del tipo |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
TipoNota
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tipo | string (50) | Nombre del tipo |
texto | text | Texto |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
TipoProblema
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tipo_problema | string (50) | Nombre del tipo |
tiempo | string (5) | Tiempo en formato hh:mm |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Tarifa
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
tarifa | string (50) | Nombre de la tarifa |
defecto | integer(1) | Si es por defecto. 0 = No; 1 = Si; Por defecto "0" |
Actualizar
Los mismos parámetros que el método insertar pero en este caso todos los parámetros son opcionales.
Contrato
Insertar
Nombre | Valor | Descripción |
---|---|---|
Parámetros requeridos | ||
cliente_id | bigint (20) | Id de la colección Cliente |
descripcion | string(255) | Descripción del contrato de mantenimiento |
importe | float | Importe del contrato de mantenimiento |
f_inicio | date | Fecha de inicio del contrato |
f_final | date | Fecha final del contrato |
Parámetros opcionales | ||
f_acept | date | Fecha de aceptación del contrato |
direccion_id | bigint(20) | Id de la colección Direccion, tiene que existir ésa dirección para el Cliente del contrato. |
tipo | bigint(20) | Id de la colección TipoContrato |
Ejemplos
Aquí podéis encontrar unos ejemplos de como aplicar la api en diferentes lenguajes y soluciones.
.NET
Ejemplo en c# de cómo hacer la autenticación para obtener el token, y cómo parametrizarlo en un request para hacer un GET de una colección.
/// Realiza la autenticación y obtiene un token que deberemos pasar en cada solicitud
/// </summary>
public static string GetRestAuthToken(string url, string user, string password)
{
String token = "";
try
{
using (var client = new WebClient())
{
var values = new NameValueCollection();
values["usuario"] = user;
values["clave"] = password;
client.Encoding = Encoding.UTF8;
if (url.EndsWith("/")) url = url.Remove(url.Length - 1, 1);
var response = client.UploadValues(url + "/api/auth", values);
token = UTF8Encoding.UTF8.GetString(response).Trim();
}
}
catch { }
return token;
}
/// <summary>
/// Realiza un GET caracterísitco para obtener listas de resultados pasando el token. Si el token
/// ha expirado vuelve a solicitarlo y refresca su valor para volver a ser usado
/// </summary>
/// <param name="entityName"></param>
/// <param name="parameters"></param>
/// <returns></returns>
private static string ListJsonFromRequest(string entityName, string parameters)
{
string jsonResult = "";
using (var client = new WebClient())
{
string entityUri = GetApiURL() + entityName+"?" +
((parameters != null) ? (parameters + "&"): "") + "token=" + token;
try
{
jsonResult = WebUtils.DownloadStringAwareOfEncoding(client, new Uri(entityUri));
}
catch (WebException e)
{
if (e.Message.Contains("(401)"))
{
token = WebUtils.GetRestAuthToken(baseURLService, User, Password);
entityUri = GetApiURL() + entityName + "?" +
((parameters != null) ? (parameters + "&") : "") + "token=" + token;
jsonResult = client.DownloadData(entityUri);
}
else throw new Exception(e.Message);
}
}
return jsonResult;
}
PHP
Ejemplo en PHP para realizar una autentificación de empleado.
<?php
$ch = curl_init("satmovil.onyx.cloud/api/auth");
$login = array(
'usuario' => '',
'clave' => ''
);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $login);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
$content = curl_exec( $ch );
$response = curl_getinfo( $ch );
if($response['http_code'] != 401){
$token = trim($content);
$url = "http://satmovil.onyx.cloud/api/rest/Empleado?token={$token}";
$param = array(
'nombre' => 'prueba API5'
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true); //SOLO caso de POST
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); //en caso de POST o PUT
$content = curl_exec( $ch );
$response = curl_getinfo( $ch );
exit(print_r($content).print_r($response));
if($response['http_code'] != 500){
if(strpos($response['content_type'],'xml') === false){
$objects = json_decode($content);
}else{
exit($content);
$content2 = str_replace(array('<','>'),array('','lt;','','gt;'),$content);
echo nl2br($content2);
$objects = simplexml_load_string($content);
}
var_dump($objects);
}else{
exit(print_r($content));
}
}else{
echo $content;
}
curl_close($ch);
?>