#!/usr/bin/perl -w

use Pg;
use CGI qw/:standard *table *center /;

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

my %IP_SECRETARIA=('150.244.251.76'=>1,
		   '150.244.250.90'=>1,
		   '150.244.248.219'=>1,
		   '150.244.248.218'=>1);
my $ip=$ENV{'REMOTE_ADDR'};

print header;

$pgconn = Pg::connectdb("host=db.iib.uam.es dbname=iib");

if (! $IP_SECRETARIA{$ip}) {
    error_origen();
    exit;
}

if (param()) {
    procesa_datos();
    exit;
}
else {

# Recogemos datos para el formulario
# 1 - Relacion laboral
#  1a - Pillamos los datos de los tipos de relacion laboral 

    $result=$pgconn->exec(<<"EOSQL");
SELECT r.cod_tiporel,t.descripcion,r.definicion,r.entidad,u.definicion
  FROM persona_tiporel r 
    LEFT JOIN persona_reltipologia t USING (cod_tipo_personal)
    LEFT JOIN persona_relbase u ON (r.cod_relbase=u.cod_relbase)
  WHERE obsoleto IS NULL
  ORDER BY u.definicion,r.definicion;
EOSQL

#  1b - Metemos los datos en arrays y hashes

    @cont_base=('Elige un tipo');
    @cont_entidad=('Elige entidad');
    ($basei,$entidadi)=(0,0);
    while ( ($codigo,$base,$contrato,$entidad,$general)=
	    $result->fetchrow() ) {
	$entidad='Unknown' if ( ! $entidad );
	$base='Unknown' if ( ! $base );
        if ( ! $continv_base{$base} ) {
	    push @cont_base,++$basei;
	    $cont_base{$basei}=$base;
	    $continv_base{$base}=$basei;
	}
        if ( ! $continv_entidad{$entidad} ) {
	    push @cont_entidad,++$entidadi;
	    $cont_entidad{$entidadi}=$entidad;
	    $continv_entidad{$entidad}=$entidadi;
	}
	push @{$contratos[$continv_base{$base}][$continv_entidad{$entidad}]},
	  { val=>$codigo,
	    tag=>"$general - $contrato ($codigo)" };
    }

#  1c - Creamos una matriz JavaScript de tres dimensiones para el acceso
#       a los datos desde el script por 'base' y 'entidad'
#       ejemplo base: Funcionario, Becario, Contratado, etc...
#       ejemplo entidad: UAM, CSIC, EXTERNO, etc...

    $JSarray_rtag='[';
    $JSarray_rval='[';
#    foreach $basea ( @contratos ) {
    for $i ( 0 .. $basei ) {
	$basea=$contratos[$i];
	$JSarray_rtag.='[';
	$JSarray_rval.='[';
#	foreach $entidada ( @{$basea} ) {
	for $j ( 0 .. $entidadi ) {
	    $entidada=$basea->[$j];
	    if ( $entidada ) {
		$JSarray_rtag.='["'.join('","',map {$_->{tag}} @{$entidada}).'"],';
		$JSarray_rval.='['.join(',',map {$_->{val}} @{$entidada}).'],';
	    } else {
		$JSarray_rtag.='["Faltan datos"],';
		$JSarray_rval.='["Nada"],';
	    }
	}
	chop ($JSarray_rtag,$JSarray_rval);
	$JSarray_rtag.="],";
	$JSarray_rval.="],";
    }
    chop ($JSarray_rtag,$JSarray_rval);
    $JSarray_rtag.=']';
    $JSarray_rval.=']';


  Pg::doQuery($pgconn,"select cod_unidad, descripcion from unidades where unidad<>'x' order by descripcion", \@unidades_LoL);

  Pg::doQuery($pgconn,"select cod_titulacion, definicion from persona_titulacion order by definicion", \@titulaciones_LoL);

    for $i ( 0 .. $#titulaciones_LoL)
    {
	$titulaciones[$i]=$titulaciones_LoL[$i][0];
	$titulaciones{$titulaciones_LoL[$i][0]}=$titulaciones_LoL[$i][1];
    }

    $JSarray_ulab='[ ["Seleccionar primero una unidad"],';
    $JSarray_uval='[ ["Nada"],';
    for $i ( 0 .. $#unidades_LoL) {
        my @labos_LoL;
	$unidades[$i]=$unidades_LoL[$i][0];
	$unidad_desc{$unidades[$i]}=$unidades_LoL[$i][1];
      Pg::doQuery($pgconn,"select cod_lab, lab, directorio from labos where cod_unidad=$unidades[$i] order by lab", \@labos_LoL);
	$JSarray_ulab.='["Se debe seleccionar uno",';
	$JSarray_uval.='["Nada",';
	for $j ( 0 .. $#labos_LoL) {
	    my $laboratorio=$labos_LoL[$j][1];
	    if (! ($laboratorio=~/[^-0-9\.BC]/)) { $laboratorio.=" - ".$labos_LoL[$j][2] };
	    $JSarray_ulab.='"'.$laboratorio.'",';
	    $JSarray_uval.='"'.$labos_LoL[$j][0].'",';
	}
	chop($JSarray_ulab,$JSarray_uval);
	$JSarray_ulab.="],";
	$JSarray_uval.="],";
    }
    chop($JSarray_ulab,$JSarray_uval);
    $JSarray_ulab.=" ]";
    $JSarray_uval.=" ]";

#  Pg::doQuery($pgconn,"select lab from labos order by lab", \@labos_LoL);
#    for $i ( 0 .. $#labos_LoL) { $labos[$i]=$labos_LoL[$i][0]; }


    $iib_w_param{title}="Datos de personal para secretar&iacute;a";
    print &iibweb_cabecera(*iib_w_param);

    print <<EOJS;
<SCRIPT languaje="JavaScript1.1">

var uvalores = $JSarray_uval;
var utextos  = $JSarray_ulab;
var rvalores = $JSarray_rval;
var rtextos  = $JSarray_rtag;
var letras="TRWAGMYFPDXBNJZSQVHLCKET";


function otra_rel()
{
  var entidad_id=document.datos.entidad.selectedIndex;
  var base_id=document.datos.base.selectedIndex;
  var i;

  for(i=0;document.datos.contrato[0];i++)
    { document.datos.contrato[0]=null;}

  for(i=0;i<rvalores[base_id][entidad_id].length;i++)
    {  document.datos.contrato[i]= new Option(rtextos[base_id][entidad_id][i],rvalores[entidad_id][base_id][i]); }

  
  document.datos.contrato.selectedIndex=0;
  document.datos.contrato[0].value='Nada';
}

function otra_ud()
{
  var unidad_id=document.datos.unidad.selectedIndex;
  var i;

  for(i=0;document.datos.labo[0];i++)
    { document.datos.labo[0]=null;}

  for(i=0;i<uvalores[unidad_id].length;i++)
    {  document.datos.labo[i]= new Option(utextos[unidad_id][i],uvalores[unidad_id][i]); }

  
  document.datos.labo.selectedIndex=0;
  document.datos.labo[0].value='Nada';
}

function verifica ()
{
    var msg="";
    var regexp_fecha=/^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}\$/;
    var regexp_Mym=/[A-Z].*[a-z]/;
    var regexp_nonum=/[^0-9]/g;

    if (document.datos.nombre.value.length==0) {
	msg=msg+"Se debe rellenar el nombre\\n";
    }

    if (document.datos.nombre.value.length > 15) {
	msg=msg+"El nombre debe ser de menos de 15 caracteres\\n";
    }

    if (document.datos.ape1.value.length==0) {
	msg=msg+"Se debe rellenar el primer apellido\\n";
    }

    if ((document.datos.ape1.value.length > 15) ||
	(document.datos.ape2.value.length > 15)){
	msg=msg+"El apellido debe ser de menos de 15 caracteres\\n";
    }

    if (document.datos.calle.value.length==0) {
	msg=msg+"Se debe rellenar el domicilio\\n";
    }

    if (document.datos.calle.value.length>50) {
	msg=msg+"El domicilio debe de tener menos de 50 caracteres\\n";
    }

    if ((msg.length==0) &&
	(! regexp_Mym.test(document.datos.nombre.value) ||
	 ! regexp_Mym.test(document.datos.ape1.value) ||
	 (! regexp_Mym.test(document.datos.ape2.value) && (document.datos.ape2.value.length!=0) ) ||
	 ! regexp_Mym.test(document.datos.calle.value) )) {
	msg=msg+"Se deben utilizar mayúsculas y minúsculas en \\n   nombre, apellidos y la calle.\\n";
    }

    document.datos.cp.value=document.datos.cp.value.replace(regexp_nonum,"");
    if (document.datos.cp.value.length!=5) {
	msg=msg+"El Código Postal debe contar con 5 digitos\\n";
    }

    document.datos.tel_dom.value=document.datos.tel_dom.value.replace(regexp_nonum,"");
    document.datos.telf.value=document.datos.telf.value.replace(regexp_nonum,"");
    if ((document.datos.telf.value.length!=9) ||
	(document.datos.tel_dom.value.length!=9)){
	msg=msg+"Los telefonos deben tener 9 digitos (de España)\\n";
    } else {
	if ((document.datos.telf.value.substr(0,5)!="91585") &&
	    (document.datos.telf.value.substr(0,5)!="91497")) {
	    msg=msg+"El teéfono del labo debe ser del IIB (585 o 497)\\n";
	}
    }

//    tel=document.datos.telefono.value;
//    if (tel.length!=4) {
//	if (tel.length==7) {
//	    if (tel

    if (document.datos.unidad.selectedIndex==0) {
	msg=msg+"Debe elegir una unidad\\n";
    }

    if (document.datos.labo.selectedIndex==0) {
	msg=msg+"Debe elegir un laboratorio\\n";
    }

    nif=document.datos.dni.value.toUpperCase();
    if (nif.length==0) {
	msg=msg+"Debe especificar un NIF\\n";
    } else {
	letra=nif.charAt(nif.length-1);
	if  (nif.charAt(0) != 'X') {
	    nif='00000000'+nif;
	    nif=nif.substring(nif.length-9,nif.length);
	    if (letras.indexOf(letra)==-1) {
		msg=msg+"El NIF o pasaporte no es válido\\n";
	    } else {
		dni=nif.substring(0,nif.length-1);
		pos=dni%23;
		debe_ser=letras.substring(pos,pos+1);
		if (letra!=debe_ser) {
		    msg=msg+"La letra del NIF no coincide\\n";
		}
	    }
	}
	document.datos.dni.value=nif;
    }



    if (! regexp_fecha.test(document.datos.nacim_fecha.value)) {
	msg=msg+"El formato de fecha de nacimiento no es válido\\n";
    }

    if (document.datos.fin_contrato.value!="" &&
	! regexp_fecha.test(document.datos.fin_contrato.value)) {
	msg=msg+"El formato de fecha de fin de contrato no es válido\\n";
    }

    if (document.datos.contrato.selectedIndex==0) {
	msg=msg+"Debe especificar un tipo de contrato\\n   Si tiene dudas, consulte en secretaría (x4624)\\n";
    }

    if (document.datos.titulacion.selectedIndex==0) {
	msg=msg+"Debe especificar la titulación que posee\\n";
    }


    if (msg.length==0) {
	if (document.datos.telf.value.substr(0,5)=="91585") {
	    document.datos.telf.value=document.datos.telf.value.substr(5,4);
	} else {
	    if (document.datos.telf.value.substr(0,5)=="91497") {
		document.datos.telf.value="497-"+document.datos.telf.value.substr(5,4);
	    } else {
		document.datos.telf.value="XXX-"+document.datos.telf.value.substr(5,4);
	    }
	}
	return true;
    } else {
	alert(msg);
	return false;
    }
}

</SCRIPT>
EOJS

    print "Este formulario es para darse de alta en la secretar&iacute;a del IIB. ";
    print "Los datos que se piden ser&aacute;n remitidos a la secretar&iacute;a para ser validados, ";
    print "y de ser as&iacute; se introducir&aacute;n en la base de datos del centro.",p;
    print "En ning&uacute;n caso estos datos se pasar&aacute;n a terceros y solo se utilizar&aacute;n ";
    print "para uso interno en el IIB. S&oacute;lo algunos de estos datos (los que aparecen en la ";
    print a({href=>"http://www.iib.uam.es/dep/motor/busca.es.cgi"},"p&aacute;gina de b&uacute;squeda de personal");
    print " del IIB) ser&aacute;n p&uacute;blicos.",p;
    print "Si no desea que estos datos sean p&uacute;blicos, pongas&eacute; en contacto con el ";
    print a({href=>"http://www2.iib.uam.es/bioinfo"},"Servicio de Bioinform&aacute;tica"),p;
    print "NOTA: Necesita utilizar JavaScript 1.2 o posterior (Netscape 4.0 o posterior p.ej.) para utilizar este formulario.";

    print start_form(-name=>"datos", -onSubmit=>"return verifica()");
    
    print table({-border=>undef},
		Tr({-align=>CENTER,-valign=>CENTER},
		   [
		    td([b('Nombre') , textfield('nombre'),
			b('Unidad') ,
			popup_menu(-name=>'unidad',
				 -values=>['Se debe seleccionar una',@unidades],
				 -labels=>\%unidad_desc,
				 -onChange=>"otra_ud();") ]),
		    td([b('1er apellido') , textfield('ape1'),
			b('Laboratorio') , 
			popup_menu(-name=>'labo',
#				 -values=>['Se debe seleccionar uno',@labos]) ]),
				 -values=>['Seleccionar primero una unidad']) ]),
		    td([b('2o apellido') , textfield('ape2'),
			b('Tel&eacute;fono laboratorio') , textfield('telf') ]),
		    td([b('NIF') , textfield('dni'),
			'' , '' ]),
		    td([b('Calle domicilio') , textfield('calle'),
			b('C&oacute;digo Postal') , textfield('cp') ]),
		    td([
			  b('Tel&eacute;fono domicilio') , textfield('tel_dom'),
			  b('Titulaci&oacute;n') ,
			  popup_menu(-name=>'titulacion',
				     -values=>['Se debe seleccionar una',@titulaciones],
				     -labels=>\%titulaciones)
		    ]),
		    td([b('Nacido en') , textfield('nacim_lugar'),
			b('Fecha') , textfield(-name=>'nacim_fecha', -default=>'DD-MM-YYYY') ]),
		    td([b('Tipo rel:') , 
			popup_menu(-name=>'base',
				   -values=>\@cont_base,
				   -labels=>\%cont_base,
				   -onChange=>"otra_rel();"),
			b('Entidad') ,
			popup_menu(-name=>'entidad',
				   -values=>\@cont_entidad,
				   -labels=>\%cont_entidad,
				   -onChange=>"otra_rel();") ]),
		    td([b('Contrato') , 
			popup_menu(-name=>'contrato',
#				   -values=>['Se debe seleccionar uno',@contratos],
#				   -labels=>\%contratos),
				   -values=>['Selecciona antes "base" y "entidad"']),
			b('Fin Contrato') , textfield(-name=>'fin_contrato', -default=>'Nada o DD-MM-YYYY') ])
		    ]
		   )
		);

    print p, start_center, submit("Enviar datos"), end_center;
    
    print end_form;

    print &iibweb_pie(*iib_w_param);
}




sub procesa_datos ()
{
    my $secretaria; 
    my $bioinfo;
    my $sec_emilio="secretaria\@iib.uam.es";
    my $bi_emilio="sysadmin\@iib.uam.es";

    my %p=param2hash();

    my $result=$pgconn->exec('select lab, directorio from labos where cod_lab='.param('labo'));
    my $laboratorio=$result->getvalue(0,0);
    if (! ($laboratorio=~/[^-0-9\.BC]/)) { $laboratorio.=" - ".$result->getvalue(0,1) };

    $result=$pgconn->exec('select descripcion from unidades where cod_unidad='.param('unidad'));
    my $unidad=$result->getvalue(0,0);

    $secretaria="Nombre      = ".param('nombre').
              "\nApellidos   = ".param('ape1')." ".param('ape2').
              "\nLaboratorio = ".$laboratorio.
              "\nUnidad      = ".$unidad.
              "\nExtensión   = ".param('telf').
              "\nContrato    = ".param('contrato').
              "\nTitulación  = ".param('titulacion').
              "\nDNI         = ".param('dni').
              "\nDomicilio   = ".param('calle').
              "\n         CP = ".param('cp').
              "\n   teléfono = ".param('tel_dom').
              "\nNacido en   = ".param('nacim_lugar').
	      "\n      fecha = ".param('nacim_fecha').
	      "\nFin contrato= ".param('fin_contrato');

    my $birthday=param('nacim_fecha');
    $birthday=~s/([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})/$3-$2-$1/;

    my $fincontrato=param('fin_contrato');
    $fincontrato=~s/([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})/$3-$2-$1/;

    my ($kk,$dia,$mes,$ano);
    ($kk,$kk,$kk,$dia,$mes,$ano) = localtime;
    $ano+=1900; $mes++;
    my $alta="$ano-$mes-$dia";

    $bioinfo=<<EOSQL;
INSERT INTO personas (nombre,ape1,ape2,cod_lab,cod_unidad,
  telf,dni,domicilio_calle,domicilio_cp,domicilio_tel,nacido,
  cod_titulacion,cod_tiporel,ingreso,fin_contrato)
EOSQL

    $ape2=param('ape2') || '-';
    $bioinfo.="VALUES ('".param('nombre')."','".
	                 param('ape1')."','$ape2',".
			 param('labo').",".param('unidad').",\n  '".
			 param('telf')."','".param('dni')."','".
			 param('calle')."','".param('cp')."',\n  '".
			 param('tel_dom')."','".$birthday."',\n  '".
			 param('titulacion')."','".param('contrato')."','".
			 $alta."','".$fincontrato."');";


    system <<EOC;
mail -s "Datos de nuevo personal" $sec_emilio <<EODATA
$secretaria
EODATA
mail -s "Datos de nuevo personal" $bi_emilio <<EODATA
$bioinfo

-----

$secretaria
EODATA
EOC

    $result=$pgconn->exec($bioinfo);
    $p{dni}=~/(\d+(\d{4}))\D?$/;
    my $dni=$1;
    my $pass=$2;
    $bioinfo=<<"EOSQL";
INSERT INTO controlacceso_intercambio
  ("Accion","DNI","APELLIDOS","NOMBRE","CODIGO_ENTIDAD","CODIGO_DELEGACION",
   "CODIGO_DEPARTAMENTO","NUMERO_TAR","CLV_TARJ","NCLV_TARJ")
  VALUES
  (1,'$p{dni}','$p{ape1} $p{ape2}','$p{nombre}',1,$p{unidad},
   $p{labo},$dni,'$pass','$pass');
EOSQL
    $result=$pgconn->exec($bioinfo);
    $bioinfo=<<"EOSQL";
INSERT INTO controlacceso_claves
  (cod_persona,clv_tarj)
VALUES
  ((select cod_persona from personas where dni='$p{dni}') , '$pass');
EOSQL
    $result=$pgconn->exec($bioinfo);


    system <<EOC;
mail -s "Datos de nuevo personal" $bi_emilio <<EODATA
$bioinfo

$secretaria
EODATA
EOC


    $iib_w_param{title}="Datos enviados";
    print &iibweb_cabecera(*iib_w_param);

    print <<EOHTML;
<p>La persona ha sido dada de alta en la base de datos del IIB.</p>
<p>
    A continuaci&oacute;n ya puede registrarse en los Servicios del IIB.
<ul>
    <li><b>Tecnolog&iacute;as de la Informaci&oacute;n</b>:</br>Para darse de alta en Tecnolog&iacute;s de la informaci&oacute;n debe de introducir su DNI en <a href='http://www2.iib.uam.es/ti/alta.es.cgi'>http://www2.iib.uam.es/ti/alta.es.cgi</a>.</li>
    <li><b>Imagen</b>:<br>Despu&eacute;s es menester que indicando el nombre de usuario (username) que le asignen en Tecnolog&iacute;as de la Informaci&oacute;n se pase por el Servicio de Imagen para que le incorporen su foto en la web.</li>
    <li><b>Reconocimiento m&eacute;dico</b>:<br>En el Servicio de Bioseguridad, residuos y prevenci&oacute;n de riesgos laborales os dar&aacute;n cita para un reconocimiento m&eacute;dico inicial.</li>
</ul>
<hr>
EOHTML

    print "Datos enviados:";
    print hr, p, pre($secretaria);

    print &iibweb_pie(*iib_w_param);
}

sub error_origen {
    $iib_w_param{title}="Error";
    print &iibweb_cabecera(*iib_w_param);

    print "Disculpa, pero esta p&aacute;gina solo puede ser accedida por la Administraci&oacute;n del IIB. Dirigete a Personal o Secretar&iacute;a de Direcci&oacute;m para m&aacute;s informaci&oacute;n.";

    print &iibweb_pie(*iib_w_param);
}


sub param2hash() {
    my ($hash_ref)=@_;
    my %hash;
    my @p_keys=param();

    for $key (@p_keys) {
	$hash{$key}=param($key);
    }

    %$hash_ref=%hash if $hash_ref;
    return %hash;
}



