Sistema de gestão hospitalar desenvolvido para demonstrar como eu organizo regras de negócio críticas com Java, Spring Boot, Oracle e PL/SQL.
Neste projeto, eu não deixei o banco apenas como armazenamento. As regras que exigem consistência forte ficam próximas dos dados, protegidas por packages, constraints, locks, idempotência e auditoria. A API Java organiza os casos de uso, controla o acesso e apresenta contratos HTTP seguros.
O HospitalCore Management cobre cenários que fazem parte da rotina de uma operação hospitalar:
- internação e transferência de leitos
- controle de estoque por FEFO
- reservas e movimentações de produtos
- contas a pagar e a receber
- liquidação, cancelamento e estorno financeiro
- contabilidade por partidas dobradas
- faturamento, glosas e recursos
- integração financeiro-contábil
- auditoria transacional
- indicadores executivos e materialized views
Meu objetivo foi construir um projeto que pudesse ser explicado com clareza em uma entrevista, mas que também demonstrasse decisões técnicas aplicáveis a sistemas corporativos reais.
- Java 21
- Spring Boot 3.4
- Spring Web MVC
- Spring Security
- Spring JDBC e Spring Data JPA
- Oracle Database Free 23
- PL/SQL
- Flyway
- Maven
- JUnit 5 e Mockito
- OpenAPI e Swagger UI
- Docker Compose
O backend segue o modelo de monólito modular. Os módulos compartilham o mesmo banco e as mesmas transações, mas cada área possui responsabilidades bem definidas.
Cliente
|
Controller REST
|
Porta de aplicação
|
Adapter de infraestrutura
|
Package PL/SQL, tabela, view ou materialized view
Organização principal:
api: endpoints, validação, autorização e respostas HTTPapplication: comandos, consultas e contratos de aplicaçãoinfrastructure: JDBC, chamadas Oracle e tradução de errosshared: tratamento de exceções e componentes comunsdb/migration: schema, packages, views, índices e dados sintéticos
Escolhi um monólito modular porque os domínios ainda dependem de transações fortes e do mesmo Oracle. Criar microserviços neste cenário acrescentaria comunicação distribuída e consistência eventual sem uma necessidade comprovada.
Algumas regras precisam continuar válidas mesmo quando outro sistema acessa o banco sem passar pela API Java.
Por isso, o Oracle é responsável por operações como:
- bloquear um título antes de alterar seu saldo
- impedir duas ocupações ativas no mesmo leito
- consumir primeiro o lote com vencimento mais próximo
- rejeitar lançamentos contábeis desequilibrados
- impedir operações financeiras em competência fechada
- garantir idempotência em títulos, liquidações e integrações
- registrar auditoria na mesma transação da operação
O Java continua responsável por coordenar os casos de uso, validar os contratos HTTP, aplicar segurança e traduzir os erros Oracle sem expor detalhes internos.
O package PKG_FINANCIAL concentra o ciclo de vida financeiro.
Ele oferece:
- criação idempotente de títulos
- detecção de chave idempotente com payload diferente
- liquidação parcial e total
- juros, multa e desconto validados
- cancelamento de títulos abertos
- estorno de liquidações
- bloqueio pessimista com timeout
- validação de competência contábil aberta
- auditoria das alterações
Exemplo do fluxo de liquidação:
POST /settlements
|
FinancialCommandHandler
|
OracleFinancialOperations
|
PKG_FINANCIAL.SETTLE_TITLE
|
Lock do título, validações, liquidação e auditoria
As consultas financeiras seguem uma separação no estilo CQRS. Os comandos passam pelas procedures e as leituras usam tabelas e views preparadas para consulta, como VW_MC_FINANCIAL_AGING.
O package PKG_ACCOUNTING protege as partidas dobradas.
Antes de postar um lote, ele confere:
- situação do lote
- situação da competência
- total de débitos
- total de créditos
- existência de valor contábil
Uma competência não pode ser encerrada enquanto houver lotes em rascunho. Os saldos consideram somente lotes efetivamente postados.
A MV_MC_EXECUTIVE_KPI consolida por unidade:
- internações ativas
- leitos disponíveis
- valores a receber
- valores a pagar
O refresh não é mais uma chamada isolada. O package PKG_REPORTING executa a atualização e registra cada tentativa em MC_ANALYTICS_REFRESH_LOG.
A view VW_MC_ANALYTICS_REFRESH_STATUS permite consultar:
- data de início e término
- resultado do refresh
- responsável pela execução
- mensagem de erro controlada
- quantidade de linhas atualizadas
O job JOB_MC_REFRESH_ANALYTICS fica agendado no Oracle e chama o package de relatório. Assim, o processo fica centralizado, rastreável e testável.
O projeto usa estratégias diferentes conforme o tipo de disputa:
SELECT FOR UPDATEpara títulos, internações e recursos exclusivosWAITcom tradução de timeout para erro de domínioSKIP LOCKEDpara filas e consumo concorrente de estoque- constraints para proteger invariantes fora da aplicação
- chaves únicas para idempotência
- versionamento de registros críticos
Os packages de negócio não executam COMMIT. A transação continua sob controle da aplicação. A exceção é o registro técnico do refresh da materialized view, que utiliza transação autônoma para preservar a evidência de sucesso ou falha.
As rotas de negócio exigem autenticação e permissões específicas.
Principais permissões:
admission.transferfinancial.viewfinancial.settlereports.view
O ambiente de desenvolvimento utiliza usuários em memória. Para produção, a evolução planejada é OIDC ou JWT com RBAC persistente.
Os códigos Oracle conhecidos são convertidos em erros de domínio. SQL, nomes internos e dados sensíveis não são devolvidos diretamente ao cliente.
| Método | Endpoint | Responsabilidade |
|---|---|---|
| POST | /api/v1/admissions/{id}/bed-transfers |
Transferir paciente entre leitos |
| POST | /api/v1/financial/titles/{id}/settlements |
Liquidar título financeiro |
| GET | /api/v1/financial/titles/{id} |
Consultar título financeiro |
| GET | /api/v1/financial/titles/aging/{unitId} |
Consultar aging da unidade |
| GET | /api/v1/analytics/executive |
Consultar indicadores executivos |
Pré-requisitos:
- JDK 21
- Maven 3.9 ou superior
- Docker Desktop
Crie o arquivo .env com base em .env.example e ajuste a conexão local.
docker compose up -d
mvn -Poracle spring-boot:runRecursos da aplicação:
- Swagger UI:
http://localhost:8080/swagger-ui.html - Health check:
http://localhost:8080/actuator/health
Testes Java:
mvn testSuíte SQL no Oracle:
sql usuario/senha@localhost:1521/FREEPDB1 @qa/sql/run_all.sqlOs testes PL/SQL cobrem:
- rejeição de lote contábil desequilibrado
- prevenção de estoque negativo
- liquidação parcial e total
- duplicidade financeira
- divergência de payload idempotente
- competência fechada
- estorno de liquidação
- refresh e rastreabilidade da materialized view
- integridade geral do schema
- planos de execução dos principais relatórios
A validação mais recente foi executada em Oracle Database Free 23 dentro de container Docker.
| Verificação | Resultado |
|---|---|
| Migrations aplicadas do zero | 7 aprovadas |
| Objetos Oracle criados | 178 |
| Objetos inválidos | 0 |
| Invariantes contábeis | Aprovadas |
| Invariantes de estoque | Aprovadas |
| Ciclo financeiro e estorno | Aprovados |
| Refresh da materialized view | Aprovado |
| Scheduler de analytics | Ativo e agendado |
| Planos com índices principais | Confirmados |
V1: schema hospitalar, estoque, financeiro e contabilidadeV2: packages transacionais principaisV3: faturamento, relatórios e materialized viewV4: dados sintéticos para demonstraçãoV5: reservas e integração contábilV6: indicadores e alertas gerenciaisV7: controles financeiros, estornos e refresh rastreável da materialized view
Eu desenvolvi este sistema para mostrar como separo responsabilidades entre Java e Oracle. Mantive no PL/SQL as regras que precisam de consistência forte, como transferência de leitos, estoque FEFO, partidas dobradas e liquidação financeira. No Java, organizei a API, a segurança e os contratos de aplicação. Também implementei idempotência, controle de concorrência, auditoria e indicadores executivos com materialized view.
O ponto mais importante não é apenas a quantidade de funcionalidades. É a forma como cada regra foi colocada na camada que melhor consegue protegê-la.
- autenticação OIDC ou JWT com RBAC persistente
- testes de concorrência coordenados em múltiplas sessões
- pipeline de integração com Oracle dedicado
- métricas, traces e correlação de requisições
- gestão de segredos em cofre corporativo
- paginação e filtros adicionais nas consultas
docs/ARCHITECTURE.md: decisões de arquiteturadocs/PLSQL.md: catálogo das rotinas PL/SQLqa/TRACEABILITY_MATRIX.md: rastreabilidade entre requisitos e testesRELATORIO_ENTREGA.md: relatório técnico da entrega validada
hospital-java/
|-- database/tests
|-- docs
|-- qa
|-- src/main/java/com/medcore
| |-- admission
| |-- analytics
| |-- configuration
| |-- financial
| `-- shared
|-- src/main/resources/db/migration
|-- src/test
|-- docker-compose.yml
`-- pom.xml