#!/usr/bin/perl
# Internetový obchod s hrami / funkce pro obsloužení objednávky.
# (c) 2007 Dan Zeman <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL

package objednavka;
use utf8;
use Encode;
use pomoc;
use kosik;
use mail;



#------------------------------------------------------------------------------
# Sestaví HTML s objednávkovým formulářem. Tato verze se momentálně volá pouze
# v případě, že kontrola odhalila chyby v objednávce a chceme po uživateli, aby
# je opravil. V normálním případě se postupně zobrazí formuláře z funkcí
# formular1() a formular2(). Bylo by vhodné, aby se i při chybě volaly
# formuláře 1 a 2 a tato funkce aby zcela zmizela.
#------------------------------------------------------------------------------
sub formular
{
    # Pokud to není poprvé, co tomuto uživateli ukazujeme objednávkový formulář,
    # je možné, že už některé své údaje zadal. Proto se podíváme do hashe
    # objednávka (to nejsou přímo parametry CGI, tady je to už trochu
    # předchroustáno). Tento hash se plní voláním objednavka::zjistit().
    my $objednavka = shift;
    my $html;
    $html .= "<form method=get action=\"prodej.pl\">\n";
    my %checked;
    # Vložit do formuláře neviditelné pole s informací, kdy a komu byl formulář vygenerován.
    # Díky tomu dokážeme později odhadnout, jestli uživatel omylem neodeslal formulář dvakrát.
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
    my $cas = sprintf("%04d%02d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
    $html .= "  <input type=hidden name=gencas value=\"$cas\">\n";
    $html .= "  <input type=hidden name=genadr value=\"$ENV{REMOTE_ADDR}\">\n";
    my $zkosik = kosik::zakodovat($objednavka->{kosik});
    $html .= "  <input type=hidden name=kosik value=\"$zkosik\">\n";
    # Vypsat kolonky, v nichž lze žádat o slevu.
    $html .= "  <p align=left><b>Slevy:</b><br>\n";
    $checked{sleva_org_deti} = "checked=1" if($objednavka->{sleva_org_deti});
    $html .= "    Máte-li slevový kód, napište ho sem: <input type=text name=slevkod value=\"$objednavka->{slevkod}\" size=\"20\"><br>\n";
    $html .= "    <input type=checkbox name=organizace value=\"ano\" $checked{sleva_org_deti}> Jsme organizace pracující s&nbsp;mládeží a žádáme o slevu.\n";
    $html .= "    Naše IČO je: <input name=ico type=text value=\"$objednavka->{ico}\" size=\"10\"><br>\n";
    $html .= "  </p>\n";
    # Vypsat způsob dodání a placení.
    $html .= "  <p align=left><b>Zboží:</b><br>\n";
    $checked{$objednavka->{odber}} = "checked=1";
    $html .= "    <input type=radio name=prevzeti value=\"dobirka\" $checked{dobirka}> chci zaslat poštou na území Česka<br>\n";
    $html .= "    <input type=radio name=prevzeti value=\"paluba\" $checked{paluba}> si vyzvednu osobně v&nbsp;Praze u Anděla na Palubě<br>\n";
    $html .= "    <input type=radio name=prevzeti value=\"cm\" $checked{paluba}> si vyzvednu osobně v&nbsp;Praze na Černém Mostě\n";
    $html .= "  </p>\n";
    $html .= "  <p align=left><b>Zaplatím:</b><br>\n";
    $checked{$objednavka->{platba}} = "checked=1";
    $html .= "    <input type=radio name=platba value=\"hotově\" $checked{\"hotově\"}> hotově (dobírkou či osobně při převzetí)<br>\n";
    $html .= "    <input type=radio name=platba value=\"převodem\" $checked{\"převodem\"}> předplatbou (bezhotovostním převodem)\n";
    $html .= "  </p>\n";
    # Vypsat kolonky pro kontaktní údaje.
    $html .= "  <h3 align=left>Vyplňte kontaktní údaje:</h3>\n";
    $html .= "  <table border=\"0\">\n";
    $html .= "    <tr><td><p>Jméno: </p></td><td><p><input name=jmeno type=text value=\"$objednavka->{jmeno}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>Příjmení: </p></td><td><p><input name=prijmeni type=text value=\"$objednavka->{prijmeni}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>E-mail: </p></td><td><p><input name=email type=text value=\"$objednavka->{email}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td colspan=\"2\">(E-mailem vám zašleme jak potvrzení objednávky, tak upřesnění dodání.)</td></tr>\n";
    $html .= "    <tr><td><p>Tel.: </p></td><td><p><input name=tel type=text value=\"$objednavka->{tel}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>Poznámka: </p></td><td><p><input name=poznamka type=text value=\"$objednavka->{poznamka}\" size=\"20\"></p></td></tr>\n";
    $html .= "  </table>\n";
    # Vypsat kolonky pro zasílací adresu.
    $html .= "  <h3 align=left>Vyplňte adresu při zaslání na dobírku:</h3>\n";
    $html .= "  <table border=\"0\">\n";
    $html .= "    <tr><td><p>Ulice a dům: </p></td><td><p><input name=ulice type=text value=\"$objednavka->{ulice}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>Obec: </p></td><td><p><input name=obec type=text value=\"$objednavka->{obec}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>PSČ: </p></td><td><p><input name=psc type=text value=\"$objednavka->{psc}\" size=\"20\"></p></td></tr>\n";
    $html .= "  </table>\n";
    # Vypsat závěrečné kolonky.
    $html .= "  <h3 align=left>Chcete-li jiné fakturační údaje než zasílací, použijte poznámku:</h3>\n";
    $html .= "  <p align=left>Poznámka 2: <input name=poznamka2 type=text value=\"$objednavka->{poznamka2}\" size=\"50\">\n";
    $html .= "  <p>Tímto způsobem lze objednat zboží k&nbsp;dodání na území Česka. Máte-li zájem o dodání do jiných zemí, kontaktujte nás na e-mailu <a href=\"mailto:obchod\@hrejsi.cz\">obchod\@hrejsi.cz</a>.<br>\n";
    $html .= "  <input type=hidden name=hra value=objednavka>\n";
    $html .= "  <input type=submit value=\"Odeslat objednávku\"><br>\n";
    $html .= "</form>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví HTML s prvním objednávkovým formulářem.
# V této fázi zjistíme údaje, které ovlivňují celkovou cenu:
# způsob placení a dodání, slevové kódy a žádost o klubové ceny.
#------------------------------------------------------------------------------
sub formular1
{
    # Pokud to není poprvé, co tomuto uživateli ukazujeme objednávkový formulář,
    # je možné, že už některé své údaje zadal. Proto se podíváme do hashe
    # objednávka (to nejsou přímo parametry CGI, tady je to už trochu
    # předchroustáno). Tento hash se plní voláním objednavka::zjistit().
    my $objednavka = shift;
    my $html;
    $html .= "<form method=get action=\"prodej.pl\">\n";
    $html .= odsadit(formpar(), 2);
    my %checked;
    # Vložit do formuláře neviditelné pole s informací, kdy a komu byl formulář vygenerován.
    # Díky tomu dokážeme později odhadnout, jestli uživatel omylem neodeslal formulář dvakrát.
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
    my $cas = sprintf("%04d%02d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
    $html .= "  <input type=hidden name=gencas value=\"$cas\">\n";
    $html .= "  <input type=hidden name=genadr value=\"$ENV{REMOTE_ADDR}\">\n";
    my $zkosik = kosik::zakodovat($objednavka->{kosik});
    $html .= "  <input type=hidden name=kosik value=\"$zkosik\">\n";
    # Vypsat kolonky, v nichž lze žádat o slevu.
    $html .= "  <p align=left><b>Slevy:</b><br>\n";
    $checked{sleva_org_deti} = "checked=1" if($objednavka->{sleva_org_deti});
    $html .= "    Máte-li slevový kód, napište ho sem: <input type=text name=slevkod value=\"$objednavka->{slevkod}\" size=\"20\"><br>\n";
    $html .= "    <input type=checkbox name=organizace value=\"ano\" $checked{sleva_org_deti}> Jsme organizace pracující s&nbsp;mládeží a žádáme o slevu.\n";
    $html .= "    Naše IČO je: <input name=ico type=text value=\"$objednavka->{ico}\" size=\"10\"><br>\n";
    $html .= "  </p>\n";
    # Vypsat způsob dodání a placení.
    $objednavka->{odber} = "dobirka" if($objednavka->{odber} !~ m/^(dobirka|paluba|cm)$/);
    $checked{$objednavka->{odber}} = "checked=1";
    $html .= "  <table celpadding=0 cellspacing=0>\n";
    $html .= "    <tr><td colspan=5><b>Zboží:</b></td></tr>\n";
    $html .= "    <tr><td><input type=radio name=prevzeti value=\"dobirka\" $checked{dobirka}></td><td></td><td colspan=3>chci zaslat poštou na území Česka</td></tr>\n";
    if($objednavka->{skladem_cerny_most})
    {
        $html .= "    <tr><td colspan=2></td><td><input type=radio name=rychlost value=\"obyčejně\" checked=1></td><td></td><td>obyčejně (2 - 10 pracovních dnů)</td></tr>\n";
        $html .= "    <tr><td colspan=2></td><td><input type=radio name=rychlost value=\"zrychleně\"></td><td></td><td>zrychleně (2 - 5 pracovních dnů; +30&nbsp;Kč)</td></tr>\n";
        $html .= "    <tr><td colspan=2></td><td><input type=radio name=rychlost value=\"expresně\"></td><td></td><td>expresně (do 2 pracovních dnů; +50&nbsp;Kč)</td></tr>\n";
    }
    else
    {
        $html .= "    <input type=hidden name=rychlost value=\"obyčejně\">\n";
    }
    $html .= "    <tr><td><input type=radio name=prevzeti value=\"paluba\" $checked{paluba}></td><td></td><td colspan=3>si vyzvednu osobně v&nbsp;Praze u Anděla na Palubě</td></tr>\n";
    $html .= "    <tr><td><input type=radio name=prevzeti value=\"cm\" $checked{paluba}></td><td></td><td colspan=3>si vyzvednu osobně v&nbsp;Praze na Černém Mostě</td></tr>\n";
    $html .= "  </table>\n";
    $html .= "  <p align=left><b>Zaplatím:</b><br>\n";
    $objednavka->{platba} = "hotově" if($objednavka->{platba} !~ m/^(hotově|převodem)$/);
    $checked{$objednavka->{platba}} = "checked=1";
    $html .= "    <input type=radio name=platba value=\"hotově\" $checked{\"hotově\"}> hotově (dobírkou či osobně při převzetí)<br>\n";
    $html .= "    <input type=radio name=platba value=\"převodem\" $checked{\"převodem\"}> předplatbou (bezhotovostním převodem)\n";
    $html .= "  </p>\n";
    $html .= "  <input type=hidden name=hra value=konec2>\n";
    $html .= "  <input type=submit value=\"Pokračovat v&nbsp;objednávce\"><br>\n";
    $html .= "</form>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví HTML s druhým objednávkovým formulářem.
# V této fázi zjistíme kontaktní údaje na objednatele.
#------------------------------------------------------------------------------
sub formular2
{
    # Pokud to není poprvé, co tomuto uživateli ukazujeme objednávkový formulář,
    # je možné, že už některé své údaje zadal. Proto se podíváme do hashe
    # objednávka (to nejsou přímo parametry CGI, tady je to už trochu
    # předchroustáno). Tento hash se plní voláním objednavka::zjistit().
    my $objednavka = shift;
    my $html;
    $html .= "<form method=get action=\"prodej.pl\">\n";
    $html .= odsadit(formpar(), 2);
    my %checked;
    # Vložit do formuláře neviditelné pole s informací, kdy a komu byl formulář vygenerován.
    # Díky tomu dokážeme později odhadnout, jestli uživatel omylem neodeslal formulář dvakrát.
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
    my $cas = sprintf("%04d%02d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
    $html .= "  <input type=hidden name=gencas value=\"$cas\">\n";
    $html .= "  <input type=hidden name=genadr value=\"$ENV{REMOTE_ADDR}\">\n";
    my $zkosik = kosik::zakodovat($objednavka->{kosik});
    $html .= "  <input type=hidden name=kosik value=\"$zkosik\">\n";
    # Uložit do formuláře údaje o slevách. Uživateli už je vypisovat nemusíme,
    # protože se mu objevily výše spolu s výpisem obsahu košíku.
    if($objednavka->{sleva_org_deti})
    {
        $html .= "  <input type=hidden name=organizace value=ano>\n";
        $html .= "  <input type=hidden name=ico value=\"$objednavka->{ico}\">\n";
    }
    if($objednavka->{slevkod} ne "")
    {
        $html .= "  <input type=hidden name=slevkod value=\"$objednavka->{slevkod}\">\n";
    }
    # Vypsat způsob dodání a placení.
    if($objednavka->{odber} eq "paluba")
    {
        $html .= "  <p align=left>Zboží si vyzvednu osobně v&nbsp;Praze u Anděla na Palubě.\n";
        $html .= "    <input type=hidden name=prevzeti value=paluba>\n";
        $html .= "  </p>\n";
    }
    elsif($objednavka->{odber} eq "cm")
    {
        $html .= "  <p align=left>Zboží si vyzvednu osobně v&nbsp;Praze na Černém Mostě.\n";
        $html .= "    <input type=hidden name=prevzeti value=cm>\n";
        $html .= "  </p>\n";
    }
    else
    {
        $html .= "  <p align=left>Zboží chci zaslat poštou $objednavka->{rychlost} na území Česka.\n";
        $html .= "    <input type=hidden name=prevzeti value=dobirka>\n";
        $html .= "  </p>\n";
    }
    if($objednavka->{platba} eq "převodem")
    {
        $html .= "  <p align=left>Zaplatím předem bezhotovostním převodem na účet.\n";
        $html .= "    <input type=hidden name=platba value=\"převodem\">\n";
        $html .= "  </p>\n";
    }
    else
    {
        $html .= "  <p align=left>Zaplatím hotově při převzetí zboží.\n";
        $html .= "    <input type=hidden name=platba value=\"hotově\">\n";
        $html .= "  </p>\n";
    }
    # Vypsat kolonky pro kontaktní údaje.
    $html .= "  <h3 align=left>Vyplňte kontaktní údaje:</h3>\n";
    $html .= "  <table border=\"0\">\n";
    $html .= "    <tr><td><p>Jméno: </p></td><td><p><input name=jmeno type=text value=\"$objednavka->{jmeno}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>Příjmení: </p></td><td><p><input name=prijmeni type=text value=\"$objednavka->{prijmeni}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>E-mail: </p></td><td><p><input name=email type=text value=\"$objednavka->{email}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td colspan=\"2\">(E-mailem vám zašleme jak potvrzení objednávky, tak upřesnění dodání.)</td></tr>\n";
    $html .= "    <tr><td><p>Tel.: </p></td><td><p><input name=tel type=text value=\"$objednavka->{tel}\" size=\"20\"></p></td></tr>\n";
    my $checked = " checked=1" if($objednavka->{sms});
    $html .= "    <tr><td colspan=2><p><input type=checkbox name=sms value=1$checked> Kromě e-mailu si přeji i vyrozumění prostřednictvím SMS.</p></td></tr>\n";
    $html .= "    <tr><td><p>Poznámka: </p></td><td><p><input name=poznamka type=text value=\"$objednavka->{poznamka}\" size=\"20\"></p></td></tr>\n";
    $html .= "  </table>\n";
    # Vypsat kolonky pro zasílací adresu.
    $html .= "  <h3 align=left>Vyplňte adresu při zaslání na dobírku:</h3>\n";
    $html .= "  <table border=\"0\">\n";
    $html .= "    <tr><td><p>Ulice a dům: </p></td><td><p><input name=ulice type=text value=\"$objednavka->{ulice}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>Obec: </p></td><td><p><input name=obec type=text value=\"$objednavka->{obec}\" size=\"20\"></p></td></tr>\n";
    $html .= "    <tr><td><p>PSČ: </p></td><td><p><input name=psc type=text value=\"$objednavka->{psc}\" size=\"20\"></p></td></tr>\n";
    $html .= "  </table>\n";
    # Vypsat závěrečné kolonky.
    $html .= "  <h3 align=left>Chcete-li jiné fakturační údaje než zasílací, použijte poznámku:</h3>\n";
    $html .= "  <p align=left>Poznámka 2: <input name=poznamka2 type=text value=\"$objednavka->{poznamka2}\" size=\"50\">\n";
    $html .= "  <p>Tímto způsobem lze objednat zboží k&nbsp;dodání na území Česka. Máte-li zájem o dodání do jiných zemí, kontaktujte nás na e-mailu <a href=\"mailto:obchod\@hrejsi.cz\">obchod\@hrejsi.cz</a>.<br>\n";
    $html .= "  <input type=hidden name=hra value=objednavka>\n";
    $html .= "  <input type=submit name=submit value=\"Zpět\">\n";
    $html .= "  <input type=submit name=submit value=\"Odeslat objednávku\"><br>\n";
    $html .= "</form>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Z parametrů skriptu posbírá informace o objednávce a sestaví z nich hash.
#------------------------------------------------------------------------------
sub zjistit
{
    my $pole = shift; # odkaz na hash s ostatními parametry skriptu
    my $databaze = shift;
    my %objednavka;
    # Dekódovat košík.
    $objednavka{kosik_text} = $pole->{kosik};
    $objednavka{kosik} = kosik::dekodovat($pole->{kosik});
    # Z hashe s parametry skriptu zkopírovat informace o způsobu fakturace, platby a dodání.
    $objednavka{jmeno} = $pole->{jmeno};
    $objednavka{jmeno} =~ s/^\s+//;
    $objednavka{jmeno} =~ s/\s+$//;
    $objednavka{jmeno} =~ s/\s+/ /g;
    $objednavka{prijmeni} = $pole->{prijmeni};
    $objednavka{prijmeni} =~ s/^\s+//;
    $objednavka{prijmeni} =~ s/\s+$//;
    $objednavka{prijmeni} =~ s/\s+/ /g;
    $objednavka{ulice_a_dum} = $pole->{ulice};
    $objednavka{ulice_a_dum} =~ s/^\s+//;
    $objednavka{ulice_a_dum} =~ s/\s+$//;
    $objednavka{ulice_a_dum} =~ s/\s+/ /g;
    $objednavka{obec} = $pole->{obec};
    $objednavka{obec} =~ s/^\s+//;
    $objednavka{obec} =~ s/\s+$//;
    $objednavka{obec} =~ s/\s+/ /g;
    $objednavka{psc} = $pole->{psc};
    $objednavka{psc} =~ s/^\s+//;
    $objednavka{psc} =~ s/\s+$//;
    $objednavka{psc} =~ s/\s+//g;
    $objednavka{email} = $pole->{email};
    $objednavka{email} =~ s/^\s+//;
    $objednavka{email} =~ s/\s+$//;
    $objednavka{telefon} = $pole->{tel};
    $objednavka{sms} = $pole->{sms}; # 1 ... chce SMS
    $objednavka{poznamka} = $pole->{poznamka};
    $objednavka{poznamka2} = $pole->{poznamka2};
    $objednavka{odber} = $pole->{prevzeti};
    $objednavka{rychlost} = $pole->{rychlost};
    $objednavka{platba} = $pole->{platba};
    $objednavka{platba} =~ s/prevodem/převodem/;
    $objednavka{platba} =~ s/hotove/hotově/;
    $objednavka{sleva_org_deti} = $pole->{organizace} eq "ano" ? 1 : 0;
    $objednavka{ico} = $pole->{ico};
    $objednavka{ico} =~ s/^\s+//;
    $objednavka{ico} =~ s/\s+$//;
    $objednavka{slevkod} = $pole->{slevkod};
    $objednavka{slevkod} =~ s/\s//g;
    # Přidat informaci o čase vygenerování objednávkového formuláře a IP adrese, pro kterou byl vygenerován.
    $objednavka{gencas} = $pole->{gencas};
    $objednavka{genadr} = $pole->{genadr};
    # Přidat informaci o aktuálním čase jako identifikátor objednávky.
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
    $objednavka{cas} = sprintf("%04d%02d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
    # Dopočítat výši poštovného, slevy a celkovou hodnotu objednávky.
    kosik::dopocitat($databaze, $objednavka{kosik}, \%objednavka);
    # Vrátit záznam o objednávce.
    return \%objednavka;
}



#------------------------------------------------------------------------------
# Zkontroluje úplnost a správnost údajů v objednávce. Případné nedostatky
# popíše do objednávky do položky "chyby". Musí zkontrolovat i obsah košíku,
# protože se stává, že uživatelé mají v cachi starší verzi stránky, která jim
# poskytne odkazy na zboží, jež ve skutečnosti nemáme na skladě. Díky tomu jako
# vedlejší produkt uloží do objednávky výpis obsahu košíku do e-mailu.
#------------------------------------------------------------------------------
sub zkontrolovat_objednavku
{
    my $objednavka = shift;
    my $chyba = 0;
    # Košík nesmí být prázdný.
    if(!@{$objednavka->{kosik}})
    {
        push(@{$objednavka->{chyby}}, "Váš košík je prázdný, neobjednali jste si žádné zboží.");
        $chyba = 1;
    }
    # Jméno i příjmení musí být neprázdné.
    $objednavka->{jmeno} =~ s/^\s+//;
    $objednavka->{jmeno} =~ s/\s+$//;
    $objednavka->{prijmeni} =~ s/^\s+//;
    $objednavka->{prijmeni} =~ s/\s+$//;
    if($objednavka->{jmeno} eq "" || $objednavka->{prijmeni} eq "")
    {
        push(@{$objednavka->{chyby}}, "Neuvedli jste jméno nebo příjmení.");
        $chyba = 1;
    }
    else
    {
        # Jestliže jméno nebo příjmení neobsahuje ani jedno velké písmeno, převést první znak na velké písmeno.
        # Test na velké písmeno uvnitř řetězce má pomoci rozlišit, kdy jde o ignoranci objednatele a kdy
        # o příjmení typu "van de Graaf".
        if(lc($objednavka->{jmeno}) eq $objednavka->{jmeno})
        {
            $objednavka->{jmeno} =~ s/^(.)/\u$1/;
        }
        if(lc($objednavka->{prijmeni}) eq $objednavka->{prijmeni})
        {
            $objednavka->{prijmeni} =~ s/^(.)/\u$1/;
        }
    }
    # E-mail musí vypadat jako běžný e-mail, tj. např. musí obsahovat zavináč a na konci musí být dva znaky nebo vyjmenované domény.
    $objednavka->{email} =~ s/^\s+//;
    $objednavka->{email} =~ s/\s+$//;
    if($objednavka->{email} !~ m/(\w|[-\._])+\@(\w|[-\._])+\.(\w\w|net|com|org|edu|mil|gov|biz|info)$/i)
    {
        push(@{$objednavka->{chyby}}, "E-mailová adresa je asi chybná.");
        $chyba = 1;
    }
    # Má-li se zboží zasílat na dobírku, musí být vyplněna adresa.
    if($objednavka->{odber} !~ m/^(dobirka|cm|paluba)$/)
    {
        $objednavka->{odber} = "dobirka";
    }
    if($objednavka->{odber} eq "dobirka")
    {
        $objednavka->{ulice_a_dum} =~ s/^\s+//;
        $objednavka->{ulice_a_dum} =~ s/\s+$//;
        $objednavka->{obec} =~ s/^\s+//;
        $objednavka->{obec} =~ s/\s+$//;
        $objednavka->{psc} =~ s/^\s+//;
        $objednavka->{psc} =~ s/\s+$//;
        my @chybadr = grep{$objednavka->{$_} =~ m/^\s*$/}("ulice_a_dum", "obec", "psc");
        if(@chybadr)
        {
            my $chybadr = join(", ", @chybadr);
            # Nahradit poslední čárku spojkou "a".
            $chybadr =~ s/, ([^,]*)$/ a $1/;
            # Doplnit diakritiku a velká písmena do názvů polí, než budou prezentována uživateli.
            $chybadr =~ s/ulice_a_dum/ulice/;
            $chybadr =~ s/psc/PSČ/;
            push(@{$objednavka->{chyby}}, "U dodávek na dobírku musí být správně uvedena dodací adresa. Ve vaší adrese však chybí $chybadr.");
            $chyba = 1;
        }
        if($objednavka->{psc} !~ m/^[1234567]\d\d\d\d$/)
        {
            push(@{$objednavka->{chyby}}, "To, co jste vyplnili do kolonky PSČ, není platné české poštovní směrovací číslo. Pokud chcete zaslat zboží do zahraničí, je to možné, ale musíte nás <a href=\"mailto:obchod\@hrejsi.cz\">kontaktovat e-mailem</a> a počítat s&nbsp;podstatně vyššími náklady.");
            $chyba = 1;
        }
        # Při zrychleném nebo expresním dodání musí být navíc uveden i telefon.
        if($objednavka->{rychlost} ne "obyčejně" && $objednavka->{telefon} !~ m/\d+/)
        {
            push(@{$objednavka->{chyby}}, "U zrychlených a expresních dodávek musí být uvedeno telefonní číslo.");
            $chyba = 1;
        }
    }
    # IČO nesmí obsahovat nic jiného než číslice.
    if(exists($objednavka->{ico}) && $objednavka->{ico} =~ m/\D/)
    {
        push(@{$objednavka->{chyby}}, "IČO nesmí obsahovat nic jiného než číslice.");
        $chyba = 1;
    }
    # Nelze žádat o slevu pro organizace pracující s mládeží, aniž by bylo uvedeno IČO.
    if($objednavka->{sleva_org_deti} && $objednavka->{ico} =~ m/^\s*$/)
    {
        push(@{$objednavka->{chyby}}, "Nelze žádat o slevu pro organizace pracující s&nbsp;mládeží, není-li uvedeno IČO.");
        $chyba = 1;
    }
    # Ověřit platnost slevového kódu.
    # Zatím byly vydány tyto slevové kódy (bez rozlišení malých a velkých písmen):
    # DES7121, ZAK7121
    # Oba platí do 1.12.2007 a způsobují slevu 5 %. Není možné je aplikovat na klubové, členské ani hermanské ceny.
    # Slevu také nelze použít na akční zboží (má zaškrtnuté políčko sleva).
    if(exists($objednavka->{slevkod}))
    {
        # Odstranit ze slevového kódu všechny mezery, na ty nehrajeme.
        $objednavka->{slevkod} =~ s/\s//gs;
        if($objednavka->{slevkod} ne "" && $objednavka->{slevkod} !~ m/^(DES|ZAK)7121$/i)
        {
            push(@{$objednavka->{chyby}}, "Neplatný slevový kód.");
            $chyba = 1;
        }
    }
    return !$chyba;
}



#------------------------------------------------------------------------------
# Zkontroluje správnost objednávky, vygeneruje potvrzovací (nebo zamítací) HTML
# kód, vygeneruje a pošle maily s objednávkou, uloží údaje na disk a do
# databáze.
#------------------------------------------------------------------------------
sub zpracovat
{
    my $objednavka = shift; # odkaz na hash
    my $databaze = shift;
    my $uspech = zkontrolovat_objednavku($objednavka);
    my $html;
    if(!$uspech)
    {
        $html .= "<h1><font color=red>Vaše objednávka nebyla odeslána!</font></h1>\n";
        $html .= "<p>V&nbsp;objednávce byly zjištěny následující nedostatky:</p>\n";
        $html .= "<ul>\n";
        foreach my $chyba (@{$objednavka->{chyby}})
        {
            $html .= "<li>$chyba</li>\n";
        }
        $html .= "</ul>\n";
        # Vypsat případná varování (např. o zboží, které jsme z košíku odstranili, protože ho neprodáváme).
        if(@{$objednavka->{varovani}})
        {
            $html .= "<h2>Varování</h2>\n";
            $html .= "<ul>\n";
            foreach my $varovani (@{$objednavka->{varovani}})
            {
                $html .= "<li>$varovani</li>\n";
            }
            $html .= "</ul>\n";
        }
        $html .= kosik::html($objednavka, 0);
        my $url = main::urlpar("hra=objednat");
        $html .= formular($objednavka);
    }
    # Kontrola objednávky skončila úspěchem.
    else
    {
        my $mail;
        $html .= "<h1>Objednávka byla úspěšně zpracována</h1>\n";
        if($objednavka->{platba} eq "převodem")
        {
            $mail .= "PLATBA PŘEDEM\n";
            $mail .= "Až si tuto objednávku přečte náš zaměstnanec a zkontroluje, že všechno zboží máme skladem, dostanete další mail s číslem účtu, na který máte platbu poslat.\n\n";
        }
        # Vypsat případná varování (např. o zboží, které jsme z košíku odstranili, protože ho neprodáváme).
        if(@{$objednavka->{varovani}})
        {
            $html .= "<h2>Varování</h2>\n";
            $html .= "<ul>\n";
            foreach my $varovani (@{$objednavka->{varovani}})
            {
                $html .= "<li>$varovani</li>\n";
            }
            $html .= "</ul>\n";
            $html .= "<p>Zbytek vaší objednávky byl v&nbsp;pořádku odeslán.</p>\n";
        }
        $html .= "<p>Děkujeme, že jste si objednali níže uvedené zboží.\n";
        $html .= "   Automatické potvrzení objednávky vám bylo současně zasláno e-mailem.\n";
        $html .= "   Do dvou pracovních dnů objednávku projde náš zaměstnanec,\n";
        $html .= "   zkontroluje, že všechno zboží máme skladem,\n";
        if($objednavka->{platba} eq "převodem")
        {
            $html .= "   a sdělí vám variabilní symbol a číslo účtu, kam máte zboží uhradit.\n";
        }
        else
        {
            $html .= "   a sdělí vám, kdy můžete zásilku očekávat.\n";
        }
        $html .= "</p>\n";
        $html .= "<p>Objednávka bude automaticky potvrzena e-mailem na adresu\n";
        $html .= "   <b>$objednavka->{email}</b>.\n";
        $html .= "   Pokud Vám tedy v nejbližších minutách nepřijde automatické potvrzení,\n";
        $html .= "   patrně jste se v adrese spletli a my Vám nebudeme moci doručit upřesnění\n";
        $html .= "   k&nbsp;Vaší objednávce. V&nbsp;takovém případě nám prosím pošlete e-mail na adresu\n";
        $html .= "   <a href=\"mailto:obchod\@hrejsi.cz\">obchod\@hrejsi.cz</a>.\n";
        $html .= "</p>\n";
        if($objednavka->{odber} eq "cm")
        {
            $html .= "<p>Až bude zboží pro Vás připravené na Černém Mostě, dáme Vám vědět, včetně podrobností kdy (otvírací hodiny) a kde (přesná adresa).<br>\n";
            $mail .= "Osobní odběr: Černý Most ($objednavka->{odber})\n";
        }
        elsif($objednavka->{odber} eq "paluba")
        {
            $html .= "<p>Až bude zboží pro Vás připravené na Palubě (<a href=\"http://www.paluba.cz/\">www.paluba.cz</a>), dáme Vám vědět, včetně podrobností kdy (otvírací hodiny) a kde (přesná adresa).<br>\n";
            $mail .= "Osobní odběr: Paluba ($objednavka->{odber})\n";
        }
        if($objednavka->{rychlost} eq "zrychleně")
        {
            $mail .= "ZRYCHLENĚ\n";
        }
        elsif($objednavka->{rychlost} eq "expresně")
        {
            $mail .= "EXPRESNĚ\n";
        }
        $html .= kosik::html($objednavka, 0);
        my $kosik_text = kosik::text($objednavka);
        $mail .= $kosik_text;
        if(exists($objednavka->{slevkod}))
        {
            $html .= "<p>Slevový kód: $objednavka->{slevkod}</p>\n";
            $mail .= "Slevový kód: $objednavka->{slevkod}\n";
        }
        # Vypsat dodací adresu.
        if($objednavka->{odber} eq "dobirka")
        {
            $html .= "<p>Zboží bude zasláno dobírkou České pošty na následující adresu:</p>\n";
            $mail .= "Zaslání na dobírku na adresu:\n";
            $html .= "Jméno: <b>$objednavka->{jmeno}</b><br>\n";
            $mail .= "Jméno: $objednavka->{jmeno} $objednavka->{prijmeni}\n";
            $html .= "Příjmení: <b> $objednavka->{prijmeni}</b><br>\n";
            $html .= "Ulice a dům: <b> $objednavka->{ulice_a_dum}</b><br>\n";
            $mail .= "Ulice a dům: $objednavka->{ulice_a_dum}\n";
            $html .= "Obec: <b>$objednavka->{psc} $objednavka->{obec}</b><br>\n";
            $mail .= "Obec: $objednavka->{psc} $objednavka->{obec}\n";
        }
        else
        {
            $html .= "Jméno: <b>$objednavka->{jmeno}</b><br>\n";
            $mail .= "Jméno: $objednavka->{jmeno} $objednavka->{prijmeni}\n";
            $html .= "Příjmení: <b> $objednavka->{prijmeni}</b><br>\n";
            $mail .= "Ulice a dům: $objednavka->{ulice_a_dum}\n";
            $mail .= "Obec: $objednavka->{psc} $objednavka->{obec}\n";
        }
        $mail .= "E-mail: $objednavka->{email}\n";
        $html .= "<p>Telefon: <b>$objednavka->{telefon}</b><br>\n";
        $mail .= "Telefon: $objednavka->{telefon}\n";
        if($objednavka->{sms})
        {
            $html .= "<p>Kromě e-mailu si přeji i vyrozumění prostřednictvím SMS.</p>\n";
            $mail .= "Vyrozumět prostřednictvím SMS.\n";
        }
        $html .= "<p>Poznámka: <b>$objednavka->{poznamka} </b><br>\n";
        $mail .= "Poznámka: $objednavka->{poznamka} \n";
        $html .= "Poznámka 2: <b>$objednavka->{poznamka2} </b><br>\n";
        $mail .= "Poznámka 2: $objednavka->{poznamka2} \n";
        my $platba = $objednavka->{platba};
        $platba =~ s/prevodem/převodem/;
        $platba =~ s/hotove/hotově/;
        $html .= "<p>Platba: $platba</p>\n";
        $mail .= "Platba: $platba\n";
        # Následující informace pomáhají poznat opakovaně odeslané formuláře a vůbec potíže s robotem.
        $mail .= "ip: $objednavka->{genadr}\n";
        $mail .= "gt: $objednavka->{gencas}\n";
        $mail .= "st: $objednavka->{cas}\n";
        if($objednavka->{jmeno} eq "test")
        {
            $adresat = "klara\@hrejsi.cz";
            $kopie = "zeman\@ufal.mff.cuni.cz";
            $skopie = "dkz\@centrum.cz, danzeman11\@gmail.com";
        }
        else
        {
            $adresat = "obchod\@hrejsi.cz";
            $kopie = $objednavka->{email};
            $skopie = "dkz\@centrum.cz, danzeman11\@gmail.com";
        }
        my $subject;
        if($objednavka->{odber} eq "paluba")
        {
            $subject = "Objednavka odber Paluba: $objednavka->{jmeno} $objednavka->{prijmeni}";
        }
        else
        {
            $subject = "Objednavka her: $objednavka->{jmeno} $objednavka->{prijmeni}";
        }
        mail::odeslat
        (
            "From"     => "Robot Hrejsi <robot\@hrejsi.cz>",
            "Reply-to" => "\"$objednavka->{jmeno} $objednavka->{prijmeni}\" <$objednavka->{email}>, obchod\@hrejsi.cz",
            "To"       => $adresat,
            "Cc"       => $kopie,
            "Bcc"      => $skopie,
            "Subject"  => $subject,
            "text"     => $mail
        );
        # Klárce na mobila poslat stručnější zprávu a v jiném pořadí.
        if($objednavka->{poznamka} ne "Pokus." && $objednavka->{email} ne "zeman\@ufal.mff.cuni.cz")
        {
            my $sms;
            $sms .= "$objednavka->{jmeno} $objednavka->{prijmeni}\n";
            $sms .= "$objednavka->{telefon}\n";
            $sms .= "PALUBA\n" if($objednavka->{odber} eq "paluba");
            $sms .= "PREDEM\n" if($objednavka->{platba} eq "převodem");
            $sms .= "SMS\n" if($objednavka->{sms});
            $sms .= $kosik_text;
            mail::odeslat
            (
                "From"     => "robot\@hrejsi.cz",
                "To"       => "klara.zemanova\@vodafonemail.cz",
                "Subject"  => "Objednavka:",
                "text"     => $sms
            );
        }
        # Úspěšně zadanou a odeslanou objednávku uložit do databáze.
        $html .= ulozit_objednavku($objednavka, $databaze);
    }
    return $html;
}



#------------------------------------------------------------------------------
# Uloží objednávku do databáze.
#------------------------------------------------------------------------------
sub ulozit_objednavku
{
    my $objednavka = shift; # odkaz na hash
    my $databaze = shift;
    my $html; # chceme-li uživateli zobrazit chyby SQL (spíš jen při ladění), můžeme je připsat sem
    # Přidat základní informace o objednávce do tabulky objednavky.
    my @nazvy = qw(cas jmeno prijmeni ulice_a_dum obec psc email telefon poznamka poznamka2 odber platba mezisoucet mnozstevni_sleva postovne celkem sleva_org_deti ico slevkod);
    my $seznam_poli = join(", ", @nazvy); use Encode;
    my @hodnoty = map{m/(mezisoucet|mnozstevni_sleva|postovne|celkem|sleva_org_deti)/ ? $objednavka->{$_} : encode("utf8", "'$objednavka->{$_}'")}(@nazvy);
    my $seznam_hodnot = join(", ", @hodnoty);
    my $dotaz = "INSERT INTO objednavky ($seznam_poli) VALUES ($seznam_hodnot);";
    $databaze->do($dotaz)
        or $html .= "<p><font color=magenta>Chyba: Nepodařilo se přidat záznam do tabulky objednavky:", $DBI::errstr, "</font></p>\n";
    # Přidat informace o jednotlivých objednaných hrách do tabulky objzbozi.
    # Současně snížit stav zásob v tabulce zbozi (bude přepsáno aktuálními údaji při příštím Klářině exportu).
    @nazvy = qw(kod_zbozi jednotkova_cena pocet cena_celkem);
    $seznam_poli = join(", ", ("cas", @nazvy));
    foreach my $radek (@{$objednavka->{kosik}})
    {
        @hodnoty = map{$_ ne "kod_zbozi" ? $radek->{$_} : "'$radek->{kod}'"}(@nazvy);
        $seznam_hodnot = join(", ", ("'$objednavka->{cas}'", @hodnoty));
        $dotaz = "INSERT INTO objzbozi ($seznam_poli) VALUES ($seznam_hodnot);";
        $databaze->do($dotaz)
            or $html .= "<p><font color=magenta>Chyba: Nepodařilo se přidat záznam do tabulky objzbozi: $DBI::errstr</font></p>\n";
        # Snížit v evidenci počet kusů daného zboží na skladě.
        my $sklad;
        if($objednavka->{odber} eq "paluba")
        {
            $sklad = "paluba";
        }
        else
        {
            $sklad = "cerny_most";
        }
        my $zaznamy = dzsql::dotaz($databaze, $sklad, "zbozi WHERE kod = '$radek->{kod}'");
        my $puvodni_stav = $zaznamy->[0]{$sklad};
        if($puvodni_stav>0)
        {
            my $novy_stav = $puvodni_stav-$radek->{pocet};
            $novy_stav = 0 if($novy_stav<0);
            $dotaz = "UPDATE zbozi SET $sklad = '$novy_stav' WHERE kod = '$radek->{kod}'";
            $databaze->do($dotaz)
                or $html .= "<p><font color=magenta>Chyba: Nepodařilo se aktualizovat stav zásob: $DBI::errstr</font></p>\n";
        }
    }
    return $html;
}



1;
