Cálculo de CUIT (Argentina)

2007-04-11
2013-05-02
  • Jorge Dreher

    Jorge Dreher - 2007-04-11

    Adjunto el validator para el cálculo de CUIT (Clave única de identificación tributaria), que es utilizado por la legislación Argentina.

    /*
    *  TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L.
    *    Copyright (C) 2007 Autentia Real Bussiness Solution S.L.
    *
    *     This program is free software; you can redistribute it and/or
    *     modify it under the terms of the GNU General Public License
    *     as published by the Free Software Foundation; either version 2
    *     of the License, or (at your option) any later version.
    *
    *     This program is distributed in the hope that it will be useful,
    *     but WITHOUT ANY WARRANTY; without even the implied warranty of
    *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    *     GNU General Public License for more details.
    *
    *     You should have received a copy of the GNU General Public License
    *     along with this program; if not, write to the Free Software
    *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    *
    *     Autentia Real Bussiness Solution S.L.
    *     Tlf: +34 91 675 33 06, +34 655 99 11 72
    *     Fax: +34 91 656 65 04
    *     info@autentia.com
    */

    package com.autentia.intra.validator;

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    import javax.faces.validator.Validator;
    import javax.faces.validator.ValidatorException;

    import org.apache.commons.lang.StringUtils;

    /**
    * Validador de CUIT ( Clave Unica de Identificacion Tributaria - Argentina )
    * Formato ##-########-#  el último dígito es el verificador
    * @author JORGE DREHER, jorge.dreher@gmail.com
    */
    public class CuitValidator implements Validator {
        /**
         * Efect�a el proceso de validaci�n
         */
        public void validate(FacesContext context,
                UIComponent component, Object value) throws ValidatorException {
           
            // Si el valor es null, lo transformamos en un valor vac�o
            String valor = StringUtils.defaultString((String)value);
           
            int[] tab_cuit    = {0,0,0,0,0,0,0,0,0,0,0};
            int acumulo    = 0;
            int digitos    = 0;
            String auxi    = "";
            Boolean bueno    = true;
            String error    = "";
           
            // quitamos las barras si es que se ingresaron
            valor = valor.replace("-", "").trim();
            auxi = valor;
           
            // el valor debe tener 11 posiciones
            if(valor.length() != 11)
                throw new ValidatorException(new FacesMessage("El componente " + component.getId() + " no contiene un CUIT válido. Debe contener 11 posiciones numéricas"));
           
            // deben ser 11 valores numéricos
            Pattern mask =  Pattern.compile("[0-9]{11}");
            Matcher matcher = mask.matcher(valor);
            if(!matcher.matches())
                throw new ValidatorException(new FacesMessage("El componente " + component.getId() + " no contiene un CUIT válido. Las 11 posiciones deben ser numéricas:"));
           
            digitos = Integer.parseInt(auxi.substring(0,2));
           
            if ( (digitos == 20) || (digitos == 23) ||
                    (digitos == 24) || (digitos == 27) ||
                    (digitos == 30) || (digitos == 33) ||
                    (digitos == 34) ) {
                int p = 10;
                while( p >= 0 ) {
                    tab_cuit[10-p] = Integer.parseInt(auxi.substring(p, p+1));
                    p--;
                }
                for( int i = 0; i < 7; i++)
                    acumulo+= (tab_cuit[i] * (i+1));
               
                for( int i = 7; i < 11; i++ )
                    acumulo+= (tab_cuit[i] * ((i+1)-6));
               
                if( acumulo % 11 != 0 ){
                    bueno = false;
                    error = "El digito verificador NO es válido";
                }else
                    bueno = true;
               
            } else{
                bueno = false;
                error = "No comienza con un número correcto:" + String.valueOf(digitos);
            }
           
            if(!bueno)
                throw new ValidatorException(new FacesMessage("El componente " + component.getId() + " no contiene un CUIT válido." + " " + error));
           
        }
    }

     
    • Roberto Canales

      Roberto Canales - 2007-04-11

      Muchas gracias Jorge:

      Todavía tenemos que educarnos un poquito en el desarrollo multi-región :-)). El trabajo acumula auunque ahora le estamos dando un gran mepujón a la aplicación.

      Cualquier aportación es bienvenida y procuraremos dejar los enganches para porder externderla/variarla adecuadamente.

      Un saludo

       

Log in to post a comment.