<?xml version="1.0" encoding="ISO-8859-1"?>

<chapter id="personalizacion" role="periodo" userlevel="p2">
	<title>Personalización</title>
  <highlights role="logros">
  <itemizedlist>
	  <listitem role="logro" id="logro4"><para>Modifica tablas básicas.
	  </para></listitem>
	  <listitem role="logro" id="logro5"><para>Aprovecha lo disponible.
	  </para></listitem>
  </itemizedlist>
  </highlights>

  <para>SIVeL puede personalizarse para adaptarse mejor a su proyecto,
	  al menos de 4 formas: 
	  <itemizedlist>
		  <listitem>
			  <para>Configurando detalles de la interfaz (i.e
				  la presentación que ven los usuarios finales 
				  cuando abren SIVeL en un navegador).</para>
		  </listitem>
		  <listitem>
			  <para>Modificando tablas básicas para que 
				  reflejen mejor los datos de su proyecto (por 
				  ejemplo las posibles profesiones de las 
				  víctimas, los posibles sectores sociales 
				  e incluso la tipificación de violencia).</para>
		  </listitem>
		  <listitem>
			  <para>Empleando campos existentes que su proyecto 
				  no requiere para representar otros que si 
				  requiere.  Por ejemplo si su proyecto 
				  requiere especificar etnia 
				  de una víctima, más que el sector social
				  al que pertenece, puede emplear el campo
				  sector social y adaptar la tabla para
				  que tenga justamente las etnias posibles.
			  </para>
		  </listitem>
		  <listitem>
			  <para>Modificando fuentes.  Lo cual es plenamente
				  legal --aunque nos alegraría mucho que
				  compartiera sus cambios en la lista
				  <email>sivel-desarrollo@lists.sourceforge.net</email>.
			  </para>
		  </listitem>
	  </itemizedlist>

  </para>

  <sect1 id="tablas-basicas">
	  <title>Tablas básicas</title>
      <highlights role="logros">
        <itemizedlist>
		<listitem role="indicador" id="logro4.ind1"><para>Puede ver y editar información disponible en tablas básicas</para></listitem>
		<listitem role="indicador" id="logro4.ind2"><para>Puede añadir o eliminar registros a tablas básicas</para></listitem>
        </itemizedlist>
       </highlights>

       <para>Es la forma más directa de personalización como se explica
	       en la sección correspondiente 
	       (ver <xref linkend="tablasbasicas"></xref>).
 </para>
    </sect1>

    <sect1 id="detalles-interfaz">
	    <title>Detalles de la interfaz de usuario</title>
	    <para>
		    El logo que se presenta en el fondo puede remplazarse,
		    se trata del archivo 
		    <filename>imagen/FondoSecc.jpg</filename>
		    de las fuentes de SIVeL.    Los estilos empleados pueden
		    configurarse en la hoja <literal>estilo.css</literal>.
	    </para>
	    <para> La única página que no requiere autenticación es
		    <filename>consulta_web.php</filename><footnote><para>Aunque
				    si ingresa un usuario autenticado del rol apropiado
				    puede mostrar más opciones</para></footnote> que puede habilitar
		    para que los casos de su organización sean consultados
		    desde el web.   Por seguridad, se recomienda que la base 
		    pública sea una segunda base, copia de la información 
		    pública de la base real.
	    </para>
	    <para>Algunos detalles de la interfaz también pueden
		    configurarse en variables del archivo
		    <filename>aut/conf.php</filename>.  A continuación
		    se listan las variables de configuración, algunas
		    se tratan en detalle en las siguientes secciones:
		    <variablelist>
			    &varconfphp;
		    </variablelist> 
	    </para>
    </sect1>


    <sect1 id="casos-personalizacion">
	    <title>Casos de personalización reinterpretando</title>
	    <para>
		    Algunos  nombres en la interfaz de usuario pueden
		    cambiarse desde un sólo sitio para que una organización
		    pueda reinterpretar uno o más campos típicos de SIVeL
		    (aunque no es lo más recomendable si se piensa en
		    compartir información con otras organizaciones que empleen
		    SIVeL).
		</para> 
		<para>Lo que queremos decir con reinterpretar posiblemente
			se entienda con un ejemplo: En una organización 
			donde se registran casos relacionados con 
			iglesias, se prefirió emplear la tabla filiación 
			política para registrar la iglesia de la víctima.
		</para>
		<para>En tal caso basta editar valores de la variable
			<literal>etiqueta</literal> del archivo
			<filename>aut/conf.php</filename>.  Este archivo
			está organizado en el mismo orden de las pestañas
			de la ficha de captura. Para el ejemplo
			mencionado bastaría añadir datos con iglesias
			a la tabla básica Filiación, deshabilitar los
			originales y cambiar la línea:
			<screen>
'filiacion'=> 'Filiación política',
			</screen>
			por
			<screen>
'filiacion'=> 'Iglesia',
			</screen>
		</para>
    </sect1>


    <sect1 id="modificaciones-fuentes">
	    <title>Modificaciones a las fuentes</title>
	    
	    <para>Aunque modificar las fuentes de SIVeL, como con cualquier otro
	proyecto requiere previo estudio de estas, algunos detalles facilitarán
	la labor: se emplean estándares de programación de Pear; se cuenta
	con pruebas de regresión que facilitan la detección de errores que 
	podrían introducirse al modificar las fuentes; se emplean librerías
	estándares de Pear (resaltamos 
	<filename>DB_DataObject_FormBuilder</filename>).
	</para>

	<sect2 id="estandares">
		<title>Estándares de programación</title>
		<para>En cuanto a base de datos se emplea SQL estándar.
			Para las partes en PHP se emplean estándares de PEAR 
			(ver <xref linkend="pearcs"></xref>)
			que se verifican parcialmente 
			con la herramienta <literal>phpcs</literal>
			del paquete PHP_CodeSniffer (ver
			<xref linkend="phpcs"></xref>), la cual 
			una vez instalada puede ejecutarse con:
			<screen>
herram/estandares.sh
			</screen>
			Los errores quedarán en el archivo <filename>/tmp/e</filename>
	</para>
	</sect2>
	
	<sect2 id="documentacion-tecnica">
	    <title>Documentación técnica</title>
	    <para>Siguiendo el estándar adoptado para PHP, las fuentes 
		    incluyen comentarios que permiten 
		    generar documentación técnica con la herramienta 
		    <literal>phpdoc</literal> (ver <xref linkend="phpdoc"></xref>).  
		    Se genera con:
		    <screen>
make tecdoc
		    </screen>
		    El resultado queda en el directorio <filename>tdoc</filename> o puede consultarse en
		    <ulink url="&URLSITE;/tec/"/>.
	    </para>
    </sect2>

	<sect2 id="base-de-datos">
	    <title>Base de Datos</title>
	    <para>En cuanto a base de datos la estructura en SQL (ver <xref linkend="sqlpost"></xref>) está en el archivo <filename>estructura.sql</filename>
		    y los datos iniciales en archivos con nombres de la forma 
		    <filename>datos-*.sql</filename>.   A continuación se incluye un grafo extaido de
		    <filename>estructura.sql</filename> y generado
		    con GraphViz (ver <xref linkend="graphviz"></xref>).
	    </para>
<informalfigure>
	<screenshot><mediaobject><imageobject>
	<imagedata fileref="estructura.eps" format="EPS" scale="40" align="center"></imagedata></imageobject>
	<imageobject><imagedata fileref="estructura.png" format="PNG" align="center"></imagedata></imageobject>
	<textobject><phrase>Estructura de la Base de Datos</phrase></textobject></mediaobject>
	</screenshot>
  </informalfigure>

    </sect2>
		    <sect2 id="interfaz">
			    <title>Interfaz</title>
<para>
	La interfaz se desarrolló en PHP (ver <xref linkend="php"></xref>) 
	empleando diversas librerías de Pear (ver <xref linkend="pear"></xref>),
       	entre las que destacamos:
	<variablelist>
		<varlistentry><term><literal>DB_DataObject_FormBuilder</literal></term>
			<listitem>
				<para>Que permite generar formularios 
					semiautomáticamente a partir de 
					objetos 
					<literal>DB_DataObject</literal> 
					empleando algún 
					sistema de presentación como
					<literal>HTML_QuickForm</literal>
				 (ver
				 <xref linkend="dbdataobjectformbuilder"></xref>).
			 </para>
			</listitem>
		</varlistentry>
		<varlistentry><term><literal>DB_DataObject</literal></term>
			<listitem>
				<para>Que abstrae una base de datos SQL,
					identificando tablas con clases y
					registros con objetos
				 (ver
				 <xref linkend="dbdataobject"></xref>).
			      	</para>
			</listitem>
		</varlistentry>
	</variablelist>
</para>
<para>Se empleo programación orientada a objetos, las clases y su jerarquía
	pueden verse en la documentación técnica (ver
	<xref linkend="documentacion-tecnica"></xref>) 
</para>
    </sect2>

		    <sect2 id="modificaciones-ficha">
<title>Modificaciones a la ficha de captura</title>

<para>
	Modificar la ficha de captura es posiblemente la operación más 
	compleja en las fuentes de SIVeL, pues
	puede requerir cambiar la estructura de la base de datos, cambiar
	la forma de las búsquedas, los reportes y los conteos.   El diseño
	actual de SIVeL permite hacer varios cambios al formulario
	de captura con relativa facilidad así como añadir tablas
	básicas y que las búsquedas por Consulta Externa operen sobre 
	nuevos datos añadidos a la ficha. Para esto tenga en cuenta:
	<itemizedlist>
		<listitem>
			<para>El único dato indispensable para abrir un caso
				es la fecha.  Para agregar un presunto 
				responsable requiere una clasificación de
				violencia.  Para agregar una víctima requiere
				clasificación de violencia y presunto
				responsable.</para>
		</listitem>
		<listitem>
			<para>Considere nuevos datos que se pondrán 
				y su ubicación.</para>
		</listitem>
		<listitem>
			<para>Modifique el modelo de datos para dar espacio a 
				nuevos datos, preferiblemente en una nueva
			       tabla o en su defecto en una tabla 
			       existente.   			</para>
		</listitem>

	</itemizedlist>
	
	Se sugiere que los cambios que deban hacerse a la base se especifiquen
	en SQL en un script nuevo (digamos 
	<filename>miorganizaion.sql</filename>) que 
	pueda ejecutarse después
	de crear la base típica de SIVeL (i.e procurar
	no modificar 
	<filename>estructura.sql</filename>).  También
	se sugiere no eliminar campos ni tablas de
	la base de datos, sino más bien no hacerlos
	visibles en la interfaz.
</para>
<para>

	Si requiere agregar una nueva tabla  tenga en cuenta:
	<itemizedlist>
		<listitem>
			<para>Agregar definición en 
				<filename>miorganizacion.sql</filename> y
				ejecutar con <filename>bin/psql.sh</filename>.
			</para>
		</listitem>
		<listitem>
			<para>Agregar alfabéticamente definición de tabla 
				y llaves en <filename>sivel.ini</filename> e 
				integridad referencial 
				en <filename>sivel.links.ini</filename> --en 
				el primero los códigos resultan de la
				suma de:
				<screen>
128 NOT NULL
1 INTEGER
2 VARCHAR o TEXT
4 DATE
8 TIME
16 BOOLEAN
32 LOG TEXT
64 BLOB
				</screen>
		
			</para>
		</listitem>
		<listitem>
			<para>Crear archivo con datos de tabla como 
				descendiente de DB_DataObject, el nombre 
				debe ser el mismo de la tabla primera letra 
				mayúscula y demás minúsculas.  Esta clase
				deberá tener toda la información necesaria
				para editar información de la tabla desde
				el menú tablas básicas (uno simple para 
				emplear como plantilla es 
				<filename>Escrito_caso.php</filename>)
			</para>
		</listitem>			
		<listitem>
			<para>Si efectivamente la tabla agregada es
				una tabla básica agregar referencia en la
				variable <literal>tablas_basicas</literal>
				en el archivo <filename>aut/conf.php</filename>
			</para>
		</listitem>
	</itemizedlist>
			</para>


			<para>
				Para efectuar cambios a la interfaz tener en cuenta:
				<itemizedlist>
					<listitem>
						<para>
Puede crear o modificar una pestaña, cada pestaña corresponde a un archivo de interfaz, cuyo nombre
comienza con <literal>Pag</literal> (<filename>PagMemo.php</filename> es uno simple para comenzar)
						</para>
					</listitem>
					<listitem>
						<para>
							Algunos detalles de la presentación de la información de una pestaña se determinan en las
clases que corresponden a tablas, 
y que son descendientes de <filename>DB_DataObject</filename>.  Los detalles 
por cuadrar los específica la librería 
<filename>DB_DataObject_FormBuilder</filename>.  En estas mismas clases puede 
cuadrar otros detalles con las funciones <literal>preGenerateForm</literal>
y <literal>postGenerateForm</literal> que se llaman antes y después
de generar el formulario.
						</para>
					</listitem>
					<listitem>
						<para>Si necesita agregar
o eliminar pestañas asegure que se referencian las pestañas
en el orden que se desean en la variable <literal>ficha_tabuladores</literal> 
de <filename>aut/conf.php</filename>.  Puede verse la descripción de las 
funciones por definir en <literal>PagBaseSimple</literal> 
(ver <ulink url="&URLSITE;/tec/">documentación técnica</ulink>) y como orden posible para probar después de hacer
cambios se sugiere:
<orderedlist>
	<listitem>
		<para>Vea que la interfaz sea como la espera modificando
			la constructora de la clase y
			las funciones <literal>iniVar</literal>,
			<literal>nullVar</literal>,
			<literal>formularioAgrega</literal> y
			<literal>formularioValores</literal>.</para>
	</listitem>
	<listitem>
		<para>Verifique que se procesen los datos examinando la 
			base de datos después de cambiarse de pestaña.  
			Note que tras procesar cada
			pestaña debe llamarse la función 
			<literal>funcionario_caso</literal>
		 </para>
	</listitem>
	<listitem>
		<para>Agregue instrucciones para eliminar en las funciones
			<literal>eliminaDep</literal> y
			<literal>elimina</literal>.
		</para>
	</listitem>
	<listitem>
		<para>Agregue información para búsquedas desde Consulta
			Web en la función <literal>datosBusqueda</literal>.
		</para>
	</listitem>
</orderedlist>
						</para>
					</listitem>
				</itemizedlist>
</para>
		    </sect2>
	    </sect1>

    <sect1 id="seguridad">
	    <title>Algunos lineamientos de seguridad informática</title>
	    <para>En aplicaciones web es común encontrar fallas de
		    seguridad.   Entre las causas están: debilidades
		    en las fuentes o en los programas de las que 
		    dependen, labores o procedimientos administrativos
		    insuficientes, exceso de confianza de desarrolladores,
		    adminsitradores y usuarios.  Algunos lineamientos son:

		    <itemizedlist>
			    <listitem>
				    <para>Confiar 100% en Dios y sólo en Dios.</para>
			    </listitem>
			    <listitem>
				    <para>Emplear aplicaciones de fuentes 
					    abiertas pues resultan
		    auditables y sus desarrolladores no se confian en 
		    la 'seguridad por inobservabilidad.'
				    </para>
			    </listitem>
			    <listitem>
				    <para>Preferir aplicaciones cuyos
					    desarrolladores acudan a políticas
					    de apertura total 
					    en cuanto a fallas
					    de seguridad (ver 
					    <xref linkend="aperturatotal"></xref>).
				    </para>
			    </listitem>
			    <listitem>
				    <para>Preferir aplicaciones y protocolos
					    que empleen encripción 
					    fuerte. Encriptar datos sensibles.</para>
			    </listitem>
			    <listitem>
				    <para>
		    Emplear aplicaciones que tengan bajo registro
		    de vulnerabilidades y cuyas fallan sean cerradas
		    tan pronto como son encontradas (ver <xref linkend="secunia"></xref>).
				    </para>
			    </listitem>
			    <listitem>
				    <para>
		    Mantener actualizadas fuentes, librerías, lenguajes,
		    ambientes de desarrollo y sistema operativo.  Es
		    buen hábito actualizar todo esto cada 6 meses.
				    </para>
			    </listitem>
			    <listitem>
				    <para>
					    No emplear claves fáciles. Mejor 
					    que sean palabras de más de 8
					    caracteres que no aparezcan en 
					    diccionario alguno, con 
					    mayúsculas, minúsculas,
					    números y símbolos.
				    </para>
			    </listitem>
			    <listitem>
				    <para>Documentarse sobre posibles fallas
					    de seguridad en el lenguaje
					    de programación empleado y
					    como cerrarlas.
					    Para el caso de PHP
					    puede consultarse
		    	<xref linkend="crashcourse"></xref>.  
				    </para>
			    </listitem>
			</itemizedlist>
		   
	    </para>
    </sect1>
	
</chapter>
