Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

paulo_roll

[Resolvido] Gerar Nosso Número no PHP

Recommended Posts

Boa tarde, pessoal.

 

Costumo enviar boleto para os meus clientes de carteira não registrada,

portanto o controle do nosso numero fica a meu criterio.

 

Até poderia gerar por ID, mas algum cliente pode pegar a manha e saber quantos

boletos estou emitindo então prefiro criar algum padrão tipo

 

O nosso número do Itaú são 8 dígitos, pensei em fazer:

 

11500004

Número 4 do boleto enviado para o cliente. O proximo boleto então seria "5"

 

O 15 indica o ID do cliente no meu banco de dados

 

Indica se é primeira via, se fosse 2 mostraria que é segunda via

 

 

O que vocês acham desse formato? Alguém usa de alguma forma diferente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É sempre uma boa padronizar o uso. Mas perceba que, inserindo caracteres de conferencia (id do cliente, número da via) você perde o propósito inicial de 8 caracteres, que é possuir uma quantidade "absurda" de números possíveis. Com as suas alterações, você limitou para 99.999. Se você possuir uma grande quantidade de boletos gerados, futuramente vai ter um sério problema.

Vou demonstrar meu caso de uso.

 

Instituição de ensino com cursos diversos. Era utilizado Santander, não me recordo exatamente o padrão do nosso número (quantidade de dígitos). O último registro de títulos que eu verfiquei, no final do ano passando, chegavam na casa dos 400 mil. Sem contar segundas vias, que o título é sempre o mesmo. Logo, no seu padrão, começariam a se repetir dígitos.

 

Mas você me diz que os números só irão possuir uma contagem dentro de um ID, certo?

 

Seria algo assim.

 

ID 15;

1500001

1500002

1500003

 

ID 16:

1600001

1600002

1600003

 

Voltando ao meu caso de uso. 28 mil inscritos até dezembro/2011. Logo:

ID 28000 + 00001

Já extrapola o número de 8 dígitos. Você não tem como prever se, por cliente, existirão no máximo 9, 99, 999 ou 999.999 títulos. Ou se seu sistema possuirá um número limitado de clientes. Caso você queira vender sua solução, estará vendendo um futuro problema.

 

Não utilize números identificadores no nosso número. O nosso número, por si só, é um identificador. Quando você buscar por esse identificador na sua base, ai sim, terá que na mesma tupla(mais parece um palavrão/xingamento.... LOL) os dados referentes ao cliente (ID, data emissão, número da via) e os seus respectivos lançamentos.

 

Caso você queira omitir um número sequencial que indique o número do boleto emitido. Crie um algoritmo que, gere números únicos, sempre se baseando no que já existe. Entretanto, você pode ter um problema de processamento quando gerar dígitos já existentes. O que eu não aconselharia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então não vou fazer dessa forma não Gabriel.

Poderia dizer que formato você utiliza? há Algum exemplo de algoritimo

para gerar isso?

 

Tipo eu poderia usar numeros sequenciais mesmo, mas como alguma função

equivalente ao base64_encode, só que com número para camuflar.

 

Assim no meu banco de dados estaria sempre gerando na ordem 1,2,3,4

e o script codificaria o numero e o cliente não perceberia que esta na ordem.

Tem alguma função no php tipo o base64_encode só que para numeros?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os primeiros boletos foram gerados por um sistema terceirizado de gestão acadêmica (SAGU). Se não me engano, era sequencial. Após, quando foi desenvolvido um próprio, foi utilizado o mesmo algorítimo. Para esse caso, não havia necessidade de omitir ser um número sequencial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O boleto é para eu poder cobrar a mensalidade dos meus clientes.

Pensei em algo assim...

 

Dia da Emissão + ID do Boleto(autonumeração)

 

Assim se o proximo boleto for de numero 23 e a data que gerei for dia 15 ficaria:

 

00001523

 

boleto numero 50 e a data de emissao dia 06

 

00005006

 

boleto numero 127 e a data 06 de novo

 

00012706

 

boleto numero 128 e a data emissao do dia 06 de novo

 

00012806

 

ou seja, nesse numero acima temos o boleto 128, o 06 é uma data do dia so para

mascarar a auto numeração.

 

Resumindo:

Vai ser incrementado, sendo que os 2 ultimos digitos vao pegar a data (somente o dia) da emissao

para despistar de uma perceção de auto incrementação.

 

Há chances de repetir?

 

eu sei que vou estar limitando a 999999 de boletos, mas é para enviar

para meus clientes, pois eu além do design me responsabilizo pelo host

e ainda lucro com isso. Não tenho muitos clientes, é conta pessoa física

e trabalho em casa.

 

999999 da auto numeração + 00 da data(dia que foi emitido)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara supondo o seguinte BD

ID

cliente

Nosso_numero

 

vou fazer um pseudo codigo:

Func geranumero{

$N1 = rand(0,9)

$N2 = rand(0,9)

$N3 = rand(0,9)

$N4 = rand(0,9)

$N5 = rand(0,9)

$N6 = rand(0,9)

$N7 = rand(0,9)

$N8 = rand(0,9)

$Numero = $N1 & .... & $N9

if $busca_num == 0 {

geraboleto()

associar_numero_cliente()

}

else{

geranumero()

}

Entendeu a logica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, Raphael.

 

Eu estava pensando em usar rand(10000000, 99999999) que me daria 8 dígitos, mas

a sua lógica é melhor pois vai pegar os números abaixo de 10000000 e deixando já o

0 na frente.

 

Depois de gerar o rand, vou verificar no meu banco de dados se existe algum id com esse

número, se tiver tenta outro número e se não tiver atribui ao cliente selecionado e

insere as informações como data de vencimento, emissao, etc... quando eu fizer a programação

eu posto aqui, era mais pra pegar a lógica mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera consegui fazer essa solução assim

 

while ($row = mysql_fetch_row($executa)){

$N1 = rand(0,9);

$N2 = rand(0,9);

$N3 = rand(0,9);

$N4 = rand(0,9);

$N5 = rand(0,9);

$N6 = rand(0,9);

$N7 = rand(0,9);

$N8 = rand(0,9);

 

$id_boleto = $N1.$N2.$N3.$N4.$N5.$N6.$N7.$N8;

}

 

Essa solução me atende. Antes desse while tem um gera $id boleto idententico.

Esse loop verifica se há registros iguais, se tiver cria outro.

 

A longo prazo para grandes empresas essa lógica não seria ideal. Uma empresa que emite

milhoes de boletos teria uma considerável perda de desempenho no servidor com

inúmeros whiles batendo com numero repetidos até encontrar um numero disponivel.

 

Uma solução que imagino que não dê dor de cabeça e ao mesmo tempo "camuflaria" meu

a ordem do id do boleto, seria fazer uma formatação de traz pra frente.

 

Exemplo:

 

00000183 ficaria 38100000 ou 00000381 (Não defini se os zeros ficarão antes ou depois)

00000184 ficaria 48100000 ou 00000481

00000185 ficaria 58100000 ou 00000581

 

Acredito que essa solução evitaria registros duplicados e ainda eu teria um

id com auto increment. Alguém consegue enxergar algum problema técnico nessa solução?

Tanto a nível de servidor quanto de registros duplicados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.