#!/usr/bin/perl
##
## ordine.pl
##
#
# Incorpora la libreria di decodifica dei dati.
#
require ('mini-lib.pl');
#
# &Metodo_non_gestibile ()
#
sub Metodo_non_gestibile
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Errore</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>Metodo $ENV{REQUEST_METHOD} non gestibile.</H1>\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &Verifica_dati ()
#
sub Verifica_dati
{
    if ($DATI{articolo} eq "0")
      {
        return (0);
      }
    if ($DATI{nome} eq "")
      {
        return (0);
      }
    if ($DATI{cognome} eq "")
      {
        return (0);
      }
    if ($DATI{via} eq "")
      {
        return (0);
      }
    if ($DATI{cap} eq "")
      {
        return (0);
      }
    if ($DATI{citta} eq "")
      {
        return (0);
      }
    if ($DATI{email} eq "")
      {
        return (0);
      }
    if ($DATI{carta_num} eq "")
      {
        return (0);
      }
    return (1);
}
#
# &Dati_nascosti ()
#
sub Dati_nascosti
{
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"articolo\" value=\"$DATI{articolo}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"nome\" value=\"$DATI{nome}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"cognome\" value=\"$DATI{cognome}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"via\" value=\"$DATI{via}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"n\" value=\"$DATI{n}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"cap\" value=\"$DATI{cap}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"citta\" value=\"$DATI{citta}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"email\" value=\"$DATI{email}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"carta\" value=\"$DATI{carta}\">\n");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"carta_num\" value=\"$DATI{carta_num}\">\n");
}
#
# &Richiedi_conferma ()
#
sub Richiedi_conferma
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Conferma</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>Conferma dati dell'ordinazione.</H1>\n");
    print STDOUT ("Si prega di controllare i dati e di confermare se tutto ");
    print STDOUT ("appare in ordine.\n");
    print STDOUT ("<PRE>");
    print STDOUT ("Nominativo: $DATI{nome} $DATI{cognome}\n");
    print STDOUT ("Indirizzo: $DATI{via} $DATI{n}\n" );
    print STDOUT ("           $DATI{cap} $DATI{citta}\n" );
    print STDOUT ("           $DATI{email}\n" );
    print STDOUT ("Carta: $DATI{carta} $DATI{carta_num}\n");
    print STDOUT ("Articolo ordinato: $DATI{articolo}\n");
    print STDOUT ("</PRE>");
    print STDOUT ("<FORM action=\"/cgi-bin/ordine.pl\" method=\"POST\">\n");
    print STDOUT ("<P>");
    print STDOUT
      ("<INPUT type=\"hidden\" name=\"modulo\" value=\"ordine conferma\">\n");
    #
    &Dati_nascosti;
    #
    print STDOUT ("<INPUT type=\"submit\" value=\"Conferma i dati e l'ordine\">\n");
    print STDOUT ("</FORM>\n");
    #
    print STDOUT ("Se i dati non sono come desiderato, si prega di ritornare\n");
    print STDOUT ("alla <A href=\"/ordine.html\">compilazione del modulo</A>.\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &Dati_insufficienti ()
#
sub Dati_insufficienti
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Errore</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>I dati inseriti nel modello sono insufficienti.</H1>\n");
    print STDOUT ("Si prega di controllare e aggiungere i dati mancanti.\n");
    print STDOUT ("<P><A href=\"/ordine.html\">");
    print STDOUT ("Ritorna al modulo di ordinazione</A>\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &Modulo_errato ()
#
sub Modulo_errato
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Errore</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>Il modulo inviato non è previsto.</H1>\n");
    print STDOUT ("Si prega di utilizzare il \n");
    print STDOUT ("<A href=\"/ordine.html\">");
    print STDOUT ("modulo d'ordine standard</A>.\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &E_mail_errore ()
#
sub E_mail_errore
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Errore</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>Impossibile inviare l'ordine</H1>\n");
    print STDOUT ("Si prega di scusare l'inconveniente.\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &E_mail ( <destinatario>, <oggetto>, <contenuto> )
#
sub E_mail
{
    local ($destinatario) = $_[0];
    local ($oggetto)      = $_[1];
    local ($contenuto)    = $_[2];
    #
    local ($sendmail)     = "/bin/mail $destinatario";
    #
    unless (open (EMAIL, "| $sendmail "))
      {
        return (0);
      }
    #
    print EMAIL ("$oggetto\n");
    print EMAIL ("\n\n");
    print EMAIL ("$contenuto\n");
    print EMAIL (".\n");
    #
    close( EMAIL );
}
#
# &Invio_ordine ()
#
sub Invio_ordine {
    local ($ordine) = "";
    #
    $ordine = $ordine . "Nominativo: $DATI{nome} $DATI{cognome}\n" ;
    $ordine = $ordine . "Indirizzo: $DATI{via} $DATI{n}\n" ;
    $ordine = $ordine . "           $DATI{cap} $DATI{citta}\n";
    $ordine = $ordine . "           $DATI{email}\n" ;
    $ordine = $ordine . "Carta: $DATI{carta} $DATI{carta_num}\n" ;
    $ordine = $ordine . "Articolo ordinato: $DATI{articolo}\n" ;
    #
    if (&E_mail ('root@localhost', 'Ordine da modulo FORM ordine.pl', $ordine))
      {
        print STDOUT ("Content-type: text/html\n");
        print STDOUT ("\n");
        print STDOUT ("<HTML>\n");
        print STDOUT ("<HEAD>\n");
        print STDOUT ("<TITLE>Conferma invio</TITLE>\n");
        print STDOUT ("</HEAD>\n");
        print STDOUT ("<BODY>\n");
        print STDOUT ("<H1>Conferma invio</H1>\n");
        print STDOUT ("Il Vostro ordine è stato inviato.\n");
        print STDOUT ("Grazie.\n");
        print STDOUT ("</BODY>\n");
        print STDOUT ("</HTML>\n");
      }
    else
      {
        &E_mail_errore;
      }
}
##
## Inizio del programma.
##
local (%DATI) = ();
#
# Decodifica i dati in funzione del tipo di metodo della richiesta.
#
if ($ENV{REQUEST_METHOD} eq 'GET')
  {
    %DATI = &Decodifica_GET;
  }
elsif ($ENV{REQUEST_METHOD} eq 'POST')
  {
    %DATI = &Decodifica_POST;
  }
else
  {
    &Metodo_non_gestibile;
  }
#
# Attraverso il dato memorizzato con il nome «modulo» si determina
# a che punto sia la compilazione.
# «ordine base» è il modulo di partenza, mentre «ordine conferma»
# è quello generato da questo programma per conferma.
#
if ($DATI{modulo} eq 'ordine base')
  {
    #
    # Prima fase: si verificano i dati e si chiede conferma all'utente.
    #
    if (&Verifica_dati)
      {
        &Richiedi_conferma;
      }
    else
      {
        &Dati_insufficienti;
      }
  }
elsif ($DATI{modulo} eq 'ordine conferma')
  {
    #
    # Seconda fase: si verificano i dati e si invia l'ordine.
    #
    if (&Verifica_dati)
      {
        &Invio_ordine;
      }
    else
      {
        &Dati_insufficienti;
      }
  }
else
  {
    #
    # È stato indicato un modulo non previsto.
    #
    &Modulo_errato;
  }
#
1;
#
