Cómo desarrollar un nuevo formulario electrónico (Tipo de Solicitud) en REC (Registro Electrónico Común)
- Introducción
- Detalle Procedimental
- Creación de plantillas
- Creación del fichero de Reglas
- Base de datos
- Consideraciones especiales
- REFERENCIAS
- ANEXOS
Introducción
El objeto de este documento es describir la forma procedimental de incluir nuevos tipos de solicitudes en REC detallando los pasos que se deben de seguir, de manera que cualquier usuario con permisos y con los conocimientos técnicos necesarios pueda dar de alta todos los componentes necesarios para crear un nuevo tipo de solicitud en REC.
Detalle Procedimental
El procedimiento de creación de nuevos tipos de solicitud se divide en dos partes:
- Creación de plantillas de diseño del nuevo formulario.
- Creación del fichero de reglas de validaciones de servidor.
- Elemento de la listaCreación registros en BBDD para dar de alta el nuevo tipo de solicitud.
Para mejorar el entendimiento del procedimiento a seguir vamos a seguir los pasos de creación de un caso real, el correspondiente al tipo de solicitud de ACTAS DE ELECCION DE DELEGADOS DE PREVENCION.
El código completo se puede consultar en el apartado de Adjuntos al final de esta página.
Creación de plantillas
Para la creación de las plantillas se han utilizado una serie de tecnologías estándar que facilitan el trabajo de creación de nuevas plantillas. Se describen a continuación:
- Velocity: se trata de un motor de plantillas basado en Java y que permite a los diseñadores de páginas hacer referencia a métodos definidos dentro del código Java. Velocity es un proyecto de software libre y de código abierto dirigido por el Apache Software Foundation
- JQuery: se trata de una biblioteca de JavaScript que permite simplificar la manera de interactuar con los documentos HTML, manipular el árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con la técnica AJAX a páginas web. JQuery es software libre y de código abierto, posee un doble licenciamiento bajo la Licencia MIT y la Licencia Pública General de GNU v2, permitiendo su uso en proyectos libres y privativos
- JasperReports: es una herramienta de creación de informes que tiene la habilidad de entregar contenido enriquecido al monitor, a la impresora o a ficheros PDF, HTML, XLS, CSV y XML. Está escrito completamente en Java y puede ser usado en gran variedad de aplicaciones de Java, incluyendo J2EE o aplicaciones web, para generar contenido dinámico. Su propósito principal es ayudar a crear documentos de tipo páginas, preparados para imprimir en una forma simple y flexible. Se encuentra bajo licencia libre GNU, por lo que es Software libre. Forma parte de la iniciativa apilada open source.
- iReport: es un front-end gráfico open source que se utiliza para diseñar los informes de JasperReports. Esta herramienta nos permite diseñar, de forma simple, un informe que luego será visualizado en nuestra aplicación mediante la utilización de JasperReports.
Se deben crear 3 plantillas distintas por cada tipo de solicitud:
- Plantilla de edición
- Se utiliza HTML y Javascript.
- Se visualiza en la web de REC.
- Plantilla de visualización
- Se utiliza HTML y Javascript.
- Se visualiza en la web de REC.
- Plantilla de impresión
- Se utiliza JasperReport.
- Se genera un pdf para imprimir.
En el caso de las plantillas de edición y de visualización solo es necesario definir los elementos específicos de cada tipo de solicitud ya que la base de la página es común a todos los tipos de solicitud y dentro de ella es donde se importará cada plantilla.
El contenido de las plantillas se insertará en la base de datos en los campos INFO_HTML_EDIT, INFO_HTML_VIEW e INFO_PDF de la tabla TIPO_SOLICITUD_TEMPLATE
Plantilla de edición
Características:
- Contiene el diseño del formulario correspondiente al nuevo tipo de solicitud para editar la información. Ese diseño es muy similar al de la plantilla de visualización anterior.
- Incluye scripts con las validaciones a nivel de formulario que se deben realizar así como los mensajes que se mostrarán en caso de que no se cumplan las validaciones. Como se puede apreciar, para las validaciones se utiliza jquery.
Siguiendo el ejemplo propuesto, nos vamos a centrar en tres aspectos:
- Por un lado vamos a ver cómo se crean los scripts de validación y otros componentes HTML y/o Javascript necesarios
- Por otro lado vamos a ver cómo se crean dos apartados de nuestro formulario:
-
- El que se muestra en la parte superior de nuestro tipo de solicitud y al que nos referiremos en adelante como formulario simple
2. Por otra parte nos centraremos en la creación del apartado 6 que contiene una tabla dinámica y al que nos referiremos en adelante como tabla dinámica
Una vez vista la forma de proceder que se mostrará a continuación, la técnica se puede aplicar al resto de apartados del formulario.
A continuación vemos cómo la captura del formulario completo para nuestro tipo de solicitud:
Script de validación
Vamos a ver cómo se implementa el script de validación de los campos.
Para abreviar se van a incluir la validación solo de los campos obligatorios del formulario simple y de la tabla dinámica que hemos indicado anteriormente:
<script id="demo" type="text/javascript">
$(document).ready(function() {
validate signup form on keyup and submit
var validator = $("#formSolicitud").validate({
rules:{
<!-- SE INDICAN SOLAMENTE LAS CAMPOS OBLIGATORIOS -->
TS8_FECHA_VOTACION_0 : {required: true,},
TS8_DNI_6 : {required: true,},
TS8_NOMBRE_APELLIDOS_6 : {required: true,},
TS8_ORG_SINDICAL_6 : {required: true,},
TS8_SEXO_6 : {required: true,},
TS8_FECHA_NACIMIENTO_6 : {required: true,},
TS8_ANTIGUEDAD_6 : {required: true,},
TS8_VOTOS_6 : {required: true,}
},messages:{
<!-- DEFINICION DE LOS MENSAJES DE ERROR DE VALIDACION EN FORMULARIO -->
TS8_FECHA_VOTACION_0 : "Campo Fecha de votación es requerido",
TS8_DNI_6 : "Campo DNI de delegados/as de prevención elegidos/as es requerido",
TS8_NOMBRE_APELLIDOS_6 : "Campo Nombre y apellidos de delegados/as elegidos/as es requerido",
TS8_ORG_SINDICAL_6 : "Campo Organización sindical de delegados/as es requerido",
TS8_SEXO_6 : "Campo Sexo de delegados/as de prevención elegidos/as es requerido",
TS8_FECHA_NACIMIENTO_6 : "Campo Fecha de nacimiento de delegados/as elegidos/as es requerido",
TS8_ANTIGUEDAD_6 : "Campo Antiguedad de delegados/as de prevención elegidos/as es requerido",
TS8_VOTOS_6 : "Campo Votos de delegados/as de prevención elegidos/as es requerido"
},
errorLabelContainer: "#messageBox",
wrapper: "li"
});
});
Composición de la parte gráfica de la plantilla
Debido a que esta plantilla es más compleja y que necesita el uso de scripts, para incluir los componentes de diseño propios de los formularios, tenemos que encapsularlos en un componente form de HTML, de la siguiente forma:
<!-- SE INCLUYEN LOS DISTINTOS FORMULARIOS -->
<table class="formulario"> . . . </table>
. . . . . . . .
<table class="formulario"> . . . </table>
Formulario simple de edición
Todos los tipos de solicitudes llevan uno o varios formularios simples, de tipo etiqueta-valor, como el que se muestra en la siguiente imagen.
El código que lo implementa es el siguiente:
<table class="formulario">
<tbody>
<tr>
<td style="width:10%;"></td>
<td style="width:10%;text-align:center;">
<label for="plat_TS8_NUM_ACTA_0" id="label_TS8_NUM_ACTA_0">Provincia</label>
</td>
<td style="width:10%;text-align:center;">
<label for="plat_TS8_NUM_ORDEN_0" id="label_TS8_NUM_ORDEN_0">N° de Orden</label>
</td>
<td style="width:15%;"></td>
<td style="width:10%;text-align:center;">
<label>dd/mm/aaaa</label>
</td>
<td></td>
</tr>
<tr>
<td style="text-align:right;">
<label>N° de Acta </label>
</td>
<td style="text-align:right;">
<input type="text" disabled style="width: 100%;" value="$TS8_NUM_ACTA_0_value" name="TS8_NUM_ACTA_0" id="TS8_NUM_ACTA_0" />
</td>
<td style="text-align:right;">
<input type="text" disabled style="width: 100%;" value="$TS8_NUM_ORDEN_0_value" name="TS8_NUM_ORDEN_0" id="TS8_NUM_ORDEN_0" />
</td>
<td style="text-align:right;">
<label for="plat_TS8_FECHA_VOTACION_0" id="label_TS8_FECHA_VOTACION_0">Fecha de votación</label>
</td>
<td style="text-align:right;">
<input type="text" style="width: 100%;" value="$TS8_FECHA_VOTACION_0_value" name="TS8_FECHA_VOTACION_0" id="TS8_FECHA_VOTACION_0" />
</td>
<td></td>
</tr>
</tbody>
</table>
Para crear el resto de apartados del formulario únicamente es necesario definir tantas estructuras
<table class=¿formulario¿>. . . </table> como sea necesario e incluyendo todos los campos que necesitemos.
Tabla dinámica de edición
Continuando con el ejemplo, vamos a ver la imagen de la tabla dinámica que se va a crear:
<table class="formulario" id="table4">
<thead>
<tr>
<td style="width: 100%;" colspan="9">
6.- DELEGADOS/AS DE PREVENCIÓN ELEGIDOS/AS
</td>
</tr>
</thead>
<tbody>
<!--CABECERAS DE LA TABLA-->
<tr>
<td style="width: 10%;text-align:center;">
<label for="plat_TS8_DNI_6" id="label_TS8_DNI_6">DNI</label>
</td>
<td style="width: 30%;text-align:center;">
<label for="plat_TS8_NOMBRE_APELLIDOS_6" id="label_TS8_NOMBRE_APELLIDOS_6">NOMBRE Y APELLIDOS</label>
</td>
<td style="width: 23%;text-align:center;">
<label for="plat_TS8_ORG_SINDICAL_6" id="label_TS8_ORG_SINDICAL_6_6"> ORGANIZACIÓN<br/>SINDICAL</label>
</td>
<td style="width: 5%;text-align:center;">
<label for="plat_TS8_SEXO_6" id="label_TS8_SEXO_6">SEXO</label>
</td>
<td style="width: 10%;text-align:center;">
<label for="plat_TS8_FECHA_NACIMIENTO_6" id="label_TS8_FECHA_NACIMIENTO_6">FECHA<br/> NACIMIENTO <br/>DIA MES AÑO</label>
</td>
<td style="width: 10%;text-align:center;">
<label for="plat_TS8_ANTIGUEDAD_6" id="label_TS8_ANTIGUEDAD_6">ANTIGÜEDAD<br/>MESES</label>
</td>
<td style="width: 5%;text-align:center;">
<label for="plat_TS8_VOTOS_6" id="label_TS8_VOTOS_6">VOTOS</label>
</td>
<td style="width:7%;"></td>
</tr>
<!--FILAS CON DATOS RECUPERADOS DE LA BASE DE DATOS-->
<!-- Bucle -->
#set ($count = 0)
#foreach ($mapa in $TS8_TABLA_6__value)
#set ($count = $foreach.count)
<tr>
<td>
<input type="text" style="width: 100%;text-align:center;" #if($mapa.TS8_DNI_6) value="$mapa.TS8_DNI_6"#end name="TS8_DNI_6" id="TS8_DNI_6_$foreach.index" />
</td>
<td>
<input type="text" style="width: 100%;" #if($mapa.TS8_NOMBRE_APELLIDOS_6) value="$mapa.TS8_NOMBRE_APELLIDOS_6"#end name="TS8_NOMBRE_APELLIDOS_6" id="TS8_NOMBRE_APELLIDOS_6_$foreach.index" />
</td>
<td>
<input type="text" style="width: 100%;" #if($mapa.TS8_ORG_SINDICAL_6) value="$mapa.TS8_ORG_SINDICAL_6"#end name="TS8_ORG_SINDICAL_6" id="TS8_ORG_SINDICAL_6_$foreach.index" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" #if($mapa.TS8_SEXO_6) value="$mapa.TS8_SEXO_6"#end name="TS8_SEXO_6" id="TS8_SEXO_6_$foreach.index" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" #if($mapa.TS8_FECHA_NACIMIENTO_6)
value="$mapa.TS8_FECHA_NACIMIENTO_6"#end name="TS8_FECHA_NACIMIENTO_6" id="TS8_FECHA_NACIMIENTO_6_$foreach.index" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" #if($mapa.TS8_ANTIGUEDAD_6) value="$mapa.TS8_ANTIGUEDAD_6"#end name="TS8_ANTIGUEDAD_6" id="TS8_ANTIGUEDAD_6_$foreach.index" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" #if($mapa.TS8_VOTOS_6) value="$mapa.TS8_VOTOS_6"#end name="TS8_VOTOS_6" id="TS8_VOTOS_6_$foreach.index" />
</td>
<td onclick='if(document.getElementById("table4").rows.length > 3){$(this).parent("tr").remove()}'>Eliminar</td>
</tr>
#end
<!--EN CASO DE NO TENER FILAS CON DATOS SE INCLUYEN 3 FILAS VACÍAS -->
#if ($count < 3)
#foreach( $foo in [$count..2] )
<tr>
<td>
<input type="text" style="width: 100%;text-align:center;" name="TS8_DNI_6" id="TS8_DNI_6_$foo" />
</td>
<td>
<input type="text" style="width: 100%;" name="TS8_NOMBRE_APELLIDOS_6" id="TS8_NOMBRE_APELLIDOS_6_$foo" />
</td>
<td>
<input type="text" style="width: 100%;" name="TS8_ORG_SINDICAL_6" id="TS8_ORG_SINDICAL_6_$foo" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" name="TS8_SEXO_6" id="TS8_SEXO_6_$foo" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" name="TS8_FECHA_NACIMIENTO_6" id="TS8_FECHA_NACIMIENTO_6_$foo" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" name="TS8_ANTIGUEDAD_6" id="TS8_ANTIGUEDAD_6_$foo" />
</td>
<td>
<input type="text" style="width: 100%;text-align:center;" name="TS8_VOTOS_6" id="TS8_VOTOS_6_$foo" />
</td>
<td onclick='if(document.getElementById("table4").rows.length > 3){$(this).parent("tr").remove()}'>Eliminar</td>
</tr>
#end
#end
</tr>
</tbody>
</table>
<div style="text-align:right;"><a id="add">Añadir fila</a></div>
A la hora de rellenar la tabla con datos, es necesario tener en cuenta que estos se manejan como colecciones de mapas clave-valor.
Para el manejo de añadir y borrar filas se añade una función javascript que se encarga de ello
<script type="text/javascript">
var filasIniciales=2;
$(document).ready(function(){
$("#add").click(function() {
/* Opción 1 */
var rowCount = $('#table4 tr').length;
filasIniciales=filasIniciales+1;
var tds = '<tr>';
tds += '<td><input type="text" style="width: 100%;text-align:center;" name="TS8_DNI_6" id="TS8_DNI_6_'+filasIniciales+'" /></td>';
tds += '<td><input type="text" style="width: 100%;" name="TS8_NOMBRE_APELLIDOS_6" id="TS8_NOMBRE_APELLIDOS_6_'+filasIniciales+'" /></td>';
tds += '<td><input type="text" style="width: 100%;" name="TS8_ORG_SINDICAL_6" id="TS8_ORG_SINDICAL_6_'+filasIniciales+'"/></td>';
tds += '<td><input type="text" style="width: 100%;text-align:center;" name="TS8_SEXO_6" id="TS8_SEXO_6_'+filasIniciales+'"/></td>';
tds += '<td><input type="text" style="width: 100%;text-align:center;" name="TS8_FECHA_NACIMIENTO_6"
id="TS8_FECHA_NACIMIENTO_6_'+filasIniciales+'" /></td>';
tds += '<td><input type="text" style="width: 100%;text-align:center;" name="TS8_ANTIGUEDAD_6" id="TS8_ANTIGUEDAD_6_'+filasIniciales+'" /></td>';
tds += '<td><input type="text" style="width: 100%;text-align:center;" name="TS8_VOTOS_6" id="TS8_VOTOS_6_'+filasIniciales+'"/></td>';
tds += '<td onclick=\'if(document.getElementById("table4").rows.length > 3){$(this).parent("tr").remove()}\'>Eliminar</td>';
tds += '</tr>';
$("#table4").append(tds);
});
});
</script>
La variable de tabla utilizada en el script debe coincidir en nombre con el identificador de la tabla en el formulario table4
Plantilla de visualización
Características:
- Contiene el diseño del formulario correspondiente al nuevo tipo de solicitud para la visualización de la información.
- En este caso los campos son no editables.
Continuando con el ejemplo propuesto, la vista correspondiente a la plantilla de visualización es la siguiente:
Creación del formulario simple
El formato es idéntico al caso de edición con la diferencia que en este caso se incluye el valor del texto directamente en vez de utilizar los componentes <input type="text">.
La implementación del formulario anterior es la siguiente:
<table class="formulario">
<tbody>
<tr>
<td style="width:10%;"></td>
<td style="width:10%;text-align:center;">
<label for="plat_TS8_NUM_ACTA_0" id="label_TS8_NUM_ACTA_0">Provincia</label>
</td>
<td style="width:10%;text-align:center;">
<label for="plat_TS8_NUM_ORDEN_0" id="label_TS8_NUM_ORDEN_0">N° de Orden</label>
</td>
<td style="width:15%;"></td>
<td style="width:10%;text-align:center;">
<label>dd/mm/aaaa</label>
</td>
<td></td>
</tr>
<tr>
<td style="text-align:right;"><label>N° de Acta </label></td>
<td style="text-align:right;">$TS8_NUM_ACTA_0__value</td>
<td style="text-align:right;">$TS8_NUM_ORDEN_0__value</td>
<td style="text-align:right;">
<label for="plat_TS8_FECHA_VOTACION_0" id="label_TS8_FECHA_VOTACION_0">
Fecha de votación
</label>
</td>
<td style="text-align:right;">$TS8_FECHA_VOTACION_0__value</td>
<td></td>
</tr>
</tbody>
</table>
Creación de una tabla dinámica
El formato es idéntico al caso de edición con la diferencia que en este caso NO se incluyen las opciones de añadir y eliminar filas y además solo se pintan las filas con datos.
El código fuente correspondiente es el siguiente:
<table class="formulario">
<thead>
<tr>
<td style="width: 100%;" colspan="7">
6.- DELEGADOS/AS DE PREVENCIÓN ELEGIDOS/AS
</td>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 10%;text-align:center;">
<label for="plat_TS8_DNI_6" id="label_TS8_DNI_6">DNI</label>
</td>
<td style="width: 30%;text-align:center;">
<label for="plat_TS8_NOMBRE_APELLIDOS_6" id="label_TS8_NOMBRE_APELLIDOS_6">NOMBRE Y APELLIDOS</label>
</td>
<td style="width: 23%;text-align:center;">
<label for="plat_TS8_ORG_SINDICAL_6" id="label_TS8_ORG_SINDICAL_6_6"> ORGANIZACIÓN<br/>SINDICAL</label>
</td>
<td style="width: 5%;text-align:center;">
<label for="plat_TS8_SEXO_6" id="label_TS8_SEXO_6">SEXO</label>
</td>
<td style="width: 10%;text-align:center;">
<label for="plat_TS8_FECHA_NACIMIENTO_6" id="label_TS8_FECHA_NACIMIENTO_6">FECHA<br/> NACIMIENTO <br/>DIA MES AÑO</label>
</td>
<td style="width: 10%;text-align:center;">
<label for="plat_TS8_ANTIGUEDAD_6" id="label_TS8_ANTIGUEDAD_6">ANTIGÜEDAD<br/>MESES</label>
</td>
<td style="width: 5%;text-align:center;">
<label for="plat_TS8_VOTOS_6" id="label_TS8_VOTOS_6">VOTOS</label>
</td>
</tr>
<!-- Bucle -->
#set ($count = 0)
#foreach ($mapa in $TS8_TABLA_6__value)
#set ($count = $foreach.count)
<tr>
<td style="text-align:center;">
#if($mapa.TS8_DNI_6)$mapa.TS8_DNI_6#end
</td>
<td>
#if($mapa.TS8_NOMBRE_APELLIDOS_6)$mapa.TS8_NOMBRE_APELLIDOS_6#end
</td>
<td>
#if($mapa.TS8_ORG_SINDICAL_6)$mapa.TS8_ORG_SINDICAL_6#end
</td>
<td style="text-align:center;">
#if($mapa.TS8_SEXO_6)$mapa.TS8_SEXO_6#end
</td>
<td style="text-align:center;">
#if($mapa.TS8_FECHA_NACIMIENTO_6)$mapa.TS8_FECHA_NACIMIENTO_6#end
</td>
<td style="text-align:center;">
#if($mapa.TS8_ANTIGUEDAD_6)$mapa.TS8_ANTIGUEDAD_6#end
</td>
<td style="text-align:center;">
#if($mapa.TS8_VOTOS_6)$mapa.TS8_VOTOS_6#end
</td>
#end
</tr>
</tbody>
</table>
Plantilla de impresión
Características:
- Diseño de la plantilla de pdf de impresión.
- El diseño se realiza con iReport desde donde luego se genera un fichero .jrxml de JasperReports. El fichero generado se compila dando lugar a un archivo .jasper, que es el que se utiliza posteriormente desde REC.
Continuando con el ejemplo, se muestra una captura de la plantilla pdf con la información cargada.
A modo de ejemplo, vamos a ver como quedaría la implementación diseñando con iReport un formulario simple y una tabla dinámica.
Formulario simple de impresión
<?xml version="1.0" encoding="UTF-8"?>
<frame>
<reportElement x="0" y="132" width="512" height="48" />
<staticText>
<reportElement mode="Transparent" x="6" y="22" width="47" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Nº de Acta]]></text>
</staticText>
<staticText>
<reportElement mode="Transparent" x="68" y="6" width="41" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Provincia]]></text>
</staticText>
<staticText>
<reportElement mode="Transparent" x="109" y="6" width="52" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Nº de Orden]]></text>
</staticText>
<rectangle>
<reportElement mode="Transparent" x="68" y="18" width="41" height="20" />
</rectangle>
<rectangle>
<reportElement mode="Transparent" x="109" y="18" width="52" height="20" />
</rectangle>
<rectangle>
<reportElement mode="Transparent" x="278" y="18" width="72" height="20" />
</rectangle>
<staticText>
<reportElement mode="Transparent" x="278" y="6" width="23" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Día]]></text>
</staticText>
<staticText>
<reportElement mode="Transparent" x="301" y="6" width="23" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Mes]]></text>
</staticText>
<staticText>
<reportElement mode="Transparent" x="324" y="6" width="26" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Año]]></text>
</staticText>
<staticText>
<reportElement mode="Transparent" x="195" y="22" width="83" height="12" forecolor="#000000" backcolor="#FFFFFF" />
<textElement textAlignment="Left" verticalAlignment="Middle" rotation="None" markup="none">
<font fontName="SansSerif" size="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false" />
</textElement>
<text><![CDATA[Fecha de la votación]]></text>
</staticText>
<textField>
<reportElement x="283" y="18" width="67" height="20" />
<textElement verticalAlignment="Middle" />
<textFieldExpression><![CDATA[$P{TS8_FECHA_VOTACION_0}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="113" y="18" width="48" height="20" />
<textElement verticalAlignment="Middle" />
<textFieldExpression><![CDATA[$P{TS8_NUM_ORDEN_0}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="72" y="18" width="37" height="20" />
<textElement verticalAlignment="Middle" />
<textFieldExpression><![CDATA[$P{TS8_NUM_ACTA_0}]]></textFieldExpression>
</textField>
</frame>
Tabla dinámica de impresión
Para simplificarlo sólo se van a mostrar las 2 primeras columnas.
<componentElement>
<reportElement key="table" style="table" x="0" y="586" width="512" height="216"/>
<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components
http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="TS8_TABLA_6">
<dataSourceExpression>
<![CDATA[new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($P{TS8_TABLA_6})]]>
</dataSourceExpression>
</datasetRun>
<!--COLUMNA DNI-->
<jr:column width="59">
<jr:columnHeader style="table_CH" height="38" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="59" height="37"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[DNI]]></text>
</staticText>
<genericElement>
<reportElement mode="Transparent" x="0" y="0" width="0" height="38">
<property name="controlParameter" value="true"/>
</reportElement>
<genericElementType namespace="http://jasperreports.sourceforge.net/jasperreports" name="sort"/>
<genericElementParameter name="sortColumnName">
<valueExpression><![CDATA["TS8_DNI_6"]]></valueExpression>
</genericElementParameter>
<genericElementParameter name="sortColumnType">
<valueExpression><![CDATA["Field"]]></valueExpression>
</genericElementParameter>
<genericElementParameter name="sortHandlerHorizontalAlign">
<valueExpression><![CDATA["Right"]]></valueExpression>
</genericElementParameter>
<genericElementParameter name="sortHandlerVerticalAlign">
<valueExpression><![CDATA["Middle"]]></valueExpression>
</genericElementParameter>
</genericElement>
</jr:columnHeader>
<jr:detailCell style="table_TD" height="20" rowSpan="1">
<textField>
<reportElement x="0" y="0" width="59" height="20"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{TS8_DNI_6}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
<!--COLUMNA NOMBRE Y APELLIDOS-->
<jr:column width="131">
<jr:columnHeader style="table_CH" height="38" rowSpan="1">
<staticText>
<reportElement x="0" y="0" width="131" height="38"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[NOMBRE Y APELLIDOS]]></text>
</staticText>
<genericElement>
<reportElement mode="Transparent" x="0" y="0" width="0" height="38">
<property name="controlParameter" value="true"/>
</reportElement>
<genericElementType namespace="http://jasperreports.sourceforge.net/jasperreports" name="sort"/>
<genericElementParameter name="sortColumnName">
<valueExpression><![CDATA["TS8_NOMBRE_APELLIDOS_6"]]></valueExpression>
</genericElementParameter>
<genericElementParameter name="sortColumnType">
<valueExpression><![CDATA["Field"]]></valueExpression>
</genericElementParameter>
<genericElementParameter name="sortHandlerHorizontalAlign">
<valueExpression><![CDATA["Right"]]></valueExpression>
</genericElementParameter>
<genericElementParameter name="sortHandlerVerticalAlign">
<valueExpression><![CDATA["Middle"]]></valueExpression>
</genericElementParameter>
</genericElement>
</jr:columnHeader>
<jr:detailCell style="table_TD" height="20" rowSpan="1">
<textField>
<reportElement x="4" y="0" width="127" height="20"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{TS8_NOMBRE_APELLIDOS_6}]]></textFieldExpression>
</textField>
</jr:detailCell>
</jr:column>
</jr:table>
</componentElement>
Creación del fichero de Reglas
Para la creación de ficheros de reglas se han usado las tecnologías estándar que facilitan la creación de nuevos ficheros de validación. Se describen a continuación:
- JBoss Drools: es un sistema de gestión de reglas de negocio (BRMS, business rule management system) con un motor de reglas basado en inferencia de encadenamiento hacia adelante (forward chaining), más correctamente conocido como sistema de reglas de producción, usando una implementación avanzada del algoritmo Rete.
El fichero de reglas final se insertará en la Base de Datos, en el campo INFO_DRL de la tabla TIPO_SOLICITUD_TEMPLATE; en el registro correspondiente a la nueva solicitud. Esta acción se debe realizar posteriormente a la creación del registro indicado en el apartado Plantilla del tipo de solicitud. Se debe crear un fichero de reglas por cada tipo de solicitud.
Creación
Se deben seguir los siguientes pasos:
- Crear el fichero "nuevas_reglas.drl"
2. importar las clases que se necesitan. Estas son las clases más usadas en la mayoría de reglas.
import java.util.Map;
import java.util.List;
import es.cicsl.app.validation.rules.FieldFact;
import es.cicsl.app.validation.rules.RowFact;
import es.cicsl.app.validation.functions.NifCifValidator;
import es.cicsl.app.validation.functions.NifNieValidator;
global es.cicsl.app.service.utils.validador.ValidadorMensajes vm;
3. Construcción de reglas, estas principalmente son de 3 tipos: (
a. Campos obligatorios
b. Campos con formato (Documento de identidad, e-mail, Código Postal, Teléfono)
c. Campos con relación
Se recomienda que las reglas tengan el patrón siguiente:
rule "X - Y - O"
[Prioridad]
when
[Condiciones]
then
[Acciones]
end
X = Número del apartado al que pertenece la validación
Y = Nombre del campo en el HTML
O = Contador opcional respecto a más de una regla por registro (input)
Ejemplo:
rule "1 - NOMBRE_RAZON_INT"
salience 99
when
$list: List()
$campo : FieldFact(name=="NOMBRE_RAZON_INT", value == null || value == "") from $list
then
vm.addMessage("El nombre o razón social de la empresa de trabajo temporal es obligatorio.");
end
Esta regla afecta al campo NOMBRE_RAZON_INT, y según su condición obliga al campo que no esté vacio.
Regla de Campo obligatorio
Esta regla valida que el campo Número de documento sea de tipo obligatorio.
rule "1 - NUM_DOC_1"
salience 99
when
$list: List()
$campo : FieldFact(name=="NUM_DOC_1", value == null || value == "") from $list
then
vm.addMessage("El número de documento de la empresa es obligatorio.");
end
Regla de Campo con formato
Regla para Formato de Documento de identidad
Esta regla valida que el número de documento cumpla con el formato adecuado y además sea un número correcto.
rule "1 - NUM_DOC_1 - 2"
salience 98
when
$list: List()
$campo : FieldFact(name=="NUM_DOC_1", value != null, value != "") from $list
not(eval(NifCifValidator.validateNifCif($campo.getValue().toString())))
not(eval(NifNieValidator.validateNifNie($campo.getValue().toString())))
then
vm.addMessage("El número de documento de la empresa no es correcto.");
end
Regla para Formato de Código postal.
Esta regla valida que sólo se admitan cinco dígitos como valores correctos.
rule "1 - DIR_CP_INT - 2"
salience 92
when
$list: List()
$campo : FieldFact(name=="DIR_CP_INT", value != null, value != "",
value not matches "
d{5}") from $list
then
vm.addMessage("El código postal de la empresa no es correcto.");
end
Regla para Formato de Teléfono.
Esta regla valida que sólo se admitan dígitos como valores correctos, ya sean de 2 o más dígitos.
rule "1 - DIR_TELF_INT - 2"
salience 90
when
$list: List()
$campo : FieldFact(name=="DIR_TELF_INT", value != null, value != "",
value not matches "d*") from $list
then
vm.addMessage("El teléfono de la empresa no es correcto.");
end
Regla para Formato de Correo electrónico:
Esta regla valida que ingresen e-mails con el formato correcto.
rule "1 - EMAIL_1"
salience 89
when
$list: List()
$campo : FieldFact(name=="EMAIL_1",
value != null, value != "",
value not matches "[a-zA-Z0-9_.-]+@{1}[a-zA-Z0-9]+.{1}[a-zA-Z]+") from $list
then
vm.addMessage("El email de la empresa no es correcto.");
end
Regla de Campos con relación
Esta regla valida que el Número de trabajadores Hombres más el Número de trabajadores Mujeres sea igual al Número total
rule "2 - NUM_TRABAJADORES_H - NUM_TRABAJADORES_M - NUM_TRABAJADORES_TOT"
salience 66
when
$list: List()
$campoH : FieldFact(name=="NUM_TRABAJADORES_H", value != null) from $list
$campoM : FieldFact(name=="NUM_TRABAJADORES_M", value != null) from $list
$campoT : FieldFact(name=="NUM_TRABAJADORES_TOT", value != null) from $list
$numH : Long() from $campoH.getValue()
$numM : Long() from $campoM.getValue()
$suma : Long() from $numH + $numM
$numT : Long() from $campoT.getValue()
eval($numT.longValue() != $suma.longValue())
then
vm.addMessage("El número de trabajadores totales no es correcto.");
end
Reglas del Anexo 4.2 - Rules_4.drl
Base de datos
Hay una serie de registros que son necesarios añadir en la base de datos a la hora de crear un nuevo tipo de solicitud. Debido a las dependencias existentes, es necesario realizar la inserción de los registros de forma ordenada
Las tablas de la base de datos que intervienen se muestran en el siguiente esquema:
Asignación de Identificadores
para la asignación de identificadores de las tablas actuaremos de la siguiente forma:
TIPO_SOLICITUD: para el campo id_tipo_solicitud se deberá solicitar un identificador de tipo_solicitud al responsable de REC. A modo de ejempplo supongamos que indica el valor 15.
TIPO_SOLICITUD_TEMPLATE: al campo id_tipo_solicitud_template le asignaremos el mismo valor que asignamos al campo id_tipo_solicitud (15 en nuestro ejemplo). En principio un tipo de solicitud no tendrá más de un juego de plantillas.
TIPO_CAMPO: al campo id_tipo_campo le asignaremos un valor xxxyyy donde
xxx representa 2 o más dígitos el nº de solicitud en nuestro caso el 15
yyy un secuencial de 1 a n para cada campo del tipo de solicitud. En principio estimamos que un formulario no tendrá más de 1000 campos
continuando con el ejemplo 15001, 15002, ......
TIPO_SOLICITUD_X_TIPO_CAMPO: para la asignación de la pk id_tipo_solicitud_x_tipo_campo utilizaremos la misma lógica que en el caso anterior, le asignaremos un valor xxxyyy donde:
xxx representa 2 o más digitos el nº de solicitud en nuestro caso el 15
yyy un secuencial de 1¿n para cada campo que deseemos vincular.
En nuestro ejemplo van desde 15001, 15002, .....
De esta forma cuando se vaya a desarrollar un formulario,a partir del identificador indicador por el responsable de Rec, la empresa puede crear el script de base de datos que debe presentar con el resto de documentos y fuentes requeridos para el despliegue de formularios.
Tipo de solicitud
El primer registro que se debe insertar es el correspondiente al tipo de solicitud, en la tabla TIPO_SOLICITUD, en el cual tendremos que incluir el identificador del nuevo tipo de solicitud y el nombre de la misma.
Aspectos a tener en cuenta:
- El ID_TIPO_SOLICITUD debe ser único.
- El NOMBRE no debe superar los 100 caracteres.
Sentencia SQL:
INSERT INTO TIPO_SOLICITUD (ID_TIPO_SOLICITUD, NOMBRE)
VALUES (8, 'Acta de elección de delegados');
Plantilla del tipo de solicitud
Una vez determinado el identificador del nuevo tipo de solicitud, es necesario indicar cuáles serán las plantillas asociadas.
Para ello debemos incluir un registro en la tabla TIPO_SOLICITUD_TEMPLATE donde tenemos que incluir un identificador de las plantillas del nuevo tipo de solicitud y el identificador del tipo de solicitud utilizado en el primer paso.
Aspectos a tener en cuenta:
- El ID_TIPO_SOLICITUD_TEMPLATE debe ser único.
- El ID_TIPO_SOLICITUD debe hacer referencia a un tipo de solicitud existente.
- Inicialmente solo asociamos ambos identificadores y de forma posterior se realizará un update con la información de las plantillas de edición, de visualización y de pdf en formato BLOB. Estas plantillas serán proporcionadas al departamento de CPD que son los encargados de realizar la actualización en la base de datos.
Sentencia SQL
INSERT INTO TIPO_SOLICITUD_TEMPLATE (ID_TIPO_SOLICITUD_TEMPLATE, ID_TIPO_SOLICITUD)
VALUES (8,8);
Nuevos campos
El tercer paso es crear un registro por cada campo del formulario. Para ello se deben realizar inserciones en la tabla TIPO_CAMPO.
Aspectos a tener en cuenta:
- El ID_TIPO_CAMPO debe ser único.
- El NOMBRE no debe superar los 100 caracteres y seguira la siguiente nomenclatura DirGeneral_Formulario_NombreCampo por ejemplo DGT_Menores_HORA_COMIENZO hace referencia al campo hora de comienzo del formulario de menores de la direccion general de trabajo.
- El DOMINIO no debe superar los 10 caracteres. En principio el dominio siempre será "VARCHAR"
- El FORMATO no debe superar los 50 caracteres.
- La MASCARA no debe superar los 200 caracteres.
- La LABEL no debe superar los 100 caracteres.
Sentencias SQL
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (801,'TS8_NUM_ACTA_0','VARCHAR', null, null, 'Número acta');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (802,'TS8_NUM_ORDEN_0','VARCHAR', null, null, 'Número orden');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (803,'TS8_FECHA_VOTACION_0','VARCHAR', null, null, 'Fecha votación');
Campos de la tabla dinámica
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (824,'TS8_TABLA_6','VARCHAR', null, null, 'Tabla delegados');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (825,'TS8_DNI_6','VARCHAR', null, null, 'DNI');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (826,'TS8_NOMBRE_APELLIDOS_6','VARCHAR', null, null, 'Nombre apellidos');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (827,'TS8_ORG_SINDICAL_6','VARCHAR', null, null, 'Organización sindical');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (828,'TS8_SEXO_6','VARCHAR', null, null, 'Sexo');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (829,'TS8_FECHA_NACIMIENTO_6','VARCHAR', null, null, 'Fecha nacimiento');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (830,'TS8_ANTIGUEDAD_6','VARCHAR', null, null, 'Antiguedad');
INSERT INTO TIPO_CAMPO (ID_TIPO_CAMPO, NOMBRE, DOMINIO, FORMATO, MASCARA, LABEL)
VALUES (831,'TS8_VOTOS_6','VARCHAR', null, null, 'Votos');
Asociación del nuevo campo con el nuevo tipo de solicitud
Una vez definidos los nuevos campos, hay que asociarlos al nuevo tipo de solicitud a través de la tabla
TIPO_SOLICITUD_X_TIPO_CAMPO.
Aspectos a tener en cuenta:
- El ID_TIPO_SOLICITUD_X_TIPO_CAMPO debe ser único.
- El ID_TIPO_CAMPO debe hacer referencia a un campo existente.
- El ID_TIPO_SOLICITUD debe hacer referencia a un tipo de solicitud existente.
- El DISCRIMINATOR puede ser: CAMPO, CHECKBOXGROUP, COLUMNA, TABLA
- El ORDEN solo se utiliza cuando DISCRIMINATOR = 'COLUMNA' para la colocación de las columnas de la tabla. En caso de otro DISCRIMINATOR se pone a 0.
Sentencias SQL
Formulario simple
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN)
VALUES (8801,801,8,'CAMPO',0);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN)
VALUES (8802,802,8,'CAMPO',0);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN)
VALUES (8803,803,8,'CAMPO',0);
Tabla dinámica
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN)
VALUES (8824,824,8,'TABLA',0);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN)
VALUES (8825,825, 8,'COLUMNA',1,8824);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN, ID_PADRE)
VALUES (8826,826, 8,'COLUMNA',1,8824);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN, ID_PADRE)
VALUES (8827,827, 8,'COLUMNA',1,8824);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN, ID_PADRE)
VALUES (8828,828, 8,'COLUMNA',1,8824);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO,ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN, ID_PADRE)
VALUES (8829,829, 8,'COLUMNA',1,8824);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN, ID_PADRE)
VALUES (8830,830, 8,'COLUMNA',1,8824);
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO, ID_TIPO_CAMPO, ID_TIPO_SOLICITUD, DISCRIMINATOR, ORDEN, ID_PADRE)
VALUES (8831,831, 8,'COLUMNA',1,8824);
Validación de cada campo en cada tipo solicitud
Por último es necesario asociar la validación que se aplicará en cada campo de cada tipo de solicitud.
Este registro se insertará en la tabla TIPO_SOLICITUD_VALIDACION.
Aspectos a tener en cuenta:
- El ID_TIPO_SOLICITUD debe hacer referencia a un tipo de solicitud existente.
- El ID_TIPO_CAMPO debe hacer referencia a un campo existente.
- El ID_TIPO_VALIDACION hacer referencia a un tipo de validación existente. Los tipos son:
o 15 OBLIGATORIO
o 16 FECHA
o 17 NUMERICO
o 18 LONGITUD_MAXIMA
o 19 LONGITUD_MINIMA
o 20 FORMATO
o 21 DECIMAL
Sentencias SQL
Formulario simple
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)VALUES (8,803,16,'dd/MM/yyyy',null,null);
Tabla dinámica
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)
VALUES (8,826,15, null, null,null);
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)
VALUES (8,827,15, null, null,null);
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)
VALUES (8,828,15, null, null,null);
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)
VALUES (8,829,16,'dd/MM/yyyy',null,null);
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)
VALUES (8,830,17, null, null,null);
INSERT INTO TIPO_SOLICITUD_VALIDACION (ID_TIPO_SOLICITUD, ID_TIPO_CAMPO, ID_TIPO_VALIDACION, FORMATO, LONGITUD, EXPRESION)
Consideraciones especiales
Inserción automática del interesado y/o representante
Para conseguir que se incluyan automáticamente los datos cuando accedemos con un certificado hay que utilizar una serie de nombres de campos ya existentes para que el sistema incluya automáticamente la información correspondiente en la solicitud. Al crear un formulario que obtenga datos del certificado en sesión, se reutilizaran las variables ya creadas en los diferentes tipos de archivos (edit, view, jrxml, y .drl).
Vinculación de variables existentes (campos del certificado o un documento de identidad) a un nuevo formulario:
Campos del interesado:
Nombre del Campo Id_tipo_campo
NIF_SOLICITANTE 150
APELLIDO1_INT 151
APELLIDO2_INT 152
NOMBRE_RAZON_INT 153
Campos del representante:
Nombre del Campo Id_tipo_campo
NIF_REP 168
APELLIDO1_REP 169
APELLIDO2_REP 170
NOMBRE_RAZON_REP 171
Crear un formulario:
INSERT INTO TIPO_SOLICITUD (ID_TIPO_SOLICITUD, NOMBRE) VALUES ('x', `y¿);
x = identificador del formulario
y= nombre descriptivo del formulario.
Vincular campos:
Vincular los campos reutilizables que se requieran en el nuevo formulario.
Ejemplo:
En un nuevo formulario creado con un id = 20 se requiere usar el campo NIF_SOLICITANTE y NOMBRE_RAZON_INT.
--vincula formulario (20) con campo (150)
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO,ID_TIPO_SOLICITUD,ID_TIPO_CAMPO, DISCRIMINATOR,ORDEN) VALUES (20150,20,150,'CAMPO',0);
--vincula formulario (20) con campo (153)
INSERT INTO TIPO_SOLICITUD_X_TIPO_CAMPO (ID_TIPO_SOLICITUD_X_TIPO_CAMPO,ID_TIPO_SOLICITUD,ID_TIPO_CAMPO, DISCRIMINATOR,ORDEN) VALUES (20153,20,153,'CAMPO',0);
De esta forma se pueden vincular todos los campos reutilizables en los nuevos formularios con sólo saber el ID_TIPO_CAMPO y el ID_TIPO_SOLICITUD.
En los archivos de tipo Edit
Campos del Interesado:
NIF_SOLICITANTE
NOMBRE_RAZON_INT
APELLIDO1_INT
APELLIDO2_INT
Campos del Representante
NOMBRE_RAZON_REP
APELLIDO1_REP
APELLIDO2_REP
NIF_REP
Código:
<tr>
<td>
<label for="NIF" id="label_NIF">Núm (NIF,CIF,NIE,...)</label><br>
<input type="text" style="width: 100%;" value="$NIF_SOLICITANTE__value" name="NIF_SOLICITANTE" id="NIF_SOLICITANTE" $FORM_MODO_PRESENTACION_CAMPOS_PRESENTADOR/>
</td>
<td colspan="2">
<label for="plat_NOMBRE_RAZON_INT" id="label_NOMBRE_RAZON_INT">Razón Social o Nombre</label><br/>
<input type="text" style="width: 100%;" value="$NOMBRE_RAZON_INT__value" name="NOMBRE_RAZON_INT" id="NOMBRE_RAZON_INT" $FORM_MODO_PRESENTACION_CAMPOS_INT/>
</td>
</tr>
<tr>
<td colspan="3">
<label for="plat_APELLIDO1_INT" id="label_APELLIDO1_INT">Primer Apellido</label><br/>
<input type="text" style="width: 100%;" value="$APELLIDO1_INT__value" name="APELLIDO1_INT" id="APELLIDO1_INT" $FORM_MODO_PRESENTACION_CAMPOS_INT/>
</td>
<td colspan="2">
<label for="plat_APELLIDO2_INT" id="label_APELLIDO2_INT">Segundo Apellido</label><br/>
<input type="text" style="width: 100%;" value="$APELLIDO2_INT__value" name="APELLIDO2_INT" id="APELLIDO2_INT" $FORM_MODO_PRESENTACION_CAMPOS_INT/>
</td>
</tr>
Resultado:
Detalles:
- Para mostrar el valor del certificado se debe cumplir el patrón: $(nombreVariable)__value; ya sea dentro de una caja de texto o después de un label.
- El campo NIF_SOLICITANTE se define de la siguiente forma:
<td>
<label for="NIF" id="label_NIF">Núm (NIF,CIF,NIE,...)</label><br>
<input type="text" style="width: 100%;" value="$NIF_SOLICITANTE__value" name="NIF_SOLICITANTE" id="NIF_SOLICITANTE" $FORM_MODO_PRESENTACION_CAMPOS_PRESENTADOR/>
</td>
La etiqueta $FORM_MODO_PRESENTACION_CAMPOS_PRESENTADOR, se incluirá sólo en el campo NIF_SOLICITANTE.
- La forma de evitar que se modifique los valores, es agregar la etiqueta: ¿$FORM_MODO_PRESENTACION_CAMPOS_INT¿ en los input, así se le da un estilo para diferenciar de otros campos y se vuelve un campo de sólo lectura.
- Y de la misma forma para mostrar los datos del representante, pero cambiando las variables
(NOMBRE_RAZON_REP, APELLIDO1_REP, APELLIDO2_REP y NIF_REP)
En los archivos de tipo View
Código: variables (NOMBRE_RAZON_INT, NIF_SOLICITANTE, APELLIDO1_INT, APELLIDO2_INT)
<tr>
<td colspan="2" style="width:50%;"><label for="plat_NOMBRE_RAZON_INT" id="label_NOMBRE_RAZON_INT">Nombre o razón social</label><br/>$NOMBRE_RAZON_INT__value</td>
<td style="width:10%;"><label for="plat_NIF_SOLICITANTE" id="label_NIF_SOLICITANTE">NIF,CIF</label><br/>$NIF_SOLICITANTE__value</td>
<td colspan="2"><label for="plat_CC_SS_1" id="label_CC_SS_1">C.C. Seguridad Social</label><br/>$CC_SS_1__value</td>
</tr>
<tr>
<td colspan="3"><label for="plat_APELLIDO1_INT" id="label_APELLIDO1_INT">Primer Apellido</label><br/>$APELLIDO1_INT__value</td>
<td colspan="3"><label for="plat_APELLIDO2_INT" id="label_APELLIDO2_INT">Segundo Apellido</label><br/>$APELLIDO2_INT__value</td>
</tr>
Resultado:
Detalles:
¿ Para mostrar el valor del certificado se debe cumplir el patrón: $(nombreVariable)__value
¿ Y de la misma forma para mostrar los datos del representante, pero cambiando las variables
(NOMBRE_RAZON_REP, APELLIDO1_REP, APELLIDO2_REP y NIF_REP)
En los archivos de tipo JRXML y Reglas
Los nombres de los campos:
Campos del Interesado:
Campos del Representante
NIF_SOLICITANTE
NOMBRE_RAZON_INT
APELLIDO1_INT
APELLIDO2_INT NOMBRE_RAZON_REP
APELLIDO1_REP
APELLIDO2_REP
NIF_REP
Que se usen en la plantilla (archivo).jxml, previa a generar el (archivo).jasper, deben ingresarse como parámetros (IReport).
Requisito:
- Compilar con el JDK 1.6.
Ejemplo de reglas:
- Regla para que el nombre del interesado sea un campo obligatorio.
- El nombre de la regla utiliza como formato el nombre de la variable reutilizable
- La condición evalúa si cumple a partir de la variable reutilizable.
rule "1 - NOMBRE_RAZON_INT"
salience 100
when
$list: List()
$campo : FieldFact(name=="NOMBRE_RAZON_INT", value == null || value == "") from $list
then
vm.addMessage("El nombre o razón social de la empresa de trabajo temporal es obligatorio.");
end
NOTA: algunos los textos de los campos salen en modo difuminado, por ser datos reales. Cuando se muestre un formulario los textos saldrán de forma normal.
REFERENCIAS
- Velocity: http://velocity.apache.org/
- JQuery: http://jquery.com/
- JasperReports: http://www.jaspersoft.com/
- iReport: http://www.jaspersoft.com/
- Tutorial: http://jasperforge.org/uploads/publish/ireportwebsite/IR%20Website/ir_documentation.html
ANEXOS
Se adjuntan los siguientes anexos:
Plantillas del ejemplo
A continuación se adjuntan las plantillas de visualización implementada para el tipo de solicitud 8, ACTA DE
ELECCION DE DELEGADOS DE PREVENCION.
Plantilla de edición
Plantilla de visualización
Plantilla de impresión
Scripts de base de datos del ejemplo
A continuación se adjunta el script de base de datos con todos los registros necesarios para dar de alta el tipo de
solicitud 8, ACTA DE ELECCION DE DELEGADOS DE PREVENCION.