#!/usr/bin/perl
# Generuje přehled objednávek z databáze. Přístup by měli mít jen zaměstnanci obchodu.
# (c) 2005 Daniel Zeman
# Licence: GNU GPL
# 13.12.2005: vytvořeno

use utf8;
use Encode;
use DBI;
# Přinutit Perl, aby UTF8 vypisoval jako UTF8 a nevymýšlel pro mě "vhodné" osmibitové kódování.
binmode(STDOUT, ":utf8");



# Zapamatovat si, kdy jsme s generováním stránky začali, abychom na konci mohli
# zjistit, jak dlouho nám to trvalo.
$starttime = time();



# Poslat MIME záhlaví dokumentu.
print("Content-Type: text/html; charset=utf-8\n\n");
# Poslat začátek stránky.
print <<EOF
<html>
  <head>
    <meta http-equiv="Content-Language" content="cs">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Přehled objednávek</title>
  </head>
  <body>
  <h1>Přehled objednávek</h1>
EOF
;
# Připojit se k databázi.
$databaze = DBI->connect("DBI:mysql:hry")
  or print("\n<font color=purple>Nelze se pripojit k databazi: $DBI::errstr</font>\n");
# Vypsat přehled objednávek.
vypsat_prehled_objednavek();
# Zjistit, jak dlouho nám to trvalo, a vypsat to na konec stránky.
my $hlaseni = sestavit_hlaseni_o_trvani_programu($starttime);
print("  <div align=right><address>$hlaseni</address></div>\n");
# Poslat konec stránky.
print <<EOF
  </body>
</html>
EOF
;



##############################################################################
# PODPROGRAMY
##############################################################################



#-----------------------------------------------------------------------------
# Vypíše přehled objednávek.
#-----------------------------------------------------------------------------
sub vypsat_prehled_objednavek
{
    # Získat z databáze přehled objednávek.
    my @nazvy0 = qw(objednavky.cas jmeno prijmeni ulice_a_dum obec psc email telefon objednavky.poznamka poznamka2 odber platba mezisoucet mnozstevni_sleva postovne celkem sleva_org_deti ico);
    my @nazvy1 = qw(kod_zbozi jednotkova_cena pocet cena_celkem nazev);
    my $nazvy0 = join(", ", @nazvy0);
    my $nazvy1 = join(", ", @nazvy1);
    my $dotaz = "SELECT $nazvy0, $nazvy1 FROM objednavky LEFT JOIN objzbozi ON objednavky.cas = objzbozi.cas LEFT JOIN zbozi ON objzbozi.kod_zbozi = zbozi.kod";
    my $dbdtz = $databaze->prepare($dotaz);
    $dbdtz->execute();
    # Pro další použití odstranit případné tečkované prefixy (názvy tabulek).
    @nazvy0 = map{s/\w+\.//; $_}(@nazvy0);
    my %objednavky;
    while(my @hodnoty = map{decode("utf8", $_)}($dbdtz->fetchrow_array()))
    {
        # Pokud je to první řádek dané objednávky, vytvořit záznam a zapsat do něj informace společné pro všechny řádky.
        my $cas = $hodnoty[0];
        unless(exists($objednavky{$cas}))
        {
            # Převést záznam do podoby hashe.
            my %zaznam;
            for(my $i = 0; $i<=$#nazvy0; $i++)
            {
                $zaznam{$nazvy0[$i]} = $hodnoty[$i];
            }
            $objednavky{$cas} = \%zaznam;
        }
        # Přidat do záznamu informace specifické pro daný řádek.
        my %zaznam;
        for(my $i = 0; $i<=$#nazvy1; $i++)
        {
            $zaznam{$nazvy1[$i]} = $hodnoty[$#nazvy0+1+$i];
        }
        push(@{$objednavky{$cas}{polozky}}, \%zaznam);
    }
    # Vypsat objednávky seřazené sestupně podle okamžiku objednání.
    my @objednavky = sort{$b<=>$a}(keys(%objednavky));
    print("  <table border=\"0\">\n");
    my $i_radek = 0;
    foreach my $cas (@objednavky)
    {
        my $tdatr = ++$i_radek % 2 ? " bgcolor=#D5D5D5" : " bgcolor=#E5E5E5";
        $tdatr .= " valign=top";
        print("    <tr>\n");
        $cas =~ m/(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/;
        my $formdatum = sprintf("%d.%d.%d", $3, $2, $1);
        my $formcas = sprintf("%d:%02d:%02d", $4, $5, $6);
        print("      <td$tdatr align=right>$formdatum</td>\n");
        print("      <td$tdatr align=right>$formcas</td>\n");
        my $cele_jmeno = "$objednavky{$cas}{jmeno} $objednavky{$cas}{prijmeni}";
        $cele_jmeno =~ s/^\s+//;
        $cele_jmeno =~ s/\s+/&nbsp;/g;
        $cele_jmeno =~ s/\s+$//;
        print("      <td$tdatr>$cele_jmeno</td>\n");
        my $misto = $objednavky{$cas}{odber} eq "paluba" ? "(osobně&nbsp;na&nbsp;Palubě)" : $objednavky{$cas}{obec};
        print("      <td$tdatr>$misto</td>\n");
        $misto =~ s/^\s+//;
        $misto =~ s/\s+/ /g;
        $misto =~ s/\s+$//;
        my $platba = $objednavky{$cas}{odber} eq "dobirka" ? "dobírkou" : $objednavky{$cas}{platba};
        print("      <td$tdatr>$platba</td>\n");
        my @polozky;
        foreach my $polozka (@{$objednavky{$cas}{polozky}})
        {
            my $poltext;
            if($polozka->{pocet}>1)
            {
                $poltext = "$polozka->{pocet} × ";
            }
            $poltext .= $polozka->{nazev};
            push(@polozky, $poltext);
        }
        my $polozky = join(", ", @polozky);
        print("      <td$tdatr>$polozky</td>\n");
        print("    </tr>\n");
    }
    print("  </table>\n");
}



#------------------------------------------------------------------------------
# Vypíše dobu, po kterou program běžel. K tomu potřebuje dostat časové otisky
# začátku a konce.
#------------------------------------------------------------------------------
sub sestavit_hlaseni_o_trvani_programu
{
    my $starttime = shift;
    my $stoptime = time();
    my $cas = $stoptime-$starttime;
    my $hod = int($cas/3600);
    my $min = int(($cas%3600)/60);
    my $sek = $cas%60;
    my $hlaseni;
    if($hod==0)
    {
        if($min==0)
        {
            $hlaseni = sprintf("Program běžel $sek vteřin%s.\n", $sek==1 ? "u" : $sek>=2 && $sek<=4 ? "y" : "");
        }
        else
        {
            $hlaseni = sprintf("Program běžel %d:%02d minut.\n", $min, $sek);
        }
    }
    else
    {
        $hlaseni = sprintf("Program běžel %2d:%02d:%02d hodin.\n", $hod, $min, $sek);
    }
    return $hlaseni;
}
