WSAltaServicio
Crea, actualiza o cancela una tarea (servicio) de despacho, con origen/destino, geocodificación interna, alta de cuenta inline, resolución de motivo/prestación/causa, datos de vehículo, campos dinámicos (OAV) y adjuntos.
Alta / Actualización / Cancelación de tarea
/apidev/legacy/WSAltaServicioTodos los servicios legacy son POST a /apidev/legacy/<WSName>. No usan headers Authorization / X-API-Key / tenant: la autenticación viaja en el cuerpo como objeto WSAutorizacion. La respuesta siempre es HTTP 200; el resultado y los mensajes de error/validación se devuelven dentro del envelope, en el campo Notas.
Modos de operación
El campo CancelarTarea controla la operación:
| Modo | Condición | Descripción |
|---|---|---|
| Crear | CancelarTarea = "NO" y no existe la tarea | Crea un servicio nuevo (SerEstId desde "SA", SerModoTareaCreada = "WS"). |
| Actualizar | CancelarTarea = "NO" y la tarea ya existe | Carga por NroServicio → IdExterno y actualiza los datos. |
| Cancelar | CancelarTarea = "SI" | Cancela la tarea existente. Notas = "La tarea ha sido cancelada.". |
Cuerpo de la solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
WSAutorizacion | object | Sí | Credenciales legacy: { Guid, Usuario, Password }. |
WSAutorizacion.Guid | string | Sí | API key de la compañía; resuelve el CiaId. |
WSAutorizacion.Usuario | string | Sí | Email/login del usuario (se normaliza a minúsculas + trim). |
WSAutorizacion.Password | string | Sí | Contraseña validada por el servicio. |
WSSDTAltaServicio | object | Sí | Payload de la tarea (campos a continuación). |
WSSDTAltaServicio
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
CancelarTarea | string | No | "SI" (insensible a mayúsculas) → rama de cancelación. "NO" con tarea CAN existente → reenvío como cancelada-pendiente. |
CancelarNota | string | No | Se anexa a la observación de cancelación. |
NroAsistencia | string (numeric 10,0) | No | Número de asistencia padre. >0 → busca el SerId padre y marca EsHijo. |
NroServicio | string (numeric 10,0) | No | Número de tarea; se usa para cargar/actualizar una tarea existente. |
CuentaCodigoExterno | string | No | Código externo de cuenta; resuelve el CueId. |
CuentaNombre | string | No | Nombre de cuenta de respaldo al crearla. |
CuentaDoc | string | No | Documento de la cuenta. |
Procedencia | string | No | Se resuelve a CueProId. No vacío + no resuelto → " - Procedencia Inválida". |
Producto | string | No | Se resuelve a CueProTipCliLin. No resuelto → " - Producto Inválido". |
Cobertura | string | No | Se resuelve a CueProCobLin. No resuelto → " - Cobertura Inválida". |
Celular | string | No | → SerTelefono1 (substr 1..20). También clave de búsqueda de cuenta CueCel. |
Telefono | string | No | → SerTelefono2 (substr 1..20). Clave de búsqueda CueTel. |
IdExterno | string | No | → SerId_Externo; lookup alternativo de la tarea. |
Contacto | string | Condicional | Requerido (no vacío) cuando no se cancela → " - Contacto Vacío". |
Prioridad | short | No | 0 / <0 / >3 → se asigna 2. |
Particular | boolean | No | → SerParticular. Influye en el cómputo. |
Vehiculo_Matricula | string | No | → SerAutMat (substr 1..20). |
Vehiculo_Marca | string | No | → SerAutMar. |
Vehiculo_Modelo | string | No | → SerAutMod. |
Vehiculo_Anio | short | No | → SerAutAni. |
Vehiculo_Color | string | No | Se resuelve a SerColId (sin error si no resuelve). |
Vehiculo_Motor | string | No | Dato de vehículo. |
Vehiculo_Chasis | string | No | Dato de vehículo. |
Detalle | string (long) | No | → SerDet (token literal "null" removido). |
Programado | datetime | No | ISO-8601 sin zona horaria (2026-02-24T17:53:00). |
ProgramadoHasta | datetime | No | ISO-8601 sin zona horaria. |
Turno | string | No | Se resuelve a SerTurId. No resuelto → " - Turno invalido." (warn). |
Computa | boolean | No | false → calculado por el sistema; true → se usa tal cual. |
TiempoDemora | string (numeric 10,2) | No | → SerTiempoDemoraGPS. |
Prestacion | string | No | Se resuelve a SerPrestaId. No resuelto → " - Prestación Inválida". |
Origen_Causa | string | No | → SerCauId. No resuelto → " - Origen Causa Inválida". |
Origen_SubCausa | string | No | → SerCauSubCauLin. No resuelto → " - Origen SubCausa Inválida". |
Origen_LugarEspecial | string | No | → SerLugEspId. Warn-only. |
Origen_Pais | string | No | → SerPaiId. No resuelto → " - País Inválido". |
Origen_Departamento | string | No | → SerPaiDepLin. No resuelto → " - Origen Departamento Inválida". |
Origen_Ciudad | string | No | → SerPaiDepCiuLin. No resuelto → " - Origen Ciudad Inválida". |
Origen_Zona | string | No | → SerPaiDepCiuZonLin. Warn-only. |
Origen_Calle | string | No | → SerCalle (token literal "null" removido). |
Origen_Esquina | string | No | → SerEsquina. |
Origen_Esquina2 | string | No | → SerEsquina2. |
Origen_NumeroPta | string | No | → SerNumeroPta. |
Origen_Apto | string | No | → SerApto. |
Origen_MiraHacia | string | No | → SerMiraHacia. |
Origen_Latitud | string (numeric 18,14) | No | → SerLatitud. Si 0 → geocodificación interna automática. |
Origen_Longitud | string (numeric 18,14) | No | → SerLongitud. |
Destino_Causa | string | No | → SerTraCauId. No resuelto → " - Destino Causa Inválida". |
Destino_SubCausa | string | No | → SerTraCauSubCauLin. No resuelto → " - Destino SubCausa Inválida". |
Destino_LugarEspecial | string | No | → SerTraLugEspId. Warn-only. |
Destino_Pais | string | No | → SerTraPaiId. No resuelto → " - Destino País Inválido". |
Destino_Departamento | string | No | → SerTraPaiDepLin. No resuelto → " - Destino Departamento Inválida". |
Destino_Ciudad | string | No | → SerTraPaiDepCiuLin. No resuelto → " - Destino Ciudad Inválida". |
Destino_Zona | string | No | → SerTraPaiDepCiuZonLin. Warn-only. |
Destino_Calle | string | No | → SerTraCalle. |
Destino_Esquina | string | No | → SerTraEsquina. |
Destino_Esquina2 | string | No | Presente en el SDT. |
Destino_NumeroPta | string | No | → SerTraNroPuerta. |
Destino_Apto | string | No | → SerTraApto. |
Destino_MiraHacia | string | No | → SerTraMiraHacia. |
Destino_Latitud | string (numeric 18,14) | No | → SerTraLatitud (geocodificación si 0). |
Destino_Longitud | string (numeric 18,14) | No | → SerTraLongitud. |
Motivo | string | No | Se resuelve a SerMotId. Si se setea, sobrescribe prestación/causa/subcausa desde el motivo. No resuelto → " - Motivo Inválido". |
ReservarPersonal | string | No | → SerFijadoConId. Warn-only. Dispara notificación de reserva. |
ReservarPrestador | string | No | → SerFijadoPreId. No resuelto → " - Reservar Prestador Inválido". |
ReservarMovil | string | No | → SerFijadoVehId. No resuelto → " - Reservar Movil Inválido". |
ReservarUsuarioEmail | string | No | → SerFijadoUsuId. No resuelto → " - Reservar Usuario Email Inválido". |
MedioComunicacion | string | No | → SerAltaMedComId. Warn-only. |
CueMail | string | No | Email de cuenta de respaldo (clave de búsqueda CueMail). |
TelefonistaAlias | string | No | Resuelve el usuario operador por alias cuando el email está vacío. |
TelefonistaEmail | string | No | Resuelve SerTelUsuId. Cae a alias y luego a WSAutorizacion.Usuario. No vacío y no resuelto → " - Usuario Inválido". |
Automatizar | boolean | No | SerAutomatico = "SI"/"NO". |
AlertaAsignacion | string | No | Se almacena como alerta del servicio. |
TipoMoviles | string | No | Lista de tipos de móvil separada por |; tipo inválido → " - Tipo de Móvil inválido: <nombre>". Se guarda como arreglo JSON en SerColTipVehId. |
NoNotificarMovil | boolean | No | Suprime la notificación de actualización al móvil en edición. |
PendienteSinConfirmar | boolean | No | → SerPendiente. |
PrestacionId | string (numeric 18,0) | No | Id explícito de prestación. |
Adjuntos | array | No | Adjuntos por URL; se cargan tras guardar. |
Cuenta | object | No | Detalle de cuenta usado al auto-crear una cuenta nueva. |
CamposDinamicos | array | No | Campos dinámicos (OAV); se emparejan por nombre (minúsculas + trim) contra la plantilla OAV del servicio. |
Adjuntos[]
| Campo | Tipo | Descripción |
|---|---|---|
Nombre | string | Nombre visible del archivo. |
Url | string (long) | URL origen a descargar/almacenar. |
Notas | string (long) | Notas del adjunto. |
Cuenta
| Campo | Tipo | Descripción |
|---|---|---|
Nombre | string | Nombre de cuenta (clave CueNom; cae a CuentaNombre y luego a Contacto). |
Telefono | string | Clave de búsqueda CueTel. |
Celular | string | Clave CueCel (cae al Celular de nivel superior). |
Mail | string | Clave CueMail (cae al CueMail de nivel superior). |
Notas | string (long) | Clave CueObs. |
Direccion_Calle | string | Clave CueCalle. |
Direccion_Esquina | string | Clave CueEsquina. |
Direccion_NumeroPta | string | Clave CueNroPuerta. |
Direccion_Pais | string | Clave CuePaiNom. |
Direccion_Departamento | string | Clave CueDepNom. |
Direccion_Ciudad | string | Clave CueCiuNom. |
Direccion_Latitud | string (numeric 18,14) | Clave CueLatitud (solo si ≠ 0). |
Direccion_Longitud | string (numeric 18,14) | Clave CueLongitud (solo si ≠ 0). |
CamposDinamicos[]
| Campo | Tipo | Descripción |
|---|---|---|
etiqueta | string | Clave JSON en minúsculas. Se empareja (lower + trim) contra SerOAV_Item_Name. |
valor | string (long) | Clave JSON en minúsculas. Se escribe en SerOAV_Item_Value. |
Respuesta
La respuesta es HTTP 200 con el envelope GeneXus. El campo Notas es el canal de resultado/error: transporta tanto mensajes de éxito como cada mensaje de validación o error.
| Campo | Tipo | Descripción |
|---|---|---|
WSSDTDatoNroServicio | object | Propiedad única del envelope OUT. |
↳ Id | string (numeric 18,0) | SerId creado/actualizado. |
↳ NroServicio | string (numeric 10,0) | SerNroServicio. |
↳ NroAsistencia | string (numeric 10,0) | SerNroAsistencia. |
↳ Notas | string (long) | Canal de resultado/error: lleva "GUID Inválido", "Cuenta inexistente o inválida...", "La tarea ha sido cancelada.", los Errores de validación o los mensajes del guardado. |
Ejemplos de código
- cURL
- JavaScript
- Python
curl -s -X POST "https://$TENANT/apidev/legacy/WSAltaServicio" \
-H "Content-Type: application/json" \
-d '{
"WSAutorizacion": {
"Guid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Usuario": "usuario@empresa.com",
"Password": "********"
},
"WSSDTAltaServicio": {
"CancelarTarea": "NO",
"IdExterno": "EXT-20260403-001",
"Contacto": "Juan Pérez",
"Prestacion": "Asistencia Vial",
"Origen_Causa": "Batería descargada",
"Origen_SubCausa": "Sin arranque",
"Prioridad": 2,
"Detalle": "Cliente aguarda en el vehículo",
"Origen_Calle": "18 de Julio",
"Origen_NumeroPta": "1234",
"Origen_Departamento": "Montevideo",
"Destino_Latitud": "-34.88330000000000",
"Destino_Longitud": "-56.16700000000000",
"Cuenta": {
"Nombre": "Juan Pérez",
"Telefono": "099123456"
}
}
}'
const res = await fetch(`https://${TENANT}/apidev/legacy/WSAltaServicio`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
WSAutorizacion: {
Guid: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
Usuario: 'usuario@empresa.com',
Password: '********',
},
WSSDTAltaServicio: {
CancelarTarea: 'NO',
IdExterno: 'EXT-20260403-001',
Contacto: 'Juan Pérez',
Prestacion: 'Asistencia Vial',
Origen_Causa: 'Batería descargada',
Origen_SubCausa: 'Sin arranque',
Prioridad: 2,
Detalle: 'Cliente aguarda en el vehículo',
Origen_Calle: '18 de Julio',
Origen_NumeroPta: '1234',
Origen_Departamento: 'Montevideo',
Cuenta: { Nombre: 'Juan Pérez', Telefono: '099123456' },
},
}),
});
const data = await res.json();
const notas = data.WSSDTDatoNroServicio.Notas; // canal de resultado/error
import requests
response = requests.post(
f"https://{TENANT}/apidev/legacy/WSAltaServicio",
json={
"WSAutorizacion": {
"Guid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Usuario": "usuario@empresa.com",
"Password": "********",
},
"WSSDTAltaServicio": {
"CancelarTarea": "NO",
"IdExterno": "EXT-20260403-001",
"Contacto": "Juan Pérez",
"Prestacion": "Asistencia Vial",
"Origen_Causa": "Batería descargada",
"Origen_SubCausa": "Sin arranque",
"Prioridad": 2,
"Detalle": "Cliente aguarda en el vehículo",
"Origen_Calle": "18 de Julio",
"Origen_NumeroPta": "1234",
"Origen_Departamento": "Montevideo",
"Cuenta": {"Nombre": "Juan Pérez", "Telefono": "099123456"},
},
},
)
data = response.json() # siempre HTTP 200
notas = data["WSSDTDatoNroServicio"]["Notas"] # canal de resultado/error
Cancelación de tarea
{
"WSAutorizacion": {
"Guid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Usuario": "usuario@empresa.com",
"Password": "********"
},
"WSSDTAltaServicio": {
"CancelarTarea": "SI",
"NroServicio": "103878",
"CancelarNota": "Cliente no encontrado"
}
}
Ejemplo de respuesta
{
"WSSDTDatoNroServicio": {
"Id": "7234567890123456789",
"NroServicio": "103878",
"NroAsistencia": "103490",
"Notas": ""
}
}
Respuesta de una cancelación exitosa:
{
"WSSDTDatoNroServicio": {
"Id": "7234567890123456789",
"NroServicio": "103878",
"NroAsistencia": "103490",
"Notas": "La tarea ha sido cancelada."
}
}
Errores
Todos los errores se devuelven con HTTP 200 en el campo Notas del envelope (no hay códigos 4xx). Las validaciones de catálogo se acumulan anexadas como - <mensaje> al texto de Notas.
Mensaje en Notas | Causa |
|---|---|
GUID Inválido | El Guid no resuelve a una compañía (CiaId == 0). |
URL Inválida | El host/URL no está en la lista permitida (el superusuario la omite). |
Cuenta inexistente o inválida... | No se pudo resolver ni auto-crear la cuenta. |
Debe ingresar el motivo de la tarea o la prestación, causa y sub causa. | Falta Motivo o la terna Prestacion + Origen_Causa + Origen_SubCausa. |
La tarea ha sido cancelada. | Resultado correcto de la rama de cancelación. |
- Contacto Vacío | Contacto vacío al crear/actualizar (no cancelación). |
- Procedencia Inválida | Procedencia no resuelta. |
- Producto Inválido | Producto no resuelto. |
- Cobertura Inválida | Cobertura no resuelta. |
- Motivo Inválido | Motivo no resuelto. |
- Prestación Inválida | Prestacion no resuelta. |
- Origen Causa Inválida | Origen_Causa no resuelta. |
- Origen SubCausa Inválida | Origen_SubCausa no resuelta. |
- Destino Causa Inválida | Destino_Causa no resuelta. |
- Destino SubCausa Inválida | Destino_SubCausa no resuelta. |
- País Inválido | Origen_Pais no resuelto. |
- Origen Departamento Inválida | Origen_Departamento no resuelto. |
- Origen Ciudad Inválida | Origen_Ciudad no resuelta. |
- Destino País Inválido | Destino_Pais no resuelto. |
- Destino Departamento Inválida | Destino_Departamento no resuelto. |
- Destino Ciudad Inválida | Destino_Ciudad no resuelta. |
- Reservar Prestador Inválido | ReservarPrestador no resuelto. |
- Reservar Movil Inválido | ReservarMovil no resuelto. |
- Reservar Usuario Email Inválido | ReservarUsuarioEmail no resuelto. |
- Usuario Inválido | TelefonistaEmail no vacío y no resuelto. |
- Tipo de Móvil inválido: <nombre> | Un nombre de TipoMoviles no resuelve a un tipo de vehículo. |
- Turno invalido. | Turno no resuelto (warn, no bloquea). |