',','GROUP'=>'.'); } /** * Define los carácteres usados en internamente (PHP) para los números * * @access public * @static * @return mixed array asociativo con entrada 'DECIMAL' y 'GROUP' */ static function caracteresNumericosNegocio(){ return array('DECIMAL'=>'.','GROUP'=>''); } /** * Da formato a un número desde PHP para presentarlo en pantalla. * * @access public * @static * @param numero numero a formatear * @param numero decimales a considerar * @return string devuelve el número formateado */ static function formatoNumero($num,$decimales=2){ $carp = ConfIgep::caracteresNumericos(); $carn = ConfIgep::caracteresNumericosNegocio(); $transformer = new IgepTransformer(); $transformer->setDecimal($carn['DECIMAL'],$carp['DECIMAL'],$carn['GROUP'],$carp['GROUP']); $num = $transformer->expandExponent($num); $num = $transformer->decimalPad($num, $decimales); $num = $transformer->process(TIPO_DECIMAL,$num); return $num; } /** * Da formato a un número de pantalla para manejarlo en el php * Independientemente de la configuracion de bds y de presentación, * el php maneja el punto decimal. * Anteriormente este metodo solo eliminaba el separador de grupos * si habia sep. de grupos y de decimales; de esta forma si el numero venia * con puntos decimales los aceptaba como comas. * En adelante se eliminan siempre los separadores de grupos. * * @access public * @static * @param numero a formatear * @return string devuelve el número para PHP */ static function transformaNumero($num){ $carp = ConfIgep::caracteresNumericos(); $carn = ConfIgep::caracteresNumericosNegocio(); $transformer = new IgepTransformer(); $transformer->setDecimal($carp['DECIMAL'],$carn['DECIMAL'],$carp['GROUP'],$carn['GROUP']); return $transformer->process(TIPO_DECIMAL,$num); } /** * Define la mascara de representación de fechas * La j es como d pero puede no tener ceros iniciales * La n es como m pero puede no tener ceros iniciales * Si usamos la d o la m en la mascara no se podran manejar fechas * donde el dia o el mes inicial no esten precedidas de ceros. * Solo se puede cambiar el orden de las letras y el caracter separador * (y que sea un solo caracter, y el mismo) * * @access public * @static * @return string */ static function mascaraRepresentacionFechas(){ return 'j/n/Y'; } /** * Define la mascara de representación de fechas en negocio (PHP) * No se debe cambiar sin modificar la implementacion de las transformaciones !!! * * @access public * @static * @return string */ static function mascaraFechasNegocio(){ return 'Y/m/d'; } /** * Da formato a una fecha para presentarlo en pantalla. * Acepta como entrada la fecha en timestamp o en formato string de negocio. * * @access public * @static * @param string fecha en formato timestamp * @param string tipo de formato: FECHAHORA, FECHA * @return string devuelve la fecha formateada */ static function formatoFecha($fecha,$tipo){ if ($tipo != 'FECHA' and $tipo != 'FECHAHORA') return '!!tipo fecha incorrecto!!'; $fmt_dest = self::mascaraRepresentacionFechas(); if (is_numeric($fecha)) { if ($tipo == 'FECHAHORA') $fmt_dest .= ' H:i:s'; return date($fmt_dest, $fecha); } else { $fmt_ori = self::mascaraFechasNegocio(); $transformer = new IgepTransformer(); $transformer->setDate($fmt_ori,$fmt_dest); if ($transformer->existsTransform()) { return $transformer->process(($tipo == 'FECHAHORA'? TIPO_FECHAHORA : TIPO_FECHA), $fecha); } return $fecha; } } /** * Da formato a una fecha pantalla para tratarla en negocio * Devuelve false si es incorrecta, o null si el valor es vacio * Hay algunas fechas como '30/02/2007' que no dan error con la funcion * strtotime sino que equivale a 2/3/2007. Por ese motivo añadimos mas * controles y asi poder validar la entrada del usuario. * * @access public * @static * @param string fecha en formato string * @return time devuelve la fecha formateada */ static function formatoFechaNegocio($str_fechaHora){ if (empty($str_fechaHora)) return NULL; $fecha_ori = ConfIgep::mascaraRepresentacionFechas(); $fecha_dest = ConfIgep::mascaraFechasNegocio(); $transformer = new IgepTransformer(); $transformer->setDate($fecha_ori,$fecha_dest); if ($transformer->existsTransform()) { $str_fechaHora = $transformer->process(TIPO_FECHAHORA, $str_fechaHora); } $res = strtotime($str_fechaHora); if (!$res) return false; list($f, $h) = explode(" ",$str_fechaHora); if ($f != date($fecha_dest, $res)) return false; if (isset($h)) { list($hh, $hm, $hs) = explode(':',$h); if ($hh<0 || $hh>23 || $hm<0 || $hm>59 || (isset($hs) && ($hs<0 || $hs>59)) ) return false; } return $res; } /** * Compara dos fechas en formato string, de la capa interfaz * Devuelve un número positivo si la segunda fecha es posterior a la primera * * @access public * @static * @param string fecha (interfaz) * @param string fecha (interfaz) * @return int (timestamp) */ function comparaFechas($str_fechaHora1, $str_fechaHora2){ $fecha1 = ConfIgep::formatoFechaNegocio($str_fechaHora1); $fecha2 = ConfIgep::formatoFechaNegocio($str_fechaHora2); return ($fecha2-$fecha1); } // Fin de comparaFechas /** * Este método prepara los datos que vienen de una consulta de la BD antes de mostrarse en * el formato propio de gvHidra. Generalmente, las fechas y los decimales en los sistemas que * tengan mascaras diferentes a las de gvHidra (p.e. MySQL). * Este método puede ser invocado por el usuario, o bien se puede llamar opcionalmente con los metodos * 'consultar' de IgepNegocio e IgepConexion si le pasamos un segundo parámetro indicandole el NODO_INTERFAZ. * Se puede optimizar controlando que en el array de tipos haya fechas o numeros decimales. * Si estamos convirtiendo un numero a decimal podemos indicar el numero de decimales. * * @access public * @param any $a_parametros * @param any $a_tipo * @param mixed $a_dsn * @param number $a_decimales * @return none */ static function prepararPresentacion( $a_parametros, $a_tipo, $a_dsn, $a_decimales=2) { $transformer = new IgepTransformer(); $carbd = IgepDB::caracteresNumericos($a_dsn); $carconf = ConfIgep::caracteresNumericos(); $transformer->setDecimal($carbd['DECIMAL'],$carconf['DECIMAL'],$carbd['GROUP'],$carconf['GROUP']); $fechabd = IgepDB::mascaraFechas($a_dsn); $fechaconf = ConfIgep::mascaraRepresentacionFechas(); $transformer->setDate($fechabd,$fechaconf); if(is_array($a_parametros)) { if(is_array($a_tipo)){ foreach($a_parametros as $fila => $tupla){ foreach($a_tipo as $campo => $descTipo){ if(isset($tupla[$campo])) { $tipo = (empty($descTipo['tipo'])? TIPO_CARACTER: $descTipo['tipo']); if ($tipo == TIPO_DECIMAL){ $tupla[$campo] = $transformer->expandExponent($tupla[$campo], $carbd['DECIMAL'], $carbd['GROUP']); //if ($tipo == TIPO_DECIMAL) $tupla[$campo] = $transformer->decimalPadDatos($tupla[$campo], $descTipo['parteDecimal'], $a_dsn); } $a_parametros[$fila][$campo] = $transformer->process($tipo, $tupla[$campo]); } } } } } elseif($a_parametros!='' and $a_tipo!='') { if ($a_tipo == TIPO_DECIMAL) { $a_parametros = $transformer->expandExponent($a_parametros, $carbd['DECIMAL'], $carbd['GROUP']); //if ($a_tipo == TIPO_DECIMAL) $a_parametros = $transformer->decimalPadDatos($a_parametros, $a_decimales, $a_dsn); } $a_parametros = $transformer->process($a_tipo,$a_parametros); } return $a_parametros; } // Fin de prepararPresentacion /** * Este método prepara los datos que vienen de una consulta de la BD antes de operar en PHP. * Generalmente, las fechas y los decimales en los sistemas que tengan mascaras diferentes a las de PHP. * Este método puede ser invocado por el usuario, o bien se puede llamar opcionalmente con los metodos * 'consultar' de IgepNegocio e IgepConexion si le pasamos un segundo parámetro indicandole el NODO_NEGOCIO. * Se puede optimizar controlando que en el array de tipos haya fechas o numeros decimales. * * @access public * @param any $a_parametros * @param any $a_tipo * @param mixed $dsn * @return mixed */ function prepararNegocio( $a_parametros, $a_tipo, $a_dsn) { $transformer = new IgepTransformer(); $carbd = IgepDB::caracteresNumericos($a_dsn); $carconf = ConfIgep::caracteresNumericosNegocio(); $transformer->setDecimal($carbd['DECIMAL'],$carconf['DECIMAL'],$carbd['GROUP'],$carconf['GROUP']); $fechabd = IgepDB::mascaraFechas($a_dsn); $fechaconf = ConfIgep::mascaraFechasNegocio(); $transformer->setDate($fechabd,$fechaconf); if ($transformer->existsTransform()) { if(is_array($a_parametros)){ if(is_array($a_tipo)){ foreach($a_parametros as $fila => $tupla){ foreach($a_tipo as $campo => $descTipo) { $tipo = (empty($descTipo['tipo'])? TIPO_CARACTER: $descTipo['tipo']); $a_parametros[$fila][$campo] = $transformer->process($tipo, $tupla[$campo]); } } } } elseif($a_parametros!='' and $a_tipo!='') $a_parametros = $transformer->process($a_tipo,$a_parametros); } return $a_parametros; } // Fin de prepararNegocio } ?>