Saltar al contenido principal

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:

  • uuidString Identificador ú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:

  • requestCasoCreateRequest Datos 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:

  • requestCasoUpdateRequest Datos 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:

  • filterCaseFilter Filtros 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 caso
  • priorityId — 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:

  • filterCaseFilter Filtros de búsqueda construidos con CaseFilter#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:

  • filterCaseFilter Filtros de búsqueda construidos con CaseFilter#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:

  • filterCaseFilter Filtros 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:

  • filterCaseFilter Filtros de búsqueda

Retorna: CasoSearchResponse Lista completa de casos con archivos adjuntos descargados

Lanza:

  • ApiException — si hay error en el servidor