#!/usr/bin/perl
# Internetový obchod s hrami / funkce pro maily zákazníkům.
# Copyright © 2009, 2013 Dan Zeman <zeman@ufal.mff.cuni.cz>

package objmail;
use utf8;
use open ':utf8';
use lib '/home/dan/lib';
use mail;



#-----------------------------------------------------------------------------
# Vrátí vzor mailu pro konkrétní příležitost.
#-----------------------------------------------------------------------------
sub vzor_mailu
{
    my $novy_stav = shift;
    my $objednavka = shift;
    my $rekapitulace = shift;
    my $dodaci_adresa;
    if($objednavka->{odber} eq 'paluba')
    {
        $dodaci_adresa = 'paluba';
    }
    elsif($objednavka->{odber} eq 'ulozenka')
    {
        $dodaci_adresa .= "$objednavka->{jmeno} $objednavka->{prijmeni}\n";
        $dodaci_adresa .= "Pobočka Uloženky:\n";
        $dodaci_adresa .= "$objednavka->{ulozenka_branches_name}";
    }
    elsif($objednavka->{odber} eq 'intime')
    {
        $dodaci_adresa .= "$objednavka->{jmeno} $objednavka->{prijmeni}\n";
        $dodaci_adresa .= "Poštomat:\n";
        $dodaci_adresa .= "$objednavka->{ulozenka_branches_name}";
    }
    elsif($objednavka->{odber} eq 'posta_na_postu')
    {
        $dodaci_adresa .= "$objednavka->{jmeno} $objednavka->{prijmeni}\n";
        $dodaci_adresa .= "Pobočka České pošty:\n";
        $dodaci_adresa .= "$objednavka->{ulozenka_branches_name}";
    }
    else
    {
        $dodaci_adresa .= "$objednavka->{jmeno} $objednavka->{prijmeni}\n";
        $dodaci_adresa .= "$objednavka->{ulice_a_dum}\n";
        $dodaci_adresa .= "$objednavka->{psc}  $objednavka->{obec}";
    }
    # Má objednávka přiřazený variabilní symbol?
    my $vs = 'VSVSVSVSVS';
    if($objednavka->{varsymbol}>0)
    {
        $vs = $objednavka->{varsymbol};
    }
    # Podle druhu dopravy připravit informaci o možnostech sledování zásilky.
    my $sledovani_zasilky;
    if($objednavka->{odber} eq 'ulozenka')
    {
        if($objednavka->{ulozenka_branches} =~ m/^dpd/)
        {
            # DPD: https://tracking.dpd.de/cgi-bin/delistrack?lang=cs&pknr=13815017505974
            # Stejná sledovací stránka funguje i pro doručení do DPD Parcel Shopu, tedy pro nás nevlastní pobočky Uloženky.
            $sledovani_zasilky = "\nZásilku lze sledovat na stránkách DPD:\n";
            $sledovani_zasilky .= "https://tracking.dpd.de/cgi-bin/delistrack?lang=cs&pknr=$objednavka->{podaci_cislo}\n";
        }
        else
        {
            # Uloženka (vlastní pobočky): https://tracking.ulozenka.cz/1704311
            $sledovani_zasilky = "\nZásilku lze sledovat na stránkách Uloženky:\n";
            $sledovani_zasilky .= "https://tracking.ulozenka.cz/$objednavka->{podaci_cislo}\n";
        }
    }
    elsif($objednavka->{odber} eq 'dpd')
    {
        # DPD: https://tracking.dpd.de/cgi-bin/delistrack?lang=cs&pknr=13815017505974
        $sledovani_zasilky = "\nZásilku lze sledovat na stránkách DPD:\n";
        $sledovani_zasilky .= "https://tracking.dpd.de/cgi-bin/delistrack?lang=cs&pknr=$objednavka->{podaci_cislo}\n";
    }
    elsif($objednavka->{odber} eq 'intime')
    {
        # Intime: kód zásilky se zřejmě předává metodou POST, takže není součástí adresy.
        # http://www.intime.cz/track_and_trace ... vyplnit číslo X8700000436 do kolonky IN TIME sledování zásilek
        $sledovani_zasilky = "\nZásilku lze sledovat na stránkách společnosti InTime.\n";
        $sledovani_zasilky .= "Jděte na http://www.intime.cz/track_and_trace a do pole „IN TIME sledování zásilek“ zkopírujte kód vaší zásilky: $objednavka->{podaci_cislo}\n";
    }
    else # Česká pošta, včetně balíků Do ruky a Na poštu.
    {
        $sledovani_zasilky = "\nZásilku lze sledovat na stránkách České pošty:\n";
        $sledovani_zasilky .= "http://www.ceskaposta.cz/cz/nastroje/sledovani-zasilky.php?barcode=$objednavka->{podaci_cislo}&locale=CZ&send.x=51&send.y=6&go=ok\n";
    }
    # Odhadnout datum doručení zásilky zákazníkovi poštou.
    ###!!! V budoucnosti zde budeme chtít přímo vypočítat cílové datum, resp. rozsah dat.
    ###!!! Zatím pouze údaj o počtu pracovních dnů (Klára schválně udává větší rozpětí než Česká pošta).
    my $datum_doruceni;
    # Obyčejný balík (i pilný) má podací číslo začínající na BX nebo BA.
    if($objednavka->{podaci_cislo} =~ m/^B[XA]/)
    {
        if($objednavka->{pilne})
        {
            $datum_doruceni = '1 až 2 pracovní dny';
        }
        else
        {
            $datum_doruceni = '1 až 4 pracovní dny';
        }
    }
    # Doporučený dopis má podací číslo začínající na R.
    elsif($objednavka->{podaci_cislo} =~ m/^R/)
    {
        $datum_doruceni = '1 až 3 pracovní dny';
    }
    # Obchodní balík má podací číslo začínající na BO.
    elsif($objednavka->{podaci_cislo} =~ m/^BO/)
    {
        $datum_doruceni = '1 pracovní den';
    }
    my $vzor;
    #--------------------------------------------------------------------------
    # PODPISY
    #--------------------------------------------------------------------------
    my $podpis_klara = <<EOF
Za Obchod.Hrejsi.Cz zdraví
Klára Zemanová
tel: 777552729
skype: klara.zemanova
http://obchod.hrejsi.cz
http://www.deskohrani.cz
EOF
    ;
    my $podpis_paluba = $podpis_klara;
    # Informace o Klubu deskových her Paluba se opakuje v několika vzorech.
    my $info_paluba;
    my $paluba_mimoradna_situace = 0; # např. prázdninový provoz (aby se nemusel ničit text běžného provozu)
    if($paluba_mimoradna_situace)
    {
        $info_paluba = <<EOF
O PRÁZDNINÁCH JE NA PALUBĚ OTEVŘENO POUZE VE STŘEDU (17-22)!
Telefon na Palubu je 257-324-291.
Více informací o našem klubu najdete na http://www.paluba.cz/.
EOF
        ;
    }
    else
    {
        $info_paluba = <<EOF
Otvírací hodiny Paluby (ve dvoře domu Lidická 40 u Anděla) jsou:
po - st 17 - 22 hod.
ne      14 - 20 hod.
Telefon na Palubu je 257-324-291.
Více informací o našem klubu najdete na http://www.paluba.cz/.
EOF
        ;
    }
    if($novy_stav eq '')
    {
        if($dodaci_adresa eq 'paluba')
        {
            #--------------------------------------------------------------------------
            # OBECNÝ MAIL, PALUBA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

*** DOPLNIT TEXT MAILU ZDE ***

Celková cena rezervovaného zboží je $objednavka->{celkem} Kč.

Rekapitulace objednávky:
$rekapitulace

$podpis_paluba
EOF
            ;
        }
        else
        {
            #--------------------------------------------------------------------------
            # OBECNÝ MAIL, POŠTA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

*** DOPLNIT TEXT MAILU ZDE ***

Celková cena dobírky je $objednavka->{celkem} Kč.

Rekapitulace objednávky:
$rekapitulace
Dodací adresa:

$dodaci_adresa

$podpis_klara
EOF
            ;
        }
    }
    elsif($novy_stav eq 'máme')
    {
        if($dodaci_adresa eq 'paluba')
        {
            #--------------------------------------------------------------------------
            # MÁME, PALUBA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

děkujeme za objednávku. Zboží máme pro Vás na Palubě připravené
(bude dáno stranou na Vaše jméno po dobu přibližně 14 dnů).
Celková cena rezervovaného zboží je $objednavka->{celkem} Kč.

Rekapitulace objednávky:
$rekapitulace
$info_paluba

$podpis_paluba
EOF
            ;
        }
        else
        {
            #--------------------------------------------------------------------------
            # MÁME, POSÍLÁME, POŠTA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

děkujeme za objednávku. Zboží máme pro Vás připravené.
Dobírku můžete čekat koncem tohoto či začátkem příštího týdne.
Celková cena dobírky bude $objednavka->{celkem} Kč.

Rekapitulace objednávky:
$rekapitulace
Dodací adresa:

$dodaci_adresa

$podpis_klara
EOF
            ;
        }
    }
    elsif($novy_stav eq 'odesláno')
    {
        my $jako_pilny_balik;
        if($objednavka->{pilne})
        {
            $jako_pilny_balik = ' jako pilný balík';
        }
        #--------------------------------------------------------------------------
        # ODESLALI JSME POŠTOU
        #--------------------------------------------------------------------------
        $vzor = <<EOF
Dobrý den,

zásilku jsme předali dopravci dne $objednavka->{datum_odeslani}$jako_pilny_balik.
Podací číslo je $objednavka->{podaci_cislo}.
Přepravce Vás bude informovat SMS a e-mailem.
Předpokládaný termín doručení: $datum_doruceni.
$sledovani_zasilky
$podpis_klara
EOF
            ;
    }
    elsif($novy_stav eq 'zaplaťte')
    {
        if($dodaci_adresa eq 'paluba')
        {
            #--------------------------------------------------------------------------
            # ZAPLAŤTE, PALUBA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

děkujeme za objednávku. Zboží máme pro Vás připravené.

Uhraďte tedy prosím částku $objednavka->{celkem} Kč na účet 188936299/0300, variabilní symbol $vs.
Jakmile obdržíme platbu, dáme zboží na Palubě stranou na Vaše jméno a vyrozumíme Vás, že si ho můžete vyzvednout.

Rekapitulace objednávky:
$rekapitulace

$podpis_paluba
EOF
            ;
        }
        else
        {
            #--------------------------------------------------------------------------
            # ZAPLAŤTE, POŠTA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

děkujeme za objednávku. Zboží máme pro Vás připravené.

Uhraďte tedy prosím částku $objednavka->{celkem} Kč na účet 188936299/0300, variabilní symbol $vs.
Jakmile obdržíme platbu, zásilku odešleme.
Poště trvá dodání 1 až 4 pracovní dny.

Rekapitulace objednávky:

$rekapitulace
Dodací adresa:

$dodaci_adresa

$podpis_klara
EOF
            ;
        }
    }
    # Pokud se při přechodu do stavu "vytištěno" volá tato funkce pro přípravu mailu, znamená to,
    # že jsme byli ve stavu "vytištěno před zaplacením" a tím pádem chceme zákazníkovi psát totéž
    # jako při přechodu do stavu "zaplaceno". Do stavu "vytištěno" se dá také přejít ručně ze stavu
    # "máme" nebo "zaplaceno", v tom případě se ale žádný další mail zákazníkovi neposílá.
    elsif($novy_stav =~ m/^(zaplaceno|vytištěno)$/)
    {
        # Bez ohledu na to, zda si chce zákazník vyzvednout zboží na Palubě,
        # nebo zda ho chce zaslat poštou, posloupnost stavů se řídí tím, kdy
        # bude platit. Při platbě hotově při převzetí zboží nám stačí jeden
        # stav "máme", který říká, že zboží je připraveno k odeslání / vyzvednutí.
        # Při platbě předem se použije posloupnost stavů "zaplaťte" - "zaplaceno".
        ###!!! POZNÁMKA: U objednávek se zasláním poštou to ovšem zatím děláme jinak.
        ###!!! Používáme posloupnost stavů "zaplaťte" - "máme".
        ###!!! Asi by se to ale mělo změnit, ostatně tlačítko "Peníze přišly" k tomu bude svádět.
        if($dodaci_adresa eq 'paluba')
        {
            #--------------------------------------------------------------------------
            # ZAPLACENO, PALUBA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

Vaše platba dorazila.  Zboží máme pro Vás na Palubě připravené
v rezervacích na Vaše jméno. Jako potvrzení o zaplacení prosím
vemte s sebou vytištěný tento mail.

Rekapitulace objednávky:
$rekapitulace
$info_paluba

$podpis_paluba
EOF
            ;
        }
        else
        {
            $vzor = <<EOF
Dobrý den,

Vaše platba dorazila. Zboží připravujeme k odeslání.

Rekapitulace objednávky:
$rekapitulace
Dodací adresa:

$dodaci_adresa

$podpis_klara
EOF
            ;
        }
    }
    elsif($novy_stav eq 'nemáme')
    {
        if($dodaci_adresa eq 'paluba')
        {
            #--------------------------------------------------------------------------
            # NEMÁME, PALUBA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

děkujeme za objednávku. Bohužel nemáme vše skladem. Jakmile bude pro Vás zboží
připraveno, dáme Vám vědět. Děkujeme za pochopení.

$rekapitulace

$podpis_paluba
EOF
            ;
        }
        else
        {
            ###!!! Rozlišit případ, kdy nemáme skladem část objednávky a kdy nemáme nic:
            ###!!! 1. Bohužel nemáme vše skladem.
            ###!!! 2. Bohužel nemáme zboží skladem.
            ###!!! Rozlišit také podle očekávané doby doskladnění:
            ###!!! 1. XXX již nemají ani naši dodavatelé a v dohledné době neočekáváme, že se na tom něco změní.
            ###!!! 2. XXX momentálně nemají ani naši dodavatelé. Čeká se na dotisk/Pokoušíme se sehnat v zahraničí, budeme vás informovat.
            ###!!! 3. Předpokládáme, že další XXX nám přijde TTT (příští týden apod.)
            ###!!! 4. XXX je potřeba převézt mezi Jenštejnem a Palubou: tohle lidem ani nepsat, rovnou to udělat?
            #--------------------------------------------------------------------------
            # NEMÁME, POŠTA
            #--------------------------------------------------------------------------
            $vzor = <<EOF
Dobrý den,

děkujeme za objednávku. Bohužel nemáme vše skladem. Jakmile bude pro Vás zásilka
připravena, upřesníme termín odeslání. Děkujeme za pochopení.

$rekapitulace

$podpis_klara
EOF
            ;
        }
    }
    return $vzor;
}



#-----------------------------------------------------------------------------
# Sestaví rekapitulaci objednaného zboží do mailu.
#-----------------------------------------------------------------------------
sub prehled_zbozi
{
    my $objednavka = shift;
    my $prehled;
    foreach my $polozka (@{$objednavka->{zbozi}})
    {
        $prehled .= sprintf("%2d × %4d Kč = %4d Kč: %s\n", $polozka->{pocet}, $polozka->{jednotkova_cena}, $polozka->{cena_celkem}, $polozka->{nazev});
    }
    $prehled .= sprintf("MEZISOUČET   = %4d Kč\n", $objednavka->{mezisoucet});
    # Přičíst poštovné.
    # Pokud není znám způsob odběru nebo pokud jde o osobní odběr, informaci o poštovném nezobrazovat.
    if($objednavka->{odber} =~ m/^(posta|posta_do_ruky|posta_na_postu|ulozenka|intime|dpd)$/)
    {
        $prehled .= sprintf("Poštovné     = %4d Kč\n", $objednavka->{postovne});
    }
    # Započítat množstevní slevu.
    # Předpokládáme, že množstevní sleva se aplikuje při vyšším nákupu,
    # než při jakém se odpouští poštovné, takže se nemusíme bát, že bychom
    # výši slevy počítali i z poštovného.
    if($objednavka->{mnozstevni_sleva}>0)
    {
        $prehled .= sprintf("Sleva        = %4d Kč\n", $objednavka->{mnozstevni_sleva});
    }
    # Závěr.
    $prehled .= sprintf("CELKEM       = %4d Kč\n", $objednavka->{celkem});
    return $prehled;
}



#-----------------------------------------------------------------------------
# Odešle dopis zákazníkovi.
#-----------------------------------------------------------------------------
sub odeslat_mail
{
    my $cislo_objednavky = shift;
    my $adresat = shift;
    my $predmet = shift;
    my $text = shift;
    my %mail =
    (
        'From'    => 'obchod@hrejsi.cz',
        'To'      => $adresat,
        'Cc'      => 'obchod@hrejsi.cz',
        'Subject' => $predmet,
        'text'    => $text
    );
    mail::odeslat(%mail);
}



1;
