> ⚠️ **Aviso:** Este documento tem caráter apenas de apoio e referência técnica. As informações aqui descritas — incluindo entradas, saídas, estruturas de dados, fluxos e validações — não são definitivas e podem ser alteradas conforme evolução do entendimento do negócio, ajustes da arquitetura, revisões de API ou decisões de implementação. ### Design (alto nível) — RF2431 Conversão de data/hora de saída e listagem de Pré‑Atendimentos #### Objetivo Documentar a implementação da listagem de Pré‑Atendimentos neste projeto (arquitetura hexagonal): - Listagem paginada com filtros por status (`REQUESTED`, `CREATED`, `UNDER_REVIEW`, `DONE`) - Apresentação do nome e nome social do paciente - Conversão de data/hora de saída considerando o fuso horário (RF2431) — pendente #### Contexto de fuso horário (síntese do RF2431) - Todos os datetime são armazenados no fuso "0" do sistema (base do servidor principal). - Ao apresentar em outro fuso, converter aplicando: `dataArmazenada - fusoAplicado`. - Ex.: base 0 (São Paulo) → Cuiabá (-1): `14:48:55 - (-1h) = 13:48:55`. - Ex.: base 0 → Fernando de Noronha (+1): `14:48:55 - (+1h) = 15:48:55`. - Conversão de entrada (RF2430) é outro requisito e fora deste escopo; aqui tratamos saída. --- ### Arquitetura hexagonal — visão Portas e Adaptadores implementados: - Domínio - `PreAtendimento`: modelo principal do pré-atendimento. - `PreAtendimentoPaginacao`: modelo para listagem paginada. - `BeanParamListarPreAtendimentos`: parâmetros de filtro e paginação no domínio. - `StatusEnum`: enum com valores `REQUESTED`, `CREATED`, `UNDER_REVIEW`, `DONE`. - Portas de Aplicação (in) - `ListarPreAtendimentosPaginacaoUseCase`: contrato para listar e contar pré-atendimentos com paginação e filtros. - Serviços de Aplicação - `ListarPreAtendimentosPaginacaoQueryService`: implementa `ListarPreAtendimentosPaginacaoUseCase`, orquestra busca via porta de saída. - Portas de Saída (out) - `PreAtendimentoPaginacaoPort`: contrato com métodos `listar()` e `contar()` retornando modelos de domínio. - Adaptadores - IN (REST): `PreAtendimentoResource` expõe endpoints `GET /requests` e `GET /requests/count`. - OUT (DB): `PaginacaoPreAtendimentoDbAdapter` implementa `PreAtendimentoPaginacaoPort`. --- ### Fluxo (alto nível) 1. REST recebe `GET /requests` com parâmetros de paginação e filtro via `BeanParamListarPreAtendimentosDto`. 2. Resource chama `ListarPreAtendimentosPaginacaoUseCase.listar()` passando os parâmetros convertidos para domínio. 3. O serviço `ListarPreAtendimentosPaginacaoQueryService` delega para `PreAtendimentoPaginacaoPort.listar()`. 4. O adapter `PaginacaoPreAtendimentoDbAdapter` executa a consulta no banco e retorna lista de `PreAtendimentoPaginacao`. 5. O resultado é mapeado para `PreAtendimentoPaginacaoDto` e retornado ao cliente. 6. Para contagem, o fluxo é similar usando `GET /requests/count` e método `contar()`. --- ### REST (adapter in) — Padrão de Listagem e Contagem Implementação atual do Resource com métodos `listar` e `contar`: ```java @PublicResource @Path("/requests") public class PreAtendimentoResource { @Inject ListarPreAtendimentosPaginacaoUseCase listarPreAtendimentosPaginacaoUseCase; @WithSpan @GET @APIResponse( responseCode = "200", description = "Lista de pré-atendimentos paginada.", content = @Content( mediaType = "application/json", schema = @Schema(implementation = PreAtendimentoPaginacaoDto.class) ) ) public List<PreAtendimentoPaginacaoDto> listar( @BeanParam BeanParamListarPreAtendimentosDto beanParamListarPreAtendimentosDto) { return listarPreAtendimentosPaginacaoUseCase.listar( beanParamListarPreAtendimentosDto.toDomain()) .stream().map(PreAtendimentoPaginacaoDto::fromDomain).toList(); } @WithSpan @GET @Path("/count") @APIResponse( responseCode = "200", description = "Contagem de pré-atendimentos.", content = @Content( mediaType = "application/json", schema = @Schema(implementation = CountPreAtendimentoDto.class) ) ) public CountPreAtendimentoDto contar( @BeanParam BeanParamListarPreAtendimentosDto beanParamListarPreAtendimentosDto) { Long count = listarPreAtendimentosPaginacaoUseCase .contar(beanParamListarPreAtendimentosDto.toDomain()); return CountPreAtendimentoDto.builder().count(count).build(); } } ``` --- ### BeanParams — Parâmetros de Paginação e Filtro Implementação atual dos parâmetros de paginação e filtro: ```java @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class BeanParamListarPreAtendimentosDto { @QueryParam("pageStartIndex") @DefaultValue("0") private String pageIndex; @QueryParam("pageSize") @DefaultValue("15") private String pageSize; @QueryParam("search") private String search; @QueryParam("status") private List<StatusEnum> status; public BeanParamListarPreAtendimentos toDomain() { return BeanParamListarPreAtendimentos.builder() .pageIndex(this.pageIndex) .pageSize(this.pageSize) .search(this.search) .status(this.status) .build(); } } ``` #### Parâmetros de Query | Parâmetro | Tipo | Padrão | Descrição | |-----------|------|--------|-----------| | `pageStartIndex` | String | `"0"` | Índice inicial da página | | `pageSize` | String | `"15"` | Tamanho da página | | `search` | String | - | Termo de busca | | `status` | List\<StatusEnum\> | - | Filtro por status (valores: `REQUESTED`, `CREATED`, `UNDER_REVIEW`, `DONE`) | --- ### DTOs de Saída #### PreAtendimentoPaginacaoDto (resposta do endpoint `listar`) Implementação atual do DTO de saída para listagem: ```java @Value @Builder public class PreAtendimentoPaginacaoDto { @JsonProperty("id") String id; @JsonProperty("externalId") String idExterno; @JsonProperty("creationDate") LocalDateTime dataCriacao; @JsonProperty("status") String status; @JsonProperty("viewed") Boolean visualizado; @JsonProperty("name") String nome; @JsonProperty("socialName") String nomeSocial; @JsonProperty("code") String codigo; public static PreAtendimentoPaginacaoDto fromDomain( PreAtendimentoPaginacao domain) { return PreAtendimentoPaginacaoDto.builder() .id(domain.getId()) .idExterno(domain.getIdExterno()) .dataCriacao(domain.getDataCriacao()) .status(domain.getStatus().name()) .visualizado(domain.getVisualizado()) .nome(domain.getNome()) .nomeSocial(domain.getNomeSocial()) .codigo(domain.getCodigo()) .build(); } } ``` #### Campos de Resposta (listar) | Campo JSON | Tipo | Descrição | |------------|------|-----------| | `id` | String | ID interno do pré-atendimento | | `externalId` | String | ID externo do pré-atendimento | | `creationDate` | LocalDateTime | Data de criação | | `status` | String | Status atual (`REQUESTED`, `CREATED`, `UNDER_REVIEW`, `DONE`) | | `viewed` | Boolean | Indica se foi visualizado | | `name` | String | Nome do paciente | | `socialName` | String | Nome social do paciente | | `code` | String | Código do pré-atendimento | #### CountPreAtendimentoDto (resposta do endpoint `contar`) ```java @Value @Builder public class CountPreAtendimentoDto { Long count; } ``` | Campo JSON | Tipo | Descrição | |------------|------|-----------| | `count` | Long | Total de pré-atendimentos que correspondem aos filtros | --- ### Regras de nome (RF1366/RU2642) — Requisito pendente - A API retorna os campos `name` (nome) e `socialName` (nome social) para o frontend aplicar a lógica de exibição. - Regra de exibição (responsabilidade do frontend): - Se `socialName` não estiver vazio: exibir nome social como principal. - Caso contrário: exibir nome civil. --- ### Persistência e filtro (status) - Valores disponíveis de `StatusEnum`: `REQUESTED`, `CREATED`, `UNDER_REVIEW`, `DONE`. - O filtro por status é passado via query parameter `status` (aceita múltiplos valores). - Adapter DB (`PaginacaoPreAtendimentoDbAdapter`) implementa consulta com filtros e mapeia para o domínio. --- ### Estratégia de conversão (RF2431) — Pendente - Não implementado ainda. - Planejado: `DateTimeConversionService` que receba `ZonedDateTime` em base 0 (UTC do sistema) e aplique conversão de fuso. --- ### Backlog técnico #### Implementado - [x] `BeanParamListarPreAtendimentosDto` com parâmetros de paginação e filtro. - [x] `PreAtendimentoPaginacaoDto` e `CountPreAtendimentoDto` para respostas. - [x] `PreAtendimentoResource` com métodos `listar` e `contar`. - [x] `ListarPreAtendimentosPaginacaoUseCase` (porta de entrada). - [x] `ListarPreAtendimentosPaginacaoQueryService` (serviço de aplicação). - [x] `PreAtendimentoPaginacaoPort` (porta de saída). - [x] `PaginacaoPreAtendimentoDbAdapter` (adapter de banco). - [x] Mapeamento para `PreAtendimentoPaginacaoDto` (data criação, nome, nome social, código, status, visualizado).