Guest User

lavieri

a guest
Mar 3rd, 2009
489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 27.52 KB | None | 0 0
  1. package org.lavieri.util.brazil.register;
  2.  
  3. import java.math.BigInteger;
  4.  
  5. import javax.persistence.AttributeOverride;
  6. import javax.persistence.Column;
  7. import javax.persistence.Embeddable;
  8. import javax.persistence.Embedded;
  9. import javax.persistence.Entity;
  10. import javax.persistence.GeneratedValue;
  11. import javax.persistence.Id;
  12. import javax.persistence.Transient;
  13.  
  14. import org.lavieri.util.StringUtil;
  15.  
  16. /**
  17.  * Um <b><i>Object Value</i></b> que representa o n�mero do CNPJ - <b>C</b>adastro
  18.  * <b>N</b>acional de <b>P</b>essoa <b>J</b>uridica - de uma empresa.
  19.  * <BR>
  20.  * <BR>Este objeto pode representa um componente de uma Entitdade @{@link Entity}
  21.  * usando-se como anota��o de campo a tag @{@link Embedded}.
  22.  * <BR>Por padr�o este
  23.  * � representado na tabela de banco de dados por um campo <tt>unique</tt> String de nome
  24.  * "cnpj" (o campo precisa de apenas 14 digitos) que aceita valores nulos.
  25.  * <BR>
  26.  * <BR>� possivel alterar no nome padrao do campo declarando, assim como os atributos
  27.  * not null e unique no objeto Entidade para o campo {@link Cnpj} cnpj usando a
  28.  * anota��o @{@link AttributeOverride}
  29.  * <BR>
  30.  * <BR>Por Exemplo, uma classe Pedido de cliente, onde � registrado o Cnpj do cliente
  31.  * em um campo de nome "cnpj_cliente" e onde este n�o � <tt>unique</tt> e n�o
  32.  * <tt>null</tt>:
  33.  * <BR>
  34.  * <BR><tt>public class ClientePedido {
  35.  * <br> &nbsp; @{@link Id} @{@link GeneratedValue} private {@link Integer} id;
  36.  * <br> &nbsp; @{@link Embedded}
  37.  * <br> &nbsp; @{@link AttributeOverride}(column=@Column(name="cnpj_cliente",
  38.  * unique=false ,nullable=false),
  39.  * <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name = "digits")
  40.  * // < - - n�o altere esta parte.
  41.  * <br> &nbsp; {@link Cnpj} cnpjDoCliente;
  42.  * <BR> &nbsp; //...
  43.  * <BR>}</tt>
  44.  * <BR>
  45.  * <BR>Last Revision: 01/14/2009
  46.  * @author Tomaz Lavieri
  47.  * @since Lavieri Brazilian Utilities 1.0
  48.  * @version 1.0
  49.  */
  50. @Embeddable @AttributeOverride(column=@Column(name="cnpj",unique=true), name = "digits")
  51. public class Cnpj extends StringDigitsSequence {
  52.     /**
  53.      * Testes usados para valida��o do CNPJ
  54.      * <BR>
  55.      * <BR>Last Revision: 01/14/2009
  56.      * @author Tomaz Lavieri
  57.      * @since Lavieri Brazilian Utilities 1.0
  58.      * @version 1.0
  59.      */
  60.     private enum ValidateCnpj {
  61.         /**
  62.          * Cnpj n�o nulo, cnpj != null.
  63.          */
  64.         NOT_NULL {
  65.             @Override public boolean isValid(Cnpj cnpj) {
  66.                 return !cnpj.isNull();
  67.             }
  68.         },
  69.         /**
  70.          * Cnpj ##.###.###/0000-## com ordem n�o zero.
  71.          */
  72.         NOT_ORDER_ZERO {
  73.             @Override public boolean isValid(Cnpj cnpj) {
  74.                 return !cnpj.getOrderDigits().equals("0000");
  75.             }  
  76.         },
  77.         /**
  78.          * Cnpj 00.0##.###/YYYY-## com pelomenos 3 zeros no inicio, e ordem maior que
  79.          * 300 e que n�o seja o banco do brasil sa (00.000.000/####-##) n�o s�o
  80.          * permitidos.
  81.          */
  82.         NOT_BASE_START_WITH_ZERO_AND_HAS_ORDER_GREATER_300_AND_NOT_BB {
  83.             @Override public boolean isValid(Cnpj cnpj) {
  84.                 boolean startWith3zero =
  85.                     cnpj.getBaseDigits().substring(0, 3).equals("000");
  86.                 boolean isOrderGreater300 =
  87.                     Integer.parseInt(cnpj.getOrderDigits()) > 300;
  88.                 boolean isNotBancoDoBrasil =
  89.                         !cnpj.getBaseDigits().equals("00000000");
  90.                 return !(startWith3zero && isOrderGreater300 && isNotBancoDoBrasil);
  91.             }
  92.         },
  93.         /**
  94.          * Cnpj YY.YYY.YYY/####-##, onde Y � um n�mero que se repete, e diferente de
  95.          * zero. Por exemplo 11.111.111/0001-91 � invalido, mesmo o digito verificador
  96.          * estado correto, esta regra s� n�o vale para 00.000.000/####-## que � o CNPJ
  97.          * do banco de brasil sa.
  98.          */
  99.         NOT_BASE_WITH_ONLY_SAME_DIGIT_AND_NOT_BB {
  100.             @Override public boolean isValid(Cnpj cnpj) {
  101.                 boolean isNotBancoDoBrasil =
  102.                     !cnpj.getBaseDigits().equals("00000000");
  103.                 boolean allDigitEquals =
  104.                     cnpj.getBaseDigits().matches(cnpj.getBaseDigits().charAt(0)+"{8}");
  105.                 return !(isNotBancoDoBrasil && allDigitEquals);
  106.             }
  107.            
  108.         },
  109.         /**
  110.          * Cnpj com digitios verificadores corretos.
  111.          */
  112.         VALID_DIGITS {
  113.             @Override public boolean isValid(Cnpj cnpj) {
  114.                 return VerifierDigits.isValid(cnpj, BASE_LENGTH, FACTOR, COEFICIENTS);
  115.             }          
  116.         };
  117.         /**
  118.          * Realiza o teste para o {@link Cnpj} passado no parametro.
  119.          * <BR>
  120.          * <BR>Para validar um {@link Cnpj} � necessario que este seja v�lido para todos
  121.          * os {@link ValidateCnpj}, por�m um {@link Cnpj} ser� inv�lido quando qualquer
  122.          * um dos testes de {@link ValidateCnpj} retorne <tt>false</tt>.
  123.          * @param cnpj {@link Cnpj} a ser testado.
  124.          * @return  <tt>true</tt> - caso seja v�lido para este teste. N�o indica que este
  125.          *          {@link Cnpj} � valido, para tal � preciso ser valido para todos os
  126.          *          {@link ValidateCnpj}
  127.          *          <br><tt>false</tt> - caso seja inv�lido para este teste, o que
  128.          *          consequentemente invalida o {@link Cnpj}.
  129.          */
  130.         abstract public boolean isValid(Cnpj cnpj);
  131.     }
  132.    
  133.     /**  
  134.      * N�mero de digitos de um CNPJ (excluindo-se os digitos verificadores)  
  135.      */  
  136.     private static final int BASE_LENGTH = 12;  
  137.     /**  
  138.      * Pesos para o calculor de dos digitos verificadores do CNPJ.  
  139.      */
  140.     private static final IntegerDigitsSequence[] COEFICIENTS = {
  141.         //pesos para o 1� digito verificador
  142.         new IntegerDigitsSequence(new int[]{5,4,3,2,9,8,7,6,5,4,3,2}),
  143.         //pesos para o 2� digito verificador
  144.         new IntegerDigitsSequence(new int[]{6,5,4,3,2,9,8,7,6,5,4,3,2})
  145.     };
  146.     /**  
  147.      * Fator de divis�o, usado no calculo dos digitos verificadores.  
  148.      */  
  149.     private static final int FACTOR = 11; //fator de divis�o para calculo dos digitos
  150.     /**
  151.      * Mascara para a formata��o do CNPJ.
  152.      */
  153.     public static final String MASK = "##.###.###/####-##";
  154.     /**
  155.      * Calcula o digito verificador para o Cnpj que o {@link BigInteger} representa.
  156.      * <BR>O mesmo que:
  157.      * <BR><tt>{@link Cnpj} cnpj = {@link #valueOf(BigInteger)};
  158.      * <BR>{@link #calculateVerifyDigits(Cnpj)};</tt>
  159.      * <BR>
  160.      * <BR>Confira {@link #calculateVerifyDigits(Cnpj)} para informa��es de como o m�todo
  161.      * funciona.
  162.      * @see #valueOf(BigInteger)
  163.      * @see #calculateVerifyDigits(Cnpj)
  164.      * @param cnpj N�mero que representa o cnpj.
  165.      * @return  {@link String} contendo os 2 digitos que validam o CNPJ enviado.
  166.      *          <br><tt>null</tt> - caso o parametro enviado seja nulo.
  167.      */
  168.     public static String calculateVerifyDigits(BigInteger cnpj) {
  169.         return calculateVerifyDigits(valueOf(cnpj));
  170.     }
  171.     /**
  172.      * Retorna uma {@link String} contendo os 2 digitos Validadores para o {@link Cnpj}
  173.      * Enviado. Para tal usa-se do teste estipulado pela Receita Federal.
  174.      * <BR>
  175.      * <BR>mais informa��es em: http://www.receita-fazenda.gov.br
  176.      * @see #getVerifyDigits()
  177.      * @see #isValid(Cnpj)
  178.      * @param cnpj O cnpj ao qual deseja-se saber quais s�o os 2 digitos validadores.
  179.      * @return  {@link String} contendo os 2 digitos que validam o CNPJ enviado.
  180.      *          <br><tt>null</tt> - caso o parametro enviado seja nulo.
  181.      */
  182.     public static String calculateVerifyDigits(Cnpj cnpj) {
  183.         return (cnpj.equals(null)) ? null :
  184.                 VerifierDigits.getValidDigits(cnpj, BASE_LENGTH, FACTOR, COEFICIENTS);
  185.     }
  186.     /**
  187.      * Calcula o digito verificador para o Cnpj que o {@link Long} representa.
  188.      * <BR>O mesmo que:
  189.      * <BR><tt>{@link Cnpj} cnpj = {@link #valueOf(Long)};
  190.      * <BR>{@link #calculateVerifyDigits(Cnpj)};</tt>
  191.      * <BR>
  192.      * <BR>Confira {@link #calculateVerifyDigits(Cnpj)} para informa��es de como o m�todo
  193.      * funciona.
  194.      * @see #valueOf(Long)
  195.      * @see #calculateVerifyDigits(Cnpj)
  196.      * @param cnpj N�mero que representa o cnpj.
  197.      * @return  {@link String} contendo os 2 digitos que validam o CNPJ enviado.
  198.      *          <br><tt>null</tt> - caso o parametro enviado seja nulo.
  199.      */
  200.     public static String calculateVerifyDigits(Long cnpj) {
  201.         return calculateVerifyDigits(valueOf(cnpj));
  202.     }
  203.     /**
  204.      * Calcula o digito verificador para o Cnpj que a {@link String} representa.
  205.      * <BR>O mesmo que:
  206.      * <BR><tt>{@link Cnpj} cnpj = {@link #valueOf(String)};
  207.      * <BR>{@link #calculateVerifyDigits(Cnpj)};</tt>
  208.      * <BR>
  209.      * <BR>Confira {@link #calculateVerifyDigits(Cnpj)} para informa��es de como o m�todo
  210.      * funciona.
  211.      * @see #valueOf(String)
  212.      * @see #calculateVerifyDigits(Cnpj)
  213.      * @param cnpj N�mero que representa o cnpj.
  214.      * @return  {@link String} contendo os 2 digitos que validam o CNPJ enviado.
  215.      *          <br><tt>null</tt> - caso o parametro enviado seja nulo.
  216.      */
  217.     public static String calculateVerifyDigits(String cnpj) {
  218.         return calculateVerifyDigits(valueOf(cnpj));
  219.     }
  220.     /**
  221.      * Cria um CNPJ <u>v�lido</u> randomico
  222.      * @see #isValid()
  223.      * @return {@link Cnpj} com um n�mero aleat�rio v�lido
  224.      */
  225.     public static Cnpj createRandom() {
  226.         Cnpj cnpj = null;
  227.         boolean needCalculate = true;
  228.         while (needCalculate) {
  229.             long randomBasePlusOrder = (long) (Math.random() * Math.pow(10, 12));
  230.             String digits = calculateVerifyDigits(randomBasePlusOrder + "00");
  231.             cnpj = new Cnpj(randomBasePlusOrder + digits);
  232.             needCalculate = !cnpj.isValid();
  233.         }
  234.         return cnpj;
  235.     }
  236.     /**
  237.      * Altera o valor da ordem, quando inv�lido, para a ordem 0001.
  238.      * <BR>S�o invalidos ordens com mais de 4 digitos, al�m da ordem 0000, ordens com
  239.      * menos de 4 digitios ter�o 0 acrecentado a esquerda, Por exemplo "12" ser� "0012"
  240.      * @see #isValid()
  241.      * @return {@link Cnpj} com um n�mero aleat�rio v�lido
  242.      */
  243.     private static String formatOrder(String order) {
  244.         String cnpjOrder = null;
  245.         if (order == null  
  246.                 || (cnpjOrder = StringUtil.toNumericDigitsOnly(order))
  247.                 .matches("0{"+cnpjOrder.length()+"}")
  248.                 || (cnpjOrder.length() > 4)
  249.                 || (cnpjOrder = "0001".substring(0,4-cnpjOrder.length()) + cnpjOrder)
  250.                     .equals("0000"))
  251.             cnpjOrder = "0001";
  252.         return cnpjOrder;
  253.     }
  254.     /**
  255.      * Cria um CNPJ <u>v�lido</u> randomico para a ordem (n�mero da filial) enviada, onde
  256.      * a ordem representa o trecho em negrito do CNPJ
  257.      * ##&#46;###&#46;###/<font color="darkred"><u>####</u></font>-## .
  258.      * <BR>
  259.      * <BR>A ordem obrigatoriamente deve ser um n�mero entre 1 e 9999, quaiquer valor
  260.      * fora deste range ser� automaticamente convertido para 1.
  261.      * @see #isValid()
  262.      * @param order valor da ordem (n�mero da filial) do cnpj
  263.      * @return {@link Cnpj} com um n�mero aleat�rio v�lido para a ordem especificada.  
  264.      */
  265.     public static Cnpj createRandom(Integer order) {
  266.         return (order == null) ? createRandom("0001") :
  267.             createRandom(order.toString());
  268.     }
  269.     /**
  270.      * Cria um CNPJ <u>v�lido</u> randomico para a ordem (n�mero da filial) enviada, onde
  271.      * a ordem representa o trecho em negrito do CNPJ
  272.      * ##&#46;###&#46;###/<font color="darkred"><u>####</u></font>-## .
  273.      * <BR>
  274.      * <BR>A ordem obrigatoriamente deve ser uma {@link String} n�merica entre "0001" e
  275.      * "9999", quaiquer valor fora deste range ser� automaticamente convertido para
  276.      * "0001".
  277.      * @see #isValid()
  278.      * @param order valor da ordem (n�mero da filial) do cnpj
  279.      * @return {@link Cnpj} com um n�mero aleat�rio v�lido para a ordem especificada.  
  280.      */
  281.     public static Cnpj createRandom(String order) {
  282.         String cnpjOrder = formatOrder(order);
  283.         Cnpj cnpj = null;
  284.         boolean needTryAgain = true;
  285.         while (needTryAgain) {
  286.             long random = (long) (Math.random() * Math.pow(10, 8));
  287.             String digits = calculateVerifyDigits(random + cnpjOrder + "00");
  288.             cnpj = new Cnpj(random + cnpjOrder + digits);
  289.             needTryAgain = !cnpj.isValid();
  290.         }
  291.         return cnpj;
  292.     }
  293.     /**
  294.      * O mesmo que {@link #valueOf(BigInteger)}&#46;{@link #isValid()}.
  295.      * <BR>
  296.      * <BR>Utilize este m�todo com cuidado, pois ele implicitamente cria uma instancia
  297.      * de {@link Cnpj}, e em seguida invoca a realiza��o do teste de validade. Caso
  298.      * necessite fazer {@link #isValid(BigInteger)} varias vezes para o mesmo
  299.      * {@link Cnpj} crie o objeto e o utilize, para consumir menos processo.
  300.      * <BR>
  301.      * <BR>Consulte {@link #isValid()} para verificar como o teste � realizado.
  302.      * @see #isValid()
  303.      * @see #Cnpj(BigInteger)
  304.      * @see #valueOf(BigInteger)
  305.      * @param cnpj N�mero que representa o cnpj.
  306.      * @return  <tt>true</tt> - caso o {@link Cnpj} seja v�lido.
  307.      *          <BR><tt>false</tt> - caso contrario.
  308.      */
  309.     public static boolean isValid(BigInteger cnpj) {
  310.         return valueOf(cnpj).isValid();
  311.     }
  312.     /**
  313.      * O mesmo que {@link #valueOf(Long)}&#46;{@link #isValid()}.
  314.      * <BR>
  315.      * <BR>Utilize este m�todo com cuidado, pois ele implicitamente cria uma instancia
  316.      * de {@link Cnpj}, e em seguida invoca a realiza��o do teste de validade. Caso
  317.      * necessite fazer {@link #isValid(Long)} varias vezes para o mesmo
  318.      * {@link Cnpj} crie o objeto e o utilize, para consumir menos processo.
  319.      * <BR>
  320.      * <BR>Consulte {@link #isValid()} para verificar como o teste � realizado.
  321.      * @see #isValid()
  322.      * @see #Cnpj(Long)
  323.      * @see #valueOf(Long)
  324.      * @param cnpj N�mero que representa o cnpj.
  325.      * @return  <tt>true</tt> - caso o {@link Cnpj} seja v�lido.
  326.      *          <BR><tt>false</tt> - caso contrario.
  327.      */
  328.     public static boolean isValid(Long cnpj) {
  329.         return valueOf(cnpj).isValid();
  330.     }
  331.     /**
  332.      * O mesmo que {@link #valueOf(String)}&#46;{@link #isValid()}.
  333.      * <BR>
  334.      * <BR>Utilize este m�todo com cuidado, pois ele implicitamente cria uma instancia
  335.      * de {@link Cnpj}, e em seguida invoca a realiza��o do teste de validade. Caso
  336.      * necessite fazer {@link #isValid(String)} varias vezes para o mesmo
  337.      * {@link Cnpj} crie o objeto e o utilize, para consumir menos processo.
  338.      * <BR>
  339.      * <BR>Consulte {@link #isValid()} para verificar como o teste � realizado.
  340.      * @see #isValid()
  341.      * @see #Cnpj(String)
  342.      * @see #valueOf(String)
  343.      * @param cnpj N�mero que representa o cnpj.
  344.      * @return  <tt>true</tt> - caso o {@link Cnpj} seja v�lido.
  345.      *          <BR><tt>false</tt> - caso contrario.
  346.      */
  347.     public static boolean isValid(String cnpj) {
  348.         return valueOf(cnpj).isValid();
  349.     }
  350.     /**
  351.      * Caso o {@link BigInteger} enviado seja nulo, retorna null, caso contrario
  352.      * transforma-o em string e o envia para {@link #toCnpjString(String)} para
  353.      * tratamento.
  354.      * @see #toCnpjString(String)
  355.      * @param cnpj {@link BigInteger} n�mero que representa o CNPJ.
  356.      * @return  uma cnpjString sem formata��o, apenas com os digitos
  357.      *          <BR><tt>null</tt> Caso o parametro enviado seja nulo.
  358.      */
  359.     public static String toCnpjString(BigInteger cnpj) {
  360.         return (cnpj == null) ? null : toCnpjString(cnpj.toString());
  361.     }
  362.     /**
  363.      * Caso o {@link Long} enviado seja nulo, retorna null, caso contrario transforma-o
  364.      * em string e o envia para {@link #toCnpjString(String)} para tratamento.
  365.      * @see #toCnpjString(String)
  366.      * @param cnpj {@link Long} n�mero que representa o CNPJ.
  367.      * @return  uma cnpjString sem formata��o, apenas com os digitos
  368.      *          <BR><tt>null</tt> Caso o parametro enviado seja nulo.
  369.      */
  370.     public static String toCnpjString(Long cnpj) {
  371.         return (cnpj == null) ? null : toCnpjString(cnpj.toString());
  372.     }
  373.     /**
  374.      * Retira toda formata��o existente na String enviada, removendo todos os caracters
  375.      * inv�lidos, e deichando apenas n�meros, al�m de ajustar a string para 14 digitos.
  376.      * <BR>
  377.      * <BR>Caso a sequencia de digitos seja inferior a 14 digitos, preenche a sequencia
  378.      * com "0"s a esquerda da sequencia.
  379.      * <BR>
  380.      * <BR>Caso a sequencia de digitos seja superio a 14 digitos ela ser� truncada para
  381.      * 14 digitos.
  382.      * @see StringUtil#toNumericDigitsOnly(String)
  383.      * @param cnpj {@link String} a ser transformado em uma cnpjString.
  384.      * @return  uma cnpjString sem formata��o, apenas com os digitos
  385.      *          <BR><tt>null</tt> Caso o parametro enviado seja nulo.
  386.      */
  387.     public static String toCnpjString(String cnpj) {
  388.         if (cnpj != null) {
  389.             cnpj = StringUtil.toNumericDigitsOnly(cnpj);
  390.             if (cnpj.length()>14)
  391.                 cnpj = cnpj.substring(0, 14);
  392.             else if (cnpj.length()<14) //insert (14-length) "0"s before the cnpj number
  393.                 cnpj = "00000000000000".substring(cnpj.length(), 14) + cnpj;
  394.         }
  395.         return cnpj;
  396.     }
  397.     /**
  398.      * Converte o {@link BigInteger} enviado em um {@link Cnpj}.
  399.      * <BR>
  400.      * <BR>O mesmo que: <tt>new {@link #Cnpj(BigInteger)}</tt>.
  401.      * <BR>
  402.      * <BR>Aceita valor de entrado nulo, e neste caso retorna um objeto {@link Cnpj} onde
  403.      * {@link #isNull()} � <tt>true</tt>
  404.      * @see #Cnpj(BigInteger)
  405.      * @param cnpj N�mero do cnpj
  406.      * @return {@link Cnpj} que representa o n�mero enviado.
  407.      */
  408.     public static Cnpj valueOf(BigInteger cnpj) {
  409.         return new Cnpj(cnpj);
  410.     }
  411.     /**
  412.      * Converte o {@link Long} enviado em um {@link Cnpj}.
  413.      * <BR>
  414.      * <BR>O mesmo que: <tt>new {@link #Cnpj(Long)}</tt>.
  415.      * <BR>
  416.      * <BR>Aceita valor de entrado nulo, e neste caso retorna um objeto {@link Cnpj} onde
  417.      * {@link #isNull()} � <tt>true</tt>
  418.      * @see #Cnpj(Long)
  419.      * @param cnpj N�mero do cnpj
  420.      * @return {@link Cnpj} que representa o n�mero enviado.
  421.      */
  422.     public static Cnpj valueOf(Long cnpj) {
  423.         return new Cnpj(cnpj);
  424.     }
  425.     /**
  426.      * Converte o {@link String} enviado em um {@link Cnpj}.
  427.      * <BR>
  428.      * <BR>O mesmo que: <tt>new {@link #Cnpj(String)}</tt>.
  429.      * <BR>
  430.      * <BR>Aceita valor de entrado nulo, e neste caso retorna um objeto {@link Cnpj} onde
  431.      * {@link #isNull()} � <tt>true</tt>
  432.      * @see #Cnpj(String)
  433.      * @param cnpj N�mero do cnpj
  434.      * @return {@link Cnpj} que representa o n�mero enviado.
  435.      */
  436.     public static Cnpj valueOf(String cnpj) {
  437.         return new Cnpj(cnpj);
  438.     }
  439.     /**  
  440.      * Verifica��o se este CNPJ � valido, null significa que o teste ainda n�o foi  
  441.      * realizado, so � verificar uma vez, apois a primeira chamada de isValid()  
  442.      * @see isValid()  
  443.      */  
  444.     @Transient private Boolean valid = null;
  445.     /**
  446.      * Constroi um CNPJ com valor nulo
  447.      * @see #isNull()
  448.      */
  449.     public Cnpj() {
  450.         super(null);
  451.     }
  452.     /**
  453.      * Constroi um objeto {@link Cnpj} a partir de um {@link BigInteger}.
  454.      * <BR>
  455.      * <BR>Qualquer numero enviado, ser� devidamente tratado, invocando
  456.      * implicitamente {@link #toCnpjString(BigInteger)}, veja sua documenta��o para
  457.      * maiores detalhes.
  458.      * @see #toCnpjString(BigInteger)
  459.      * @param cnpj {@link BigInteger} contendo o valor do cnpj
  460.      */
  461.     public Cnpj(BigInteger cnpj) {
  462.         super(toCnpjString(cnpj));
  463.        
  464.     }
  465.     /**
  466.      * Constroi um objeto {@link Cnpj} a partir de um {@link Long}.
  467.      * <BR>
  468.      * <BR>Qualquer numero enviado, ser� devidamente tratado, invocando
  469.      * implicitamente {@link #toCnpjString(Long)}, veja sua documenta��o para maiores
  470.      * detalhes.
  471.      * @see #toCnpjString(Long)
  472.      * @param cnpj {@link Long} valor do cnpj.
  473.      */
  474.     public Cnpj(Long cnpj) {
  475.         super(toCnpjString(cnpj));
  476.     }
  477.     /**
  478.      * Constroi um objeto {@link Cnpj} a partir da uma {@link String}.
  479.      * <BR>
  480.      * <BR>Qualquer que seja a string passada, ela ser� devidamente tratada, invocando
  481.      * implicitamente {@link #toCnpjString(String)}, veja sua documenta��o para maiores
  482.      * detalhes.
  483.      * @see #toCnpjString(String)
  484.      * @param cnpj {@link String} contendo o cnpj.
  485.      */
  486.     public Cnpj(String cnpj) {
  487.         super(toCnpjString(cnpj));
  488.     }
  489.     /**
  490.      * Applica ao valor deste {@link Cnpj} a mascara de formata��o {@link Cnpj#MASK}
  491.      * @return
  492.      */
  493.     public String applayMask() {
  494.         String mask = "%s.%s.%s/%s-%s";
  495.         String cnpj = getCnpjString();
  496.         return String.format(mask,
  497.                 cnpj.substring(0,2),
  498.                 cnpj.substring(2,5),
  499.                 cnpj.substring(5,8),
  500.                 cnpj.substring(8,12),
  501.                 cnpj.substring(12,14)
  502.                 );
  503.     }
  504.     /**
  505.      * Verifica se o <tt>{@link Object} cnpj</tt> enviado representa o mesmo que este
  506.      * cnpj.
  507.      * <BR>
  508.      * <BR>� capaz de testar se este objeto {@link Cnpj} � igual a uma {@link String},
  509.      * {@link BigInteger}, {@link Long}, a
  510.      * uma {@link StringDigitsSequence}, ou a outro {@link Cnpj}.
  511.      * <BR>
  512.      * <BR>O Cnpj aceita o construtor nulo, neste caso se torando um cnpj <tt>null</tt>,
  513.      * isto pode ser testado em {@link #isNull()}, comparar um cnpj com uma variavel com
  514.      * valor nulo, voltar� true, caso o cnpj tb seja nulo, em outras palavras:
  515.      * <BR><tt>if (cnpj.isNull())
  516.      * <BR> &nbsp; &nbsp; (cnpj.equals(null)) //is always true
  517.      * </tt>
  518.      * @return  <tt>true</tt> caso o objeto enviado represente o mesmo cnpj deste objeto
  519.      *          <BR><tt>false</tt> caso contrario.
  520.      */
  521.     public boolean equals(Object cnpj) {
  522.         boolean result = false;
  523.         if (cnpj == null || this.isNull())
  524.             result = cnpj == getCnpjString();
  525.         else if (cnpj instanceof String)
  526.             result = toCnpjString((String)cnpj).equals(getCnpjString());
  527.         else if (cnpj instanceof StringDigitsSequence)
  528.             result = ((StringDigitsSequence)cnpj).getSequenceString()
  529.                         .equals(getCnpjString());
  530.         else if (cnpj instanceof Long)
  531.             result = toCnpjString((Long)cnpj).equals(getCnpjString());
  532.         else if (cnpj instanceof BigInteger)
  533.             result = toCnpjString((BigInteger)cnpj).equals(getCnpjString());
  534.        
  535.         return result;
  536.     }
  537.     /**
  538.      * Retorna os 8 digitos basicos deste {@link Cnpj} em uma string, onde os digitos
  539.      * basicos correspondem ao trecho em destaque do {@link Cnpj}
  540.      * <font color="darkred"><u>##</u>&#46;<u>###</u>&#46;<u>###</u></font>/####-## .
  541.      * <BR>
  542.      * <BR>A string de retorno � sem formata��o, contendo apenas os 8 digitos.
  543.      * @see #isNull()
  544.      * @see #getCnpjString()
  545.      * @see #getOrderDigits()
  546.      * @see #getVerifyDigits()
  547.      * @return {@link String} - com os 8 digitos basicos.
  548.      *          <BR><tt>null</tt> - caso o cpf seja nulo, consulte {@link #isNull()}
  549.      */
  550.     public String getBaseDigits() {
  551.         return (isNull()) ? null : getSequenceString().substring(0, 8);
  552.     }
  553.     /**
  554.      * Retorna os 14 digitos deste {@link Cnpj} em uma string.
  555.      * <BR>
  556.      * <BR>A string de retorno � sem formata��o, contendo apenas os 14 digitos.
  557.      * @see #isNull()
  558.      * @see #getBaseDigits()
  559.      * @see #getOrderDigits()
  560.      * @see #getVerifyDigits()
  561.      * @return {@link String} - com os 14 digitos representativos do {@link Cnpj}.
  562.      *          <BR><tt>null</tt> - caso o cpf seja nulo, consulte {@link #isNull()}
  563.      */
  564.     public String getCnpjString() {
  565.         return getSequenceString();
  566.     }
  567.     /**
  568.      * Retorna os 4 digitos da ordem deste {@link Cnpj} em uma string, onde os digitos
  569.      * de ordem correspondem ao trecho em destaque do {@link Cnpj}
  570.      * ##&#46;###&#46;###/<font color="darkred"><u>####</u></font>-##
  571.      * <BR>a ordem do {@link Cnpj} representa o n�mero da filial.
  572.      * <BR>
  573.      * <BR>A string de retorno � sem formata��o, contendo apenas os 4 digitos.
  574.      * @see #isNull()
  575.      * @see #getBaseDigits()
  576.      * @see #getCnpjString()
  577.      * @see #getVerifyDigits()
  578.      * @return {@link String} - com os 4 digitos de ordem.
  579.      *          <BR><tt>null</tt> - caso o cpf seja nulo, consulte {@link #isNull()}
  580.      */
  581.     public String getOrderDigits() {
  582.         return (isNull()) ? null : getSequenceString().substring(8, 12);
  583.     }
  584.     /**
  585.      * Retorna os 2 digitos de verifica��o deste {@link Cnpj} em uma string, onde os
  586.      * digitos de verifica��o correspondem ao trecho em negrito do {@link Cnpj}
  587.      * ##&#46;###&#46;###/####-<font color="darkred"><u>##</u></font> .
  588.      * <BR>
  589.      * <BR>Estes dois digitos n�o s�o necess�riamente v�lidos, e sim os contidos neste
  590.      * Cnpj, caso {@link #isValid()} seja <tt>true</tt> ent�o estes 2 digitos coincidir�o
  591.      * com os digitos v�lidos deste Cnpj. {@link #isValid()} pode ser false, e ainda
  592.      * assim estes digitos podem ser coincidentes, o que indica que este {@link Cnpj}
  593.      * � invalido pelas regras de exce��es.
  594.      * <BR>
  595.      * <BR>A string de retorno � sem formata��o, contendo apenas os 2 digitos.
  596.      * <BR>
  597.      * <BR>O calculo dos digitos verificadores corretos pode ser realizado enviando este
  598.      * {@link Cnpj} para o m�todo {@link #calculateVerifyDigits(Cnpj)}.
  599.      * @see #calculateVerifyDigits(Cnpj)
  600.      * @see #isNull()
  601.      * @see #getBaseDigits()
  602.      * @see #getCnpjString()
  603.      * @see #getOrderDigits()
  604.      * @return {@link String} - com os 2 digitos de verifica��o.
  605.      *          <BR><tt>null</tt> - caso o cpf seja nulo, consulte {@link #isNull()}
  606.      */
  607.     public String getVerifyDigits() {
  608.         return (isNull()) ? null : getSequenceString().substring(12, 14);
  609.     }
  610.     /**
  611.      * Diz se este {@link Cnpj} representa um cnpj nulo, construido geralmente a partir
  612.      * de {@link #Cnpj()}.
  613.      * <BR>
  614.      * <BR>Pode-se criar, tamb�m, Cnpj nulo enviando para o construtor um objeto com
  615.      * valor nulo, Por Exemplo:
  616.      * <br><tt>String a = null;
  617.      * <BR>Cnpj cnpjNull = new Cnpj(a);</tt>
  618.      * @return  <tt>true</tt> - caso a String representativa deste {@link Cnpj} seja nula
  619.      *          <br><tt>false</tt> - caso contraio.
  620.      */
  621.     public boolean isNull() {
  622.         return (getCnpjString() == null);
  623.     }
  624.     /**
  625.      * Se este cnpj � um CNPJ valido para a receita federal.
  626.      * <BR>
  627.      * <BR>S� ser�o validos os {@link Cnpj}, n�o nulos ({@link #isNull()}), com os
  628.      * digitos verificadores corretos, que n�o esteja contido em nenhuma das exce��es,
  629.      * Por exemplo:
  630.      * <BR> - N�mero de ordem igual a zero, 12.345.678/0000-04
  631.      * <BR> - N�mero basico apenas com digitos repetidos e n�o zero, 11.111.111/0001-91
  632.      * <BR> - Iniciado com tr�s zeros e com n�mero de ordem maior que trezentos,
  633.      * 00.001.341/0301-00, exclu�-se desta verifica��o os {@link Cnpj}s do Banco do
  634.      * Brasil SA 00.000.000/0401-42 por exemplo.
  635.      * @return  <tt>true</tt> - Caso o cnpj seja v�lido
  636.      *          <BR><tt>false</tt> - Caso o cnpj seja inv�lido
  637.      */
  638.     public boolean isValid() {
  639.         if (valid == null)
  640.             valid = validateTeste();
  641.         return valid;
  642.     }
  643.     /**
  644.      * Converte este {@link Cnpj} em um {@link BigInteger} representativo do n�mero deste
  645.      * cnpj.
  646.      * <BR>
  647.      * <BR>Todo objeto {@link Cnpj} que � transformado em um {@link BigInteger} poder�
  648.      * ser recuperado atraves de {@link #valueOf(BigInteger)}.
  649.      * <BR>
  650.      * <BR><tt>//is always true
  651.      * <br>cnpj.equals(Cnpj.valueOf(cnpj.{@link #toBigInteger()}))</tt>
  652.      * <BR>
  653.      * <BR>Se <tt>({@link #isNull()} == true)</tt> ent�o tamb�m ser� verdade que
  654.      * <tt>({@link #toBigInteger()} == null)</tt>
  655.      * @see #valueOf(BigInteger)
  656.      * @see #isNull()
  657.      * @return  {@link BigInteger} que representa este cnpj
  658.      *          <br><tt>null</tt> - caso o {@link #isNull()} seja <tt>true</tt>
  659.      */
  660.     public BigInteger toBigInteger() {
  661.         return (isNull()) ? null : new BigInteger(toString());
  662.     }
  663.     /**
  664.      * Converte este {@link Cnpj} em um {@link Long} representativo do n�mero deste
  665.      * cnpj.
  666.      * <BR>
  667.      * <BR>Todo objeto {@link Cnpj} que � transformado em um {@link Long} poder�
  668.      * ser recuperado atraves de {@link #valueOf(Long)}.
  669.      * <BR>
  670.      * <BR><tt>//is always true
  671.      * <br>cnpj.equals(Cnpj.valueOf(cnpj.{@link #toLong()}))</tt>
  672.      * <BR>
  673.      * <BR>Se <tt>({@link #isNull()} == true)</tt> ent�o tamb�m ser� verdade que
  674.      * <tt>({@link #toLong()} == null)</tt>
  675.      * @see #valueOf(Long)
  676.      * @see #isNull()
  677.      * @return  {@link Long} que representa este cnpj
  678.      *          <br><tt>null</tt> - caso o {@link #isNull()} seja <tt>true</tt>
  679.      */
  680.     public Long toLong() {
  681.         return (isNull()) ? null : new Long(toString());
  682.     }
  683.     /**
  684.      * Converte este {@link Cnpj} em um {@link String} aplicando a ela a mascara
  685.      * {@link #MASK} de CNPJ {@value #MASK} . Tem a mesma fun��o que
  686.      * {@link #applayMask()}
  687.      * <BR>
  688.      * <BR>Todo objeto {@link Cnpj} que � transformado em um {@link String} poder�
  689.      * ser recuperado atraves de {@link #valueOf(String)}.
  690.      * <BR>
  691.      * <BR><tt>//is always true
  692.      * <br>cnpj.equals(Cnpj.valueOf(cnpj.{@link #toString()}))</tt>
  693.      * <BR>
  694.      * <BR>Se <tt>({@link #isNull()} == true)</tt> ent�o tamb�m ser� verdade que
  695.      * <tt>({@link #toString()} == null)</tt>
  696.      * @see #valueOf(String)
  697.      * @see #isNull()
  698.      * @see #getCnpjString()
  699.      * @return  {@link String} que representa este cnpj
  700.      *          <br><tt>null</tt> - caso o {@link #isNull()} seja <tt>true</tt>
  701.      */
  702.     public String toString() {
  703.         return applayMask();
  704.     }
  705.     /**
  706.      * Verifica primeiramente todas as particularidades do CNPJ (como se todos os digitos
  707.      * s�o iguais a zero) para s� depois fazer fazer o teste dos digitos verificadores
  708.      * @see ValidateCnpj
  709.      * @return <tt>true</tt> - quando cnpj � valido
  710.      *          <br><tt>false</tt> - quando o cnpj � invalido.
  711.      */
  712.     private boolean validateTeste() {
  713.         boolean stillValid = true;
  714.         for (ValidateCnpj validate : ValidateCnpj.values()) {
  715.             stillValid = validate.isValid(this);
  716.             if (!stillValid)
  717.                 break;
  718.         }
  719.         return stillValid;
  720.     }
  721. }
Advertisement
Add Comment
Please, Sign In to add comment