CaseModule
Módulo principal para gestión de casos en la plataforma Shori.
Proporciona acceso a todas las operaciones sobre casos: creación, búsqueda, actualización y gestión de recursos asociados. Este módulo actúa como Facade agrupando sub-módulos especializados para cada área de responsabilidad.
Se accede a través de client.caso() y es completamente thread-safe.
Operaciones disponibles
ShoriClient client = ShoriClient.builder()...build();
// CRUD básico
CasoResponse caso = client.caso().findById("documentId-del-caso");
CasoCreateResponse nuevo = client.caso().create(request);
client.caso().update(request);
// Búsqueda con filtros (una página)
List casos = client.caso().search(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.workingSubStateId(FilterOperator.IN, "estado-1", "estado-2")
.dataField("nombreCliente", FilterOperator.LIKE, "García")
.pageSize(20)
.build()
);
// Búsqueda completa con auto-paginación
List todos = client.caso().searchAll(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.build()
);
Jerarquía de clasificación en Shori
Servicio (primaryLevel)
└── Proceso (secondaryLevel)
└── Producto (casoType)
└── Caso
Sub-módulos
client.caso().files() → Archivos adjuntos del caso
client.caso().state() → Cambio de estados del flujo
client.caso().comment() → Comentarios del caso
client.caso().casoType() → Productos (tipos de caso) y sus estados
client.caso().primaryLevel() → Servicios (nivel primario)
client.caso().secondaryLevel() → Procesos (nivel secundario)
client.caso().fileTypology() → Tipologías de archivos y sus categorías
client.caso().user() → Asignación de usuarios a casos
Metodos
files()
Accede al sub-módulo de archivos adjuntos del caso.
Permite buscar, descargar, actualizar y eliminar documentos adjuntos a los casos.
// Buscar archivos de un caso
List archivos = client.caso().files().search("caso-documentId");
// Descargar archivos adjuntos
List docs = client.caso().files().getAttachments(request);
// Eliminar un documento
client.caso().files().delete("documento-documentId");
Retorna: CaseFilesModule para gestión de archivos adjuntos
state()
Accede al sub-módulo de gestión de estados del caso.
Permite avanzar el caso al siguiente estado según el flujo de trabajo configurado en Shori.
NextStateRequest request = NextStateRequest.builder()
.casoId("caso-documentId")
.workingSubStatePrimaryLevelId("siguiente-estado-documentId")
.build();
boolean exito = client.caso().state().next(request);
Retorna: CaseStateModule para gestión de estados
comment()
Accede al sub-módulo de comentarios del caso.
Permite agregar comentarios y notas a un caso existente.
AddCommentRequest request = AddCommentRequest.builder()
.casoId("caso-documentId")
.comment("El cliente fue contactado exitosamente.")
.build();
AddCommentResponse resultado = client.caso().comment().add(request);
Retorna: CaseCommentModule para gestión de comentarios
casoType()
Accede al sub-módulo casoType — Producto en Shori.
En el SDK se llama casoType, pero conceptualmente en Shori
representa un Producto, que es un subproceso
dentro de la jerarquía: Servicio → Proceso → Producto (casoType) → Caso.
Permite obtener la definición del Producto incluyendo sus estados, formularios y configuración del flujo de trabajo.
ProductResponse producto = client.caso().casoType().findById("producto-documentId");
// Obtener estados disponibles del producto
List estados = producto.getStates();
// Obtener IDs de estados abiertos para filtrar búsquedas
List abiertos = ShoriUtils.openStatesIds(producto);
Retorna: CaseTypeModule para consulta de Productos (casoType)
primaryLevel()
Accede al sub-módulo de Servicios (Primary Level).
Permite administrar y consultar los Servicios configurados en Shori, incluyendo su información general, estados asociados, niveles secundarios y configuraciones funcionales relacionadas.
Ejemplo
PrimaryLevelResponse service =
client.caso()
.primaryLevel()
.findById("primary-level-documentId");
System.out.println(service.getName());
Retorna: CasePrimaryLevelModule para gestión de Servicios
secondaryLevel()
Accede al sub-módulo de Procesos (Secondary Level).
Permite administrar y consultar los Procesos asociados a los Servicios de Shori. Desde este módulo es posible obtener información detallada de un proceso, crear nuevos registros y realizar búsquedas paginadas utilizando filtros personalizados.
Ejemplo
SecondaryLevelResponse process =
client.caso()
.secondaryLevel()
.findById("secondary-level-documentId");
System.out.println(process.getName());
Búsqueda
SecondaryLevelSearchResponse result =
client.caso()
.secondaryLevel()
.search(
SecondaryLevelFilter.builder()
.name(FilterOperator.LIKE, "Portabilidad")
.build()
);
Retorna: CaseSecondaryLevelModule para gestión de procesos
user()
Accede al sub-módulo de asignación de usuarios a casos.
Permite asignar y desasignar usuarios responsables o participantes a uno o varios casos.
client.caso().user().assignResponsible(
AssignRequest.builder()
.userId("user-uuid")
.casoIds(List.of("caso-uuid"))
.build()
);
Retorna: CaseUserModule para gestión de asignaciones de usuarios
fileTypology()
Accede al sub-módulo de tipologías de archivos.
Permite consultar y gestionar las tipologías de archivos configuradas para un producto (casoType), incluyendo sus categorías asociadas.
// Obtener todas las tipologías de un producto
List tipologias = client.caso().fileTypology().getByCasoType(
GetByCasoTypeRequest.builder()
.casoTypeId("producto-uuid")
.build()
);
// Obtener categorías de una tipología
TypologyResponse tipologia = client.caso().fileTypology().getCategoriesByTypology(
GetCategoriesByTypologyRequest.builder()
.fileTypologyId("tipologia-uuid")
.build()
);
Retorna: CaseFileTypologyModule para gestión de tipologías de archivos
findById(String uuid)
Obtiene un caso por su identificador único.
CasoResponse caso = client.caso().findById("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
System.out.println("Tipo: " + caso.getCasoTypeId());
System.out.println("Estado: " + caso.getWorkingSubStateName());
Parametros:
uuid—StringIdentificador único (UUID) del caso
Retorna: CasoResponse con todos los datos del caso
Lanza:
ResourceNotFoundException— si el caso no existe (HTTP 404)ApiException— si el API responde con error (HTTP 4xx/5xx)
create(CasoCreateRequest request)
Crea un nuevo caso en Shori.
CasoCreateRequest request = CasoCreateRequest.builder()
.casoTypeId("tipo-documentId")
.formId("formulario-documentId")
.priority("prioridad-documentId")
.submittedData(Map.of(
"nombreCliente", "Juan García",
"telefono", "+51987654321"
))
.build();
CasoCreateResponse resultado = client.caso().create(request);
String casoId = resultado.getCaso(); // UUID del caso creado
Parametros:
request—CasoCreateRequestDatos del caso a crear con tipo, formulario y datos de negocio
Retorna: CasoCreateResponse con el UUID y número del caso creado
Lanza:
ApiException— si los datos son inválidos (HTTP 400) o hay error del servidor
update(CasoUpdateRequest request)
Actualiza los datos de un caso existente.
CasoUpdateRequest request = CasoUpdateRequest.builder()
.id("caso-documentId")
.data(Map.of(
"observaciones", "Cliente contactado el 2024-01-15",
"prioridad", "ALTA"
))
.build();
client.caso().update(request);
Parametros:
request—CasoUpdateRequestDatos de actualización con el ID del caso y los campos a modificar
Lanza:
ResourceNotFoundException— si el caso no existe (HTTP 404)ApiException— si los datos son inválidos o hay error del servidor
count(CaseFilter filter)
Cuenta los casos que cumplen los filtros especificados.
int total = client.caso().count(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-uuid")
.workingSubStateId(FilterOperator.IN, "estado-uuid")
.build()
);
System.out.println("Total: " + total);
Parametros:
filter—CaseFilterFiltros de búsqueda
Retorna: Número total de casos que cumplen los criterios
Lanza:
ApiException— si hay error en el servidor
deleteFiles(String documentId)
Elimina un documento adjunto de un caso.
client.caso().deleteFiles("documento-uuid");
Parametros:
documentId— UUID del documento a eliminar
changePriority(String casoId, String priorityId)
Cambia la prioridad (urgencia) de un caso.
client.caso().changePriority("caso-uuid", "prioridad-uuid");
Parametros:
casoId— UUID del casopriorityId— UUID de la nueva prioridad
createMassive(CreateCasoMassiveRequest request)
Crea múltiples casos en lote (creación masiva).
CreateCasoMassiveResponse result = client.caso().createMassive(
CreateCasoMassiveRequest.builder()
.casoTypeId("product-uuid")
.casos(List.of(
CasoCreateRequest.builder()
.casoTypeId("tipo-uuid")
.formId("form-uuid")
.priority("prioridad-uuid")
.submittedData(Map.of("nombreCliente", "Ana García"))
.build()
))
.updateDuplicates(true)
.build()
);
System.out.println(result.getImportId());
Parametros:
request— Lista de casos y configuración de la operación masiva
Retorna: Resultado con el ID del proceso de importación
Lanza:
ApiException— si hay error en el servidor
search(CaseFilter filter)
Busca casos según los filtros especificados, retornando una sola página.
Usa CaseFilter para construir filtros complejos con múltiples
operadores. Si necesitas todos los resultados sin límite de página, usa
#searchAll(CaseFilter).
// Búsqueda simple por tipo de caso
List casos = client.caso().search(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-solicitud-documentId")
.pageSize(50)
.build()
);
// Búsqueda avanzada con múltiples filtros
List casos = client.caso().search(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.workingSubStateId(FilterOperator.IN, "estado-abierto", "estado-proceso")
.dataField("nombreCliente", FilterOperator.LIKE, "García")
.dataField("fechaCreacion", FilterOperator.GE, "2024-01-01")
.pageNumber(0)
.pageSize(20)
.build()
);
// Búsqueda con filtro de fecha de creación (convierte a UTC automáticamente)
List casos = client.caso().search(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.createdAt("2024-01-01", "2024-12-31", "America/Lima")
.pageSize(50)
.build()
);
// Solo desde una fecha (GE)
List casos = client.caso().search(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.createdAtFrom("2024-06-01", "America/Lima")
.build()
);
Parametros:
filter—CaseFilterFiltros de búsqueda construidos conCaseFilter#builder()
Retorna: CaseSearchResult Lista de casos que cumplen los criterios en la página solicitada
Lanza:
ApiException— si hay error en el servidor al ejecutar la búsqueda
searchAll(CaseFilter filter)
Busca TODOS los casos que cumplan los filtros, paginando automáticamente.
Este método realiza múltiples requests al API de forma transparente hasta obtener todos los resultados. Úsalo cuando necesites el conjunto completo de datos sin gestionar la paginación manualmente.
Precaución: Si hay muchos resultados, este método puede
tardar más tiempo. Considera usar #search(CaseFilter) con paginación
manual para mayor control.
// Obtener todos los casos abiertos de un tipo
List todosCasos = client.caso().searchAll(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.workingSubStateId(FilterOperator.IN, "estado-abierto-1", "estado-abierto-2")
.pageSize(100) // Tamaño de cada lote interno
.build()
);
System.out.println("Total casos: " + todosCasos.size());
Parametros:
filter—CaseFilterFiltros de búsqueda construidos conCaseFilter#builder()
Retorna: CasoSearchResponse Lista completa de todos los casos que cumplen los criterios
Lanza:
ApiException— si hay error en el servidor durante la paginación
searchWithAttachments(CaseFilter filter)
Busca casos con sus archivos adjuntos descargados (una página).
Combina la búsqueda de casos con la descarga automática de todos los
documentos adjuntos de cada caso encontrado. Es más lento que #search(CaseFilter)
pero retorna los datos completos listos para procesar.
List casosConArchivos = client.caso().searchWithAttachments(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
.pageSize(10)
);
for (CasoResponse caso : casosConArchivos) {
List archivos = caso.getFiles();
// Cada archivo ya está descargado en disco
archivos.forEach(f -> System.out.println(f.getFile().getPath()));
}
Parametros:
filter—CaseFilterFiltros de búsqueda
Retorna: CaseSearchResult Lista de casos con sus archivos adjuntos descargados
Lanza:
ApiException— si hay error en el servidor
searchAllWithAttachments(CaseFilter filter)
Busca TODOS los casos con sus archivos adjuntos descargados, paginando automáticamente.
List todos = client.caso().searchAllWithAttachments(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "tipo-documentId")
);
Parametros:
filter—CaseFilterFiltros de búsqueda
Retorna: CasoSearchResponse Lista completa de casos con archivos adjuntos descargados
Lanza:
ApiException— si hay error en el servidor