# 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();`), `
`, ``, ``, ``, ``. Scripts internos usam `` e apenas `var`. - Manipule campos com `engine.getField('campo').setValue`, `engine.getLabel('id').setValue`, `engine.getWidget('id')`. Configure globais via `engine.setGlobalVariable('nome', funcao);` e use `execution.getVariable/ setVariable` para compartilhar dados. - Validators seguem padrão `function f() { this.isValid = function () { ... return true; }; } var validator = new f();`. Use `db.transaction(function () { ... this.update(sql, params); });` para inserts/updates, validando resultado e retornando mensagens string quando houver erro. - Tags recorrentes: `` para layout, ``, ``, ``, `