implementado typescript 7
This commit is contained in:
parent
cd4ea4d36b
commit
e9a323f18c
80 changed files with 5711 additions and 2455 deletions
4
dist-front/aleatorio.js
Normal file
4
dist-front/aleatorio.js
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
const alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
|
||||
export const aleatorio = (tamanho) => `eli-${Array.from({ length: tamanho || 8 })
|
||||
.map(() => alfabeto[((999 * Math.random()) | 0) % alfabeto.length])
|
||||
.join("")}`;
|
||||
1
dist-front/auditoria.js
Normal file
1
dist-front/auditoria.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
export {};
|
||||
27
dist-front/cacheMemoria.js
Normal file
27
dist-front/cacheMemoria.js
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/** gerar uma função de cache para uso em memoria */
|
||||
const _cache = {};
|
||||
globalThis.cacheMemoria_cache = _cache;
|
||||
export const cacheM = (chave, valor, validadeSeg) => {
|
||||
// converte a chave e string
|
||||
const txChave = typeof chave == "string"
|
||||
? chave
|
||||
: typeof chave == "number"
|
||||
? String(chave)
|
||||
: encodeURIComponent(JSON.stringify(chave));
|
||||
const validade = validadeSeg && new Date().getTime() + validadeSeg * 1000;
|
||||
if (valor !== undefined) {
|
||||
_cache[txChave] = {
|
||||
valor,
|
||||
validade,
|
||||
};
|
||||
}
|
||||
const busca = _cache[txChave];
|
||||
if (busca?.validade && busca.validade < new Date().getTime()) {
|
||||
return undefined;
|
||||
}
|
||||
return busca?.valor;
|
||||
};
|
||||
export const verCacheM = () => _cache;
|
||||
export const cacheMemoria = cacheM;
|
||||
/** para uso fixo dentro de uma função, trava a chave */
|
||||
export const cacheMFixo = (chave) => (valor) => cacheM(chave, valor);
|
||||
22
dist-front/constantes.js
Normal file
22
dist-front/constantes.js
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
export const uuid_null = "00000000-0000-0000-0000-000000000000";
|
||||
/** Colunas Presentes n maioria das tabelas */
|
||||
export var camposComuns;
|
||||
(function (camposComuns) {
|
||||
camposComuns["codigo"] = "codigo";
|
||||
camposComuns["excluido"] = "excluido";
|
||||
camposComuns["data_hora_criacao"] = "data_hora_criacao";
|
||||
camposComuns["data_hora_atualizacao"] = "data_hora_atualizacao";
|
||||
camposComuns["codigo_usuario_criacao"] = "codigo_usuario_criacao";
|
||||
camposComuns["codigo_usuario_atualizacao"] = "codigo_usuario_atualizacao";
|
||||
camposComuns["versao"] = "versao";
|
||||
})(camposComuns || (camposComuns = {}));
|
||||
/** Palavras comumente usadas */
|
||||
export var tx;
|
||||
(function (tx) {
|
||||
tx["token"] = "token";
|
||||
})(tx || (tx = {}));
|
||||
export var tipoUsuarioResiduos;
|
||||
(function (tipoUsuarioResiduos) {
|
||||
tipoUsuarioResiduos["Usuario"] = "usuario";
|
||||
tipoUsuarioResiduos["Fornecedor"] = "fornecedor";
|
||||
})(tipoUsuarioResiduos || (tipoUsuarioResiduos = {}));
|
||||
20
dist-front/consulta.js
Normal file
20
dist-front/consulta.js
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import z from "zod";
|
||||
export var operadores;
|
||||
(function (operadores) {
|
||||
operadores["="] = "=";
|
||||
operadores["!="] = "!=";
|
||||
operadores[">"] = ">";
|
||||
operadores[">="] = ">=";
|
||||
operadores["<"] = "<";
|
||||
operadores["<="] = "<=";
|
||||
operadores["like"] = "like";
|
||||
operadores["in"] = "in";
|
||||
operadores["isNull"] = "isNull";
|
||||
})(operadores || (operadores = {}));
|
||||
export const zOperadores = z.enum(["=", "!=", ">", ">=", "<", "<=", "like", "in", "isNull"]);
|
||||
export const zFiltro = z.object({
|
||||
coluna: z.string(),
|
||||
valor: z.any(),
|
||||
operador: zOperadores,
|
||||
ou: z.boolean().optional(),
|
||||
});
|
||||
21
dist-front/dayjs.js
Normal file
21
dist-front/dayjs.js
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import duration from "dayjs/plugin/duration";
|
||||
import isSameOrAfter from "dayjs/plugin/isSameOrAfter";
|
||||
import isSameOrBefore from "dayjs/plugin/isSameOrBefore";
|
||||
import minMax from "dayjs/plugin/minMax";
|
||||
import relativeTime from "dayjs/plugin/relativeTime";
|
||||
import timezone from "dayjs/plugin/timezone";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
import weekOfYear from "dayjs/plugin/weekOfYear";
|
||||
import "dayjs/locale/pt-br";
|
||||
export const definirDayjsbr = (dayjsEntrada) => {
|
||||
dayjsEntrada.locale("pt-br");
|
||||
dayjsEntrada.extend(utc);
|
||||
dayjsEntrada.extend(timezone);
|
||||
dayjsEntrada.extend(weekOfYear);
|
||||
dayjsEntrada.extend(isSameOrBefore);
|
||||
dayjsEntrada.extend(isSameOrAfter);
|
||||
dayjsEntrada.extend(minMax);
|
||||
dayjsEntrada.extend(relativeTime);
|
||||
dayjsEntrada.extend(duration);
|
||||
return dayjsEntrada;
|
||||
};
|
||||
70
dist-front/dayjs26.js
Normal file
70
dist-front/dayjs26.js
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/**
|
||||
* Utilitário de configuração do Dayjs focado em compatibilidade com SSR.
|
||||
*
|
||||
* PROBLEMA:
|
||||
* A importação direta do `dayjs` e seus plugins frequentemente causa conflitos em ambientes
|
||||
* de Renderização do Lado do Servidor (SSR), como Nuxt ou Next.js, devido a discrepâncias
|
||||
* na resolução de módulos (ESM vs CJS) e instabilidades de importação.
|
||||
*
|
||||
* SOLUÇÃO:
|
||||
* Este módulo utiliza o padrão de Injeção de Dependência. Ele expõe apenas tipagens e
|
||||
* uma função de configuração (`defineDayjsBr`). A responsabilidade de importar as
|
||||
* bibliotecas "vivas" é delegada à aplicação consumidora (o cliente da função).
|
||||
*
|
||||
* Isso permite que o bundler da aplicação principal (Vite, Webpack, etc.) gerencie as
|
||||
* instâncias, garantindo consistência e evitando erros de "module not found" ou
|
||||
* instâncias duplicadas/não inicializadas adequadamente.
|
||||
*/
|
||||
/**
|
||||
* Inicializa e configura o Dayjs com o locale 'pt-br' e plugins essenciais.
|
||||
*
|
||||
* MODO DE USO:
|
||||
* Importe os pacotes reais na sua aplicação e passe-os para esta função.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* // Em seu arquivo de configuração (ex: plugins/dayjs.ts):
|
||||
* import dayjs from "dayjs"
|
||||
* import duration from "dayjs/plugin/duration"
|
||||
* import isSameOrAfter from "dayjs/plugin/isSameOrAfter"
|
||||
* import isSameOrBefore from "dayjs/plugin/isSameOrBefore"
|
||||
* import minMax from "dayjs/plugin/minMax"
|
||||
* import relativeTime from "dayjs/plugin/relativeTime"
|
||||
* import timezone from "dayjs/plugin/timezone"
|
||||
* import utc from "dayjs/plugin/utc"
|
||||
* import weekOfYear from "dayjs/plugin/weekOfYear"
|
||||
* import { iniciarDayjsBr } from "p-comuns"
|
||||
* import "dayjs/locale/pt-br" // Importante: importar o locale!
|
||||
|
||||
* export const dayjsbr = iniciarDayjsBr({
|
||||
* dayjs,
|
||||
* duration,
|
||||
* isSameOrAfter,
|
||||
* isSameOrBefore,
|
||||
* minMax,
|
||||
* relativeTime,
|
||||
* timezone,
|
||||
* utc,
|
||||
* weekOfYear,
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
const iniciarDayjsBr = ({ dayjs, duration, isSameOrAfter, isSameOrBefore, minMax, relativeTime, timezone, utc, weekOfYear, }) => {
|
||||
// Extensão da biblioteca com os plugins fornecidos
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(timezone);
|
||||
dayjs.extend(weekOfYear);
|
||||
dayjs.extend(isSameOrBefore);
|
||||
dayjs.extend(isSameOrAfter);
|
||||
dayjs.extend(minMax);
|
||||
dayjs.extend(relativeTime);
|
||||
dayjs.extend(duration);
|
||||
// Definição do locale global
|
||||
dayjs.locale("pt-br");
|
||||
return dayjs;
|
||||
};
|
||||
/**
|
||||
* @deprecated Use iniciarDayjsBr em vez de definirDayjsBr. O método defineDayjsBr está obsoleto e será removido em futuras versões.
|
||||
*/
|
||||
const defineDayjsBr = iniciarDayjsBr;
|
||||
export { defineDayjsBr, iniciarDayjsBr };
|
||||
77
dist-front/eLog.js
Normal file
77
dist-front/eLog.js
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
/** Níveis de severidade para o sistema de log estruturado. */
|
||||
export var NivelLog;
|
||||
(function (NivelLog) {
|
||||
/** O mais baixo nível, ideal para rastreamento detalhado de fluxo e execução. */
|
||||
NivelLog["RASTREAMENTO"] = "RASTREAMENTO";
|
||||
/** Usado para informações que ajudam a entender o estado do sistema durante a execução. */
|
||||
NivelLog["DEPURACAO"] = "DEPURACAO";
|
||||
/** Informações gerais e eventos do sistema. */
|
||||
NivelLog["INFORMACAO"] = "INFORMACAO";
|
||||
/** Eventos inesperados, mas que não impedem o funcionamento do sistema. */
|
||||
NivelLog["AVISO"] = "AVISO";
|
||||
/** Erros que impactam o funcionamento do sistema, mas que podem ser recuperados. */
|
||||
NivelLog["ERRO"] = "ERRO";
|
||||
/** O nível mais alto de severidade, indicando falhas que requerem atenção imediata. */
|
||||
NivelLog["CRITICO"] = "CRITICO";
|
||||
})(NivelLog || (NivelLog = {}));
|
||||
/** Detalhes de cada nível de log — peso para filtragem, emoji e método do console. */
|
||||
export const NivelLogDetalhes = {
|
||||
[NivelLog.RASTREAMENTO]: { peso: 1, rotulo: "Rastreamento", emoji: "🔍", metodo: "debug" },
|
||||
[NivelLog.DEPURACAO]: { peso: 2, rotulo: "Depuração", emoji: "🐛", metodo: "debug" },
|
||||
[NivelLog.INFORMACAO]: { peso: 3, rotulo: "Informação", emoji: "ℹ️", metodo: "info" },
|
||||
[NivelLog.AVISO]: { peso: 4, rotulo: "Aviso", emoji: "⚠️", metodo: "warn" },
|
||||
[NivelLog.ERRO]: { peso: 5, rotulo: "Erro", emoji: "❌", metodo: "error" },
|
||||
[NivelLog.CRITICO]: { peso: 6, rotulo: "Crítico", emoji: "🔥", metodo: "error" },
|
||||
};
|
||||
/**
|
||||
* Inicializa o sistema de log estruturado.
|
||||
*
|
||||
* @param opcoes.app - Identificador da aplicação/instância (ex: `"front:e-licencie:12345"`)
|
||||
* @param opcoes.nivelMinimo - Nível mínimo para exibição no console (padrão: INFORMACAO)
|
||||
* @param opcoes.arquivamento - Callback opcional para persistir/enviar as entradas de log
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* const log = iniciarELog({ app: "front:e-licencie:12345" })
|
||||
*
|
||||
* log.info({ origem: "criarUsuario()", mensagem: "Usuário criado", dados: { id: "abc-123" } })
|
||||
* // → ℹ️ [Informação] [front:e-licencie:12345] [criarUsuario()] Usuário criado
|
||||
* ```
|
||||
*/
|
||||
export const iniciarELog = (opcoes) => {
|
||||
const nivel = opcoes.nivelMinimo ?? NivelLog.INFORMACAO;
|
||||
const pesoMinimo = NivelLogDetalhes[nivel].peso;
|
||||
const emitir = (nivelLog, pr) => {
|
||||
const config = NivelLogDetalhes[nivelLog];
|
||||
if (config.peso < pesoMinimo)
|
||||
return;
|
||||
const entrada = {
|
||||
timestamp: new Date().toISOString(),
|
||||
nivel: nivelLog,
|
||||
app: opcoes.app,
|
||||
origem: pr.origem,
|
||||
mensagem: pr.mensagem,
|
||||
...(pr.dados !== undefined ? { dados: pr.dados } : {}),
|
||||
};
|
||||
console[config.metodo](`${config.emoji} [${config.rotulo}] [${opcoes.app}] [${pr.origem}] ${pr.mensagem}`, pr.dados !== undefined ? pr.dados : "");
|
||||
if (opcoes.arquivamento) {
|
||||
opcoes.arquivamento(entrada, { app: opcoes.app, nivelMinimo: nivel });
|
||||
}
|
||||
};
|
||||
return {
|
||||
rastreamento: (pr) => emitir(NivelLog.RASTREAMENTO, pr),
|
||||
depuracao: (pr) => emitir(NivelLog.DEPURACAO, pr),
|
||||
info: (pr) => emitir(NivelLog.INFORMACAO, pr),
|
||||
aviso: (pr) => emitir(NivelLog.AVISO, pr),
|
||||
erro: (pr) => emitir(NivelLog.ERRO, pr),
|
||||
critico: (pr) => emitir(NivelLog.CRITICO, pr),
|
||||
};
|
||||
};
|
||||
const _log = iniciarELog({
|
||||
app: "testando",
|
||||
nivelMinimo: NivelLog.INFORMACAO,
|
||||
arquivamento: () => {
|
||||
//
|
||||
},
|
||||
});
|
||||
//log.aviso({ origem: "teste", mensagem: "teste" })
|
||||
1
dist-front/ecosistema/index.js
Normal file
1
dist-front/ecosistema/index.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
export * from "./urls";
|
||||
1
dist-front/ecosistema/urls.js
Normal file
1
dist-front/ecosistema/urls.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
export const link_paiol = "https://paiol.idz.one";
|
||||
168
dist-front/extensoes.js
Normal file
168
dist-front/extensoes.js
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
export const extensoes = [
|
||||
{
|
||||
ext: "gif",
|
||||
tipo: "imagem",
|
||||
mime: "image/gif",
|
||||
},
|
||||
{
|
||||
ext: "jpg",
|
||||
tipo: "imagem",
|
||||
mime: "image/jpeg",
|
||||
},
|
||||
{
|
||||
ext: "jpeg",
|
||||
tipo: "imagem",
|
||||
mime: "image/jpeg",
|
||||
},
|
||||
{
|
||||
ext: "png",
|
||||
tipo: "imagem",
|
||||
mime: "image/png",
|
||||
},
|
||||
{
|
||||
ext: "bmp",
|
||||
tipo: "imagem",
|
||||
mime: "image/bmp",
|
||||
},
|
||||
{
|
||||
ext: "webp",
|
||||
tipo: "imagem",
|
||||
mime: "image/webp",
|
||||
},
|
||||
{
|
||||
ext: "tiff",
|
||||
tipo: "imagem",
|
||||
mime: "image/tiff",
|
||||
},
|
||||
{
|
||||
ext: "svg",
|
||||
tipo: "imagem",
|
||||
mime: "image/svg+xml",
|
||||
},
|
||||
{
|
||||
ext: "ico",
|
||||
tipo: "imagem",
|
||||
mime: "image/x-icon",
|
||||
},
|
||||
{
|
||||
ext: "pdf",
|
||||
tipo: "documento",
|
||||
mime: "application/pdf",
|
||||
},
|
||||
{
|
||||
ext: "doc",
|
||||
tipo: "documento",
|
||||
mime: "application/msword",
|
||||
},
|
||||
{
|
||||
ext: "docx",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
},
|
||||
{
|
||||
ext: "xls",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.ms-excel",
|
||||
},
|
||||
{
|
||||
ext: "xlsx",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
},
|
||||
{
|
||||
ext: "ppt",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.ms-powerpoint",
|
||||
},
|
||||
{
|
||||
ext: "pptx",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
},
|
||||
{
|
||||
ext: "txt",
|
||||
tipo: "documento",
|
||||
mime: "text/plain",
|
||||
},
|
||||
{
|
||||
ext: "odt",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.oasis.opendocument.text",
|
||||
},
|
||||
{
|
||||
ext: "ods",
|
||||
tipo: "documento",
|
||||
mime: "application/vnd.oasis.opendocument.spreadsheet",
|
||||
},
|
||||
{
|
||||
ext: "rtf",
|
||||
tipo: "documento",
|
||||
mime: "application/rtf",
|
||||
},
|
||||
{
|
||||
ext: "csv",
|
||||
tipo: "documento",
|
||||
mime: "text/csv",
|
||||
},
|
||||
{
|
||||
ext: "mp4",
|
||||
tipo: "vídeo",
|
||||
mime: "video/mp4",
|
||||
},
|
||||
{
|
||||
ext: "avi",
|
||||
tipo: "vídeo",
|
||||
mime: "video/x-msvideo",
|
||||
},
|
||||
{
|
||||
ext: "mkv",
|
||||
tipo: "vídeo",
|
||||
mime: "video/x-matroska",
|
||||
},
|
||||
{
|
||||
ext: "mov",
|
||||
tipo: "vídeo",
|
||||
mime: "video/quicktime",
|
||||
},
|
||||
{
|
||||
ext: "wmv",
|
||||
tipo: "vídeo",
|
||||
mime: "video/x-ms-wmv",
|
||||
},
|
||||
{
|
||||
ext: "flv",
|
||||
tipo: "vídeo",
|
||||
mime: "video/x-flv",
|
||||
},
|
||||
{
|
||||
ext: "webm",
|
||||
tipo: "vídeo",
|
||||
mime: "video/webm",
|
||||
},
|
||||
{
|
||||
ext: "3gp",
|
||||
tipo: "vídeo",
|
||||
mime: "video/3gpp",
|
||||
},
|
||||
{
|
||||
ext: "mpeg",
|
||||
tipo: "vídeo",
|
||||
mime: "video/mpeg",
|
||||
},
|
||||
];
|
||||
/**
|
||||
* Função que retorna o tipo do arquivo
|
||||
* @param nomeArquivo
|
||||
* @returns
|
||||
*/
|
||||
export const tipoArquivo = (nomeArquivo) => {
|
||||
// extenssão do arquivo
|
||||
const extArquivo = String(nomeArquivo || "")
|
||||
.toLocaleLowerCase()
|
||||
.split(".")
|
||||
.pop();
|
||||
// procura a extensão do arquivo na lista de extensões
|
||||
const extensao = extensoes.find((extensao) => extensao.ext === extArquivo);
|
||||
// retorna o tipo do arquivo
|
||||
return extensao?.tipo || "outros";
|
||||
};
|
||||
238
dist-front/filtroDelta.js
Normal file
238
dist-front/filtroDelta.js
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
import z from "zod";
|
||||
/**
|
||||
* =============================================================================
|
||||
* FILTRO DELTA (zFiltroDelta)
|
||||
* =============================================================================
|
||||
*
|
||||
* OBJETIVO
|
||||
* -----------------------------------------------------------------------------
|
||||
* Novo sistema de filtros projetado para maior flexibilidade e geração segura
|
||||
* de instruções SQL dinâmicas (WHERE).
|
||||
*
|
||||
* REGRAS IMPORTANTES (PARA IA)
|
||||
* -----------------------------------------------------------------------------
|
||||
* - O filtro é composto de duas partes obrigatórias: `condicoes` e `formula`.
|
||||
* - Apenas referências aos `id`s das `condicoes` podem ser usadas na `formula`.
|
||||
* - Não use sintaxe baseada em objetos aninhados para agrupamento (ex: { E: [], OU: [] }). Use fórmulas em string.
|
||||
*
|
||||
* 1) CONDIÇÕES (`condicoes`):
|
||||
* Array de objetos contendo as definições isoladas de cada comparação.
|
||||
* Exemplo:
|
||||
* [
|
||||
* { id: "{1}", coluna: "idade", operador: ">=", valor: 18 },
|
||||
* { id: "{2}", coluna: "nome", operador: "like", valor: "%pa%" }
|
||||
* ]
|
||||
* - `id`: Deve SEMPRE seguir o formato {identificador}. Ex: `{c1}`, `{idade_min}`.
|
||||
* - `coluna`: O nome da coluna ou um path JSONB válido (ex: `veiculo.ano`).
|
||||
* - `operador`: Um dos valores do tipo `tipoOperadorFiltroDelta` (veja a constante).
|
||||
*
|
||||
* 2) FÓRMULA (`formula`):
|
||||
* String que define a expressão lógica relacionando as condições através de seus `id`s.
|
||||
* Operadores Lógicos Suportados (EM MAIÚSCULO):
|
||||
* - `E` (AND)
|
||||
* - `OU` (OR)
|
||||
* - `NAO` (NOT)
|
||||
* Suporta o agrupamento lógico usando parênteses `()`
|
||||
* Exemplo válido: "({1} E NAO({2})) OU {3}"
|
||||
*
|
||||
* =============================================================================
|
||||
*/
|
||||
/**
|
||||
* Operadores permitidos para comparação.
|
||||
*/
|
||||
export const zOperadorFiltroDelta = z.enum([">", "<", ">=", "<=", "=", "!=", "in", "like", "∩"]);
|
||||
export const operadorFiltroDeltaDetalhes = {
|
||||
">": {
|
||||
rotulo: "Maior que",
|
||||
descricao: "O valor de A deve ser maior que o valor de B",
|
||||
},
|
||||
"<": {
|
||||
rotulo: "Menor que",
|
||||
descricao: "O valor de A deve ser menor que o valor de B",
|
||||
},
|
||||
">=": {
|
||||
rotulo: "Maior ou igual a",
|
||||
descricao: "O valor de A deve ser maior ou igual ao valor de B",
|
||||
},
|
||||
"<=": {
|
||||
rotulo: "Menor ou igual a",
|
||||
descricao: "O valor de A deve ser menor ou igual ao valor de B",
|
||||
},
|
||||
"=": {
|
||||
rotulo: "Igual a",
|
||||
descricao: "O valor de A deve ser igual ao valor de B",
|
||||
},
|
||||
"!=": {
|
||||
rotulo: "Diferente de",
|
||||
descricao: "O valor de A deve ser diferente do valor de B",
|
||||
},
|
||||
in: {
|
||||
rotulo: "Está em",
|
||||
descricao: "O valor de A deve estar presente na coleção ou lista definida em B",
|
||||
},
|
||||
like: {
|
||||
rotulo: "Contém",
|
||||
descricao: "O valor de A deve conter o texto informado em B",
|
||||
},
|
||||
"∩": {
|
||||
rotulo: "Interseção",
|
||||
descricao: "A e B devem possuir pelo menos um elemento em comum",
|
||||
},
|
||||
};
|
||||
/**
|
||||
* Valida o identificador da condição.
|
||||
*
|
||||
* Formato esperado:
|
||||
* {identificador} ou {identificador:sufixo}
|
||||
*/
|
||||
const regexIdCondicaoFiltroDelta = /^\{[\w:]+\}$/;
|
||||
/**
|
||||
* Valida nomes de colunas e caminhos jsonb.
|
||||
*/
|
||||
const regexColunaFiltroDelta = /^\w+(\.\w+)*$/;
|
||||
/**
|
||||
* Coluna simples ou caminho aninhado de jsonb.
|
||||
*/
|
||||
export const zColunaFiltroDelta = z
|
||||
.string()
|
||||
.regex(regexColunaFiltroDelta, "Coluna inválida")
|
||||
.describe("nome da coluna ou caminho aninhado do jsonb");
|
||||
/**
|
||||
* Estrutura individual de uma condição do filtro.
|
||||
*/
|
||||
export const zCondicaoFiltroDelta = z.object({
|
||||
/**
|
||||
* Identificador único da condição.
|
||||
*
|
||||
* Exemplo:
|
||||
* {1}
|
||||
*/
|
||||
id: z
|
||||
.string()
|
||||
.describe("id da condição do filtro")
|
||||
.regex(regexIdCondicaoFiltroDelta, "O id deve seguir o formato {identificador}"),
|
||||
/**
|
||||
* Nome da coluna ou caminho jsonb.
|
||||
*/
|
||||
coluna: zColunaFiltroDelta,
|
||||
/**
|
||||
* Operador da comparação.
|
||||
*/
|
||||
operador: zOperadorFiltroDelta,
|
||||
/**
|
||||
* Valor utilizado na comparação.
|
||||
*/
|
||||
valor: z.any().describe("valor de comparação"),
|
||||
});
|
||||
/**
|
||||
* Verifica se a fórmula possui uma estrutura lógica válida.
|
||||
*/
|
||||
const formulaFiltroDeltaValida = (formula) => {
|
||||
/**
|
||||
* Extrai apenas os tokens permitidos:
|
||||
* - referências de condição: {id} ou {id:sufixo}
|
||||
* - operadores lógicos: E, OU
|
||||
* - negação: NAO(...)
|
||||
* - parênteses
|
||||
*/
|
||||
const tokensPermitidos = formula.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g) || [];
|
||||
/**
|
||||
* Reconstrói a fórmula usando apenas os tokens válidos.
|
||||
*/
|
||||
const formulaReconstruida = tokensPermitidos.join("");
|
||||
/**
|
||||
* Remove espaços para comparar o texto original com o texto reconstruído.
|
||||
*/
|
||||
const formulaOriginalSemEspacos = formula.replace(/\s+/g, "");
|
||||
const formulaReconstruidaSemEspacos = formulaReconstruida.replace(/\s+/g, "");
|
||||
/**
|
||||
* Se forem diferentes, há conteúdo não permitido na fórmula.
|
||||
*/
|
||||
if (formulaOriginalSemEspacos !== formulaReconstruidaSemEspacos) {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Converte a fórmula para uma expressão JavaScript equivalente.
|
||||
*
|
||||
* NAO(x) → !x
|
||||
* E → &&
|
||||
* OU → ||
|
||||
*/
|
||||
const expressaoLogica = formula
|
||||
.replace(/\{[\w:]+\}/g, "true")
|
||||
.replace(/\bNAO\b/g, "!")
|
||||
.replace(/\bE\b/g, "&&")
|
||||
.replace(/\bOU\b/g, "||");
|
||||
try {
|
||||
/**
|
||||
* Valida a ordem dos operadores, parênteses e estrutura lógica geral.
|
||||
*/
|
||||
new Function(`return (${expressaoLogica})`)();
|
||||
return true;
|
||||
}
|
||||
catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Estrutura principal do filtro delta.
|
||||
*/
|
||||
export const zFiltroDelta = z
|
||||
.object({
|
||||
/**
|
||||
* Lista de condições disponíveis.
|
||||
*/
|
||||
condicoes: z.array(zCondicaoFiltroDelta),
|
||||
/**
|
||||
* Fórmula lógica que combina as condições.
|
||||
*/
|
||||
formula: z.string().refine(formulaFiltroDeltaValida, {
|
||||
message: "Fórmula inválida. Use apenas referências de condições {id} ou {id:sufixo}, operadores E/OU/NAO e parênteses.",
|
||||
}),
|
||||
})
|
||||
.superRefine((value, ctx) => {
|
||||
/**
|
||||
* IDs das condições cadastradas.
|
||||
*/
|
||||
const idsCondicoes = new Set(value.condicoes.map((condicao) => condicao.id));
|
||||
/**
|
||||
* Referências usadas dentro da fórmula.
|
||||
*/
|
||||
const referenciasFormula = value.formula.match(/\{[\w:]+\}/g) || [];
|
||||
/**
|
||||
* Verifica se toda referência da fórmula existe em condicoes.
|
||||
*/
|
||||
for (const referencia of referenciasFormula) {
|
||||
if (!idsCondicoes.has(referencia)) {
|
||||
ctx.addIssue({
|
||||
code: "custom",
|
||||
path: ["formula"],
|
||||
message: `A referência ${referencia} não existe em condicoes.`,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
export const criarFiltroDelta = (filtro) => zFiltroDelta.parse(filtro);
|
||||
/**
|
||||
* Fábrica para criar filtros com colunas estritamente tipadas.
|
||||
* Útil para autocompletar os nomes das colunas e garantir a estrutura no TypeScript.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* const { criarFiltroDelta } = iniciarFiltroDelta<"nome" | "idade" | "jsonb.propriedade">()
|
||||
*
|
||||
* const filtro = criarFiltroDelta({
|
||||
* condicoes: [
|
||||
* { id: "{c1}", coluna: "idade", operador: ">", valor: 18 },
|
||||
* { id: "{c2}", coluna: "nome", operador: "=", valor: "luiz" },
|
||||
* { id: "{c3}", coluna: "jsonb.propriedade", operador: "=", valor: "valor" },
|
||||
* ],
|
||||
* formula: "({c1} E {c2}) OU {c3}",
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
export const iniciarFiltroDelta = () => {
|
||||
return {
|
||||
criarFiltroDelta: criarFiltroDelta,
|
||||
};
|
||||
};
|
||||
10
dist-front/graficosPilao.js
Normal file
10
dist-front/graficosPilao.js
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
export const graficos_pilao = {
|
||||
Condicionantes: {
|
||||
grafico: "condicionantes-criadas",
|
||||
titulo: "Condicionantes Criadas",
|
||||
},
|
||||
Licenças: {
|
||||
grafico: "licencas-criadas",
|
||||
titulo: "Licenças Criadas",
|
||||
},
|
||||
};
|
||||
|
|
@ -1,695 +0,0 @@
|
|||
import z from 'zod';
|
||||
import _dayjs from 'dayjs';
|
||||
export { Dayjs, ManipulateType } from 'dayjs';
|
||||
import _duration from 'dayjs/plugin/duration';
|
||||
import _isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
|
||||
import _isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
|
||||
import _minMax from 'dayjs/plugin/minMax';
|
||||
import _relativeTime from 'dayjs/plugin/relativeTime';
|
||||
import _timezone from 'dayjs/plugin/timezone';
|
||||
import _utc from 'dayjs/plugin/utc';
|
||||
import _weekOfYear from 'dayjs/plugin/weekOfYear';
|
||||
import { v4 } from 'uuid';
|
||||
|
||||
declare const aleatorio: (tamanho?: number) => string;
|
||||
|
||||
type TipoPayloadAuditoria = {
|
||||
/** UUID do registro de auditoria */
|
||||
codigo?: string | null;
|
||||
/** UUID do usuario da acao (pode ser null se for processo do sistema que não registrou) */
|
||||
usuario_criacao: string | null;
|
||||
/** Timestamp ou data de criacao / execucao */
|
||||
data_criacao: string | Date;
|
||||
/** Nome exato da tabela no banco que originou o registro */
|
||||
tabela_origem: string;
|
||||
/** Código único (UUID) do registro na tabela original */
|
||||
codigo_origem: string;
|
||||
/** JSON contendo o snapshot das colunas novas / editadas */
|
||||
novo: Record<string, any>;
|
||||
/** JSON contendo o snapshot das colunas antes da edição */
|
||||
anterior: Record<string, any>;
|
||||
/** Hash ou controle de versao do item, usualmente preenchido por new.ver_seg */
|
||||
__versao: string;
|
||||
/** Tipo de operação que gerou a auditoria */
|
||||
acao: "criar" | "atualizar" | "deletar" | string;
|
||||
/** Versão do sistema no momento em que a ação ocorreu */
|
||||
versao_sistema: string;
|
||||
};
|
||||
|
||||
/** gerar uma função de cache para uso em memoria */
|
||||
declare const cacheM: <T>(chave: any, valor?: T, validadeSeg?: number) => T | undefined;
|
||||
declare const verCacheM: () => {
|
||||
[k: string]: {
|
||||
/** new Date().getTime() */
|
||||
validade?: number | undefined;
|
||||
valor: any;
|
||||
} | undefined;
|
||||
};
|
||||
declare const cacheMemoria: <T>(chave: any, valor?: T, validadeSeg?: number) => T | undefined;
|
||||
/** para uso fixo dentro de uma função, trava a chave */
|
||||
declare const cacheMFixo: (chave: any) => <T>(valor?: T) => T | undefined;
|
||||
|
||||
declare const uuid_null = "00000000-0000-0000-0000-000000000000";
|
||||
/** Colunas Presentes n maioria das tabelas */
|
||||
declare enum camposComuns {
|
||||
codigo = "codigo",
|
||||
excluido = "excluido",
|
||||
data_hora_criacao = "data_hora_criacao",
|
||||
data_hora_atualizacao = "data_hora_atualizacao",
|
||||
codigo_usuario_criacao = "codigo_usuario_criacao",
|
||||
codigo_usuario_atualizacao = "codigo_usuario_atualizacao",
|
||||
versao = "versao"
|
||||
}
|
||||
/** Palavras comumente usadas */
|
||||
declare enum tx {
|
||||
token = "token"
|
||||
}
|
||||
declare enum tipoUsuarioResiduos {
|
||||
Usuario = "usuario",
|
||||
Fornecedor = "fornecedor"
|
||||
}
|
||||
|
||||
declare enum operadores {
|
||||
"=" = "=",
|
||||
"!=" = "!=",
|
||||
">" = ">",
|
||||
">=" = ">=",
|
||||
"<" = "<",
|
||||
"<=" = "<=",
|
||||
like = "like",
|
||||
in = "in",
|
||||
isNull = "isNull"
|
||||
}
|
||||
type tipoFiltro = {
|
||||
coluna: string;
|
||||
valor: any;
|
||||
operador: keyof typeof operadores | operadores;
|
||||
ou?: boolean;
|
||||
};
|
||||
type interfaceConsulta = {
|
||||
offset?: number;
|
||||
limit?: number;
|
||||
filtros?: tipoFiltro[];
|
||||
ordem?: string;
|
||||
ordemTipo?: "asc" | "desc";
|
||||
colunas?: string[];
|
||||
apenasConsulta?: boolean;
|
||||
apenasContagem?: boolean;
|
||||
};
|
||||
declare const zOperadores: z.ZodEnum<{
|
||||
"=": "=";
|
||||
"!=": "!=";
|
||||
">": ">";
|
||||
">=": ">=";
|
||||
"<": "<";
|
||||
"<=": "<=";
|
||||
like: "like";
|
||||
in: "in";
|
||||
isNull: "isNull";
|
||||
}>;
|
||||
declare const zFiltro: z.ZodObject<{
|
||||
coluna: z.ZodString;
|
||||
valor: z.ZodAny;
|
||||
operador: z.ZodEnum<{
|
||||
"=": "=";
|
||||
"!=": "!=";
|
||||
">": ">";
|
||||
">=": ">=";
|
||||
"<": "<";
|
||||
"<=": "<=";
|
||||
like: "like";
|
||||
in: "in";
|
||||
isNull: "isNull";
|
||||
}>;
|
||||
ou: z.ZodOptional<z.ZodBoolean>;
|
||||
}, z.core.$strip>;
|
||||
|
||||
/**
|
||||
* Utilitário de configuração do Dayjs focado em compatibilidade com SSR.
|
||||
*
|
||||
* PROBLEMA:
|
||||
* A importação direta do `dayjs` e seus plugins frequentemente causa conflitos em ambientes
|
||||
* de Renderização do Lado do Servidor (SSR), como Nuxt ou Next.js, devido a discrepâncias
|
||||
* na resolução de módulos (ESM vs CJS) e instabilidades de importação.
|
||||
*
|
||||
* SOLUÇÃO:
|
||||
* Este módulo utiliza o padrão de Injeção de Dependência. Ele expõe apenas tipagens e
|
||||
* uma função de configuração (`defineDayjsBr`). A responsabilidade de importar as
|
||||
* bibliotecas "vivas" é delegada à aplicação consumidora (o cliente da função).
|
||||
*
|
||||
* Isso permite que o bundler da aplicação principal (Vite, Webpack, etc.) gerencie as
|
||||
* instâncias, garantindo consistência e evitando erros de "module not found" ou
|
||||
* instâncias duplicadas/não inicializadas adequadamente.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Inicializa e configura o Dayjs com o locale 'pt-br' e plugins essenciais.
|
||||
*
|
||||
* MODO DE USO:
|
||||
* Importe os pacotes reais na sua aplicação e passe-os para esta função.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* // Em seu arquivo de configuração (ex: plugins/dayjs.ts):
|
||||
* import dayjs from "dayjs"
|
||||
* import duration from "dayjs/plugin/duration"
|
||||
* import isSameOrAfter from "dayjs/plugin/isSameOrAfter"
|
||||
* import isSameOrBefore from "dayjs/plugin/isSameOrBefore"
|
||||
* import minMax from "dayjs/plugin/minMax"
|
||||
* import relativeTime from "dayjs/plugin/relativeTime"
|
||||
* import timezone from "dayjs/plugin/timezone"
|
||||
* import utc from "dayjs/plugin/utc"
|
||||
* import weekOfYear from "dayjs/plugin/weekOfYear"
|
||||
* import { iniciarDayjsBr } from "p-comuns"
|
||||
* import "dayjs/locale/pt-br" // Importante: importar o locale!
|
||||
|
||||
* export const dayjsbr = iniciarDayjsBr({
|
||||
* dayjs,
|
||||
* duration,
|
||||
* isSameOrAfter,
|
||||
* isSameOrBefore,
|
||||
* minMax,
|
||||
* relativeTime,
|
||||
* timezone,
|
||||
* utc,
|
||||
* weekOfYear,
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
declare const iniciarDayjsBr: ({ dayjs, duration, isSameOrAfter, isSameOrBefore, minMax, relativeTime, timezone, utc, weekOfYear, }: {
|
||||
dayjs: typeof _dayjs;
|
||||
duration: typeof _duration;
|
||||
isSameOrAfter: typeof _isSameOrAfter;
|
||||
isSameOrBefore: typeof _isSameOrBefore;
|
||||
minMax: typeof _minMax;
|
||||
relativeTime: typeof _relativeTime;
|
||||
timezone: typeof _timezone;
|
||||
utc: typeof _utc;
|
||||
weekOfYear: typeof _weekOfYear;
|
||||
}) => typeof _dayjs;
|
||||
/**
|
||||
* @deprecated Use iniciarDayjsBr em vez de definirDayjsBr. O método defineDayjsBr está obsoleto e será removido em futuras versões.
|
||||
*/
|
||||
declare const defineDayjsBr: ({ dayjs, duration, isSameOrAfter, isSameOrBefore, minMax, relativeTime, timezone, utc, weekOfYear, }: {
|
||||
dayjs: typeof _dayjs;
|
||||
duration: typeof _duration;
|
||||
isSameOrAfter: typeof _isSameOrAfter;
|
||||
isSameOrBefore: typeof _isSameOrBefore;
|
||||
minMax: typeof _minMax;
|
||||
relativeTime: typeof _relativeTime;
|
||||
timezone: typeof _timezone;
|
||||
utc: typeof _utc;
|
||||
weekOfYear: typeof _weekOfYear;
|
||||
}) => typeof _dayjs;
|
||||
|
||||
declare const link_paiol = "https://paiol.idz.one";
|
||||
|
||||
/** Níveis de severidade para o sistema de log estruturado. */
|
||||
declare enum NivelLog {
|
||||
/** O mais baixo nível, ideal para rastreamento detalhado de fluxo e execução. */
|
||||
RASTREAMENTO = "RASTREAMENTO",
|
||||
/** Usado para informações que ajudam a entender o estado do sistema durante a execução. */
|
||||
DEPURACAO = "DEPURACAO",
|
||||
/** Informações gerais e eventos do sistema. */
|
||||
INFORMACAO = "INFORMACAO",
|
||||
/** Eventos inesperados, mas que não impedem o funcionamento do sistema. */
|
||||
AVISO = "AVISO",
|
||||
/** Erros que impactam o funcionamento do sistema, mas que podem ser recuperados. */
|
||||
ERRO = "ERRO",
|
||||
/** O nível mais alto de severidade, indicando falhas que requerem atenção imediata. */
|
||||
CRITICO = "CRITICO"
|
||||
}
|
||||
type DetalheNivel = {
|
||||
peso: number;
|
||||
rotulo: string;
|
||||
emoji: string;
|
||||
metodo: "debug" | "info" | "warn" | "error";
|
||||
};
|
||||
/** Detalhes de cada nível de log — peso para filtragem, emoji e método do console. */
|
||||
declare const NivelLogDetalhes: Record<NivelLog, DetalheNivel>;
|
||||
/** Estrutura de uma entrada de log emitida pelo sistema. */
|
||||
type EntradaLog = {
|
||||
timestamp: string;
|
||||
nivel: keyof typeof NivelLog;
|
||||
/** Identificador da aplicação/instância (ex: "front:e-licencie:12345"). */
|
||||
app: string;
|
||||
/** Local no código de onde o log foi emitido (ex: "criarUsuario()"). */
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
};
|
||||
/** Interface pública do logger retornado por `iniciarELog`. */
|
||||
type ELogger = {
|
||||
rastreamento: (pr: {
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
}) => void;
|
||||
depuracao: (pr: {
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
}) => void;
|
||||
info: (pr: {
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
}) => void;
|
||||
aviso: (pr: {
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
}) => void;
|
||||
erro: (pr: {
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
}) => void;
|
||||
critico: (pr: {
|
||||
origem: string;
|
||||
mensagem: string;
|
||||
dados?: unknown;
|
||||
}) => void;
|
||||
};
|
||||
/** Opções de configuração do logger, disponíveis no callback de arquivamento. */
|
||||
type OpoesELogger = {
|
||||
app: string;
|
||||
nivelMinimo: keyof typeof NivelLog;
|
||||
};
|
||||
/** Tipo do callback de arquivamento de logs. */
|
||||
type ArquivamentoLog = (entrada: EntradaLog, opcoes: OpoesELogger) => void;
|
||||
/**
|
||||
* Inicializa o sistema de log estruturado.
|
||||
*
|
||||
* @param opcoes.app - Identificador da aplicação/instância (ex: `"front:e-licencie:12345"`)
|
||||
* @param opcoes.nivelMinimo - Nível mínimo para exibição no console (padrão: INFORMACAO)
|
||||
* @param opcoes.arquivamento - Callback opcional para persistir/enviar as entradas de log
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* const log = iniciarELog({ app: "front:e-licencie:12345" })
|
||||
*
|
||||
* log.info({ origem: "criarUsuario()", mensagem: "Usuário criado", dados: { id: "abc-123" } })
|
||||
* // → ℹ️ [Informação] [front:e-licencie:12345] [criarUsuario()] Usuário criado
|
||||
* ```
|
||||
*/
|
||||
declare const iniciarELog: (opcoes: {
|
||||
app: string;
|
||||
nivelMinimo?: keyof typeof NivelLog;
|
||||
arquivamento?: ArquivamentoLog;
|
||||
}) => ELogger;
|
||||
|
||||
type tiposArquivo = "imagem" | "documento" | "vídeo" | "outros";
|
||||
declare const extensoes: {
|
||||
ext: string;
|
||||
tipo: tiposArquivo;
|
||||
mime: string;
|
||||
}[];
|
||||
/**
|
||||
* Função que retorna o tipo do arquivo
|
||||
* @param nomeArquivo
|
||||
* @returns
|
||||
*/
|
||||
declare const tipoArquivo: (nomeArquivo: string | null | undefined) => tiposArquivo;
|
||||
|
||||
/**
|
||||
* =============================================================================
|
||||
* FILTRO DELTA (zFiltroDelta)
|
||||
* =============================================================================
|
||||
*
|
||||
* OBJETIVO
|
||||
* -----------------------------------------------------------------------------
|
||||
* Novo sistema de filtros projetado para maior flexibilidade e geração segura
|
||||
* de instruções SQL dinâmicas (WHERE).
|
||||
*
|
||||
* REGRAS IMPORTANTES (PARA IA)
|
||||
* -----------------------------------------------------------------------------
|
||||
* - O filtro é composto de duas partes obrigatórias: `condicoes` e `formula`.
|
||||
* - Apenas referências aos `id`s das `condicoes` podem ser usadas na `formula`.
|
||||
* - Não use sintaxe baseada em objetos aninhados para agrupamento (ex: { E: [], OU: [] }). Use fórmulas em string.
|
||||
*
|
||||
* 1) CONDIÇÕES (`condicoes`):
|
||||
* Array de objetos contendo as definições isoladas de cada comparação.
|
||||
* Exemplo:
|
||||
* [
|
||||
* { id: "{1}", coluna: "idade", operador: ">=", valor: 18 },
|
||||
* { id: "{2}", coluna: "nome", operador: "like", valor: "%pa%" }
|
||||
* ]
|
||||
* - `id`: Deve SEMPRE seguir o formato {identificador}. Ex: `{c1}`, `{idade_min}`.
|
||||
* - `coluna`: O nome da coluna ou um path JSONB válido (ex: `veiculo.ano`).
|
||||
* - `operador`: Um dos valores do tipo `tipoOperadorFiltroDelta` (veja a constante).
|
||||
*
|
||||
* 2) FÓRMULA (`formula`):
|
||||
* String que define a expressão lógica relacionando as condições através de seus `id`s.
|
||||
* Operadores Lógicos Suportados (EM MAIÚSCULO):
|
||||
* - `E` (AND)
|
||||
* - `OU` (OR)
|
||||
* - `NAO` (NOT)
|
||||
* Suporta o agrupamento lógico usando parênteses `()`
|
||||
* Exemplo válido: "({1} E NAO({2})) OU {3}"
|
||||
*
|
||||
* =============================================================================
|
||||
*/
|
||||
/**
|
||||
* Operadores permitidos para comparação.
|
||||
*/
|
||||
declare const zOperadorFiltroDelta: z.ZodEnum<{
|
||||
"=": "=";
|
||||
"!=": "!=";
|
||||
">": ">";
|
||||
">=": ">=";
|
||||
"<": "<";
|
||||
"<=": "<=";
|
||||
like: "like";
|
||||
in: "in";
|
||||
"\u2229": "∩";
|
||||
}>;
|
||||
declare const operadorFiltroDeltaDetalhes: Record<z.infer<typeof zOperadorFiltroDelta>, {
|
||||
rotulo: string;
|
||||
descricao: string;
|
||||
}>;
|
||||
/**
|
||||
* Coluna simples ou caminho aninhado de jsonb.
|
||||
*/
|
||||
declare const zColunaFiltroDelta: z.ZodString;
|
||||
/**
|
||||
* Estrutura individual de uma condição do filtro.
|
||||
*/
|
||||
declare const zCondicaoFiltroDelta: z.ZodObject<{
|
||||
id: z.ZodString;
|
||||
coluna: z.ZodString;
|
||||
operador: z.ZodEnum<{
|
||||
"=": "=";
|
||||
"!=": "!=";
|
||||
">": ">";
|
||||
">=": ">=";
|
||||
"<": "<";
|
||||
"<=": "<=";
|
||||
like: "like";
|
||||
in: "in";
|
||||
"\u2229": "∩";
|
||||
}>;
|
||||
valor: z.ZodAny;
|
||||
}, z.core.$strip>;
|
||||
/**
|
||||
* Estrutura principal do filtro delta.
|
||||
*/
|
||||
declare const zFiltroDelta: z.ZodObject<{
|
||||
condicoes: z.ZodArray<z.ZodObject<{
|
||||
id: z.ZodString;
|
||||
coluna: z.ZodString;
|
||||
operador: z.ZodEnum<{
|
||||
"=": "=";
|
||||
"!=": "!=";
|
||||
">": ">";
|
||||
">=": ">=";
|
||||
"<": "<";
|
||||
"<=": "<=";
|
||||
like: "like";
|
||||
in: "in";
|
||||
"\u2229": "∩";
|
||||
}>;
|
||||
valor: z.ZodAny;
|
||||
}, z.core.$strip>>;
|
||||
formula: z.ZodString;
|
||||
}, z.core.$strip>;
|
||||
type tipoOperadorFiltroDelta = z.infer<typeof zOperadorFiltroDelta>;
|
||||
type tipoColunaFiltroDelta = z.infer<typeof zColunaFiltroDelta>;
|
||||
type tipoCondicaoFiltroDelta = z.infer<typeof zCondicaoFiltroDelta>;
|
||||
type tipoFiltroDelta = z.infer<typeof zFiltroDelta>;
|
||||
type tipoCondicaoFiltroDeltaTipado<T extends string> = tipoCondicaoFiltroDelta & {
|
||||
coluna: T;
|
||||
};
|
||||
type tipoFiltroDeltaColunaTipada<T extends string> = {
|
||||
condicoes: tipoCondicaoFiltroDeltaTipado<T>[];
|
||||
formula: string;
|
||||
};
|
||||
declare const criarFiltroDelta: <T extends string>(filtro: tipoFiltroDeltaColunaTipada<T>) => tipoFiltroDeltaColunaTipada<T>;
|
||||
/**
|
||||
* Fábrica para criar filtros com colunas estritamente tipadas.
|
||||
* Útil para autocompletar os nomes das colunas e garantir a estrutura no TypeScript.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* const { criarFiltroDelta } = iniciarFiltroDelta<"nome" | "idade" | "jsonb.propriedade">()
|
||||
*
|
||||
* const filtro = criarFiltroDelta({
|
||||
* condicoes: [
|
||||
* { id: "{c1}", coluna: "idade", operador: ">", valor: 18 },
|
||||
* { id: "{c2}", coluna: "nome", operador: "=", valor: "luiz" },
|
||||
* { id: "{c3}", coluna: "jsonb.propriedade", operador: "=", valor: "valor" },
|
||||
* ],
|
||||
* formula: "({c1} E {c2}) OU {c3}",
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
declare const iniciarFiltroDelta: <TColunas extends string>() => {
|
||||
criarFiltroDelta: (filtro: tipoFiltroDeltaColunaTipada<TColunas>) => tipoFiltroDeltaColunaTipada<TColunas>;
|
||||
};
|
||||
|
||||
/**
|
||||
* LocalStorage Tipado
|
||||
* Lê ou grava um valor no localStorage, mantendo o tipo genérico <T>.
|
||||
*/
|
||||
declare const localValor: <T>(chave_: string | any, valor?: T | null) => T | null;
|
||||
|
||||
/**
|
||||
* Trata um objeto para ser imput para postgres
|
||||
* @param entrada
|
||||
* @returns
|
||||
*/
|
||||
declare const paraObjetoRegistroPg: (entrada: {
|
||||
[k: string]: any;
|
||||
}) => {
|
||||
[k: string]: string | boolean | null | undefined | number;
|
||||
};
|
||||
declare const pgObjeto: (entrada: {
|
||||
[k: string]: any;
|
||||
}) => {
|
||||
[k: string]: string | boolean | null | undefined | number;
|
||||
};
|
||||
declare const objetoPg: (entrada: {
|
||||
[k: string]: any;
|
||||
}) => {
|
||||
[k: string]: string | boolean | null | undefined | number;
|
||||
};
|
||||
|
||||
declare enum Produtos {
|
||||
"e-licencie" = "e-licencie",
|
||||
"gov.e-licencie" = "gov.e-licencie"
|
||||
}
|
||||
|
||||
declare enum tiposSituacoesElicencie {
|
||||
modelo = "000_modelo",
|
||||
vencida = "100_vencida",
|
||||
expirado = "200_expirado",
|
||||
alerta = "300_alerta",
|
||||
protocoladafora = "350_protocoladafora",
|
||||
protocolada = "400_protocolada",
|
||||
protocoladaApenas = "430_protocolada",
|
||||
protocolada_alteracao = "450_protocolada",
|
||||
prazo = "500_prazo",
|
||||
emitida = "515_emitida",
|
||||
valida = "518_valida",
|
||||
novo = "520_novo",
|
||||
recebido = "521_recebido",
|
||||
em_andamento = "530_em_andamento",
|
||||
aguardando = "530_aguardando",
|
||||
aguardandoresposta = "540_aguardandoresposta",
|
||||
suspensaotemporaria = "540_suspensaotemporaria",
|
||||
cancelada = "550_cancelada",
|
||||
execucao = "560_execucao",
|
||||
pendente = "570_pendente",
|
||||
executadafora = "600_executadafora",
|
||||
executada = "700_executada",
|
||||
naoexecutada = "701_naoexecutada",
|
||||
concluida = "730_concluida",
|
||||
respondido_negado = "740_respondido_negado",
|
||||
respondido_aceito = "741_respondido_aceito",
|
||||
atendidoparcial = "742_atendidoparcial",
|
||||
naoatendido = "743_naoatendido",
|
||||
atendido = "744_atendido",
|
||||
renovada = "760_renovada",
|
||||
finalizada = "800_finalizada",
|
||||
emitirnota = "101_emitirnota",
|
||||
faturaatrasada = "301_faturaatrasada",
|
||||
pagarfatura = "302_pagarfatura",
|
||||
aguardandoconfirmacao = "531_aguardandoconfirmacao",
|
||||
agendado = "701_agendado",
|
||||
faturapaga = "801_faturapaga",
|
||||
excluida = "999_excluida",
|
||||
requerida = "401_requerida",
|
||||
vigente = "516_vigente",
|
||||
emrenovacao = "402_emrenovacao",
|
||||
arquivada = "801_arquivada",
|
||||
aguardando_sincronizacao = "999_aguardando_sincronizacao",
|
||||
nao_conforme = "710_nao_conforme",
|
||||
conforme = "720_conforme",
|
||||
nao_aplicavel = "730_nao_aplicavel",
|
||||
parcial = "715_parcial"
|
||||
}
|
||||
|
||||
declare const umaFuncao: () => string;
|
||||
|
||||
declare const umaVariavel = "Ol\u00E1 Mundo! (vari\u00E1vel)";
|
||||
|
||||
/** gerar o texto de busca removendo caracteres especies e caixa alta */
|
||||
declare const texto_busca: (...texto: any[]) => string;
|
||||
|
||||
/** Gerar uma classe que facilita a gestão de rotas com a tipagem das querys
|
||||
*
|
||||
* Definições:
|
||||
*
|
||||
* caminho = "/aplicacao/funcionalidade"
|
||||
*
|
||||
* endereco = "http://localhost:3000/aplicacao/funcionalidade"
|
||||
*
|
||||
* parametros = {nome:"José"}
|
||||
*/
|
||||
declare class TipagemRotas<T extends {
|
||||
[q: string]: any;
|
||||
}> {
|
||||
_partesCaminho: string[];
|
||||
_acaoIr?: (endereco: string) => undefined;
|
||||
rotulo: string | undefined;
|
||||
/** Ao criar novo obijeto de tipagem de rota é necessário passar o caminho parcial
|
||||
** export const mCaminho = new TipagemRotas<{q:string}>("aplicacao","funcionalidade")
|
||||
*/
|
||||
constructor({ caminho, acaoIr, rotulo, }: {
|
||||
caminho: (string | null | undefined)[] | string;
|
||||
acaoIr?: undefined | ((endereco: string) => undefined);
|
||||
/** Rotulo da página
|
||||
* Inicio | Controle
|
||||
*/
|
||||
rotulo?: string;
|
||||
});
|
||||
/** Retorna o caminho completo da rota
|
||||
** console.log(mCaminho.caminho)
|
||||
** "/caminho"
|
||||
*/
|
||||
get caminho(): string;
|
||||
/** Define o caminho completo da rota
|
||||
** mCaminho.caminho = "/novoCaminho"
|
||||
** console.log(mCaminho.caminho)
|
||||
** "/novoCaminho"
|
||||
** */
|
||||
set caminho(caminhoParcial: string);
|
||||
/** Retorna o caminho completo da rota com a query
|
||||
** console.log(mCaminho.resolve({q:"query"}))
|
||||
** "http://localhost:3000/caminho?q=query"
|
||||
*/
|
||||
endereco(query: T, usarComoHash?: boolean): string;
|
||||
/** Vai para a url
|
||||
** mCaminho.ir({q:"query"})
|
||||
** window.location.href = "http://localhost:3000/caminho?q=query"
|
||||
*/
|
||||
ir(query: T): void;
|
||||
/** Retorna os parametros da url
|
||||
** console.log(mCaminho.parametros())
|
||||
** {q:"query"}
|
||||
*/
|
||||
parametros(urlEntrada?: string): Partial<T>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Essa variável se conecta a tabela_lidades
|
||||
*
|
||||
* onde sigla se conecta com sigla
|
||||
*
|
||||
* Usuário terá mais opções de unidades, quando fazer o envio para o mtr, usar a opção fornecida pelo usuarios, caso não tenha
|
||||
* usar a normalizada
|
||||
*/
|
||||
declare enum siglas_unidades_medida {
|
||||
UN = "UN",
|
||||
KG = "KG",
|
||||
TON = "TON",
|
||||
g = "g",
|
||||
"M³" = "M\u00B3",
|
||||
Lt = "Lt"
|
||||
}
|
||||
declare const unidades_medida: {
|
||||
sigla_unidade: keyof typeof siglas_unidades_medida;
|
||||
nome: string;
|
||||
sigla_normalizada: keyof typeof siglas_unidades_medida;
|
||||
normalizar: (valor: number) => number;
|
||||
tipo: "massa" | "volume" | "comprimento" | "unidade";
|
||||
}[];
|
||||
|
||||
/**
|
||||
* Valida se uma string é um UUID válido (qualquer versão).
|
||||
*
|
||||
* @param valor - A string que será validada.
|
||||
* @returns booleano indicando se é um UUID válido.
|
||||
*/
|
||||
declare const erUuid: RegExp;
|
||||
declare const validarUuid: (uuid: string | number | undefined | null) => boolean;
|
||||
/**
|
||||
* Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace).
|
||||
*
|
||||
* - Usa o algoritmo MD5 (RFC 4122).
|
||||
* - Sempre retorna o mesmo UUID para a mesma combinação chave + grupo.
|
||||
* - Caso o grupo não seja informado, usa o UUID "nil" como namespace.
|
||||
*
|
||||
* @param chave - Qualquer valor que será convertido em string para gerar o UUID (ex: número, string ou objeto).
|
||||
* @param grupo - Opcional. Namespace para separar domínios diferentes de UUIDs.
|
||||
* @returns UUID v3 (determinístico)
|
||||
*/
|
||||
declare const uuidV3: (chave: any, grupo?: any) => string;
|
||||
/**
|
||||
* Gera um UUID v4 (aleatório, não determinístico).
|
||||
*
|
||||
* - Usado quando unicidade é necessária, mas não se exige que seja previsível.
|
||||
*/
|
||||
declare const uuidV4: typeof v4;
|
||||
/**
|
||||
* @deprecated Esta variável será descontinuada em versões futuras.
|
||||
* Use a função `uuidV4()` diretamente.
|
||||
*/
|
||||
declare const uuid: typeof v4;
|
||||
|
||||
declare const esperar: (ms: number) => Promise<true>;
|
||||
/**
|
||||
* Usado para retronat o no de uma variável, deve ser usado dentro de um objeto
|
||||
* const nomex = {a: 1, b: 2}
|
||||
* nomeVariavel({nomex}) // retorna "nomex"
|
||||
* @param v
|
||||
* @returns
|
||||
*/
|
||||
declare const nomeVariavel: (v: {
|
||||
[key: string]: any;
|
||||
}) => string;
|
||||
|
||||
/**
|
||||
* No futuro podemos melhorar este Zod para incluir mais formatos de coordenadas.
|
||||
*
|
||||
*/
|
||||
|
||||
declare const zCoordenadas: z.ZodObject<{
|
||||
formato: z.ZodDefault<z.ZodLiteral<"decimal">>;
|
||||
datum: z.ZodDefault<z.ZodLiteral<"EPSG:4326">>;
|
||||
latitude: z.ZodNumber;
|
||||
longitude: z.ZodNumber;
|
||||
}, z.core.$strip>;
|
||||
|
||||
declare const zDocCnpj: z.ZodString;
|
||||
declare const zDocCpf: z.ZodString;
|
||||
declare const zDocumento: z.ZodUnion<[z.ZodString, z.ZodString]>;
|
||||
|
||||
/**
|
||||
* Schema numérico que aceita strings legadas e normaliza para `number`.
|
||||
*
|
||||
* O campo **é** um número. O `preprocess` resolve compatibilidade com dados
|
||||
* antigos onde o frontend enviava strings formatadas (BR ou monetária).
|
||||
*
|
||||
* Formatos de entrada aceitos:
|
||||
* - `10` → number direto
|
||||
* - `10.1` → ponto decimal
|
||||
* - `10,1` → vírgula decimal (BR)
|
||||
* - `1.000,1` → milhar com ponto + vírgula decimal (BR)
|
||||
* - `R$ 10,01` → prefixo monetário legado
|
||||
*/
|
||||
declare const zNumero: z.ZodPreprocess<z.ZodNumber>;
|
||||
declare const zNumeroPositivo: z.ZodPreprocess<z.ZodNumber>;
|
||||
declare const zNumeroInteiro: z.ZodPreprocess<z.ZodNumber>;
|
||||
|
||||
export { type ArquivamentoLog, type ELogger, type EntradaLog, NivelLog, NivelLogDetalhes, type OpoesELogger, Produtos, TipagemRotas, type TipoPayloadAuditoria, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, criarFiltroDelta, defineDayjsBr, erUuid, esperar, extensoes, iniciarDayjsBr, iniciarELog, iniciarFiltroDelta, type interfaceConsulta, link_paiol, localValor, nomeVariavel, objetoPg, operadorFiltroDeltaDetalhes, operadores, paraObjetoRegistroPg, pgObjeto, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoColunaFiltroDelta, type tipoCondicaoFiltroDelta, type tipoCondicaoFiltroDeltaTipado, type tipoFiltro, type tipoFiltroDelta, type tipoFiltroDeltaColunaTipada, type tipoOperadorFiltroDelta, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zColunaFiltroDelta, zCondicaoFiltroDelta, zCoordenadas, zDocCnpj, zDocCpf, zDocumento, zFiltro, zFiltroDelta, zNumero, zNumeroInteiro, zNumeroPositivo, zOperadorFiltroDelta, zOperadores };
|
||||
25
dist-front/index.js
Normal file
25
dist-front/index.js
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
export * from "./aleatorio";
|
||||
export * from "./auditoria";
|
||||
export * from "./cacheMemoria";
|
||||
export * from "./constantes";
|
||||
export * from "./consulta";
|
||||
export * from "./dayjs26";
|
||||
export * from "./ecosistema";
|
||||
export * from "./eLog";
|
||||
export * from "./extensoes";
|
||||
export * from "./extensoes";
|
||||
export * from "./filtroDelta";
|
||||
export * from "./local";
|
||||
export * from "./postgres";
|
||||
export * from "./produtos";
|
||||
export * from "./situacoes";
|
||||
export * from "./testes-de-variaveis";
|
||||
export * from "./texto_busca";
|
||||
export * from "./tipagemRotas";
|
||||
export * from "./tipagemRotas";
|
||||
export * from "./unidades_medida";
|
||||
export * from "./uuid";
|
||||
export * from "./variaveisComuns";
|
||||
export * from "./zCoordenadas";
|
||||
export * from "./zDocumento";
|
||||
export * from "./zodCustomizados";
|
||||
File diff suppressed because one or more lines are too long
51
dist-front/instalarAmbiente.js
Normal file
51
dist-front/instalarAmbiente.js
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
/**
|
||||
* Mescla objetos recursivamente.
|
||||
* - Adiciona chaves novas
|
||||
* - Sobrescreve valores primitivos
|
||||
* - Mescla objetos aninhados
|
||||
*/
|
||||
const mesclar = (entrada, novo) => {
|
||||
const saida = { ...(entrada || {}) };
|
||||
for (const [k, v] of Object.entries(novo)) {
|
||||
if (v && typeof v === "object" && !Array.isArray(v)) {
|
||||
saida[k] = mesclar(saida[k], v);
|
||||
}
|
||||
else {
|
||||
saida[k] = v;
|
||||
}
|
||||
}
|
||||
return saida;
|
||||
};
|
||||
/** Lê JSON ou retorna objeto vazio */
|
||||
const abrirJson = (caminho) => {
|
||||
try {
|
||||
return JSON.parse(fs.readFileSync(caminho, "utf-8"));
|
||||
}
|
||||
catch {
|
||||
return {};
|
||||
}
|
||||
};
|
||||
const settings_json = {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
"[javascript]": { "editor.defaultFormatter": "biomejs.biome" },
|
||||
"[javascriptreact]": { "editor.defaultFormatter": "biomejs.biome" },
|
||||
"[typescript]": { "editor.defaultFormatter": "biomejs.biome" },
|
||||
"[typescriptreact]": { "editor.defaultFormatter": "biomejs.biome" },
|
||||
"[json]": { "editor.defaultFormatter": "biomejs.biome" },
|
||||
"[jsonc]": { "editor.defaultFormatter": "biomejs.biome" },
|
||||
"[vue]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports.biome": "always",
|
||||
"source.fixAll.biome": "always",
|
||||
},
|
||||
};
|
||||
const caminhoSeting = path.join(process.cwd(), ".vscode/settings.json");
|
||||
// Garante a pasta .vscode
|
||||
fs.mkdirSync(path.dirname(caminhoSeting), { recursive: true });
|
||||
// Mescla e grava
|
||||
const atual = abrirJson(caminhoSeting);
|
||||
const final = mesclar(atual, settings_json);
|
||||
fs.writeFileSync(caminhoSeting, JSON.stringify(final, null, 2), "utf8");
|
||||
console.log(`✅ Configurações salvas em ${caminhoSeting}`);
|
||||
31
dist-front/local/index.js
Normal file
31
dist-front/local/index.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* LocalStorage Tipado
|
||||
* Lê ou grava um valor no localStorage, mantendo o tipo genérico <T>.
|
||||
*/
|
||||
export const localValor = (chave_, valor) => {
|
||||
const localStorage = "localStorage" in globalThis ? globalThis.localStorage : undefined;
|
||||
if (typeof localStorage == "undefined")
|
||||
return null;
|
||||
const chave = typeof chave_ === "string" ? chave_ : encodeURIComponent(JSON.stringify(chave_));
|
||||
try {
|
||||
// Grava valor se fornecido
|
||||
if (valor !== undefined) {
|
||||
localStorage.setItem(chave, JSON.stringify(valor));
|
||||
}
|
||||
// Lê valor
|
||||
const v2 = localStorage.getItem(chave);
|
||||
if (v2 === null)
|
||||
return null;
|
||||
try {
|
||||
return JSON.parse(v2);
|
||||
}
|
||||
catch {
|
||||
// Caso o valor não seja JSON válido
|
||||
return v2;
|
||||
}
|
||||
}
|
||||
catch {
|
||||
// Em caso de erro de acesso ao localStorage
|
||||
return null;
|
||||
}
|
||||
};
|
||||
22
dist-front/postgres.js
Normal file
22
dist-front/postgres.js
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* Trata um objeto para ser imput para postgres
|
||||
* @param entrada
|
||||
* @returns
|
||||
*/
|
||||
export const paraObjetoRegistroPg = (entrada) => {
|
||||
try {
|
||||
return Object.fromEntries(Object.entries(entrada).map(([k, v]) => [
|
||||
k,
|
||||
v === undefined || v == null
|
||||
? v
|
||||
: typeof v == "string" || typeof v == "number" || typeof v == "boolean"
|
||||
? v
|
||||
: JSON.stringify(v, null, 2),
|
||||
]));
|
||||
}
|
||||
catch (error) {
|
||||
throw new Error(`Erro na função paraObjetoRegistroPg: ${error.message} ${error.stack}`);
|
||||
}
|
||||
};
|
||||
export const pgObjeto = paraObjetoRegistroPg;
|
||||
export const objetoPg = paraObjetoRegistroPg;
|
||||
5
dist-front/produtos.js
Normal file
5
dist-front/produtos.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
export var Produtos;
|
||||
(function (Produtos) {
|
||||
Produtos["e-licencie"] = "e-licencie";
|
||||
Produtos["gov.e-licencie"] = "gov.e-licencie";
|
||||
})(Produtos || (Produtos = {}));
|
||||
55
dist-front/situacoes.js
Normal file
55
dist-front/situacoes.js
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
export var tiposSituacoesElicencie;
|
||||
(function (tiposSituacoesElicencie) {
|
||||
tiposSituacoesElicencie["modelo"] = "000_modelo";
|
||||
tiposSituacoesElicencie["vencida"] = "100_vencida";
|
||||
tiposSituacoesElicencie["expirado"] = "200_expirado";
|
||||
tiposSituacoesElicencie["alerta"] = "300_alerta";
|
||||
tiposSituacoesElicencie["protocoladafora"] = "350_protocoladafora";
|
||||
tiposSituacoesElicencie["protocolada"] = "400_protocolada";
|
||||
tiposSituacoesElicencie["protocoladaApenas"] = "430_protocolada";
|
||||
tiposSituacoesElicencie["protocolada_alteracao"] = "450_protocolada";
|
||||
tiposSituacoesElicencie["prazo"] = "500_prazo";
|
||||
tiposSituacoesElicencie["emitida"] = "515_emitida";
|
||||
tiposSituacoesElicencie["valida"] = "518_valida";
|
||||
tiposSituacoesElicencie["novo"] = "520_novo";
|
||||
tiposSituacoesElicencie["recebido"] = "521_recebido";
|
||||
tiposSituacoesElicencie["em_andamento"] = "530_em_andamento";
|
||||
tiposSituacoesElicencie["aguardando"] = "530_aguardando";
|
||||
tiposSituacoesElicencie["aguardandoresposta"] = "540_aguardandoresposta";
|
||||
tiposSituacoesElicencie["suspensaotemporaria"] = "540_suspensaotemporaria";
|
||||
tiposSituacoesElicencie["cancelada"] = "550_cancelada";
|
||||
tiposSituacoesElicencie["execucao"] = "560_execucao";
|
||||
tiposSituacoesElicencie["pendente"] = "570_pendente";
|
||||
tiposSituacoesElicencie["executadafora"] = "600_executadafora";
|
||||
tiposSituacoesElicencie["executada"] = "700_executada";
|
||||
tiposSituacoesElicencie["naoexecutada"] = "701_naoexecutada";
|
||||
tiposSituacoesElicencie["concluida"] = "730_concluida";
|
||||
tiposSituacoesElicencie["respondido_negado"] = "740_respondido_negado";
|
||||
tiposSituacoesElicencie["respondido_aceito"] = "741_respondido_aceito";
|
||||
tiposSituacoesElicencie["atendidoparcial"] = "742_atendidoparcial";
|
||||
tiposSituacoesElicencie["naoatendido"] = "743_naoatendido";
|
||||
tiposSituacoesElicencie["atendido"] = "744_atendido";
|
||||
tiposSituacoesElicencie["renovada"] = "760_renovada";
|
||||
tiposSituacoesElicencie["finalizada"] = "800_finalizada";
|
||||
tiposSituacoesElicencie["emitirnota"] = "101_emitirnota";
|
||||
tiposSituacoesElicencie["faturaatrasada"] = "301_faturaatrasada";
|
||||
tiposSituacoesElicencie["pagarfatura"] = "302_pagarfatura";
|
||||
tiposSituacoesElicencie["aguardandoconfirmacao"] = "531_aguardandoconfirmacao";
|
||||
tiposSituacoesElicencie["agendado"] = "701_agendado";
|
||||
tiposSituacoesElicencie["faturapaga"] = "801_faturapaga";
|
||||
tiposSituacoesElicencie["excluida"] = "999_excluida";
|
||||
// situacoes outorgas
|
||||
// Requerido
|
||||
// Vigente
|
||||
// Em renovação
|
||||
// Arquivado
|
||||
tiposSituacoesElicencie["requerida"] = "401_requerida";
|
||||
tiposSituacoesElicencie["vigente"] = "516_vigente";
|
||||
tiposSituacoesElicencie["emrenovacao"] = "402_emrenovacao";
|
||||
tiposSituacoesElicencie["arquivada"] = "801_arquivada";
|
||||
tiposSituacoesElicencie["aguardando_sincronizacao"] = "999_aguardando_sincronizacao";
|
||||
tiposSituacoesElicencie["nao_conforme"] = "710_nao_conforme";
|
||||
tiposSituacoesElicencie["conforme"] = "720_conforme";
|
||||
tiposSituacoesElicencie["nao_aplicavel"] = "730_nao_aplicavel";
|
||||
tiposSituacoesElicencie["parcial"] = "715_parcial";
|
||||
})(tiposSituacoesElicencie || (tiposSituacoesElicencie = {}));
|
||||
6
dist-front/teste.js
Normal file
6
dist-front/teste.js
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
import { cacheM } from "./cacheMemoria";
|
||||
import { texto_busca } from "./texto_busca";
|
||||
// node dist-back/teste.mjs
|
||||
console.log("Variáveis funcionando", texto_busca);
|
||||
cacheM(1, { Jaca: Promise.resolve() });
|
||||
console.log("cache:", cacheM(1));
|
||||
2
dist-front/testes-de-variaveis/index.js
Normal file
2
dist-front/testes-de-variaveis/index.js
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
export * from "./umaFuncao";
|
||||
export * from "./umaVariavel";
|
||||
1
dist-front/testes-de-variaveis/umaFuncao.js
Normal file
1
dist-front/testes-de-variaveis/umaFuncao.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
export const umaFuncao = () => "Olá Mundo! (função)";
|
||||
1
dist-front/testes-de-variaveis/umaVariavel.js
Normal file
1
dist-front/testes-de-variaveis/umaVariavel.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
export const umaVariavel = "Olá Mundo! (variável)";
|
||||
21
dist-front/testes/TipagemRotas.test.js
Normal file
21
dist-front/testes/TipagemRotas.test.js
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import { describe, expect, it } from "vitest";
|
||||
import { TipagemRotas } from "../tipagemRotas";
|
||||
describe("TipagemRotas", () => {
|
||||
it("deve montar _partesCaminho a partir de string ou array, normalizando barras", () => {
|
||||
const r1 = new TipagemRotas({ caminho: "aplicacao/func" });
|
||||
expect(r1.caminho).toBe("/aplicacao/func");
|
||||
const r2 = new TipagemRotas({
|
||||
caminho: ["aplicacao", "func"],
|
||||
});
|
||||
expect(r2.caminho).toBe("/aplicacao/func");
|
||||
const r3 = new TipagemRotas({ caminho: "/a//b///c/" });
|
||||
expect(r3.caminho).toBe("/a/b/c");
|
||||
});
|
||||
it("Valores de entrada com mesmo valor dos valores de saída", () => {
|
||||
const r1 = new TipagemRotas({ caminho: "aplicacao/func" });
|
||||
const objetoEntrada = { idade: 21, nome: "João" };
|
||||
const rota = r1.endereco(objetoEntrada);
|
||||
const parametros = r1.parametros(rota);
|
||||
expect(parametros.nome).toBe(objetoEntrada.nome);
|
||||
});
|
||||
});
|
||||
10
dist-front/texto_busca.js
Normal file
10
dist-front/texto_busca.js
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/** gerar o texto de busca removendo caracteres especies e caixa alta */
|
||||
export const texto_busca = (...texto) => texto
|
||||
.map((txt) => txt === null || txt === undefined
|
||||
? ""
|
||||
: String(txt)
|
||||
.normalize("NFD")
|
||||
.replace(/[\u0300-\u036f]/g, "")
|
||||
.replace(/\s+/g, " ")
|
||||
.toLowerCase())
|
||||
.join(" ");
|
||||
104
dist-front/tipagemRotas.js
Normal file
104
dist-front/tipagemRotas.js
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/** Gerar uma classe que facilita a gestão de rotas com a tipagem das querys
|
||||
*
|
||||
* Definições:
|
||||
*
|
||||
* caminho = "/aplicacao/funcionalidade"
|
||||
*
|
||||
* endereco = "http://localhost:3000/aplicacao/funcionalidade"
|
||||
*
|
||||
* parametros = {nome:"José"}
|
||||
*/
|
||||
export class TipagemRotas {
|
||||
/** Ao criar novo obijeto de tipagem de rota é necessário passar o caminho parcial
|
||||
** export const mCaminho = new TipagemRotas<{q:string}>("aplicacao","funcionalidade")
|
||||
*/
|
||||
constructor({ caminho, acaoIr, rotulo, }) {
|
||||
this._partesCaminho = [];
|
||||
this._acaoIr = acaoIr;
|
||||
this._partesCaminho = (Array.isArray(caminho) ? caminho : [caminho])
|
||||
.filter(Boolean)
|
||||
.map((a) => String(a))
|
||||
.flatMap((a) => a.split("/"))
|
||||
.filter(Boolean);
|
||||
this.rotulo = rotulo;
|
||||
}
|
||||
/** Retorna o caminho completo da rota
|
||||
** console.log(mCaminho.caminho)
|
||||
** "/caminho"
|
||||
*/
|
||||
get caminho() {
|
||||
const ret = `/${this._partesCaminho.join("/")}`;
|
||||
return ret;
|
||||
}
|
||||
/** Define o caminho completo da rota
|
||||
** mCaminho.caminho = "/novoCaminho"
|
||||
** console.log(mCaminho.caminho)
|
||||
** "/novoCaminho"
|
||||
** */
|
||||
set caminho(caminhoParcial) {
|
||||
this._partesCaminho = caminhoParcial.split("/").filter((parte) => parte);
|
||||
}
|
||||
/** Retorna o caminho completo da rota com a query
|
||||
** console.log(mCaminho.resolve({q:"query"}))
|
||||
** "http://localhost:3000/caminho?q=query"
|
||||
*/
|
||||
endereco(query, usarComoHash) {
|
||||
const win = (typeof globalThis !== "undefined" && globalThis.window) || undefined;
|
||||
const url = new URL(win ? win.location.href : "http://localhost");
|
||||
url.pathname = this.caminho;
|
||||
url.search = "";
|
||||
const queryKeys = Object.entries(query);
|
||||
for (const [key, value] of queryKeys) {
|
||||
url.searchParams.set(String(key), JSON.stringify(value));
|
||||
}
|
||||
url.hash = "";
|
||||
if (usarComoHash) {
|
||||
url.hash = `#${url.search}`;
|
||||
url.search = "";
|
||||
}
|
||||
return url.href;
|
||||
}
|
||||
/** Vai para a url
|
||||
** mCaminho.ir({q:"query"})
|
||||
** window.location.href = "http://localhost:3000/caminho?q=query"
|
||||
*/
|
||||
ir(query) {
|
||||
if (this._acaoIr) {
|
||||
this._acaoIr(this.endereco({ ...query }));
|
||||
}
|
||||
else {
|
||||
const win = (typeof globalThis !== "undefined" && globalThis.window) || undefined;
|
||||
if (win) {
|
||||
win.location.href = this.endereco({ ...query });
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Retorna os parametros da url
|
||||
** console.log(mCaminho.parametros())
|
||||
** {q:"query"}
|
||||
*/
|
||||
parametros(urlEntrada) {
|
||||
const url = urlEntrada
|
||||
? new URL(urlEntrada)
|
||||
: new URL(typeof globalThis !== "undefined" && globalThis.window
|
||||
? globalThis.window.location.href
|
||||
: "http://localhost");
|
||||
const query = url.searchParams;
|
||||
let queryObj = Object.fromEntries(query.entries());
|
||||
// pegar hash
|
||||
const hash = url.hash;
|
||||
if (hash) {
|
||||
const hashObj = Object.fromEntries(new URLSearchParams(hash.slice(1)).entries());
|
||||
queryObj = { ...queryObj, ...hashObj };
|
||||
}
|
||||
for (const chave in queryObj) {
|
||||
try {
|
||||
queryObj[chave] = JSON.parse(queryObj[chave]);
|
||||
}
|
||||
catch {
|
||||
console.log(`[${chave}|${queryObj[chave]}] não é um json válido.`);
|
||||
}
|
||||
}
|
||||
return queryObj;
|
||||
}
|
||||
}
|
||||
61
dist-front/unidades_medida.js
Normal file
61
dist-front/unidades_medida.js
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
/**
|
||||
* Essa variável se conecta a tabela_lidades
|
||||
*
|
||||
* onde sigla se conecta com sigla
|
||||
*
|
||||
* Usuário terá mais opções de unidades, quando fazer o envio para o mtr, usar a opção fornecida pelo usuarios, caso não tenha
|
||||
* usar a normalizada
|
||||
*/
|
||||
export var siglas_unidades_medida;
|
||||
(function (siglas_unidades_medida) {
|
||||
siglas_unidades_medida["UN"] = "UN";
|
||||
siglas_unidades_medida["KG"] = "KG";
|
||||
siglas_unidades_medida["TON"] = "TON";
|
||||
siglas_unidades_medida["g"] = "g";
|
||||
siglas_unidades_medida["M\u00B3"] = "M\u00B3";
|
||||
siglas_unidades_medida["Lt"] = "Lt";
|
||||
})(siglas_unidades_medida || (siglas_unidades_medida = {}));
|
||||
export const unidades_medida = [
|
||||
{
|
||||
sigla_unidade: "KG",
|
||||
nome: "Quilograma",
|
||||
sigla_normalizada: "KG",
|
||||
normalizar: (valor) => valor,
|
||||
tipo: "massa",
|
||||
},
|
||||
{
|
||||
sigla_unidade: "g",
|
||||
nome: "Grama",
|
||||
sigla_normalizada: "KG",
|
||||
normalizar: (valor) => valor / 1000,
|
||||
tipo: "massa",
|
||||
},
|
||||
{
|
||||
sigla_unidade: "TON",
|
||||
nome: "Tonelada",
|
||||
sigla_normalizada: "KG",
|
||||
normalizar: (valor) => valor * 1000,
|
||||
tipo: "massa",
|
||||
},
|
||||
{
|
||||
sigla_unidade: "Lt",
|
||||
nome: "Litro",
|
||||
sigla_normalizada: "Lt",
|
||||
normalizar: (valor) => valor,
|
||||
tipo: "volume",
|
||||
},
|
||||
{
|
||||
sigla_unidade: "M³",
|
||||
nome: "Metro Cúbico",
|
||||
sigla_normalizada: "Lt",
|
||||
normalizar: (valor) => valor * 1000,
|
||||
tipo: "volume",
|
||||
},
|
||||
{
|
||||
sigla_unidade: "UN",
|
||||
nome: "Unidade",
|
||||
sigla_normalizada: "UN",
|
||||
normalizar: (valor) => valor,
|
||||
tipo: "unidade",
|
||||
},
|
||||
];
|
||||
45
dist-front/uuid.js
Normal file
45
dist-front/uuid.js
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import { NIL, v3, v4 } from "uuid";
|
||||
/**
|
||||
* Valida se uma string é um UUID válido (qualquer versão).
|
||||
*
|
||||
* @param valor - A string que será validada.
|
||||
* @returns booleano indicando se é um UUID válido.
|
||||
*/
|
||||
export const erUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
||||
export const validarUuid = (uuid) => {
|
||||
const retorno = erUuid.test(String(uuid || ""));
|
||||
return retorno;
|
||||
};
|
||||
/**
|
||||
* Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace).
|
||||
*
|
||||
* - Usa o algoritmo MD5 (RFC 4122).
|
||||
* - Sempre retorna o mesmo UUID para a mesma combinação chave + grupo.
|
||||
* - Caso o grupo não seja informado, usa o UUID "nil" como namespace.
|
||||
*
|
||||
* @param chave - Qualquer valor que será convertido em string para gerar o UUID (ex: número, string ou objeto).
|
||||
* @param grupo - Opcional. Namespace para separar domínios diferentes de UUIDs.
|
||||
* @returns UUID v3 (determinístico)
|
||||
*/
|
||||
export const uuidV3 = (chave, grupo) => {
|
||||
return v3(
|
||||
// Converte a chave para string (de forma segura)
|
||||
typeof chave === "string"
|
||||
? chave
|
||||
: typeof chave === "number"
|
||||
? String(chave)
|
||||
: JSON.stringify(chave),
|
||||
// Se um grupo foi fornecido, gera um UUID v3 recursivamente com base nele, senão usa NIL
|
||||
grupo ? uuidV3(grupo) : NIL);
|
||||
};
|
||||
/**
|
||||
* Gera um UUID v4 (aleatório, não determinístico).
|
||||
*
|
||||
* - Usado quando unicidade é necessária, mas não se exige que seja previsível.
|
||||
*/
|
||||
export const uuidV4 = v4;
|
||||
/**
|
||||
* @deprecated Esta variável será descontinuada em versões futuras.
|
||||
* Use a função `uuidV4()` diretamente.
|
||||
*/
|
||||
export const uuid = uuidV4;
|
||||
9
dist-front/variaveisComuns.js
Normal file
9
dist-front/variaveisComuns.js
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
export const esperar = (ms) => new Promise((resolve) => setTimeout(() => resolve(true), ms));
|
||||
/**
|
||||
* Usado para retronat o no de uma variável, deve ser usado dentro de um objeto
|
||||
* const nomex = {a: 1, b: 2}
|
||||
* nomeVariavel({nomex}) // retorna "nomex"
|
||||
* @param v
|
||||
* @returns
|
||||
*/
|
||||
export const nomeVariavel = (v) => Object.keys(v).join("/");
|
||||
11
dist-front/zCoordenadas.js
Normal file
11
dist-front/zCoordenadas.js
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/**
|
||||
* No futuro podemos melhorar este Zod para incluir mais formatos de coordenadas.
|
||||
*
|
||||
*/
|
||||
import z from "zod";
|
||||
export const zCoordenadas = z.object({
|
||||
formato: z.literal("decimal").default("decimal"),
|
||||
datum: z.literal("EPSG:4326").default("EPSG:4326"),
|
||||
latitude: z.number(),
|
||||
longitude: z.number(),
|
||||
});
|
||||
49
dist-front/zDocumento.js
Normal file
49
dist-front/zDocumento.js
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import z from "zod";
|
||||
/**
|
||||
Resumo – CNPJ Alfanumérico (vigência a partir de julho de 2026)
|
||||
|
||||
A Receita Federal passará a emitir CNPJs alfanuméricos para novas empresas a partir de julho de 2026. O objetivo é ampliar a quantidade de combinações disponíveis e evitar o esgotamento dos números atuais.
|
||||
|
||||
O que muda?
|
||||
O CNPJ continuará com 14 caracteres.
|
||||
Os 12 primeiros caracteres poderão conter letras (A-Z) e números (0-9).
|
||||
Os 2 dígitos verificadores finais continuarão sendo numéricos.
|
||||
Exemplo ilustrativo:
|
||||
Atual: 00.000.000/0001-00
|
||||
Novo: A1.B2C.3D4/EF56-78
|
||||
Quem será afetado?
|
||||
Empresas já existentes não terão seus CNPJs alterados.
|
||||
A mudança vale apenas para novas inscrições realizadas a partir de julho de 2026.
|
||||
*/
|
||||
const regexCnpjNumerico = /^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/;
|
||||
/**
|
||||
Como ler o novo CNPJ (estrutura)
|
||||
|
||||
Tomando como exemplo um CNPJ alfanumérico fictício:
|
||||
|
||||
12.ABC.345/0001-67
|
||||
|
||||
Como ler:
|
||||
|
||||
12.ABC.345 é a raiz (identificação da empresa)
|
||||
0001 é o sufixo (estabelecimento, geralmente “0001” para matriz)
|
||||
67 são os dígitos verificadores numéricos
|
||||
|
||||
Pontos de atenção:
|
||||
|
||||
Letras maiúsculas (não há diferenciação entre maiúscula e minúscula no sistema, mas convenção é maiúscula)
|
||||
Não usar caracteres especiais: só letras de A a Z e números de 0 a 9
|
||||
Pontos, barra e hífen mantidos como antes
|
||||
|
||||
*/
|
||||
const regexCnpjAlfanumerico = /^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[A-Z0-9]{4}-\d{2}$/i;
|
||||
const yyyymm = Number(new Date().toISOString().slice(0, 7).replace("-", ""));
|
||||
export const zDocCnpj = z
|
||||
.string()
|
||||
.regex(yyyymm < 202407 ? regexCnpjNumerico : regexCnpjAlfanumerico)
|
||||
.describe("Documento (CNPJ) no formato XX.XXX.XXX/XXXX-XX");
|
||||
export const zDocCpf = z
|
||||
.string()
|
||||
.regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/)
|
||||
.describe("Documento (CPF) no formato XXX.XXX.XXX-XX");
|
||||
export const zDocumento = zDocCpf.or(zDocCnpj).describe("CPF ou CNPJ");
|
||||
33
dist-front/zodCustomizados.js
Normal file
33
dist-front/zodCustomizados.js
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import z from "zod";
|
||||
const zPreprocessarNumero = (p) => {
|
||||
if (typeof p === "number")
|
||||
return p;
|
||||
if (typeof p !== "string")
|
||||
return p;
|
||||
let p2 = p;
|
||||
if (p2.includes(",")) {
|
||||
// ponto de milhar → remove; vírgula decimal → troca por ponto
|
||||
p2 = p2.replace(/\./g, "").replace(",", ".");
|
||||
}
|
||||
// remove tudo que não seja dígito ou ponto decimal
|
||||
p2 = p2.replace(/[^0-9.]/g, "");
|
||||
if (p2 == "")
|
||||
return null;
|
||||
return Number(p2);
|
||||
};
|
||||
/**
|
||||
* Schema numérico que aceita strings legadas e normaliza para `number`.
|
||||
*
|
||||
* O campo **é** um número. O `preprocess` resolve compatibilidade com dados
|
||||
* antigos onde o frontend enviava strings formatadas (BR ou monetária).
|
||||
*
|
||||
* Formatos de entrada aceitos:
|
||||
* - `10` → number direto
|
||||
* - `10.1` → ponto decimal
|
||||
* - `10,1` → vírgula decimal (BR)
|
||||
* - `1.000,1` → milhar com ponto + vírgula decimal (BR)
|
||||
* - `R$ 10,01` → prefixo monetário legado
|
||||
*/
|
||||
export const zNumero = z.preprocess(zPreprocessarNumero, z.number());
|
||||
export const zNumeroPositivo = z.preprocess(zPreprocessarNumero, z.number().positive());
|
||||
export const zNumeroInteiro = z.preprocess(zPreprocessarNumero, z.number().int());
|
||||
Loading…
Add table
Add a link
Reference in a new issue