#!/usr/bin/perl
# Zpracuje akci s databází objednávek na serveru MySQL na kub.cz.
# Zkouším oddělit skript, který manipuluje s databází, od skriptů, které jen něco zobrazují.
# Aby se to uživatelům nepletlo a aby bylo také jasně dáno, které stránky se mohou beztrestně obnovovat a které ne.
# Na tuto stránku by také měly vést pouze odkazy action z formulářů s metodou post.
# Copyright © 2009-2015 Dan Zeman <zeman@ufal.mff.cuni.cz>
# 6.12.2009: vytvořeno
# 7.8.2015: přechod na nový kub.cz

use utf8;
# Přidat Danovy sdílené knihovny. Skript běžící pod uživatelem apache by je jinak nenašel.
use lib '/s/w/lib/dan';
use lib '/s/w/lib/cgi/hry';
use lib '/s/w/lib/cgi/hry/vnitro';
use dzcgi;
use dzsql;
use sitesql;
use dbobj;
use mail;
use cas;
use zasilkovna;
# Přinutit Perl, aby UTF8 vypisoval jako UTF8 a nevymýšlel pro mě "vhodné" osmibitové kódování.
binmode(STDOUT, ':utf8');
binmode(STDERR, ':utf8');



# Používání absolutních URL místo relativních údajně zvyšuje šance, že prohlížeč nepoužije cache.
my $urlbase = 'http://hrejsi.cz/cgi/hry/vnitro';
# 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");
# Přečíst parametry.
dzcgi::cist_parametry(\%konfig);
dzcgi::cist_formular_post(\%konfig);
# 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">
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" CONTENT="0" /><!-- 0 is illegal timestamp, which means "now" -->
    <title>Operace s databází objednávek</title>
  </head>
  <body>
EOF
;
# Připojit se k databázi. V tomto skriptu potřebujeme většinou sahat jen na objednávky a ty jsou v databázi obchod.
# (Databázi her potřebujeme pouze když získáváme údaje o objednávce pro vytvoření CSV.)
# $hdb ... obsahuje katalog a ceník her
# $odb ... obsahuje katalog a ceník ostatního zboží
$hdb = sitesql::connect_obchod('hry');
$odb = sitesql::connect_obchod('web_hrejsi_obchod');
# Hlavní část: zjistit, jaká akce se po nás požaduje, provést ji a vypsat stránku s výsledkem.
provest_akci();
# Zjistit, jak dlouho nám to trvalo, a vypsat to na konec stránky.
my $hlaseni = cas::sestavit_hlaseni_o_trvani_programu($starttime);
print("  <div align=right><address>$hlaseni</address></div>\n");
# Poslat konec stránky.
print <<EOF
  </body>
  <head>
    <!-- Tohle se doporučuje zopakovat na konci dokumentu, protože pro Internet Explorer může být
         na začátku příliš brzo, aby se vůbec zabýval cachí (dosud načtená část stránky mu ještě
         nezaplnila dost velkou část bufferu. -->
    <meta http-equiv="pragma" content="no-cache" />
  </head>
</html>
EOF
;



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



#------------------------------------------------------------------------------
# Zjistí, jaká akce se po nás požaduje, provede ji a vypíše stránku
# s výsledkem.
#------------------------------------------------------------------------------
sub provest_akci
{
    ###!!!
    print("<h1>Parametry operace:</h1>\n");
    print("<table>\n");
    foreach my $klic (sort(keys(%konfig)))
    {
        print("<tr><td>$klic</td><td> = </td><td>$konfig{$klic}</td></tr>\n");
    }
    print("</table>\n");
    ###!!!
    # Z názvu tlačítka zjistit požadovanou akci.
    my @submits = grep {m/^submit/} (keys(%konfig));
    my @chyby;
    my $akce = $konfig{$submits[0]};
    if($akce eq 'Uzavřít zaškrtnuté')
    {
        print("<h1>Uzavřít zaškrtnuté</h1>\n");
        # Přečíst z formuláře čísla objednávek, které se mají uzavřít.
        my @cobj = grep {$konfig{$_} eq 'on'} (sort(keys(%konfig)));
        my @oobj = map {"<a href=\"$urlbase/objednavka.pl?cislo=$_\">$_</a>"} (@cobj);
        my $nobj = scalar(@cobj);
        if($nobj==0)
        {
            print('<p>Žádná objednávka nebude uzavřena, protože nebyla žádná zaškrtnuta.');
        }
        elsif($nobj==1)
        {
            print('<p>Tato objednávka bude uzavřena: ');
        }
        elsif($nobj>=2 && $nobj<=4)
        {
            print("<p>Tyto $nobj objednávky budou uzavřeny: ");
        }
        else
        {
            print("<p>Těchto $nobj objednávek bude uzavřeno: ");
        }
        print(join(', ', @oobj));
        print("</p>\n");
        if($nobj)
        {
            print("<p>Uzavírají se objednávky...</p>");
            foreach my $co (@cobj)
            {
                my $vysledek = dbobj::zmenit_stav_objednavky($odb, $co, 'uzavřeno');
                if(!$vysledek)
                {
                    push(@chyby, "<li>Nepodařilo se uzavřít objednávku č. <a href=\"$urlbase/objednavka.pl?cislo=$co\">$co</a>: $dbobj::chyba.</li>\n");
                }
            }
        }
        my $filtr = $konfig{filtr} ? "?filtr=$konfig{filtr}" : '';
        print("<p><a href=\"$urlbase/objednavky.pl$filtr\">Zpět na seznam</a></p>\n");
    }
    elsif($akce eq 'CSV')
    {
        print("<h1>CSV pro Uloženku</h1>\n");
        print("<p>Níže uvedená data zkopírujte přes schránku do textového editoru podporujícího kódování UTF-8, uložte na disk a dotyčný soubor potom nahrajte na Uloženku.</p>\n");
        print("<p>Stav objednávek zahrnutých do tohoto exportu byl změněn na <i>vytištěno</i> nebo <i>vytištěno před zaplacením</i>.</p>\n");
        # Přečíst z formuláře čísla objednávek, které se mají zahrnout do CSV.
        my @cobj = grep {$konfig{$_} eq 'on'} (sort(keys(%konfig)));
        my $csv = '';
        if(@cobj)
        {
            # Načíst katalog zboží. Zejména potřebujeme ke kódům zboží názvy zboží.
            my $katalog = dbobj::nacist_katalog($hdb, $odb);
            my $header = 1;
            foreach my $co (@cobj)
            {
                my $objednavka = dbobj::zjistit_objednavku($odb, $katalog, $co);
                $csv .= dbobj::sestavit_csv_pro_ulozenku($objednavka, $header);
                $header = 0;
                # Klárka si přeje převést objednávky, pro které vygenerovala CSV, do stavu "vytištěno" (ve skutečnosti si později vytiskne štítky, které jí vygeneruje Uloženka).
                # Má se to dělat jen s objednávkami, jejichž aktuální stav je "máme" nebo "zaplaceno". Ostatní by se tu ani neměly objevit.
                my $stary_stav = dbobj::zjistit_stav_objednavky($odb, $co);
                my $novy_stav;
                $novy_stav = 'vytištěno' if($stary_stav =~ m/^(máme|zaplaceno)$/);
                $novy_stav = 'vytištěno před zaplacením' if($stary_stav eq 'zaplaťte');
                if(defined($novy_stav))
                {
                    my $vysledek = dbobj::zmenit_stav_objednavky($odb, $co, $novy_stav, 1);
                    if(!$vysledek)
                    {
                        push(@chyby, "<li>Nepodařilo se převést objednávku č. <a href=\"$urlbase/objednavka.pl?cislo=$co\">$co</a> do stavu $novy_stav: $dbobj::chyba.</li>\n");
                    }
                }
            }
        }
        print("<hr />\n<pre>$csv</pre>\n<hr />\n");
    }
    elsif($akce eq 'Nahrát do Zásilkovny')
    {
        print("<h1>Nahrávám do Zásilkovny</h1>\n");
        # Přečíst z formuláře čísla objednávek, které se mají nahrát.
        my @cobj = grep {$konfig{$_} eq 'on'} (sort(keys(%konfig)));
        if(@cobj)
        {
            # Načíst katalog zboží. Zejména potřebujeme ke kódům zboží názvy zboží.
            my $katalog = dbobj::nacist_katalog($hdb, $odb);
            foreach my $co (@cobj)
            {
                my $objednavka = dbobj::zjistit_objednavku($odb, $katalog, $co);
                my $vysledek;
                if($objednavka->{odber} eq 'zasilkovna')
                {
                    $vysledek = zasilkovna::create_packet($objednavka, 0);
                }
                elsif($objednavka->{odber} eq 'posta')
                {
                    $vysledek = zasilkovna::create_packet($objednavka, 1);
                }
                else
                {
                    push(@chyby, "<li>Objednávka č. <a href=\"$urlbase/objednavka.pl?cislo=$co\">$co</a> není dodávána Zásilkovnou.</li>\n");
                }
                if($vysledek)
                {
                    if($vysledek->{status} eq "ok")
                    {
                        print("Objednávka č. $co úspěšně nahrána.<br>");
                        $objednavka->{podaci_cislo} = $vysledek->{id};
                        # Klárka si přeje převést objednávky, pro které byly nahrány, do stavu "vytištěno" (ve skutečnosti si později vytiskne štítky, které jí vygeneruje Zásilkovna).
                        # Má se to dělat jen s objednávkami, jejichž aktuální stav je "máme" nebo "zaplaceno". Ostatní by se tu ani neměly objevit.
                        my $stary_stav = dbobj::zjistit_stav_objednavky($odb, $co);
                        my $novy_stav;
                        $novy_stav = 'vytištěno' if($stary_stav =~ m/^(máme|zaplaceno)$/);
                        $novy_stav = 'vytištěno před zaplacením' if($stary_stav eq 'zaplaťte');
                        if(defined($novy_stav))
                        {
                            my $vysledek = dbobj::zmenit_stav_objednavky($odb, $co, $novy_stav, 1);
                            if(!$vysledek)
                            {
                                push(@chyby, "<li>Nepodařilo se převést objednávku č. <a href=\"$urlbase/objednavka.pl?cislo=$co\">$co</a> do stavu $novy_stav: $dbobj::chyba.</li>\n");
                            }
                        }
                    }
                    else
                    {
                        push(@chyby, "<li>Objednávka č. <a href=\"$urlbase/objednavka.pl?cislo=$co\">$co</a> vyhodila při nahrávání tuto chybu: \"$vysledek->{chyba}\".</li>\n");
                    }
                }
            }
        }
    }
    if(@chyby)
    {
        print("<p>Při operaci došlo k&nbsp;chybám:</p>\n");
        print("<ul>\n");
        print(join('', @chyby));
        print("</ul>\n");
    }
    else
    {
        print("<p>Operace proběhla úspěšně.</p>\n");
    }
}
