Estándares de desarrollo del Gobierno de Cantabria » Howtos » Cómo desarrollar un nuevo formulario electrónico (Tipo de Solicitud) en REC (Registro Electrónico Común)

Cómo desarrollar un nuevo formulario electrónico (Tipo de Solicitud) en REC (Registro Electrónico Común)

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:

  1. Plantilla de edición
    • Se utiliza HTML y Javascript.
    • Se visualiza en la web de REC.
  2. Plantilla de visualización
    • Se utiliza HTML y Javascript.
    • Se visualiza en la web de REC.
  3. 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:
    -
  1. 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:

rec1.pngrec2.pngrec3.png

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&oacute;n es requerido",
             TS8_DNI_6 : "Campo DNI de delegados/as de prevenci&oacute;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&oacute;n sindical de delegados/as es requerido",
             TS8_SEXO_6 : "Campo Sexo de delegados/as de prevenci&oacute;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&oacute;n elegidos/as es requerido",
             TS8_VOTOS_6 : "Campo Votos de delegados/as de prevenci&oacute;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.
formsimple.png
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&deg; 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&deg; 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&oacute;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:
rec3.png


    <table class="formulario" id="table4">
       <thead>
         <tr>
            <td style="width: 100%;" colspan="9">
               6.- DELEGADOS/AS DE PREVENCI&Oacute;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&Oacute;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&Ntilde;O</label>
             </td>
             <td style="width: 10%;text-align:center;">
                 <label for="plat_TS8_ANTIGUEDAD_6" id="label_TS8_ANTIGUEDAD_6">ANTIG&Uuml;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&oacute;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:

    rec4.png
    rec5.png
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">.
rec6.png

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&deg; 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&deg; 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&oacute;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.
rec7.png
El código fuente correspondiente es el siguiente:

   <table class="formulario">
      <thead>
         <tr>
            <td style="width: 100%;" colspan="7">
                6.- DELEGADOS/AS DE PREVENCI&Oacute;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&Oacute;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&Ntilde;O</label>
            </td>
            <td style="width: 10%;text-align:center;">
                <label for="plat_TS8_ANTIGUEDAD_6" id="label_TS8_ANTIGUEDAD_6">ANTIG&Uuml;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.
    rec8.pngrec9.png
    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:

  1. 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:


esquema.png

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&uacute;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&oacute;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:
rec11.png

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&uacute;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&oacute;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:

rec12.png


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).
rec13.png

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

acta_eleccion_delegados-edit.tmpl

Plantilla de visualización

acta_eleccion_delegados-view.tmpl

Plantilla de impresión

acta_eleccion_delegados.jrxml

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.
08.ACTA_ELECCION_DELEGADOS_PREV.sql

Etiquetas:
Creado por Administrator el 2014/01/14 11:42
© 2014 GOBIERNO DE CANTABRIA - AVISO LEGAL Y PROTECCIÓN DE DATOS