require "./config.pl";
require "./sesion.pl";
require "./BD.pl";

# Estas variables son necesarias para BD.pl. Definen los valores por defecto de
# todos los campos de las diferentes tablas.

$Sesiones_defecto="SID=''&Cuenta=''&Grupo=''&Servicios=''&Estado=''&Caduca=''";
$Traductor_defecto="Cuenta=''&email=''&Password=''&Nombre=''&Servicios=''&Estado=''";
$Cliente_defecto="Cuenta=''&Password=''&Nombre=''&Apellidos=''&email=''&Empresa=''&Cargo=''&CIFNIF=''&Contacto=''&Direccion=''&Localidad=''&CodigoP=''&Provincia=''&Telefono=''&Fax=''&TelSMS=''&Estado=''&Reservado01=''&Reservado02=''&Reservado03=''&Reservado04=''&Reservado05=''&Reservado06=''&Reservado07=''&Reservado08=''&Reservado09=''&Reservado10=''";
$Documento_defecto="Fichero=''&puedenVerlo=''&puedenCogerlo=''&Estado=''&Descripcion=''";

#######################
# Esta función toma la respuesta de la función ConsultarTabla (una cadena de la
# forma campo=valor|campo=valor... y devuelve esta información en un hash.
#

sub genLineaAHash {
   my ($linea) = @_;
   my (%salida, @pairs, $pair, $name, $value) = ();

   @pairs = split(/\|/, $linea);

   foreach $pair (@pairs) {
      ($name, $value) = split(/=/, $pair);
      $salida{$name} = $value;
   }
   return %salida;
}


#######################
# Función que autentica a un usuario. A la hora de autorizarlo, dependiendo de
# si es cliente o traductor, lo manda a traGeneraEscritorio o a cliGeneraEscritorio.
#

sub genAutentica {
   my (%filtro, @datos, %respuesta) = ();

   $filtro{email} = $ARGS{email};
   $filtro{Password} = $ARGS{Password};

   # Si no ha metido el email y el password no hacemos ninguna comprobación, y
   # le devolvemos la página del login.
   if ($ARGS{email} && $ARGS{Password}) {
      # Vamos a comprobar primero en la tabla de clientes y luego en la de
      # asesores. Si no está en ninguna, sacamos ventana de error.
      @datos = &ConsultarTabla ("Cliente", %filtro);
      if ($datos[0]) {
         # Metemos los datos del cliente en la tabla de SIDs, llamamos a 
         # cliGeneraEscritorio, y devolvemos lo que devuelva esta función.
         %respuesta = &genLineaAHash ($datos[0]);
         $filtro{WHERE_} = "1";
         $filtro{WHERE_SID} = $sid_global;
         $filtro{Cuenta} = $respuesta{email};
         $filtro{Servicios} = $respuesta{Servicios};
         $filtro{Estado} = $respuesta{Estado};
         $filtro{Grupo} = "/clientes";
         &ActualizarTabla ("Sesiones", %filtro);
         $Nombre = $respuesta{Nombre};
         return &genGeneraEscritorio ();
      } else {
         @datos = &ConsultarTabla ("Traductor", %filtro);
         if ($datos[0]) {
            # Metemos los datos del traductor en la tabla de SIDs, llamamos a 
            # traGeneraEscritorio, y devolvemos lo que devuelva esta función.
            %respuesta = &genLineaAHash ($datos[0]);
            $filtro{WHERE_} = "1";
            $filtro{WHERE_SID} = $sid_global;
            $filtro{Cuenta} = $respuesta{email};
            $filtro{Servicios} = $respuesta{Servicios};
            $filtro{Estado} = $respuesta{Estado};
            $filtro{Grupo} = "/traductores";
            &ActualizarTabla ("Sesiones", %filtro);
            $Nombre = $respuesta{Nombre};
            return &genGeneraEscritorio ();
         }
      }
   }
   # Si no está dado de alta, se le pasa de nuevo a la página de autenticación.
   $globalMensaje = "<p>Los datos de identificaci&oacute;n introducidos no son v&aacute;lidos; por favor, int&eacute;ntelo de nuevo</p>\n";
   return "/cuentas/login.html";
}


#######################
# Función que genera las variables que necesita un panel para situar
# las diferentes aplicaciones.
# Parámetros: lista: Cadena con las aplicaciones que aparecerán.
#             retorno: Página que debe parsearse si todo va bien.
#             cols: Columnas del panel.
#             fils: Filas del panel.
#             appHTML: Hash con el c¢digo HTML para cada aplicaci¢n.

sub genGeneraPanel {
   my ($apps, $retorno, $cols, $fils, %appHTML) = @_;
   my ($i, $j, $variable, $tmp);

   for ($i = 1; $i <= $fils; ++$i) {
      for ($j = 1; $j <= $cols; ++$j) {
         $variable = appPanel.$i.$j;
         $tmp = substr ($apps, 0, 1);
         if ($tmp ne "-" && $tmp ne ".") {
            ${$variable} = $appHTML{$tmp};
            ${$variable} =~ s/\$sid_global\$/$sid_global/g ;
            $tmp = substr ($apps, 1, length ($apps) -1);
            $apps = $tmp;
         } else {
            ${$variable} = "&nbsp;";
         }
      }
   }

   # Vamos a ver si hay alguna aplicación que se quiera situar al final del
   # panel.
   if (substr ($apps, 0, 1) eq "-") {
      $apps = substr ($apps, 1, length ($apps) -1);
      for ($j = $cols; $j >= 1; --$j) {
         for ($i = $fils; $i >= 1 ; --$i) {
            $variable = appPanel.$i.$j;
            $tmp = substr ($apps, 0, 1);
            if ($tmp ne ".") {
               ${$variable} = $appHTML{$tmp};
               ${$variable} =~ s/\$sid_global\$/$sid_global/g ;
               $tmp = substr ($apps, 1, length ($apps) -1);
               $apps = $tmp;
            }
         }
      }
   }
   return $retorno;
}



#######################
# Función que genera las variables que necesita el escritorio para situar
# las diferentes aplicaciones.
#

sub genGeneraEscritorio {
   my (%filtro, @datos) = ();
   my ($tmp, %respuesta) = ();

   # Debemos comprobar que el usuario esté dado de alta, que sea válido, etc.
   # Esto se hace viendo qué datos tenemos para este SID.
   $filtro{SID} = $sid_global;
   @datos = &ConsultarTabla ("Sesiones", %filtro);
   if ($datos[0]) {
      %respuesta = &genLineaAHash ($datos[0]);
      $tmp = &genGeneraPanel ($respuesta{Servicios}, "/cuentas".$respuesta{Grupo}."/escritorio.html", $COL_ESCRITORIO, $FIL_ESCRITORIO, %appEscHTML);
      return $tmp;
   } else {
      $globalMensaje = "<p>Para acceder a esta p&aacute;gina, por favor, introduzca su direcci&oacute;n de correo electr&oacute;nico y su contrase&ntilde;a</p>\n";
      return "/cuentas/login.html";
   }

}


###########################################################################
#
# Esta funci¢n lo único que hace es devolver la página del archivo de
# ficheros.
#

sub archivoFicheros
{
   my (%filtro, @datos) = ();
   my ($tmp, %respuesta) = ();

   # Debemos comprobar que el usuario esté dado de alta, que sea válido, etc.
   # Esto se hace viendo qué datos tenemos para este SID.
   $filtro{SID} = $sid_global;
   @datos = &ConsultarTabla ("Sesiones", %filtro);
   if ($datos[0]) {
      %respuesta = &genLineaAHash ($datos[0]);
      $tmp = "/cuentas".$respuesta{Grupo}."/archivo.html";
      return $tmp;
   } else {
      $globalMensaje = "<p>Para acceder a esta p&aacute;gina, por favor, introduzca su direcci&oacute;n de correo electr&oacute;nico y su contrase&ntilde;a</p>\n";
      return "/cuentas/login.html";
   }
}


###########################################################################
#
# Esta función busca los documentos con los que el usuario puede tener alguna
# relación.

sub listaDocumentos
{
   my (%filtro, @datos, %respuesta) = ();

   @datos = &ConsultarTabla ("Documento", %filtro);
   if ($datos[0]) {
      %respuesta = &genLineaAHash ($datos[0]);
   } else {
      print "<html><body>Ning&uacute;n documento en la base de datos</body></html>";
   }
}


###########################################################################
#
# Esta funci¢n recoge los datos de la p gina del c lculo del presupuesto, lo
# calcula, y devuelve la p gina que se debe parsear como respuesta al usuario.
#

sub calcQuote
{
   local ($tmp);
   local (%datos);

   # Hacemos el cálculo en número de palabras.
   $presNormal = $ARGS{wordcount};
   # Se calculan 15 palabras por l¡nea y 500 palabras por p gina.
   if ($ARGS{unitCount} eq "lines") {$presNormal *= 15;}
   if ($ARGS{unitCount} eq "pages") {$presNormal *= 500;}
   $ARGS{wordcount} = $presNormal;

   # Consideramos una velocidad normal de traducción 1500 palabras por día, y una
   # velocidad urgente un 30% m s.
   $plazoNormal = $presNormal / 1500;
   $plazoUrgente = $presNormal / (1500 * 1.3);

   # Redondeos de los plazos.
   $plazoNormal = int ($plazoNormal + 0.8);
   $plazoUrgente = int ($plazoUrgente + 0.8);
   if ($plazoNormal < 1) {$plazoNormal = 1;}
   if ($plazoUrgente < 1) {$plazoUrgente = 1;}

   # Para el presupuesto, multiplicamos el número de palabras por su coste.
   $presNormal *= $ppp{$ARGS{formatDoc}};
   # El presupuesto urgente es un 50% más.
   $presUrgente = $presNormal * 1.5;

   # Importe mínimo.
   if ($presNormal < $presMinimo) {$presNormal = $presMinimo;}
   $presMinimo *= 1.5;
   if ($presUrgente < $presMinimo) {$presUrgente = $presMinimo;}

   # Hacemos el cálculo en la moneda pedida.
   $presNormal *= $cambio{$ARGS{currency}};
   $presUrgente *= $cambio{$ARGS{currency}};

   # Como tenemos problemas con los REAL en mSQL, voy a tratar el dinero como
   # centésimas de la moneda, y a guardarlo en la BD como INT.
   $presNormal = (int ($presNormal * 100))/100;
   $presUrgente = (int ($presUrgente * 100))/100;

   # Generamos estas variables para poner la moneda en el idioma en que est  
   # el formulario.
   $tmp = $ARGS{currency}."_".$ARGS{language};
   $currName = $currency{$tmp};

   # Generamos estas variables para poner los idiomas origen y destino en el
   # idioma en que est  el formulario.
   $tmp = $ARGS{srcLang}."_".$ARGS{language};
   $srcLang = $lang{$tmp};
   $tmp = $ARGS{tgtLang}."_".$ARGS{language};
   $tgtLang = $lang{$tmp};

   # Ahora metemos los datos del presupuesto en la tabla de proyectos.
   $datos{WHERE_} = 1;
   $datos{WHERE_session_id} = $sid_global;
   $datos{project_source_language} = $ARGS{srcLang};
   $datos{project_target_language} = $ARGS{tgtLang};
   $datos{project_word_count} = $ARGS{wordcount};
   $datos{project_currency} = $ARGS{currency};
   # Se guarda un entero en céntimos de moneda.
   $datos{project_quote} = $presNormal * 100;
   &ActualizarTabla ("Projects", %datos);

   return $plantilla_quoteOK;
}


###########################################################################
#
# Esta funci¢n hace una consulta a la tabla Projects, buscando toda la
# informaci¢n asociada actualmente con el SID, y metiendo cada campo en
# una variable cuyo nombre es el propio nombre del campo en la tabla.
#
# Esto resulta £til para poder hacer referencia posteriormente a estas
# variables mediante tags, dentro de la p gina que se est  parseando.
#

sub getSidData
{
   local (%filtro, @datos, @pairs, $pair, $name, $value);

        print "<html><head><title>Hola</title><body>";

   # Cogemos todos los datos asociados a este SID.
   $filtro{session_id} = $sid_global;

   # Sabemos que ConsultarTabla devuelve un array, con una entrada por cada
   # registro que cumple el filtro (en teor¡a s¢lo un registro por SID), en
   # el que cada entrada es un string de la forma:
   #
   #    campo=valor|campo=valor|...|campo=valor
   @datos = &ConsultarTabla ("Projects", %filtro);

   # Si hay datos asociados a este SID, los vamos metiendo en variables que
   # se llaman igual que el campo, que son globales, y que van a poder ser
   # accedidos desde parser.pl.
   if ($datos[0]) {
      @pairs = split(/|/, $datos{0});
      foreach $pair (@pairs) {
         ($name, $value) = split(/=/, $pair);
         ${$name} = $value;
      }
   }
}



###########################################################################
#
# Esta funci¢n recoge los datos de la primera p gina del asistente para
# encargar la traducci¢n y realiza las tareas necesarias.
#

sub wizard1
{
   local (%filtro);

        print "<html><head><title>Hola</title><body>";

   # Ahora metemos los datos iniciales del proyecto en la tabla de proyectos.
   $filtro{WHERE_session_id} = $sid_global;
   # Esto es un flag para indicar que queremos que pruebe primero un UPDATE.
   $filtro{WHERE_} = 1;
   # Aunque en la función ActualizarTabla hay definidos sólo dos parámetros, como
   # el Perl junta en un solo hash todos los hashs que se le pasan a una función,
   # puedo pasar dos hashs, porque al final lo coge un único hash.
   &ActualizarTabla ("Projects", %ARGS, %filtro);

   return $plantilla_wizard1OK."web".".htm";
}


###########################################################################
#
# Esta funci¢n recoge los datos de la primera p gina de formato web
# del asistente para encargar la traducci¢n y realiza las tareas necesarias.
#

sub wizard1w
{
   local (%filtro);

   # Ahora metemos los datos iniciales del proyecto en la tabla de proyectos.
   $filtro{WHERE_session_id} = $sid_global;
   # Esto es un flag para indicar que queremos que pruebe primero un UPDATE.
   $filtro{WHERE_} = 1;
   # Aunque en la función ActualizarTabla hay definidos sólo dos parámetros, como
   # el Perl junta en un solo hash todos los hashs que se le pasan a una función,
   # puedo pasar dos hashs, porque al final lo coge un único hash.
   &ActualizarTabla ("Projects", %ARGS, %filtro);

   if ($ARGS{knownwords} eq "yes") {
      return $plantilla_wizard1wOK."web".".htm";
   } else {
      return $plantilla_wizard1wNOK."web".".htm";
   }
}


sub FormularioUpload
{
	local($size, $id_project, @lista_ficheros) = @_;

	open(UPLOAD, "$plantilla_upload") || die;

	$upload{size} = $size;
	$upload{id_project} = $id_project;
	$$upload{file_list} = "";
	foreach $fichero (@lista_ficheros)
	{
		$upload{file_list} .= "<option value=\"$fichero\">$fichero\n";
	}

	while (<UPLOAD>)
	{
		$linea = $_;
		foreach $param (@param_upload)
		{
			$linea =~ s/#$param#/$upload{$param}/;
		}

		$linea = ModificaLink($linea);
		print $linea;
	}
	close UPLOAD;	
}

sub FormularioFinal
{

	local(%final) = @_;

	open(FINAL, "$plantilla_final") || die;
	while (<FINAL>)
	{
		$linea = $_;
		foreach $param (@param_final)
		{
			$linea =~ s/#$param#/$final{$param}/;
		}

		$linea = ModificaLink($linea);
		print $linea;
	}
	close FINAL;	
	
}

sub FormularioLogin
{
	local(%mis_datos) = @_;

	open(PLANTILLA1, "$plantilla_login");
	while (<PLANTILLA1>)
	{
		$linea = $_;

		foreach $campo (@param_login)
		{
			$linea =~ s/#$campo#/$mis_datos{$campo}/ ;
		}
		$linea = ModificaLink($linea);
		print $linea;
	}
	close PLANTILLA;
}

sub FormularioPresupuesto
{
	local(%presupuesto) = @_;

	if ($presupuesto{mode} eq "electronic" || $presupuesto{via} eq "via_web")
	{
        	open(PRESUPUESTO, "$plantilla_presupuesto_electr") || die "muere 1";
	} else
	{
        	open(PRESUPUESTO, "$plantilla_presupuesto_paper") || die "muere 2";
	}

        while (<PRESUPUESTO>)
        {
                $linea=$_;

                foreach $param (@param_presupuesto)
                {
                        $linea =~ s/#$param#/$presupuesto{$param}/;
                }

		foreach $param (@param_presupuesto_select)
		{
			$linea =~ s/value="$presupuesto{$param}"/value="$presupuesto{$param}" selected/;
		}

                $linea = ModificaLink($linea);
                print $linea;
        }
        close (PRESUPUESTO);
}

sub FormularioCreate
{
	local(%create) = @_;
        open(PLANTILLA, "$plantilla_create") || die("SE muerre");
        while (<PLANTILLA>)
        {
                $linea=$_;

                foreach $param (@param_create)
                {
                        $linea =~ s/#$param#/$create{$param}/;
                }

		foreach $param (@param_create_select)
		{
			$linea =~ s/value="$create{$param}"/value="$create{$param}" selected/;
		}

                $linea = ModificaLink($linea);
                print $linea;
        }
        close PLANTILLA;
}

sub FormularioQuote
{
	local(%mi_quote) = @_;
        open(QUOTE, "$plantilla_quote");

        while (<QUOTE>)
        {
                $linea=$_;

                foreach $param (@param_quote)
                {
                        $linea =~ s/#$param#/$mi_quote{$param}/;
                }

                $linea = ModificaLink($linea);
                print $linea;
        }
        close (QUOTE);
}

sub FormularioOrder
{
	local(%mi_order) = @_;

	open(ORDER, "$plantilla_order");

	while (<ORDER>)
	{
	        $linea=$_;

	        foreach $param (@param_order)
	        {
	                $linea =~ s/#$param#/$mi_order{$param}/;
	        }

	        $linea = ModificaLink($linea);
	        print $linea;
	}
	close (ORDER);
}

sub FormularioSeleccion
{
	open(ORDER, "$plantilla_mode");

	while (<ORDER>)
	{
	        $linea=$_;

	        $linea = ModificaLink($linea);
	        print $linea;
	}
	close (ORDER);
}

sub FormularioGQQ
{
	local(%mi_order) = @_;
	open(ORDER, "$plantilla_gqq");

	while (<ORDER>)
	{
	        $linea=$_;

	        foreach $param (@param_gqq)
	        {
	                $linea =~ s/#$param#/$mi_order{$param}/;
	        }

	        $linea = ModificaLink($linea);
	        print $linea;
	}
	close (ORDER);
}
1;
