Uma biblioteca Delphi/Lazarus para geração de dados fictícios brasileiros, ideal para preencher bancos de dados de teste ou demonstração. Pode ser utilizado em sistemas CRM, ERP etc.
- Recursos
- Instalação
- Como Usar
- Exemplos
- Documentação da API
- Métodos para Documentos
- Métodos para Dados Pessoais
- Métodos para Dados Empresariais e Financeiros
- Métodos para Endereços
- Métodos para Valores e Datas
- Métodos para Dados de Saúde
- Métodos para Dados Acadêmicos
- Métodos para Dados de Veículos
- Métodos para Dados de Produtos e E-commerce
- Métodos Utilitários
- Contribuindo
- Licença
Esta biblioteca oferece métodos para gerar diversos tipos de dados fictícios, incluindo:
- CPF com validação de dígitos verificadores
- CNPJ com validação de dígitos verificadores
- CNH (Carteira Nacional de Habilitação)
- RG (Registro Geral)
- Inscrição Estadual
- PIS/PASEP
- Título de Eleitor
- RENAVAM
- Placa de Veículo (padrão antigo e Mercosul)
- Nomes e sobrenomes (masculinos/femininos)
- Nomes completos
- Telefones fixos com DDD
- Telefones celulares com DDD
- Endereços de e-mail
- Razão Social
- Nome Fantasia
- Números de documentos fiscais
- Contas bancárias
- Cartões de crédito (Visa, Mastercard, Amex, Discover)
- Logradouros (Rua, Avenida, etc.)
- Número
- Complemento
- Bairro
- Cidade
- UF
- CEP formatado
- Datas aleatórias dentro de um intervalo
- Valores monetários
- Códigos de documentos comerciais
- Tipo sanguíneo (A+, A-, B+, B-, AB+, AB-, O+, O-)
- Altura (em centímetros)
- Peso (em quilogramas)
- Pressão arterial
- Medicamentos
- Especialidades médicas
- Planos de saúde
- Nome de instituições de ensino
- Nomes de cursos de graduação
- Áreas de formação acadêmica
- Números de matrículas acadêmicas
- Coeficientes de rendimento
- Datas de formatura
- Títulos de monografias ou trabalhos acadêmicos
- Marcas de veículos populares no Brasil
- Modelos específicos para cada marca
- Anos de fabricação com distribuição realista
- Números de chassi válidos
- Cores de veículos
- Tipos de combustível (Flex, Gasolina, Diesel, etc.)
- Quilometragem proporcional à idade do veículo
- Nomes de produtos por categoria
- Descrições detalhadas de produtos
- Categorias de produtos
- Preços com padrões realistas de mercado
- Descontos promocionais
- Códigos e identificadores de produtos
- Especificações físicas (peso e dimensões)
- Avaliações e comentários de clientes
- Níveis de estoque
- Status de pedidos e pagamentos
- Métodos de pagamento
- Cupons de desconto
- Números de pedido
- IDs de transação financeira
- Faça o download dos arquivos fonte ou clone este repositório
- Adicione o arquivo
FakeDataGenerator.pas
ao seu projeto Delphi/Lazarus - Adicione
FakeDataGenerator
na cláusulauses
de suas units
uses
..., FakeDataGenerator;
var
FakeData: TFakeDataGenerator;
begin
// Inicie a geração de números aleatórios
Randomize;
// Crie uma instância do gerador
FakeData := TFakeDataGenerator.Create;
try
// Gere e utilize os dados fictícios
ShowMessage('CPF: ' + FakeData.GerarCPF);
ShowMessage('Nome: ' + FakeData.GerarNomeCompleto);
ShowMessage('Email: ' + FakeData.GerarEmail(FakeData.GerarNomeCompleto));
finally
// Libere os recursos
FakeData.Free;
end;
end;
procedure PopularEmpresas(Quantidade: Integer);
var
FakeData: TFakeDataGenerator;
i: Integer;
RazaoSocial: string;
begin
FakeData := TFakeDataGenerator.Create;
try
for i := 1 to Quantidade do
begin
RazaoSocial := FakeData.GerarRazaoSocial;
qryEmpresas.Close;
qryEmpresas.SQL.Text := 'INSERT INTO EMPRESAS (RAZAO_SOCIAL, NOME_FANTASIA, CNPJ, ' +
'TELEFONE, EMAIL, ENDERECO, CIDADE, UF, CEP) ' +
'VALUES (:RAZAO, :FANTASIA, :CNPJ, :TEL, :EMAIL, ' +
':END, :CID, :UF, :CEP)';
qryEmpresas.ParamByName('RAZAO').AsString := RazaoSocial;
qryEmpresas.ParamByName('FANTASIA').AsString := FakeData.GerarNomeFantasia(RazaoSocial);
qryEmpresas.ParamByName('CNPJ').AsString := FakeData.GerarCNPJ;
qryEmpresas.ParamByName('TEL').AsString := FakeData.GerarTelefone;
qryEmpresas.ParamByName('EMAIL').AsString := FakeData.GerarEmail(RazaoSocial);
qryEmpresas.ParamByName('END').AsString :=
FakeData.GerarLogradouro + ', ' + FakeData.GerarNumero;
qryEmpresas.ParamByName('CID').AsString := FakeData.GerarCidade;
qryEmpresas.ParamByName('UF').AsString := FakeData.GerarUF;
qryEmpresas.ParamByName('CEP').AsString := FakeData.GerarCEP;
qryEmpresas.ExecSQL;
end;
finally
FakeData.Free;
end;
end;
procedure GerarContasReceber(IDEmpresa, IDPessoa: Integer; Quantidade: Integer);
var
FakeData: TFakeDataGenerator;
i: Integer;
DataVencimento: TDateTime;
begin
FakeData := TFakeDataGenerator.Create;
try
for i := 1 to Quantidade do
begin
// Gera uma data de vencimento nos próximos 60 dias
DataVencimento := FakeData.GerarData(Date, Date + 60);
qryContasReceber.Close;
qryContasReceber.SQL.Text :=
'INSERT INTO CONTAS_RECEBER (ID_EMPRESA, ID_PESSOA, DOCUMENTO, ' +
'EMISSAO, VENCIMENTO, VALOR, DESCRICAO, SITUACAO) ' +
'VALUES (:EMPRESA, :PESSOA, :DOC, :EMISSAO, :VENC, :VALOR, :DESC, :SIT)';
qryContasReceber.ParamByName('EMPRESA').AsInteger := IDEmpresa;
qryContasReceber.ParamByName('PESSOA').AsInteger := IDPessoa;
qryContasReceber.ParamByName('DOC').AsString := FakeData.GerarDocumento;
qryContasReceber.ParamByName('EMISSAO').AsDate := Date;
qryContasReceber.ParamByName('VENC').AsDate := DataVencimento;
qryContasReceber.ParamByName('VALOR').AsFloat := FakeData.GerarValor(100, 5000);
qryContasReceber.ParamByName('DESC').AsString := 'Venda de mercadorias';
qryContasReceber.ParamByName('SIT').AsString := 'P'; // Pendente
qryContasReceber.ExecSQL;
end;
finally
FakeData.Free;
end;
end;
procedure PopularProntuarios(Quantidade: Integer);
var
FakeData: TFakeDataGenerator;
i: Integer;
IDPessoa: Integer;
begin
FakeData := TFakeDataGenerator.Create;
try
for i := 1 to Quantidade do
begin
// Obter pessoa aleatória do banco de dados
qryPessoas.Close;
qryPessoas.Open;
qryPessoas.First;
qryPessoas.MoveBy(Random(qryPessoas.RecordCount));
IDPessoa := qryPessoas.FieldByName('ID').AsInteger;
qryProntuarios.Close;
qryProntuarios.SQL.Text :=
'INSERT INTO PRONTUARIOS (ID_PESSOA, TIPO_SANGUINEO, ALTURA, ' +
'PESO, PRESSAO_ARTERIAL, ULTIMA_ATUALIZACAO) ' +
'VALUES (:PESSOA, :TIPO_SANG, :ALTURA, :PESO, :PRESSAO, :DATA)';
qryProntuarios.ParamByName('PESSOA').AsInteger := IDPessoa;
qryProntuarios.ParamByName('TIPO_SANG').AsString := FakeData.GerarTipoSanguineo;
qryProntuarios.ParamByName('ALTURA').AsInteger := FakeData.GerarAltura;
qryProntuarios.ParamByName('PESO').AsFloat := FakeData.GerarPeso;
qryProntuarios.ParamByName('PRESSAO').AsString := FakeData.GerarPressaoArterial;
qryProntuarios.ParamByName('DATA').AsDateTime := Now;
qryProntuarios.ExecSQL;
end;
finally
FakeData.Free;
end;
end;
procedure PopularVeiculos(Quantidade: Integer);
var
FakeData: TFakeDataGenerator;
i: Integer;
IDPessoa: Integer;
Marca: string;
Modelo: string;
AnoFabricacao: Integer;
begin
FakeData := TFakeDataGenerator.Create;
try
for i := 1 to Quantidade do
begin
// Obter pessoa aleatória do banco de dados
qryPessoas.Close;
qryPessoas.Open;
qryPessoas.First;
qryPessoas.MoveBy(Random(qryPessoas.RecordCount));
IDPessoa := qryPessoas.FieldByName('ID').AsInteger;
// Gerar dados do veículo
Marca := FakeData.GerarMarcaVeiculo;
Modelo := FakeData.GerarModeloVeiculo(Marca);
AnoFabricacao := FakeData.GerarAnoVeiculo;
qryVeiculos.Close;
qryVeiculos.SQL.Text :=
'INSERT INTO VEICULOS (ID_PROPRIETARIO, MARCA, MODELO, ANO_FABRICACAO, ' +
'ANO_MODELO, CHASSI, COR, COMBUSTIVEL, PLACA, RENAVAM, QUILOMETRAGEM) ' +
'VALUES (:PROP, :MARCA, :MODELO, :ANOFAB, :ANOMOD, :CHASSI, :COR, ' +
':COMB, :PLACA, :RENAVAM, :KM)';
qryVeiculos.ParamByName('PROP').AsInteger := IDPessoa;
qryVeiculos.ParamByName('MARCA').AsString := Marca;
qryVeiculos.ParamByName('MODELO').AsString := Modelo;
qryVeiculos.ParamByName('ANOFAB').AsInteger := AnoFabricacao;
qryVeiculos.ParamByName('ANOMOD').AsInteger := AnoFabricacao + Random(2); // Ano modelo pode ser igual ou até 1 ano mais recente
qryVeiculos.ParamByName('CHASSI').AsString := FakeData.GerarChassi;
qryVeiculos.ParamByName('COR').AsString := FakeData.GerarCor;
qryVeiculos.ParamByName('COMB').AsString := FakeData.GerarTipoCombustivel;
qryVeiculos.ParamByName('PLACA').AsString := FakeData.GerarPlacaVeiculo(Random(2) = 1); // 50% chance de usar placa Mercosul
qryVeiculos.ParamByName('RENAVAM').AsString := FakeData.GerarRENAVAM;
qryVeiculos.ParamByName('KM').AsInteger := FakeData.GerarQuilometragem(AnoFabricacao);
qryVeiculos.ExecSQL;
end;
finally
FakeData.Free;
end;
end;
procedure PopularProdutos(Quantidade: Integer);
var
FakeData: TFakeDataGenerator;
i: Integer;
Categoria: string;
NomeProduto: string;
begin
FakeData := TFakeDataGenerator.Create;
try
for i := 1 to Quantidade do
begin
// Gerar dados básicos do produto
Categoria := FakeData.GerarCategoriaProduto;
NomeProduto := FakeData.GerarNomeProduto(Categoria);
qryProdutos.Close;
qryProdutos.SQL.Text :=
'INSERT INTO PRODUTOS_ECOMMERCE (CODIGO, NOME, DESCRICAO, CATEGORIA, ' +
'PRECO_VENDA, PERCENTUAL_DESCONTO, ESTOQUE_ATUAL, PESO, DIMENSOES) ' +
'VALUES (:COD, :NOME, :DESC, :CAT, :PRECO, :DESC_PERC, :ESTOQUE, :PESO, :DIM)';
qryProdutos.ParamByName('COD').AsString := FakeData.GerarCodigoProduto;
qryProdutos.ParamByName('NOME').AsString := NomeProduto;
qryProdutos.ParamByName('DESC').AsString := FakeData.GerarDescricaoProduto(NomeProduto);
qryProdutos.ParamByName('CAT').AsString := Categoria;
qryProdutos.ParamByName('PRECO').AsFloat := FakeData.GerarPrecoProduto(50, 1500);
qryProdutos.ParamByName('DESC_PERC').AsInteger := FakeData.GerarDescontoProduto;
qryProdutos.ParamByName('ESTOQUE').AsInteger := FakeData.GerarEstoqueProduto;
qryProdutos.ParamByName('PESO').AsInteger := FakeData.GerarPesoProduto;
qryProdutos.ParamByName('DIM').AsString := FakeData.GerarDimensoesProduto;
qryProdutos.ExecSQL;
// Adiciona algumas avaliações para este produto
AdicionarAvaliacoesProduto(qryProdutos.LastInsertID, 1 + Random(5));
end;
finally
FakeData.Free;
end;
end;
procedure AdicionarAvaliacoesProduto(IDProduto: Integer; Quantidade: Integer);
var
FakeData: TFakeDataGenerator;
i, IDCliente, Avaliacao: Integer;
Positivo: Boolean;
begin
FakeData := TFakeDataGenerator.Create;
try
for i := 1 to Quantidade do
begin
// Obter cliente aleatório do banco de dados
qryClientes.Close;
qryClientes.Open;
qryClientes.First;
qryClientes.MoveBy(Random(qryClientes.RecordCount));
IDCliente := qryClientes.FieldByName('ID').AsInteger;
// Gerar avaliação com maior tendência a ser positiva (mais realista)
Avaliacao := FakeData.GerarAvaliacaoProduto;
Positivo := Avaliacao >= 4; // 4 ou 5 estrelas são consideradas positivas
qryAvaliacoes.Close;
qryAvaliacoes.SQL.Text :=
'INSERT INTO AVALIACOES_PRODUTO (ID_PRODUTO, ID_CLIENTE, AVALIACAO, ' +
'COMENTARIO, DATA_AVALIACAO) ' +
'VALUES (:PROD, :CLI, :AVAL, :COMENT, :DATA)';
qryAvaliacoes.ParamByName('PROD').AsInteger := IDProduto;
qryAvaliacoes.ParamByName('CLI').AsInteger := IDCliente;
qryAvaliacoes.ParamByName('AVAL').AsInteger := Avaliacao;
qryAvaliacoes.ParamByName('COMENT').AsString := FakeData.GerarComentarioProduto(Positivo);
qryAvaliacoes.ParamByName('DATA').AsDateTime := FakeData.GerarData(IncDay(Date, -30), Date);
qryAvaliacoes.ExecSQL;
end;
finally
FakeData.Free;
end;
end;
// Gera um CPF válido. Se Formatado = True, retorna no formato XXX.XXX.XXX-XX.
function GerarCPF(Formatado: Boolean = True): string;
// Gera um CNPJ válido. Se Formatado = True, retorna no formato XX.XXX.XXX/XXXX-XX.
function GerarCNPJ(Formatado: Boolean = True): string;
// Gera um número de CNH fictício.
function GerarCNH: string;
// Gera uma inscrição estadual para a UF informada.
function GerarInscricaoEstadual(UF: string): string;
// Gera um número PIS/PASEP válido. Se Formatado = True, retorna no formato XXX.XXXXX.XX-X.
function GerarPIS(Formatado: Boolean = True): string;
// Gera um número de RG válido. Se Formatado = True, retorna no formato XX.XXX.XXX-X.
function GerarRG(Formatado: Boolean = True): string;
// Gera um número RENAVAM válido.
function GerarRENAVAM: string;
// Gera um número de título de eleitor. Se Formatado = True, inclui espaços entre os grupos.
function GerarTituloEleitor(Formatado: Boolean = True): string;
// Gera uma placa de veículo. Se Mercosul = True, usa o padrão Mercosul (ABC1D23).
function GerarPlacaVeiculo(Mercosul: Boolean = False): string;
// Gera um nome (primeiro nome) aleatório.
function GerarNome(Feminino: Boolean = False): string;
// Gera um nome completo (nome + sobrenomes) aleatório.
function GerarNomeCompleto(Feminino: Boolean = False): string;
// Gera um número de telefone fixo com DDD.
function GerarTelefone(Formatado: Boolean = True): string;
// Gera um número de celular com DDD, iniciando com 9.
function GerarCelular(Formatado: Boolean = True): string;
// Gera um endereço de e-mail baseado no nome fornecido.
function GerarEmail(const Nome: string): string;
// Gera uma data de nascimento com idade entre IdadeMinima e IdadeMaxima.
function GerarDataNascimento(IdadeMinima: Integer = 18; IdadeMaxima: Integer = 80): TDateTime;
// Gera um perfil de rede social com base no nome.
function GerarPerfilRedeSocial(const Nome: string; RedeSocial: string = 'instagram'): string;
// Gera um estado civil aleatório.
function GerarEstadoCivil: string;
// Gera uma profissão aleatória.
function GerarProfissao: string;
// Gera um nível de escolaridade aleatório.
function GerarEscolaridade: string;
// Gera uma razão social para empresa.
function GerarRazaoSocial: string;
// Gera um nome fantasia baseado na razão social.
function GerarNomeFantasia(const RazaoSocial: string): string;
// Gera um número de documento fiscal ou comercial.
function GerarDocumento: string;
// Gera um número de cartão de crédito válido. Bandeira pode ser: V (Visa), M (Mastercard), A (Amex), D (Discover).
function GerarCartaoCredito(Bandeira: string = ''): string;
// Gera dados de conta bancária. Banco pode ser especificado ou deixado em branco para seleção aleatória.
function GerarContaBancaria(Banco: string = ''; Formatado: Boolean = True): string;
// Gera um código CNAE para atividade empresarial.
function GerarCNAE(Formatado: Boolean = True): string;
// Gera um número de inscrição municipal.
function GerarInscricaoMunicipal(Municipio: string = ''): string;
// Gera um nome de departamento empresarial.
function GerarDepartamento: string;
// Gera um cargo profissional.
function GerarCargo: string;
// Gera uma chave PIX de acordo com o tipo especificado.
function GerarChavePIX(TipoChave: string = 'aleatoria'): string;
// Gera um logradouro aleatório (tipo + nome da rua).
function GerarLogradouro: string;
// Gera um número para endereço.
function GerarNumero: string;
// Gera um complemento de endereço (pode retornar vazio).
function GerarComplemento: string;
// Gera um nome de bairro.
function GerarBairro: string;
// Gera um nome de cidade.
function GerarCidade: string;
// Gera uma sigla de estado (UF).
function GerarUF: string;
// Gera um CEP. Se Formatado = True, retorna no formato XXXXX-XXX.
function GerarCEP(Formatado: Boolean = True): string;
// Gera uma data aleatória entre DataInicial e DataFinal.
function GerarData(DataInicial, DataFinal: TDateTime): TDateTime;
// Gera um valor aleatório entre ValorMinimo e ValorMaximo.
function GerarValor(ValorMinimo, ValorMaximo: Double): Double;
// Gera um código de barras para boleto.
function GerarCodigoBarrasBoleto(Banco: string = ''): string;
// Gera uma linha digitável para boleto.
function GerarLinhaDigitavelBoleto(Banco: string = ''): string;
// Gera um código de rastreio para encomendas.
function GerarCodigoRastreio: string;
// Gera uma alíquota de imposto do tipo especificado.
function GerarAliquotaImposto(TipoImposto: string = 'ICMS'): Double;
// Gera um número de nota fiscal.
function GerarNotaFiscal(UF: string = ''): string;
// Gera um tipo sanguíneo (A+, A-, B+, B-, AB+, AB-, O+, O-).
function GerarTipoSanguineo: string;
// Gera uma altura em centímetros entre Min e Max.
function GerarAltura(Min: Integer = 150; Max: Integer = 200): Integer;
// Gera um peso em quilogramas entre Min e Max.
function GerarPeso(Min: Integer = 50; Max: Integer = 120): Double;
// Gera uma pressão arterial no formato "120/80 mmHg".
function GerarPressaoArterial: string;
// Gera um nome de medicamento comum.
function GerarMedicamento: string;
// Gera uma especialidade médica.
function GerarEspecialidadeMedica: string;
// Gera um nome de plano de saúde.
function GerarPlanoSaude: string;
// Gera um nome de instituição de ensino aleatório.
function GerarNomeInstituicaoEnsino: string;
// Gera um nome de curso de graduação aleatório.
function GerarCursoGraduacao: string;
// Gera uma área de formação acadêmica aleatória.
function GerarAreaFormacao: string;
// Gera um número de matrícula acadêmica no formato AAANNNNND (AA=ano, NNNNN=sequencial, D=dígito verificador).
function GerarMatriculaAcademica: string;
// Gera um coeficiente de rendimento (CR) entre 0 e 10 com distribuição mais realista.
function GerarCoeficienteRendimento: Double; // 0 a 10
// Gera uma data de formatura com base no ano de início do curso.
function GerarDataFormatura(AnoInicio: Integer = 0): TDateTime;
// Gera um título de monografia ou trabalho acadêmico.
function GerarTituloMonografia: string;
// Gera uma marca de veículo popular no Brasil.
function GerarMarcaVeiculo: string;
// Gera um modelo compatível com a marca especificada. Se a marca for vazia, escolhe aleatoriamente.
function GerarModeloVeiculo(const Marca: string = ''): string;
// Gera um ano de fabricação com distribuição realista (mais veículos novos). Limita a idade máxima.
function GerarAnoVeiculo(IdadeMaxima: Integer = 20): Integer;
// Gera um número de chassi no formato padrão de 17 caracteres.
function GerarChassi: string;
// Gera uma cor de veículo.
function GerarCor: string;
// Gera um tipo de combustível com distribuição baseada na frota brasileira.
function GerarTipoCombustivel: string;
// Gera uma quilometragem plausível baseada na idade do veículo.
function GerarQuilometragem(AnoVeiculo: Integer): Integer;
// Gera um nome de produto baseado na categoria informada. Se a categoria for vazia, escolhe aleatoriamente.
function GerarNomeProduto(Categoria: string = ''): string;
// Gera uma descrição detalhada para o produto. TamanhoDescricao controla a quantidade de parágrafos.
function GerarDescricaoProduto(const NomeProduto: string; TamanhoDescricao: Integer = 2): string;
// Gera uma categoria de produto aleatória (Eletrônicos, Moda, Alimentos, etc.).
function GerarCategoriaProduto: string;
// Gera um preço de produto com distribuição realista, preferencialmente terminando em ,90 ou ,99.
function GerarPrecoProduto(ValorMinimo: Double = 10.0; ValorMaximo: Double = 2000.0): Double;
// Gera um percentual de desconto comum no varejo (5%, 10%, 15%, 20%, etc.).
function GerarDescontoProduto(DescontoMaximo: Integer = 50): Integer;
// Gera um código interno de produto no formato XX-NNNNNN.
function GerarCodigoProduto: string;
// Gera um peso para o produto em gramas.
function GerarPesoProduto(PesoMinimo: Integer = 100; PesoMaximo: Integer = 10000): Integer;
// Gera dimensões para o produto no formato AxLxP (altura x largura x profundidade).
function GerarDimensoesProduto: string;
// Gera uma avaliação de produto (1 a 5 estrelas) com distribuição realista.
function GerarAvaliacaoProduto: Integer;
// Gera um comentário de produto. Se Positivo=True, retorna um comentário elogioso.
function GerarComentarioProduto(Positivo: Boolean = True): string;
// Gera uma quantidade de estoque para o produto.
function GerarEstoqueProduto(EstoqueMinimo: Integer = 0; EstoqueMaximo: Integer = 500): Integer;
// Gera um status de pedido (Em Processamento, Enviado, Entregue, Cancelado, etc.).
function GerarStatusPedido: string;
// Gera um status de pagamento (Pendente, Aprovado, Recusado, Estornado, etc.).
function GerarStatusPagamento: string;
// Gera um método de pagamento (Cartão de Crédito, Boleto, PIX, etc.).
function GerarMetodoPagamento: string;
// Gera um código de cupom de desconto promocional.
function GerarCupomDesconto(Prefixo: string = ''): string;
// Gera um número de pedido no formato comercial (AANNNNNN - ano + sequencial).
function GerarNumeroPedido: string;
// Gera um ID de transação usado em gateways de pagamento (formato alfanumérico).
function GerarIDTransacao: string;
// Remove todos os caracteres não-numéricos de uma string.
function ApenasNumeros(const Str: string): string;
// Calcula dígito verificador usando o algoritmo de módulo 11.
function GerarDigitosModulo11(const Digits: string; Peso: Integer): string;
// Calcula os dígitos verificadores do CPF.
function GerarDigitosCPF(const Digits: string): string;
// Calcula os dígitos verificadores do CNPJ.
function GerarDigitosCNPJ(const Digits: string): string;
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou enviar pull requests com melhorias, correções ou novas funcionalidades.
Faça um fork deste repositório Crie uma branch para sua feature (git checkout -b feature/nova-funcionalidade) Faça commit das suas alterações (git commit -m 'Adiciona nova funcionalidade') Faça push para a branch (git push origin feature/nova-funcionalidade) Abra um Pull Request
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
Desenvolvido para facilitar a criação de ambientes de teste e demonstração em sistemas de gestão empresarial.