# Workspace Rules
Este workspace utiliza agentes especializados.
## Regra principal
1. Para tarefas do ecossistema DavinTI Vitruvio em `/davinti`, use `vitruvio-specialist` como agente principal sempre.
2. O `vitruvio-specialist` decide quando delegar para os agentes especializados de banco, mobile, libs, paineis, processos, relatorios e webservices.
3. Nao carregue nem force contexto de todos os agents ao mesmo tempo; delegue apenas quando o escopo estiver claramente isolado.
## Comportamento esperado
6. Priorize respostas produzidas pelo agente mais adequado ao dominio da tarefa.
7. Se a solicitacao for simples e ja estiver no agente correto, nao faca delegacao desnecessaria.
# Guia de Autocomplete – DavinTI / Vitruvio
## Visão geral
- Repositório de soluções Vitruvio.
- Arquivos principais: scripts JavaScript (orquestração e widgets Vitruvio), formulários XML (`*_web_desktop`, `_mobile`, `.bpmn`) e PL/SQL (`PRC_VTR_*`, `VI_VTR_*`).
- Bancos Oracle usados nas integrações: `vitruvio_producao`, `superus_producao`, `davinti_producao`, entre outros.
- Sempre adicionar comentários nas alterações no padrão: `-- CASO [número] - [usuario] - [Data] - [breve descrição da mudança]`.
- Exemplo: `-- CASO 32715 - Victor da Cruz - 15-09-2024 - Ajuste na query de validação de estoque para considerar reservas.`
- Use o número do caso para rastrear o histórico da demanda e facilitar consultas futuras, se não existir deixar XXX.
## JavaScript Rhino (Vitruvio)
- **Runtime Rhino**: scripts de processo/form usam Rhino JavaScript (ECMAScript 5). Declarar variáveis sempre com `var`; `const` e `let` não são suportados. Métodos de array como `map`, `forEach`, `filter`, `reduce`, `indexOf` funcionam normalmente.
- **Interop Java**: Rhino permite instanciar classes Java (`new java.util.ArrayList()`, `java.lang.String`). Utilize quando precisar de coleções Java ou interoperar com APIs da plataforma.
- **Compatibilidade: **: Validações de valores de classes e métodos do Java em Rhino com 3 iguais(===) ou 3 diferentes (!==) não funcionam corretamente. Use sempre 2 iguais (==) ou 2 diferentes (!=).
- **APIs padrão**: `engine`, `execution`, `vFormService`, `sendMessageToVitruvio`, `db`, `taskService`, `vProcessInstanceService`. Scripts carregam libs via `libService.loadScript('db'|'javadateutils'|'lib_valor_config'|'processo_util'|'util'|'threads'|'notification'|'email'|...)`. Sugira helpers recorrentes como `db.queryRow(sql, params)`, `db.query(sql, params).each(function (row) { ... })`, `db.transaction(function () { ... })`, `sprDB.executeProcedure(nome, parametros)`, `sprDB.update(sql, params)`, `processoUtil.alterarDescricaoProcesso`, `threads.execute(function () { ... })`, `util.isEmptyOrNull`, `notification.criarNotificacao`, `sendMessageToVitruvio({ ... })`.
- **Consultas**: `db.query` retorna `null` quando não há linhas; se o objeto existir, já há ao menos um registro e deve ser percorrido com `lista.each(...)` (não utilizar `size`).
- **Padrões de string/SQL**: template strings não funcionam. Monte blocos com concatenação incremental (`var sql = " SELECT ..."; sql += " FROM ..."; sql += " WHERE ...";`), respeitando identação com espaços à esquerda (`sql += " AND campo = :param";`). Para HTML siga o mesmo padrão (`var html = ''; html += '
...';`). `reforco_abastecimento.js` mostra `var sql = ""; sql += ...;` somado a `db.queryRow`, `sprDB.update` e construção de `params` para `executeProcedure` com objetos `{ input: [{ name: 'ParChaveOrigem', type: 'number', value: ... }], output: [...] }`.
- **Estrutura**: organize helpers internos (formatação de data, filtros, builders de HTML) antes das funções expostas (`this.metodo = function () { ... }`). Comentários curtos ajudam a documentar regras específicas. Use `JSON.stringify`/`JSON.parse` para guardar estado em `tb_state_panels` ou variáveis do processo.
- **Dashboards/Widgets**: replique padrões de `function AbastecimentoDashboardDados() {.js` (arrays `ordersColumns`, `showBySigle`, toggles HTML com `sendMessageToVitruvio`). Respeite colunas padrão (`SECOS`, `CONGELADOS`, `PESÁVEIS`, `REFORÇO`, `FRUTAS_SECAS`, `PULMAO_DOCA`).
- **React Native (`pricetotem/`)**: único módulo fora do Rhino; quando necessário consulte o código existente em `App.tsx` e `src/**`, mas mantenha este guia focado em Rhino + Oracle.
## WebServices Vitruvio
- Artefatos exportados de `vitruvio.script_ws_endpoint` ficam em `Vitruvio/WebServices/` e seguem runtime Rhino ES5.
- Estrutura recorrente: `function WebService() { this.onGet = function (...) { ... }; this.onPost = function (...) { ... }; } module.exports = new WebService();`.
- Em GET, os parâmetros costumam vir de `params.query`; em POST JSON, o padrão mais comum do acervo é `JSON.parse(params.requestBody)`.
- Para respostas JSON, prefira helper local como `enviarJson` ou `sendResponse`, com `res.setStatus(...)`, `res.setContentType('application/json; charset=UTF-8')`, `res.getWriter().write(JSON.stringify(obj))` e `flush()`.
- Para download ou binário, preserve `Content-Type`, `Content-Disposition`, `Content-Length` quando aplicável e streaming via `res.getOutputStream()`.
- Valide entrada antes de acessar filesystem ou banco; ao lidar com nomes de arquivo, bloquear path traversal (`..`, `/`, `\\`) e caracteres inválidos.
- Preserve contrato HTTP existente do endpoint: método, parâmetros, shape do JSON e status codes (`200`, `400`, `404`, `500`) não devem mudar sem necessidade explícita.
## Relatórios Jasper e iReport 5.6
- Artefatos exportados de `vitruvio.relatorio` ficam em `Vitruvio/Relatorios/
/`, contendo `jasper_template.jrxml` e, quando existir, `form_parametros.xml`.
- `form_parametros.xml` é um `report-form`, não um formulário comum; pode conter widgets, filtros, scripts CDATA e botões que chamam `vReportService.generateReportFile(...)`.
- Preserve compatibilidade com Jasper iReport 5.6: evite migrações de schema, reformatadores agressivos ou mudanças estruturais fora do necessário.
- Nomes e caixa dos parâmetros devem permanecer alinhados entre campos da tela, mapa Java (`params.put(...)`), expressões `$P{...}`, filtros `$X{IN,...}` e datasets do JRXML.
- Parâmetros comuns no acervo: `java.util.Date`, `java.util.Collection`, `java.lang.String`, `java.lang.Long`, `java.lang.Integer` e `java.io.InputStream` para logos.
- Quando o relatório for disparado por script, preserve os padrões de `Formato.PDF`, `Formato.XLSX`, `downloadutil.downloadFile` ou `download.openFileNewWindow` já adotados no acervo.
- Ajustes em SQL do JRXML devem continuar parametrizados; evite converter filtros do Jasper para concatenação manual dentro do template.
## XML (Formulários Vitruvio)
- Sempre declarar namespace `xmlns="http://www.davinti.com.br/vitruvio/form"` e schema location oficial na raiz ``.
- Estrutura típica: `` (função `s()` com `this.getDescriptor` e `var script = new s();`), `