segunda-feira, novembro 29, 2010

E_DINHEIRO Validador para web2py

Criei um validator para web2py, mas ao nomear, fugi do padrão IS_SOMETHING, já que o formato é específico do Brasil.

Assim, usei E_DINHEIRO, apenas para facilitar a formatação. O tipo de campo para armazenamento deve ser decimal, mas é necessário excluir a linha que possui a palavra 'double' em web2py_ajax.html, pois ele impede a digitação de vírgulas:
-------------------------------------------------------------------------------------------------------------------------------
jQuery('input.double,input.decimal').live('keyup', function(){this.value=this.value.reverse().replace(/[^0-9\-\.]|[\-](?=.)|[\.](?=[0-9]*[\.])/g,'').reverse();});
------------------------------------------------------------------------------------------------------------------------------
Parece que pode ser possível adaptar a linha acima para aceitar vírgulas, quem souber como fazer deixe um comentário.



class E_DINHEIRO(object):
    def __init__(self, format=True, error_message='Digite o valor!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):
            

            d=str(value)
            
            d = d.replace('.','')
            
            d = d.replace(',','.')
            
            #return (value, valor[-3:-2])
            try:
                return (d, None)
            except:
                return (d,str(d)+'o valor digitado não é um número válido')
 
    def formatter(self, value):
            value  = str(value)
            c = []
            for d in value:
               if d.isdigit():
                   c.append(d)
            value = str(''.join(c))
            l = len(value) #10 = 1000000000 = 10.000.000,00
            i = l - 2 #8
            p = i / 3 #2
            r = (l % 3) #2
            #p = 3
            pf = i-1
            if l == 1:
                formatado = '0,0'+value
            
            elif l == 2:
                formatado = '0,'+value
            elif l > 2:
                d = ','+value[-2:]
                s = ''
                n = r+1
                s += value[0:r+1]
                if i > 3:
                    while n < i:
                        pt = n + 3
                        s += '.'+ value[n:pt] 
                        n = pt
                                
                formatado = s+d        
            else:
                formatado = value
            return formatado

Use o validator como um validator comum do web2py:

Field('preco','decimal(20,2)',requires=E_DINHEIRO(),represent=lambda field:currency(field), label='Preço'),

Para permitir apresentar o formato quando não está usando formulário,  use:


def currency(value):
  

    import locale
    locale.setlocale( locale.LC_ALL, 'pt_BR.UTF-8' )
    value = locale.currency(value,grouping=True)
    return value

em uma view:

{{=currency(row.preco)}}



--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quinta-feira, novembro 25, 2010

Validator IS_CPF_OR_CNPJ para web2py

class IS_CPF_OR_CNPJ(object):

    def __init__(self, format=True, error_message='Digite apenas os números!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):
        try:
            #return (value, 'cpf incorreto'+str(value))
            #return (value, 'cpf incorreto'+str(cl))
            c = []
            for d in value:
               if d.isdigit():
                   c.append(d)
            cl = str(''.join(c))
            #return (value, 'cpf incorreto'+str(cl))
            if  len(cl) == 11:
                cpf = cl
                cnpj = None
            elif  len(cl) == 14:
                cpf = None
                cnpj = cl
            else:
                return (value, 'Número de dígitos incorreto para CPF ou CNPJ')

            #return(cpf,'aquiok'+str(len(cpf)==11))
            if cpf:
              
                def valida(value):
                  
                    def calcdv(numb):
                      
                        result = int()
                        seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
                        #return (value,'to fundo1')
                        for digit, base in zip(numb, seq):
                            result += int(digit)*int(base)
              
                        dv = result % 11
                        #return (value,'to fundo1'+str(dv))
                        return (dv-10) and dv or 0
                  
                    id_type = ['CPF', -1]
                  
                  
                    numb, xdv = value[:-2], value[-2:]
                  
                    dv1 = calcdv(numb)
                    #return (value,'entrei'+str(dv1))
                    dv2 = calcdv(numb + str(dv1))
                    return (('%d%d' % (dv1, dv2) == xdv and True or False), id_type[0])  
          
          
                try:
                    cpf=str(value)
                    #return(cpf,'aquiok'+str(len(cpf)==11))
                    if len(cpf)>=11:
                      
                        #return (value, 'cpf acima de 11')
                        c = []
                        for d in cpf:
                           if d.isdigit():
                               c.append(d)
                        cl = str(''.join(c))
                        #return (value, 'cpf incorreto'+str(cl))
                        if  len(cl) == 11:
                            if valida(cl)[0] == True:
                                return(value,None)
                            else:
                                return (value, 'cpf inválido')
                        elif  len(cl) < 11:
                            return (value, 'cpf incompleto')
                        else:
                            return (value, 'cpf tem mais de 11 dígitos')
                        if cpf[3] != '.' or cpf[7] != '.' or cpf[11] != '-' :
                            return (value, 'cpf deve estar no formato 000.000.000-00'+cpf[11])
                    else:
                        return (value, 'cpf deve estar no formato 000.000.000-00')
                    #return(cpf,'aquiok'+str(len(cpf)==11))
                except:
                    return (value, 'algum erro'+str(value))
            elif cnpj:

                   """ Pega apenas os 12 primeiros dígitos do CNPJ e gera os 2 dígitos que faltam """
                   inteiros = map(int, cnpj)
                   novoCnpj = inteiros[:12]

                   prod = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
                   while len(novoCnpj) < 14:
                      r = sum([x*y for (x, y) in zip(novoCnpj, prod)]) % 11
                      if r > 1:
                         f = 11 - r
                      else:
                         f = 0
                      novoCnpj.append(f)
                      prod.insert(0, 6)
                   #return(str(novoCnpj),'aquiok')
                   """ Se o número gerado coincidir com o número original, é válido """
                   if novoCnpj == inteiros:
                      #cnpj = ''.join(novoCnpj)
                    
                      return(str(cnpj),None)

                   else:
                      return (value, 'CNPJ não é válido')
              


        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
            if len(value)==11:
                formatado = value[0:3]+'.'+value[3:6]+'.'+value[6:9]+'-'+value[9:11]
            elif len(value)==14:
                formatado = value[0:2]+'.'+value[2:5]+'.'+value[5:8]+'/'+value[8:12]+'-'+value[12:14]
            else:
                formatado = value
            return formatado

Validator TELEFONE para web2py: IS_TELEFONE

Também tive que criar um validator para telefone, com ddd


class IS_TELEFONE(object):
    def __init__(self, format=True, error_message='Digite apenas os números!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):
        try:
            telefone=str(value)
            #return(cpf,'aquiok'+str(len(cpf)==11))
            if len(telefone)>=10:
                #return (value, 'cpf acima de 11')
                c = []
                for d in telefone:
                   if d.isdigit():
                       c.append(d)
                cl = str(''.join(c))
                #return (value, 'cpf incorreto'+str(cl))
                if  len(cl) == 10:
                    return(str(cl),None)
                elif  len(cl) < 10:
                    return (value, 'telefone incompleto')
                else:
                    return (value, 'o telefone tem mais de 10 dígitos')
                if cpf[2] != '-' or cpf[7] != '-':
                    return (value, 'o telefone deve estar no formato 00-0000-0000')
            else:
                return (value, 'O telefone deve estar no formato 00-0000-0000')
            #return(cpf,'aquiok'+str(len(cpf)==11))
        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
            if len(value) == 10:
                formatado = value[0:2]+'-'+value[2:6]+'-'+value[6:10]
            else:
                formatado = value      
            return formatado


--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

Validator CPF para web2py: IS_CPF

Por necessidade, criei um validator para ser usado no Web2py:


class IS_CPF(object):
    def __init__(self, format=True, error_message='Digite apenas os números!'):
        self.format = format
        self.error_message = error_message
    def __call__(self, value):

        def valida(value):
          
            def calcdv(numb):
              
                result = int()
                seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
                #return (value,'to fundo1')
                for digit, base in zip(numb, seq):
                    result += int(digit)*int(base)
      
                dv = result % 11
                #return (value,'to fundo1'+str(dv))
                return (dv-10) and dv or 0
          
            id_type = ['CPF', -1]
          
          
            numb, xdv = value[:-2], value[-2:]
          
            dv1 = calcdv(numb)
            #return (value,'entrei'+str(dv1))
            dv2 = calcdv(numb + str(dv1))
            return (('%d%d' % (dv1, dv2) == xdv and True or False), id_type[0])  
  
  
        try:
            cpf=str(value)
            #return(cpf,'aquiok'+str(len(cpf)==11))
            if len(cpf)>=11:
              
                #return (value, 'cpf acima de 11')
                c = []
                for d in cpf:
                   if d.isdigit():
                       c.append(d)
                cl = str(''.join(c))
                #return (value, 'cpf incorreto'+str(cl))
                if  len(cl) == 11:
                    if valida(cl)[0] == True:
                        return(value,None)
                    else:
                        return (value, 'cpf inválido')
                elif  len(cl) < 11:
                    return (value, 'cpf incompleto')
                else:
                    return (value, 'cpf tem mais de 11 dígitos')
                if cpf[3] != '.' or cpf[7] != '.' or cpf[11] != '-' :
                    return (value, 'cpf deve estar no formato 000.000.000-00'+cpf[11])
            else:
                return (value, 'cpf deve estar no formato 000.000.000-00')
            #return(cpf,'aquiok'+str(len(cpf)==11))


        except:
            return (value, 'algum erro'+str(value))
    def formatter(self, value):
          
            formatado = value[0:3]+'.'+value[3:6]+'.'+value[6:9]+'-'+value[9:11]
            #formatado = value
            return formatado

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

domingo, novembro 14, 2010

os carros mais roubados e os carros menos roubados

A Susep disponibiliza uma estatística completa e detalhada de roubos de carros em todo o território nacional.

Pode-se escolher o nível de detalhamento, o estado,, entre várias opções.

O link direto é http://www.susep.gov.br/menuestatistica/RankRoubo/menu1.asp

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

quarta-feira, novembro 10, 2010

paypal x moneybookers x google checkout

Estive comparando os serviços de intermediação de pagamentos e fiz a seguinte comparação para quem está no brasil e precisa receber em dólares, de compradores de outros países

taxas (iniciais)

paypal (7,4% + 0.40BRL) para transações oriundas de outros países.

moneybookers (2,9% +0.29EUR +1% para retirar o dinheiro + 1,99% para conversões de moedas)

google checkout (2,9% + $0,30 +1% para recebimento internacional)


Fica evidente que o menor custo para operar é o do google.






--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com

terça-feira, novembro 02, 2010

converter formatos de arquivo lossless (ape, wv, flac) com .cue para mp3 no linux

Hoje tive necessidade de converter uma discografia lossless no linux para formato mp3.


1.Formato .flac para mp3

usei o pacpl

# apt-get install pacpl

e depois fazer a conversão em todos os subdiretórios

pacpl --to mp3 -r diretorio/


2. Formato .wv com .cue para .mp3

Instalação do shntool

# apt-get install shntool

agora a conversão do arquivo wv para .flac (não consegui converter diretamente para mp3, então usei um formato intermediário)

# shntool conv -i wv -o mp3 arquivo.wv

agora, converter de .flac para .mp3

# pacpl --to mp3  arquivo.flac

e por fim, dividir o arquivo mp3 usando o arquivo .cue, usando o mp3split

baixe os arquivos/pacotes para sua distro em http://mp3splt.sourceforge.net/mp3splt_page/downloads.php e

# mp3split arquivo.mp3 -c arquivo.cue -a

voiĺá, todos os arquivos nomeados e com tags.


3. Formato ape com cue.

é necessário instalar a biblioteca jmac (mac) com

# apt-get install libjmac-java

Se necessário, instale o java
(inclua a linha abaixo no arquivo /etc/apt/sources.list)

# deb http://archive.canonical.com/ubuntu lucid partner

e instale

# apt-get install sun-java6-jre

então, converta para wav

# jmac d arquivo.ape arquivo.wav

e de wav para mp3:

# pacpl --to mp3  arquivo.flac

Finalmente, dividir o arquivo .mp3 :

# mp3split arquivo.mp3 -c arquivo.cue -a

--
Atenciosamente

--
=========================
Alexandre Andrade
Hipercenter.com