diff --git a/AportaContenido.php b/AportaContenido.php index 27cbb57..6e7a4da 100644 --- a/AportaContenido.php +++ b/AportaContenido.php @@ -28,6 +28,25 @@ define('FORMULARIO_ACCESO', '
Iniciar
'); define('MENSAJE_DEMO', 'Puede Iniciar sesión con
usuario demo
contraseña demo
'); define('USUARIO_INCORRECTO', '

'); +define('CREDITOS', ''); // Esta clase aportará el contenido a la plantilla class AportaContenido { @@ -130,7 +149,19 @@ class AportaContenido { return "Usuario=$this->usuario"; else return ''; - case 'fecha': return $this->fechaActual(); + case 'fecha': + $script = '"; + $campo = ''; + $etiqueta = ''; + return $etiqueta . $campo . $script; case 'aplicacion': return PROGRAMA." v".VERSION; case 'menu': // el menú if ($this->registrado) { @@ -180,9 +211,14 @@ class AportaContenido { // } list($opcion, $parametro) = explode("&", $this->opcionActual); switch ($opcion) { + case 'bienvenido': + $mensaje = '
'; + $mensaje .= 'Bienvenid@ ' . $this->usuario . '
'; case 'principal': // contenido inicial - return '

' . PROGRAMA . '' . - '


' . PIE; + + $creditos = "$('#creditos').modal({keyboard: false});"; + return $mensaje . '

' . PROGRAMA . '' . + '



' . CREDITOS; case 'articulos': case 'ubicaciones': case 'test': @@ -246,12 +282,6 @@ class AportaContenido { } else { return $this->mensajePermisos('Usuarios'); } - - case 'bienvenido': // El usuario quiere iniciar sesión - $mensaje = '
'; - $mensaje .= 'Bienvenid@ ' . $this->usuario . '


' . PROGRAMA . '' . - '


' . PIE;; - return $mensaje; case 'configuracion': if ($this->perfil['Config']) { $conf = new Configuracion(); @@ -266,17 +296,17 @@ class AportaContenido { } else { return $this->mensajePermisos('Informes'); } - case 'descuadres': - if ($this->perfil['Informe']) { - $enlace = 'xml/informe' . ucfirst($opcion) . '.xml'; - $informe = new InformePDF($this->bdd, $enlace, $this->registrado); - $informe->crea($enlace); - $informe->cierraPDF(); - $informe->imprimeInforme(); - return; - } else { - return $this->mensajePermisos('Informes'); - } +// case 'descuadres': +// if ($this->perfil['Informe']) { +// $enlace = 'xml/informe' . ucfirst($opcion) . '.xml'; +// $informe = new InformePDF($this->bdd, $enlace, $this->registrado); +// $informe->crea($enlace); +// $informe->cierraPDF(); +// $informe->imprimeInforme(); +// return; +// } else { +// return $this->mensajePermisos('Informes'); +// } case 'importacion': if ($this->perfil['Modificacion'] && $this->perfil['Borrado']) { $import = new Importacion($this->bdd, $this->registrado); diff --git a/CHANGELOG b/CHANGELOG index 056cca8..6f49fa8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,15 @@ -Versión 1.07 +Versión 1.08 07-04-2014 +-Los informes aparecen ahora en la pantalla de la aplicación embebidos. +-Añadido un calendario al pulsar sobre la fecha en la cabecera de la aplicación. +-Corregido pequeño problema de margen en resoluciones pequeñas donde se solapaba parte del menú. +-Quitados los logos de GPLv3, MySQL y Apache +-Inventario.php llama al instalador si la aplicación no está instalada +-Añadido dialogo modal de Créditos cuando se pulsa sobre el gráfico de código de barras de la aplicación o sobre el nombre del centro +-Quitados los usuarios de ejemplo en el archivo setup.sql +-Creado el programa instalar.php que permitirá configurar el acceso a la base de datos, comprobar la configuración del servidor y la creación del usuario administrador +-Añadido un parámetro en el archivo configuracion.inc que permite o no ejecutar el programa instalar.php + +Versión 1.07 31-03-2014 -Añadido bootstrap-select a la solicitud de informes de inventario de esta forma se pueden buscar artículos o ubicaciones en el select -Añadido bootstrap-select al mantenimiento para que en el alta de elementos se puedan buscar artículos o ubicaciones en el el select -Corregido un problema que permitía cambiar fechas en el formulario de bajas diff --git a/InformeInventario.php b/InformeInventario.php index 03c493c..47953a4 100644 --- a/InformeInventario.php +++ b/InformeInventario.php @@ -23,11 +23,13 @@ class InformeInventario { private $bdd; - public function __construct($baseDatos) { + public function __construct($baseDatos) + { $this->bdd = $baseDatos; } - public function ejecuta() { + public function ejecuta() + { $opc = $_GET['opc']; switch ($opc) { case 'Ubicacion':return $this->formularioUbicacion(); @@ -35,10 +37,33 @@ class InformeInventario { case 'listarArticulo':return $this->listarArticulo(); case 'Articulo':return $this->formularioArticulo(); case 'Total':return $this->inventarioTotal(); + case 'descuadres': return $this->inventarioDescuadres(); } } - private function listarUbicacion() { + private function inventarioDescuadres() + { + $enlace = 'xml/informeDescuadres.xml'; + $informe = new InformePDF($this->bdd, $enlace, true); + $informe->crea($enlace); + $informe->cierraPDF(); + return $this->devuelveInforme($informe); + } + + private function devuelveInforme($informe) + { + $letras = "abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + $nombre = "tmp/informe" . substr(str_shuffle($letras), 0, 10) . ".pdf"; + $informe->guardaArchivo($nombre); + return '
+ + + +
'; + } + + private function listarUbicacion() + { $salidaInforme = isset($_POST['salida']) ? $_POST['salida'] : 'pantalla'; switch ($salidaInforme) { case "pantalla": @@ -70,9 +95,7 @@ class InformeInventario { $informe = new InformePDF($this->bdd, $salida, true); $informe->crea($salida); $informe->cierraPDF(); - $informe->guardaArchivo("tmp/Informe.pdf"); - echo ''; - break; + return $this->devuelveInforme($informe); case "csv": //Genera una hoja de cálculo en formato csv $nombre = "tmp/Ubicacion" . strftime("%Y%m%d") . rand(100, 999) . ".csv"; @@ -85,13 +108,12 @@ class InformeInventario { $etiquetas = new EtiquetasPDF($this->bdd, $salida, true); $etiquetas->crea($salida); $etiquetas->cierraPDF(); - $etiquetas->guardaArchivo("tmp/EtiquetasUbicacion.pdf"); - echo ''; - break; + return $this->devuelveInforme($etiquetas); } } - private function listarArticulo() { + private function listarArticulo() + { $salidaInforme = isset($_POST['salida']) ? $_POST['salida'] : 'pantalla'; switch ($salidaInforme) { case "pantalla": @@ -125,9 +147,7 @@ class InformeInventario { $informe = new InformePDF($this->bdd, $salida, true); $informe->crea($salida); $informe->cierraPDF(); - $informe->guardaArchivo("tmp/Informe.pdf"); - echo ''; - break; + return $this->devuelveInforme($informe); case "csv": //Genera una hoja de cálculo en formato csv $nombre = "tmp/Articulo" . strftime("%Y%m%d") . rand(100, 999) . ".csv"; @@ -140,13 +160,12 @@ class InformeInventario { $etiquetas = new EtiquetasPDF($this->bdd, $salida, true); $etiquetas->crea($salida); $etiquetas->cierraPDF(); - $etiquetas->guardaArchivo("tmp/EtiquetasArticulo.pdf"); - echo ''; - break; + return $this->devuelveInforme($etiquetas); } } - private function listaUbicaciones() { + private function listaUbicaciones() + { $salida = "\n"; $comando = "select * from Articulos order by descripcion, marca, modelo"; $resultado = $this->bdd->ejecuta($comando); @@ -174,8 +194,9 @@ class InformeInventario { return $salida; } - private function formulario($accion, $etiqueta, $lista) { - $salida ='
' . "\n"; + private function formulario($accion, $etiqueta, $lista) + { + $salida = '
' . "\n"; $salida.="

Elige $etiqueta\n"; $salida.="

"; $salida.=$lista; @@ -190,18 +211,21 @@ class InformeInventario { return $salida; } - private function formularioUbicacion() { + 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() { + private function formularioArticulo() + { $accion = "index.php?informeInventario&opc=listarArticulo"; return $this->formulario($accion, 'Artículo', $this->listaArticulos()); } - private function inventarioTotal() { + private function inventarioTotal() + { $fichero = "xml/inventarioUbicacion.xml"; $salida = "tmp/inventarioUbicacion.xml"; $comando = "select * from Ubicaciones ;"; @@ -213,7 +237,6 @@ class InformeInventario { $bdatos = new Sql(SERVIDOR, USUARIO, CLAVE, BASEDATOS); $primero = true; while ($fila = $this->bdd->procesaResultado()) { - //$fila=$this->bdd->procesaResultado(); $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("{Descripcion}", $fila['Descripcion'], $plantilla); @@ -224,10 +247,10 @@ class InformeInventario { } $informe->crea($salida); } - $nombre = "tmp/total.pdf"; $informe->cierraPDF(); - $informe->imprimeInforme(); + return $this->devuelveInforme($informe); } + } ?> diff --git a/Instalar.php b/Instalar.php new file mode 100644 index 0000000..757848b --- /dev/null +++ b/Instalar.php @@ -0,0 +1,559 @@ +. + * + */ +//Se incluyen los módulos necesarios +function __autoload($class_name) { + require_once $class_name . '.php'; +} + +require_once 'inc/configuracion.inc'; +define('NUMPASOS', 3); +//Para el Paso 1 +define('MINBYTES', 4096000); // post_max_size y max_upload van con esto +define('CADENAMINBYTES', '4M'); +define('CONFIGURACION', 'inc/configuracion.inc'); +define('CONFIGTMP', 'tmp/config.tmp'); +define('TMP', './tmp'); +define('INC', './inc'); + +$instalar = new Instalar(); +if ($instalar->error) { + echo $instalar->panelError(); + return; +} +echo $instalar->ejecuta(); + +class Instalar { + private $contenido; + private $plant; + public $error; + public $error_msj; + + public function __construct() + { + //Selecciona la plantilla a utilizar + $this->plant='plant/'; + $this->plant.=PLANTILLA; + $this->plant.='.html'; + $this->error = false; + $this->eror_msj = ''; + if (INSTALADO != 'no') { + $this->error = true; + $this->error_msj = 'El programa ya está instalado'; + } + /*if ($this->existenDatos()) { + $this->error = true; + $this->error_msj = "El indicador de instalación tiene 'no' pero la base de datos " . BASEDATOS . " contiene la tabla Articulos."; + }*/ + } + + private function existenDatos() + { + //Comprueba si existe la tabla Articulos + $sql = new Sql(SERVIDOR, USUARIO, CLAVE, BASEDATOS); + if ($sql->error()) + return false; + $sql->ejecuta('select * from Articulos;'); + if ($sql->error()) + return false; + return true; + } + + public function ejecuta() + { + $paso = isset($_GET['paso']) ? $_GET['paso'] : 0; + $paso = $paso > NUMPASOS ? '0' : $paso; + $i=0; + //Si quiere ir a un determinado paso se asegura que estén completos los anteriores + for ($i = 0; $i < $paso; $i++) { + $funcion = "validaPaso" . $i; + if (!$this->$funcion()) { + break; + } + } + $funcion = "paso" . $i; + $this->contenido = $this->$funcion(); + $salida = new Distribucion($this->plant, $this); + return $salida->procesaPlantilla(); + } + + // Cuestiones relacionadas con el servidor + private function paso0() + { + $info = '

    '; + $info .= '
  • Configuración de PHP (php.ini)
  • '; + // display_errors + $displayErr = ini_get('display_errors'); + $displayErr = $displayErr == "1" || $displayErr == "on" ? "on" : "off"; + $mensaje = $displayErr == "off" ? $this->retornaLabel(false,'Se debe deshabilitar la impresión de errores') : + $this->retornaLabel(true, 'Se debe deshabilitar la impresión de errores', "warning"); + $info .= $this->retornaElemento($mensaje, 'display_errors', $displayErr); + // post_max_size + $postMax = ini_get('post_max_size'); + $mensaje = $this->retornaBytes($postMax) >= MINBYTES ? $this->retornaLabel(false, 'Mínimo: ' . CADENAMINBYTES) : + $this->retornaLabel(true, 'Mínimo: ' . CADENAMINBYTES); + $info .= $this->retornaElemento($mensaje, 'post_max_size', $postMax); + // upload_max_filesize + $uploadMax = ini_get('upload_max_filesize'); + $mensaje = $this->retornaBytes($uploadMax) >= MINBYTES ? $this->retornaLabel(false, 'Mínimo: ' . CADENAMINBYTES) : + $this->retornaLabel(true, 'Mínimo: ' . CADENAMINBYTES); + $info .= $this->retornaElemento($mensaje, 'upload_max_filesize', $uploadMax); + // mysqli + $mysql = extension_loaded('mysqli'); + $mysql = $mysql ? "on" : "off"; + $mensaje = $mysql ? $this->retornaLabel(false, 'Tiene que estar cargada la extensión MySQLi para poder funcionar') : + $this->retornaLabel(true, 'Tiene que estar cargada la extensión MySQLi para poder funcionar'); + $info .= $this->retornaElemento($mensaje, 'extensión MySQLi', $mysql); + $info .= '
  • Configuración de la Aplicación
  • '; + // img.dat + $mensaje = is_writable(IMAGEDATA) ? $this->retornaLabel(false, "Se debe poder escribir en el directorio " . IMAGEDATA) : + $this->retornaLabel(true, "Se debe poder escribir en el directorio " . IMAGEDATA); + $valor = is_writable(IMAGEDATA) ? "Sí" : "No"; + $info .= $this->retornaElemento($mensaje, 'Se puede escribir en ' . IMAGEDATA, $valor); + + // tmp + $mensaje = is_writable(TMP) ? $this->retornaLabel(false, "Se debe poder escribir en el directorio " . TMP) : + $this->retornaLabel(true, "Se debe poder escribir en el directorio " . TMP); + $valor = is_writable(TMP) ? "Sí" : "No"; + $info .= $this->retornaElemento($mensaje, 'Se puede escribir en ' . TMP, $valor); + + // inc + $mensaje = is_writable(INC) ? $this->retornaLabel(false, "Se debe poder escribir en el directorio " . INC) : + $this->retornaLabel(true, "Se debe poder escribir en el directorio " . INC); + $valor = is_writable(INC) ? "Sí" : "No"; + $info .= $this->retornaElemento($mensaje, 'Se puede escribir en ' . INC, $valor); + + // configuracion.inc + $mensaje = is_writable(CONFIGURACION) ? $this->retornaLabel(false, "Se debe poder escribir en el fichero de configuración ". CONFIGURACION) : + $this->retornaLabel(true, "Se debe poder escribir en el fichero de configuración ". CONFIGURACION); + $valor = is_writable(CONFIGURACION) ? "Sí" : "No"; + $info .= $this->retornaElemento($mensaje, 'Se puede escribir en ' . CONFIGURACION, $valor); + + // Final del paso + $info .='
'; + $info .= $this->validaPaso0() ? $this->retornaBoton(false, "instalar.php?paso=1") : $this->retornaBoton(true, "instalar.php"); + $panel = $this->panelMensaje($info, 'primary', 'PASO 1: Configuración del servidor y la aplicación'); + return $panel; + } + private function retornaElemento($validacion, $mensaje, $valor) + { + $info = '
  • '; + $info .= $validacion . ' ' . $mensaje . ': ' . $valor . ''; + $info .= '
  • '; + return $info; + } + + private function retornaBoton($error, $paso, $javascript = true) + { + $anadido = $javascript ? 'onclick="location.href=' . "'" . $paso . "'". '"' : ''; + if (!$error) { + return ''; + } else { + return ''; + } + } + + private function botonVolver($enlace) + { + $boton = ''; + return $boton; + } + + private function retornaLabel($error, $mensaje, $tipo = "danger") + { + if ($error) { + $nombre1 = $tipo; $nombre2 = "remove"; + } else { + $nombre1 = "success"; $nombre2 = "ok"; + } + $mensaje = ''; + $mensaje .=''; + return $mensaje; + } + + private function retornaBytes($val) + { + $val = trim($val); + $last = strtolower($val[strlen($val)-1]); + switch($last) { + // El modificador 'G' está disponble desde PHP 5.1.0 + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + return $val; + } + + private function validaPaso0() + { + $validar = true; + $postMax = ini_get('post_max_size'); + $uploadMax = ini_get('upload_max_filesize'); + $mysql = extension_loaded('mysqli'); + $escConfig = is_writable(CONFIGURACION); + $escInc = is_writable(INC); + $escTMP = is_writable(TMP); + $escIMG = is_writable(IMAGEDATA); + if ($this->retornaBytes($postMax) < MINBYTES) + $validar = false; + if ($this->retornaBytes($uploadMax) < MINBYTES) + $validar = false; + if (!$mysql) + $validar = false; + if (!$escConfig) + $validar = false; + if (!$escTMP) + $validar = false; + if (!$escIMG) + $validar = false; + if (!$escInc) + $validar = false; + return $validar; + } + + private function actualizaConfiguracion($grabar, $campos, &$datos) + { + $conf = new Configuracion(); + $fichero = $conf->obtieneFichero(); + $datosFichero = explode("\n", $fichero); + if ($grabar) { + $fsalida = @fopen(CONFIGTMP, "wb"); + } + foreach ($datosFichero as $linea) { + if (stripos($linea, "DEFINE") !== false) { + $conf->obtieneDatos($linea, $clave, $valor); + if (stripos($campos, $clave) !== false) { + if ($grabar) { + $linea = str_replace($valor, $datos[$clave], $linea); + $valor = $datos[$clave]; + } + } + $datos[$clave] = $valor; + } + $registro = substr($linea, 0, 2) == "?>" ? $linea : $linea . "\n"; + if ($grabar) { + fwrite($fsalida, $registro); + } + } + if ($grabar) { + fclose($fsalida); + unlink(CONFIGURACION); + rename(CONFIGTMP, CONFIGURACION); + } + } + + // Cuestiones de la base de datos + private function paso1() + { + $grabar = isset($_POST['SERVIDOR']); + $campos = 'SERVIDOR,PUERTO,BASEDATOS,USUARIO,CLAVE'; + //Lee y si hace falta actualiza los datos del formulario en el fichero de configuración + if ($grabar) { + foreach ($_POST as $clave => $valor) { + $datos[$clave] = $valor; + } + } else { + $datos = array(); + } + $this->actualizaConfiguracion($grabar, $campos, $datos); + if ($grabar && $this->validaPaso1()) { + //Pasa al paso siguiente + return $this->paso2(); + } + + $info = ''; + $info .= '
      '; + $info .= '
    • Datos de configuración
    • '; + $info .= '
    • Servidor
    • '; + $info .= '
    • Puerto
    • '; + $info .= '
    • Base de Datos
    • '; + $info .= '
    • Usuario
    • '; + $info .= '
    • Contraseña
    • '; + $info .= '
    '; + $info .= $this->botonVolver("instalar.php"); + $info .= $this->validaPaso1() ? $this->retornaBoton(false, "instalar.php?paso=1", false) : $this->retornaBoton(true, "instalar.php?paso=1", false); + $info .= ''; + $panel = $this->panelMensaje($info, 'primary', 'PASO 2: Configuración de la Base de Datos.'); + return $panel; + } + + private function validaPaso1() + { + $sql = new Sql(SERVIDOR, USUARIO, CLAVE, ''); + if ($sql->error()) + return false; + $sql = new Sql(SERVIDOR, USUARIO, CLAVE, BASEDATOS); + if ($sql->error()) { + return false; + } + $comando = 'create table test2 (id int(10));'; + $sql->ejecuta($comando); + if ($sql->error()) { + return false; + } + $comando = 'drop table test2;'; + $sql->ejecuta($comando); + if ($sql->error()) { + return false; + } + return true; + } + + // Usuario administrador + private function paso2() + { + if (isset($_POST['usuario'])) { + //ha enviado el formulario. + //Crea la base de datos + $borra_database = "DROP DATABASE " . BASEDATOS . " ;"; + $database = "CREATE DATABASE " . BASEDATOS . " DEFAULT CHARACTER SET utf8;"; + $articulos = "CREATE TABLE `Articulos` ( + `id` smallint(6) NOT NULL auto_increment COMMENT 'ordenable', + `descripcion` varchar(60) NOT NULL COMMENT 'ordenable,link/Articulo', + `marca` varchar(20) default NULL COMMENT 'ordenable', + `modelo` varchar(20) default NULL COMMENT 'ordenable', + `cantidad` int(11) default NULL COMMENT 'ordenable', + `imagen` varchar(45) default NULL COMMENT 'imagen', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=769 DEFAULT CHARSET=utf8; + "; + $ubicaciones = "CREATE TABLE `Ubicaciones` ( + `id` smallint(5) unsigned NOT NULL auto_increment COMMENT 'ordenable', + `Descripcion` varchar(50) NOT NULL COMMENT 'ordenable,link/Ubicacion', + `imagen` varchar(45) DEFAULT NULL COMMENT 'imagen', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=179 DEFAULT CHARSET=utf8; + "; + $elementos = "CREATE TABLE `Elementos` ( + `id` int(10) unsigned NOT NULL auto_increment COMMENT 'ordenable', + `id_Articulo` smallint(6) NOT NULL COMMENT 'foreign(Articulos;id),ordenable', + `id_Ubicacion` smallint(5) unsigned NOT NULL COMMENT 'foreign(Ubicaciones;id),ordenable', + `numserie` varchar(30) default NULL COMMENT 'ordenable', + `cantidad` int(10) unsigned default NULL COMMENT 'ordenable', + `fechaCompra` date NOT NULL COMMENT 'ordenable', + `imagen` varchar(45) default NULL COMMENT 'imagen', + PRIMARY KEY (`id`), + KEY `id` (`id`), + KEY `id_Articulo` (`id_Articulo`), + KEY `id_Ubicacion` (`id_Ubicacion`), + 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 + ) ENGINE=InnoDB AUTO_INCREMENT=1789 DEFAULT CHARSET=utf8; + "; + $usuarios = "CREATE TABLE `Usuarios` ( + `id` int(10) unsigned NOT NULL auto_increment COMMENT 'ordenable', + `nombre` varchar(16) NOT NULL default '', + `clave` varchar(32) NOT NULL default '', + `idSesion` varchar(20) NOT NULL default '', + `alta` tinyint(1) NOT NULL default '0', + `modificacion` tinyint(1) NOT NULL default '0', + `borrado` tinyint(1) NOT NULL default '0', + `consulta` tinyint(1) NOT NULL default '1', + `informe` tinyint(1) NOT NULL default '1', + `usuarios` tinyint(1) NOT NULL default '0', + `config` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id`), + KEY `nombre` (`nombre`) + ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; + "; + $letras = "abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + $sesion = substr(str_shuffle($letras), 0, 8); + $usuario = $_POST['usuario']; + $clave = $_POST['clave']; + $administrador = "insert into Usuarios values (null,'$usuario','$clave','$sesion','1','1','1','1','1','1','1');"; + + @mysqli_query($borra_database); + @mysqli_query($database); + $sql = new Sql(SERVIDOR, USUARIO, CLAVE, BASEDATOS); + $sql->ejecuta($ubicaciones); + if ($sql->error()) { + return $this->panelMensaje($sql->mensajeError(), "danger", "ERROR"); + } + $sql->ejecuta($articulos); + if ($sql->error()) { + return $this->panelMensaje($sql->mensajeError(), "danger", "ERROR"); + } + $sql->ejecuta($elementos); + if ($sql->error()) { + return $this->panelMensaje($sql->mensajeError(), "danger", "ERROR"); + } + $sql->ejecuta($usuarios); + if ($sql->error()) { + return $this->panelMensaje($sql->mensajeError(), "danger", "ERROR"); + } + $sql->ejecuta($administrador); + if ($sql->error()) { + return $this->panelMensaje($sql->mensajeError(), "danger", "ERROR"); + } + $campos="INSTALADO"; + $datos['INSTALADO'] = "sí"; + $this->actualizaConfiguracion(true, $campos, $datos); + return $this->resumen(); + } + + $info = ' +
    +
    + +
    + +
    Mínimo 5 caracteres
    +
    +
    + +
    + +
    + + Mínimo 6 caracteres + +
    Mínimo 6 caracteres
    +
    +
    + +
    + ' . $this->botonVolver("instalar.php?paso=1") . ' + +
    +
    + + '; + $panel = $this->panelMensaje($info, 'primary', 'PASO 3: Creación de la base de datos y el usuario administrador.'); + return $panel; + } + + private function validaPaso2() + { + //La validación de este paso se hace con la del formulario en javascript + return true; + } + + public function panelMensaje($info, $tipo = "info", $cabecera = "¡Atención!") { + $mensaje = '
    '; + $mensaje .= '

    ' . $cabecera . '

    '; + $mensaje .= '
    '; + $mensaje .= $info; + $mensaje .= '
    '; + $mensaje .= '
    '; + return $mensaje; + } + + public function contenido() + { + return $this->contenido; + } + + public function menu() + { + return ''; + } + + public function opcion() + { + return 'INSTALACIÓN'; + } + + public function control() + { + return ''; + } + + public function aplicacion() + { + return PROGRAMA . ' v' . VERSION; + } + + public function usuario() + { + return ''; + } + + public function fecha() + { + $idioma = 'es_ES'; + $formato = "%d-%b-%y"; + setlocale(LC_TIME, $idioma); + return strftime($formato); + } + public function cabecera() + { + return ' + + + + + + + + + + Inventario + + + + + + + + + + + + + + + '; + } + + public function panelError() + { + $mensaje = $this->cabecera(); + $mensaje .= $this->panelMensaje($this->error_msj, "danger", "¡ERROR!"); + $mensaje .= ""; + return $mensaje; + } + + private function resumen() + { + $info = ''; + $info .= $this->retornaBoton(false, "index.php", true); + $panel = $this->panelMensaje($info, 'success', 'Instalación finalizada.'); + return $panel; + + } +} + +?> \ No newline at end of file diff --git a/Inventario.php b/Inventario.php index 2e94ec3..2c9f78e 100644 --- a/Inventario.php +++ b/Inventario.php @@ -40,14 +40,19 @@ class Inventario { // Analizamos la cadena de solicitud para saber // qué opción es la actual $this->opcActual = $_SERVER['QUERY_STRING'] == '' ? 'principal' : $_SERVER['QUERY_STRING']; + //Si el programa no está instalado, llama al instalador. + if (INSTALADO == "no") { + header('location: instalar.php'); + return; + } // Iniciamos una sesión session_start(); //Conexión con la base de datos. $this->bdd = new Sql(SERVIDOR, USUARIO, CLAVE, BASEDATOS); if ($this->bdd->error()) { + echo '

    Fallo al conectar con el servidor MySQL.

    '; - echo SERVIDOR; - echo "Servidor [ " . SERVIDOR . " ] usuario [" . USUARIO . "] clave [" . CLAVE . "] base [" . BASEDATOS . "]"; + echo "Servidor [ " . SERVIDOR . " ] base de datos [" . BASEDATOS . "]"; $this->estado = false; return; } else { @@ -198,7 +203,6 @@ class Inventario { $_SESSION['Perfil'] = $this->perfil; } } - } ?> diff --git a/Sql.php b/Sql.php index 65a1f14..12aa9b3 100644 --- a/Sql.php +++ b/Sql.php @@ -63,7 +63,7 @@ class Sql { */ public function __construct($servidor,$usuario,$clave,$baseDatos) { - $this->bdd=new mysqli($servidor,$usuario,$clave,$baseDatos); + $this->bdd = @new mysqli($servidor,$usuario,$clave,$baseDatos); if (mysqli_connect_errno()) { $this->mensajeError='

    Fallo al conectar con el servidor MySQL.

    '; $this->mensajeError.="Servidor [".$servidor ."] usuario=[".$usuario."] clave [".$clave."] base [".$baseDatos."]"; diff --git a/css/dashboard.php b/css/dashboard.php index 280dc6c..c88a8f5 100644 --- a/css/dashboard.php +++ b/css/dashboard.php @@ -33,7 +33,7 @@ display: none; } @media (max-width: 767px) { .sidebar { -top: 50px; +top: 60px; bottom: 150px; background-color: } diff --git a/css/validator.min.js b/css/validator.min.js new file mode 100755 index 0000000..591c37b --- /dev/null +++ b/css/validator.min.js @@ -0,0 +1,9 @@ +/*! + * Validator v0.2.1 for Bootstrap 3, by @1000hz + * Copyright 2014 Spiceworks, Inc. + * Licensed under http://opensource.org/licenses/MIT + * + * https://github.com/1000hz/bootstrap-validator + */ + ++function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=c,this.toggleSubmit(),this.$element.on("input.bs.validator blur.bs.validator",":input",a.proxy(this.validateInput,this)),this.$element.find("[data-match]").each(function(){var b=a(this),c=b.data("match");a(c).on("input.bs.validator",function(){b.val()&&b.trigger("input")})})};b.DEFAULTS={delay:500,errors:{match:"Does not match",minlength:"Not long enough"}},b.VALIDATORS={"native":function(a){var b=a[0];return b.checkValidity?b.checkValidity():!0},match:function(b){var c=b.data("match");return!b.val()||b.val()===a(c).val()},minlength:function(a){var b=a.data("minlength");return!a.val()||a.val().length>=b}},b.prototype.validateInput=function(b){var c,d=a(b.target),e=d.data("bs.errors");this.$element.trigger(b=a.Event("validate.bs.validator",{relatedTarget:d[0]})),b.isDefaultPrevented()||(d.data("bs.errors",c=this.runValidators(d)),c.length?this.showErrors(d):this.clearErrors(d),e&&c.toString()===e.toString()||(b=c.length?a.Event("invalid.bs.validator",{relatedTarget:d[0],detail:c}):a.Event("valid.bs.validator",{relatedTarget:d[0],detail:e}),this.$element.trigger(b)),this.toggleSubmit(),this.$element.trigger(a.Event("validated.bs.validator",{relatedTarget:d[0]})))},b.prototype.runValidators=function(c){{var d=[];[b.VALIDATORS.native]}return a.each(b.VALIDATORS,a.proxy(function(a,b){if((c.data(a)||"native"==a)&&!b.call(this,c)){var e=c.data(a+"-error")||c.data("error")||"native"==a&&c[0].validationMessage||this.options.errors[a];!~d.indexOf(e)&&d.push(e)}},this)),d},b.prototype.validate=function(){var a=this.options.delay;return this.options.delay=0,this.$element.find(":input").trigger("input"),this.options.delay=a,this},b.prototype.showErrors=function(b){function c(){var c=b.closest(".form-group"),d=c.find(".help-block.with-errors"),e=b.data("bs.errors");e.length&&(e=a("