# zakaznik.maxicom.cz

Objednávkový systém pro ověření dostupnosti služeb MAXICOM a dokončení
zákaznické objednávky. Vstup do toku je z veřejného webu `www.maxicom.cz`,
kde tlačítko **Ověřte dostupnost** směřuje na:

```text
https://zakaznik.maxicom.cz/dostupnost.php
```

## Flow objednávky

```mermaid
flowchart TD
    WEB["www.maxicom.cz<br/><b>tlačítko: Ověřte dostupnost</b>"]:::web
    START["zakaznik.maxicom.cz/dostupnost.php<br/>Zákazník píše adresu"]:::page
    SUGGEST["CETIN našeptávač adres<br/>výběr RUIAN / ROP ID"]:::api
    SELECTED{"Adresa vybrána<br/>z našeptávače?"}:::decision

    SCAN["krok0.php<br/>CETIN speed scan podle ROP ID"]:::page
    API_STATE{"Odpověď CETIN API"}:::decision

    RETRY["Dočasná chyba API<br/>čekací stránka + opakované pokusy"]:::warn
    RETRY_OK{"Další pokus úspěšný?"}:::decision
    RETRY_FAIL["API zůstává nedostupné<br/>zákazník zkusí ověření později"]:::warn

    NO_PRODUCTS["CETIN business stav<br/>HTTP 500 + resultCode -1<br/>žádný produkt / žádná síť"]:::stop
    ANALYZE["Analýza dostupných produktů<br/>installComplexity = 10"]:::logic

    FIBER{"Je dostupná optika<br/>v požadované kvalitě?"}:::decision
    FIBER_LIST["Nabídka optiky<br/>NET 250 / 500 / 1000 / 2000<br/>ceny podle regionu R1/R2/R3"]:::offer

    METAL{"Není optika.<br/>Je dostupná metalika?"}:::decision
    METAL_RULES["Whitelist CETIN produktů:<br/>GO Plus, RUN, SPRINT<br/>+ minimální rychlosti z ceníku"]:::logic
    METAL_OK{"Splní metalika<br/>rychlostní minima?"}:::decision
    METAL_LIST["Nabídka xDSL<br/>xDSL 2-50 / 100 / 250<br/>ceny podle regionu R1/R2/R3"]:::offer

    UNAVAILABLE["Služby nejsou dostupné<br/>zákazník může ověření zopakovat později"]:::stop

    PICK["Zákazník vybere tarif<br/>uložení do session"]:::action
    CONTRACT["krok2.php<br/>volba smlouvy"]:::page
    DEVICE["krok3.php<br/>volba koncového zařízení"]:::page
    CONTACT["krok5.php<br/>kontaktní údaje + reCAPTCHA v3"]:::page
    SUMMARY["Rekapitulace objednávky"]:::page
    SEND["odeslat.php<br/>validace a uložení objednávky<br/>kod_aktivovan = 1"]:::action
    EMAIL_WAIT["Stránka: Potvrďte svůj e-mail<br/>zákazník čeká na potvrzovací odkaz"]:::warn
    EMAIL["E-mail zákazníkovi<br/>odkaz na aktivace.php?kod=..."]:::api
    ACTIVATION["aktivace.php<br/>kontrola kódu z e-mailu"]:::page
    CODE_VALID{"Kód je platný<br/>a ještě neověřený?"}:::decision
    RECAPTCHA2["reCAPTCHA v2<br/>Nejsem robot"]:::action
    VERIFY["verify_recaptcha_v2.php<br/>kod_aktivovan = 2<br/>notifikace pracovníkovi"]:::action
    DONE["kod-overen.php<br/>požadavek ověřen<br/>zákazník čeká na kontakt"]:::done
    ALREADY["kod-jiz-drive-overen.php<br/>kód už byl ověřen"]:::stop

    WEB --> START --> SUGGEST --> SELECTED
    SELECTED -- ne --> START
    SELECTED -- ano --> SCAN --> API_STATE

    API_STATE -- dočasný výpadek / technická chyba --> RETRY --> RETRY_OK
    RETRY_OK -- ano --> SCAN
    RETRY_OK -- ne, vyčerpaný limit --> RETRY_FAIL

    API_STATE -- no-product business stav --> NO_PRODUCTS --> UNAVAILABLE
    API_STATE -- platná data --> ANALYZE

    ANALYZE --> FIBER
    FIBER -- ano --> FIBER_LIST --> PICK
    FIBER -- ne --> METAL
    METAL -- ne --> UNAVAILABLE
    METAL -- ano --> METAL_RULES --> METAL_OK
    METAL_OK -- ano --> METAL_LIST --> PICK
    METAL_OK -- ne --> UNAVAILABLE

    PICK --> CONTRACT --> DEVICE --> CONTACT --> SUMMARY --> SEND
    SEND --> EMAIL_WAIT
    SEND --> EMAIL
    EMAIL --> ACTIVATION --> CODE_VALID
    CODE_VALID -- ano --> RECAPTCHA2 --> VERIFY --> DONE
    CODE_VALID -- ne --> ALREADY

    classDef web fill:#0d6efd,color:#fff,stroke:#084298,stroke-width:2px;
    classDef page fill:#eef6ff,color:#0f172a,stroke:#0d6efd,stroke-width:1px;
    classDef api fill:#e7f1ff,color:#0f172a,stroke:#6ea8fe,stroke-width:1px;
    classDef decision fill:#fff3cd,color:#0f172a,stroke:#ffc107,stroke-width:2px;
    classDef logic fill:#f8f9fa,color:#0f172a,stroke:#6c757d,stroke-width:1px;
    classDef offer fill:#d1e7dd,color:#0f172a,stroke:#198754,stroke-width:2px;
    classDef action fill:#e2d9f3,color:#0f172a,stroke:#6f42c1,stroke-width:2px;
    classDef warn fill:#f8d7da,color:#0f172a,stroke:#dc3545,stroke-width:2px;
    classDef stop fill:#f8d7da,color:#0f172a,stroke:#842029,stroke-width:2px;
    classDef done fill:#198754,color:#fff,stroke:#0f5132,stroke-width:2px;
```

## Hlavní větve

**A. Optika dostupná**

CETIN vrátí optický produkt s `installComplexity = 10`. Aplikace zobrazí
optickou nabídku podle regionu `R1`, `R2` nebo `R3`. Zákazník vybere tarif a
pokračuje stejným objednávkovým tokem jako v e-shopu.

**B. Optika není dostupná, metalika dostupná**

Pokud není dostupná optika s `installComplexity = 10`, aplikace hledá metalické
produkty s `installComplexity = 10`. Do nabídky se dostanou jen produkty z
whitelistu `GO Plus`, `RUN`, `SPRINT`, které splní minimální download/upload
rychlosti pro odpovídající tarif. Zákazník pak pokračuje stejně jako u optiky.

**C. Žádná vhodná síť**

Pokud není dostupná optika ani metalika splňující pravidla, aplikace zobrazí
informaci, že na adrese aktuálně nelze služby nabídnout. Stejně se chová i pro
CETIN odpověď typu `resultCode = -1` s textem, že vlastnosti sítě neumožňují
nabídnout žádný produkt.

**D. Dočasný výpadek API**

Skutečná technická chyba CETIN API nespouští stav "žádná síť". Zákazník vidí
čekací stránku s opakovanými pokusy. Pokud se API vzpamatuje, tok pokračuje do
standardní analýzy dostupnosti.

## Nabízené tarify a ceny

Ceny jsou v Kč měsíčně včetně DPH. Region se bere z CETIN nabídky
`salesOffer.offerName` a v aplikaci se zobrazuje jako `R1`, `R2` nebo `R3`.

### Optická síť partnerů

| Tarif | R1 - RD | R2 - BD | R3 - S |
| --- | ---: | ---: | ---: |
| NET 250 | 525 | 465 | 425 |
| NET 500 | 625 | 565 | 525 |
| NET 1000 | 729 | 685 | 635 |
| NET 2000 | 885 | 865 | 765 |

### Kabelová síť partnerů xDSL

Metalické tarify se v CETIN API dále whitelistují podle původních názvů
`GO Plus`, `RUN` a `SPRINT`. Zákazníkovi se ale zobrazují obchodní názvy z
ceníku.

| CETIN produkt | Zobrazený tarif | Minimum down/up | R1 - RD | R2 - BD | R3 - S |
| --- | --- | ---: | ---: | ---: | ---: |
| GO Plus | xDSL 2-50 | 50 / 10 Mb/s | 499 | 439 | 420 |
| RUN | xDSL 100 | 100 / 20 Mb/s | 499 | 439 | 420 |
| SPRINT | xDSL 250 | 250 / 50 Mb/s | 589 | 539 | 520 |

## Doporučený tarif

Před označením doporučeného tarifu se nabídka seřadí vzestupně podle download
rychlosti.

| Síť | Pravidlo doporučení | Praktický výsledek |
| --- | --- | --- |
| Optika | Nabídka se seřadí od nejnižší download rychlosti po nejvyšší a doporučený je první tarif v tomto pořadí. | Nejlevnější a nejpomalejší optický tarif, typicky `NET 250`. |
| Metalika | Nabídka se seřadí od nejnižší download rychlosti po nejvyšší. Pokud jsou dostupné alespoň dva tarify, doporučený je druhý tarif v tomto pořadí. Pokud je dostupný jen jeden, doporučí se jediný dostupný. | Při kompletní nabídce `xDSL 2-50`, `xDSL 100`, `xDSL 250` se doporučí `xDSL 100`. Při dvou dostupných tarifech se doporučí vyšší z nich. |

## Společná objednávková část

Po výběru tarifu už je tok společný pro optiku i metaliku:

1. `krok2.php` - volba smlouvy.
2. `krok3.php` - volba koncového zařízení.
3. `krok5.php` - kontaktní údaje, rekapitulace a reCAPTCHA.
4. `odeslat.php` - finální validace, uložení objednávky a odeslání potvrzovacího e-mailu.
5. `aktivace.php` - klik z e-mailu, kontrola kódu a zobrazení reCAPTCHA v2.
6. `verify_recaptcha_v2.php` - ověření reCAPTCHA v2, aktivace kódu a přesměrování na potvrzení.

.