Você está despedido!

2 06 2009

Você é diretor de uma indústria de geladeiras. O mercado vai de vento em popa e a diretoria decidiu duplicar o tamanho da fábrica. No meio da construção, os economistas americanos prevêem uma recessão, com grande alarde na imprensa. A diretoria da empresa, já com um fluxo de caixa apertado, decide, pelo sim, pelo não, economizar 20 milhões de dólares. Sua missão é determinar onde e como realizar esse corte nas despesas.
Esse é o resumo de um dos muitos estudos de caso que tive para resolver no mestrado de administração, que me marcou e merece ser relatado. O professor chamou um colega ao lado para começar a discussão. O primeiro tem sempre a obrigação de trazer à tona as questões mais relevantes, apontar as variáveis críticas, separar o joio do trigo e apresentar um início de solução.
“Antes de mais nada, eu mandaria embora 620 funcionários não essenciais, economizando 12.200.000,00 dólares. Postergaria, por seis meses os gastos com propaganda, porque nossa marca é muito forte. Cancelaria nossos programas de treinamento por um ano, já que estaremos em compasso de espera. Finalmente, cortaria 95% de nossos projetos sociais, afinal nossa sobrevivência vem em primeiro lugar”. É exatamente isso que as empresas brasileiras estão fazendo neste momento, muitas até premiadas por sua “responsabilidade social”.
Terminada a exposição, o professor se dirigiu ao meu colega e disse:
- Levante-se e saia da sala.
- Desculpe, professor, eu não entendi - disse John, meio aflito.
- Eu disse para sair desta sala e nunca mais voltar. Eu disse: PARA FORA! Nunca mais ponha os pés aqui em Harvard.
Ficamos todos boquiabertos e com os cabelos em pé.
Nem um suspiro. Meu colega começou a soluçar e, cabisbaixo, se preparou para deixar a sala. O silêncio era sepulcral.
Quando estava prestes a sair, o professor fez seu último comentário:
- Agora vocês sabem o que é ser despedido. Ser despedido sem mostrar nenhuma deficiência ou incompetência, mas simplesmente porque um bando de prima-donas em Washington meteu medo em todo mundo. Nunca mais na vida despeçam funcionários como primeira opção. Despedir gente é sempre a última alternativa.
Aquela aula foi uma lição e tanto. É fácil despedir 620 funcionários como se fossem simples linhas de uma planilha eletrônica, sem ter de olhar cara a cara para as pessoas demitidas. É fácil sair nos jornais prevendo o fim da economia ou aumentar as taxas de juros para 25% quando não é você quem tem de despedir milhares de funcionários nem pagar pelas conseqüências. Economistas, pelo jeito, nunca chegam a estudar casos como esse nos cursos de política monetária.
Se você decidiu reduzir seus gastos familiares “só para se garantir”, também estará despedindo pessoas e gerando uma recessão. Se todas as empresas e famílias cortarem seus gastos a cada previsão de crise, criaremos crises de fato, com mais desemprego e mais recessão. A solução para crises é reservas e poupança, poupança previamente acumulada.
O correto é poupar e fazer reservas públicas e privadas, nos anos de vacas gordas para não ter de despedir pessoas nem reduzir gastos nos anos de vacas magras, conselho milenar. Poupar e fazer caixa no meio da crise é dar um tiro no pé. Demitir funcionários contratados a dedo, talentos do presente e do futuro, é suicídio.
Se todos constituíssem reservas, inclusive o governo, ninguém precisaria ficar apavorado, e manteríamos o padrão de vida, sem cortar despesas. Se a crise for maior que as reservas, aí não terá jeito, a não ser apertar o cinto, sem esquecer aquela memorável lição: na hora de reduzir custos, os seres humanos vêm em último lugar.
Stephen Kanitz
Artigo Publicado na Revista Veja, edição 1726, ano 34, nº45, 14 de Novembro de 2001.

O texto de Stephen Kanitz tem uma profundidade que transcende à área dos negócios e das empresas. Quando falamos em “despedir”, em “demitir”, não devemos considerar apenas a dispensa de algum funcionário. Analisemos o nosso dia-a-dia. Quantos sonhos são “despedidos”? Quantas oportunidades são “despedidas” apenas por termos medo ou nos julgarmos incapazes? Quantas tarefas “despedimos” para executar amanhã? Quanto bem “despedimos” em prol dos que nos cercam? O que você “despediu” hoje?



Nosso planeta… nossos filhos…

1 06 2009

Recebi há pouco por e-mail uma pergunta. Dizam que a pergunta havia sido a vencedora em um congresso sobre vida sustentável. E não duvido que tenha sido mesmo, pelo teor e profundidade que a mesma nos faz refletir. Contribuição da amiga Franceli.

Todo mundo “pensando” em deixar um planeta melhor para nossos filhos… Quando é que “pensarão” em deixar filhos melhores para o nosso planeta?



Qual o valor de X?

29 05 2009

0 -> 11-> 34 -> 40 -> 64 -> 82 -> 120 -> 133 -> 134 -> 147 -> 176 -> 183 -> 188 -> 193 -> 195 -> X.

Qual o valor de X?

Talvez esta seja uma fórmula complicada de entender, mas não é nenhum enigma secreto que não seja compreendido. Uma compilação de final de tarde de sexta-feira para deixar água na boca dos curiosos e um sorriso aos que conhecem estes números. Não é uma seqüência de Fibonacci (aquela é muito interessante) mas essa tem uma lógica um pouco diferente. A única coisa que eu ainda não sei é o valor do X. Se alguém souber por favor me avise pois estou à procura deste valor.



Queria Tanto Você

28 05 2009

Essa é uma canção que também chegou até mim num momento que eu já não precisava mais. Na composição de Daniel Chaves e interpretada pelo grupo P.R.I.D.E. temos uma letra perfeita para algo ao além.

Queria Tanto Você

Eu queria que a vida me desse a chance de tocar você
E que em todos os meus sonhos eu pudesse até ouvir a tua voz
Eu queria que um anjo me desse asas pra eu te ver do céu
E que os caminhos desse mundo me guiassem só pra te encontrar

Mas, é impossível; é só ilusão
São só esperanças mas, é tão bom sonhar com você

Eu queria que o tempo parasse toda vez que eu penso em nós dois
E que nas horas mais difíceis você viesse só pra me consolar
Eu queria que agora eu estivesse dentro de você
Pra saber o que você sente, pra saber o que você pensa de mim



Wish You Were Here

27 05 2009

Essa letra de Bee Gess foi profunda o suficiente para dizer o que eu precisava. Basta ao futuro colorir com sua aquarela a história que hoje apenas está como uma impossibilidade para o amanhã.

Wish You Were Here

You’re living your life
In somebody else’s heart
My love is as strong
As oceans are far apart

A summer song keeps playing in my brain
And I feel you and I see your face again
There’s no escape, I lost everything in losing you

Ahh, I wish you were here
Dryin’ these tears I cry
They were good times
And I wish you were here
Calling my name
But you’re dealing with a man insane the cost
How hopelessly I’m lost
I tried to throw your love away
But I can’t let go

And so I awake
In somebody else’s dreams
(It’s not what it seems) it’s only a lie
I’ve yet to decide who’s real

The blood red rose that will never die
It’ll burn like a flame in the dark of the night
I’m not afraid
I’d give everything if you hear me there

Ahh, I wish you were here

Dryin’ these tears I cry
They were good times
It’s that time of year for being alone
But you’re dealing with a heart of stone
Try to kiss and say goodbye
Try to throw our love away
And that storm will blow

Wish you were here (2X)

Ahh, I wish you were here
Dryin’ these tears I cry
They were good times
It’s that time of year for being alone
But you’re dealing with a heart of stone
Try to kiss and say goodbye
Try to throw our love away
And I can’t let go

They were good times
And I wish you were here
Yes, I wish you here

Queria Que Você Estivesse Aqui

Você está vivendo sua vida
No coração de um outro alguém.
Meu amor é tão forte
Quanto os oceanos são distantes.

Uma canção de verão continua tocando no meu cérebro,
E eu sinto você e vejo seu rosto novamente.
Não tem escapatória, eu perdi tudo ao perder você..

Eu queria que você estivesse aqui,
Enxugando estas lágrimas que choro.
Foram bons tempos
E eu queria que você estivesse aqui,
Chamando meu nome.
Mas você está negociando com um homem louco o preço.
Como irremediavelmente estou perdido,.
Eu tentei desprezar o seu amor,
Mas não posso desistir.

E então eu desperto
Nos sonhos de um outro alguém.
(Não é o que parece) é somente uma mentira,
Eu ainda tenho de decidir quem é real.

A rosa vermelha como sangue que nunca morrerá,
Ela queimará como uma chama na escuridão da noite.
Não estou com medo,
Eu daria tudo se você me ouvisse lá…

Eu queria que você estivesse aqui,
Enxugando estas lágrimas que choro.
Foram bons tempos.
É aquela época do ano de ficar solitário,
Mas você está negociando com um coração de pedra.
Tente dar um beijo e dizer adeus,
Tente desprezar o nosso amor
E aquela tempestade vai soprar.

Queria que você estivesse aqui (2x)

Eu queria que você estivesse aqui,
Enxugando estas lágrimas que choro.
Foram bons tempos.
É aquela época do ano de ficar solitário,
Mas você está negociando com um coração de pedra.
Tente dar um beijo e dizer adeus,
Tente desprezar o nosso amor
E eu não posso desistir…

Foram bons tempos
E eu queria que você estivesse aqui.
Sim, eu quero você aqui…



Você já fez isso hoje?

26 05 2009

Você já pensou nas pessoas que te circundam? Nas pessoas que convivem com você? Nas pessoas que Deus designou para estarem ao seu lado? Para compartilharem a vida com você?

Pois bem… você lembrou de dizer para elas o quanto elas são importantes para você? O quanto elas significam para você? O quanto você admira elas? O quanto ama cada uma dessas pessoas? A cada momento que tiver a oportunidade não deixe de expressar esse sentimento pois o tempo não volta e pode acontecer de ser tarde demais para voltar atrás.

Então não pense duas vezes: diga aos que te circundam o quanto eles são importantes na tua vida, na tua caminhada. O quanto você os ama; o quanto você os quer bem. Se não disser, ao menos externize seu sentimento.

Você já fez isso hoje?



Ser feliz ou ter razão?

25 05 2009

Oito da noite numa avenida movimentada. O casal já está atrasado para jantar na casa de alguns amigos. O endereço é novo, assim como o caminho, que ela conferiu no mapa antes de sair.

Ele dirige o carro. Ela o orienta e pede para que vire na próxima rua à esquerda. Ele tem certeza de que é à direita. Discutem.

Percebendo que além de atrasados, poderão ficar mal humorados, ela deixa que ele decida.

Ele vira a direita e percebe que estava errado. Ainda com dificuldade, ele admite que insistiu no caminho errado, enquanto faz o retorno.

Ela sorri e diz que não há problema algum em chegar alguns minutos mais tarde. Mas ele ainda quer saber: “Se você tinha tanta certeza de que eu estava tomando o caminho errado, deveria insistir um pouco mais”.

E ela diz: “Entre ter razão e ser feliz, prefiro ser feliz. Estávamos a beira de uma briga, se eu insistisse mais, teríamos estragado a noite”.

MORAL DA HISTÓRIA:
Essa pequena estória foi contada por uma empresária durante uma palestra sobre simplicidade no mundo do trabalho. Ela usou a cena para ilustrar quanta energia nós gastamos apenas para demonstrar que temos razão, independente de tê-la ou não. Desde que ouvi esta história, tenho me perguntado com mais freqüência: “Quero ser feliz ou ter razão?” Pense nisso e seja feliz.

Certamente esta estória mexe com nossos sentimentos,  com nossos pensamentos, com nossas atitudes, com nossas formas de agir. Queremos nossa felicidade apenas ou a felicidade dos que nos circundam? Respeitamos sua forma de pensar e sua história? Fique essa reflexão para cada um de nós.



As colheres de cabo comprido

22 05 2009

Conta uma lenda que Deus convidou um homem para conhecer o céu e o inferno. Foram primeiro ao inferno.
Ao abrirem uma porta, o homem viu uma sala em cujo centro havia um caldeirão de substanciosa sopa e à sua volta estavam sentadas pessoas famintas e desesperadas. Cada uma delas segurava uma colher, porém de cabo muito comprido, que lhes possibilitava alcançar o caldeirão, mas não permitia que colocassem a sopa na própria boca. O sofrimento era grande.
Em seguida, Deus levou o homem para conhecer o céu. Entraram em uma sala idêntica à primeira: havia o mesmo caldeirão, as pessoas em volta e as colheres de cabo comprido. A diferença é que todos estavam saciados. Não havia fome, nem sofrimento.
- ‘Eu não compreendo’, disse o homem a Deus, ‘por que aqui as pessoas estão felizes enquanto na outra sala morrem de aflição, se é tudo igual?
Deus sorriu e respondeu:
- Você não percebeu? É Porque aqui eles aprenderam a dar comida uns aos outros.

Temos três situações que merecem profunda reflexão:
1. Egoísmo: as pessoas no ‘inferno’ estavam altamente preocupadas com a sua própria fome, impedindo que se pensasse em alternativas para equacionar a situação;
2. Criatividade: como todos estavam querendo se safar da situação caótica que se encontravam, não tiveram a iniciativa de buscar alternativas que pudessem resolver o problema;
3. Equipe: se tivesse havido o espírito solidário e ajuda mútua, a situação teria sido rapidamente resolvida.

Dificilmente o individualismo consegue transpor barreiras. O espírito de equipe é essencial para o alcance do sucesso. Uma equipe participativa, homogênea, coesa, vale mais do que um batalhão de pessoas com posicionamentos isolados. Isso vale para qualquer área de sua vida, especialmente a profissional.



Navio de guerra

21 05 2009

O autor relata a história de dois navios de guerra que estavam há varias semanas no mar realizando uma missão de treinamento. O mau tempo dificultava as manobras. O sentinela do navio-líder tinha a visão quase nula devido ao forte nevoeiro. O capitão permanecia na ponte durante as atividades, tendo se envolvido na seguinte situação:
- Luz à proa, à boreste - disse o vigia.
- Parada ou movendo-se para a popa? – perguntou o capitão.
- Parada, capitão – ele retrucou. Significando que o navio estava em perigo. Em rota de colisão. Imediatamente o capitão chamou o sinaleiro:
- Avise aquele navio para alterar o curso deles em 20 graus, pois estamos em rota de colisão.
- É melhor vocês alterarem o curso em 20 graus. – veio a resposta.
- Envie a seguinte mensagem: “Aqui é o capitão, ordenando que vocês mudem a rota em 20 graus imediatamente.”
- Logo chegou a resposta: “Aqui é um marinheiro de segunda classe. É melhor vocês alterarem o curso em 20 graus.”
- O capitão já furioso, ordenou: “Este é um navio de guerra. Mude o seu curso em 20 graus. Isso é uma ordem.”
- Ao que o marinheiro do outro lado sinalizou: “Aqui é um farol terrestre. Mude a sua rota em 20 graus ou vai se chocar.”

Às vezes o excessivo poder e a falta de humildade acabam por destruir um ambiente de trabalho ou até mesmo familiar. Os imperialismos nunca tiveram um produto com bom resultado.



Seis pessoas separam você de qualquer outra

20 05 2009

Estudo da Microsoft feito com contatos do MSN mostra que em 6 contatos um usuário se conecta a qualquer outro.
Uma análise feita por dois pesquisadores a pedido da Microsoft analisou 30 bilhões de conversas eletrônicas feitas pelo comunicador MSN. Os pesquisadores usaram um universo de 180 milhões de usuários para realizar a pesquisa.
A idéia era descobrir a partir de quantas conexões uma pessoa qualquer pode chegar até outra pessoa qualquer. Assim, um usuário de São Paulo (A) era comparado a outro, da Índia (B), por exemplo. A pesquisa tentava achar quantas conexões eram necessárias para juntar A e B.
Na média, o estudo concluiu que 6,6 contatos separam uma pessoa de outra. Assim, um amigo do amigo do amigo, até seis ou sete níveis, te colocaria em contato com qualquer outra pessoa.
A teoria dos “seis níveis de separação” é uma história antiga, nunca confirmada, e por várias vezes defendida pelo ator americano Kevin Bacon. O ator afirma, há muitos anos, que todos os atores do planeta podem se conectar, em média, consultando até seis amigos.
Os pesquisadores Eric Horvitz e Jure Leskovec, que conduziram o estudo, disseram ao jornal Washington Post que se surpreenderam com o resultado do estudo. Horvitz e Leskovec contam que, inicialmente, achavam a teoria exagerada e que, na prática, não existiria contatos unindo muitas pessoas que não se conhecem. O cruzamento de diálogos no MSN, no entanto, mostrou o contrário.



Velho sábio e o campo de arroz

19 05 2009

O mestre Zen encarregou o discípulo de cuidar do campo de arroz.
No primeiro ano, o discípulo vigiava para que nunca faltasse a água necessária. O arroz cresceu forte, e a colheita foi boa. No segundo ano, ele teve a idéia de acrescentar um pouco de fertilizante. O arroz cresceu rápido, e a colheita foi maior. No terceiro ano, ele colocou mais fertilizante. A colheita foi maior ainda, mas o arroz nasceu pequeno e sem brilho.
- Se continuar aumentando a quantidade de adubo, não terá nada de valor no ano que vem - disse o mestre. – Você fortalece alguém, quando ajuda um pouco. Mas você enfraquece alguém, se ajuda muito.

Essa foi fantástica. Falei sobre esse assunto com minha mãe há alguns dias quando falava dos professores que tive no curso superior. Lembro claramente daqueles que me fortaleceram.



Validar dígito verificador de CNPJ - Função com VETOR

18 05 2009

Eis uma função que retorna TRUE ou FALSE se o CPF informado é válido. Se o CNPJ informado não possuir os zeros à esquerda a função completa até atingir 14 caracteres. Caso for informado mais do que 14 caracteres, a função considera apenas os 14 primeiros.  Esta função é mais rápida que a função com LOOP.

CREATE OR REPLACE FUNCTION cnpj_validar(cnpj character varying) RETURNS boolean AS
--cnpj_validar()   1.0 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que valida o CNPJ
$BODY$
DECLARE
cnpj VARCHAR(14);
calc INTEGER[14];
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
BEGIN
cnpj := LPAD(TRANSLATE($1, '.-/ ', ''), 14, '0');
calc[0] := CAST(SUBSTRING(cnpj FROM 1 FOR 1) AS INTEGER);
calc[1] := CAST(SUBSTRING(cnpj FROM 2 FOR 1) AS INTEGER);
calc[2] := CAST(SUBSTRING(cnpj FROM 3 FOR 1) AS INTEGER);
calc[3] := CAST(SUBSTRING(cnpj FROM 4 FOR 1) AS INTEGER);
calc[4] := CAST(SUBSTRING(cnpj FROM 5 FOR 1) AS INTEGER);
calc[5] := CAST(SUBSTRING(cnpj FROM 6 FOR 1) AS INTEGER);
calc[6] := CAST(SUBSTRING(cnpj FROM 7 FOR 1) AS INTEGER);
calc[7] := CAST(SUBSTRING(cnpj FROM 8 FOR 1) AS INTEGER);
calc[8] := CAST(SUBSTRING(cnpj FROM 9 FOR 1) AS INTEGER);
calc[9] := CAST(SUBSTRING(cnpj FROM 10 FOR 1) AS INTEGER);
calc[10] := CAST(SUBSTRING(cnpj FROM 11 FOR 1) AS INTEGER);
calc[11] := CAST(SUBSTRING(cnpj FROM 12 FOR 1) AS INTEGER);
calc[12] := CAST(SUBSTRING(cnpj FROM 13 FOR 1) AS INTEGER);
calc[13] := CAST(SUBSTRING(cnpj FROM 14 FOR 1) AS INTEGER);
soma := (calc[0]*5) + (calc[1]*4) + (calc[2]*3) + (calc[3]*2) + (calc[4]*9) + (calc[5]*8) + (calc[6]*7) + (calc[7]*6) + (calc[8]*5) + (calc[9]*4) + (calc[10]*3) + (calc[11]*2);
d1 := 11 - (soma % 11);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
soma := (calc[0]*6) + (calc[1]*5) + (calc[2]*4) + (calc[3]*3) + (calc[4]*2) + (calc[5]*9) + (calc[6]*8) + (calc[7]*7) + (calc[8]*6) + (calc[9]*5) + (calc[10]*4) + (calc[11]*3) + (d1*2);
d2 := 11 - (soma % 11);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
IF (d1 = calc[12]) AND (d2 = calc[13]) THEN
  RETURN TRUE;
ELSE
  RETURN FALSE;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cnpj_validar(character varying) OWNER TO postgres;


Validar dígito verificador de CNPJ - Função com LOOP

15 05 2009

Eis uma função que retorna TRUE ou FALSE se o CNPJ informado é válido. Se o CNPJ informado não possuir os zeros à esquerda a função completa até atingir 14 caracteres. Caso for informado mais do que 14 caracteres, a função considera apenas os 14 primeiros.

CREATE OR REPLACE FUNCTION cnpj_validar(cnpj character varying) RETURNS boolean AS
--cnpj_validar()   1.0 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que valida o CNPJ
$BODY$
DECLARE
cnpj VARCHAR(14);
calc VARCHAR(14);
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
dif INTEGER;
BEGIN
cnpj := LPAD(TRANSLATE($1, '.-/ ', ''), 14, '0');
calc := SUBSTRING(cnpj FROM 1 FOR 12);
soma := 0;
dif := 0;
FOR laco IN REVERSE 12..1 LOOP
  IF laco < 5 THEN
    dif := 8;
  END IF;
  soma := soma + (CAST(SUBSTRING(calc FROM laco FOR 1) AS NUMERIC) * (14 - dif - laco));
END LOOP;
d1 := 11 - CAST((soma % 11) AS INTEGER);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
calc := calc || CAST(d1 AS VARCHAR);
soma := 0;
dif := 0;
FOR laco IN REVERSE 13..1 LOOP
  IF laco < 6 THEN
    dif := 8;
  END IF;
  soma := soma + (CAST(SUBSTRING(calc FROM laco FOR 1) AS NUMERIC) * (15 - dif - laco));
END LOOP;
d2 := 11 - CAST((soma % 11) AS INTEGER);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
calc := calc || CAST(d2 AS VARCHAR);
IF calc = cnpj THEN
  RETURN TRUE;
ELSE
  RETURN FALSE;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cnpj_validar(character varying) OWNER TO postgres;


Gerar dígito verificador de CNPJ - Função com VETOR

14 05 2009

Esta é a função com vetor que gera o dígito verificador de CNPJ. Se o CNPJ informado não possuir os zeros à esquerda a função completa até atingir 12 caracteres. Caso for informado mais do que 12 caracteres, a função considera apenas os 12 primeiros. Obviamente esta função é mais rápida que a função com LOOP.

CREATE OR REPLACE FUNCTION cnpj_gerardv(cpf character varying) RETURNS character varying AS
--cnpj_gerardv()   1.0 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que gera o digito verificador de CNPJ
$BODY$
DECLARE
cnpj VARCHAR(14);
calc INTEGER[12];
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
BEGIN
cnpj := LPAD(TRANSLATE($1, '.-/ ', ''), 12, '0');
calc[0] := CAST(SUBSTRING(cnpj FROM 1 FOR 1) AS INTEGER);
calc[1] := CAST(SUBSTRING(cnpj FROM 2 FOR 1) AS INTEGER);
calc[2] := CAST(SUBSTRING(cnpj FROM 3 FOR 1) AS INTEGER);
calc[3] := CAST(SUBSTRING(cnpj FROM 4 FOR 1) AS INTEGER);
calc[4] := CAST(SUBSTRING(cnpj FROM 5 FOR 1) AS INTEGER);
calc[5] := CAST(SUBSTRING(cnpj FROM 6 FOR 1) AS INTEGER);
calc[6] := CAST(SUBSTRING(cnpj FROM 7 FOR 1) AS INTEGER);
calc[7] := CAST(SUBSTRING(cnpj FROM 8 FOR 1) AS INTEGER);
calc[8] := CAST(SUBSTRING(cnpj FROM 9 FOR 1) AS INTEGER);
calc[9] := CAST(SUBSTRING(cnpj FROM 10 FOR 1) AS INTEGER);
calc[10] := CAST(SUBSTRING(cnpj FROM 11 FOR 1) AS INTEGER);
calc[11] := CAST(SUBSTRING(cnpj FROM 12 FOR 1) AS INTEGER);
soma := (calc[0]*5) + (calc[1]*4) + (calc[2]*3) + (calc[3]*2) + (calc[4]*9) + (calc[5]*8) + (calc[6]*7) + (calc[7]*6) + (calc[8]*5) + (calc[9]*4) + (calc[10]*3) + (calc[11]*2);
d1 := 11 - (soma % 11);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
soma := (calc[0]*6) + (calc[1]*5) + (calc[2]*4) + (calc[3]*3) + (calc[4]*2) + (calc[5]*9) + (calc[6]*8) + (calc[7]*7) + (calc[8]*6) + (calc[9]*5) + (calc[10]*4) + (calc[11]*3) + (d1*2);
d2 := 11 - (soma % 11);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
RETURN CAST(d1 AS VARCHAR) || CAST(d2 AS VARCHAR);
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cnpj_gerardv(character varying) OWNER TO postgres;


Gerar dígito verificador de CNPJ - Função com LOOP

13 05 2009

Como precisei fazer as funções para gerar dígito de CPF, teve também os dígitos de CNPJ. Eis uma função que retorna o dígito verificador para o CNPJ informado. Se o CNPJ informado não possuir os zeros à esquerda a função completa até atingir 12 caracteres. Caso for informado mais do que 12 caracteres, a função considera apenas os 12 primeiros. Assim como no CPF, a função com LOOP ficou mais lenta.

CREATE OR REPLACE FUNCTION cnpj_gerardv(cpf character varying) RETURNS character varying AS
--cnpj_gerardv()   1.0 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que gera o digito verificador de CNPJ
$BODY$
DECLARE
cnpj VARCHAR(14);
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
dif INTEGER;
BEGIN
cnpj := LPAD(TRANSLATE($1, '.-/ ', ''), 12, '0');
soma := 0;
dif := 0;
FOR laco IN REVERSE 12..1 LOOP
  IF laco < 5 THEN
    dif := 8;
  END IF;
  soma := soma + (CAST(SUBSTRING(cnpj FROM laco FOR 1) AS NUMERIC) * (14 - dif - laco));
END LOOP;
d1 := 11 - CAST((soma % 11) AS INTEGER);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
cnpj := cnpj || CAST(d1 AS VARCHAR);
soma := 0;
dif := 0;
FOR laco IN REVERSE 13..1 LOOP
  IF laco < 6 THEN
    dif := 8;
  END IF;
  soma := soma + (CAST(SUBSTRING(cnpj FROM laco FOR 1) AS NUMERIC) * (15 - dif - laco));
END LOOP;
d2 := 11 - CAST((soma % 11) AS INTEGER);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
RETURN CAST(d1 AS VARCHAR) || CAST(d2 AS VARCHAR);
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cnpj_gerardv(character varying) OWNER TO postgres;


Função para formatar CNPJ

12 05 2009

Eis uma função que formata o CNPJ segundo a estrutura 00.000.000/0000-00. Se o CNPJ informado não possuir os zeros à esquerda a função completa até atingir 14 caracteres. Caso for informado mais do que 14 caracteres, a função considera apenas os 14 primeiros.

CREATE OR REPLACE FUNCTION cnpj_formatar(cnpj character varying) RETURNS character varying AS
--cnpj_formatar()   1.0 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao que formata o CNPJ na estrutura 00.000.000/0000-00
$BODY$
DECLARE
cnpj VARCHAR(14);
BEGIN
cnpj := LPAD(TRANSLATE($1, '.-/ ', ''), 14, '0');
RETURN SUBSTRING(cnpj FROM 1 FOR 2) || CAST('.' AS VARCHAR) || SUBSTRING(cnpj FROM 3 FOR 3) || CAST('.' AS VARCHAR) || SUBSTRING(cnpj FROM 6 FOR 3) || CAST('/' AS VARCHAR) || SUBSTRING(cnpj FROM 9 FOR 4) || CAST('-' AS VARCHAR) || SUBSTRING(cpf FROM 13 FOR 2);
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cnpj_formatar(character varying) OWNER TO postgres;


Função para formatar CPF

11 05 2009

Eis uma função que formata o CPF segundo a estrutura 000.000.000-00. Se o CPF informado não possuir os zeros à esquerda a função completa até atingir 11 caracteres. Caso for informado mais do que 11 caracteres, a função considera apenas os 11 primeiros.

CREATE OR REPLACE FUNCTION cpf_formatar(cpf character varying) RETURNS character varying AS
--cpf_formatar()   1.0 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao que formata o CPF na estrutura 000.000.000-00
$BODY$
DECLARE
cpf VARCHAR(11);
BEGIN
cpf := LPAD(TRANSLATE($1, '.-/ ', ''), 11, '0');
RETURN SUBSTRING(cpf FROM 1 FOR 3) || CAST('.' AS VARCHAR) || SUBSTRING(cpf FROM 4 FOR 3) || CAST('.' AS VARCHAR) || SUBSTRING(cpf FROM 7 FOR 3) || CAST('-' AS VARCHAR) || SUBSTRING(cpf FROM 10 FOR 2);
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cpf_formatar(character varying) OWNER TO postgres;


Gerar dígito verificador de CPF - Função com VETOR

8 05 2009

Eis uma função que retorna o dígito verificador para o CPF informado. Se o CPF informado não possuir os zeros à esquerda a função completa até atingir 9 caracteres. Caso for informado mais do que 9 caracteres, a função considera apenas os 9 primeiros. Em uma base com 182.000 CPFs esta função usando vetor teve uma performance 40% melhor que a função em LOOP.

CREATE OR REPLACE FUNCTION cpf_gerardv(cpf character varying) RETURNS character varying AS
--cpf_gerardv()   1.4 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que gera o digito verificador de CPF
$BODY$
DECLARE
cpf VARCHAR(11);
calc INTEGER[11];
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
BEGIN
cpf := LPAD(TRANSLATE($1, '.-/ ', ''), 9, '0');
calc[0] := CAST(SUBSTRING(cpf FROM 1 FOR 1) AS INTEGER);
calc[1] := CAST(SUBSTRING(cpf FROM 2 FOR 1) AS INTEGER);
calc[2] := CAST(SUBSTRING(cpf FROM 3 FOR 1) AS INTEGER);
calc[3] := CAST(SUBSTRING(cpf FROM 4 FOR 1) AS INTEGER);
calc[4] := CAST(SUBSTRING(cpf FROM 5 FOR 1) AS INTEGER);
calc[5] := CAST(SUBSTRING(cpf FROM 6 FOR 1) AS INTEGER);
calc[6] := CAST(SUBSTRING(cpf FROM 7 FOR 1) AS INTEGER);
calc[7] := CAST(SUBSTRING(cpf FROM 8 FOR 1) AS INTEGER);
calc[8] := CAST(SUBSTRING(cpf FROM 9 FOR 1) AS INTEGER);
soma := (calc[0]*10) + (calc[1]*9) + (calc[2]*8) + (calc[3]*7) + (calc[4]*6) + (calc[5]*5) + (calc[6]*4) + (calc[7]*3) + (calc[8]*2);
d1 := 11 - (soma % 11);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
soma := (calc[0]*11) + (calc[1]*10) + (calc[2]*9) + (calc[3]*8) + (calc[4]*7) + (calc[5]*6) + (calc[6]*5) + (calc[7]*4) + (calc[8]*3) + (d1*2);
d2 := 11 - (soma % 11);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
RETURN CAST(d1 AS VARCHAR) || CAST(d2 AS VARCHAR);
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cpf_gerardv(character varying) OWNER TO postgres;


Gerar dígito verificador de CPF - Função com LOOP

7 05 2009

Eis uma função que retorna o dígito verificador para o CPF informado. Se o CPF informado não possuir os zeros à esquerda a função completa até atingir 9 caracteres. Caso for informado mais do que 9 caracteres, a função considera apenas os 9 primeiros.

CREATE OR REPLACE FUNCTION cpf_gerardv(cpf character varying) RETURNS character varying AS
--cpf_gerardv()   1.3 (05/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que gera o digito verificador de CPF
$BODY$
DECLARE
cpf VARCHAR(11);
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
BEGIN
cpf := LPAD(TRANSLATE($1, '.-/ ', ''), 9, '0');
soma := 0;
FOR laco IN 1..9 LOOP
  soma := soma + (CAST(SUBSTRING(cpf FROM laco FOR 1) AS NUMERIC) * (11 - laco));
END LOOP;
d1 := 11 - CAST((soma % 11) AS INTEGER);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
cpf := cpf || CAST(d1 AS VARCHAR);
soma := 0;
FOR laco IN 1..10 LOOP
  soma := soma + (CAST(SUBSTRING(cpf FROM laco FOR 1) AS NUMERIC) * (12 - laco));
END LOOP;
d2 := 11 - CAST((soma % 11) AS INTEGER);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
RETURN CAST(d1 AS VARCHAR) || CAST(d2 AS VARCHAR);
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cpf_gerardv(character varying) OWNER TO postgres;


Validar dígito verificador de CPF - Função com VETOR

6 05 2009

Eis uma função que retorna TRUE ou FALSE se o CPF informado é válido. Se o CPF informado não possuir os zeros à esquerda a função completa até atingir 11 caracteres. Caso for informado mais do que 11 caracteres, a função considera apenas os 11 primeiros.

Essa função é mais eficiente que a função publicada ontem. Em uma base com 182.000 CPFs houve uma melhora de performance de 40%.

CREATE OR REPLACE FUNCTION cpf_validar(cpf character varying) RETURNS boolean AS
--cpf_validar()   1.4 (06/05/2009)
--by Fernando Brombatti (brombatti@gmail.com)
--Funcao de que valida o CPF
$BODY$
DECLARE
cpf VARCHAR(11);
calc INTEGER[11];
d1 INTEGER;
d2 INTEGER;
soma INTEGER;
BEGIN
cpf := LPAD(TRANSLATE($1, '.-/ ', ''), 11, '0');
calc[0] := CAST(SUBSTRING(cpf FROM 1 FOR 1) AS INTEGER);
calc[1] := CAST(SUBSTRING(cpf FROM 2 FOR 1) AS INTEGER);
calc[2] := CAST(SUBSTRING(cpf FROM 3 FOR 1) AS INTEGER);
calc[3] := CAST(SUBSTRING(cpf FROM 4 FOR 1) AS INTEGER);
calc[4] := CAST(SUBSTRING(cpf FROM 5 FOR 1) AS INTEGER);
calc[5] := CAST(SUBSTRING(cpf FROM 6 FOR 1) AS INTEGER);
calc[6] := CAST(SUBSTRING(cpf FROM 7 FOR 1) AS INTEGER);
calc[7] := CAST(SUBSTRING(cpf FROM 8 FOR 1) AS INTEGER);
calc[8] := CAST(SUBSTRING(cpf FROM 9 FOR 1) AS INTEGER);
calc[9] := CAST(SUBSTRING(cpf FROM 10 FOR 1) AS INTEGER);
calc[10] := CAST(SUBSTRING(cpf FROM 11 FOR 1) AS INTEGER);
soma := (calc[0]*10) + (calc[1]*9) + (calc[2]*8) + (calc[3]*7) + (calc[4]*6) + (calc[5]*5) + (calc[6]*4) + (calc[7]*3) + (calc[8]*2);
d1 := 11 - (soma % 11);
IF d1 >= 10 THEN
  d1 := 0;
END IF;
soma := (calc[0]*11) + (calc[1]*10) + (calc[2]*9) + (calc[3]*8) + (calc[4]*7) + (calc[5]*6) + (calc[6]*5) + (calc[7]*4) + (calc[8]*3) + (d1*2);
d2 := 11 - (soma % 11);
IF d2 >= 10 THEN
  d2 := 0;
END IF;
IF (d1 = calc[9]) AND (d2 = calc[10]) THEN
  RETURN TRUE;
ELSE
  RETURN FALSE;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cpf_validar(character varying) OWNER TO postgres;