first commit

This commit is contained in:
rodrigo committed 2025-04-10 23:07:21 -03:00
commit c9fb67e751
423 files changed
+53287

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
export function classNames(...classes: string[]) {
return classes.filter(Boolean).join(' ');
}
+33
View File
@@ -0,0 +1,33 @@
export const ORGAOS_EMISSORES = [
{ value: "SSP", label: "SSP - Secretaria de Segurança Pública" },
{ value: "PC", label: "PC - Polícia Civil" },
{ value: "DIC", label: "DIC - Diretoria de Identificação Civil" },
{ value: "DETRAN", label: "DETRAN - Departamento de Trânsito" },
{ value: "PM", label: "PM - Polícia Militar" },
{ value: "CNT", label: "CNT - Carteira Nacional de Habilitação" },
{ value: "DPF", label: "DPF - Departamento de Polícia Federal" },
{ value: "IFP", label: "IFP - Instituto Félix Pacheco" },
{ value: "IPF", label: "IPF - Instituto Pereira Faustino" },
{ value: "IML", label: "IML - Instituto Médico-Legal" },
{ value: "MTE", label: "MTE - Ministério do Trabalho e Emprego" },
{ value: "MEX", label: "MEX - Ministério do Exército" },
{ value: "MM", label: "MM - Ministério da Marinha" },
{ value: "MAE", label: "MAE - Ministério da Aeronáutica" },
];
export const PREVIDENCIA_OPTIONS = [
{ value: "NAO_CONTRIBUI", label: "Não Contribui" },
{ value: "RGPS", label: "RGPS (INSS)" },
{ value: "RPPS", label: "RPPS (Servidor Público)" },
];
export const ASSUNTOS_CNJ = [
{
codigo: "864",
descricao:
"Direito Previdenciário - Benefícios em Espécie - Aposentadoria por Invalidez",
},
{ codigo: "1209", descricao: "Direito Civil - Família - Alimentos" },
{ codigo: "10538", descricao: "Direito Civil - Contratos - Bancários" },
// Adicionar mais assuntos conforme necessário...
];
+20
View File
@@ -0,0 +1,20 @@
export const DATAJUD_URLS = {
STF: "https://api-publica.datajud.cnj.jus.br/api_publica_stf/_search",
STJ: "https://api-publica.datajud.cnj.jus.br/api_publica_stj/_search",
TST: "https://api-publica.datajud.cnj.jus.br/api_publica_tst/_search",
// Tribunais Federais
TRF1: "https://api-publica.datajud.cnj.jus.br/api_publica_trf1/_search",
TRF2: "https://api-publica.datajud.cnj.jus.br/api_publica_trf2/_search",
TRF3: "https://api-publica.datajud.cnj.jus.br/api_publica_trf3/_search",
TRF4: "https://api-publica.datajud.cnj.jus.br/api_publica_trf4/_search",
TRF5: "https://api-publica.datajud.cnj.jus.br/api_publica_trf5/_search",
TRF6: "https://api-publica.datajud.cnj.jus.br/api_publica_trf6/_search",
// Exemplo de TJ (adicionar os demais conforme necessário)
TJTO: "https://api-publica.datajud.cnj.jus.br/api_publica_tjto/_search",
TJGO: "https://api-publica.datajud.cnj.jus.br/api_publica_tjgo/_search",
TJPA: "https://api-publica.datajud.cnj.jus.br/api_publica_tjpa/_search",
TJAC: "https://api-publica.datajud.cnj.jus.br/api_publica_tjac/_search",
TJAM: "https://api-publica.datajud.cnj.jus.br/api_publica_tjam/_search",
TJAP: "https://api-publica.datajud.cnj.jus.br/api_publica_tjap/_search",
TJBA: "https://api-publica.datajud.cnj.jus.br/api_publica_tjba/_search",
};
+29
View File
@@ -0,0 +1,29 @@
export const UF_BRASIL = [
{ value: "AC", label: "Acre" },
{ value: "AL", label: "Alagoas" },
{ value: "AP", label: "Amapá" },
{ value: "AM", label: "Amazonas" },
{ value: "BA", label: "Bahia" },
{ value: "CE", label: "Ceará" },
{ value: "DF", label: "Distrito Federal" },
{ value: "ES", label: "Espírito Santo" },
{ value: "GO", label: "Goiás" },
{ value: "MA", label: "Maranhão" },
{ value: "MT", label: "Mato Grosso" },
{ value: "MS", label: "Mato Grosso do Sul" },
{ value: "MG", label: "Minas Gerais" },
{ value: "PA", label: "Pará" },
{ value: "PB", label: "Paraíba" },
{ value: "PR", label: "Paraná" },
{ value: "PE", label: "Pernambuco" },
{ value: "PI", label: "Piauí" },
{ value: "RJ", label: "Rio de Janeiro" },
{ value: "RN", label: "Rio Grande do Norte" },
{ value: "RS", label: "Rio Grande do Sul" },
{ value: "RO", label: "Rondônia" },
{ value: "RR", label: "Roraima" },
{ value: "SC", label: "Santa Catarina" },
{ value: "SP", label: "São Paulo" },
{ value: "SE", label: "Sergipe" },
{ value: "TO", label: "Tocantins" },
];
+21
View File
@@ -0,0 +1,21 @@
import {
HomeIcon,
ScaleIcon,
UserGroupIcon,
UserIcon,
ClipboardDocumentCheckIcon,
DocumentTextIcon,
UsersIcon,
} from "@heroicons/react/24/outline";
export const Icons = {
DashboardIcon: HomeIcon,
ProcessIcon: ScaleIcon,
ClientsIcon: UserGroupIcon,
AtendimentoIcon: UserIcon,
TaskIcon: ClipboardDocumentCheckIcon,
DocumentIcon: DocumentTextIcon,
UsersIcon: UsersIcon,
} as const;
export type IconType = keyof typeof Icons;
+35
View File
@@ -0,0 +1,35 @@
export const DashboardIcon = ({ className }: { className?: string }) => (
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z" />
</svg>
);
export const ProcessIcon = ({ className }: { className?: string }) => (
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
);
export const ClientsIcon = ({ className }: { className?: string }) => (
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z" />
</svg>
);
export const DeadlineIcon = ({ className }: { className?: string }) => (
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
);
export const UsersIcon = ({ className }: { className?: string }) => (
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
</svg>
);
export const AtendimentoIcon = ({ className }: { className?: string }) => (
<svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z" />
</svg>
);
+187
View File
@@ -0,0 +1,187 @@
export const UF_BRASIL = [
{ value: "SUPERIOR", label: "Tribunais Superiores" },
{ value: "AC", label: "Acre" },
{ value: "AL", label: "Alagoas" },
{ value: "AP", label: "Amapá" },
{ value: "AM", label: "Amazonas" },
{ value: "BA", label: "Bahia" },
{ value: "CE", label: "Ceará" },
{ value: "DF", label: "Distrito Federal" },
{ value: "ES", label: "Espírito Santo" },
{ value: "GO", label: "Goiás" },
{ value: "MA", label: "Maranhão" },
{ value: "MT", label: "Mato Grosso" },
{ value: "MS", label: "Mato Grosso do Sul" },
{ value: "MG", label: "Minas Gerais" },
{ value: "PA", label: "Pará" },
{ value: "PB", label: "Paraíba" },
{ value: "PR", label: "Paraná" },
{ value: "PE", label: "Pernambuco" },
{ value: "PI", label: "Piauí" },
{ value: "RJ", label: "Rio de Janeiro" },
{ value: "RN", label: "Rio Grande do Norte" },
{ value: "RS", label: "Rio Grande do Sul" },
{ value: "RO", label: "Rondônia" },
{ value: "RR", label: "Roraima" },
{ value: "SC", label: "Santa Catarina" },
{ value: "SP", label: "São Paulo" },
{ value: "SE", label: "Sergipe" },
{ value: "TO", label: "Tocantins" },
];
export const TRIBUNAIS = {
SUPERIOR: [
{ value: "STF", label: "Supremo Tribunal Federal" },
{ value: "STJ", label: "Superior Tribunal de Justiça" },
{ value: "TST", label: "Tribunal Superior do Trabalho" },
{ value: "TSE", label: "Tribunal Superior Eleitoral" },
{ value: "STM", label: "Superior Tribunal Militar" },
{ value: "CJF", label: "Conselho da Justiça Federal" },
{ value: "CSJT", label: "Conselho Superior da Justiça do Trabalho" },
],
// Região Norte
AC: [
{ value: "TJAC", label: "Tribunal de Justiça do Acre" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT14", label: "Tribunal Regional do Trabalho da 14ª Região" },
{ value: "TRE_AC", label: "Tribunal Regional Eleitoral do Acre" },
{ value: "SEEU_AC", label: "SEEU - Acre" },
],
AM: [
{ value: "TJAM", label: "Tribunal de Justiça do Amazonas" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT11", label: "Tribunal Regional do Trabalho da 11ª Região" },
{ value: "TRE_AM", label: "Tribunal Regional Eleitoral do Amazonas" },
],
AP: [
{ value: "TJAP", label: "Tribunal de Justiça do Amapá" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT8", label: "Tribunal Regional do Trabalho da 8ª Região" },
{ value: "TRE_AP", label: "Tribunal Regional Eleitoral do Amapá" },
],
PA: [
{ value: "TJPA", label: "Tribunal de Justiça do Pará" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT8", label: "Tribunal Regional do Trabalho da 8ª Região" },
{ value: "TRE_PA", label: "Tribunal Regional Eleitoral do Pará" },
],
RO: [
{ value: "TJRO", label: "Tribunal de Justiça de Rondônia" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT14", label: "Tribunal Regional do Trabalho da 14ª Região" },
{ value: "TRE_RO", label: "Tribunal Regional Eleitoral de Rondônia" },
],
RR: [
{ value: "TJRR", label: "Tribunal de Justiça de Roraima" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT11", label: "Tribunal Regional do Trabalho da 11ª Região" },
{ value: "TRE_RR", label: "Tribunal Regional Eleitoral de Roraima" },
],
TO: [
{ value: "TJTO", label: "Tribunal de Justiça do Tocantins" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT10", label: "Tribunal Regional do Trabalho da 10ª Região" },
{ value: "TRE_TO", label: "Tribunal Regional Eleitoral do Tocantins" },
{ value: "SEEU_TO", label: "SEEU - Tocantins" },
],
// Região Nordeste
AL: [
{ value: "TJAL", label: "Tribunal de Justiça de Alagoas" },
{ value: "TRF5", label: "Tribunal Regional Federal da 5ª Região" },
{ value: "TRT19", label: "Tribunal Regional do Trabalho da 19ª Região" },
{ value: "TRE_AL", label: "Tribunal Regional Eleitoral de Alagoas" },
],
BA: [
{ value: "TJBA", label: "Tribunal de Justiça da Bahia" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT5", label: "Tribunal Regional do Trabalho da 5ª Região" },
{ value: "TRE_BA", label: "Tribunal Regional Eleitoral da Bahia" },
],
CE: [
{ value: "TJCE", label: "Tribunal de Justiça do Ceará" },
{ value: "TRF5", label: "Tribunal Regional Federal da 5ª Região" },
{ value: "TRT7", label: "Tribunal Regional do Trabalho da 7ª Região" },
{ value: "TRE_CE", label: "Tribunal Regional Eleitoral do Ceará" },
],
MA: [
{ value: "TJMA", label: "Tribunal de Justiça do Maranhão" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT16", label: "Tribunal Regional do Trabalho da 16ª Região" },
{ value: "TRE_MA", label: "Tribunal Regional Eleitoral do Maranhão" },
],
PB: [
{ value: "TJPB", label: "Tribunal de Justiça da Paraíba" },
{ value: "TRF5", label: "Tribunal Regional Federal da 5ª Região" },
{ value: "TRT13", label: "Tribunal Regional do Trabalho da 13ª Região" },
{ value: "TRE_PB", label: "Tribunal Regional Eleitoral da Paraíba" },
],
PE: [
{ value: "TJPE", label: "Tribunal de Justiça de Pernambuco" },
{ value: "TRF5", label: "Tribunal Regional Federal da 5ª Região" },
{ value: "TRT6", label: "Tribunal Regional do Trabalho da 6ª Região" },
{ value: "TRE_PE", label: "Tribunal Regional Eleitoral de Pernambuco" },
],
PI: [
{ value: "TJPI", label: "Tribunal de Justiça do Piauí" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT22", label: "Tribunal Regional do Trabalho da 22ª Região" },
{ value: "TRE_PI", label: "Tribunal Regional Eleitoral do Piauí" },
],
// Centro-Oeste
GO: [
{ value: "TJGO", label: "Tribunal de Justiça de Goiás" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT18", label: "Tribunal Regional do Trabalho da 18ª Região" },
{ value: "TRE_GO", label: "Tribunal Regional Eleitoral de Goiás" },
{ value: "SEEU_GO", label: "SEEU - Goiás" },
],
MT: [
{ value: "TJMT", label: "Tribunal de Justiça do Mato Grosso" },
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT23", label: "Tribunal Regional do Trabalho da 23ª Região" },
{ value: "TRE_MT", label: "Tribunal Regional Eleitoral do Mato Grosso" },
{ value: "SEEU_MT", label: "SEEU - Mato Grosso" },
],
MS: [
{ value: "TJMS", label: "Tribunal de Justiça do Mato Grosso do Sul" },
{ value: "TRF3", label: "Tribunal Regional Federal da 3ª Região" },
{ value: "TRT24", label: "Tribunal Regional do Trabalho da 24ª Região" },
{
value: "TRE_MS",
label: "Tribunal Regional Eleitoral do Mato Grosso do Sul",
},
{ value: "SEEU_MS", label: "SEEU - Mato Grosso do Sul" },
],
DF: [
{
value: "TJDFT",
label: "Tribunal de Justiça do Distrito Federal e Territórios",
},
{ value: "TRF1", label: "Tribunal Regional Federal da 1ª Região" },
{ value: "TRT10", label: "Tribunal Regional do Trabalho da 10ª Região" },
{
value: "TRE_DF",
label: "Tribunal Regional Eleitoral do Distrito Federal",
},
{ value: "SEEU_DF", label: "SEEU - Distrito Federal" },
],
// Sudeste
SP: [
{ value: "TJSP", label: "Tribunal de Justiça de São Paulo" },
{ value: "TRF3", label: "Tribunal Regional Federal da 3ª Região" },
{ value: "TRT2", label: "Tribunal Regional do Trabalho da 2ª Região" },
{ value: "TRT15", label: "Tribunal Regional do Trabalho da 15ª Região" },
{ value: "TRE_SP", label: "Tribunal Regional Eleitoral de São Paulo" },
{ value: "SEEU_SP", label: "SEEU - São Paulo" },
],
RJ: [
{ value: "TJRJ", label: "Tribunal de Justiça do Rio de Janeiro" },
{ value: "TRF2", label: "Tribunal Regional Federal da 2ª Região" },
{ value: "TRT1", label: "Tribunal Regional do Trabalho da 1ª Região" },
{ value: "TRE_RJ", label: "Tribunal Regional Eleitoral do Rio de Janeiro" },
{ value: "SEEU_RJ", label: "SEEU - Rio de Janeiro" },
],
};
+202
View File
@@ -0,0 +1,202 @@
export const TIPOS_DOCUMENTO = {
PROCURACAO: 'PROCURACAO',
CONTRATO: 'CONTRATO',
DECLARACAO: 'DECLARACAO',
PETICAO: 'PETICAO',
OUTROS: 'OUTROS'
} as const;
// Template base para todos os documentos
const TEMPLATE_BASE = `
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; }
.header { text-align: center; margin-bottom: 30px; }
.footer { text-align: center; margin-top: 50px; font-size: 12px; }
.content { margin: 20px 40px; }
.signature { margin-top: 50px; text-align: center; }
</style>
</head>
<body>
<div class="header">
{{cabecalho}}
</div>
<div class="content">
{{conteudo}}
</div>
<div class="footer">
{{rodape}}
</div>
</body>
</html>
`;
// Exemplo de template de procuração
const TEMPLATE_PROCURACAO = `
<h1>PROCURAÇÃO</h1>
<p><strong>OUTORGANTE:</strong> {{cliente.nome}}, {{cliente.nacionalidade}}, {{cliente.estadoCivil}},
portador(a) do RG nº {{cliente.rg}}, CPF nº {{cliente.cpf}}, residente em {{cliente.endereco}}.</p>
<p><strong>OUTORGADO:</strong> {{advogado.nome}}, inscrito na OAB/{{advogado.oabUF}} sob nº {{advogado.oab}}.</p>
<p>Pelo presente instrumento particular de procuração, o(a) outorgante nomeia e constitui seu(sua)
bastante procurador(a) o(a) outorgado(a) acima qualificado(a), conferindo-lhe os poderes da
cláusula "ad judicia"...</p>
<div class="signature">
{{cidade}}, {{data}}
<br><br>
____________________________________<br>
{{cliente.nome}}
</div>
`;
export const documentTemplates = {
base: TEMPLATE_BASE,
templates: {
[TIPOS_DOCUMENTO.PROCURACAO]: TEMPLATE_PROCURACAO,
// Adicionar outros templates aqui
}
};
export const templates = {
PROCURACAO: {
nome: "Procuração Ad Judicia",
html: `
<div class="procuracao">
<h1 class="text-center text-2xl font-bold mb-8">PROCURAÇÃO AD JUDICIA</h1>
<p class="text-justify mb-4">
<strong>OUTORGANTE:</strong> {{cliente.nome}}, {{cliente.nacionalidade}}, {{cliente.estadoCivil}},
portador(a) do RG nº {{cliente.rg}}, inscrito(a) no CPF sob nº {{cliente.cpf}},
residente e domiciliado(a) na {{cliente.endereco}}, {{cliente.numero}}, {{cliente.bairro}},
{{cliente.cidade}}/{{cliente.estado}}, CEP {{cliente.cep}}.
</p>
<p class="text-justify mb-4">
<strong>OUTORGADOS:</strong> {{advogado.nome}}, advogado(a) inscrito(a) na OAB/{{advogado.oabUF}}
sob nº {{advogado.oab}}, com escritório profissional na {{escritorio.endereco}}.
</p>
<p class="text-justify mb-8">
Por este instrumento particular de mandato, o(a) outorgante nomeia e constitui seu(sua) bastante
procurador(a) o(a) outorgado(a), conferindo-lhe os poderes da cláusula "ad judicia" para o foro
em geral, podendo propor contra quem de direito as ações competentes e defendê-lo(a) nas contrárias,
seguindo umas e outras, até final decisão, usando os recursos legais e acompanhando-os, conferindo-lhe,
ainda, poderes especiais para confessar, desistir, transigir, firmar compromissos ou acordos,
receber e dar quitação.
</p>
<p class="text-right mb-8">
{{cidade}}, {{dataExtenso}}
</p>
<div class="text-center mb-4">
____________________________________<br>
{{cliente.nome}}
</div>
</div>
`,
variaveis: [
"cliente.nome", "cliente.nacionalidade", "cliente.estadoCivil", "cliente.rg",
"cliente.cpf", "cliente.endereco", "cliente.numero", "cliente.bairro",
"cliente.cidade", "cliente.estado", "cliente.cep", "advogado.nome",
"advogado.oab", "advogado.oabUF", "escritorio.endereco", "cidade",
"dataExtenso"
]
},
CONTRATO_HONORARIOS: {
nome: "Contrato de Honorários",
html: `
<div class="contrato">
<h1 class="text-center text-2xl font-bold mb-8">CONTRATO DE HONORÁRIOS ADVOCATÍCIOS</h1>
<p class="text-justify mb-4">
<strong>CONTRATANTE:</strong> {{cliente.nome}}, {{cliente.nacionalidade}}, {{cliente.estadoCivil}},
portador(a) do RG nº {{cliente.rg}}, inscrito(a) no CPF sob nº {{cliente.cpf}},
residente e domiciliado(a) na {{cliente.endereco}}, {{cliente.numero}}, {{cliente.bairro}},
{{cliente.cidade}}/{{cliente.estado}}, CEP {{cliente.cep}}.
</p>
<p class="text-justify mb-4">
<strong>CONTRATADO:</strong> {{advogado.nome}}, advogado(a) inscrito(a) na OAB/{{advogado.oabUF}}
sob nº {{advogado.oab}}, com escritório profissional na {{escritorio.endereco}}.
</p>
<h2 class="font-bold mb-2">CLÁUSULA PRIMEIRA - DO OBJETO</h2>
<p class="text-justify mb-4">
O presente contrato tem por objeto a prestação de serviços advocatícios para {{objeto}}.
</p>
<h2 class="font-bold mb-2">CLÁUSULA SEGUNDA - DOS HONORÁRIOS</h2>
<p class="text-justify mb-4">
Pelos serviços prestados, o CONTRATANTE pagará ao CONTRATADO o valor de {{honorarios.valor}}
a título de honorários advocatícios, nas seguintes condições: {{honorarios.condicoes}}.
</p>
<p class="text-right mt-8">
{{cidade}}, {{dataExtenso}}
</p>
<div class="mt-12 grid grid-cols-2 gap-8">
<div class="text-center">
____________________________________<br>
<strong>CONTRATANTE</strong><br>
{{cliente.nome}}
</div>
<div class="text-center">
____________________________________<br>
<strong>CONTRATADO</strong><br>
{{advogado.nome}}<br>
OAB/{{advogado.oabUF}} {{advogado.oab}}
</div>
</div>
</div>
`,
variaveis: [
"cliente.nome", "cliente.nacionalidade", "cliente.estadoCivil", "cliente.rg",
"cliente.cpf", "cliente.endereco", "cliente.numero", "cliente.bairro",
"cliente.cidade", "cliente.estado", "cliente.cep", "advogado.nome",
"advogado.oab", "advogado.oabUF", "escritorio.endereco", "cidade",
"dataExtenso", "objeto", "honorarios.valor", "honorarios.condicoes"
]
},
DECLARACAO: {
nome: "Declaração",
html: `
<div class="declaracao">
<h1 class="text-center text-2xl font-bold mb-8">DECLARAÇÃO</h1>
<p class="text-justify mb-8">
Eu, {{cliente.nome}}, {{cliente.nacionalidade}}, {{cliente.estadoCivil}},
portador(a) do RG nº {{cliente.rg}}, inscrito(a) no CPF sob nº {{cliente.cpf}},
residente e domiciliado(a) na {{cliente.endereco}}, {{cliente.numero}}, {{cliente.bairro}},
{{cliente.cidade}}/{{cliente.estado}}, CEP {{cliente.cep}}, DECLARO, para os devidos fins que
{{conteudoDeclaracao}}.
</p>
<p class="text-right mb-8">
{{cidade}}, {{dataExtenso}}
</p>
<div class="text-center">
____________________________________<br>
{{cliente.nome}}<br>
CPF: {{cliente.cpf}}
</div>
</div>
`,
variaveis: [
"cliente.nome", "cliente.nacionalidade", "cliente.estadoCivil", "cliente.rg",
"cliente.cpf", "cliente.endereco", "cliente.numero", "cliente.bairro",
"cliente.cidade", "cliente.estado", "cliente.cep", "advogado.nome",
"advogado.oab", "advogado.oabUF", "escritorio.endereco", "cidade",
"dataExtenso", "conteudoDeclaracao"
]
}
};
+43
View File
@@ -0,0 +1,43 @@
export const DOCUMENT_VARIABLES = {
CLIENTE: {
NOME: '{{cliente.nome}}',
CPF: '{{cliente.cpf}}', // Usar cpf como alias para cpfCnpj
CPF_CNPJ: '{{cliente.cpfCnpj}}', // Manter opção com nome original
RG: '{{cliente.rg}}',
ENDERECO_COMPLETO: '{{cliente.enderecoCompleto}}',
NOME_PAI: '{{cliente.nomePai}}',
NOME_MAE: '{{cliente.nomeMae}}',
ESTADO_CIVIL: '{{cliente.estadoCivil}}',
PROFISSAO: '{{cliente.profissao}}',
NACIONALIDADE: '{{cliente.nacionalidade}}',
},
ATENDIMENTO: {
PROTOCOLO: '{{atendimento.protocolo}}',
DATA: '{{atendimento.data}}',
TITULO: '{{atendimento.titulo}}',
},
PROCESSO: {
NUMERO: '{{processo.numero}}',
VARA: '{{processo.vara}}',
TRIBUNAL: '{{processo.tribunal}}',
},
ADVOGADO: {
NOME: '{{advogado.nome}}',
OAB: '{{advogado.oab}}',
OAB_UF: '{{advogado.oabUF}}',
},
ESCRITORIO: {
NOME: '{{escritorio.nome}}',
ENDERECO: '{{escritorio.endereco}}',
TELEFONE: '{{escritorio.telefone}}',
EMAIL: '{{escritorio.email}}',
},
DATA: {
ATUAL: '{{data.atual}}',
ATUAL_EXTENSO: '{{data.atualExtenso}}',
DIA: '{{data.dia}}',
MES: '{{data.mes}}',
MES_EXTENSO: '{{data.mesExtenso}}',
ANO: '{{data.ano}}'
}
} as const;
+43
View File
@@ -0,0 +1,43 @@
export const configuracaoEscritorio = {
cabecalhoHtml: `
<div style="text-align: center; padding: 20px;">
<img src="{{logoUrl}}" alt="Logo do Escritório" style="max-height: 60px; margin-bottom: 10px;">
<div style="font-size: 20px; font-weight: bold; color: #1a365d;">{{escritorio.nome}}</div>
<div style="font-size: 14px; color: #4a5568;">
{{escritorio.endereco}} - {{escritorio.cidade}}/{{escritorio.estado}}<br>
Tel: {{escritorio.telefone}} | E-mail: {{escritorio.email}}
</div>
</div>
`,
rodapeHtml: `
<div style="text-align: center; font-size: 12px; color: #4a5568; padding: 10px; border-top: 1px solid #e2e8f0;">
{{escritorio.nome}} | CNPJ: {{escritorio.cnpj}}<br>
{{escritorio.endereco}} - {{escritorio.cidade}}/{{escritorio.estado}} - CEP: {{escritorio.cep}}<br>
Tel: {{escritorio.telefone}} | E-mail: {{escritorio.email}} | Website: {{escritorio.website}}
</div>
`,
variaveis: {
escritorio: {
nome: "Martins e Vieira Advocacia",
cnpj: "XX.XXX.XXX/0001-XX",
endereco: "Rua Principal, 123",
cidade: "São Paulo",
estado: "SP",
cep: "01234-567",
telefone: "(11) 1234-5678",
email: "contato@martinsevieira.adv.br",
website: "www.martinsevieira.adv.br"
},
logoUrl: "/assets/logo.png"
}
};
export const preencherTemplate = (template: string, variaveis: Record<string, any>): string => {
let resultado = template;
const regex = /\{\{([\w.]+)\}\}/g;
return resultado.replace(regex, (match, path) => {
const valor = path.split('.').reduce((obj: any, key: string) => obj?.[key], variaveis);
return valor !== undefined ? valor : match;
});
};
+50
View File
@@ -0,0 +1,50 @@
import { jsPDF } from 'jspdf';
import 'jspdf-autotable';
import { format } from 'date-fns';
import { ptBR } from 'date-fns/locale';
interface ExportOptions {
titulo: string;
subtitulo?: string;
dados: any[];
colunas: {
header: string;
dataKey: string;
format?: (value: any) => string;
}[];
}
export const exportToPDF = ({ titulo, subtitulo, dados, colunas }: ExportOptions) => {
const doc = new jsPDF();
const dataAtual = format(new Date(), "dd 'de' MMMM 'de' yyyy", { locale: ptBR });
// Cabeçalho
doc.setFontSize(16);
doc.text(titulo, 14, 15);
if (subtitulo) {
doc.setFontSize(12);
doc.text(subtitulo, 14, 25);
}
doc.setFontSize(10);
doc.text(`Gerado em: ${dataAtual}`, 14, subtitulo ? 35 : 25);
// Tabela
(doc as any).autoTable({
startY: subtitulo ? 40 : 30,
head: [colunas.map(col => col.header)],
body: dados.map(row =>
colunas.map(col => {
const value = row[col.dataKey];
return col.format ? col.format(value) : value;
})
),
theme: 'striped',
headStyles: { fillColor: [59, 130, 246] },
styles: { fontSize: 8 },
});
// Salvar
doc.save(`${titulo.toLowerCase().replace(/\s+/g, '_')}_${format(new Date(), 'yyyyMMdd')}.pdf`);
};
+12
View File
@@ -0,0 +1,12 @@
export const formatCurrency = (value: number | null | undefined): string => {
if (value == null) return "R$ 0,00";
return new Intl.NumberFormat("pt-BR", {
style: "currency",
currency: "BRL",
}).format(value);
};
export const formatDate = (date: Date | string | null | undefined): string => {
if (!date) return "-";
return new Date(date).toLocaleDateString("pt-BR");
};
+158
View File
@@ -0,0 +1,158 @@
export const formatCPF = (cpf: string) => {
if (!cpf) return "Não informado";
const cleaned = cpf.replace(/\D/g, "");
return cleaned.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4");
};
export const formatTelefone = (telefone: string) => {
const cleaned = telefone.replace(/\D/g, "");
if (cleaned.length === 11) {
return cleaned.replace(/(\d{2})(\d{5})(\d{4})/, "($1) $2-$3");
}
return cleaned.replace(/(\d{2})(\d{4})(\d{4})/, "($1) $2-$3");
};
export const formatNome = (nome: string) => {
return nome.toUpperCase();
};
export const formatMoeda = (valor: number | null | undefined): string => {
if (!valor) return "Não informado";
return new Intl.NumberFormat("pt-BR", {
style: "currency",
currency: "BRL",
}).format(valor);
};
export const formatEmail = (email: string | undefined): string => {
if (!email) return "Não informado";
return email.toLowerCase();
};
export const formatTextoSimples = (
texto: string | undefined | null,
): string => {
if (!texto) return "Não informado";
return texto;
};
export const formatCampoObrigatorio = (
texto: string | undefined | null,
): string => {
if (!texto) return "Não preenchido";
return texto;
};
export const formatData = (data: string | Date | null | undefined): string => {
if (!data) return "Não informado";
const date = new Date(data);
// Ajusta o timezone para evitar o problema do dia anterior
date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
return date.toLocaleDateString("pt-BR", {
day: "2-digit",
month: "2-digit",
year: "numeric",
timeZone: "UTC",
});
};
export const formatNumeroProcesso = (numero: string): string => {
const cleaned = numero.replace(/\D/g, "");
return cleaned.replace(
/(\d{7})(\d{2})(\d{4})(\d{3})(\d{4})/,
"$1-$2.$3.$4.$5",
);
};
export const validaNumeroProcesso = (numero: string): boolean => {
const pattern = /^\d{7}-\d{2}\.\d{4}\.\d{3}\.\d{4}$/;
return pattern.test(numero);
};
export const formatCurrency = (value: number): string => {
return new Intl.NumberFormat('pt-BR', {
style: 'currency',
currency: 'BRL'
}).format(value);
};
// Função para formatar um valor para moeda (R$)
export const formatarMoeda = (valor: string | number): string => {
// Se for string vazia, retorna vazia
if (valor === '') return '';
// Converter para número
let numero: number;
if (typeof valor === 'string') {
// Substituir vírgula por ponto para processamento
numero = parseFloat(valor.replace(/\./g, '').replace(',', '.'));
} else {
numero = valor;
}
// Se não for um número válido, retorna vazio
if (isNaN(numero)) return '';
// Formatar o número como moeda brasileira
return numero.toLocaleString('pt-BR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
});
};
// Função para converter uma string formatada como moeda para número
export const parseMoeda = (valor: string): number => {
if (!valor) return 0;
// Remover símbolos de moeda e pontos de milhar, substituir vírgula por ponto
const numeroStr = valor.replace(/[^\d,.-]/g, '').replace('.', '').replace(',', '.');
return parseFloat(numeroStr);
};
// Função para formatar um valor como percentual
export const formatarPercentual = (valor: string | number): string => {
// Se for string vazia, retorna vazia
if (valor === '') return '';
// Converter para número
let numero: number;
if (typeof valor === 'string') {
// Remover o símbolo de % e substituir vírgula por ponto
numero = parseFloat(valor.replace('%', '').replace(/\./g, '').replace(',', '.'));
} else {
numero = valor;
}
// Se não for um número válido, retorna vazio
if (isNaN(numero)) return '';
// Formatar o número como percentual brasileiro
return numero.toLocaleString('pt-BR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}) + '%';
};
// Função para converter uma string formatada como percentual para número decimal
export const parsePercentual = (valor: string): number => {
if (!valor) return 0;
// Remover símbolo de percentual, pontos de milhar, substituir vírgula por ponto
const numeroStr = valor.replace(/%/g, '').replace(/\./g, '').replace(',', '.');
const percentual = parseFloat(numeroStr);
// Converter para decimal (ex: 30% -> 0.3)
return percentual / 100;
};
// Função para formatar uma data no padrão brasileiro
export const formatarData = (data: Date | string): string => {
if (!data) return '';
const dataObj = data instanceof Date ? data : new Date(data);
// Verificar se é uma data válida
if (isNaN(dataObj.getTime())) return '';
return dataObj.toLocaleDateString('pt-BR');
};