13 Commits
1.14 ... 1.15

Author SHA1 Message Date
7272e2b85a Merge branch 'release/1.15'
* release/1.15:
  Actualizado el número de versión a 1.15
  Corregido codificación/decodificación de la cadena de búsqueda en la URL
  Fix #40 Crear la opción de clonar registro en Mantenimiento. -Crear iconos de clonado en todos los estilos. -Corregido determinaAccion en Imagen para aceptar el clonado
  Corregido que aparezca el código de artículo en las etiquetas qr del inventario de Artículos Añadida la creación del directorio de imágenes en las instrucciones de instalación del README
2014-06-29 21:22:57 +02:00
9a8ba799c4 Actualizado el número de versión a 1.15 2014-06-29 21:22:20 +02:00
2452d2a9e6 Merge branch 'develop' of bitbucket.org:rmontanana/inventario2 into develop
# By rmontanana
# Via rmontanana
* 'develop' of bitbucket.org:rmontanana/inventario2:
  Corregido codificación/decodificación de la cadena de búsqueda en la URL
  Fix #40 Crear la opción de clonar registro en Mantenimiento. -Crear iconos de clonado en todos los estilos. -Corregido determinaAccion en Imagen para aceptar el clonado
2014-06-29 21:03:00 +02:00
rmontanana
b48b206950 Corregido codificación/decodificación de la cadena de búsqueda en la URL 2014-06-29 21:01:38 +02:00
rmontanana
a72ef244cd Fix #40 Crear la opción de clonar registro en Mantenimiento.
-Crear iconos de clonado en todos los estilos.
-Corregido determinaAccion en Imagen para aceptar el clonado
2014-06-29 09:40:36 +02:00
cc2129e7d9 Corregido que aparezca el código de artículo en las etiquetas qr del inventario de Artículos
Añadida la creación del directorio de imágenes en las instrucciones de instalación del README
2014-06-08 18:25:13 +02:00
6148593c7c Merge branch 'release/1.14.1'
* release/1.14.1:
  Actualizado el CHANGELOG
  Añadido la v para indicar la versión en la cabecera de los informes Acortado el nombre de la aplicación en la página principal para que en dispositivos pequeños se visualice bien con el icono nuevo del manual
  Añadidos enlaces a manual y a aplicación de ejemplo en readme.md
  Arreglado que los créditos salgan centrados en lugar de alineados a la derecha
2014-06-02 19:44:52 +02:00
14e5767eb1 Merge branch 'release/1.14.1' into develop
* release/1.14.1:
  Actualizado el CHANGELOG
2014-06-02 19:44:52 +02:00
b89fcbd2ec Actualizado el CHANGELOG 2014-06-02 19:44:33 +02:00
068596af7f Merge branch 'hotfix/1.14.1' into develop
* hotfix/1.14.1:
2014-06-02 19:41:22 +02:00
77f766366d Añadido la v para indicar la versión en la cabecera de los informes
Acortado el nombre de la aplicación en la página principal para que en dispositivos pequeños se visualice bien con el icono nuevo del manual
2014-06-01 23:55:13 +02:00
0ab3bf7eb3 Añadidos enlaces a manual y a aplicación de ejemplo en readme.md 2014-06-01 23:15:26 +02:00
db4e283a0d Arreglado que los créditos salgan centrados en lugar de alineados a la derecha 2014-06-01 22:59:49 +02:00
13 changed files with 99 additions and 18 deletions

View File

@@ -194,7 +194,10 @@ class AportaContenido {
$campo = '<input type="hidden" name="fechaCabecera" id="fechaCabecera" value="' . $this->fechaActual("%d/%m/%Y") . '">';
$etiqueta = '<label for="fechaCabecera" onClick="$(' . "'#fechaCabecera'" . ").data('DateTimePicker').show();" . '">' . $this->fechaActual() . '</label>';
return $etiqueta . $campo . $script;
case 'aplicacion': return PROGRAMA . " v" . VERSION;
case 'aplicacion':
$nombre = explode(" ", PROGRAMA);
$nombre = $nombre[2];
return $nombre . " v" . VERSION;
case 'menu': // el menú
if ($this->registrado) {
return $this->miMenu->insertaMenu();
@@ -254,7 +257,7 @@ class AportaContenido {
$rama_texto = trim(substr(file_get_contents('.git/HEAD'), 16));
$rama = ($rama_texto != 'master' ? '<br><button class="btn btn-warning btn-xs" type="button"onClick="' . $creditos . '"><span class="glyphicon glyphicon-cog"></span> '.$rama_texto.'</button></center>':'');
return $mensaje . '<br><br><center><img src="img/qrlogo.png" alt="' . PROGRAMA . '" onClick="' . $creditos . '" >' .
'<br><br><label onClick="' . $creditos . '">' . $centro . '</label>' . $rama . CREDITOS_CABECERA . $tabla . CREDITOS_PIE;
'<br><br><label onClick="' . $creditos . '">' . $centro . '</label>' . $rama . '</center>' . CREDITOS_CABECERA . $tabla . CREDITOS_PIE;
case 'articulos':
case 'ubicaciones':
case 'test':

View File

@@ -1,3 +1,15 @@
Versión 1.15 29-06-2014
-Crear la opción de clonar registro en Mantenimiento.
-Crear iconos de clonado en todos los estilos.
-Corregido determinaAccion en Imagen para aceptar el clonado
-Corregido codificación/decodificación de la cadena de búsqueda en la URL
Versión 1.14.1 02-06-2014
-Añadidos enlaces a manual y a aplicación de ejemplo en readme.md
-Arreglado que los créditos salgan centrados en lugar de alineados a la derecha
-Añadido la 'v' para indicar la versión en la cabecera de los informes
-Acortado el nombre de la aplicación en la página principal para que en dispositivos pequeños se visualice bien con el icono nuevo del manual
Versión 1.14 01-06-2014
-Añadido icono de acceso a la documentación en la barra superior
-Corregido cierre etiqueta h5 en pie de créditos

View File

@@ -29,6 +29,7 @@ class Imagen {
public $archivoComprimido;
private $extension;
private $dirData;
public $archivoCopiado;
public function __construct()
{
@@ -39,7 +40,7 @@ class Imagen {
{
if (isset($_POST[$campo]) && $_POST[$campo] == "") {
return HAYQUEBORRAR; //Hay que borrar el archivo de imagen
} elseif ($_FILES[$campo]['error'] == 0) {
} elseif (isset($_FILES[$campo]['error']) && $_FILES[$campo]['error'] == 0) {
return HAYQUEGRABAR; //Hay que guardar el archivo de imagen enviado
} else {
return NOHACERNADA; //No hay que hacer nada
@@ -111,6 +112,18 @@ class Imagen {
}
}
}
public function copiaImagenId($valorImagen, $tabla, $id, &$mensaje)
{
$extension = strrchr($valorImagen, ".");
$nombre = $this->dirData . "/" . $tabla . "_" . $id . $extension;
if (!@copy($valorImagen, $nombre)) {
$errors= error_get_last();
$mensaje = "No pudo copiar el archivo " . $valorImagen . " en " . $nombre . " Error = [" . $errors['message'] . "]";
return false;
}
$this->archivoCopiado = $nombre;
return true;
}
public function mueveImagenId($tabla, $id, &$mensaje)
{

View File

@@ -54,7 +54,7 @@ class InformePDF {
//echo $def->Titulo.$def->Cabecera;
$this->pdf->Open();
$this->pdf->setAuthor(AUTOR,true);
$creador = CENTRO . " " . PROGRAMA.VERSION;
$creador = CENTRO . " " . PROGRAMA . " v" . VERSION;
$this->pdf->setCreator(html_entity_decode($creador),true);
$this->pdf->setSubject($this->def->Titulo,true);
$this->pdf->setAutoPageBreak(true, 10);

View File

@@ -23,6 +23,7 @@
define('EDICION', 'Edici&oacute;n');
define('BORRADO', '<i>Borrado</i>');
define('ANADIR', 'Inserci&oacute;n');
define('CLONAR', 'Clonar');
class Mantenimiento {
@@ -91,7 +92,10 @@ class Mantenimiento {
$sentido = "&sentido=" . $this->datosURL['sentido'];
$pag = "&pag=" . $this->datosURL['pag'];
//Ahora los datos opcionales
$buscar = isset($this->cadenaBusqueda) ? "&buscar=$this->cadenaBusqueda" : null;
//$buscar = isset($this->cadenaBusqueda) ? '&buscar="'.$this->cadenaBusqueda.'"' : null;
//$buscar = isset($this->cadenaBusqueda) ? "&buscar='$this->cadenaBusqueda'" : null;
//$buscar = isset($this->cadenaBusqueda) ? "&buscar=$this->cadenaBusqueda" : null;
$buscar = isset($this->cadenaBusqueda) ? "&buscar=" . urlencode($this->cadenaBusqueda) : null;
$id = isset($this->datosURL['id']) ? "&id=" . $this->datosURL['id'] : null;
$enlace = $this->url . $opc . $orden . $sentido . $pag . $buscar . $id;
return $enlace;
@@ -109,10 +113,15 @@ class Mantenimiento {
case 'insertar':return $this->insertar();
case 'modificar':return $this->modificar();
case 'borrar':return $this->borrar();
case 'clonar': return $this->muestra(CLONAR);
default: return "La clase Mantenimiento No entiende lo solicitado [" . $this->datosURL['opc'] . "]";
}
}
private function clonar()
{
}
protected function obtieneClavesForaneas()
{
$salida = null;
@@ -146,7 +155,7 @@ class Mantenimiento {
$cabecera = $this->cabeceraTabla();
//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
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(urldecode($this->cadenaBusqueda)) . "%'";
$comando = str_replace('{buscar}', $sufijo, $this->comandoConsulta);
} else {
$comando = str_replace('{buscar}', '', $this->comandoConsulta);
@@ -244,6 +253,18 @@ class Mantenimiento {
}
//Añade los botones de acciones
$salida .= '<td align="center">';
//Añade el icono de clonar
if ($this->perfil['Alta']) {
//$salida.='<a href="index.php?' . $tabla . '&opc=editar&id=' . $id . "&pag=" . $pagina . $sufijoOrden . $sufijoEnlace .
$this->backupURL(); $this->datosURL['opc'] = "clonar"; $this->datosURL['id'] = $id;
if (ESTILO == 'bootstrap') {
$salida.='<a href="'.$this->montaURL() . '" title="Clonar"><span class="glyphicon glyphicon-copyright-mark"></span></a>&nbsp;&nbsp;';
} else {
$salida.='<a href="' . $this->montaURL() .
'"><img title="Clonar" src="img/' . ESTILO . '/clonar.png" alt="clonar"></a>&nbsp;&nbsp;';
}
$this->restoreURL();
}
//Añade el icono de editar
if ($this->perfil['Modificacion']) {
//$salida.='<a href="index.php?' . $tabla . '&opc=editar&id=' . $id . "&pag=" . $pagina . $sufijoOrden . $sufijoEnlace .
@@ -327,7 +348,7 @@ class Mantenimiento {
if ($this->perfil['Alta']) {
$this->datosURL['opc'] = 'nuevo';
if (ESTILO == 'bootstrap') {
$anadir = '<button type="button" class="btn btn-default btn-lg" title="Añade '.$this->tabla.'" onClick="location.href='."'".$this->montaURL()."'".'"><span class="glyphicon glyphicon-plus-sign"></span></button>';
$anadir = '<button type="button" class="btn btn-default btn-lg" title="Añade '.$this->tabla.'" onClick="location.href='."'".$this->montaURL()."'".'"><span class="glyphicon glyphicon-plus-sign"></span></button>';
} else {
$anadir = '<a href="' . $this->montaURL() . '">' .
'<img title="A&ntilde;adir registro" alt="nuevo" src="img/' . ESTILO . '/nuevo.png"></a>';
@@ -412,7 +433,7 @@ class Mantenimiento {
//procesa el envío de la imagen
$imagen = new Imagen();
$accion = $imagen->determinaAccion($campo);
if ($accion != NOHACERNADA) {
if ($accion != NOHACERNADA) { // && $_POST['tipoOperacion'] != CLONAR) {
$mensaje = "";
if (!$imagen->procesaEnvio($campo, $mensaje)) {
return $this->panelMensaje($mensaje, "danger", "ERROR PROCESANDO IMAGEN");
@@ -420,7 +441,16 @@ class Mantenimiento {
$hayImagen = true;
$campoImagen = $campo;
} else {
$valor = "null";
//Comprobamos si hay clonación y hay imagen a clonar.
$valor = $_POST[$campo];
if ($_POST['tipoOperacion'] == CLONAR && file_exists($valor)) {
$hayImagen = true;
$campoImagen = $campo;
$valorImagen = $valor;
$valor = "null";
} else {
$valor = "null";
}
}
} else {
$valor = $_POST[$campo] == "" ? "null" : '"' . $this->bdd->filtra($_POST[$campo]) . '"';
@@ -434,11 +464,22 @@ class Mantenimiento {
}
$id = $this->bdd->ultimoId();
if ($hayImagen) {
$mensaje = " ";
//Tiene que recuperar el id del registro insertado y actualizar el archivo de imagen
if (!$imagen->mueveImagenId($this->tabla, $id, $mensaje)) {
return $this->panelMensaje($mensaje, "danger", "ERROR COMPRIMIENDO IMAGEN");
if ($_POST['tipoOperacion'] == CLONAR) {
//Tiene que copiar el archivo original.
if (!$imagen->copiaImagenId($valorImagen, $this->tabla, $id, $mensaje)) {
return $this->panelMensaje($mensaje, "danger", "ERROR COPIANDO IMAGEN");
}
$archivoImagen = $imagen->archivoCopiado;
} else {
//Crea el archivo de imagen
if (!$imagen->mueveImagenId($this->tabla, $id, $mensaje)) {
return $this->panelMensaje($mensaje, "danger", "ERROR COMPRIMIENDO IMAGEN");
}
$archivoImagen = $imagen->archivoComprimido;
}
$comando = "update " . $this->tabla . " set " . $campoImagen . "='" . $imagen->archivoComprimido . "' where id='" . $id ."';";
$comando = "update " . $this->tabla . " set " . $campoImagen . "='" . $archivoImagen . "' where id='" . $id ."';";
if (!$this->bdd->ejecuta($comando)) {
return $this->errorBD($comando);
}
@@ -657,7 +698,7 @@ class Mantenimiento {
/**
*
* @param string $tipo ANADIR,EDICION,BORRADO
* @param string $tipo ANADIR,EDICION,BORRADO,CLONAR
* @param array $datos Vector con los datos del registro
* @return array lista de campos y formulario de entrada
*/
@@ -666,6 +707,7 @@ class Mantenimiento {
$modo = $tipo == BORRADO ? "readonly" : "";
$nfechas = 0;
switch ($tipo) {
case CLONAR:
case ANADIR:
$this->datosURL['opc'] = "insertar"; $this->datosURL['id'] = null;
break;
@@ -695,7 +737,7 @@ class Mantenimiento {
//Se asegura que el id no se pueda modificar.
$modoEfectivo = $clave == 'id' ? "readonly" : $modo;
$valorDato = $datos == null ? "" : $datos[$campo];
if ($clave == 'id' && $tipo == ANADIR) {
if ($clave == 'id' && ($tipo == ANADIR || $tipo == CLONAR)) {
$valorDato = null;
}
if (!isset($this->foraneas[$valor['Campo']])) {
@@ -744,6 +786,10 @@ class Mantenimiento {
continue;
}
if (stristr($this->campos[$campo]['Comment'], "imagen")) {
/*if ($tipo == CLONAR) {
// De momento no deja clonar las imágenes
$valorDato = null;
}*/
$salida .= $this->creaCampoImagen($campo, $valorDato, $tipo);
continue;
}
@@ -762,6 +808,8 @@ class Mantenimiento {
}
//genera un campo oculto con la lista de campos a modificar.
$salida .= '<input name="listacampos" type="hidden" value="' . $campos . "\">\n";
//genera un campo oculto con el tipo de operación asociado al formulario
$salida .= '<input name="tipoOperacion" type="hidden" value="' . $tipo . "\">\n";
$salida .= "</fieldset><p>";
$salida .= '<center>';
$this->datosURL['opc'] = 'inicial';

View File

@@ -61,7 +61,7 @@ class Pdf_mysql_table extends FPDF
//Titulo
$fecha=strftime("%d-%b-%Y %H:%M");
$this->SetFont('Arial','',8);
$this->Cell(0,4,html_entity_decode(CENTRO . " " . PROGRAMA . VERSION,ENT_COMPAT | ENT_HTML401,'ISO-8859-1'),0,1,'L');
$this->Cell(0,4,html_entity_decode(CENTRO . " " . PROGRAMA . " v" . VERSION,ENT_COMPAT | ENT_HTML401,'ISO-8859-1'),0,1,'L');
$this->SetFont('Arial','',18);
$this->Cell(0,6,utf8_decode($this->titulo),0,1,'C');
$this->SetFont('Arial','',8);

View File

@@ -13,6 +13,10 @@ Utiliza:
*MySQL v. 5.1.x
*Apache
[Manual de Usuario](http://rmontanana.gitbooks.io/inventario2/)
[Instalación de ejemplo](http://inventario2.rmontanana.es)
##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.).
@@ -26,7 +30,8 @@ Para instalar la aplicación basta con seguir estos pasos:
###2. Crear un directorio temporal y dar derechos de escritura a los ficheros de configuración.
mkdir tmp
chown apache tmp
mkdir img.data
chown apache tmp img.data
chown apache inc/configuracion.inc
chown apache inc

BIN
img/bluecurve/clonar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

BIN
img/clonar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
img/cristal/clonar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

BIN
img/personal/clonar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

View File

@@ -23,5 +23,5 @@
*/
define('AUTOR', 'Ricardo Montañana Gómez');
define('VERSION', '1.14');
define('VERSION', '1.15');
?>

View File

@@ -3,7 +3,7 @@
<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,
select A.id as idArt, 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;