Documentación GVHIDRA 3.1.5
Referencia de la Clase IgepTransformer

Métodos públicos

 __construct ($validate=false)
 setDate ($from, $to)
 setDecimal ($from, $to, $fromGroup='', $toGroup='')
 setCharacter ($from, $to)
 expandExponent ($num, $sep_d=null, $sep_g=null)
 decimalPad ($num, $decimales)
 decimalPadDatos ($num, $decimales, $dsn)
 process ($type, $value)
 getTransformErrors ()

Campos de datos

 $type_mod = array()
 $decimal_metadata = array()
 $character_metadata = array()
 $date_metadata = array()

Métodos privados

 isDate ($y, $m, $d)
 _processDate ($data)
 _processDateTime ($data)
 _processDecimal ($data)
 _processCharacter ($data)
 addError ($msg)

Atributos privados

 $transform_errors = array()
 $validate

Descripción detallada

Definición en la línea 39 del archivo IgepTransformer.php.


Documentación del constructor y destructor

__construct ( validate = false)

Constructor

Parámetros:
boolindica si antes de transformar tiene que buscar errores en campo origen (normalmente para datos que introduce el usuario)

Definición en la línea 57 del archivo IgepTransformer.php.

        {
                if (!is_bool($validate))
                        throw new gvHidraException('El constructor de IgepTransformer espera un booleano');
                $this->validate = $validate;
        }

Documentación de las funciones miembro

_processCharacter ( data) [private]

Convierte cadenas

private

Parámetros:
stringdata
Devuelve:
string

Definición en la línea 438 del archivo IgepTransformer.php.

                                             {
                if (isset($this->type_mod[TIPO_CARACTER])) {
                foreach($this->character_metadata as $change){
                    $data = str_replace($change['from'],$change['to'],$data);
                        }
                }
        return $data;
    }
_processDate ( data) [private]

Convierte fechas Devuelve false si hay errores.

private

Parámetros:
stringdata
Devuelve:
string

Definición en la línea 296 del archivo IgepTransformer.php.

                                        {
        //Preparamos datos para el caso de las fechas
        if ($this->validate and empty($this->date_metadata['separatorIn'])) {
                throw new gvHidraException("Error de uso del transformer: se intenta transformar una fecha sin llamar previamente a setDate");
        }
        $timeless = explode(' ',$data);
                if ($this->validate or isset($this->type_mod[TIPO_FECHA])) {
                        // prepara el valor origen, bien para validar o para transformar
                $hay_error = false;
                if (count($timeless) > 1) {
                        $this->addError("El campo '$data' no es una fecha sin hora vlida.");
                        $hay_error = true;
                        //return false;
                }
                        $d=$this->date_metadata['posDay'];
                        $j=$d;
                        $m=$this->date_metadata['posMonth'];
                $n=$m;
                        $Y=$this->date_metadata['posYear'];
                $date = explode($this->date_metadata['separatorIn'], $timeless[0]);
                    if (!$hay_error and (count($date) != 3 or !$this->isDate($date[$Y], $date[$n], $date[$j]) ) ) {
                        $this->addError("El campo '$data' no es una fecha vlida.");
                        $hay_error = true;
                        //return false;
                    }
                }
        if (isset($this->type_mod[TIPO_FECHA])) {
            // en fechas convertidas siempre rellenamos dia y mes con ceros
            if (strlen($date[$j]) < 2)
                $date[$j] = str_pad($date[$j], 2, "0", STR_PAD_LEFT);
            if (strlen(@$date[$n]) < 2)
                $date[$n] = str_pad(@$date[$n], 2, "0", STR_PAD_LEFT);
                        $position = $this->date_metadata['position'];
            return $date[$$position[0]].$this->date_metadata['separatorOut'].
                     $date[$$position[1]].$this->date_metadata['separatorOut'].
                     $date[$$position[2]];
        } else
                        return $timeless[0]; 
    } 
_processDateTime ( data) [private]

Convierte fechas con hora Devuelve false si hay errores.

private

Parámetros:
stringdata
Devuelve:
string

Definición en la línea 344 del archivo IgepTransformer.php.

                                            {
        //Preparamos datos para el caso de las fechas
        if ($this->validate and empty($this->date_metadata['separatorIn'])) {
                throw new gvHidraException("Error de uso del transformer: se intenta transformar una fecha-hora sin llamar previamente a setDate");
        }
        if ($this->validate or isset($this->type_mod[TIPO_FECHAHORA])) {
                        // prepara el valor origen, bien para validar o para transformar
                $d=$this->date_metadata['posDay'];
                $j=$d;
                $m=$this->date_metadata['posMonth'];
                $n=$m;
                $Y=$this->date_metadata['posYear'];
                $position = $this->date_metadata['position'];
                $dateTime = explode(' ',$data);
                $date = explode($this->date_metadata['separatorIn'],$dateTime[0]);
                    if (count($date) != 3 or !$this->isDate($date[$Y], $date[$n], $date[$j]) ) {
                        $this->addError("El campo '$data' no es una fecha vlida.");
                        //return false;
                        } elseif (!empty($dateTime[1])){
                                $h = explode(':',$dateTime[1]);
                                if (count($h)<2 or
                                   !is_numeric($h[0]) or $h[0]<0 or $h[0]>23 or
                                   !is_numeric($h[1]) or $h[1]<0 or $h[1]>59 or
                                   (isset($h[2]) and (!is_numeric($h[2]) or $h[2]<0 or $h[2]>59))) {
                                        $this->addError("El campo '$data' no tiene una hora vlida.");
                                        //return false;
                                }
                        }
        }
                if (isset($this->type_mod[TIPO_FECHAHORA])) {
                        // en fechas convertidas siempre rellenamos dia y mes con ceros
                        if (strlen($date[$j]) < 2)
                                $date[$j] = str_pad($date[$j], 2, "0", STR_PAD_LEFT);
                if (strlen(@$date[$n]) < 2)
                        $date[$n] = str_pad(@$date[$n], 2, "0", STR_PAD_LEFT);
                return $date[$$position[0]].$this->date_metadata['separatorOut'].
                        $date[$$position[1]].$this->date_metadata['separatorOut'].
                        $date[$$position[2]].(!empty($dateTime[1])? ' '.$dateTime[1]: '');
                } else
                        return $data;
    }
_processDecimal ( data) [private]

Convierte numeros. El numero de decimales no se modifica, luego ha de recibir el numero con la cantidad deseada, aunque sea ,00 Devuelve false si hay errores.

private

Parámetros:
stringdata
Devuelve:
string

Definición en la línea 396 del archivo IgepTransformer.php.

                                           {
        if ($this->validate and empty($this->decimal_metadata['from'])) {
                throw new gvHidraException("Error de uso del transformer: se intenta transformar un numero sin llamar previamente a setDecimal");
        }
        if ($this->validate or isset($this->type_mod[TIPO_DECIMAL])) {
                        // prepara el valor origen, bien para validar o para transformar
                $data_orig = $data;
                        $tmp_dec = '__dec__';
                        $posSeparator = strrpos($data, $this->decimal_metadata['from']);
                        $num_dec = 0;
                        // si hay caracter decimal, lo reemplazo temporalmente con uno especial
                        // que no pueda provocar ambiguedad con el separador de grupos
                        if ($posSeparator !== false) {
                                $num_dec = strlen($data) - $posSeparator -1;
                                $data = substr_replace($data,$tmp_dec,$posSeparator,1);
                        }
                        // se eliminan los grupos, si los hay
                        if (!empty($this->decimal_metadata['fromGroup']))
                                $data = str_replace($this->decimal_metadata['fromGroup'], '', $data);
                        // si habia separador decimal pongo el que maneja php (negocio)
                        if ($posSeparator !== false) {
                                $car = ConfigFramework::getNumericSeparatorsFW();
                                $data = str_replace($tmp_dec, $car['DECIMAL'], $data);
                        }
                        if (!is_numeric($data)) {
                                $this->addError("El valor '$data_orig' no es un nmero vlido.");
                                //return false;
                        }
        }
                if (isset($this->type_mod[TIPO_DECIMAL]))
                        return number_format($data, $num_dec, $this->decimal_metadata['to'], $this->decimal_metadata['toGroup']);
                else
                        return $data;
    }
addError ( msg) [private]

Registra un error de transformacion

Parámetros:
stringmsg texto del error a mostrar al usuario, cuando corresponda

Definición en la línea 453 del archivo IgepTransformer.php.

        {
                $this->transform_errors[] = $msg;
        }
decimalPad ( num,
decimales 
)

Recibe un numero en formato negocio y completa los decimales con 0's' Viene con tipo texto, y sin exponente

public

Parámetros:
numbernum
numberdecimales
Devuelve:
string

Definición en la línea 210 del archivo IgepTransformer.php.

                                        {
        $carn = ConfigFramework::getNumericSeparatorsFW();
        $partes = explode($carn['DECIMAL'],$num);
        $partes[1] = rtrim(@$partes[1], "0");
        if (strlen($partes[1]) > $decimales) {
                // error, este metodo no es para truncar
                throw new gvHidraException("El numero $num tiene ".strlen($partes[1])." decimales y no se puede truncar a $decimales");
        }
        return $partes[0].($decimales==0? '': $carn['DECIMAL'].str_pad($partes[1], $decimales, '0'));
    }
decimalPadDatos ( num,
decimales,
dsn 
)

Recibe un numero en formato bd y completa los decimales con 0's' Devuelve numero en bd

public

Parámetros:
stringnum
numberdecimales
Devuelve:
string

Definición en la línea 230 del archivo IgepTransformer.php.

                                                  {
        $carn = IgepDB::caracteresNumericos($dsn);
        $partes = explode($carn['DECIMAL'],strval($num));
        $partes[1] = rtrim(@$partes[1], "0");
        if (strlen($partes[1]) > $decimales) {
                // error, este metodo no es para truncar
                throw new gvHidraException("El numero $num tiene ".strlen($partes[1])." decimales y no se puede truncar a $decimales");
        }
        return $partes[0].($decimales==0? '': $carn['DECIMAL'].str_pad($partes[1], $decimales, '0'));
    }
expandExponent ( num,
sep_d = null,
sep_g = null 
)

Indica si hay alguna conversion registrada Util para optimizar los procesos donde se invoca la conversion para un conjunto de filas y columnas NO ADECUADO cuando:

  • vamos a mostrar en pantalla, ya que los numeros pueden necesitar completar los decimales
  • tampoco cuando venimos de negocio o bd, porque pueden llevar exponente
  • tampoco cuando venimos de interfaz, pues requiere validacion Por estos motivos, desaparece el metodo

public

Devuelve:
boolean Quita exponente a numero de negocio (1e2 -> 100). Si recibe parametros separadores acepta otros formatos de entrada para numeros (usado en IgepConexion::transform_BD2User para convertir numeros de bd) Supuestos:
  • El numero no puede empezar por e ('e4' no es valido)
  • El separador de grupos no se tiene en cuenta
Parámetros:
stringo numero
stringseparador decimal
stringseparador de grupos
Devuelve:
string

Definición en la línea 170 del archivo IgepTransformer.php.

                                                                {
                $snum = strval($num);
                if (stripos($snum,'e') > 0) {
                        if (is_null($sep_d))
                                $n = ConfigFramework::getNumericSeparatorsFW();
                        else
                                $n = array('DECIMAL'=>$sep_d, 'GROUP'=>$sep_g);
                        // number_format NO FUNCIONA BIEN CUANDO TIENE QUE PONER MAS DE 5 CEROS
//                      return rtrim(strval(number_format($snum, abs(substr($snum,$i))+2, $n['DECIMAL'], $n['GROUP'])
//                                                         ),
//                                           '0');      
                        $e = explode('e',strtolower($snum));
                        if (strpos($e[0],$n['DECIMAL']) === FALSE)
                                $e[0].=$n['DECIMAL'];
                        $snum = str_pad($e[0], abs($e[1])+4, '0', ($e[1]>=0? STR_PAD_RIGHT: STR_PAD_LEFT));
                        // mover el caracter decimal
                        $d = strpos($snum,$n['DECIMAL']);
                        if ($e[1]>=0)
                                $snum = substr($snum,0,$d).substr($snum,$d+1,$e[1]).$n['DECIMAL'].substr($snum,$d + $e[1] + 1);
                        else
                                $snum = substr($snum,0,$d + $e[1] ).$n['DECIMAL'].str_replace($n['DECIMAL'],'',substr($snum,$d + $e[1]));
                        if (strpos($snum,$n['DECIMAL']) !== false) {
                                $snum = trim($snum, '0');
                                $snum = rtrim($snum, $n['DECIMAL']);
                        }
                        if ($snum[0]==$n['DECIMAL'])
                                $snum = '0'.$snum;
                }
                return $snum;
        }
getTransformErrors ( )

Devuelve la lista de errores de transformacion

Devuelve:
mixed

Definición en la línea 464 del archivo IgepTransformer.php.

        {
                return $this->transform_errors;
        }
isDate ( y,
m,
d 
) [private]

Comprueba los numeros de una fecha

Devuelve:
boolean true si es valida

Definición en la línea 283 del archivo IgepTransformer.php.

                                            {
                return (is_numeric($y) and is_numeric($m) and is_numeric($d) 
                                and checkDate($m, $d, $y) and $y<=9999);
        }
process ( type,
value 
)

Lanza el proceso de conversion sobre el valor que recibe, en funcion del tipo que recibe Las conversiones se hacer siempre con cadenas de texto

public

Parámetros:
stringtype
stringvalue
Devuelve:
string

Definición en la línea 251 del archivo IgepTransformer.php.

                                  {
        if (empty($value))
            return $value;
        switch ($type){
            case TIPO_CARACTER:
                                $value = $this->_processCharacter($value);                    
                                break;
            case TIPO_DECIMAL:
                                $value = $this->_processDecimal($value);
                                break;
            case TIPO_FECHA:
                $value = $this->_processDate($value);
                                break;                
            case TIPO_FECHAHORA:
                                $value = $this->_processDateTime($value);
                                break;
                        default:
                                if (!is_string($type))
                                        throw new gvHidraException('Tipo incorrecto en IgepTransformer: '.var_export($type,true));
                                if (!class_exists($type))
                                        throw new gvHidraException('Tipo no soportado en IgepTransformer: '.$type);
                                if (!in_array('gvHidraTypeBase', class_parents($type)))
                                        throw new gvHidraException('Tipo predefinido no hereda de gvHidraTypeBase: '.$type);
        }
        return $value;
    }
setCharacter ( from,
to 
)

Indica la conversion a hacer con campos cadena

public

Parámetros:
stringfrom
stringto
Devuelve:
none

Definición en la línea 128 del archivo IgepTransformer.php.

                                     {
        if($from!=$to){
            $this->type_mod[TIPO_CARACTER] = true;
            array_push($this->character_metadata,array('from'=>$from,'to'=>$to));
        }
    }
setDate ( from,
to 
)

Indica la conversion a hacer con fechas

public

Parámetros:
stringfrom
stringto
Devuelve:
none

Definición en la línea 72 del archivo IgepTransformer.php.

                                {
        // este separador se usa para validacion de campo origen,
        // aunque los formatos origen y destino sean los mismos
                $this->date_metadata['separatorIn'] = substr($from,1,1);
        $dia = strpos($from,'d');
        if ($dia === FALSE)
                $dia = strpos($from,'j');
        $this->date_metadata['posDay'] = $dia/2;
        $mes = strpos($from,'m');
        if ($mes === FALSE)
                $mes = strpos($from,'n');
        $this->date_metadata['posMonth'] = $mes/2;
        $this->date_metadata['posYear'] = strpos($from,'Y')/2;

        if($from!=$to){
            $this->type_mod[TIPO_FECHA] = true;
                $this->type_mod[TIPO_FECHAHORA] = true;
            $this->date_metadata['separatorOut'] = substr($to,1,1); 
            $this->date_metadata['position'] = explode($this->date_metadata['separatorOut'],$to);
                }
    }
setDecimal ( from,
to,
fromGroup = '',
toGroup = '' 
)

Indica la conversion a hacer con campos numericos

public

Parámetros:
stringfrom
stringto
stringfromGroup
stringtoGroup
Devuelve:
none

Definición en la línea 104 del archivo IgepTransformer.php.

                                                               {
        // esto se usa para validacion de campo origen,
        // aunque los formatos origen y destino sean los mismos
                $this->decimal_metadata['from'] = $from;
                $this->decimal_metadata['fromGroup'] = $fromGroup;
        if ($from != $to or $fromGroup != $toGroup){
            $this->type_mod[TIPO_DECIMAL] = true;
            $this->decimal_metadata['to'] = $to;
            $this->decimal_metadata['toGroup'] = $toGroup;
        }
        if ($from == $fromGroup)
                throw new gvHidraException('El caracter decimal no puede ser el mismo que el separador de miles (from)');
        if ($to == $toGroup)
                throw new gvHidraException('El caracter decimal no puede ser el mismo que el separador de miles (to)');
    }

Documentación de los campos

$character_metadata = array()

Definición en la línea 46 del archivo IgepTransformer.php.

$date_metadata = array()

Definición en la línea 47 del archivo IgepTransformer.php.

$decimal_metadata = array()

Definición en la línea 45 del archivo IgepTransformer.php.

$transform_errors = array() [private]

Definición en la línea 48 del archivo IgepTransformer.php.

$type_mod = array()

Definición en la línea 44 del archivo IgepTransformer.php.

$validate [private]

Definición en la línea 49 del archivo IgepTransformer.php.


La documentación para esta clase fue generada a partir del siguiente fichero: