mirror of
https://github.com/rmontanana/inventario2.git
synced 2025-08-17 16:35:58 +00:00
Compare commits
26 Commits
Author | SHA1 | Date | |
---|---|---|---|
74fdea8e08 | |||
70cf5eb542 | |||
b680e3142b | |||
a0dd082434 | |||
f6a480f828 | |||
c9a3cd83a5 | |||
|
8ffd97b474 | ||
|
caae389c93 | ||
|
42eb01c27e | ||
26048fc889 | |||
a853991146 | |||
|
99a929ec1f | ||
|
8b1ff91491 | ||
c1b4141606 | |||
e6db3c334b | |||
|
a85669a456 | ||
|
14335770df | ||
|
cd9762f4a9 | ||
|
6538402953 | ||
4aa32ff705 | |||
|
2a6680173a | ||
|
5f808b3d12 | ||
|
1441d972ab | ||
5ebd4ecf35 | |||
|
86125e0a79 | ||
3547cf5b2e |
@@ -94,7 +94,7 @@ class AportaContenido {
|
|||||||
*/
|
*/
|
||||||
public function fechaActual($formato = '', $idioma = 'es_ES') {
|
public function fechaActual($formato = '', $idioma = 'es_ES') {
|
||||||
if ($formato == '')
|
if ($formato == '')
|
||||||
$formato = "%d-%b-%Y %H:%M";
|
$formato = "%d-%b-%y";
|
||||||
setlocale(LC_TIME, $idioma);
|
setlocale(LC_TIME, $idioma);
|
||||||
return strftime($formato);
|
return strftime($formato);
|
||||||
}
|
}
|
||||||
@@ -118,14 +118,14 @@ class AportaContenido {
|
|||||||
public function __call($metodo, $parametros) {
|
public function __call($metodo, $parametros) {
|
||||||
switch ($metodo) { // Dependiendo del método invocado
|
switch ($metodo) { // Dependiendo del método invocado
|
||||||
case 'titulo': // devolvemos el título
|
case 'titulo': // devolvemos el título
|
||||||
return APLICACION;
|
return PROGRAMA.VERSION;
|
||||||
case 'usuario':
|
case 'usuario':
|
||||||
if ($this->registrado)
|
if ($this->registrado)
|
||||||
return "Usuario=$this->usuario";
|
return "Usuario=$this->usuario";
|
||||||
else
|
else
|
||||||
return '';
|
return '';
|
||||||
case 'fecha': return $this->fechaActual();
|
case 'fecha': return $this->fechaActual();
|
||||||
case 'aplicacion': return APLICACION;
|
case 'aplicacion': return PROGRAMA.VERSION;
|
||||||
case 'menu': // el menú
|
case 'menu': // el menú
|
||||||
if ($this->registrado) {
|
if ($this->registrado) {
|
||||||
return $this->miMenu->insertaMenu();
|
return $this->miMenu->insertaMenu();
|
||||||
@@ -144,8 +144,8 @@ class AportaContenido {
|
|||||||
return "Menú Principal";
|
return "Menú Principal";
|
||||||
case 'principal':
|
case 'principal':
|
||||||
return "Pantalla Inicial";
|
return "Pantalla Inicial";
|
||||||
|
case 'articulos': $opcion = "artículos";
|
||||||
case 'elementos':
|
case 'elementos':
|
||||||
case 'articulos': $opcion="artículos";
|
|
||||||
case 'ubicaciones':
|
case 'ubicaciones':
|
||||||
case 'usuarios':
|
case 'usuarios':
|
||||||
case 'test':
|
case 'test':
|
||||||
@@ -155,6 +155,7 @@ class AportaContenido {
|
|||||||
case 'informeInventario':return "Informe de Inventario";
|
case 'informeInventario':return "Informe de Inventario";
|
||||||
case 'descuadres':return 'Informe de descuadres';
|
case 'descuadres':return 'Informe de descuadres';
|
||||||
case 'importacion': return 'Importación de datos';
|
case 'importacion': return 'Importación de datos';
|
||||||
|
case 'copiaseg': return 'Copia de seguridad de datos';
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
case 'control':
|
case 'control':
|
||||||
@@ -175,7 +176,7 @@ class AportaContenido {
|
|||||||
switch ($opcion) {
|
switch ($opcion) {
|
||||||
case 'principal': // contenido inicial
|
case 'principal': // contenido inicial
|
||||||
return '<br><br><center><img src="img/logo.png" alt="' . PROGRAMA . '">' .
|
return '<br><br><center><img src="img/logo.png" alt="' . PROGRAMA . '">' .
|
||||||
'<br><label>' . PROGRAMA . '</label></center><br><br>' . PIE;
|
'<br><label>' . CENTRO . '</label></center><br><br>' . PIE;
|
||||||
case 'articulos':
|
case 'articulos':
|
||||||
case 'ubicaciones':
|
case 'ubicaciones':
|
||||||
case 'test':
|
case 'test':
|
||||||
@@ -196,7 +197,7 @@ class AportaContenido {
|
|||||||
|
|
||||||
case 'bienvenido': // El usuario quiere iniciar sesión
|
case 'bienvenido': // El usuario quiere iniciar sesión
|
||||||
return 'Bienvenid@ ' . $this->usuario . '<br><br><center><img src="img/codigoBarras.png" alt="' . PROGRAMA . '">' .
|
return 'Bienvenid@ ' . $this->usuario . '<br><br><center><img src="img/codigoBarras.png" alt="' . PROGRAMA . '">' .
|
||||||
'<br><label>' . PROGRAMA . '</label></center><br><br>' . PIE;
|
'<br><label>' . CENTRO . '</label></center><br><br>' . PIE;
|
||||||
case 'configuracion':
|
case 'configuracion':
|
||||||
if ($this->perfil['Config']) {
|
if ($this->perfil['Config']) {
|
||||||
$conf = new Configuracion();
|
$conf = new Configuracion();
|
||||||
@@ -229,6 +230,36 @@ class AportaContenido {
|
|||||||
} else {
|
} else {
|
||||||
return $this->mensajePermisos("Actualización, creación y borrado de elementos");
|
return $this->mensajePermisos("Actualización, creación y borrado de elementos");
|
||||||
}
|
}
|
||||||
|
case 'copiaseg':
|
||||||
|
if ($this->perfil['Config']) {
|
||||||
|
$archivo_sql = "tmp/copiaseg.sql";
|
||||||
|
$archivo = $archivo_sql . ".gz";
|
||||||
|
if (file_exists($archivo)) {
|
||||||
|
unlink($archivo);
|
||||||
|
}
|
||||||
|
$comando = escapeshellcmd(MYSQLDUMP . ' -h ' . SERVIDOR . ' -P ' . PUERTO . ' -u ' . USUARIO . ' --password=' . CLAVE . ' --result-file=' . $archivo_sql . ' ' . BASEDATOS);
|
||||||
|
$comando2 = escapeshellcmd(GZIP . ' -9f ' . $archivo_sql);
|
||||||
|
exec($comando);
|
||||||
|
exec($comando2);
|
||||||
|
if (filesize($archivo) < 1024) {
|
||||||
|
//No se ha realizado la copia de seguridad
|
||||||
|
$mensaje = "La copia de seguridad no se ha realizado correctamente.<br><br>";
|
||||||
|
$mensaje .= "Compruebe que las rutas a los programas mysqldump y gzip en configuración están correctamente establecidas ";
|
||||||
|
$mensaje .= "y que los datos de acceso a la base de datos sean correctos.<br>";
|
||||||
|
$mensaje .= "mysqldump=[" . MYSQLDUMP . "]<br>";
|
||||||
|
$mensaje .= "gzip=[" . GZIP . "]";
|
||||||
|
$cabecera = "ERROR";
|
||||||
|
$tipo = "danger";
|
||||||
|
} else {
|
||||||
|
$mensaje .= 'Copia de seguridad realizada con éxito.<br><br>Pulse sobre el siguiente enlace para descargar:<br><br>';
|
||||||
|
$mensaje .= '<a href="' . $archivo . '">Descargar Copia de Seguridad de Datos</a><br>';
|
||||||
|
$cabecera = "Información";
|
||||||
|
$tipo = "success";
|
||||||
|
}
|
||||||
|
return $this->panel($cabecera,$mensaje,$tipo);
|
||||||
|
} else {
|
||||||
|
return $this->mensajePermisos("Copias de seguridad");
|
||||||
|
}
|
||||||
} // Fin del contenido
|
} // Fin del contenido
|
||||||
case 'usuario_incorrecto':
|
case 'usuario_incorrecto':
|
||||||
$this->usuario_inc = true;
|
$this->usuario_inc = true;
|
||||||
@@ -252,7 +283,16 @@ class AportaContenido {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function mensajePermisos($tipo) {
|
public function mensajePermisos($tipo) {
|
||||||
return "<center><h1>No tiene permiso para acceder a " . $tipo . "</h1></center>";
|
return $this->panel("ERROR", "No tiene permiso para acceder a $tipo", "danger");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function panel($cabecera, $mensaje, $tipo) {
|
||||||
|
$panel = '<div class="panel panel-' . $tipo . '"><div class="panel-heading">';
|
||||||
|
$panel .= '<h3 class="panel-title">' . $cabecera . '</h3></div>';
|
||||||
|
$panel .= '<div class="panel-body">';
|
||||||
|
$panel .= $mensaje;
|
||||||
|
$panel .= '</div>';
|
||||||
|
return $panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,154 +1,165 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @package Inventario
|
|
||||||
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
|
||||||
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
|
||||||
* This file is part of Inventario.
|
|
||||||
* Inventario 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 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Inventario 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class Configuracion {
|
|
||||||
private $nombreCentro;
|
|
||||||
private $numFilas;
|
|
||||||
private $estilo;
|
|
||||||
private $servidor;
|
|
||||||
private $baseDatos;
|
|
||||||
private $usuario;
|
|
||||||
private $clave;
|
|
||||||
private $configuracion="inc/configuracion.inc";
|
|
||||||
private $confNueva="inc/configuracion.new";
|
|
||||||
private $confAnterior="inc/configuracion.ant";
|
|
||||||
private $plantilla;
|
|
||||||
|
|
||||||
public function ejecuta()
|
/**
|
||||||
{
|
* @package Inventario
|
||||||
$fichero=file_get_contents($this->configuracion,FILE_TEXT);
|
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
||||||
$datos=explode("\n",$fichero);
|
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
$grabar=isset($_POST['servidor']);
|
* This file is part of Inventario.
|
||||||
if ($grabar) {
|
* Inventario is free software: you can redistribute it and/or modify
|
||||||
$fsalida=@fopen($this->confNueva,"wb");
|
* it under the terms of the GNU General Public License as published by
|
||||||
}
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
foreach($datos as $linea) {
|
* (at your option) any later version.
|
||||||
if (stripos($linea,"DEFINE")!==false) {
|
*
|
||||||
$filtro=str_replace("'","",$linea);
|
* Inventario is distributed in the hope that it will be useful,
|
||||||
list($clave,$valor)=explode(",",$filtro);
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
list($resto,$campo)=explode("(",$clave);
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
list($valor,$resto)=explode(")",$valor);
|
* GNU General Public License for more details.
|
||||||
//$salida.="[$campo]=[$valor]<br>\n";
|
*
|
||||||
switch ($campo) {
|
* You should have received a copy of the GNU General Public License
|
||||||
case 'CENTRO':
|
* along with Inventario. If not, see <http://www.gnu.org/licenses/>.
|
||||||
$this->nombreCentro=$valor;
|
*
|
||||||
if ($grabar) {
|
*/
|
||||||
$linea=str_replace($valor, $_POST['centro'],$linea);
|
class Configuracion {
|
||||||
$this->nombreCentro=$_POST['centro'];
|
private $configuracion = "inc/configuracion.inc";
|
||||||
}
|
private $confNueva = "inc/configuracion.new";
|
||||||
break;
|
private $confAnterior = "inc/configuracion.ant";
|
||||||
case 'NUMFILAS':
|
private $datosConf;
|
||||||
$this->numFilas=$valor;
|
//Campos del fichero de configuración que se van a editar.
|
||||||
if ($grabar) {
|
private $lista = array('SERVIDOR', 'PUERTO', 'BASEDATOS', 'BASEDATOSTEST', 'USUARIO', 'CLAVE', 'CENTRO', 'NUMFILAS', 'ESTILO', 'PLANTILLA', 'COLORLAT', 'COLORFON', 'MYSQLDUMP', 'GZIP');
|
||||||
$linea=str_replace($valor, $_POST['filas'],$linea);
|
private $campos;
|
||||||
$this->numFilas=$_POST['filas'];
|
|
||||||
}
|
public function __construct()
|
||||||
break;
|
{
|
||||||
case 'ESTILO':
|
$this->campos = implode(",", $this->lista);
|
||||||
$this->estilo=$valor;
|
|
||||||
if ($grabar) {
|
|
||||||
$linea=str_replace($valor, $_POST['estilo'],$linea);
|
|
||||||
$this->estilo=$_POST['estilo'];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'PLANTILLA':
|
|
||||||
$this->plantilla=$valor;
|
|
||||||
if ($grabar) {
|
|
||||||
$linea=str_replace($valor, $_POST['plantilla'],$linea);
|
|
||||||
$this->plantilla=$_POST['plantilla'];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'SERVIDOR':
|
|
||||||
$this->servidor=$valor;
|
|
||||||
if ($grabar) {
|
|
||||||
$linea=str_replace($valor, $_POST['servidor'],$linea);
|
|
||||||
$this->servidor=$_POST['servidor'];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'BASEDATOS':
|
|
||||||
$this->baseDatos=$valor;
|
|
||||||
if ($grabar) {
|
|
||||||
$linea=str_replace($valor, $_POST['baseDatos'],$linea);
|
|
||||||
$this->baseDatos=$_POST['baseDatos'];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'USUARIO':
|
|
||||||
$this->usuario=$valor;
|
|
||||||
if ($grabar) {
|
|
||||||
$linea=str_replace($valor, $_POST['usuario'],$linea);
|
|
||||||
$this->usuario=$_POST['usuario'];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'CLAVE':
|
|
||||||
$this->clave=$valor;
|
|
||||||
if ($grabar) {
|
|
||||||
$linea=str_replace($valor, $_POST['clave'],$linea);
|
|
||||||
$this->clave=$_POST['clave'];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($grabar) {
|
|
||||||
$registro=substr($linea,0,2)=="?>"?$linea:$linea."\n";
|
|
||||||
fwrite($fsalida,$registro);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$salida.=$this->formulario();
|
|
||||||
if ($grabar) {
|
|
||||||
//$salida.='<label class="warn">Configuración guardada correctamente</label>';
|
|
||||||
$salida.='<p class="bg-primary">Configuración guardada correctamente</p>';
|
|
||||||
fclose($fsalida);
|
|
||||||
unlink($this->confAnterior);
|
|
||||||
rename($this->configuracion,$this->confAnterior);
|
|
||||||
rename($this->confNueva,$this->configuracion);
|
|
||||||
}
|
|
||||||
return $salida;
|
|
||||||
}
|
|
||||||
private function formulario()
|
|
||||||
{
|
|
||||||
$personal=$this->estilo=="personal"?'selected':' ';
|
|
||||||
$bluecurve=$this->estilo=="bluecurve"?'selected':' ';
|
|
||||||
$cristal=$this->estilo=="cristal"?'selected':' ';
|
|
||||||
$normal=$this->plantilla=="normal"? 'selected':' ';
|
|
||||||
$bootstrap=$this->plantilla=="bootstrap" ? 'selected':' ';
|
|
||||||
$salida='<center><div class="col-sm-2 col-md-6"><form name="configura" method="post">';
|
|
||||||
//$salida.='<p align="center"><table border=1 class="tablaDatos"><tbody>';
|
|
||||||
$salida.='<p align="center"><table border=2 class="table table-hover"><tbody>';
|
|
||||||
$salida.='<th colspan=2 class="info"><center><b>Preferencias</b></center></th>';
|
|
||||||
$salida.='<tr><td>Nombre del Centro</td><td><input type="text" name="centro" value="'.$this->nombreCentro.'" size="30" /></td></tr>';
|
|
||||||
$salida.='<tr><td>Número de filas</td><td><input type="text" name="filas" value="'.$this->numFilas.'" size="3" /></td></tr>';
|
|
||||||
$salida.='<tr><td>Plantilla</td><td><select name="plantilla">';
|
|
||||||
$salida.='<option value="normal" '.$normal.'>normal</option>';
|
|
||||||
$salida.='<option '.$bootstrap.'>bootstrap</option></select></td></tr>';
|
|
||||||
$salida.='<tr><td>Estilo</td><td><select name="estilo">';
|
|
||||||
$salida.='<option value="personal" '.$personal.'>personal</option>';
|
|
||||||
$salida.='<option '.$bluecurve.'>bluecurve</option>';
|
|
||||||
$salida.='<option '.$cristal.'>cristal</option></select></td></tr>';
|
|
||||||
$salida.='<th colspan=2 class="danger"><center><b>Base de datos</b></center></th>';
|
|
||||||
$salida.='<tr><td>Servidor</td><td><input type="text" name="servidor" value="'.$this->servidor.'" size="30" /></td></tr>';
|
|
||||||
$salida.='<tr><td>Base de datos</td><td><input type="text" name="baseDatos" value="'.$this->baseDatos.'" size="30" /></td></tr>';
|
|
||||||
$salida.='<tr><td>Usuario</td><td><input type="text" name="usuario" value="'.$this->usuario.'" size="30" /></td></tr>';
|
|
||||||
$salida.='<tr><td>Clave</td><td><input type="text" name="clave" value="'.$this->clave.'" size="30" /></td></tr>';
|
|
||||||
$salida.='<tr align=center><td colspan=2><input type="submit" class="btn btn-primary" align="center" value="Aceptar" name="aceptar" /></td></tr></p>';
|
|
||||||
$salida.='</form></div></center>';
|
|
||||||
return $salida;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Hecho público para poder efectuar los tests correspondientes.
|
||||||
|
public function obtieneFichero()
|
||||||
|
{
|
||||||
|
return file_get_contents($this->configuracion, FILE_TEXT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function obtieneLista()
|
||||||
|
{
|
||||||
|
return $this->lista;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function obtieneDatos($linea, &$clave, &$valor)
|
||||||
|
{
|
||||||
|
$filtro = str_replace("'", "", $linea);
|
||||||
|
list($clave, $valor) = explode(",", $filtro);
|
||||||
|
list($resto, $campo) = explode("(", $clave);
|
||||||
|
list($valor, $resto) = explode(")", $valor);
|
||||||
|
list($resto, $clave) = explode("(", $clave);
|
||||||
|
$valor = trim($valor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ejecuta() {
|
||||||
|
$fichero = $this->obtieneFichero();
|
||||||
|
$datos = explode("\n", $fichero);
|
||||||
|
$grabar = isset($_POST['SERVIDOR']);
|
||||||
|
if ($grabar) {
|
||||||
|
$fsalida = @fopen($this->confNueva, "wb");
|
||||||
|
}
|
||||||
|
foreach ($datos as $linea) {
|
||||||
|
if (stripos($linea, "DEFINE") !== false) {
|
||||||
|
//Comprueba que tenga una definición correcta
|
||||||
|
$this->obtieneDatos($linea, $clave, $valor);
|
||||||
|
$this->datosConf[$clave] = $valor;
|
||||||
|
if ($grabar && stripos($this->campos, $clave) !== false) {
|
||||||
|
$linea = str_replace($valor, $_POST[$clave], $linea);
|
||||||
|
$this->datosConf[$clave] = $_POST[$clave];
|
||||||
|
}
|
||||||
|
//$salida = "DatosConf=".var_export($this->datosConf, true) . "stripos = " . stripos($campos, "GZIP");
|
||||||
|
//$salida .= "Post=" . var_export($_POST, true);
|
||||||
|
}
|
||||||
|
if ($grabar) {
|
||||||
|
$registro = substr($linea, 0, 2) == "?>" ? $linea : $linea . "\n";
|
||||||
|
fwrite($fsalida, $registro);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$salida.=$this->formulario();
|
||||||
|
if ($grabar) {
|
||||||
|
$salida.='<p class="bg-primary">Configuración guardada correctamente</p>';
|
||||||
|
fclose($fsalida);
|
||||||
|
//unlink($this->confAnterior);
|
||||||
|
rename($this->configuracion, $this->confAnterior);
|
||||||
|
rename($this->confNueva, $this->configuracion);
|
||||||
|
unlink($this->confAnterior);
|
||||||
|
}
|
||||||
|
return $salida;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function formulario() {
|
||||||
|
$coloresLateral = array("Original" => "#C4FAEC", "Verde" => "#7bd148", "Azul marino" => "#5484ed", "Azul" => "#a4bdfc", "Turquesa" => "#46d6db",
|
||||||
|
"Verde claro" => "#7ae7bf", "Verde oscuro" => "#51b749", "Amarillo" => "#fbd75b", "Naranja" => "#ffb878", "Morado" => "#6633FF",
|
||||||
|
"Rojo oscuro" => "#dc2127", "Púrpura" => "#dbadff", "Gris" => "#e1e1e1");
|
||||||
|
$coloresFondo = array("Verde" => "#7bd148", "Azul marino" => "#5484ed", "Azul" => "#a4bdfc", "Turquesa" => "#46d6db",
|
||||||
|
"Verde claro" => "#7ae7bf", "Verde oscuro" => "#51b749", "Amarillo" => "#fbd75b", "Naranja" => "#ffb878", "Rojo" => "#ff887c",
|
||||||
|
"Rojo oscuro" => "#dc2127", "Púrpura" => "#dbadff", "Gris" => "#e1e1e1", "Original" => '#F3FEC8');
|
||||||
|
$personal = $this->datosConf['ESTILO'] == "personal" ? 'selected' : ' ';
|
||||||
|
$bluecurve = $this->datosConf['ESTILO'] == "bluecurve" ? 'selected' : ' ';
|
||||||
|
$cristal = $this->datosConf['ESTILO'] == "cristal" ? 'selected' : ' ';
|
||||||
|
$normal = $this->datosConf['PLANTILLA'] == "normal" ? 'selected' : ' ';
|
||||||
|
$bootstrap = $this->datosConf['PLANTILLA'] == "bootstrap" ? 'selected' : ' ';
|
||||||
|
$salida = '<center><div class="col-sm-4 col-md-6"><form name="configura" method="post">';
|
||||||
|
//$salida.='<p align="center"><table border=1 class="tablaDatos"><tbody>';
|
||||||
|
$salida.='<p align="center"><table border=2 class="table table-hover"><tbody>';
|
||||||
|
$salida.='<th colspan=2 class="info"><center><b>Preferencias</b></center></th>';
|
||||||
|
$salida.='<tr><td>Nombre del Centro</td><td><input type="text" name="CENTRO" value="' . $this->datosConf['CENTRO'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>Número de filas</td><td><input type="text" name="NUMFILAS" value="' . $this->datosConf['NUMFILAS'] . '" size="3" /></td></tr>';
|
||||||
|
$salida.='<tr><td style="vertical-align:middle">Plantilla</td><td><select name="PLANTILLA" class="form-control">';
|
||||||
|
$salida.='<option value="normal" ' . $normal . '>normal</option>';
|
||||||
|
$salida.='<option ' . $bootstrap . '>bootstrap</option></select></td></tr>';
|
||||||
|
$salida.='<tr><td style="vertical-align:middle">Estilo</td><td><select name="ESTILO" class="form-control">';
|
||||||
|
$salida.='<option value="personal" ' . $personal . '>personal</option>';
|
||||||
|
$salida.='<option ' . $bluecurve . '>bluecurve</option>';
|
||||||
|
$salida.='<option ' . $cristal . '>cristal</option></select></td></tr>';
|
||||||
|
$salida.='<tr><td style="vertical-align:middle">Color Lateral (bootstrap)</td><td style="vertical-align:middle"><select name="COLORLAT" id="COLORLAT" class="form-control">';
|
||||||
|
foreach ($coloresLateral as $color => $codigo) {
|
||||||
|
$selec = "";
|
||||||
|
if (trim($this->datosConf['COLORLAT']) == $codigo) {
|
||||||
|
$selec = "selected";
|
||||||
|
}
|
||||||
|
$salida.='<option value="' . $codigo . '" ' . $selec . ' >' . $color . '</option>';
|
||||||
|
}
|
||||||
|
$salida.='</select></td></tr>';
|
||||||
|
$salida.='<tr><td style="vertical-align:middle">Color Fondo (bootstrap)</td><td style="vertical-align:middle"><select name="COLORFON" id="COLORFON" class="form-control">';
|
||||||
|
foreach ($coloresFondo as $color => $codigo) {
|
||||||
|
$selec = "";
|
||||||
|
if (trim($this->datosConf['COLORFON']) == $codigo) {
|
||||||
|
$selec = "selected";
|
||||||
|
}
|
||||||
|
$salida.='<option value="' . $codigo . '" ' . $selec . ' >' . $color . '</option>';
|
||||||
|
}
|
||||||
|
$salida.='</select></td></tr>';
|
||||||
|
$salida.='<th colspan=2 class="danger"><center><b>Base de datos</b></center></th>';
|
||||||
|
$salida.='<tr><td>Servidor</td><td><input type="text" name="SERVIDOR" value="' . $this->datosConf['SERVIDOR'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>Puerto</td><td><input type="text" name="PUERTO" value="' . $this->datosConf['PUERTO'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>Base de datos</td><td><input type="text" name="BASEDATOS" value="' . $this->datosConf['BASEDATOS'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>Base de datos Tests</td><td><input type="text" name="BASEDATOSTEST" value="' . $this->datosConf['BASEDATOSTEST'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>Usuario</td><td><input type="text" name="USUARIO" value="' . $this->datosConf['USUARIO'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>Clave</td><td><input type="text" name="CLAVE" value="' . $this->datosConf['CLAVE'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>mysqldump</td><td><input type="text" name="MYSQLDUMP" value="' . $this->datosConf['MYSQLDUMP'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr><td>gzip</td><td><input type="text" name="GZIP" value="' . $this->datosConf['GZIP'] . '" size="30" /></td></tr>';
|
||||||
|
$salida.='<tr align=center><td colspan=2><input type="submit" class="btn btn-primary" align="center" value="Aceptar" name="aceptar" /></td></tr></p>';
|
||||||
|
$salida.='</form></div></center>';
|
||||||
|
$salida.="<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('select[name=" . '"COLORFON"' . "]').on('change', function() {
|
||||||
|
$(document.body).css('background-color', $('select[name=" . '"COLORFON"' . "]').val());
|
||||||
|
$('.main').css('background-color', $('select[name=" . '"COLORFON"' . "]').val());
|
||||||
|
});
|
||||||
|
$('select[name=" . '"COLORLAT"' . "]').on('change', function() {
|
||||||
|
$('.sidebar').css('background-color', $('select[name=" . '"COLORLAT"' . "]').val());
|
||||||
|
});
|
||||||
|
$('select[name=" . '"COLORLAT"' . "]').simplecolorpicker({theme: 'glyphicons'});
|
||||||
|
$('select[name=" . '"COLORFON"' . "]').simplecolorpicker({theme: 'glyphicons'});
|
||||||
|
});
|
||||||
|
</script>";
|
||||||
|
return $salida;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
6
Csv.php
6
Csv.php
@@ -114,7 +114,7 @@ class Csv {
|
|||||||
// Escribe la cabecera del fichero
|
// Escribe la cabecera del fichero
|
||||||
$this->escribeLinea(array($consulta->Pagina->Cabecera, $consulta->Titulo['id'], $consulta->Titulo['Texto']));
|
$this->escribeLinea(array($consulta->Pagina->Cabecera, $consulta->Titulo['id'], $consulta->Titulo['Texto']));
|
||||||
foreach ($consulta->Pagina->Cuerpo->Col as $campo) {
|
foreach ($consulta->Pagina->Cuerpo->Col as $campo) {
|
||||||
$campos[] = utf8_decode($campo['Titulo']);
|
$campos[] = $campo['Titulo'];
|
||||||
}
|
}
|
||||||
$this->escribeLinea($campos);
|
$this->escribeLinea($campos);
|
||||||
// Escribe los datos de los campos
|
// Escribe los datos de los campos
|
||||||
@@ -151,8 +151,8 @@ class Csv {
|
|||||||
*/
|
*/
|
||||||
public function resumen() {
|
public function resumen() {
|
||||||
//$mensaje .=
|
//$mensaje .=
|
||||||
$mensaje = "<center><h1>Archivo [inventario" . utf8_decode($this->cabecera[0]) . "]</h1>";
|
$mensaje = "<center><h1>Archivo [inventario" . $this->cabecera[0] . "]</h1>";
|
||||||
$mensaje .= "<h2>id=[" . $this->cabecera[1] . "] Descripción=[" . utf8_decode($this->cabecera[2]) . "]</h2><br>";
|
$mensaje .= "<h2>id=[" . $this->cabecera[1] . "] Descripción=[" . $this->cabecera[2] . "]</h2><br>";
|
||||||
$mensaje .= '<table border=1 class="table table-striped table-bordered table-condensed table-hover"><theader>';
|
$mensaje .= '<table border=1 class="table table-striped table-bordered table-condensed table-hover"><theader>';
|
||||||
foreach ($this->datosFichero[0] as $campo) {
|
foreach ($this->datosFichero[0] as $campo) {
|
||||||
$dato = $campo;
|
$dato = $campo;
|
||||||
|
179
EtiquetasPDF.php
Normal file
179
EtiquetasPDF.php
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* genera un documento PDF a partir de una descripción dada en un archivo XML
|
||||||
|
* @author Ricardo Montañana <rmontanana@gmail.com>
|
||||||
|
* @version 1.0
|
||||||
|
* @package Inventario
|
||||||
|
* @copyright Copyright (c) 2008, Ricardo Montañana
|
||||||
|
* @package Inventario
|
||||||
|
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
||||||
|
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
|
* This file is part of Inventario.
|
||||||
|
* Inventario 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Inventario 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
require_once 'phpqrcode.php';
|
||||||
|
|
||||||
|
class EtiquetasPDF {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @var basedatos Controlador de la base de datos
|
||||||
|
*/
|
||||||
|
private $bdd;
|
||||||
|
private $docu;
|
||||||
|
private $pdf;
|
||||||
|
private $def;
|
||||||
|
private $nombreFichero = "tmp/informeEtiquetas.pdf";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* El constructor recibe como argumento el nombre del archivo XML con la definición, encargándose de recuperarla y guardar toda la información localmente
|
||||||
|
* @param basedatos $bdd manejador de la base de datos
|
||||||
|
* @param string $definicion fichero con la definición del informe en XML
|
||||||
|
* @param boolean $registrado usuario registrado si/no
|
||||||
|
* @return ficheroPDF
|
||||||
|
* todo: cambiar este comentario
|
||||||
|
*/
|
||||||
|
public function __construct($bdd, $definicion, $registrado)
|
||||||
|
{
|
||||||
|
if (!$registrado) {
|
||||||
|
return 'Debe registrarse para acceder a este apartado';
|
||||||
|
}
|
||||||
|
// Recuperamos la definición del informe
|
||||||
|
$this->def = simplexml_load_file($definicion);
|
||||||
|
$this->bdd = $bdd;
|
||||||
|
$this->pdf = new FPDF();
|
||||||
|
$this->pdf->SetMargins(0.2, 0.2, 0.2);
|
||||||
|
$this->pdf->SetFont('Arial', '', 11);
|
||||||
|
$this->pdf->setAutoPageBreak(false);
|
||||||
|
//echo $def->Titulo.$def->Cabecera;
|
||||||
|
$this->pdf->setAuthor(AUTOR, true);
|
||||||
|
$creador = CENTRO . " " . PROGRAMA . VERSION;
|
||||||
|
$this->pdf->setCreator(html_entity_decode($creador), true);
|
||||||
|
$this->pdf->setSubject($this->def->Titulo, true);
|
||||||
|
//$this->pdf->setAutoPageBreak(true, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function crea($definicion)
|
||||||
|
{
|
||||||
|
//print_r($def);echo $bdd;die();
|
||||||
|
// Iniciamos la creación del documento
|
||||||
|
$this->def = simplexml_load_file($definicion);
|
||||||
|
//Ejecuta la consulta y prepara las variables de la base de datos.
|
||||||
|
$this->bdd->ejecuta(trim($this->def->Datos->Consulta));
|
||||||
|
//Inicializa las variables para el control de las etiquetas.
|
||||||
|
$this->pdf->AddPage();
|
||||||
|
$tamLinea = 5;
|
||||||
|
$fila = -1;
|
||||||
|
$primero = true; $i = 0;
|
||||||
|
$url = explode("/", $_SERVER['SCRIPT_NAME']);
|
||||||
|
$aplicacion = $url[1];
|
||||||
|
$protocolo = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443 ? "https://" : "http://";
|
||||||
|
$enlace = $protocolo . $_SERVER['SERVER_NAME'] . "/" . $aplicacion . "/index.php?elementos&opc=editar&id=";
|
||||||
|
while($tupla = $this->bdd->procesaResultado()) {
|
||||||
|
if ($i % 2) {
|
||||||
|
//Columna 2
|
||||||
|
$etiq1 = 136;
|
||||||
|
$etiq2 = 105;
|
||||||
|
} else {
|
||||||
|
//Columna 1
|
||||||
|
$etiq1 = 30;
|
||||||
|
$etiq2 = 1;
|
||||||
|
$fila++;
|
||||||
|
}
|
||||||
|
if ($i % 14 == 0) {
|
||||||
|
if (!$primero) {
|
||||||
|
$this->pdf->AddPage();
|
||||||
|
$fila = 0;
|
||||||
|
}
|
||||||
|
$primero = false;
|
||||||
|
}
|
||||||
|
$py = 6 + 41 * $fila;
|
||||||
|
$enlace2=$enlace.$tupla['idEl'];
|
||||||
|
$fichero = "tmp/etiq".rand(1000,9999).".png";
|
||||||
|
QRcode::png($enlace2, $fichero);
|
||||||
|
$this->pdf->image($fichero, $etiq2, $py, 30, 30);
|
||||||
|
unlink($fichero);
|
||||||
|
$this->pdf->setxy($etiq1, $py);
|
||||||
|
$this->pdf->Cell(30, 10, utf8_decode($tupla['articulo']));
|
||||||
|
$py+=$tamLinea;
|
||||||
|
$this->pdf->setxy($etiq1, $py);
|
||||||
|
$this->pdf->Cell(30, 10, utf8_decode($tupla['marca']));
|
||||||
|
$py+=$tamLinea;
|
||||||
|
$this->pdf->setxy($etiq1, $py);
|
||||||
|
$this->pdf->Cell(30, 10, utf8_decode($tupla['modelo']));
|
||||||
|
$py+=$tamLinea;
|
||||||
|
$this->pdf->setxy($etiq1, $py);
|
||||||
|
$this->pdf->Cell(30, 10, utf8_decode($tupla['numserie']));
|
||||||
|
$py+=$tamLinea;
|
||||||
|
$this->pdf->setxy($etiq1, $py);
|
||||||
|
$this->pdf->Cell(30, 10, $tupla['fechaCompra']);
|
||||||
|
$py+=$tamLinea-1;
|
||||||
|
$this->pdf->setxy($etiq2, $py);
|
||||||
|
$this->pdf->Cell(30, 10, utf8_decode($tupla['ubicacion']));
|
||||||
|
$py+=$tamLinea-1;
|
||||||
|
$this->pdf->setxy($etiq2, $py);
|
||||||
|
$cadena = "idElemento=" . $tupla['idEl'] . " / idArticulo=" . $tupla['idArt'] . " / idUbicacion=" . $tupla['idUbic'];
|
||||||
|
$this->pdf->Cell(30, 10, $cadena);
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
//$this->pdf->MultiCell(0,30,var_export($filas,true));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cierraPDF()
|
||||||
|
{
|
||||||
|
$this->pdf->Close();
|
||||||
|
$this->docu = $this->pdf->Output('', 'S');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getContenido()
|
||||||
|
{
|
||||||
|
return $this->docu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCabecera()
|
||||||
|
{
|
||||||
|
$cabecera = "Content-type: application/pdf";
|
||||||
|
$cabecera = $cabecera . "Content-length: " . strlen($this->docu);
|
||||||
|
$cabecera = $cabecera . "Content-Disposition: inline; filename=" . $this->nombreFichero;
|
||||||
|
return $cabecera;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function guardaArchivo($nombre = "tmp/Informe.pdf")
|
||||||
|
{
|
||||||
|
$fichero = fopen($nombre, "w");
|
||||||
|
fwrite($fichero, $this->getCabecera());
|
||||||
|
fwrite($fichero, $this->getContenido(), strlen($this->getContenido()));
|
||||||
|
$this->nombreFichero = $nombre;
|
||||||
|
fclose($fichero);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function enviaCabecera()
|
||||||
|
{
|
||||||
|
header("Content-type: application/pdf");
|
||||||
|
$longitud = strlen($this->docu);
|
||||||
|
header("Content-length: $longitud");
|
||||||
|
header("Content-Disposition: inline; filename=" . $this->nombreFichero);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function imprimeInforme()
|
||||||
|
{
|
||||||
|
$this->enviaCabecera();
|
||||||
|
echo $this->docu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@@ -40,12 +40,19 @@ class InformeInventario {
|
|||||||
|
|
||||||
private function listarUbicacion() {
|
private function listarUbicacion() {
|
||||||
$salidaInforme = isset($_POST['salida']) ? $_POST['salida'] : 'pantalla';
|
$salidaInforme = isset($_POST['salida']) ? $_POST['salida'] : 'pantalla';
|
||||||
if ($salidaInforme == "pantalla") {
|
switch ($salidaInforme) {
|
||||||
$fichero = "xml/inventarioUbicacion.xml";
|
case "pantalla":
|
||||||
$salida = "tmp/inventarioUbicacion.xml";
|
$fichero = "xml/inventarioUbicacion.xml";
|
||||||
} else {
|
$salida = "tmp/inventarioUbicacion.xml";
|
||||||
$fichero = "xml/inventarioUbicacionCSV.xml";
|
break;
|
||||||
$salida = "tmp/inventarioUbicacionCSV.xml";
|
case "csv":
|
||||||
|
$fichero = "xml/inventarioUbicacionCSV.xml";
|
||||||
|
$salida = "tmp/inventarioUbicacionCSV.xml";
|
||||||
|
break;
|
||||||
|
case "etiquetas":
|
||||||
|
$fichero = "xml/inventarioUbicacionEtiquetas.xml";
|
||||||
|
$salida = "tmp/inventarioUbicacionEtiquetas.xml";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
$plantilla = file_get_contents($fichero) or die('Fallo en la apertura de la plantilla ' . $fichero);
|
$plantilla = file_get_contents($fichero) or die('Fallo en la apertura de la plantilla ' . $fichero);
|
||||||
$id = $_POST['id'] == NULL ? $_GET['id'] : $_POST['id'];
|
$id = $_POST['id'] == NULL ? $_GET['id'] : $_POST['id'];
|
||||||
@@ -56,32 +63,49 @@ class InformeInventario {
|
|||||||
}
|
}
|
||||||
$fila = $this->bdd->procesaResultado();
|
$fila = $this->bdd->procesaResultado();
|
||||||
$plantilla = str_replace("{id}", $id, $plantilla);
|
$plantilla = str_replace("{id}", $id, $plantilla);
|
||||||
$plantilla = str_replace("{Descripcion}", utf8_encode($fila['Descripcion']), $plantilla);
|
$plantilla = str_replace("{Descripcion}", $fila['Descripcion'], $plantilla);
|
||||||
file_put_contents($salida, $plantilla) or die('Fallo en la escritura de la plantilla ' . $salida);
|
file_put_contents($salida, $plantilla) or die('Fallo en la escritura de la plantilla ' . $salida);
|
||||||
if ($salidaInforme == "pantalla") {
|
switch ($salidaInforme) {
|
||||||
$informe = new InformePDF($this->bdd, $salida, true);
|
case "pantalla":
|
||||||
$informe->crea($salida);
|
$informe = new InformePDF($this->bdd, $salida, true);
|
||||||
$informe->cierraPDF();
|
$informe->crea($salida);
|
||||||
$informe->guardaArchivo("tmp/Informe.pdf");
|
$informe->cierraPDF();
|
||||||
echo '<script type="text/javascript"> window.open( "tmp/Informe.pdf" ) </script>';
|
$informe->guardaArchivo("tmp/Informe.pdf");
|
||||||
} else {
|
echo '<script type="text/javascript"> window.open( "tmp/Informe.pdf" ) </script>';
|
||||||
//Genera una hoja de cálculo en formato csv
|
break;
|
||||||
$nombre = "tmp/Ubicacion" . strftime("%Y%m%d") . rand(100, 999) . ".csv";
|
case "csv":
|
||||||
$hoja = new Csv($this->bdd);
|
//Genera una hoja de cálculo en formato csv
|
||||||
$hoja->crea($nombre);
|
$nombre = "tmp/Ubicacion" . strftime("%Y%m%d") . rand(100, 999) . ".csv";
|
||||||
$hoja->ejecutaConsulta($salida);
|
$hoja = new Csv($this->bdd);
|
||||||
echo '<script type="text/javascript"> window.open( "' . $nombre . '" ) </script>';
|
$hoja->crea($nombre);
|
||||||
|
$hoja->ejecutaConsulta($salida);
|
||||||
|
echo '<script type="text/javascript"> window.open( "' . $nombre . '" ) </script>';
|
||||||
|
break;
|
||||||
|
case "etiquetas":
|
||||||
|
$etiquetas = new EtiquetasPDF($this->bdd, $salida, true);
|
||||||
|
$etiquetas->crea($salida);
|
||||||
|
$etiquetas->cierraPDF();
|
||||||
|
$etiquetas->guardaArchivo("tmp/EtiquetasUbicacion.pdf");
|
||||||
|
echo '<script type="text/javascript"> window.open( "tmp/EtiquetasUbicacion.pdf" ) </script>';
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function listarArticulo() {
|
private function listarArticulo() {
|
||||||
$salidaInforme = isset($_POST['salida']) ? $_POST['salida'] : 'pantalla';
|
$salidaInforme = isset($_POST['salida']) ? $_POST['salida'] : 'pantalla';
|
||||||
if ($salidaInforme == "pantalla") {
|
switch ($salidaInforme) {
|
||||||
$fichero = "xml/inventarioArticulo.xml";
|
case "pantalla":
|
||||||
$salida = "tmp/inventarioArticulo.xml";
|
$fichero = "xml/inventarioArticulo.xml";
|
||||||
} else {
|
$salida = "tmp/inventarioArticulo.xml";
|
||||||
$fichero = "xml/inventarioArticuloCSV.xml";
|
break;
|
||||||
$salida = "tmp/inventarioArticuloCSV.xml";
|
case "csv":
|
||||||
|
$fichero = "xml/inventarioArticuloCSV.xml";
|
||||||
|
$salida = "tmp/inventarioArticuloCSV.xml";
|
||||||
|
break;
|
||||||
|
case "etiquetas":
|
||||||
|
$fichero = "xml/inventarioArticuloEtiquetas.xml";
|
||||||
|
$salida = "tmp/inventarioArticuloEtiquetas.xml";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
$plantilla = file_get_contents($fichero) or die('Fallo en la apertura de la plantilla ' . $fichero);
|
$plantilla = file_get_contents($fichero) or die('Fallo en la apertura de la plantilla ' . $fichero);
|
||||||
$id = $_POST['id'] == NULL ? $_GET['id'] : $_POST['id'];
|
$id = $_POST['id'] == NULL ? $_GET['id'] : $_POST['id'];
|
||||||
@@ -92,25 +116,34 @@ class InformeInventario {
|
|||||||
}
|
}
|
||||||
$fila = $this->bdd->procesaResultado();
|
$fila = $this->bdd->procesaResultado();
|
||||||
$plantilla = str_replace("{id}", $id, $plantilla);
|
$plantilla = str_replace("{id}", $id, $plantilla);
|
||||||
$plantilla = str_replace("{Descripcion}", utf8_encode($fila['descripcion']), $plantilla);
|
$plantilla = str_replace("{Descripcion}", $fila['descripcion'], $plantilla);
|
||||||
$plantilla = str_replace("{Marca}", utf8_encode($fila['marca']), $plantilla);
|
$plantilla = str_replace("{Marca}", $fila['marca'], $plantilla);
|
||||||
$plantilla = str_replace("{Modelo}", utf8_encode($fila['modelo']), $plantilla);
|
$plantilla = str_replace("{Modelo}", $fila['modelo'], $plantilla);
|
||||||
file_put_contents($salida, $plantilla) or die('Fallo en la escritura de la plantilla ' . $salida);
|
file_put_contents($salida, $plantilla) or die('Fallo en la escritura de la plantilla ' . $salida);
|
||||||
if ($salidaInforme == "pantalla") {
|
switch ($salidaInforme) {
|
||||||
$informe = new InformePDF($this->bdd, $salida, true);
|
case "pantalla":
|
||||||
$informe->crea($salida);
|
$informe = new InformePDF($this->bdd, $salida, true);
|
||||||
$informe->cierraPDF();
|
$informe->crea($salida);
|
||||||
$informe->guardaArchivo("tmp/Informe.pdf");
|
$informe->cierraPDF();
|
||||||
echo '<script type="text/javascript"> window.open( "tmp/Informe.pdf" ) </script>';
|
$informe->guardaArchivo("tmp/Informe.pdf");
|
||||||
} else {
|
echo '<script type="text/javascript"> window.open( "tmp/Informe.pdf" ) </script>';
|
||||||
//Genera una hoja de cálculo en formato csv
|
break;
|
||||||
$nombre = "tmp/Articulo" . strftime("%Y%m%d") . rand(100, 999) . ".csv";
|
case "csv":
|
||||||
$hoja = new Csv($this->bdd);
|
//Genera una hoja de cálculo en formato csv
|
||||||
$hoja->crea($nombre);
|
$nombre = "tmp/Articulo" . strftime("%Y%m%d") . rand(100, 999) . ".csv";
|
||||||
$hoja->ejecutaConsulta($salida);
|
$hoja = new Csv($this->bdd);
|
||||||
echo '<script type="text/javascript"> window.open( "' . $nombre . '" ) </script>';
|
$hoja->crea($nombre);
|
||||||
|
$hoja->ejecutaConsulta($salida);
|
||||||
|
echo '<script type="text/javascript"> window.open( "' . $nombre . '" ) </script>';
|
||||||
|
break;
|
||||||
|
case "etiquetas":
|
||||||
|
$etiquetas = new EtiquetasPDF($this->bdd, $salida, true);
|
||||||
|
$etiquetas->crea($salida);
|
||||||
|
$etiquetas->cierraPDF();
|
||||||
|
$etiquetas->guardaArchivo("tmp/EtiquetasArticulo.pdf");
|
||||||
|
echo '<script type="text/javascript"> window.open( "tmp/EtiquetasArticulo.pdf" ) </script>';
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
//header('Location: index.php');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function listaUbicaciones() {
|
private function listaUbicaciones() {
|
||||||
@@ -149,6 +182,7 @@ class InformeInventario {
|
|||||||
$salida.="<br><br><label for='salida'>Salida del informe por:</label>";
|
$salida.="<br><br><label for='salida'>Salida del informe por:</label>";
|
||||||
$salida.='<div class="radio"><label><input type="radio" name="salida" value="pantalla" checked>Pantalla</label></div>';
|
$salida.='<div class="radio"><label><input type="radio" name="salida" value="pantalla" checked>Pantalla</label></div>';
|
||||||
$salida.='<div class="radio"><label><input type="radio" name="salida" value="csv">Archivo CSV</label></div>';
|
$salida.='<div class="radio"><label><input type="radio" name="salida" value="csv">Archivo CSV</label></div>';
|
||||||
|
$salida.='<div class="radio"><label><input type="radio" name="salida" value="etiquetas">Etiquetas</label></div>';
|
||||||
$salida.="<br><br></fieldset><p>";
|
$salida.="<br><br></fieldset><p>";
|
||||||
$salida.='<p align="center"><button type=submit class="btn btn-primary">Aceptar</button></p><br></div>' . "\n";
|
$salida.='<p align="center"><button type=submit class="btn btn-primary">Aceptar</button></p><br></div>' . "\n";
|
||||||
return $salida;
|
return $salida;
|
||||||
@@ -180,7 +214,7 @@ class InformeInventario {
|
|||||||
//$fila=$this->bdd->procesaResultado();
|
//$fila=$this->bdd->procesaResultado();
|
||||||
$plantilla = file_get_contents($fichero) or die('Fallo en la apertura de la plantilla ' . $fichero);
|
$plantilla = file_get_contents($fichero) or die('Fallo en la apertura de la plantilla ' . $fichero);
|
||||||
$plantilla = str_replace("{id}", $fila['id'], $plantilla);
|
$plantilla = str_replace("{id}", $fila['id'], $plantilla);
|
||||||
$plantilla = str_replace("{Descripcion}", utf8_encode($fila['Descripcion']), $plantilla);
|
$plantilla = str_replace("{Descripcion}", $fila['Descripcion'], $plantilla);
|
||||||
file_put_contents($salida, $plantilla) or die('Fallo en la escritura de la plantilla ' . $salida);
|
file_put_contents($salida, $plantilla) or die('Fallo en la escritura de la plantilla ' . $salida);
|
||||||
if ($primero) {
|
if ($primero) {
|
||||||
$primero = false;
|
$primero = false;
|
||||||
@@ -192,7 +226,6 @@ class InformeInventario {
|
|||||||
$informe->cierraPDF();
|
$informe->cierraPDF();
|
||||||
$informe->imprimeInforme();
|
$informe->imprimeInforme();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@@ -1,147 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Inventario
|
|
||||||
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
|
||||||
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
|
||||||
* This file is part of Inventario.
|
|
||||||
* Inventario 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 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Inventario 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class InformeInventario {
|
|
||||||
private $bdd;
|
|
||||||
public function __construct($baseDatos)
|
|
||||||
{
|
|
||||||
$this->bdd=$baseDatos;
|
|
||||||
}
|
|
||||||
public function ejecuta()
|
|
||||||
{
|
|
||||||
$opc=$_GET['opc'];
|
|
||||||
switch ($opc) {
|
|
||||||
case 'Ubicacion':return $this->formularioUbicacion();
|
|
||||||
case 'listarUbicacion':return $this->listarUbicacion();
|
|
||||||
case 'listarArticulo':return $this->listarArticulo();
|
|
||||||
case 'Articulo':return $this->formularioArticulo();
|
|
||||||
case 'Total':return $this->inventarioTotal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private function listarUbicacion()
|
|
||||||
{
|
|
||||||
$fichero="xml/inventarioUbicacion.xml";
|
|
||||||
$salida="tmp/inventarioUbicacion.xml";
|
|
||||||
$plantilla=file_get_contents($fichero)
|
|
||||||
or die('Fallo en la apertura de la plantilla '.$fichero);
|
|
||||||
$comando="select * from Ubicaciones where id='".$_POST['id']."';";
|
|
||||||
$resultado=$this->bdd->ejecuta($comando);
|
|
||||||
if (!$resultado) {
|
|
||||||
return $this->bdd->mensajeError($comando);
|
|
||||||
}
|
|
||||||
$fila=$this->bdd->procesaResultado();
|
|
||||||
$plantilla=str_replace("{id}",$_POST['id'],$plantilla);
|
|
||||||
$plantilla=str_replace("{Descripcion}",utf8_encode($fila['Descripcion']),$plantilla);
|
|
||||||
file_put_contents($salida,$plantilla)
|
|
||||||
or die('Fallo en la escritura de la plantilla '.$salida);
|
|
||||||
$informe=new InformePDF($this->bdd,$salida,true);
|
|
||||||
}
|
|
||||||
private function listarArticulo()
|
|
||||||
{
|
|
||||||
$fichero="xml/inventarioArticulo.xml";
|
|
||||||
$salida="tmp/inventarioArticulo.xml";
|
|
||||||
$plantilla=file_get_contents($fichero)
|
|
||||||
or die('Fallo en la apertura de la plantilla '.$fichero);
|
|
||||||
$comando="select * from Articulos where id='".$_POST['id']."';";
|
|
||||||
$resultado=$this->bdd->ejecuta($comando);
|
|
||||||
if (!$resultado) {
|
|
||||||
return $this->bdd->mensajeError($comando);
|
|
||||||
}
|
|
||||||
$fila=$this->bdd->procesaResultado();
|
|
||||||
$plantilla=str_replace("{id}",$_POST['id'],$plantilla);
|
|
||||||
$plantilla=str_replace("{Descripcion}",utf8_encode($fila['descripcion']),$plantilla);
|
|
||||||
$plantilla=str_replace("{Marca}",utf8_encode($fila['marca']),$plantilla);
|
|
||||||
$plantilla=str_replace("{Modelo}",utf8_encode($fila['modelo']),$plantilla);
|
|
||||||
file_put_contents($salida,$plantilla)
|
|
||||||
or die('Fallo en la escritura de la plantilla '.$salida);
|
|
||||||
$informe=new InformePDF($this->bdd,$salida,true);
|
|
||||||
}
|
|
||||||
private function listaUbicaciones()
|
|
||||||
{
|
|
||||||
$salida="<select name=\"id\">\n";
|
|
||||||
$comando="select * from Ubicaciones order by Descripcion";
|
|
||||||
$resultado=$this->bdd->ejecuta($comando);
|
|
||||||
if (!$resultado) {
|
|
||||||
return $this->bdd->mensajeError($comando);
|
|
||||||
}
|
|
||||||
while($fila=$this->bdd->procesaResultado()) {
|
|
||||||
$salida.="<option value=".$fila['id'].">".$fila['Descripcion']."</option><br>\n";
|
|
||||||
}
|
|
||||||
$salida.="</select>\n";
|
|
||||||
return $salida;
|
|
||||||
}
|
|
||||||
private function listaArticulos()
|
|
||||||
{
|
|
||||||
$salida="<select name=\"id\">\n";
|
|
||||||
$comando="select * from Articulos order by descripcion, marca, modelo";
|
|
||||||
$resultado=$this->bdd->ejecuta($comando);
|
|
||||||
if (!$resultado) {
|
|
||||||
return $this->bdd->mensajeError($comando);
|
|
||||||
}
|
|
||||||
while($fila=$this->bdd->procesaResultado()) {
|
|
||||||
$salida.="<option value=".$fila['id'].">".$fila['descripcion']."-".$fila['marca']."-".$fila['modelo']."</option><br>\n";
|
|
||||||
}
|
|
||||||
$salida.="</select>\n";
|
|
||||||
return $salida;
|
|
||||||
}
|
|
||||||
private function formulario($accion,$etiqueta,$lista)
|
|
||||||
{
|
|
||||||
$salida='<form name="mantenimiento.form" method="post" action="'.$accion.'">'."\n";
|
|
||||||
$salida.="<fieldset style=\"width: 96%;\"><p><legend style=\"color: red;\"><b>Elige $etiqueta</b></legend>\n";
|
|
||||||
$salida.="<br><br><label>$etiqueta</label>";
|
|
||||||
$salida.=$lista;
|
|
||||||
$salida.="<br><br></fieldset><p>";
|
|
||||||
$salida.='<p align="center"><button type=submit>Aceptar</button></p><br>'."\n";
|
|
||||||
return $salida;
|
|
||||||
}
|
|
||||||
private function formularioUbicacion()
|
|
||||||
{
|
|
||||||
//Genera un formulario con las ubicaciones disponibles.
|
|
||||||
$accion="index.php?informeInventario&opc=listarUbicacion";
|
|
||||||
return $this->formulario($accion,'Ubicación',$this->listaUbicaciones());
|
|
||||||
}
|
|
||||||
private function formularioArticulo()
|
|
||||||
{
|
|
||||||
$accion="index.php?informeInventario&opc=listarArticulo";
|
|
||||||
return $this->formulario($accion,'Artículo',$this->listaArticulos());
|
|
||||||
}
|
|
||||||
private function inventarioTotal()
|
|
||||||
{
|
|
||||||
$fichero="xml/inventarioUbicacion.xml";
|
|
||||||
$salida="tmp/inventarioUbicacion.xml";
|
|
||||||
$comando="select * from Ubicaciones where id='".$_POST['id']."';";
|
|
||||||
$resultado=$this->bdd->ejecuta($comando);
|
|
||||||
if (!$resultado) {
|
|
||||||
return $this->bdd->mensajeError($comando);
|
|
||||||
}
|
|
||||||
$salidaTotal='';
|
|
||||||
while ($fila=$this->bdd->procesaResultado()) {
|
|
||||||
$plantilla=file_get_contents($fichero)
|
|
||||||
or die('Fallo en la apertura de la plantilla '.$fichero);
|
|
||||||
$plantilla=str_replace("{id}",$_POST['id'],$plantilla);
|
|
||||||
$plantilla=str_replace("{Descripcion}",utf8_encode($fila['Descripcion']),$plantilla);
|
|
||||||
file_put_contents($salida,$plantilla)
|
|
||||||
or die('Fallo en la escritura de la plantilla '.$salida);
|
|
||||||
$salidaTotal+=$salida;
|
|
||||||
}
|
|
||||||
$informe=new InformePDF($this->bdd,$salidaTotal,true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
@@ -51,12 +51,13 @@ class InformePDF {
|
|||||||
// Recuperamos la definición del informe
|
// Recuperamos la definición del informe
|
||||||
$this->def = simplexml_load_file($definicion);
|
$this->def = simplexml_load_file($definicion);
|
||||||
$this->bdd = $bdd;
|
$this->bdd = $bdd;
|
||||||
$this->pdf = new Pdf_mysql_table($this->bdd->obtieneManejador(), (string) $this->def->Pagina['Orientacion'], (string) $this->def->Pagina['Formato'], (string) $this->def->Titulo['Texto'], (string) $this->def->Pagina->Cabecera);
|
$this->pdf = new Pdf_mysql_table($this->bdd->obtieneManejador(), (string) $this->def->Pagina['Orientacion'], (string) $this->def->Pagina['Formato'], (string) utf8_decode($this->def->Titulo['Texto']), (string) $this->def->Pagina->Cabecera);
|
||||||
//echo $def->Titulo.$def->Cabecera;
|
//echo $def->Titulo.$def->Cabecera;
|
||||||
$this->pdf->Open();
|
$this->pdf->Open();
|
||||||
$this->pdf->setAuthor(utf8_decode(AUTOR));
|
$this->pdf->setAuthor(AUTOR,true);
|
||||||
$this->pdf->setCreator(html_entity_decode(APLICACION));
|
$creador = CENTRO . " " . PROGRAMA.VERSION;
|
||||||
$this->pdf->setSubject(utf8_decode($this->def->Titulo));
|
$this->pdf->setCreator(html_entity_decode($creador),true);
|
||||||
|
$this->pdf->setSubject($this->def->Titulo,true);
|
||||||
$this->pdf->setAutoPageBreak(true, 10);
|
$this->pdf->setAutoPageBreak(true, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,85 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* genera un documento PDF a partir de una descripción dada en un archivo XML
|
|
||||||
* @author Ricardo Montañana <rmontanana@gmail.com>
|
|
||||||
* @version 1.0
|
|
||||||
* @package Inventario
|
|
||||||
* @copyright Copyright (c) 2008, Ricardo Montañana
|
|
||||||
* @package Inventario
|
|
||||||
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
|
||||||
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
|
||||||
* This file is part of Inventario.
|
|
||||||
* Inventario 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 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Inventario 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
class InformePDF
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @var basedatos Controlador de la base de datos
|
|
||||||
*/
|
|
||||||
private $bdd;
|
|
||||||
/**
|
|
||||||
* El constructor recibe como argumento el nombre del archivo XML con la definición, encargándose de recuperarla y guardar toda la información localmente
|
|
||||||
* @param basedatos $bdd manejador de la base de datos
|
|
||||||
* @param string $definicion fichero con la definición del informe en XML
|
|
||||||
* @param boolean $registrado usuario registrado si/no
|
|
||||||
* @return ficheroPDF
|
|
||||||
*/
|
|
||||||
public function __construct($bdd,$definicion,$registrado)
|
|
||||||
{
|
|
||||||
if (!$registrado) {
|
|
||||||
return 'Debe registrarse para acceder a este apartado';
|
|
||||||
}
|
|
||||||
$this->bdd=$bdd;
|
|
||||||
// Recuperamos la definición del informe
|
|
||||||
$def=simplexml_load_file($definicion);
|
|
||||||
//print_r($def);echo $bdd;die();
|
|
||||||
// Iniciamos la creación del documento
|
|
||||||
$pdf=new Pdf_mysql_table($this->bdd->obtieneManejador(),(string)$def->Pagina['Orientacion'],
|
|
||||||
(string)$def->Pagina['Formato'],
|
|
||||||
(string)$def->Titulo['Texto'],(string)$def->Pagina->Cabecera);
|
|
||||||
echo $def->Titulo.$def->Cabecera;
|
|
||||||
$pdf->Open();
|
|
||||||
$pdf->setAuthor(utf8_decode(AUTOR));
|
|
||||||
$pdf->setCreator(html_entity_decode(APLICACION));
|
|
||||||
$pdf->setSubject(utf8_decode($def->Titulo));
|
|
||||||
$pdf->setAutoPageBreak(true,10);
|
|
||||||
$this->bdd->ejecuta(trim($def->Datos->Consulta));
|
|
||||||
$filas=$this->bdd->procesaResultado();
|
|
||||||
$pdf->AddPage();
|
|
||||||
// Recuperamos los datos del cuerpo
|
|
||||||
foreach($def->Pagina->Cuerpo->Col as $columna) {
|
|
||||||
$pdf->AddCol((string)$columna['Nombre'],(string)$columna['Ancho'],
|
|
||||||
(string)$columna['Titulo'],(string)$columna['Ajuste'],
|
|
||||||
(string)$columna['Total']);
|
|
||||||
}
|
|
||||||
$prop=array('HeaderColor'=>array(255,150,100),
|
|
||||||
'color1'=>array(210,245,255),
|
|
||||||
'color2'=>array(255,255,210),
|
|
||||||
'padding'=>2);
|
|
||||||
$pdf->Table($def->Datos->Consulta,$prop);
|
|
||||||
$pdf->Close();
|
|
||||||
// Obtenemos el documento y su longitud
|
|
||||||
$documento=$pdf->Output('','S');
|
|
||||||
$longitud=strlen($documento);
|
|
||||||
// y lo enviamos como resultado
|
|
||||||
header("Content-type: application/pdf");
|
|
||||||
header("Content-length: $longitud");
|
|
||||||
header("Content-Disposition: inline; filename=Informe.pdf");
|
|
||||||
echo $documento;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
@@ -29,7 +29,6 @@ class Mantenimiento {
|
|||||||
private $descripcion;
|
private $descripcion;
|
||||||
protected $bdd;
|
protected $bdd;
|
||||||
protected $url;
|
protected $url;
|
||||||
protected $cabecera;
|
|
||||||
protected $tabla;
|
protected $tabla;
|
||||||
protected $cadenaBusqueda;
|
protected $cadenaBusqueda;
|
||||||
protected $campos = array();
|
protected $campos = array();
|
||||||
@@ -37,39 +36,85 @@ class Mantenimiento {
|
|||||||
protected $campoBusca = "Descripcion";
|
protected $campoBusca = "Descripcion";
|
||||||
protected $comandoConsulta = "";
|
protected $comandoConsulta = "";
|
||||||
protected $perfil;
|
protected $perfil;
|
||||||
|
protected $datosURL = array();
|
||||||
|
protected $datosURLb = array(); //para hacer una copia
|
||||||
|
|
||||||
public function __construct($baseDatos, $perfil, $nombre) {
|
public function __construct($baseDatos, $perfil, $nombre)
|
||||||
|
{
|
||||||
$this->bdd = $baseDatos;
|
$this->bdd = $baseDatos;
|
||||||
$this->url = "index.php?$nombre&opc=inicial";
|
$this->url = "index.php?$nombre";
|
||||||
$this->cabecera = 'Location: ' . $this->url;
|
//$this->datosURL['']
|
||||||
$this->tabla = ucfirst($nombre);
|
$this->tabla = ucfirst($nombre);
|
||||||
$this->perfil = $perfil;
|
$this->perfil = $perfil;
|
||||||
|
$this->cargaDatosURL();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ejecuta() {
|
/**
|
||||||
$opc = $_GET['opc'];
|
* Carga en los atributos de la clase los datos de la URL
|
||||||
$id = $_GET['id'];
|
* Los datos constantes en la URL son:
|
||||||
$orden = isset($_GET['orden']) ? $_GET['orden'] : '';
|
* - opc = {inicial, editar, eliminar, nuevo, insertar, modificar, borrar}
|
||||||
$sentido = isset($_GET['sentido']) ? $_GET['sentido'] : 'asc';
|
* - orden = {id, ... } nombre del campo por el que se ordena la visualización
|
||||||
//Sólo tiene sentido para las modificaciones.
|
* - sentido = {asc, desc}
|
||||||
//Es la página donde estaba el registro
|
* - pag = nº página 0, 1, 2, ...
|
||||||
$pag = isset($_GET['pag']) ? $_GET['pag'] : '0';
|
* Los datos opcionales de la URL son:
|
||||||
$this->cadenaBusqueda = $_GET['buscar'];
|
* - buscar = cadena de búsqueda
|
||||||
|
* - id = nº de la clave necesario para la edición o el borrado
|
||||||
|
*/
|
||||||
|
public function cargaDatosURL()
|
||||||
|
{
|
||||||
|
$this->datosURL['opc'] = isset($_GET['opc']) ? $_GET['opc'] : 'inicial';
|
||||||
|
$this->datosURL['orden'] = isset($_GET['orden']) ? $_GET['orden'] : 'id';
|
||||||
|
$this->datosURL['sentido'] = isset($_GET['sentido']) ? $_GET['sentido'] : 'asc';
|
||||||
|
$this->datosURL['pag'] = isset($_GET['pag']) ? $_GET['pag'] : '0';
|
||||||
|
$this->cadenaBusqueda = isset($_GET['buscar']) ? $_GET['buscar'] : null;
|
||||||
|
$this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda;
|
||||||
|
$this->datosURL['buscar'] = $this->cadenaBusqueda;
|
||||||
|
$this->datosURL['id'] = isset($_GET['id']) ? $_GET['id'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function backupURL()
|
||||||
|
{
|
||||||
|
$this->datosURLb = $this->datosURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function restoreURL()
|
||||||
|
{
|
||||||
|
$this->datosURL = $this->datosURLb;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Monta una URL con los datos cargados en los atributos de la clase
|
||||||
|
private function montaURL()
|
||||||
|
{
|
||||||
|
//Primero los datos obligatorios
|
||||||
|
$opc = "&opc=" . $this->datosURL['opc'];
|
||||||
|
$orden = "&orden=" . $this->datosURL['orden'];
|
||||||
|
$sentido = "&sentido=" . $this->datosURL['sentido'];
|
||||||
|
$pag = "&pag=" . $this->datosURL['pag'];
|
||||||
|
//Ahora los datos opcionales
|
||||||
|
$buscar = isset($this->cadenaBusqueda) ? "&buscar=$this->cadenaBusqueda" : null;
|
||||||
|
$id = isset($this->datosURL['id']) ? "&id=" . $this->datosURL['id'] : null;
|
||||||
|
$enlace = $this->url . $opc . $orden . $sentido . $pag . $buscar . $id;
|
||||||
|
return $enlace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ejecuta()
|
||||||
|
{
|
||||||
$this->obtenerCampos();
|
$this->obtenerCampos();
|
||||||
$this->obtieneClavesForaneas();
|
$this->obtieneClavesForaneas();
|
||||||
switch ($opc) {
|
switch ($this->datosURL['opc']) {
|
||||||
case 'inicial':return $this->consulta($id, $orden, $sentido);
|
case 'inicial':return $this->consulta();
|
||||||
case 'editar':return $this->muestra($id, EDICION, $pag, $orden, $sentido);
|
case 'editar':return $this->muestra(EDICION);
|
||||||
case 'eliminar':return $this->muestra($id, BORRADO);
|
case 'eliminar':return $this->muestra(BORRADO);
|
||||||
case 'nuevo':return $this->muestra(null, ANADIR);
|
case 'nuevo':return $this->muestra(ANADIR);
|
||||||
case 'insertar':return $this->insertar();
|
case 'insertar':return $this->insertar();
|
||||||
case 'modificar':return $this->modificar($id, $pag, $orden, $sentido);
|
case 'modificar':return $this->modificar();
|
||||||
case 'borrar':return $this->borrar($id);
|
case 'borrar':return $this->borrar();
|
||||||
default:return 'La clase Mantenimiento No entiende lo solicitado.';
|
default: return "La clase Mantenimiento No entiende lo solicitado [" . $this->datosURL['opc'] . "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function obtieneClavesForaneas() {
|
protected function obtieneClavesForaneas()
|
||||||
|
{
|
||||||
$salida = null;
|
$salida = null;
|
||||||
foreach ($this->campos as $clave => $valor) {
|
foreach ($this->campos as $clave => $valor) {
|
||||||
$trozos = explode(",", $valor["Comment"]);
|
$trozos = explode(",", $valor["Comment"]);
|
||||||
@@ -87,20 +132,21 @@ class Mantenimiento {
|
|||||||
$this->foraneas = $salida;
|
$this->foraneas = $salida;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function consulta($pagina, $orden, $sentido) {
|
private function consulta()
|
||||||
|
{
|
||||||
|
$orden = $this->datosURL['orden'];
|
||||||
|
$sentido = $this->datosURL['sentido'];
|
||||||
//Calcula los números de página anterior y siguiente.
|
//Calcula los números de página anterior y siguiente.
|
||||||
$pagina = $pagina + 0;
|
$pagina = $this->datosURL['pag'];
|
||||||
$pagSigte = $pagina <= 0 ? 1 : $pagina + 1;
|
$pagSigte = $pagina <= 0 ? 1 : $pagina + 1;
|
||||||
$pagAnt = $pagSigte - 2;
|
$pagAnt = $pagSigte - 2 < 0 ? 0 : $pagSigte -2;
|
||||||
$pagFwd = $pagSigte + 3;
|
$pagFwd = $pagSigte + 3;
|
||||||
$pagRew = $pagAnt - 3 < 0 ? $pagAnt : $pagAnt - 3;
|
$pagRew = $pagAnt - 3 < 0 ? 0 : $pagAnt - 3;
|
||||||
//Tengo que procesar la cabecera antes de lo de la cadena de búsqueda por el tema de las búsquedas
|
//Tengo que procesar la cabecera antes de lo de la cadena de búsqueda por el tema de las búsquedas
|
||||||
$cabecera = $this->cabeceraTabla();
|
$cabecera = $this->cabeceraTabla();
|
||||||
//Trata con la cadena de búsqueda
|
//Trata con la cadena de búsqueda si viene del post debe quedarse con ella sino con la del get y si no está definida => vacía
|
||||||
$this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda;
|
|
||||||
if (isset($this->cadenaBusqueda) && strlen($this->cadenaBusqueda)) {
|
if (isset($this->cadenaBusqueda) && strlen($this->cadenaBusqueda)) {
|
||||||
$sufijo = " where $this->campoBusca like '%" . $this->bdd->filtra($this->cadenaBusqueda) . "%'";
|
$sufijo = " where $this->campoBusca like '%" . $this->bdd->filtra($this->cadenaBusqueda) . "%'";
|
||||||
$sufijoEnlace = "&buscar=" . $this->cadenaBusqueda;
|
|
||||||
$comando = str_replace('{buscar}', $sufijo, $this->comandoConsulta);
|
$comando = str_replace('{buscar}', $sufijo, $this->comandoConsulta);
|
||||||
} else {
|
} else {
|
||||||
$comando = str_replace('{buscar}', '', $this->comandoConsulta);
|
$comando = str_replace('{buscar}', '', $this->comandoConsulta);
|
||||||
@@ -114,33 +160,33 @@ class Mantenimiento {
|
|||||||
}
|
}
|
||||||
//Introduce un botón para hacer búsquedas y el número de la página
|
//Introduce un botón para hacer búsquedas y el número de la página
|
||||||
$salida = $this->enlaceBusqueda($pagSigte);
|
$salida = $this->enlaceBusqueda($pagSigte);
|
||||||
//Esta orden de centrado se cierra en el pie de la tabla
|
|
||||||
//$salida.='<center><h4>Página ' . $pagSigte . '</h4>';
|
|
||||||
// $salida .='<div class="nav-bar navbar-fixed"><ul class="nav nav-pills nav-stacked">
|
|
||||||
// <li class="active">
|
|
||||||
// <a href="#">
|
|
||||||
// <span class="badge pull-right">' . $pagSigte . '</span>
|
|
||||||
// Página
|
|
||||||
// </a>
|
|
||||||
// </li>
|
|
||||||
// </ul></div>';
|
|
||||||
$salida.= $cabecera;
|
$salida.= $cabecera;
|
||||||
//Consulta paginada de todas las tuplas
|
//Consulta paginada de todas las tuplas
|
||||||
$comando = str_replace('{inferior}', ($pagAnt + 1) * NUMFILAS, $comando);
|
$comando = str_replace('{inferior}', $pagina * NUMFILAS, $comando);
|
||||||
$comando = str_replace('{superior}', NUMFILAS, $comando);
|
$comando = str_replace('{superior}', NUMFILAS, $comando);
|
||||||
//$salida.=$comando;
|
|
||||||
$tabla = strtolower($this->tabla);
|
$tabla = strtolower($this->tabla);
|
||||||
$this->bdd->ejecuta($comando);
|
$this->bdd->ejecuta($comando);
|
||||||
|
$numRegistros = $this->bdd->numeroTotalTuplas();
|
||||||
|
//Si el número de la página fwd es mayor que el total de páginas lo establece a éste
|
||||||
|
if (NUMFILAS > 0) {
|
||||||
|
$totalPags = (int) ($numRegistros / NUMFILAS) - 1;
|
||||||
|
if ($numRegistros % NUMFILAS) {
|
||||||
|
$totalPags++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$totalPags = 0;
|
||||||
|
}
|
||||||
|
$pagFwd = $pagFwd > $totalPags ? $totalPags : $pagFwd;
|
||||||
if ($this->bdd->numeroTuplas() == 0) {
|
if ($this->bdd->numeroTuplas() == 0) {
|
||||||
if ($pagSigte > 1) {
|
if ($pagSigte > 1) {
|
||||||
// Si no hay datos en la consulta y no es la primera página,
|
// Si no hay datos en la consulta y no es la primera página,
|
||||||
// carga la página inicial
|
// carga la página final
|
||||||
header('Location: ' . $this->url);
|
$this->datosURL['pag'] = $totalPags;
|
||||||
|
header('Location: ' . $this->montaURL());
|
||||||
} else {
|
} else {
|
||||||
$salida = "<p align=\"center\"><center><h2>No hay registros</h2></center></p><br>";
|
$salida = "<p align=\"center\"><center><h2>No hay registros</h2></center></p><br>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//$salida.=print_r($this->perfil);
|
|
||||||
//$salida.=$comando;
|
//$salida.=$comando;
|
||||||
while ($fila = $this->bdd->procesaResultado()) {
|
while ($fila = $this->bdd->procesaResultado()) {
|
||||||
$salida.='<tr align="center" bottom="middle">';
|
$salida.='<tr align="center" bottom="middle">';
|
||||||
@@ -160,41 +206,64 @@ class Mantenimiento {
|
|||||||
$this->campoBusca = $dato[1];
|
$this->campoBusca = $dato[1];
|
||||||
$valor = '<a title="Inventario de ' . $valor . '" $target="_blank" href="index.php?informeInventario&opc=listar' . $datoEnlace . '&id=' . $id . '">' . $valor;
|
$valor = '<a title="Inventario de ' . $valor . '" $target="_blank" href="index.php?informeInventario&opc=listar' . $datoEnlace . '&id=' . $id . '">' . $valor;
|
||||||
}
|
}
|
||||||
|
if ($this->campos[$clave]['Type'] == "Boolean(1)") {
|
||||||
|
$checked = $valor == '1' ? 'checked' : '';
|
||||||
|
$valor = '<input type="checkbox" disabled ' . $checked . '>';
|
||||||
|
}
|
||||||
$salida.="<td>$valor</td>\n";
|
$salida.="<td>$valor</td>\n";
|
||||||
}
|
}
|
||||||
//Añade el icono de editar
|
//Añade el icono de editar
|
||||||
if ($this->perfil['Modificacion']) {
|
if ($this->perfil['Modificacion']) {
|
||||||
$salida.='<td><a href="index.php?' . $tabla . '&opc=editar&id=' . $id . "&pag=" . $pagina . $sufijoOrden .
|
//$salida.='<td><a href="index.php?' . $tabla . '&opc=editar&id=' . $id . "&pag=" . $pagina . $sufijoOrden . $sufijoEnlace .
|
||||||
|
$this->backupURL(); $this->datosURL['opc'] = "editar"; $this->datosURL['id'] = $id;
|
||||||
|
$salida.='<td><a href="' . $this->montaURL() .
|
||||||
'"><img title="Editar" src="img/' . ESTILO . '/editar.png" alt="editar"></a>';
|
'"><img title="Editar" src="img/' . ESTILO . '/editar.png" alt="editar"></a>';
|
||||||
|
$this->restoreURL();
|
||||||
}
|
}
|
||||||
//Añade el icono de eliminar
|
//Añade el icono de eliminar
|
||||||
if ($this->perfil['Borrado']) {
|
if ($this->perfil['Borrado']) {
|
||||||
$salida.=' <a href="index.php?' . $tabla . '&opc=eliminar&id=' . $id .
|
//$salida.=' <a href="index.php?' . $tabla . '&opc=eliminar&id=' . $id . $sufijoEnlace .
|
||||||
|
$this->backupURL(); $this->datosURL['opc'] = "eliminar"; $this->datosURL['id'] = $id;
|
||||||
|
$salida.=' <a href="' . $this->montaURL() .
|
||||||
'"><img title="Eliminar" src="img/' . ESTILO . '/eliminar.png" alt="eliminar"></a></td></tr>' . "\n";
|
'"><img title="Eliminar" src="img/' . ESTILO . '/eliminar.png" alt="eliminar"></a></td></tr>' . "\n";
|
||||||
|
$this->restoreURL();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$salida.="</tbody></table></center></p>";
|
$salida.="</tbody></table></center></p>";
|
||||||
//Añade botones de comandos
|
//Añade botones de comandos
|
||||||
$enlace = '<a href="' . $this->url . $sufijoOrden . '&id=';
|
|
||||||
if ($this->bdd->numeroTuplas()) {
|
if ($numRegistros) {
|
||||||
$anterior = $enlace . $pagAnt . $sufijoEnlace . "\"><img title=\"Pag. Anterior\" alt=\"anterior\" src=\"img/" . ESTILO . "/anterior.png\"></a>\n";
|
$this->backupURL();
|
||||||
$siguiente = $enlace . $pagSigte . $sufijoEnlace . "\"><img title=\"Pag. Siguiente\" alt=\"siguiente\" src=\"img/" . ESTILO . "/siguiente.png\"></a>\n";
|
$this->datosURL['pag'] = $pagAnt;
|
||||||
$fwd = $enlace . $pagFwd . $sufijoEnlace . "\"><img title=\"+5 Pags.\" alt=\"mas5p\" src=\"img/" . ESTILO . "/fwd.png\"></a>\n";
|
$anterior = $this->montaURL();
|
||||||
$rew = $enlace . $pagRew . $sufijoEnlace . "\"><img title=\"-5 Pags.\" alt=\"menos5p\" src=\"img/" . ESTILO . "/rew.png\"></a>\n";
|
$this->datosURL['pag'] = $pagSigte;
|
||||||
if (strlen($orden) > 0) {
|
$siguiente = $this->montaURL();
|
||||||
$az = '<a href="' . $this->url . '&orden=' . $orden . '&sentido=asc"><img alt="asc" title="Orden ascendente" src="img/' . ESTILO . '/ascendente.png"></a>';
|
$this->datosURL['pag'] = $pagFwd;
|
||||||
$za = '<a href="' . $this->url . '&orden=' . $orden . '&sentido=desc"><img alt="desc" title="Orden descendente" src="img/' . ESTILO . '/descendente.png"></a>';
|
$fwd = $this->montaURL();
|
||||||
} else {
|
$this->datosURL['pag'] = $pagRew;
|
||||||
$az = $za = '';
|
$rew = $this->montaURL();
|
||||||
}
|
$anterior = '<a href="' . $anterior . "\"><img title=\"Pag. Anterior\" alt=\"anterior\" src=\"img/" . ESTILO . "/anterior.png\"></a>\n";
|
||||||
|
$siguiente = '<a href="' . $siguiente . "\"><img title=\"Pag. Siguiente\" alt=\"siguiente\" src=\"img/" . ESTILO . "/siguiente.png\"></a>\n";
|
||||||
|
$fwd = '<a href="' . $fwd . "\"><img title=\"+4 Pags.\" alt=\"mas4pags\" src=\"img/" . ESTILO . "/fwd.png\"></a>\n";
|
||||||
|
$rew = '<a href="' . $rew . "\"><img title=\"-4 Pags.\" alt=\"menos4pags\" src=\"img/" . ESTILO . "/rew.png\"></a>\n";
|
||||||
|
$this->restoreURL();
|
||||||
|
$this->datosURL['sentido'] = "asc";
|
||||||
|
$az = $this->montaURL();
|
||||||
|
$az = '<a href="' . $az . '"><img alt="asc" title="Orden ascendente" src="img/' . ESTILO . '/ascendente.png"></a>';
|
||||||
|
$this->datosURL['sentido'] = "desc";
|
||||||
|
$za = $this->montaURL();
|
||||||
|
$za = '<a href="' . $za . '"><img alt="desc" title="Orden descendente" src="img/' . ESTILO . '/descendente.png"></a>';
|
||||||
|
$this->restoreURL();
|
||||||
if ($this->perfil['Informe']) {
|
if ($this->perfil['Informe']) {
|
||||||
$informe = '<a href="index.php?' . $tabla . '&opc=informe" target="_blank"><img src="img/' . ESTILO . '/informe.png" alt="informe" title="Informe pdf"></a>';
|
$informe = '<a href="index.php?' . $tabla . '&opc=informe" target="_blank"><img src="img/' . ESTILO . '/informe.png" alt="informe" title="Informe pdf"></a>';
|
||||||
} else {
|
} else {
|
||||||
$informe = "";
|
$informe = "";
|
||||||
}
|
}
|
||||||
|
$this->restoreURL();
|
||||||
}
|
}
|
||||||
if ($this->perfil['Alta']) {
|
if ($this->perfil['Alta']) {
|
||||||
$anadir = '<a href="index.php?' . $tabla . '&opc=nuevo">' .
|
$this->datosURL['opc'] = 'nuevo';
|
||||||
|
$anadir = '<a href="' . $this->montaURL() . '">' .
|
||||||
'<img title="Añadir registro" alt="nuevo" src="img/' . ESTILO . '/nuevo.png"></a>';
|
'<img title="Añadir registro" alt="nuevo" src="img/' . ESTILO . '/nuevo.png"></a>';
|
||||||
} else {
|
} else {
|
||||||
$anadir = "";
|
$anadir = "";
|
||||||
@@ -204,39 +273,35 @@ class Mantenimiento {
|
|||||||
return $salida;
|
return $salida;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function enlaceBusqueda($pagina) {
|
private function enlaceBusqueda($pagina)
|
||||||
//$salida = '<p align="center">';
|
{
|
||||||
//$salida .='<center><form name="busqueda" method="POST"><input type="text" class="form-control" name="buscar"';
|
$valor = isset($this->cadenaBusqueda) ? 'value="' . $this->cadenaBusqueda . '"' : '';
|
||||||
//$salida .='value="' . $this->cadenaBusqueda . '" size="40" /><input type="submit" class="btn btn-primary" value="Buscar" name=';
|
$salida = '<form name="busqueda" method="POST"><div class="col-xs-6 col-sm-4 col-md-6 col-lg-6"><div class="input-group">
|
||||||
//$salida .='"Buscar" />';
|
<input type="text" name="buscar" placeholder="Descripción" class="form-control" ' . $valor . '>
|
||||||
//$salida .= '</form></center>';
|
|
||||||
//$salida.='</p>';
|
|
||||||
$salida = '<form name="busqueda" method="POST"><div class="col-lg-6"><div class="input-group">
|
|
||||||
<input type="text" name="buscar" placeholder="Descripción" class="form-control">
|
|
||||||
<span class="input-group-btn"><button class="btn btn-primary" type="button">Buscar</button>
|
<span class="input-group-btn"><button class="btn btn-primary" type="button">Buscar</button>
|
||||||
</span></div></div></form>';
|
</span></div></div></form>';
|
||||||
//$salida .= '<div class="col-lg-1 pull-right"><ul class="nav nav-pills nav-stacked "><li class="active">
|
|
||||||
// <a href="#"><span class="badge pull-right">'.$pagina.'</span>Página</a></li></ul></div>';
|
|
||||||
$salida .= '<button class="btn btn-info pull-right" type="button">Página <span class="badge">'
|
$salida .= '<button class="btn btn-info pull-right" type="button">Página <span class="badge">'
|
||||||
. $pagina . '</span></button>';
|
. $pagina . '</span></button>';
|
||||||
// $salida .= '<div class="progress progress-striped">
|
|
||||||
// <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
|
|
||||||
// Página 5 de 6<span class="sr-only">20% Complete</span>
|
|
||||||
// </div>
|
|
||||||
//</div>';
|
|
||||||
return $salida;
|
return $salida;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function borrar($id) {
|
protected function borrar()
|
||||||
|
{
|
||||||
|
//@todo hay que tener en cuenta aquí la cadena de búsqueda y la página en la url
|
||||||
|
$id = $this->datosURL['id'];
|
||||||
$comando = "delete from " . $this->tabla . " where id=\"$id\"";
|
$comando = "delete from " . $this->tabla . " where id=\"$id\"";
|
||||||
if (!$this->bdd->ejecuta($comando)) {
|
if (!$this->bdd->ejecuta($comando)) {
|
||||||
return $this->errorBD($comando);
|
return $this->errorBD($comando);
|
||||||
}
|
}
|
||||||
header('Location: ' . $this->url);
|
$this->datosURL['opc'] = 'inicial';
|
||||||
|
$this->datosURL['id'] = null;
|
||||||
|
$url = $this->montaURL();
|
||||||
|
header('Location: ' . $url);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function insertar() {
|
protected function insertar()
|
||||||
|
{
|
||||||
$comando = "insert into " . $this->tabla . " (";
|
$comando = "insert into " . $this->tabla . " (";
|
||||||
$lista = explode("&", $_POST['listacampos']);
|
$lista = explode("&", $_POST['listacampos']);
|
||||||
$primero = true;
|
$primero = true;
|
||||||
@@ -265,23 +330,36 @@ class Mantenimiento {
|
|||||||
} else {
|
} else {
|
||||||
$coma = ",";
|
$coma = ",";
|
||||||
}
|
}
|
||||||
$valor = $_POST[$campo] == "" ? "null" : '"' . $_POST[$campo] . '"';
|
if ($this->campos[$campo]['Type'] == 'Boolean(1)') {
|
||||||
|
$valor = "";
|
||||||
|
if (empty($_POST[$campo])) {
|
||||||
|
$valor = "0";
|
||||||
|
}
|
||||||
|
$valor = $_POST[$campo] == "on" ? '1' : $valor;
|
||||||
|
} else {
|
||||||
|
$valor = $_POST[$campo] == "" ? "null" : '"' . $_POST[$campo] . '"';
|
||||||
|
}
|
||||||
$comando.="$coma " . $valor;
|
$comando.="$coma " . $valor;
|
||||||
}
|
}
|
||||||
$comando.=")";
|
$comando.=")";
|
||||||
if (!$this->bdd->ejecuta($comando)) {
|
if (!$this->bdd->ejecuta($comando)) {
|
||||||
return $this->errorBD($comando);
|
return $this->errorBD($comando);
|
||||||
}
|
}
|
||||||
list($enlace, $resto) = explode("&", $this->url);
|
$this->datosURL['opc'] = 'inicial';
|
||||||
$enlace.="&opc=inicial";
|
$this->datosURL['id'] = null;
|
||||||
return "<h1><a href=\"$enlace\">Se ha insertado el registro con la clave " . $this->bdd->ultimoId() . "</a></h1>";
|
$cabecera = "refresh:".PAUSA.";url=".$this->montaURL();
|
||||||
|
header($cabecera);
|
||||||
|
return $this->panelMensaje("Se ha insertado el registro con la clave " . $this->bdd->ultimoId(), "info", "Información");
|
||||||
|
//return "<h1><a href=\"".$this->montaURL()."\">Se ha insertado el registro con la clave " . $this->bdd->ultimoId() . "</a></h1>";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function modificar($id, $pag, $orden, $sentido) {
|
protected function modificar()
|
||||||
|
{
|
||||||
//Los datos a utilizar para actualizar la tupla vienen en $_POST.
|
//Los datos a utilizar para actualizar la tupla vienen en $_POST.
|
||||||
//La lista de atributos de la tupla viene en el campo oculto listacampos
|
//La lista de atributos de la tupla viene en el campo oculto listacampos
|
||||||
//print_r($_GET);
|
//print_r($_GET);
|
||||||
//echo "id=$id pag=$pag orden=$orden sentido=$sentido";die();
|
//echo "id=$id pag=$pag orden=$orden sentido=$sentido";die();
|
||||||
|
//@todo hay que tener en cuenta aquí la página en la que se encuentra y la cadena de búsqueda
|
||||||
$comando = "update " . $this->tabla . " set ";
|
$comando = "update " . $this->tabla . " set ";
|
||||||
$lista = explode("&", $_POST['listacampos']);
|
$lista = explode("&", $_POST['listacampos']);
|
||||||
$primero = true;
|
$primero = true;
|
||||||
@@ -291,27 +369,38 @@ class Mantenimiento {
|
|||||||
if ($primero) {
|
if ($primero) {
|
||||||
$primero = false;
|
$primero = false;
|
||||||
$coma = " ";
|
$coma = " ";
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
$coma = ",";
|
$coma = ",";
|
||||||
if (strlen(trim($_POST[$campo])) == 0)
|
}
|
||||||
$comando.="$coma $campo=null";
|
if ($this->campos[$campo]['Type'] == 'Boolean(1)') {
|
||||||
else
|
$valor = "";
|
||||||
$comando.=$coma . ' ' . $campo . '="' . $_POST[$campo] . '"';
|
if (empty($_POST[$campo])) {
|
||||||
|
$valor = "0";
|
||||||
|
}
|
||||||
|
$valor = $_POST[$campo] == "on" ? '1' : $valor;
|
||||||
|
$comando.=$coma . ' ' . $campo . '="' . $valor . '"';
|
||||||
|
} else {
|
||||||
|
if (strlen(trim($_POST[$campo])) == 0) {
|
||||||
|
$comando.="$coma $campo=null";
|
||||||
|
} else {
|
||||||
|
$comando.=$coma . ' ' . $campo . '="' . $_POST[$campo] . '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$comando.=" where id=\"$id\"";
|
$comando.=" where id=\"" . $this->datosURL['id'] . "\"";
|
||||||
if (!$this->bdd->ejecuta($comando)) {
|
if (!$this->bdd->ejecuta($comando)) {
|
||||||
return $this->errorBD($comando);
|
return $this->errorBD($comando);
|
||||||
}
|
}
|
||||||
|
$this->datosURL['id'] = null;
|
||||||
list($enlace, $resto) = explode("&", $this->url);
|
$this->datosURL['opc'] = inicial;
|
||||||
$enlace.="&opc=inicial&orden=" . $orden . "&sentido=" . $sentido . "&id=" . $pag;
|
header('Location: ' . $this->montaURL());
|
||||||
header('Location: ' . $enlace);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function muestra($id, $tipoAccion, $pag = "", $orden = "", $sentido = "") {
|
protected function muestra($tipoAccion)
|
||||||
if (isset($id)) {
|
{
|
||||||
|
$id = $this->datosURL['id'];
|
||||||
|
if ($tipoAccion != ANADIR) {
|
||||||
$comando = "select * from " . $this->tabla . " where id='$id'";
|
$comando = "select * from " . $this->tabla . " where id='$id'";
|
||||||
$resultado = $this->bdd->ejecuta($comando);
|
$resultado = $this->bdd->ejecuta($comando);
|
||||||
if (!$resultado) {
|
if (!$resultado) {
|
||||||
@@ -321,29 +410,14 @@ class Mantenimiento {
|
|||||||
} else {
|
} else {
|
||||||
$fila = null;
|
$fila = null;
|
||||||
}
|
}
|
||||||
//list($tipo,$valor)=explode($columna["Type"]);
|
|
||||||
$accion = "index.php?" . strtolower($this->tabla) . "&id=$id&opc=";
|
|
||||||
switch ($tipoAccion) {
|
|
||||||
case EDICION:
|
|
||||||
$accion.="modificar";
|
|
||||||
$accion.=isset($pag) ? "&pag=$pag" : '';
|
|
||||||
$accion.=isset($orden) ? "&orden=$orden" : '';
|
|
||||||
$accion.=isset($sentido) ? "&sentido=$sentido" : '';
|
|
||||||
break;
|
|
||||||
case BORRADO:
|
|
||||||
$accion.="borrar";
|
|
||||||
break;
|
|
||||||
case ANADIR:
|
|
||||||
$accion.="insertar";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//Genera un formulario con los datos de la tupla seleccionada.
|
//Genera un formulario con los datos de la tupla seleccionada.
|
||||||
return $this->formularioCampos($accion, $tipoAccion, $fila);
|
return $this->formularioCampos($tipoAccion, $fila);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Función que genera un campo de lista con los valores de descripción de la
|
//Función que genera un campo de lista con los valores de descripción de la
|
||||||
//tabla a la cual pertenece la clave foránea.
|
//tabla a la cual pertenece la clave foránea.
|
||||||
protected function generaLista($datos, $campo, $valorInicial, $modo) {
|
protected function generaLista($datos, $campo, $valorInicial, $modo)
|
||||||
|
{
|
||||||
$salida = "<select class=\"form-control\" name=\"$campo\">\n";
|
$salida = "<select class=\"form-control\" name=\"$campo\">\n";
|
||||||
list($tabla, $atributos) = explode(",", $datos);
|
list($tabla, $atributos) = explode(",", $datos);
|
||||||
$atributos = str_replace("/", ",", $atributos);
|
$atributos = str_replace("/", ",", $atributos);
|
||||||
@@ -376,7 +450,8 @@ class Mantenimiento {
|
|||||||
return $salida;
|
return $salida;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function obtenerCampos() {
|
private function obtenerCampos()
|
||||||
|
{
|
||||||
//Si hay un fichero de descripción xml lo utiliza.
|
//Si hay un fichero de descripción xml lo utiliza.
|
||||||
$nombre = "xml/mantenimiento" . $this->tabla . ".xml";
|
$nombre = "xml/mantenimiento" . $this->tabla . ".xml";
|
||||||
if (file_exists($nombre)) {
|
if (file_exists($nombre)) {
|
||||||
@@ -395,11 +470,12 @@ class Mantenimiento {
|
|||||||
$this->campos[$datos[$i]["Field"]]["Campo"] = $datos[$i]["Field"];
|
$this->campos[$datos[$i]["Field"]]["Campo"] = $datos[$i]["Field"];
|
||||||
$this->campos[$datos[$i]["Field"]]["Editable"] = "si";
|
$this->campos[$datos[$i]["Field"]]["Editable"] = "si";
|
||||||
}
|
}
|
||||||
$this->comandoConsulta = "select * from " . $this->tabla . " {buscar} {orden} limit {inferior},{superior}";
|
$this->comandoConsulta = "select SQL_CALC_FOUND_ROWS * from " . $this->tabla . " {buscar} {orden} limit {inferior},{superior}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function cabeceraTabla() {
|
private function cabeceraTabla()
|
||||||
|
{
|
||||||
//$salida = '<p align="center"><table border=1 class="tablaDatos"><tbody>';
|
//$salida = '<p align="center"><table border=1 class="tablaDatos"><tbody>';
|
||||||
$salida = '<p align="center"><table border=1 class="table table-striped table-bordered table-condensed table-hover"><tbody>';
|
$salida = '<p align="center"><table border=1 class="table table-striped table-bordered table-condensed table-hover"><tbody>';
|
||||||
foreach ($this->campos as $clave => $datos) {
|
foreach ($this->campos as $clave => $datos) {
|
||||||
@@ -419,7 +495,10 @@ class Mantenimiento {
|
|||||||
$clave = str_ireplace("ubicacion", "Ubicación", $clave);
|
$clave = str_ireplace("ubicacion", "Ubicación", $clave);
|
||||||
$clave = str_ireplace("articulo", "Artículo", $clave);
|
$clave = str_ireplace("articulo", "Artículo", $clave);
|
||||||
if ($ordenable) {
|
if ($ordenable) {
|
||||||
$salida.="<th><b><a title=\"Establece orden por $clave \" href=\"$this->url&orden=" . strtolower($clave2) . "\"> " . ucfirst($clave) . " </a></b></th>\n";
|
$this->backupURL();
|
||||||
|
$this->datosURL['orden'] = $clave2;
|
||||||
|
$salida.="<th><b><a title=\"Establece orden por $clave \" href=\"". $this->montaURL() . "\"> " . ucfirst($clave) . " </a></b></th>\n";
|
||||||
|
$this->restoreURL();
|
||||||
} else {
|
} else {
|
||||||
$salida.='<th><b>' . ucfirst($clave) . '</b></th>' . "\n";
|
$salida.='<th><b>' . ucfirst($clave) . '</b></th>' . "\n";
|
||||||
}
|
}
|
||||||
@@ -431,14 +510,26 @@ class Mantenimiento {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param string $accion URL de la acción del POST
|
* @param string $tipo ANADIR,EDICION,BORRADO
|
||||||
* @param string $tipo ANADIR,EDITAR,BORRADO
|
|
||||||
* @param array $datos Vector con los datos del registro
|
* @param array $datos Vector con los datos del registro
|
||||||
* @return array lista de campos y formulario de entrada
|
* @return array lista de campos y formulario de entrada
|
||||||
*/
|
*/
|
||||||
private function formularioCampos($accion, $tipo, $datos) {
|
private function formularioCampos($tipo, $datos)
|
||||||
|
{
|
||||||
$modo = $tipo == BORRADO ? "readonly" : "";
|
$modo = $tipo == BORRADO ? "readonly" : "";
|
||||||
$nfechas = 0;
|
$nfechas = 0;
|
||||||
|
switch ($tipo) {
|
||||||
|
case ANADIR:
|
||||||
|
$this->datosURL['opc'] = "insertar"; $this->datosURL['id'] = null;
|
||||||
|
break;
|
||||||
|
case EDICION:
|
||||||
|
$this->datosURL['opc'] = "modificar";
|
||||||
|
break;
|
||||||
|
case BORRADO:
|
||||||
|
$this->datosURL['opc'] = "borrar";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$accion = $this->montaURL();
|
||||||
$salida.='<div class="col-sm-8"><form name="mantenimiento.form" class="form-horizontal" role="form" method="post" action="' . $accion . '">' . "\n";
|
$salida.='<div class="col-sm-8"><form name="mantenimiento.form" class="form-horizontal" role="form" method="post" action="' . $accion . '">' . "\n";
|
||||||
$salida.="<fieldset style=\"width: 96%;\"><p><legend style=\"color: red;\"><b>$tipo</b></legend>\n";
|
$salida.="<fieldset style=\"width: 96%;\"><p><legend style=\"color: red;\"><b>$tipo</b></legend>\n";
|
||||||
foreach ($this->campos as $clave => $valor) {
|
foreach ($this->campos as $clave => $valor) {
|
||||||
@@ -446,8 +537,10 @@ class Mantenimiento {
|
|||||||
//Se salta los campos que no deben aparecer
|
//Se salta los campos que no deben aparecer
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
//Genera una lista con los campos que intervienen en el formulario.
|
||||||
$salida .='<div class="form-group">';
|
$salida .='<div class="form-group">';
|
||||||
$campo = $valor['Campo'];
|
$campo = $valor['Campo'];
|
||||||
|
$campos.="$campo&";
|
||||||
$salida.='<label class="col-sm-2 control-label" for="' . $campo . '">' . ucfirst($clave) . "</label> ";
|
$salida.='<label class="col-sm-2 control-label" for="' . $campo . '">' . ucfirst($clave) . "</label> ";
|
||||||
$salida.='<div class="col-sm-5">';
|
$salida.='<div class="col-sm-5">';
|
||||||
//Se asegura que el id no se pueda modificar.
|
//Se asegura que el id no se pueda modificar.
|
||||||
@@ -460,8 +553,8 @@ class Mantenimiento {
|
|||||||
$tipoCampo = $valor['Type'];
|
$tipoCampo = $valor['Type'];
|
||||||
//Si es un campo fecha u hora y está insertando pone la fecha actual o la hora actual
|
//Si es un campo fecha u hora y está insertando pone la fecha actual o la hora actual
|
||||||
if ($tipo == ANADIR) {
|
if ($tipo == ANADIR) {
|
||||||
if (stripos($tipoCampo, "echa") || stripos($tipoCampo, "ate")) {
|
if (stripos($tipoCampo, "echa") <> 0 || stripos($tipoCampo, "ate") <> 0) {
|
||||||
$valorDato = strftime("%d/%m/%Y");
|
$valorDato = strftime("%Y/%m/%d");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Calcula el tamaño y el tipo
|
// Calcula el tamaño y el tipo
|
||||||
@@ -470,16 +563,13 @@ class Mantenimiento {
|
|||||||
$tamano = "19";
|
$tamano = "19";
|
||||||
$tipo_campo = "datetime";
|
$tipo_campo = "datetime";
|
||||||
$nfechas++;
|
$nfechas++;
|
||||||
//
|
$salida .= '<div class="input-group date" id="datetimepicker' . $nfechas . '">
|
||||||
//Prueba
|
<input type="text" name="' . $campo . '" data-format="YYYY/MM/DD" value="' . $valorDato . '" ' . $modoEfectivo . ' class="form-control" />
|
||||||
//
|
|
||||||
$salida .= '<div class="input-group date" id="datetimepicker'.$nfechas.'">
|
|
||||||
<input type="text" $name ="'.$campo.'" data-format="YYYY/MM/DD" value="'.$valorDato.'" '. $modoEfectivo. ' class="form-control" />
|
|
||||||
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
|
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
|
||||||
</div>';
|
</div>';
|
||||||
$salida .= '<script type="text/javascript">
|
$salida .= '<script type="text/javascript">
|
||||||
$(function () {
|
$(function () {
|
||||||
$('."'#datetimepicker".$nfechas."').datetimepicker({
|
$(' . "'#datetimepicker" . $nfechas . "').datetimepicker({
|
||||||
pick12HourFormat: false,
|
pick12HourFormat: false,
|
||||||
language: 'es',
|
language: 'es',
|
||||||
pickTime: false
|
pickTime: false
|
||||||
@@ -495,6 +585,13 @@ class Mantenimiento {
|
|||||||
if ($tipoCampo == "Password") {
|
if ($tipoCampo == "Password") {
|
||||||
$tipo_campo = "password";
|
$tipo_campo = "password";
|
||||||
}
|
}
|
||||||
|
if ($tipoCampo == "Boolean(1)") {
|
||||||
|
$checked = $valorDato == '1' ? 'checked' : '';
|
||||||
|
$modocheck = $modoEfectivo == "readonly" ? 'onclick="javascript: return false;" readonly ' : '';
|
||||||
|
$salida .= '<input type="checkbox" name="' . $campo . '" ' . $checked . ' ' . $modocheck . ' class="form-control">';
|
||||||
|
$salida .= '</div></div>';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//Si no es una clave foránea añade un campo de texto normal
|
//Si no es una clave foránea añade un campo de texto normal
|
||||||
$salida.='<input class="form-control" type="' . $tipo_campo . '" name="' . $campo . '" value="' . $valorDato .
|
$salida.='<input class="form-control" type="' . $tipo_campo . '" name="' . $campo . '" value="' . $valorDato .
|
||||||
'" maxlength="' . $tamano . '" size="' . (string) (intval($tamano) + 5) . '" ' . $modoEfectivo . " ><br><br>\n";
|
'" maxlength="' . $tamano . '" size="' . (string) (intval($tamano) + 5) . '" ' . $modoEfectivo . " ><br><br>\n";
|
||||||
@@ -503,28 +600,38 @@ class Mantenimiento {
|
|||||||
$salida.=$this->generaLista($this->foraneas[$campo], $campo, $valorDato, $modoEfectivo);
|
$salida.=$this->generaLista($this->foraneas[$campo], $campo, $valorDato, $modoEfectivo);
|
||||||
$salida.="</div></div>";
|
$salida.="</div></div>";
|
||||||
}
|
}
|
||||||
//Genera una lista con los campos que intervienen en el formulario.
|
|
||||||
$campos.="$campo&";
|
|
||||||
}
|
}
|
||||||
//genera un campo oculto con la lista de campos a modificar.
|
//genera un campo oculto con la lista de campos a modificar.
|
||||||
$salida .= '<input name="listacampos" type="hidden" value="' . $campos . "\">\n";
|
$salida .= '<input name="listacampos" type="hidden" value="' . $campos . "\">\n";
|
||||||
$salida .= "</fieldset><p>";
|
$salida .= "</fieldset><p>";
|
||||||
$salida .= '<center>';
|
$salida .= '<center>';
|
||||||
$salida .= '<button type="button" onClick="location.href=' . "'$this->url'" . '" class="btn btn-info">Volver</button>';
|
$this->datosURL['opc'] = 'inicial';
|
||||||
|
$salida .= '<button type="button" onClick="location.href=' . "'" . $this->montaURL() . "'" . '" class="btn btn-info">Volver</button>';
|
||||||
$salida .= ' <button type="reset" class="btn btn-danger">Cancelar</button>';
|
$salida .= ' <button type="reset" class="btn btn-danger">Cancelar</button>';
|
||||||
$salida .= ' <button type=submit class="btn btn-primary">Aceptar</button>';
|
$salida .= ' <button type=submit class="btn btn-primary">Aceptar</button>';
|
||||||
$salida .= '<br></center></div>';
|
$salida .= '<br></center></div>';
|
||||||
return $salida;
|
return $salida;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function errorBD($comando, $mensaje = "") {
|
protected function errorBD($comando, $texto = "", $tipo = "danger", $cabecera = "¡Atención!")
|
||||||
if (!$mensaje) {
|
{
|
||||||
return "<h1>No pudo ejecutar correctamente el comando $comando error=" . $this->bdd->mensajeError() . " </h1>";
|
if (!$texto) {
|
||||||
|
$texto = "No pudo ejecutar correctamente el comando $comando error=" . $this->bdd->mensajeError();
|
||||||
} else {
|
} else {
|
||||||
return "<h1>$mensaje error=" . $this->bdd->mensajeError() . "</h1>";
|
$texto = "$texto error=" . $this->bdd->mensajeError();
|
||||||
}
|
}
|
||||||
|
return $this->panelMensaje($texto, "danger", $cabecera="¡Error!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function panelMensaje($info, $tipo = "danger", $cabecera = "¡Atención!") {
|
||||||
|
$mensaje = '<div class="panel panel-' . $tipo . '"><div class="panel-heading">';
|
||||||
|
$mensaje .= '<h3 class="panel-title">' . $cabecera . '</h3></div>';
|
||||||
|
$mensaje .= '<div class="panel-body">';
|
||||||
|
$mensaje .= $info;
|
||||||
|
$mensaje .= '</div>';
|
||||||
|
$mensaje .= '</div>';
|
||||||
|
return $mensaje;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
@@ -61,7 +61,7 @@ class Pdf_mysql_table extends Fpdf
|
|||||||
//Titulo
|
//Titulo
|
||||||
$fecha=strftime("%d-%b-%Y %H:%M");
|
$fecha=strftime("%d-%b-%Y %H:%M");
|
||||||
$this->SetFont('Arial','',8);
|
$this->SetFont('Arial','',8);
|
||||||
$this->Cell(0,4,html_entity_decode(APLICACION),0,1,'L');
|
$this->Cell(0,4,html_entity_decode(CENTRO . " " . PROGRAMA . VERSION,ENT_COMPAT | ENT_HTML401,'ISO-8859-1'),0,1,'L');
|
||||||
$this->SetFont('Arial','',18);
|
$this->SetFont('Arial','',18);
|
||||||
$this->Cell(0,6,utf8_decode($this->titulo),0,1,'C');
|
$this->Cell(0,6,utf8_decode($this->titulo),0,1,'C');
|
||||||
$this->SetFont('Arial','',8);
|
$this->SetFont('Arial','',8);
|
||||||
@@ -111,7 +111,7 @@ class Pdf_mysql_table extends Fpdf
|
|||||||
if ($this->procesandoTotales) {
|
if ($this->procesandoTotales) {
|
||||||
$this->SetFont('Arial','B',12);
|
$this->SetFont('Arial','B',12);
|
||||||
}
|
}
|
||||||
$this->Cell($col['w'],5,$data[$col['f']],1,0,$alin,$fill);
|
$this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$alin,$fill);
|
||||||
//$this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$alin,$fill);
|
//$this->Cell($col['w'],5,utf8_decode($data[$col['f']]),1,0,$alin,$fill);
|
||||||
//$this->Cell($col['w'],5,utf8_decode($data['proveedor']),1,0,$alin,$fill);
|
//$this->Cell($col['w'],5,utf8_decode($data['proveedor']),1,0,$alin,$fill);
|
||||||
//$this->Write(5,"nombre=".$col['f'].",titulo=".$col['c'].",ancho=".$col['w'].",alin=".$col['a']);
|
//$this->Write(5,"nombre=".$col['f'].",titulo=".$col['c'].",ancho=".$col['w'].",alin=".$col['a']);
|
||||||
|
71
README.md
71
README.md
@@ -1,8 +1,73 @@
|
|||||||
Inventario2
|
# Inventario de Centro Educativo
|
||||||
|
Copyright (c) 2008-2014, Ricardo Montañana Gómez
|
||||||
|
|
||||||
|
Inventario2 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
Aplicación de inventario para un centro educativo.
|
Aplicación de inventario para un centro educativo.
|
||||||
|
|
||||||
Utiliza:
|
Utiliza:
|
||||||
*PHP v. 5.x
|
*PHP v. 5.3.x
|
||||||
*MySQL v. 5.x
|
*MySQL v. 5.1.x
|
||||||
*Apache
|
*Apache
|
||||||
|
|
||||||
|
##Instalación
|
||||||
|
Para instalar la aplicación basta con seguir estos pasos:
|
||||||
|
###1. Copiar los archivos en una ubicación a la que tenga acceso el usuario con el que se ejecuta el servidor Apache (apache, _www, etc.).
|
||||||
|
|
||||||
|
mkdir Inventario
|
||||||
|
cd Inventario
|
||||||
|
unizp ../1.02.zip
|
||||||
|
o
|
||||||
|
tar xvzf ../1.02.tgz
|
||||||
|
|
||||||
|
###2. Crear un directorio temporal y dar derechos de escritura a los ficheros de configuración.
|
||||||
|
|
||||||
|
mkdir tmp
|
||||||
|
chown apache tmp
|
||||||
|
chown apache inc/configuracion.inc
|
||||||
|
chown apache inc
|
||||||
|
|
||||||
|
###3. Crear una base de datos en MySQL con el siguiente comando
|
||||||
|
|
||||||
|
create database Inventario character set utf8 collate utf8_spanish_ci;
|
||||||
|
|
||||||
|
###4. Dar todos los derechos de acceso a esa base de datos a un usuario:
|
||||||
|
|
||||||
|
grant all on Inventario.* to usuario identified by "contraseña";
|
||||||
|
|
||||||
|
###5. Crear la estructura de la base de datos para poder comenzar a trabajar:
|
||||||
|
|
||||||
|
mysql -u usuario --password=contraseña <sql/setup.sql
|
||||||
|
|
||||||
|
Con esto queda instalado el programa. Se crean en este proceso dos usuarios:
|
||||||
|
|
||||||
|
Usuario: admin Usuario: demo
|
||||||
|
Contraseña: pruebas Contraseña: pruebas
|
||||||
|
|
||||||
|
##Modelo de datos
|
||||||
|
El modelo de datos que se ha utilizado ha sido:
|
||||||
|

|
||||||
|
|
||||||
|
###Procedimiento de actualización de ISO-8859-1 a UTF-8 en MySQL
|
||||||
|
Para actualizar la base de datos tan sólo hay que modificar el tipo de la base de datos y de las tablas a utf8 mediante workbench o mediante el comando:
|
||||||
|
|
||||||
|
use Inventario2;
|
||||||
|
alter database Inventario2 character set utf8 collate utf8_spanish_ci;
|
||||||
|
alter table Articulos convert to character set utf8 collate utf8_spanish_ci;
|
||||||
|
alter table Ubicaciones convert to character set utf8 collate utf8_spanish_ci;
|
||||||
|
alter table Elementos convert to character set utf8 collate utf8_spanish_ci;
|
||||||
|
alter table Usuarios convert to character set utf8 collate utf8_spanish_ci;
|
||||||
|
|
||||||
|
Una vez hecho esto hay que asegurarse que el charset con el que trabaja el servidor MySQL es utf8 para eso se entra en mysql y mediante el comando status se averigua. Se puede cambiar en my.cnf o mediante workbench crear/modificar el fichero de configuración.
|
||||||
|
|
||||||
|
Contenido mínimo del fichero /etc/my.cnf
|
||||||
|
|
||||||
|
[mysqld]
|
||||||
|
character-set-server = utf8
|
||||||
|
collation-server = utf8_spanish_ci
|
||||||
|
|
||||||
|
[client]
|
||||||
|
default-character-set=utf8
|
22
Sql.php
22
Sql.php
@@ -80,9 +80,9 @@ class Sql {
|
|||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
//Libera la memoria de una posible consulta.
|
//Libera la memoria de una posible consulta.
|
||||||
if ($this->peticion) {
|
//if ($this->peticion) {
|
||||||
$this->peticion->free_result();
|
// $this->peticion->free_result();
|
||||||
}
|
//}
|
||||||
// Si estaba conectada la base de datos la cierra.
|
// Si estaba conectada la base de datos la cierra.
|
||||||
if ($this->estado) {
|
if ($this->estado) {
|
||||||
$this->bdd->close();
|
$this->bdd->close();
|
||||||
@@ -152,6 +152,22 @@ class Sql {
|
|||||||
public function numeroTuplas() {
|
public function numeroTuplas() {
|
||||||
return $this->numero;
|
return $this->numero;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Devuelve el número de tuplas total si se ha hecho una consulta select
|
||||||
|
* con SELECT SQL_CALC_FOUND_ROWS * ...
|
||||||
|
* @return integer Número de tuplas.
|
||||||
|
*/
|
||||||
|
public function numeroTotalTuplas()
|
||||||
|
{
|
||||||
|
$comando = "select found_rows();";
|
||||||
|
if (!$peticion=$this->bdd->query($comando)) {
|
||||||
|
$this->error=true;
|
||||||
|
$this->mensajeError='No pudo ejecutar la petición: '.$comando;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$numero = $peticion->fetch_row();
|
||||||
|
return $numero[0] ;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Devuelve la condición de error de la última petición
|
* Devuelve la condición de error de la última petición
|
||||||
* @return boolean condición de error.
|
* @return boolean condición de error.
|
||||||
|
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
* Base structure
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Move down content because we have a fixed navbar that is 50px tall */
|
|
||||||
body {
|
|
||||||
padding-top: 50px;
|
|
||||||
background-color: #F3FEC8;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Global add-ons
|
|
||||||
*/
|
|
||||||
|
|
||||||
.sub-header {
|
|
||||||
padding-bottom: 10px;
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sidebar
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Hide for mobile, show later */
|
|
||||||
.sidebar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.sidebar {
|
|
||||||
position: fixed;
|
|
||||||
top: 51px;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1000;
|
|
||||||
display: block;
|
|
||||||
padding: 5px;
|
|
||||||
overflow-x: hidden;
|
|
||||||
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
|
|
||||||
background-color: #C4FAEC;/*#f5f5f5;*/
|
|
||||||
border-right: 1px solid #eee;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sidebar navigation */
|
|
||||||
.nav-sidebar {
|
|
||||||
margin-right: -6px; /* 20px padding + 1px border */
|
|
||||||
margin-bottom: 1px;
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
.nav-sidebar > li > a {
|
|
||||||
padding-right: 5px;
|
|
||||||
padding-left: 5px;
|
|
||||||
}
|
|
||||||
.nav-sidebar > .active > a {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #428bca;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Main content
|
|
||||||
*/
|
|
||||||
|
|
||||||
.main {
|
|
||||||
padding: 10px;
|
|
||||||
background-color: #F3FEC8;
|
|
||||||
|
|
||||||
}
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.main {
|
|
||||||
padding-right: 20px;
|
|
||||||
padding-left: 20px;
|
|
||||||
background-color: #F3FEC8;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.main .page-header {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Placeholder dashboard ideas
|
|
||||||
*/
|
|
||||||
|
|
||||||
.placeholders {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.placeholders h4 {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
.placeholder {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.placeholder img {
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 25%;
|
|
||||||
}
|
|
114
css/dashboard.php
Normal file
114
css/dashboard.php
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
include('../inc/configuracion.inc');
|
||||||
|
header("Content-type: text/css");
|
||||||
|
?>
|
||||||
|
/*
|
||||||
|
* Base structure
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Move down content because we have a fixed navbar that is 50px tall */
|
||||||
|
body {
|
||||||
|
padding-top: 50px;
|
||||||
|
background-color: <?php echo COLORFON; ?>; /*Fondo*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global add-ons
|
||||||
|
*/
|
||||||
|
|
||||||
|
.sub-header {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sidebar
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Hide for mobile, show later */
|
||||||
|
.sidebar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.sidebar {
|
||||||
|
top: 50px;
|
||||||
|
bottom: 150px;
|
||||||
|
background-color: <?php echo COLORLAT; ?>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.sidebar {
|
||||||
|
position: fixed;
|
||||||
|
top: 51px;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1000;
|
||||||
|
display: block;
|
||||||
|
padding: 5px;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
|
||||||
|
background-color: <?php echo COLORLAT; ?>;/*Lateral*/
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar navigation */
|
||||||
|
.nav-sidebar {
|
||||||
|
margin-right: -6px; /* 20px padding + 1px border */
|
||||||
|
margin-bottom: 1px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
.nav-sidebar > li > a {
|
||||||
|
padding-right: 5px;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
.nav-sidebar > .active > a {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #428bca;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main content
|
||||||
|
*/
|
||||||
|
|
||||||
|
.main {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main{
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.main {
|
||||||
|
padding-right: 20px;
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main .page-header {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Placeholder dashboard ideas
|
||||||
|
*/
|
||||||
|
|
||||||
|
.placeholders {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.placeholders h4 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.placeholder {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
.placeholder img {
|
||||||
|
display: inline-block;
|
||||||
|
border-radius: 25%;
|
||||||
|
}
|
13
css/jquery.simplecolorpicker-glyphicons.css
Executable file
13
css/jquery.simplecolorpicker-glyphicons.css
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
.simplecolorpicker.glyphicons span.color[data-selected]:after {
|
||||||
|
/* Taken from glyphicon class. */
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
font-family: 'Glyphicons Halflings';
|
||||||
|
line-height: .9;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
|
||||||
|
content: '\e013'; /* Ok/check mark */
|
||||||
|
|
||||||
|
margin-right: 1px;
|
||||||
|
margin-left: 1px;
|
||||||
|
}
|
87
css/jquery.simplecolorpicker.css
Executable file
87
css/jquery.simplecolorpicker.css
Executable file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Very simple jQuery Color Picker
|
||||||
|
* https://github.com/tkrotoff/jquery-simplecolorpicker
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012-2013 Tanguy Krotoff <tkrotoff@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inspired by Bootstrap Twitter.
|
||||||
|
* See https://github.com/twbs/bootstrap/blob/master/less/navbar.less
|
||||||
|
* See https://github.com/twbs/bootstrap/blob/master/less/dropdowns.less
|
||||||
|
*/
|
||||||
|
|
||||||
|
.simplecolorpicker.picker {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1051; /* Above Bootstrap modal (@zindex-modal = 1050) */
|
||||||
|
display: none;
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
min-width: 160px;
|
||||||
|
max-width: 283px; /* @popover-max-width = 276px + 7 */
|
||||||
|
|
||||||
|
padding: 5px 0 0 5px;
|
||||||
|
margin: 2px 0 0;
|
||||||
|
list-style: none;
|
||||||
|
background-color: #fff; /* @dropdown-bg */
|
||||||
|
|
||||||
|
border: 1px solid #ccc; /* @dropdown-fallback-border */
|
||||||
|
border: 1px solid rgba(0, 0, 0, .15); /* @dropdown-border */
|
||||||
|
|
||||||
|
-webkit-border-radius: 4px; /* @border-radius-base */
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||||
|
-moz-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||||
|
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
||||||
|
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
-moz-background-clip: padding;
|
||||||
|
background-clip: padding-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplecolorpicker.inline {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplecolorpicker span {
|
||||||
|
margin: 0 5px 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplecolorpicker.icon,
|
||||||
|
.simplecolorpicker span.color {
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplecolorpicker.icon:after,
|
||||||
|
.simplecolorpicker span.color:after {
|
||||||
|
content: '\00a0\00a0\00a0\00a0'; /* Spaces */
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplecolorpicker span.color[data-disabled]:hover {
|
||||||
|
cursor: not-allowed;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplecolorpicker span.color:hover,
|
||||||
|
.simplecolorpicker span.color[data-selected],
|
||||||
|
.simplecolorpicker span.color[data-selected]:hover {
|
||||||
|
border: 1px solid #222; /* @gray-dark */
|
||||||
|
}
|
||||||
|
.simplecolorpicker span.color[data-selected]:after {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vertical separator, replaces optgroup. */
|
||||||
|
.simplecolorpicker span.vr {
|
||||||
|
border-left: 1px solid #222; /* @gray-dark */
|
||||||
|
}
|
235
css/jquery.simplecolorpicker.js
Executable file
235
css/jquery.simplecolorpicker.js
Executable file
@@ -0,0 +1,235 @@
|
|||||||
|
/*
|
||||||
|
* Very simple jQuery Color Picker
|
||||||
|
* https://github.com/tkrotoff/jquery-simplecolorpicker
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012-2013 Tanguy Krotoff <tkrotoff@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
var SimpleColorPicker = function(select, options) {
|
||||||
|
this.init('simplecolorpicker', select, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SimpleColorPicker class.
|
||||||
|
*/
|
||||||
|
SimpleColorPicker.prototype = {
|
||||||
|
constructor: SimpleColorPicker,
|
||||||
|
|
||||||
|
init: function(type, select, options) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.type = type;
|
||||||
|
|
||||||
|
self.$select = $(select);
|
||||||
|
self.$select.hide();
|
||||||
|
|
||||||
|
self.options = $.extend({}, $.fn.simplecolorpicker.defaults, options);
|
||||||
|
|
||||||
|
self.$colorList = null;
|
||||||
|
|
||||||
|
if (self.options.picker === true) {
|
||||||
|
var selectText = self.$select.find('> option:selected').text();
|
||||||
|
self.$icon = $('<span class="simplecolorpicker icon"'
|
||||||
|
+ ' title="' + selectText + '"'
|
||||||
|
+ ' style="background-color: ' + self.$select.val() + ';"'
|
||||||
|
+ ' role="button" tabindex="0">'
|
||||||
|
+ '</span>').insertAfter(self.$select);
|
||||||
|
self.$icon.on('click.' + self.type, $.proxy(self.showPicker, self));
|
||||||
|
|
||||||
|
self.$picker = $('<span class="simplecolorpicker picker ' + self.options.theme + '"></span>').appendTo(document.body);
|
||||||
|
self.$colorList = self.$picker;
|
||||||
|
|
||||||
|
// Hide picker when clicking outside
|
||||||
|
$(document).on('mousedown.' + self.type, $.proxy(self.hidePicker, self));
|
||||||
|
self.$picker.on('mousedown.' + self.type, $.proxy(self.mousedown, self));
|
||||||
|
} else {
|
||||||
|
self.$inline = $('<span class="simplecolorpicker inline ' + self.options.theme + '"></span>').insertAfter(self.$select);
|
||||||
|
self.$colorList = self.$inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the list of colors
|
||||||
|
// <span class="color selected" title="Green" style="background-color: #7bd148;" role="button"></span>
|
||||||
|
self.$select.find('> option').each(function() {
|
||||||
|
var $option = $(this);
|
||||||
|
var color = $option.val();
|
||||||
|
|
||||||
|
var isSelected = $option.is(':selected');
|
||||||
|
var isDisabled = $option.is(':disabled');
|
||||||
|
|
||||||
|
var selected = '';
|
||||||
|
if (isSelected === true) {
|
||||||
|
selected = ' data-selected';
|
||||||
|
}
|
||||||
|
|
||||||
|
var disabled = '';
|
||||||
|
if (isDisabled === true) {
|
||||||
|
disabled = ' data-disabled';
|
||||||
|
}
|
||||||
|
|
||||||
|
var title = '';
|
||||||
|
if (isDisabled === false) {
|
||||||
|
title = ' title="' + $option.text() + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
var role = '';
|
||||||
|
if (isDisabled === false) {
|
||||||
|
role = ' role="button" tabindex="0"';
|
||||||
|
}
|
||||||
|
|
||||||
|
var $colorSpan = $('<span class="color"'
|
||||||
|
+ title
|
||||||
|
+ ' style="background-color: ' + color + ';"'
|
||||||
|
+ ' data-color="' + color + '"'
|
||||||
|
+ selected
|
||||||
|
+ disabled
|
||||||
|
+ role + '>'
|
||||||
|
+ '</span>');
|
||||||
|
|
||||||
|
self.$colorList.append($colorSpan);
|
||||||
|
$colorSpan.on('click.' + self.type, $.proxy(self.colorSpanClicked, self));
|
||||||
|
|
||||||
|
var $next = $option.next();
|
||||||
|
if ($next.is('optgroup') === true) {
|
||||||
|
// Vertical break, like hr
|
||||||
|
self.$colorList.append('<span class="vr"></span>');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the selected color.
|
||||||
|
*
|
||||||
|
* @param color the hexadecimal color to select, ex: '#fbd75b'
|
||||||
|
*/
|
||||||
|
selectColor: function(color) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var $colorSpan = self.$colorList.find('> span.color').filter(function() {
|
||||||
|
return $(this).data('color').toLowerCase() === color.toLowerCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($colorSpan.length > 0) {
|
||||||
|
self.selectColorSpan($colorSpan);
|
||||||
|
} else {
|
||||||
|
console.error("The given color '" + color + "' could not be found");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
showPicker: function() {
|
||||||
|
var pos = this.$icon.offset();
|
||||||
|
this.$picker.css({
|
||||||
|
// Remove some pixels to align the picker icon with the icons inside the dropdown
|
||||||
|
left: pos.left - 6,
|
||||||
|
top: pos.top + this.$icon.outerHeight()
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$picker.show(this.options.pickerDelay);
|
||||||
|
},
|
||||||
|
|
||||||
|
hidePicker: function() {
|
||||||
|
this.$picker.hide(this.options.pickerDelay);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects the given span inside $colorList.
|
||||||
|
*
|
||||||
|
* The given span becomes the selected one.
|
||||||
|
* It also changes the HTML select value, this will emit the 'change' event.
|
||||||
|
*/
|
||||||
|
selectColorSpan: function($colorSpan) {
|
||||||
|
var color = $colorSpan.data('color');
|
||||||
|
var title = $colorSpan.prop('title');
|
||||||
|
|
||||||
|
// Mark this span as the selected one
|
||||||
|
$colorSpan.siblings().removeAttr('data-selected');
|
||||||
|
$colorSpan.attr('data-selected', '');
|
||||||
|
|
||||||
|
if (this.options.picker === true) {
|
||||||
|
this.$icon.css('background-color', color);
|
||||||
|
this.$icon.prop('title', title);
|
||||||
|
this.hidePicker();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change HTML select value
|
||||||
|
this.$select.val(color);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The user clicked on a color inside $colorList.
|
||||||
|
*/
|
||||||
|
colorSpanClicked: function(e) {
|
||||||
|
// When a color is clicked, make it the new selected one (unless disabled)
|
||||||
|
if ($(e.target).is('[data-disabled]') === false) {
|
||||||
|
this.selectColorSpan($(e.target));
|
||||||
|
this.$select.trigger('change');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevents the mousedown event from "eating" the click event.
|
||||||
|
*/
|
||||||
|
mousedown: function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
if (this.options.picker === true) {
|
||||||
|
this.$icon.off('.' + this.type);
|
||||||
|
this.$icon.remove();
|
||||||
|
$(document).off('.' + this.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$colorList.off('.' + this.type);
|
||||||
|
this.$colorList.remove();
|
||||||
|
|
||||||
|
this.$select.removeData(this.type);
|
||||||
|
this.$select.show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin definition.
|
||||||
|
* How to use: $('#id').simplecolorpicker()
|
||||||
|
*/
|
||||||
|
$.fn.simplecolorpicker = function(option) {
|
||||||
|
var args = $.makeArray(arguments);
|
||||||
|
args.shift();
|
||||||
|
|
||||||
|
// For HTML element passed to the plugin
|
||||||
|
return this.each(function() {
|
||||||
|
var $this = $(this),
|
||||||
|
data = $this.data('simplecolorpicker'),
|
||||||
|
options = typeof option === 'object' && option;
|
||||||
|
if (data === undefined) {
|
||||||
|
$this.data('simplecolorpicker', (data = new SimpleColorPicker(this, options)));
|
||||||
|
}
|
||||||
|
if (typeof option === 'string') {
|
||||||
|
data[option].apply(data, args);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default options.
|
||||||
|
*/
|
||||||
|
$.fn.simplecolorpicker.defaults = {
|
||||||
|
// No theme by default
|
||||||
|
theme: '',
|
||||||
|
|
||||||
|
// Show the picker or make it inline
|
||||||
|
picker: false,
|
||||||
|
|
||||||
|
// Animation delay in milliseconds
|
||||||
|
pickerDelay: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
21
fpdf.css
21
fpdf.css
@@ -1,21 +0,0 @@
|
|||||||
body {font-family:"Times New Roman",serif}
|
|
||||||
h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em}
|
|
||||||
h2 {font:bold 95% Arial,sans-serif; color:#900000; margin-top:1.5em; margin-bottom:1em}
|
|
||||||
dl.param dt {text-decoration:underline}
|
|
||||||
dl.param dd {margin-top:1em; margin-bottom:1em}
|
|
||||||
dl.param ul {margin-top:1em; margin-bottom:1em}
|
|
||||||
tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%}
|
|
||||||
div.source {margin-top:1.4em; margin-bottom:1.3em}
|
|
||||||
div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%}
|
|
||||||
div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000}
|
|
||||||
div.doc-source {margin-top:1.4em; margin-bottom:1.3em}
|
|
||||||
div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%}
|
|
||||||
div.doc-source code {display:block; background-color:#E0E0E0; padding:4px}
|
|
||||||
.kw {color:#000080; font-weight:bold}
|
|
||||||
.str {color:#CC0000}
|
|
||||||
.cmt {color:#008000}
|
|
||||||
p.demo {text-align:center; margin-top:-0.9em}
|
|
||||||
a.demo {text-decoration:none; font-weight:bold; color:#0000CC}
|
|
||||||
a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC}
|
|
||||||
a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF}
|
|
||||||
a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF}
|
|
@@ -1,36 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Fichero de configuración donde se introducirán los valores para
|
|
||||||
* la conexión con el servidor MySQL y otros para personalizar la aplicación.
|
|
||||||
* @package Inventario
|
|
||||||
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
|
||||||
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
|
||||||
* This file is part of Inventario.
|
|
||||||
* Inventario 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 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Inventario 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
define('AUTOR','Ricardo Montañana Gómez');
|
|
||||||
define('SERVIDOR','localhost'); //Ubicación del servidor MySQL
|
|
||||||
define('BASEDATOS','Inventario2'); //Nombre de la base de datos.
|
|
||||||
define('USUARIO','test'); //Usuario con permisos de lectura/escritura en la base de datos
|
|
||||||
define('CLAVE','tset'); //contraseña del usuario.
|
|
||||||
define('VERSION','0.97 Beta');
|
|
||||||
define('PROGRAMA','Gestión de Inventario.');
|
|
||||||
define('CENTRO','I.E.S.O. Pascual Serrano');
|
|
||||||
define('APLICACION',CENTRO.' '.PROGRAMA.VERSION);
|
|
||||||
define('NUMFILAS',17); // Número de registros a mostrar en las pantallas de consulta iniciales
|
|
||||||
define('PAUSA',2);//Nº segundos de pausa para mostrar mensaje id insertado
|
|
||||||
define('ESTILO','personal'); //Estilo de los iconos de edición (personal, personal, personal)
|
|
||||||
define('PLANTILLA','bootstrap'); //Estilo de la plantilla y recursos a utilizar
|
|
||||||
?>
|
|
@@ -1,36 +1,42 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* Fichero de configuración donde se introducirán los valores para
|
/**
|
||||||
* la conexión con el servidor MySQL y otros para personalizar la aplicación.
|
* Fichero de configuración donde se introducirán los valores para
|
||||||
* @package Inventario
|
* la conexión con el servidor MySQL y otros para personalizar la aplicación.
|
||||||
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
* @package Inventario
|
||||||
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
||||||
* This file is part of Inventario.
|
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
* Inventario is free software: you can redistribute it and/or modify
|
* This file is part of Inventario.
|
||||||
* it under the terms of the GNU General Public License as published by
|
* Inventario is free software: you can redistribute it and/or modify
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* it under the terms of the GNU General Public License as published by
|
||||||
* (at your option) any later version.
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
*
|
* (at your option) any later version.
|
||||||
* Inventario is distributed in the hope that it will be useful,
|
*
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* Inventario is distributed in the hope that it will be useful,
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* GNU General Public License for more details.
|
* 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
* You should have received a copy of the GNU General Public License
|
||||||
*
|
* along with Inventario. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*
|
||||||
define('AUTOR','Ricardo Montañana Gómez');
|
*/
|
||||||
define('SERVIDOR','localhost'); //Ubicación del servidor MySQL
|
require_once 'version.inc';
|
||||||
define('BASEDATOS','Inventario2'); //Nombre de la base de datos.
|
|
||||||
define('USUARIO','test'); //Usuario con permisos de lectura/escritura en la base de datos
|
define('SERVIDOR', 'localhost'); //Ubicación del servidor MySQL
|
||||||
define('CLAVE','tset'); //contraseña del usuario.
|
define('PUERTO', '3306'); //Puerto donde se conecta a MySQL
|
||||||
define('VERSION','1.00 Beta');
|
define('BASEDATOS', 'Inventario2'); //Nombre de la base de datos.
|
||||||
define('PROGRAMA','Gestión de Inventario.');
|
define('BASEDATOSTEST', 'Inventario_test'); //Base de datos para los tests.
|
||||||
define('CENTRO','I.E.S.O. Pascual Serrano');
|
define('USUARIO', 'test'); //Usuario con permisos de lectura/escritura en la base de datos
|
||||||
define('APLICACION',CENTRO.' '.PROGRAMA.VERSION);
|
define('CLAVE', 'tset'); //contraseña del usuario.
|
||||||
define('NUMFILAS',17); // Número de registros a mostrar en las pantallas de consulta iniciales
|
define('PROGRAMA', 'Gestión de Inventario.');
|
||||||
define('PAUSA',2);//Nº segundos de pausa para mostrar mensaje id insertado
|
define('CENTRO', 'I.E.S.O. Pascual Serrano');
|
||||||
define('ESTILO','personal'); //Estilo de los iconos de edición (personal, personal, personal)
|
define('NUMFILAS', '17'); // Número de registros a mostrar en las pantallas de consulta iniciales
|
||||||
define('PLANTILLA','bootstrap'); //Estilo de la plantilla y recursos a utilizar
|
define('PAUSA', '2'); //Nº segundos de pausa para mostrar mensaje id insertado
|
||||||
|
define('ESTILO', 'personal'); //Estilo de los iconos de edición (personal, personal, personal)
|
||||||
|
define('PLANTILLA', 'bootstrap'); //Estilo de la plantilla y recursos a utilizar
|
||||||
|
define('COLORLAT', '#46d6db'); //Color de la barra de menú lateral
|
||||||
|
define('COLORFON', '#a4bdfc'); //Color del fondo de la pantalla
|
||||||
|
define('MYSQLDUMP', '/usr/local/bin/mysqldump'); //camino a mysqldump
|
||||||
|
define('GZIP', '/usr/bin/gzip'); //Camino a gzip
|
||||||
?>
|
?>
|
||||||
|
@@ -11,3 +11,4 @@
|
|||||||
1|Varios|||
|
1|Varios|||
|
||||||
2|Configuración|index.php?configuracion|_self|Opciones configurables de la aplicación
|
2|Configuración|index.php?configuracion|_self|Opciones configurables de la aplicación
|
||||||
2|Importación|index.php?importacion&opc=form|_self|Importa datos de una hoja de cálculo
|
2|Importación|index.php?importacion&opc=form|_self|Importa datos de una hoja de cálculo
|
||||||
|
2|Copia Datos|index.php?copiaseg|_self|Realiza una copia de seguridad de los datos de la aplicación
|
27
inc/version.inc
Normal file
27
inc/version.inc
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fichero de configuración donde se introducirán los valores
|
||||||
|
* de autor y de la versión
|
||||||
|
* @package Inventario
|
||||||
|
* @copyright Copyright (c) 2008, Ricardo Montañana Gómez
|
||||||
|
* @license http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
|
* This file is part of Inventario.
|
||||||
|
* Inventario 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Inventario 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 Inventario. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('AUTOR', 'Ricardo Montañana Gómez');
|
||||||
|
define('VERSION', '1.04');
|
||||||
|
?>
|
@@ -1,3 +0,0 @@
|
|||||||
<?
|
|
||||||
phpinfo();
|
|
||||||
?>
|
|
3312
phpqrcode.php
Normal file
3312
phpqrcode.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,30 +1,30 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<!-- saved from url=(0043)http://getbootstrap.com/examples/dashboard/ -->
|
<html lang="es">
|
||||||
<html lang="en">
|
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta charset="iso-8859-1">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta name="description" content="">
|
<meta name="description" content="">
|
||||||
<meta name="author" content="Ricardo Monta<EFBFBD>ana">
|
<meta name="author" content="Ricardo Montañana">
|
||||||
<link rel="shortcut icon" href="img/tux.ico">
|
<link rel="shortcut icon" href="img/tux.ico">
|
||||||
<title>Inventario</title>
|
<title>Inventario</title>
|
||||||
<!-- Bootstrap core CSS -->
|
<!-- Bootstrap core CSS -->
|
||||||
<link href="css/bootstrap/css/bootstrap.min.css" rel="stylesheet">
|
<link href="css/bootstrap/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<!-- Custom styles for this template -->
|
<!-- Custom styles for this template -->
|
||||||
<link href="css/dashboard.css" rel="stylesheet">
|
<link href="css/dashboard.php" rel="stylesheet">
|
||||||
<link href="css/bootstrap-datetimepicker.min.css" rel="stylesheet">
|
<link href="css/bootstrap-datetimepicker.min.css" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="css/jquery.simplecolorpicker.css">
|
||||||
|
<link rel="stylesheet" href="css/jquery.simplecolorpicker-glyphicons.css">
|
||||||
<style type="text/css"></style>
|
<style type="text/css"></style>
|
||||||
<style id="clearly_highlighting_css" type="text/css">/* selection */ html.clearly_highlighting_enabled ::-moz-selection { background: rgba(246, 238, 150, 0.99); } html.clearly_highlighting_enabled ::selection { background: rgba(246, 238, 150, 0.99); } /* cursor */ html.clearly_highlighting_enabled { /* cursor and hot-spot position -- requires a default cursor, after the URL one */ cursor: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--cursor.png") 14 16, text; } /* highlight tag */ em.clearly_highlight_element { font-style: inherit !important; font-weight: inherit !important; background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--yellow.png"); background-repeat: repeat-x; background-position: top left; background-size: 100% 100%; } /* the delete-buttons are positioned relative to this */ em.clearly_highlight_element.clearly_highlight_first { position: relative; } /* delete buttons */ em.clearly_highlight_element a.clearly_highlight_delete_element { display: none; cursor: pointer; padding: 0; margin: 0; line-height: 0; position: absolute; width: 34px; height: 34px; left: -17px; top: -17px; background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--delete-sprite.png"); background-repeat: no-repeat; background-position: 0px 0px; } em.clearly_highlight_element a.clearly_highlight_delete_element:hover { background-position: -34px 0px; } /* retina */ @media (min--moz-device-pixel-ratio: 2), (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) { em.clearly_highlight_element { background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--yellow@2x.png"); } em.clearly_highlight_element a.clearly_highlight_delete_element { background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--delete-sprite@2x.png"); background-size: 68px 34px; } } </style><style id="holderjs-style" type="text/css"></style><style>[touch-action="none"]{ -ms-touch-action: none; touch-action: none; }[touch-action="pan-x"]{ -ms-touch-action: pan-x; touch-action: pan-x; }[touch-action="pan-y"]{ -ms-touch-action: pan-y; touch-action: pan-y; }[touch-action="scroll"],[touch-action="pan-x pan-y"],[touch-action="pan-y pan-x"]{ -ms-touch-action: pan-x pan-y; touch-action: pan-x pan-y; }
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript" src="./css/jquery.min.js"></script>
|
<script type="text/javascript" src="./css/jquery.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body bgcolor="#C4FAEC">
|
<body>
|
||||||
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".sidebar">
|
||||||
<span class="sr-only">Toggle navigation</span>
|
<span class="sr-only">Toggle navigation</span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="navbar-collapse collapse">
|
<div class="navbar-collapse collapse">
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
<li><a href="#">{usuario}</a></li>
|
<!--<li><a href="#">{usuario}</a></li>-->
|
||||||
<li><a href="#">{fecha}</a></li>
|
<li><a href="#">{fecha}</a></li>
|
||||||
<li>{control}</li>
|
<li>{control}</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -88,5 +88,6 @@
|
|||||||
<script type="text/javascript" src="./css/moment.min.js"></script>
|
<script type="text/javascript" src="./css/moment.min.js"></script>
|
||||||
<script type="text/javascript" src="./css/bootstrap-datetimepicker.min.js"></script>
|
<script type="text/javascript" src="./css/bootstrap-datetimepicker.min.js"></script>
|
||||||
<script type="text/javascript" src="./css/bootstrap-datetimepicker.es.js"></script>
|
<script type="text/javascript" src="./css/bootstrap-datetimepicker.es.js"></script>
|
||||||
|
<script type="text/javascript" src="./css/jquery.simplecolorpicker.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="es">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" >
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" >
|
||||||
<title>Gestión de Inventario</title>
|
<title>Gestión de Inventario</title>
|
||||||
<link rel="stylesheet" href="css/estilo.css" type="text/css">
|
<link rel="stylesheet" href="css/estilo.css" type="text/css">
|
||||||
<link rel="shortcut icon" href="img/tux.ico">
|
<link rel="shortcut icon" href="img/tux.ico">
|
||||||
|
@@ -84,7 +84,7 @@ SET @saved_cs_client = @@character_set_client;
|
|||||||
SET character_set_client = utf8;
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `Ubicaciones` (
|
CREATE TABLE `Ubicaciones` (
|
||||||
`id` smallint(5) unsigned NOT NULL auto_increment,
|
`id` smallint(5) unsigned NOT NULL auto_increment,
|
||||||
`Descripcion` varchar(30) NOT NULL COMMENT 'ordenable,link/Ubicacion',
|
`Descripcion` varchar(50) NOT NULL COMMENT 'ordenable,link/Ubicacion',
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=latin1;
|
||||||
SET character_set_client = @saved_cs_client;
|
SET character_set_client = @saved_cs_client;
|
168
sql/inv-utf.sql
Normal file
168
sql/inv-utf.sql
Normal file
File diff suppressed because one or more lines are too long
@@ -28,7 +28,7 @@ CREATE TABLE `Articulos` (
|
|||||||
`modelo` varchar(20) default NULL COMMENT 'ordenable',
|
`modelo` varchar(20) default NULL COMMENT 'ordenable',
|
||||||
`cantidad` int(11) default NULL COMMENT 'ordenable',
|
`cantidad` int(11) default NULL COMMENT 'ordenable',
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=785 DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB AUTO_INCREMENT=785 DEFAULT CHARSET=utf8;
|
||||||
SET character_set_client = @saved_cs_client;
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ CREATE TABLE `Elementos` (
|
|||||||
KEY `id_Ubicacion` (`id_Ubicacion`),
|
KEY `id_Ubicacion` (`id_Ubicacion`),
|
||||||
CONSTRAINT `Elementos_ibfk_1` FOREIGN KEY (`id_Articulo`) REFERENCES `Articulos` (`id`) ON DELETE CASCADE,
|
CONSTRAINT `Elementos_ibfk_1` FOREIGN KEY (`id_Articulo`) REFERENCES `Articulos` (`id`) ON DELETE CASCADE,
|
||||||
CONSTRAINT `Elementos_ibfk_2` FOREIGN KEY (`id_Ubicacion`) REFERENCES `Ubicaciones` (`id`) ON UPDATE CASCADE
|
CONSTRAINT `Elementos_ibfk_2` FOREIGN KEY (`id_Ubicacion`) REFERENCES `Ubicaciones` (`id`) ON UPDATE CASCADE
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=1884 DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB AUTO_INCREMENT=1884 DEFAULT CHARSET=utf8;
|
||||||
SET character_set_client = @saved_cs_client;
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
|
|
||||||
@@ -65,9 +65,9 @@ SET @saved_cs_client = @@character_set_client;
|
|||||||
SET character_set_client = utf8;
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `Ubicaciones` (
|
CREATE TABLE `Ubicaciones` (
|
||||||
`id` smallint(5) unsigned NOT NULL auto_increment,
|
`id` smallint(5) unsigned NOT NULL auto_increment,
|
||||||
`Descripcion` varchar(30) NOT NULL COMMENT 'ordenable,link/Ubicacion',
|
`Descripcion` varchar(50) NOT NULL COMMENT 'ordenable,link/Ubicacion',
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8;
|
||||||
SET character_set_client = @saved_cs_client;
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ CREATE TABLE `Usuarios` (
|
|||||||
`config` tinyint(1) NOT NULL default '0',
|
`config` tinyint(1) NOT NULL default '0',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `nombre` (`nombre`)
|
KEY `nombre` (`nombre`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
|
||||||
SET character_set_client = @saved_cs_client;
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
--
|
--
|
||||||
@@ -101,7 +101,7 @@ SET character_set_client = @saved_cs_client;
|
|||||||
|
|
||||||
LOCK TABLES `Usuarios` WRITE;
|
LOCK TABLES `Usuarios` WRITE;
|
||||||
/*!40000 ALTER TABLE `Usuarios` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `Usuarios` DISABLE KEYS */;
|
||||||
INSERT INTO `Usuarios` VALUES (1,'admin','galeote','s3LUSqxg{s',1,1,1,1,1,1,1),(2,'demo','demo','NogP_U0Byi',0,0,0,1,1,0,0);
|
INSERT INTO `Usuarios` VALUES (1,'admin','pruebas','s3LUSqxg{s',1,1,1,1,1,1,1),(2,'demo','pruebas','NogP_U0Byi',0,0,0,1,1,0,0);
|
||||||
/*!40000 ALTER TABLE `Usuarios` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `Usuarios` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
@@ -22,8 +22,8 @@
|
|||||||
$host="localhost";
|
$host="localhost";
|
||||||
$baseAnt="Inventario";
|
$baseAnt="Inventario";
|
||||||
$baseNueva="Inventario2";
|
$baseNueva="Inventario2";
|
||||||
$usuario="root";
|
$usuario="test";
|
||||||
$claveUsuario="galeote";
|
$claveUsuario="tset";
|
||||||
$probar=false;
|
$probar=false;
|
||||||
|
|
||||||
|
|
55
testbd.php
55
testbd.php
@@ -1,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Test de la clase Sql
|
|
||||||
*/
|
|
||||||
include 'Sql.php';
|
|
||||||
$bd=new Sql("localhost","test","tset","Inventario2");
|
|
||||||
if ($bd->error()) {
|
|
||||||
die("Error al conectar\n");
|
|
||||||
}
|
|
||||||
if (!$bd->ejecuta("select * from Articulos limit 0,10")) {
|
|
||||||
die("No pudo ejecutar consulta. ".$bd->mensajeError()."\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
echo "Hay ".$bd->numeroTuplas()." registros.<br>\n";
|
|
||||||
while ($datos=$bd->procesaResultado()) {
|
|
||||||
|
|
||||||
foreach($datos as $clave => $valor) {
|
|
||||||
echo "[$clave]=[$valor] ";
|
|
||||||
}
|
|
||||||
echo "<br>\n";
|
|
||||||
|
|
||||||
}
|
|
||||||
$datos=$bd->estructura("Elementos");
|
|
||||||
for ($i=0;$i<count($datos);$i++) {
|
|
||||||
$campos[$datos[$i]["Field"]]=$datos[$i];
|
|
||||||
}
|
|
||||||
//print_r($datos);
|
|
||||||
echo "Hay ".count($campos)." tuplas.";
|
|
||||||
foreach($campos as $clave => $valor) {
|
|
||||||
$trozos=explode(",",$valor["Comment"]);
|
|
||||||
//echo "Trozos=";print_r($trozos);//print_r($campos);
|
|
||||||
foreach($trozos as $trozo) {
|
|
||||||
if (strstr($trozo,"foreign")) {
|
|
||||||
$temp=substr($trozo,8,-1);
|
|
||||||
list($tabla,$atributo)=explode(";",$temp);
|
|
||||||
$salida[$clave]=$tabla.",".$atributo;
|
|
||||||
echo "[$clave],[$tabla],[$atributo]<br>\n";
|
|
||||||
$existen=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*for ($i=0;$i<count($datos);$i++) {
|
|
||||||
echo $datos[$i]["Field"]."<br>";
|
|
||||||
|
|
||||||
/*foreach($datos[$i] as $clave => $valor) {
|
|
||||||
echo "[$clave]=[$valor] ";
|
|
||||||
}
|
|
||||||
echo "<br>\n";
|
|
||||||
}*/
|
|
||||||
if ($bd->error()) {
|
|
||||||
echo $bd->mensajeError();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
|
118
timerbar.js
118
timerbar.js
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this template, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Timer Bar - Version 1.0
|
|
||||||
// Author: Brian Gosselin of http://scriptasylum.com
|
|
||||||
// Script featured on http://www.dynamicdrive.com
|
|
||||||
|
|
||||||
var loadedcolor='darkgray' ; // PROGRESS BAR COLOR
|
|
||||||
var unloadedcolor='lightgrey'; // COLOR OF UNLOADED AREA
|
|
||||||
var bordercolor='navy'; // COLOR OF THE BORDER
|
|
||||||
var barheight=15; // HEIGHT OF PROGRESS BAR IN PIXELS
|
|
||||||
var barwidth=300; // WIDTH OF THE BAR IN PIXELS
|
|
||||||
var waitTime=5; // NUMBER OF SECONDS FOR PROGRESSBAR
|
|
||||||
|
|
||||||
// THE FUNCTION BELOW CONTAINS THE ACTION(S) TAKEN ONCE BAR REACHES 100%.
|
|
||||||
// IF NO ACTION IS DESIRED, TAKE EVERYTHING OUT FROM BETWEEN THE CURLY BRACES ({})
|
|
||||||
// BUT LEAVE THE FUNCTION NAME AND CURLY BRACES IN PLACE.
|
|
||||||
// PRESENTLY, IT IS SET TO DO NOTHING, BUT CAN BE CHANGED EASILY.
|
|
||||||
// TO CAUSE A REDIRECT TO ANOTHER PAGE, INSERT THE FOLLOWING LINE:
|
|
||||||
// window.location="http://redirect_page.html";
|
|
||||||
// JUST CHANGE THE ACTUAL URL OF COURSE :)
|
|
||||||
// @todo prueba
|
|
||||||
/**
|
|
||||||
*@todo prueba
|
|
||||||
*TODO prueba
|
|
||||||
*@todo: prueba
|
|
||||||
*/
|
|
||||||
|
|
||||||
var action=function()
|
|
||||||
{
|
|
||||||
alert("Welcome to Dynamic Drive!");
|
|
||||||
//window.location="http://www.dynamicdrive.com
|
|
||||||
}
|
|
||||||
|
|
||||||
//*****************************************************//
|
|
||||||
//********** DO NOT EDIT BEYOND THIS POINT **********//
|
|
||||||
//*****************************************************//
|
|
||||||
|
|
||||||
var ns4=(document.layers)?true:false;
|
|
||||||
var ie4=(document.all)?true:false;
|
|
||||||
var blocksize=(barwidth-2)/waitTime/10;
|
|
||||||
var loaded=0;
|
|
||||||
var PBouter;
|
|
||||||
var PBdone;
|
|
||||||
var PBbckgnd;
|
|
||||||
var Pid=0;
|
|
||||||
var txt='';
|
|
||||||
if(ns4){
|
|
||||||
txt+='<table border=0 cellpadding=0 cellspacing=0><tr><td>';
|
|
||||||
txt+='<ilayer name="PBouter" visibility="hide" height="'+barheight+'" width="'+barwidth+'" onmouseup="hidebar()">';
|
|
||||||
txt+='<layer width="'+barwidth+'" height="'+barheight+'" bgcolor="'+bordercolor+'" top="0" left="0"></layer>';
|
|
||||||
txt+='<layer width="'+(barwidth-2)+'" height="'+(barheight-2)+'" bgcolor="'+unloadedcolor+'" top="1" left="1"></layer>';
|
|
||||||
txt+='<layer name="PBdone" width="'+(barwidth-2)+'" height="'+(barheight-2)+'" bgcolor="'+loadedcolor+'" top="1" left="1"></layer>';
|
|
||||||
txt+='</ilayer>';
|
|
||||||
txt+='</td></tr></table>';
|
|
||||||
}else{
|
|
||||||
txt+='<div id="PBouter" onmouseup="hidebar()" style="position:relative; visibility:hidden; background-color:'+bordercolor+'; width:'+barwidth+'px; height:'+barheight+'px;">';
|
|
||||||
txt+='<div style="position:absolute; top:1px; left:1px; width:'+(barwidth-2)+'px; height:'+(barheight-2)+'px; background-color:'+unloadedcolor+'; font-size:1px;"></div>';
|
|
||||||
txt+='<div id="PBdone" style="position:absolute; top:1px; left:1px; width:0px; height:'+(barheight-2)+'px; background-color:'+loadedcolor+'; font-size:1px;"></div>';
|
|
||||||
txt+='</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
document.write(txt);
|
|
||||||
|
|
||||||
function incrCount(){
|
|
||||||
window.status="Loading...";
|
|
||||||
loaded++;
|
|
||||||
if(loaded<0)loaded=0;
|
|
||||||
if(loaded>=waitTime*10){
|
|
||||||
clearInterval(Pid);
|
|
||||||
loaded=waitTime*10;
|
|
||||||
setTimeout('hidebar()',100);
|
|
||||||
}
|
|
||||||
resizeEl(PBdone, 0, blocksize*loaded, barheight-2, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function hidebar(){
|
|
||||||
clearInterval(Pid);
|
|
||||||
window.status='';
|
|
||||||
//if(ns4)PBouter.visibility="hide";
|
|
||||||
//else PBouter.style.visibility="hidden";
|
|
||||||
action();
|
|
||||||
}
|
|
||||||
|
|
||||||
//THIS FUNCTION BY MIKE HALL OF BRAINJAR.COM
|
|
||||||
function findlayer(name,doc){
|
|
||||||
var i,layer;
|
|
||||||
for(i=0;i<doc.layers.length;i++){
|
|
||||||
layer=doc.layers[i];
|
|
||||||
if(layer.name==name)return layer;
|
|
||||||
if(layer.document.layers.length>0)
|
|
||||||
if((layer=findlayer(name,layer.document))!=null)
|
|
||||||
return layer;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function progressBarInit(){
|
|
||||||
PBouter=(ns4)?findlayer('PBouter',document):(ie4)?document.all['PBouter']:document.getElementById('PBouter');
|
|
||||||
PBdone=(ns4)?PBouter.document.layers['PBdone']:(ie4)?document.all['PBdone']:document.getElementById('PBdone');
|
|
||||||
resizeEl(PBdone,0,0,barheight-2,0);
|
|
||||||
if(ns4)PBouter.visibility="show";
|
|
||||||
else PBouter.style.visibility="visible";
|
|
||||||
Pid=setInterval('incrCount()',95);
|
|
||||||
}
|
|
||||||
|
|
||||||
function resizeEl(id,t,r,b,l){
|
|
||||||
if(ns4){
|
|
||||||
id.clip.left=l;
|
|
||||||
id.clip.top=t;
|
|
||||||
id.clip.right=r;
|
|
||||||
id.clip.bottom=b;
|
|
||||||
}else id.style.width=r+'px';
|
|
||||||
}
|
|
||||||
|
|
||||||
window.onload=progressBarInit;
|
|
26
xml/inventarioArticuloEtiquetas.xml
Normal file
26
xml/inventarioArticuloEtiquetas.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<Informe>
|
||||||
|
<Titulo Texto="{Descripcion}" id="{id}"/>
|
||||||
|
<Datos>
|
||||||
|
<Consulta>
|
||||||
|
select A.id as id, A.Descripcion as articulo, A.Marca as marca, A.Modelo as modelo, E.id as idEl, U.id as idUbic,U.Descripcion as ubicacion,E.numserie as numserie,
|
||||||
|
E.fechaCompra as fechaCompra,E.Cantidad as cantidad, E.Cantidad as cantReal, 'N' as Baja
|
||||||
|
from Elementos E, Articulos A, Ubicaciones U where A.id=E.id_Articulo and U.id=E.id_Ubicacion
|
||||||
|
and A.id='{id}' order by U.Descripcion,numserie;
|
||||||
|
</Consulta>
|
||||||
|
</Datos>
|
||||||
|
<Pagina Orientacion="P" Formato="A4">
|
||||||
|
<Cabecera>Articulo</Cabecera>
|
||||||
|
<Cuerpo>
|
||||||
|
<Col Nombre="Baja" Titulo="Baja"/>
|
||||||
|
<Col Nombre="idEl" Titulo="idElem"/>
|
||||||
|
<Col Nombre="idUbic" Titulo="idUbic"/>
|
||||||
|
<Col Nombre="articulo" Titulo="Articulo"/>
|
||||||
|
<Col Nombre="ubicacion" Titulo="Ubicación"/>
|
||||||
|
<Col Nombre="numserie" Titulo="N Serie"/>
|
||||||
|
<Col Nombre="fechaCompra" Titulo="Fecha C." />
|
||||||
|
<Col Nombre="cantidad" Titulo="Cantidad"/>
|
||||||
|
<Col Nombre="cantReal" Titulo="Cant. Real"/>
|
||||||
|
</Cuerpo>
|
||||||
|
</Pagina>
|
||||||
|
</Informe>
|
29
xml/inventarioUbicacionEtiquetas.xml
Normal file
29
xml/inventarioUbicacionEtiquetas.xml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<Informe>
|
||||||
|
<Titulo Texto="{Descripcion}" id="{id}"/>
|
||||||
|
<Datos>
|
||||||
|
<Consulta>
|
||||||
|
select A.id as idArt,E.id as idEl,U.id as idUbic,U.Descripcion as ubicacion,A.Marca as marca,A.Modelo as modelo,E.numSerie as numserie,
|
||||||
|
E.fechaCompra as fechaCompra,A.Descripcion as articulo,E.Cantidad as cantidad, E.Cantidad as cantReal, 'N' as Baja
|
||||||
|
from Elementos E, Articulos A, Ubicaciones U where A.id=E.id_Articulo and U.id=E.id_Ubicacion
|
||||||
|
and U.id='{id}' order by A.descripcion;
|
||||||
|
</Consulta>
|
||||||
|
</Datos>
|
||||||
|
<Pagina Horizontal="2" Vertical="7">
|
||||||
|
<Cabecera>Ubicacion</Cabecera>
|
||||||
|
<Cuerpo>
|
||||||
|
<Col Nombre="Qr" Valor="{url}"/>
|
||||||
|
<Col Nombre="idEl" Titulo="idElem"/>
|
||||||
|
<Col Nombre="idArt" Titulo="idArt"/>
|
||||||
|
<Col Nombre="idUbic" Titulo="idUbic"/>
|
||||||
|
<Col Nombre="ubicacion" Titulo="Ubicacion"/>
|
||||||
|
<Col Nombre="articulo" Titulo="Artículo"/>
|
||||||
|
<Col Nombre="marca" Titulo="Marca"/>
|
||||||
|
<Col Nombre="modelo" Titulo="Modelo"/>
|
||||||
|
<Col Nombre="numserie" Titulo="N Serie"/>
|
||||||
|
<Col Nombre="fechaCompra" Titulo="Fecha C." />
|
||||||
|
<Col Nombre="cantidad" Titulo="Cantidad"/>
|
||||||
|
<Col Nombre="cantReal" Titulo="Cant. Real"/>
|
||||||
|
</Cuerpo>
|
||||||
|
</Pagina>
|
||||||
|
</Informe>
|
@@ -2,7 +2,7 @@
|
|||||||
<Mantenimiento>
|
<Mantenimiento>
|
||||||
<Titulo>Mantenimiento de Elementos</Titulo>
|
<Titulo>Mantenimiento de Elementos</Titulo>
|
||||||
<Consulta>
|
<Consulta>
|
||||||
SELECT E.id as id,U.Descripcion as ubicacion,A.Descripcion as articulo,A.Marca as marca,A.Modelo as modelo,E.numserie as numserie,
|
SELECT SQL_CALC_FOUND_ROWS E.id as id,U.Descripcion as ubicacion,A.Descripcion as articulo,A.Marca as marca,A.Modelo as modelo,E.numserie as numserie,
|
||||||
DATE_FORMAT(E.fechacompra, '%d/%m/%Y') as fechaCompra,E.cantidad as cantidad
|
DATE_FORMAT(E.fechacompra, '%d/%m/%Y') as fechaCompra,E.cantidad as cantidad
|
||||||
FROM Elementos E inner join Articulos A on E.id_articulo=A.id inner join
|
FROM Elementos E inner join Articulos A on E.id_articulo=A.id inner join
|
||||||
Ubicaciones U on E.id_ubicacion=U.id {buscar} {orden} limit {inferior},{superior};
|
Ubicaciones U on E.id_ubicacion=U.id {buscar} {orden} limit {inferior},{superior};
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
<Mantenimiento>
|
<Mantenimiento>
|
||||||
<Titulo>Mantenimiento de Usuarios</Titulo>
|
<Titulo>Mantenimiento de Usuarios</Titulo>
|
||||||
<Consulta>
|
<Consulta>
|
||||||
SELECT id, nombre, clave, idSesion, alta, modificacion, borrado, consulta, informe, usuarios, config
|
SELECT SQL_CALC_FOUND_ROWS id, nombre, clave, idSesion, alta, modificacion, borrado, consulta, informe, usuarios, config
|
||||||
FROM Usuarios {buscar} {orden} limit {inferior}, {superior};
|
FROM Usuarios {buscar} {orden} limit {inferior}, {superior};
|
||||||
</Consulta>
|
</Consulta>
|
||||||
<Campos>
|
<Campos>
|
||||||
@@ -10,12 +10,12 @@
|
|||||||
<Col Campo="nombre" Nombre="nombre" Ancho="8" Ajuste="L" Titulo="Nombre" Varios="ordenable" Editable="si"/>
|
<Col Campo="nombre" Nombre="nombre" Ancho="8" Ajuste="L" Titulo="Nombre" Varios="ordenable" Editable="si"/>
|
||||||
<Col Campo="clave" Nombre="clave" Ancho="16" Ajuste="L" Titulo="Clave" Tipo="Password" Editable="si"/>
|
<Col Campo="clave" Nombre="clave" Ancho="16" Ajuste="L" Titulo="Clave" Tipo="Password" Editable="si"/>
|
||||||
<Col Campo="idSesion" Nombre="idSesion" Ancho="32" Ajuste="L" Titulo="id Sesión" Editable="si"/>
|
<Col Campo="idSesion" Nombre="idSesion" Ancho="32" Ajuste="L" Titulo="id Sesión" Editable="si"/>
|
||||||
<Col Campo="alta" Nombre="Alta" Ancho="1" Ajuste="R" Titulo="Altas" Editable="si"/>
|
<Col Campo="alta" Nombre="alta" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Altas" Editable="si"/>
|
||||||
<Col Campo="modificacion" Nombre="modificacion" Ancho="1" Ajuste="R" Titulo="Modificaciones" Editable="si"/>
|
<Col Campo="modificacion" Nombre="modificacion" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Modificaciones" Editable="si"/>
|
||||||
<Col Campo="borrado" Nombre="borrado" Ancho="1" Ajuste="R" Titulo="Borrados" Editable="si"/>
|
<Col Campo="borrado" Nombre="borrado" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Borrados" Editable="si"/>
|
||||||
<Col Campo="consulta" Nombre="consulta" Ancho="1" Ajuste="R" Titulo="Consultas" Editable="si"/>
|
<Col Campo="consulta" Nombre="consulta" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Consultas" Editable="si"/>
|
||||||
<Col Campo="informe" Nombre="informe" Ancho="1" Ajuste="R" Titulo="Informes" Editable="si"/>
|
<Col Campo="informe" Nombre="informe" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Informes" Editable="si"/>
|
||||||
<Col Campo="usuarios" Nombre="usuarios" Ancho="1" Ajuste="R" Titulo="Usuarios" Editable="si"/>
|
<Col Campo="usuarios" Nombre="usuarios" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Usuarios" Editable="si"/>
|
||||||
<Col Campo="config" Nombre="config" Ancho="1" Ajuste="R" Titulo="Configuración" Editable="si"/>
|
<Col Campo="config" Nombre="config" Ancho="1" Ajuste="R" Tipo="Boolean" Titulo="Configuración" Editable="si"/>
|
||||||
</Campos>
|
</Campos>
|
||||||
</Mantenimiento>
|
</Mantenimiento>
|
||||||
|
Reference in New Issue
Block a user