Provided by: libbusiness-br-ids-perl_0.0022-1_all bug

NAME

       Business::BR::CPF - Perl module to test for correct CPF numbers

SYNOPSIS

         use Business::BR::CPF;

         print "ok " if test_cpf('390.533.447-05'); # prints 'ok '
         print "bad " unless test_cpf('231.002.999-00'); # prints 'bad '

DESCRIPTION

       The CPF number is an identification number of Brazilian citizens emitted by the Brazilian
       Ministry of Revenue, which is called "Ministerio da Fazenda".

       CPF stands for "Cadastro de Pessoa Fisica" (literally, physical person registration) as
       opposed to the CNPJ number for companies.

       The CPF is comprised of a base of 9 digits and 2 check digits.  It is usually written like
       '231.002.999-00' so as to be more human-readable.

       This module provides "test_cpf" for checking that a CPF number is correct. Here a correct
       CPF number means

       •   it is 11 digits long

       •   it satisfies the two check equations mentioned below

       Before checking, any non-digit letter is stripped, making it easy to test formatted
       entries like '231.002.999-00' and entries with extra blanks like '   999.221.222-00  '.

       test_cpf
             test_cpf('999.444.333-55') # incorrect CPF, returns 0
             test_cpf(' 263.946.533-30 ') # is ok, returns 1
             test_cpf('888') # nope, returns undef

           Tests whether a CPF number is correct. Before testing, any non-digit character is
           stripped. Then it is expected to be 11 digits long and to satisfy two check equations
           which validate the last two check digits.  See "THE CHECK EQUATIONS".

           The policy to get rid of '.' and '-' is very liberal.  It indeeds discards anything
           that is not a digit (0, 1, ..., 9) or letter. That is handy for discarding spaces as
           well

             test_cpf(' 263.946.533-30 ') # is ok, returns 1

           But extraneous inputs like '#333%444*2.3+2-00' are also accepted. If you are worried
           about this kind of input, just check against a regex:

             warn "bad CPF: only digits (11) expected"
               unless ($cpf =~ /^\d{11}$/);

             warn "bad CPF: does not match mask '___.___.___-__'"
               unless ($cpf =~ /^\d{3}\.\d{3}\.\d{3}-\d{2}$/);

           NOTE. Integer numbers like 9999811299 (or 99_998_112_99) with fewer than 11 digits
           will be normalized (eg. to "09999811299") before testing.

       canon_cpf
             canon_cpf(99); # returns '00000000099'
             canon_cpf('999.999.999-99'); # returns '99999999999'

           Brings a candidate for a CPF number to a canonical form.  In case, the argument is an
           integer, it is formatted to at least eleven digits. Otherwise, it is stripped of any
           non-alphanumeric characters and returned as it is.

       format_cpf
             format_cpf('00000000000'); # returns '000.000.000-00'

           Formats its input into '000.000.000-00' mask.  First, the argument is canon'ed and
           then dots and hyphen are added to the first 11 digits of the result.

       parse_cpf
             ($base, $dv) = parse_cpf($cpf);
             $hashref = parse_cpf('999.222.111-00'); # { base => '999222111', dv => '00' }

           Splits a candidate for CPF number into base and check digits (dv - digitos de
           verificaca~o). It canon's the argument before splitting it into 9- and 2-digits parts.
           In a list context, returns a two-element list with the base and the check digits. In a
           scalar context, returns a hash ref with keys 'base' and 'dv' and associated values.

       random_cpf
             $rand_cpf = random_cpf($valid);

             $correct_cpf = random_cpf();
             $cpf = random_cpf(1); # also a correct CPF
             $bad_cpf = random_cpf(0); # an incorrect CPF

           Generates a random CPF. If $valid is omitted or 1, it is guaranteed to be correct. If
           $valid is 0, it is guaranteed to be incorrect.  This function is intented for mass
           test. (Use it wisely.)

           The implementation is simple: just generate a 9-digits random number, hopefully with a
           uniform distribution and then compute the check digits.  If $valid==0, the check
           digits are computed not to satisfy the check equations.

   EXPORT
       "test_cpf" is exported by default. "canon_cpf", "format_cpf", "parse_cpf" and "random_cpf"
       can be exported on demand.

THE CHECK EQUATIONS

       A correct CPF number has two check digits which are computed from the base 9 first digits.
       Consider the CPF number written as 11 digits

         c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9] dv[1] dv[2]

       To check whether a CPF is correct or not, it has to satisfy the check equations:

         c[1]*10+c[2]*9+c[3]*8+c[4]*7+c[5]*6+
                 c[6]*5+c[7]*4+c[8]*3+c[9]*2+dv[1] = 0 (mod 11) or
                                                   = 1 (mod 11) (if dv[1]=0)

       and

         c[2]*10+c[3]*9+c[4]*8+c[5]*7+c[6]*6+
                 c[7]*5+c[8]*4+c[9]*3+dv[1]*2+dv[2] = 0 (mod 11) or
                                                    = 1 (mod 11) (if dv[2]=0)

BUGS

       I heard that there are exceptions of CPF numbers which don't obey the check equations and
       are still authentic. I have never found one of them.

SEE ALSO

       To make sure this module works, one can try the results obtained against those found with
       "Comprovante de Inscrica~o e de Situaca~o Cadastral no CPF", a web page which the
       Brazilian Ministry of Revenue provides for public consultation on regularity status of the
       taxpayer.  This page tells if the CPF number is a correct entry (11-digits-long with
       verified check digits), if it references a real person and if he/she is regular with the
       government body.

       Given a bad CPF, the after-submit page tells "CPF incorreto".  If the CPF is a good one
       but does not reference a real person, it says "CPF na~o existe em nossa base de dados"
       (CPF does not exist in our database). Otherwise, it shows a details form for the
       identified taxpayer.

       Note that this module only tests correctness.  It doesn't enter the merit whether the CPF
       number actually exists at the Brazilian government databases.

       As you might have guessed, this is not the first Perl module to approach this kind of
       functionality. Take a look at

         http://search.cpan.org/search?module=Brasil::Checar::CPF
         http://search.cpan.org/search?query=cpf&mode=all

       Please reports bugs via CPAN RT, http://rt.cpan.org/NoAuth/Bugs.html?Dist=Business-BR-Ids
       By doing so, the author will receive your reports and patches, as well as the problem and
       solutions will be documented.

AUTHOR

       A. R. Ferreira, <ferreira@cpan.org>

COPYRIGHT AND LICENSE

       Copyright (C) 2005 by A. R. Ferreira

       This library is free software; you can redistribute it and/or modify it under the same
       terms as Perl itself, either Perl version 5.8.6 or, at your option, any later version of
       Perl 5 you may have available.