#!/usr/bin/perl -w

######################################
#  Ficheros que utilizamos
######################################
$script=$0; # $_[0] mejor;
$script=~s!.*/!!;
$date="19990801";

$LOG="log.txt";
$LOG_DNI="log_dni.txt";

use Pg;
use CGI;
#require CGI::Apache; 

require '/home/httpd/lib/iibwebber_lib.pl';

$ERR=-1;
$OK=1;
$NODATA=0;

my $q = new CGI; 
#my $q = new CGI::Apache; 

$dni= $q->param('nif_in');
$conforme= $q->param('user_id');

if($conforme) {
    &conformar_datos();
    exit();
}

if($q->param('nombre')) {
    &formulario_final();
    exit();
}

if ($dni) {
    &pedir_confirmar_datos();
    exit();
}

&print_initial_form();



################################################################
##
##  Comprueba que datos han sido confirmados..
##
##  SINTAXIS: &conformar_datos();
##
################################################################

sub conformar_datos() {

#    my @param=("nombre","emilio","unidad","lab","categoria","tel");
#    alt_emilio es opcional.

    open(LOG,">>$LOG");
    printf LOG "%03d %23s- ",$conforme,$q->param('nombre');

    print $q->header;

    $param{title}="Resultado de la comprobaci&oacute;n";
    print &iibweb_cabecera(*param);
#    print $q->start_html(-title=>'');

    @comprobado = $q->param('comprobado');

    if ($#comprobado == 5) {
	print LOG "OK ";
        print <<EOT;
De acuerdo, todo es correcto.
<UL>
EOT
    } else {

	foreach $i ( @comprobado ) {
	    $comprobado{$i}="on";
	}

	if (! ($comprobado{'nombre'} && $comprobado{'lab'})) {
	    print <<EOT;
Es imprescindible que los campos de nombre y laboratorio sean
correctos para darse de alta en los servicios del IIB.
<P>
Debe pasarse por secretaría para corregir sus datos. 
Intente de nuevo darse de alta cuando todo sea correcto.
EOT
            print LOG "Error: nombre y/o laboratorio\n";
            close LOG;
            exit();
	}

	print LOG "Warn: ";

	print <<EOF;
Sus datos no son correctos en la base de datos según ha indicado,
de todos modos puede proceder a pedir su nueva cuenta en el servicio
de BioInformática.
<P>
Es IMPORTANTE que siga los pasos que se le indican para corregir esta
situación:
<UL>
EOF

	if (! $comprobado{'unidad'}) {
	    print LOG "unidad ";
	    print <<EOT;
<LI>La unidad a la que pertenece no es correcta en la base de datos. Este
puede ser un problema menor. Pongase en contacto con el Servicio de
BioInformatica y expongale el problema.
<P>
EOT
	}

	if (! $comprobado{'tel'}) {
	    print LOG "telefono ";
	    print <<EOT;
<LI>El teléfoino donde localizarle no es correcto en la base de datos.
Este no es un problema grave en absoluto, pero es conveniente que baje a
Secretaría para dar su teléfono correcto.
<P>
EOT
	}

	if (! $comprobado{'categoria'}) {
	    print LOG "categoria ";
	    print <<EOT;
<LI>Su categoría parece no ser la correcta en la base de datos.
Este no es un problema grave en absoluto, pero es conveniente que baje a
Secretaría para soventar el problema.
<P>
EOT
	}


	if (! $comprobado{'emilio'}) {
	    print LOG "emilio ";
	    print <<EOT;
<LI>Baje al Servicio de BioInformática para cambiar el dato erroneo
acerca de su dirección de correo electrónico actual.
<P>
EOT
	}

    }

    if (! $q->param('alt_emilio')) {
	print LOG "*emilio_alt ";
	print <<EOT;
<LI>Si su dirección de correo electrónico alternativa no le
parece adecuada, indique en el formulario la que le parece más adecuada.
<P>
EOT
    }

    print LOG "\n";
    close LOG;

    $q->delete('user_id');
    $q->delete('comprobado');

    $url=$q->self_url();

    print <<EOT;
</UL>
Por favor imprima y complete <A HREF="$url">este formulario</A> y
paseselo al responsable de su laboratorio o servicio.
<P>
El mismo documento esta disponible en formato en <A HREF="peticion.doc">Word 6</A>
<P>
EOT

    print &iibweb_pie(*param);
#    print $q->end_html();

}

################################################################
##
##  Todo es correcto. Imprime pues el formulario para firmar..
##
##  SINTAXIS: &formulario_final();
##
################################################################


sub formulario_final() {

    print $q->header;

    print $q->start_html(-title=>'');


    my $dni=$q->param('dni');
    my $nombre=$q->param('nombre');
    my $labo=$q->param('labo');
    my $username=$q->param('username');
    my $fecha=localtime();

    print <<EOT;
<TABLE WIDTH=576 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=3 CELLSPACING=0 FRAME=VOID>
	<COL WIDTH=570>
	<TR>
		<TD WIDTH=570 VALIGN=TOP>
			<P ALIGN=CENTER><FONT FACE="Arial"><FONT SIZE=6 STYLE="font-size: 28pt">Servicio
			de BioInform&aacute;tica</FONT></FONT></P>
		</TD>
	</TR>
	<TR>
		<TD WIDTH=570 VALIGN=TOP>
			<P ALIGN=CENTER><FONT FACE="Arial"><FONT SIZE=6 STYLE="font-size: 28pt">Petici&oacute;n
			de cuenta.</FONT></FONT></P>
		</TD>
	</TR>
</TABLE>
<P><FONT FACE="Arial"><FONT SIZE=3>Los datos necesarios para la
creaci&oacute;n de la nueva cuenta son:</FONT></FONT></P>
<TABLE WIDTH=576 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=3 CELLSPACING=0>
	<COL WIDTH=366>
	<COL WIDTH=196>
	<TR VALIGN=TOP>
		<TD WIDTH=366 BGCOLOR="#dfdfdf">
			<P><FONT FACE="Arial"><FONT SIZE=3>Nombre y apellidos del
			usuario/a:</FONT></FONT></P>
		</TD>
		<TD WIDTH=196 BGCOLOR="#dfdfdf">
			<P><FONT FACE="Arial"><FONT SIZE=3>D.N.I. o pasaporte:</FONT></FONT></P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=366>
			<P>
EOT
    print "($username)" if $username;
    print <<EOT;
                        $nombre<BR>
			</P>
		</TD>
		<TD WIDTH=196>
			<P>$dni<BR>
			</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=366 BGCOLOR="#dfdfdf">
			<P><FONT FACE="Arial"><FONT SIZE=3>Fecha de cancelaci&oacute;n (si
			hubiere):</FONT></FONT></P>
		</TD>
		<TD WIDTH=196 BGCOLOR="#dfdfdf">
			<P><FONT FACE="Arial"><FONT SIZE=3>Laboratorio:</FONT></FONT></P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=366>
			<P><BR>
			</P>
		</TD>
		<TD WIDTH=196>
			<P>$labo<BR>
			</P>
		</TD>
	</TR>
</TABLE>
EOT

    if (! $q->param('alt_emilio')) {
	print <<EOT;
<FONT FACE="Arial"><FONT SIZE=2>
Indique también la dirección de correo alternativa:
</FONT>
EOT
    }

    print <<EOT;
<P>
<FONT FACE="Arial"><FONT SIZE=3>
Como usuario/a de este Servicio, se compromete a:</P>
<UL>
	<LI>Hacer un correcto uso de la
	cuenta y los recursos disponibles, no incurriendo en ning&uacute;n
	caso en pr&aacute;cticas il&iacute;citas, abusivas, irrespetuosas o
	comerciales.
	<LI>Colaborar con el Servicio de
	BioInform&aacute;tica:
	<UL>
	<LI>Leyendo atentamente los
	avisos y la documentaci&oacute;n que este Servicio considere de
	importancia.
	<LI>Avisando de posibles
	problemas o irregularidades en el funcionamiento de los servicios
	ofrecidos, as&iacute; como del abandono de la cuenta cuando este se
	produzca.
	<LI>Manteniendo limpieza y orden
	en los datos  que se mantengan en el/los servidores.
	</UL>
	<LI>Mantener la confidencialidad
	de la palabra clave quedando terminantemente prohibido pasar esta a
	otras personas sean o no del Centro.
</UL>
La firma de este documento conlleva la aceptaci&oacute;n de estos
t&eacute;rminos:
<P><BR>
</P>
</FONT></FONT>
<DD>Firma del usuario/a:</DD>
<P><BR>
</P>
<P><BR>
</P>
<FONT FACE="Arial"><FONT SIZE=3>
<P>El/la responsable del laboratorio al que pertenece el/la nuevo/a
usuario/a, le permite el acceso a los datos correspondientes al
laboratorio para (marque con una x):</P>
<FORM>
<UL>
	<INPUT TYPE="checkbox">
        Compartici&oacute;n a los
	datos comunes del laboratorio.<BR>
	<INPUT TYPE="checkbox">
        Colaboraci&oacute;n en la
	elaboraci&oacute;n del espacio &#147;web&#148; del laboratorio.<BR>
	<INPUT TYPE="checkbox">
        Colaboraci&oacute;n en la
	colocaci&oacute;n de ficheros para acceso por ftp an&oacute;nimo del
	laboratorio.
</UL>
<\FORM>
</FONT></FONT>
<DD>Firma del/la responsable del
laboratorio:</DD>
<P><BR>
</P>
<P><BR>
</P>
<TABLE WIDTH=576 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=3 CELLSPACING=0>
	<COL WIDTH=281>
	<TR VALIGN=TOP>
		<TD WIDTH=281 BGCOLOR="#dfdfdf">
			<P ALIGN=RIGHT><FONT FACE="Arial"><FONT SIZE=3>Indicar la fecha de
			petici&oacute;n:</FONT></FONT>
</P>
		</TD>
		<TD WIDTH=281>
			<P>$fecha<BR>
			</P>
		</TD>
	</TR>
</TABLE>
EOT

    print $q->end_html();

}


################################################################
##
##  Muestra los datos y pide confirmacion.
##  (si no esta en la base de datos llama a no_tiene_datos)
##
##  SINTAXIS: &pedir_confirmar_datos();
##
################################################################

sub pedir_confirmar_datos() {
    if (index("0123456789",chop($dni)) != -1) { $dni= $q->param('nif_in'); }

    print $q->header;

    $conn = Pg::connectdb("host=db dbname=iib");
    &abnormal_end("Error abriendo la conexion") if ($conn->status);

    $param{title}="Confirmaci&oacute;n de datos";
    print &iibweb_cabecera(*param);
#    print $q->start_html(-title=>'Resultados');

    $res = &get_data($dni,*datos);

    if ($res == $ERR) { &abnormal_end(); }

    if ($res == $NODATA) { &no_tiene_datos(); exit(); }

    if (uc($q->param('nif_in')) ne uc($datos{'nif'})) {
	open(LOG_DNI,">>$LOG_DNI");
	print LOG_DNI $datos{'id'}."\t".$datos{'nif'}."\t->\t".$q->param('nif_in')."\n";
	close(LOG_DNI);
    }

    $dni=$q->param('nif_in');

    $nueva_dir=lc($datos{'nombre'}.".".$datos{'ape1'});
    $nueva_dir=~ tr/ÑñáÁéÉíÍóÓúÚ/nnaaeeiioouu/;
    $nueva_dir=~s/([^.]) ([^ ])/\./g;
    $nueva_dir=~s/[^a-z\.-]//g;

    print <<EOT;
Por favor, compruebe sus datos y marque con una marca 
de validacion aquellos que sean correctos.
<P>
Si ya tenía correo en el IIB, existe una dirección de correo adicional que aparece como ya marcada. Esta será la dirección de correo de nombre completo que todavía no está disponible.
<FORM NAME=validacion>
<CENTER>
<TABLE BORDER=5 ALIGN=center>
<TR><TD COLSPAN=2><DT>Nombre:
      <DD><INPUT TYPE="checkbox" NAME="comprobado" VALUE="nombre">
      $datos{'ape1'} $datos{'ape2'}, $datos{'nombre'} 
  <TD ROWSPAN=2 ALIGN=center VALIGN=middle>
<TR><TD COLSPAN=2><DT>Correo electr&oacute;nico:
      <DD><INPUT TYPE="checkbox" NAME="comprobado" VALUE="emilio">
EOT
    if ($datos{'username'}) {
	print <<EOT;
      $datos{'username'}\@iib.uam.es<BR>
      <DD><INPUT TYPE="checkbox" NAME="alt_emilio" VALUE="on" CHECKED>$nueva_dir\@iib.uam.es
<INPUT TYPE="hidden" NAME="username" VALUE="$datos{'username'}">
EOT
    } else {
	print "No posee\n";
    }
    print <<EOT;
    <TR><TD COLSPAN=2><DT>Unidad:
      <DD><INPUT TYPE="checkbox" NAME="comprobado" VALUE="unidad">
      $datos{'unidad'}
  <TD><DT>Laboratorio:
      <DD><INPUT TYPE="checkbox" NAME="comprobado" VALUE="lab">
      $datos{'lab'}
<TR><TD><DT>Ocupaci&oacute;n:
      <DD><INPUT TYPE="checkbox" NAME="comprobado" VALUE="categoria">
      $datos{'categoria'}
  <TD><DT>Tel: (*)
      <DD><INPUT TYPE="checkbox" NAME="comprobado" VALUE="tel">
      $datos{'tel'}
  <TD><DT>Fax:<DD>585 4401
</TABLE>
<P><BR></P>
<INPUT TYPE="submit" VALUE="Confirmar" ALIGN=center>
</CENTER>
<INPUT TYPE="hidden" NAME="user_id" VALUE=$datos{'id'}>
<INPUT TYPE="hidden" NAME="nombre" VALUE="$datos{'nombre'} $datos{'ape1'} $datos{'ape2'} ">
<INPUT TYPE="hidden" NAME="dni" VALUE="$dni">
<INPUT TYPE="hidden" NAME="labo" VALUE="$datos{'lab'}">
</FORM>
EOT

#    print $datos{'nombre'}." ".$datos{'ape1'}." ".$datos{'ape2'}." ".$datos{'lab'}." ".$datos{'directorio_lab'}." ".$datos{'directorio_unidad'}."<br>\n";;

    print "<br>\n";

    print &iibweb_pie(*param);
#    print $q->end_html();
}


################################################################
##
##  Muestra una explicacion de lo que tiene que hacer por no tener
##    los datos en la base de datos. Luego muestra_ficha_secretaria.
##
##  SINTAXIS: &no_tiene_datos();
##
################################################################

sub no_tiene_datos() {

    print <<EOT;
Lo siento, pero sus datos no se pueden encontrar en la base de datos
del IIB. La razón puede ser:
<P>
<UL>
  <LI>Que no esté bien anotado su DNI en secretaría.
  <LI>Que nunca haya pasado sus datos a secretaría.
</UL>
En el primer deberá pasarse por secretaría de
dirección para resolver el problema.
<P>
En el segundo caso, puede enviar los datos electrónicamente rellenando el <A HREF="../admin/alta.es.cgi">formulario de secretar&iacute;a</A>.
<P>
EOT

#    &muestra_ficha_secretaria();

}

################################################################
##
##  Muestra la ficha de secretaria
##
##  SINTAXIS: &muestra_ficha_secretaria();
##
################################################################

sub muestra_ficha_secretaria() {

    print <<EOT;
*** Lo siento, pero de momento no se ha implementado esta función***<BR>
Tendrá que pasarse por secretaría y hacer el trámite con una
ficha normal.
EOT

}

################################################################
##
##  Muestra el formulario inicial.
##
##  SINTAXIS: &print_initial_form();
##
################################################################

sub print_initial_form() {

    print <<EOHTML;
Content-type: text/html

EOHTML


    $param{title}="Petici&oacute;n de cuenta en BioInfo";
    $param{date}=$date;
    print &iibweb_cabecera(*param);


    print <<EOT;

<script language="JavaScript">

<!--
var letras="TRWAGMYFPDXBNJZSQVHLCKET";

function dni_verify ()
{
  nif=document.datos.nif_in.value
  letra=nif.charAt(nif.length-1).toUpperCase();
  if  (nif.charAt(0).toUpperCase() != 'X') {
    if (letras.indexOf(letra)==-1) {
      alert("Por favor, introduce un NIF o numero de pasaporte. \\nSolo numeros y una letra. Ej: 30853452T");
      return(false);
    }
    dni=nif.substring(0,nif.length-1);
    pos=dni%23;
    debe_ser=letras.substring(pos,pos+1);
    if (letra!=debe_ser) {
      alert ("Por favor, comprueba el NIF. "+debe_ser+"a letra no coincide.");
      return(false);
    }
  }
  return(true);
//  document.datos.submit();
//  alert("NIF: "+nif+"\\nDNI: "+dni+"\\nLetra: "+letra+"\\nLa letra es "+debe_ser);
}


//-->

</script>

<P>
Este servicio nos permite comprobar sus datos en la base de datos del
centro, y nos va a servir para crear las cuentas en el nuevo servidor.
<P>
Por favor, rellene el formulario y compruebe sus datos prestando la
m&aacute;xima atenci&oacute;n. 
<P>
Los NIF deben llevar la letra correcta, y los pasaportes comienzan por "X".
No se deben utilizar puntos ni guiones. Solo los numeros y la letra.
<P ALIGN=center>
<FORM ALIGN=center NAME="datos" ACTION="$script" onSubmit="return dni_verify()">
Su NIF o pasaporte:
<INPUT TYPE="text" NAME="nif_in" SIZE="20" ALIGN="center">
<INPUT TYPE="submit" NAME="submit_butom" VALUE="Enviar" ALIGN="center">
</FORM>

EOT

    print &iibweb_pie(*param);


}

################################################################
##
##  Rutina que pilla los parametros segun el DNI. Vuelven en *datos
##
##  SINTAXIS: &get_data("dni",*datos);
##
################################################################


sub get_data() {
    local($dni,*datos) = @_;
    local($cmd,$result);

    $cmd = "SELECT nombre, ape1, ape2, lab, directorio_lab, unidad, directorio_unidad, telf, categoria, null AS username,cod_persona,dni\
            FROM personas_publico\
            WHERE  (dni like '$dni%'); ";
# AND\
#                   (baja is NULL); ";
#                 vax_users t1\
#                   (t0.cod_persona=t1.cod_persona)";
#              LEFT JOIN vax_users t1\
#              ON t0.cod_persona=t1.cod_persona\
    $result = $conn->exec($cmd);
    if ($result->ntuples == 0) {
	$error="No se ha encontrado a nadie con ese DNI<BR>\n";
	return $NODATA;
    }

    if ($result->ntuples > 1) {
	$error="DNI ambiguo. Se encuentra mas de un elemento con ese DNI<BR>\n";
	return $ERR;
    }

    $datos{'nombre'}=$result->getvalue(0,0);
    $datos{'ape1'}=$result->getvalue(0,1);
    $datos{'ape2'}=$result->getvalue(0,2);
    $datos{'lab'}=$result->getvalue(0,3);
    $datos{'directorio_lab'}=$result->getvalue(0,4);
    $datos{'unidad'}=$result->getvalue(0,5);
    $datos{'directorio_unidad'}=$result->getvalue(0,6);
    $datos{'tel'}=$result->getvalue(0,7);
    $datos{'categoria'}=$result->getvalue(0,8);
    $datos{'username'}=$result->getvalue(0,9);
    $datos{'id'}=$result->getvalue(0,10);
    $datos{'nif'}=$result->getvalue(0,11);

    
    return $OK;

}

################################################################
##
##  Rutina de finalizacion anormal
##
##  SINTAXIS: &abnormal_end("mensaje");
##
################################################################


sub abnormal_end () {
    local ($msj) = @_;
    print "iibadduser: ";
    if ($msj) { print $msj." - "; }
    if ($error) { print $error; }
    print "\n";

    exit;
}


