CHANGELOG - Spotrebiteľské práva pre WooCommerce
================================================
Autor:   onlinefotka.sk
Kontakt: info@onlinefotka.sk
Web:     https://onlinefotka.sk

POZNAMKA K HPOS KOMPATIBILITE:
  Plugin funguje s oboma systemami WooCommerce:
  - HPOS (High Performance Order Storage) - nove tabulky wc_orders, WC 7.1+
  - Legacy - klasicke ulozenie cez WordPress posts a postmeta
  Prepinanie je automaticke, nie je potrebne nic nastavovat.
================================================


[2.6.1] - 2026-07-08
  OPRAVY:
  - Pole IBAN vo formulári odstúpenia od zmluvy teraz správne rešpektuje
    nastavenie "IBAN field" (Povinné / Voliteľné / Skryté). V 2.6.0 bolo
    vždy povinné bez ohľadu na nastavenie.

[2.6.0] - 2026-07-01
  NOVINKY:
  - Zoznam odstúpení prepracovaný na rovnaký štýl ako reklamácie —
    farebné badge (červená/oranžová/zelená), tlačidlo Otvoriť a koš.
  - Detail stránka odstúpenia: dvojpanelový layout (dáta zákazníka
    vľavo, stav + emailová notifikácia vpravo).
  - Nové povinné pole IBAN vo formulári. Ukladá sa do DB a zobrazuje
    v zozname aj v detaile — admin vie kam poslať vrátenie peňazí.
  - Email zákazníkovi má dva varianty: "v riešení" a "vybavené"
    (pri vybavení obsahuje IBAN a info o vrátení peňazí).
  - Predmet emailu sa mení podľa stavu (v riešení / vybavené).
  - Admin môže zmazať jednotlivé záznamy priamo zo zoznamu.
  - Preklady: všetkých 6 jazykov aktualizovaných (406 stringov).

[2.5.7] - 2026-07-01
  NOVINKY:
  - Zoznam odstúpení má teraz stĺpec Stav (Nové / V riešení / Vybavené)
    s inline AJAX aktualizáciou — bez obnovy stránky.
  - Číslo objednávky v zozname je klikateľný odkaz na detail objednávky.
  - Filter panel — filtrovanie podľa stavu alebo hľadanie podľa mena,
    e-mailu alebo čísla objednávky.
  OPRAVY:
  - Tabuľka odstúpení teraz správne ukladá typ rozsahu (cela/ciastocne)
    a zoznam produktov do samostatných stĺpcov — opravuje qty-aware
    duplicate check z verzie 2.5.6 ktorý nefungoval.

[2.5.6] - 2026-06-23
  OPRAVY:
  - Čiastočné odstúpenie teraz sleduje stiahnuté množstvo na úrovni
    produktu. Zákazník môže vracať jednotlivé kusy z viacdielnej
    položky v samostatných podaniach (napr. 1 z 3, potom ďalší 1 z 3).
    Systém zablokuje iba keď sú všetky objednané kusy už stiahnuté
    a zobrazí koľko kusov je ešte možné vrátiť.

[2.5.5] - 2026-06-22
  NOVINKY:
  - Validácia IBAN: pole IBAN vo formulári reklamácie je teraz overované
    algoritmom ISO 13616 MOD-97 (kontrolný súčet) s overením dĺžky
    podľa krajiny pre 80+ krajín. Pole zobrazuje zelený/červený okraj
    ako live feedback pri opustení poľa (blur). Neplatný IBAN je
    odmietnutý aj na strane servera pred uložením reklamácie.

[2.5.4] - 2026-06-22
  NOVINKY:
  - Badge v admin menu: pri menu položke "Spotrebiteľské práva" a jej
    podpoložkách (Odstúpenia, Reklamácie) sa zobrazuje červené počítadlo
    nepozretých položiek — rovnako ako pri komentároch alebo objednávkach
    WooCommerce. Počítadlo sa obnoví každú hodinu (transient) a okamžite
    pri každom novom podaní.

[2.5.3] - 2026-06-22
  NOVINKY:
  - Výber počtu kusov: pri čiastočnom odstúpení môže zákazník zvoliť
    koľko kusov daného produktu chce vrátiť (napr. 2 z 3 kusov).
    Číselný vstup sa zobrazí pri zaškrtnutí checkboxu produktu.

  OPRAVY:
  - Opakované čiastočné odstúpenie pre ten istý produkt je teraz správne
    blokované, aj keď je vypnutá možnosť "Povoliť viaceré odstúpenia".
    Odstúpenie pre iný produkt z tej istej objednávky zostáva povolené.

[2.5.2] - 2026-06-22
  NOVINKY:
  - Vylúčené produkty a kategórie: admin môže označiť konkrétne produkty
    alebo celé kategórie ako nevhodné na odstúpenie (hygienické produkty,
    zákazkový tovar, digitálny obsah a pod.). Vylúčené produkty sa
    nezobrazujú v zozname checkboxov pri čiastočnom odstúpení; ak sú
    všetky produkty v objednávke vylúčené, blokuje sa aj celkové odstúpenie.

  OPRAVY:
  - Viacnásobné čiastočné odstúpenia pre tú istú objednávku (rôzne
    produkty) sú teraz správne povolené, aj keď je vypnutá možnosť
    "Povoliť viaceré odstúpenia pre tú istú objednávku".

[2.5.1] - 2026-06-20
----------------------

NOVE:

  # SHORTCODE [withdrawal_link]
    Nový shortcode [withdrawal_link] generuje odkaz na formulár odstúpenia
    s predvyplnenou objednávkou zákazníka (cez order_key, rovnaký mechanizmus
    aký používa WooCommerce pre žiadosti o recenziu). Určený na použitie
    v email customizéroch (YayMail, Kadence Emails, Email Customizer for WC
    a pod.). Voliteľný atribút label pre vlastný text odkazu.
    Formulár pri načítaní preloží order_key na číslo objednávky cez
    wc_get_order_by_order_key() a predvyplní pole.

ZMENY:

  # LOGIKA "JEDNO ODSTÚPENIE NA OBJEDNÁVKU"
    Nastavenie premenované z "One withdrawal per order" na
    "Multiple withdrawals per order" — logika otočená tak, aby
    bezpečný default (jedno odstúpenie) bol aktívny bez konfigurácie.
    Volba v admine: povoliť viacnásobné (predvolene vypnuté = jedno per obj.).

VYLEPSENIA:

  # TABINDEX PRE SKRYTÉ SEKCIE
    Skryté riadky s výberom produktov (čiastočné odstúpenie) teraz
    dostávajú tabindex="-1" na všetky vnútorné inputy — nie sú dostupné
    cez klávesnicu keď sú neviditeľné.


[2.4.0] - 2026-06-19
----------------------

OPRAVENE (BUGS):

  # CENY AKO HTML ENTITY
    Ceny produktov sa na niektorých inštaláciách zobrazovali ako surový HTML text
    (napr. "65,83&nbsp;&euro;" namiesto "65,83 €").
    Príčina: wp_strip_all_tags() odstránilo HTML tagy ale nie HTML entity.
    Fix: html_entity_decode() konvertuje entity na skutočné znaky.

  # FROM EMAIL V EMAILOCH
    Emailové potvrdenia zákazníkovi mali v hlavičke "Od:" vždy WooCommerce
    predvolený odosielací email, nie email nastavený v nastaveniach pluginu.
    Fix: OODZ_Email base class teraz overriduje get_from_address() a uprednostňuje
    oodz_admin_email nastavenie pluginu.

PRIDANE:

  + TOGGLE PRE CIASTOCNE ODSTUPENIE
    Nový checkbox v nastaveniach "Allow partial withdrawal".
    Ak vypnuté, sekcia "Selected products only" sa nezobrazí vo formulári
    a server odmietne čiastočné odstúpenie aj pri manuálnom POST.
    Default: zapnuté (backward compatible).

  + JEDNO ODSTUPENIE NA OBJEDNAVKU
    Nový checkbox "One withdrawal per order".
    Ak zapnuté, druhý pokus o odstúpenie na tú istú objednávku bude odmietnutý
    s chybovou hláškou.
    Default: vypnuté.

  + CENY S/BEZ DPH
    Nový checkbox "Show prices including VAT" v nastaveniach.
    Ovplyvňuje ceny produktov zobrazené vo formulári pri výbere objednávky.
    Default: bez DPH.

  + IBAN POLE KONFIGUROVATELNE
    Nový select "IBAN field" v nastaveniach reklamačného formulára.
    Tri možnosti: Required (povinné, default), Optional (nepovinné), Hidden (skryté).
    Vhodné pre zákazníkov platiacich kartou mimo EÚ kde IBAN nie je relevantný.

  + VLASTNE PRILOHY K EMAILOM
    Sekcia "E-mail attachments" v nastaveniach.
    Admin vyberie súbor z Media Library (napr. PDF podmienky, reklamačný poriadok)
    ktorý sa priloží k zákazníckemu emailu pri potvrdení odstúpenia / reklamácie.
    Separate nastavenie pre withdrawal email a complaint email.


[2.3.1] - 2026-06-18
----------------------

PRIDANE:

  + KONFIGUROVATELNA LEHOTA ODSTUPENIA
    V nastaveniach pluginu pribudla nova sekcia "Withdrawal period" s dvoma nastaveniami:

    1. Dlzka lehoty (dni):
       - 14 dni (zakonné minimum podla smernice EU 2011/83/EU) — predvolena hodnota
       - 30 dni (dobrovolne predlzenie)
       - Vlastna hodnota: admin zadá akékoľvek číslo od 1 do 365 dní

    2. Offset doručenia (+0 až +3 dni):
       - Zákon hovorí, že 14-dňová lehota začína plynúť odo dňa PREVZATIA tovaru
         zákazníkom, nie od dátumu splnenia objednávky vo WooCommerce.
       - Nastavenie posúva začiatok lehoty dopredú, aby zodpovedalo skutočnému
         dátumu doručenia (napr. ak doručenie trvá 1-2 dni po "Completed").

    Toto nastavenie ovplyvňuje:
       - Výpočet deadline dátumu zobrazeného zákazníkovi
       - Odpočítavací časovač na stránke s objednávkami
       - Viditeľnosť tlačidla "Withdraw from contract" v Môj účet → Objednávky
       - Server-side validáciu pri odoslaní formulára

    Právny text formulára ("within 14 days") zostáva nezmenený — 14 dní je zákonné
    minimum, ktoré platí bez ohľadu na nastavenie.


[2.3.0] - 2026-06-11
----------------------

PRIDANE:

  + GDPR CHECKBOX JE TERAZ KONFIGUROVATELNY (3 rezimy)
    - Nove nastavenie "GDPR consent checkbox" v Settings ->
      Data retention & GDPR.
    - Rezimy:
      * Hidden (odporucane) - ziadny checkbox, len kratky info text
        o pravnom zaklade (cl. 6 ods. 1 pism. b GDPR - plnenie zmluvy
        + pism. c - zakonna povinnost zo smernice EU 2023/2673 a
        zakona SR c. 108/2024) s linkom na privacy policy.
      * Optional - checkbox sa zobrazi ale nie je povinny
      * Required - povinny (povodne spravanie pred 2.3.0)
    - Default pre EXISTUJUCE instalacie: Required (ziadna zmena).
    - Default pre NOVE instalacie: Hidden (pravne najcistejsie).
    - Server-side validacia respektuje zvoleny rezim.
    - Client-side validacia tiez (kontroluje len ak input.required).
    - Aplikuje sa rovnako na odstupenie aj reklamaciu.
    - Dovod: viaceri testeri spravne upozornili ze spracovanie OU
      pre odstupenie/reklamaciu nie je zalozene na suhlase, ale na
      pism. b (plnenie zmluvy) + c (zakonna povinnost). Samostatny
      "suhlas" checkbox je teda zbytocny a moze byt zavadzajuci.

  + POLYLANG / WPML PODPORA PRE ADMIN-EDITOVATELNE TEXTY
    - "Custom notice / warning", "Fallback contact info", seller info
      polia su teraz registrovane cez pll_register_string() (Polylang)
      a icl_register_string() (WPML).
    - Pri renderingu aplikujeme pll__() / wpml_translate_single_string.
    - Skupina pre stringy: "Consumer Rights for WooCommerce".
    - No-op ak ani jeden multilingual plugin nie je instalovany.
    - V Settings UI sa zobrazi modra napoveda kde najst preklady.

OPRAVENE:

  * FORMULAR SA NIEKEDY ZOBRAZOVAL V ANGLICTINE (Polylang)
    - Symptom: tester nahlasil ze reklamacny formular sa zobrazuje
      v anglictine aj ked je stranka v Polylangu cestine.
    - Pricina: load_plugin_textdomain() pouzival get_locale() (= site
      locale), nie aktualny jazyk Polylang stranky.
    - Fix: load_textdomain() teraz najprv detekuje pll_current_language()
      (Polylang) alebo wpml_current_language filter (WPML) a explicitne
      nacita prislusne .mo. Az potom volame standardny
      load_plugin_textdomain ako fallback.

PREKLADY:

  * 11 novych retazcov pre vsetkych 6 jazykov (sk_SK, cs_CZ, de_DE,
    hu_HU, pl_PL, en_US). PO + MO subory aktualizovane.


[2.2.2] - 2026-06-10
----------------------

OPRAVENE:

  * CIASTOCNE ODSTUPENIE - CHECKBOXY SA NEPOSIELALI NA SERVER
    - Symptom: zakaznik vybral "len vybrane produkty", zaskrtol
      checkboxy a po submite dostal chybu "Pri ciastocnom odstupeni
      uvedte nazvy produktov."
    - Pricina #1: JS submit handler rucne staval data object pre
      $.post() a zabudol forwardovat produkty_items[] checkboxy.
      Server nikdy nedostal vybrane polozky.
    - Pricina #2: Client-side validacia kontrolovala iba textareu
      "produkty", ignorovala produkty_items[] checkboxy - chybu
      vyhadzovala uz na frontende.
    - Fix: form sa teraz serializuje cez $form.serialize(), takze
      vsetky polia (vratane checked checkboxov) idu na server.
      Validacia akceptuje EITHER textareu ALEBO aspon jeden checked
      checkbox.
    - Dakujem testerovi za nahlasenie.

  * TEXTAREA SA NEPRED-VYPLNILA PRI PREPNUTI RADIA
    - Symptom: Pri fallback na textareu (logged-in user bez objednavok
      alebo guest pred dokoncenim AJAX lookup) zostala textarea
      prazdna ak user prepol "rozsah" radio AZ PO vybere objednavky.
    - Pricina: Pre-fill cez data-items bezal len v change handleri
      pre #oodz-objednavka, nie v change handleri pre rozsah radio.
    - Fix: rozsah radio handler teraz tiez pred-vyplni textareu
      ak je k dispozicii data-items.


[2.2.1] - 2026-06-10
----------------------

OPRAVENE:

  * EMAILY SA NEPOSIELALI Z AJAX SUBMIT HANDLEROV (kriticky bug)
    - Symptom: po odoslani formulara odstupenia / reklamacie
      neprisiel ziadny potvrdzovaci email zakaznikovi ani majitelovi.
    - Pricina: WooCommerce bootstrapuje svoj mailer (a tym aj filter
      woocommerce_email_classes) LENIVO - az pri prvom volani
      WC()->mailer(). Pri custom AJAX actions (admin-ajax.php?action=
      oodz_submit / oodz_complaint_submit) sa to nikdy nestane,
      takze nase OODZ_Email_* triedy sa neinstantiovali a
      add_action('oodz_email_*', ...) v ich konstruktoroch sa
      nikdy nepripojili. do_action(...) strielo do prazdna.
    - Fix: novy interny helper trigger_email() ktory zavola
      WC()->mailer() PRED kazdym do_action(). Pouzity na vsetkych
      5 trigger miestach (withdrawal customer/admin, complaint
      customer/admin, complaint status update).
    - Dakujem testerovi za nahlasenie.


[2.2.0] - 2026-06-10
----------------------

PRIDANE:

  + INTEGRACIA S WOOCOMMERCE EMAILS
    - Vsetkych 5 transakcnych emailov je teraz registrovanych ako WC emaily
    - Zobrazia sa vo WooCommerce -> Settings -> Emails
    - Individualne zapnutie/vypnutie, vlastny subject, heading, recipient
    - Pouzivaju natvny WC email header/footer (jednotny vzhlad s ostatnymi WC mailmi)
    - 1. Withdrawal - confirmation to customer
    - 2. Withdrawal - notification to shop owner
    - 3. Complaint - confirmation to customer
    - 4. Complaint - notification to shop owner
    - 5. Complaint - status update to customer
    - Architektura: abstract OODZ_Email extends WC_Email, kazdy email
      ma vlastny HTML + plain text template v includes/emails/templates/
    - Triggery: do_action( 'oodz_email_*' ) namiesto priameho wp_mail()

  + CHECKBOX ZOZNAM PRODUKTOV PRI CASTOCNOM ODSTUPENI (aj pre guestov)
    - Ked uzivatel zvoli "len vybrane produkty", system z dropdown vybranej
      objednavky vyrenderuje zoznam polozek s checkboxami
    - Vybrane polozky idu do emailu pre majitela obchodu
    - Koniec free-text hadania co zakaznik vlastne odstupuje
    - NOVE: AJ GUEST (neprihlaseny uzivatel) dostane checkbox zoznam ked
      zada cislo objednavky a email (alebo PSC) - system cez AJAX overi
      ze ide o jeho objednavku a nacita produkty.
    - Bezpecnost guest lookup:
      - Overenie billing_email ALEBO billing_postcode na objednavke
      - Generic "not found" message pri zlyhanie (proti enumeracii)
      - Rate limit 10 lookupov / hodinu / IP (admini bypass)
      - Same auth model ako pri form submit (nic noveho sa neexponuje)

  + ZOBRAZENIE SUMY REFUNDACIE PRI "CELA OBJEDNAVKA"
    - Ked zakaznik zvoli odstupenie od celej objednavky, vidi presnu sumu
      ktora mu bude vratena (z order total)
    - Transparentne ocakavania
    - POZOR: pri dobierke (COD = neuhradena objednavka) sa suma NEZOBRAZI,
      lebo nie je co vracat. Miesto toho info ze majitel obchodu sa
      dohodne na dalsom postupe.
    - Detekcia cez WC_Order::is_paid() - funguje pre vsetky platobne metody

  + MINIFIKOVANE CSS A JS
    - Front-end loaduje oodz-style.min.css / oodz-script.min.js
    - Plne nemininifikovane verzie sa loaduju automaticky ked je
      definovany SCRIPT_DEBUG = true
    - assets/oodz-style.css 9196 B -> oodz-style.min.css 6649 B (~28% menej)
    - assets/oodz-script.js 16806 B -> oodz-script.min.js 10673 B (~37% menej)

ZLEPSENE:

  * DASHBOARD WIDGET (refactor)
    - Transient cache 5 minut (oodz_dashboard_stats) -> rychlejsie nacitanie admin homepage
    - Defensivne SHOW TABLES LIKE checky -> ziadne warning na fresh installe
    - Nova statistika "Withdrawals this month"
    - Nova sekcia "Recent complaints" - poslednych 5 reklamacii so statusom
      a linkami na detail page
    - Cache invalidation pri 6 events (novy komplaint, zmena statusu, mazanie,
      retention cleanup, GDPR erase, atd.)

PREKLADY:

  * Aktualizovane PO/MO subory pre vsetkych 6 jazykov (sk_SK, cs_CZ, hu_HU,
    de_DE, pl_PL, en_US) - nove stringy pre WC email titles/descriptions,
    checkbox UI, refund amount, dashboard widget sekcie.


[2.1.0] - 2026-06-03
----------------------

PRIDANE:

  + UCHOVAVANIE UDAJOV (auto-archive)
    - Nove nastavenie "Auto-zmazat po (rokoch)" v Settings -> Reklamacie
    - Raz denne (cez WP Cron) sa automaticky zmazu reklamacie a odstupenia
      starsie ako X rokov + ich priložene fotky z disku
    - Default: 0 (vypnute)
    - Odporucanie pre SR: 5 rokov (zakonna archivacna lehota obchodnych dokladov)
    - realpath() safety check pri mazani fotiek

  + GDPR EXPORT OSOBNYCH UDAJOV
    - Plugin hookuje do WordPress nativnych privacy tools
      (Nastroje -> Export osobnych udajov)
    - Pri exportoch sa automaticky pridaju vsetky odstupenia a reklamacie
      podla emailu zakaznika
    - Skupiny v exporte: "Withdrawals from contract", "Complaints (reklamácie)"

  + GDPR MAZANIE OSOBNYCH UDAJOV
    - Plugin hookuje do Nastroje -> Vymazat osobne udaje
    - Pri mazani sa automaticky odstrania DB zaznamy + fotky z disku
    - realpath() safety check (nikdy nemaze mimo plugin upload subdir)
    - Vracia spravu "Spotrebitelske prava: zmazanych X zaznamov"

  + PREPOJENIE S WOOCOMMERCE OBJEDNAVKOU
    - Detail reklamacie: ak cislo objednavky zodpoveda WC orderu,
      zobrazi sa klikatelny link na order edit page
    - Pridany badge so stavom objednavky (Completed/Pending/...)
    - Zobrazuje sa datum vytvorenia objednavky a celkova suma
    - Ak nezhoduje sa: zobrazi sa "no matching WooCommerce order"

  + META BOX NA WC ORDER EDIT PAGE
    - Pravy sidebar widget "Reklamacie (reklamacie)"
    - Zoznam reklamacii filed proti tejto objednavke
    - Status badge, datum, kratky popis vady (12 slov)
    - Pri prazdnom: "No complaints filed for this order."

  + DASHBOARD WIDGET
    - "🛡 Consumer Rights — Overview" na WordPress dashboard
    - 4 farebne karty:
      * Nove reklamacie (cervena ak > 0)
      * V rieseni
      * Lehota <= 5 dni (zlta ak > 0)
      * Tento mesiac
    - Quick links: Open Complaints, Open Withdrawals, Settings
    - Footer: "All-time totals: X complaints, Y withdrawals"


[2.0.0] - 2026-06-02
----------------------

MAJOR RELEASE — plugin sa rozsiruje o kompletnu funkcionalitu reklamacii
a redizajn admin sekcie. Premenovany na "Spotrebitelske prava pre WooCommerce".

OPRAVA SUPPORT TICKETU (formular na odstupenie):
  + Pridany 'wc-pending' (Awaiting payment) do zoznamu objednavok v dropdowne
    formulara na odstupenie od zmluvy. Predtym sa zobrazovali len objednavky
    so stavom completed / processing / on-hold, co rozbijalo prihlasenym
    zakaznikom ktorych objednavky konceia v pending stave (napr. vlastne
    custom modifikacie).

  + Novy WP filter hook: oodz_withdrawal_order_statuses
    Tomy a pluginy mozu prisposobit zoznam statusov v dropdowne:
    add_filter('oodz_withdrawal_order_statuses', function($statuses) {
        $statuses[] = 'wc-my-custom-status';
        return $statuses;
    });

═════════════════════════════════════════════════════════════════════════
REKLAMACIE — uplne nova funkcionalita
═════════════════════════════════════════════════════════════════════════

ONLINE REKLAMACNY FORMULAR:
  + Novy shortcode [complaint_form] (alias [reklamacia])
  + Vsetky polia zo standardneho slovenskeho papiroveho formulara:
    - Udaje kupujuceho: meno/firma, telefon, email, IBAN
    - Udaje produktu: vyrobca, model, vyrobne cislo, datum predaja,
      cislo objednavky, faktura, popis poruchy
  + Vyrobca (znacka) a Model NIE SU povinne - niektore reklamacie sa
    tykaju produktov bez jasnej znacky (popis vady je dolezitejsi)
  + Samostatne pole "Cislo objednavky":
    - Pre prihlasenych s objednavkami: dropdown ho zapisuje do hidden
      inputu (ziadne duplicitne pole)
    - Pre hosti a prihlasenych bez objednavok: viditelne textove pole
  + Pre prihlasenych zakaznikov: pre-fill mena, emailu, telefonu
    + dropdown objednavok ktory auto-fillne brand, model, datum
    predaja, fakturu a cislo objednavky

UPLOAD FOTIEK VADY (nepovinne):
  + Max 5 fotiek (nastavitelne, 0 = upload vypnuty)
  + Max 5 MB per fotka (nastavitelne)
  + Drag & drop UI + thumbnail preview + tlacidlo na zmazanie
  + Podporovane formaty: JPG, PNG, WEBP, HEIC (iPhone)
  + Bezpecne ulozenie cez wp_handle_upload() s realnou MIME verifikaciou
  + Subory v /uploads/oodz-reklamacie/YYYY/MM/ s .htaccess ochranou
    proti spusteniu PHP a zakazom directory listing
  + Random hash prefix v nazve subory (proti uhadnutiu URL)
  + realpath() safety check pri mazani (nikdy mimo upload subdir)

═════════════════════════════════════════════════════════════════════════
ADMIN — kompletna sprava reklamacii
═════════════════════════════════════════════════════════════════════════

NOVA TOP-LEVEL ADMIN SEKCIA "Spotrebitelske prava":
  + Vlastna sekcia v hlavnom menu (ikona stitu, hned za WooCommerce)
  + 3 ciste submenu polozky:
    1. Odstupenia od zmluvy
    2. Reklamacie (reklamacie)
    3. Nastavenia
  + Predtym boli rozhadzane pod WooCommerce menu

LIST REKLAMACII:
  + Farebne status badge pri kazdej polozke
  + Filter dropdown: All / Nove / V rieseni / Vybavene / Zamietnute
  + Search box: meno, email, cislo faktury, cislo objednavky, ID
  + Pagination: 20 / 50 / 100 / 200 na stranu
  + Stlpec "📷" s pocet fotiek (modry kruh badge)
  + Akcia "Otvorit" a "🗑 Zmazat" pri kazdej reklamacii

DETAIL STRANKA:
  + 2-stlpcovy layout:
    Lavy: udaje od kupujuceho (Cast 1, read-only)
    Pravy: Reklamacny protokol (Cast 2, vyplna predavajuci)
  + Polia protokolu presne podla papiroveho formulara:
    - Datum prijatia, datum vybavenia
    - Riesenie (vymena/vratenie ceny/zamietnuta)
    - Vymena za, IBAN na vratenie
    - Dovod neuznania, miesto odborneho posudenia
  + Status pipeline: New -> In progress -> Resolved / Rejected
  + Datum vybavenia (Date resolved) je POVINNY pri stave Vybavena/Zamietnuta
    - Client: HTML5 required + visual `*` znacka, JS toggle pri zmene statusu
    - Server: redirect spat s chybovou hlaskou pri prazdnom datume
    - Auto-fill dnesnym datumom ak je prazdny pri zatvarani
  + Interne poznamky (PRIVATE) - zlty badge, len pre adminov
    - NEzobrazuju sa v print/PDF ani v emailoch zakaznikovi
  + Fotky vady: vacsie nahlady (140px), photo count badge,
    lazy loading, "No photos attached" fallback
  + Nepovinny "Send status update email to customer" checkbox
  + Akcia "🖨 Print protocol" otvori printovaci view
  + Akcia "🗑 Zmazat" - cervene tlacidlo v title bare s confirm dialogom
    Trvalo zmaze DB zaznam + vsetky fotky z disku

ADMIN EMAIL:
  + Notifikacia s nahladmi fotiek + priamy link na detail
  + Zobrazuje cislo objednavky (ak je vyplnene)

═════════════════════════════════════════════════════════════════════════
PRINT / PDF (browser-native)
═════════════════════════════════════════════════════════════════════════

  + A4 vzhlad otvori sa cez "Print protocol" tlacidlo
  + Strana 1: Reklamacny formular s udajmi kupujuceho a produktu
  + Strana 2: Reklamacny protokol s checkboxmi pre riesenie
  + Pravne info dole (12 mesiacov, odborne posudenie, 14 dni)
  + Miesta pre podpisy (kupujuci + predavajuci)
  + Hlavicka s udajmi predavajucieho z nastaveni
  + Cislo objednavky v printe (ak je vyplnene)
  + Ctrl+P -> Save as PDF (ziadne externe knizniec, mensia velkost pluginu)

═════════════════════════════════════════════════════════════════════════
EMAIL NOTIFIKACIE
═════════════════════════════════════════════════════════════════════════

PRE ZAKAZNIKA:
  + HTML potvrdenie prijatia reklamacie
  + Datum a cas prijatia (pravny dokaz)
  + Upozornenie na 30-dnovu zakonnu lehotu (zakon 108/2024 Z.z.)
  + Status update email pri zmene statusu (volitelne, on demand)

PRE ADMINA:
  + Notifikacia o novej reklamacii s nahladmi fotiek
  + Priamy link na detail reklamacie
  + Pripomienka 30-dnovej lehoty na vyjadrenie

AUTOMATICKE PRIPOMIENKY (WP Cron):
  + Denna kontrola otvorenych reklamacii (status = new / in_progress)
  + Ak je reklamacia 25+ dni stara a este nebola pripomenuta, posle
    adminovi email s upozornenim na bliziacu sa 30-dnovu lehotu
  + Email obsahuje: cislo reklamacie, zakaznika, produkt, fakturu,
    pocet zostavajucich dni, link na detail
  + Kazda reklamacia spusti pripomienku len RAZ (ziadny spam)
  + Cron event sa odregistruje pri deaktivacii pluginu

═════════════════════════════════════════════════════════════════════════
NASTAVENIA — nove sekcie
═════════════════════════════════════════════════════════════════════════

UDAJE PREDAVAJUCEHO (hybrid):
  + Zaklady z WooCommerce > Settings > General > Store Address
  + Override moznosti pre Company name, korespondencnu adresu, telefon
  + Pravne polia: ICO, DIC, IC DPH
  + Pouzite v hlavicke formulara aj na print vystupe

REKLAMACIE:
  + URL stranky s reklamacnym formularom
  + Max pocet fotiek (0-20, default 5)
  + Max velkost fotky v MB (1-50, default 5)

═════════════════════════════════════════════════════════════════════════
DATABAZA
═════════════════════════════════════════════════════════════════════════

  + Nova tabulka wp_oodz_reklamacie (23 stlpcov + 3 indexy)
    Indexy: status, customer_email, invoice_number
  + Auto-create cez maybe_upgrade() pri prvom nacitani (nie len pri
    aktivacii) - opraveny problem s "Database error" pri in-place update
  + Nova option oodz_db_version sleduje aktualnu verziu DB schemy
  + Lepsia diagnostika DB chyb: ked je WP_DEBUG zapnute, do chybovej
    hlasky sa prida konkretny $wpdb->last_error pre rychlu identifikaciu

═════════════════════════════════════════════════════════════════════════
UI / CITATELNOST
═════════════════════════════════════════════════════════════════════════

  + Vacsie a citatelnejsie font sizes vo formularoch:
    - Title: 26px
    - Section titles: 18px
    - Labels: 15px
    - Inputs/textarea/select: 16px
    - GDPR checkbox: 15px
    - Submit button: 17px
    Pevne px hodnoty zaisťuju konzistentnost naprieč temami.
  + Vacsie radio buttons a checkboxy (20px namiesto 18px)
  + Vacsie paddingy na inputoch (12/16 namiesto 10/14)
  + Pridane input types do design selectoru: tel, date, number, url

═════════════════════════════════════════════════════════════════════════
BEZPECNOST
═════════════════════════════════════════════════════════════════════════

  + Rate limiting: max 3 odoslania reklamacie za hodinu na IP adresu
  + Vsetky vstupy sanitizovane, vystupy escapovane
  + Nonce + capability check na vsetkych admin akciach
  + POST-only delete (ziadne GET delete linky)
  + realpath() safety check pri mazani fotiek z disku
  + Photo upload: realna MIME verifikacia, nie len pripona

═════════════════════════════════════════════════════════════════════════
PREKLADY
═════════════════════════════════════════════════════════════════════════

  + Vsetky nove stringy reklamacii a admin UI prelozene v 6 jazykoch:
    EN, SK, CS, HU, DE, PL

═════════════════════════════════════════════════════════════════════════
PREMENOVANE
═════════════════════════════════════════════════════════════════════════

  * Plugin nazov: "Odstupenie od zmluvy pre WooCommerce"
    -> "Spotrebitelske prava pre WooCommerce"
    (pokryva oba formulare: odstupenia + reklamacie)

  * Settings stranka: "Withdrawal Settings"
    -> "Consumer Rights — Settings"

═════════════════════════════════════════════════════════════════════════
BACKWARD COMPATIBILITY
═════════════════════════════════════════════════════════════════════════

  - Stary [withdrawal_form] aj [odstupenie_od_zmluvy] shortcode dalej funguju
  - Existujuca DB tabulka wp_oodz_log (odstupenia) zostava nedotknuta
  - Vsetky existujuce settings ostavaju zachovane
  - Ziadne breaking changes


[1.7.0] - 2026-05-22
----------------------

PRIDANE:
  + Viacero notifikacnych e-mailov pre admina
    Pole "E-mail(y) prevadzkovatela" teraz akceptuje viac adries oddelenych
    ciarkou (alebo bodkociarkou, novym riadkom). Notifikacia o novom odstupeni
    pride vsetkym uvedenym adresam naraz.
    Priklad: info@shop.sk, podpora@shop.sk, manager@shop.sk
    - Neplaten e-maily sa automaticky ignoruju
    - Duplicity sa odstranuju
    - Ak je pole prazdne, fallback na WordPress admin_email

ZMENENE:
  * Aktualizovany odkaz na slovensku legislativu
    Stara citacia "§ 7 zakona c. 102/2014 Z.z." bola nahradena za:
    "zakon c. 108/2024 Z. z. o ochrane spotrebitela"
    Zakon 102/2014 Z.z. bol zruseny a nahradeny novym zakonom 108/2024 Z.z.
    s ucinnostou od 1.7.2024.

  * Aktualizovana kompatibilita
    - Tested up to WordPress 7.1
    - WC tested up to 9.5

INTERNE:
  + Helper sanitize_emails_list() - bezpecna sanitacia vstupu pri ukladani
  + Helper get_admin_emails() - vracia pole platnych adries pre wp_mail()


[1.6.0] - 2026-05-22
----------------------

PRIDANE:
  + Vlastne upozornenie / oznam vo formulari
    Nove pole v admin nastaveniach kde admin moze zadat lubovolny text
    ktory sa zobrazi v hornej casti formulara (nad zakonnym textom).
    Uzitocne pre produktovo-specificke vynimky z prava na odstupenie,
    napr. "Odstupenie sa nevztahuje na tovar na mieru alebo hygienicky
    tovar po otvoreni."
    - Ak prazdne -> nezobrazi sa nic
    - Ak vyplnene -> zobrazi sa ako modry info-box
    - Podporuje zakladne HTML: <strong>, <em>, <a>, <br>, <p>, <ul>, <ol>, <li>
    - Plain text sa automaticky obali do paragrafov (wpautop)
    - Sanitacia cez wp_kses_post pri ukladani aj pri vypise


[1.5.0] - 2026-05-22
----------------------

PRIDANE:
  + Polstina (pl_PL) - kompletny preklad
    Pridany sedmy jazyk - Polski. Spravne polske plurals (3 formy: 1 / 2-4 / 5+).

  + Klikatelny link na ochranu osobnych udajov v GDPR checkboxe
    Pouziva WordPress nativnu funkciu get_privacy_policy_url() -
    admin si nastavi privacy policy page v Settings -> Privacy.
    Ak je nastavena, v GDPR checkboxe sa zobrazi klikatelny link.
    Link otvara stranku v novom okne (target="_blank" rel="noopener").

ZMENENE:
  * GDPR consent string vo vsetkych prekladoch obsahuje %s placeholder
    pre privacy policy link (preto bolo treba prekompilovat vsetky .mo)


[1.4.3] - 2026-05-22
----------------------

ZMENENE:
  * Premenovany plugin
    "Odstupenie od zmluvy for WooCommerce" -> "Odstupenie od zmluvy pre WooCommerce"
    Plugin je primarne urceny pre slovensky trh, hybrid nazov nebol idealny.


[1.4.2] - 2026-05-22
----------------------

OPRAVENE:
  ! Pridane skompilovane .mo subory prekladov
    Predchadzajuca verzia 1.4.0/1.4.1 obsahovala iba .po (zdrojove) subory.
    WordPress vsak cita iba binarnu .mo verziu, preto preklady fakticky
    nefungovali. Vsetkych 5 .mo prelozenych jazykov je teraz v ZIPe.

  ! Opraveny zostatok stareho shortcode v admin pomocnom texte
    "How to use" v admine sa stale referencoval na [odstupenie_od_zmluvy]
    namiesto noveho [withdrawal_form].


[1.4.1] - 2026-05-22
----------------------

PRIDANE:
  + Novy anglicky shortcode [withdrawal_form]
    Hlavna doporucena varianta pre nove instalacie.

ZACHOVANE (backward compatibility):
  + Povodny shortcode [odstupenie_od_zmluvy]
    Funguje dalej ako alias - nikomu sa nepokazil web po update.
    Oba shortcode volaju rovnaku metodu render_form().


[1.4.0] - 2026-05-22
----------------------

PRIDANE:
  + Pln multijazycna podpora cez WordPress gettext system
    5 jazykov: anglictina (en_US), slovencina (sk_SK), cestina (cs_CZ),
    madarcina (hu_HU), nemcina (de_DE).
    Vsetky labely, emaily, error spravy a admin UI plne prelozitelne.

  + JavaScript stringy lokalizovane cez wp_localize_script
    Deadline info, validacne hlasky a error messages v JS pouzivaju
    preklady z oodzAjax.i18n objektu.

ZMENENE:
  * Zdrojovy jazyk zmeneny zo slovenciny na anglictinu
    Potrebne pre kompatibilitu s WordPress.org translation platformou.
    Vsetky hardcoded SK stringy obalene do __() volani.

  * Premenovany plugin (kvoli WP.org poziadavkam)
    Slug: wc-odstupenie-od-zmluvy -> odstupenie-od-zmluvy
    Class: WC_Odstupenie_Od_Zmluvy -> Odstupenie_Od_Zmluvy_Plugin
    Text domain: wc-odstupenie-od-zmluvy -> odstupenie-od-zmluvy
    (WP.org nedovoluje "wc" prefix kvoli WooCommerce trademark)

  * Hlavny PHP subor premenovany
    wc-odstupenie-od-zmluvy.php -> odstupenie-od-zmluvy.php


[1.3.1] - 2026-05-20
----------------------

PRIDANE:
  + Overenie existencie cisla objednavky v systeme
    Pred kazdym odoslanim (prihlaseny aj host) plugin overi ci objednavka
    s danym cislom vobec existuje v databaze.
    Zakaznik dostane zrozumitelnu hlasku: "Objednavka c. X nebola najdena
    v systeme" namiesto generickeho "kombinacia nebola najdena".
    Funguje so standardnym WooCommerce aj s pluginmi na vlastne cislovanie
    objednavok (Sequential Order Numbers a podobne).

  + Plna HPOS kompatibilita
    Plugin je kompatibilny s HPOS aj legacy WooCommerce bez akychkolvek
    zmien v nastaveniach. Prepinanie medzi rezimami je automaticke.
    - V rezime HPOS: pouziva native stlpce tabulky wc_orders
    - V rezime Legacy: pouziva klasicku postmeta / meta_query
    Deklarovana kompatibilita cez FeaturesUtil::declare_compatibility()
    - plugin zobrazuje zelenu znacku v WooCommerce > Nastavenia > Pokrocile.

  + HPOS-nativny dotaz pre PSC verifikaciu (orders_by_postcode)
    V rezime HPOS pouziva billing_postcode ako priamy stlpec tabulky wc_orders.
    V rezime Legacy pouziva meta_query na _billing_postcode ako doteraz.
    Prepinanie je automaticke cez OrderUtil::custom_orders_table_usage_is_enabled().

  + Helper find_order_by_number() - kompatibilny s custom cislovanim
    Centralna metoda pre hladanie objednavky podla cisla:
    1. Najprv skusi wc_get_order() - standard WC kde cislo = ID
    2. Fallback: meta query na _order_number - pre custom numbering pluginy
    Funguje transparentne s HPOS aj legacy.

ZNAME OBMEDZENIA:
  - HPOS detekcia vyzaduje WooCommerce 7.1+ (trieda OrderUtil).
    Na starsich verziach WC (<7.1) plugin bezi automaticky v legacy rezime
    a vsetky funkcie funguju normalne - iba bez HPOS optimalizacii.


[1.3.0] - 2026-05-20
----------------------

PRIDANE:
  + Automaticka kontrola 14-dnovej lehoty na odstupenie
    Plugin pocita lehotu od datumu dorucenia objednavky (date_completed).
    Ak objednavka este nema stav Dokoncena, pouziva sa date_created ako fallback.

  + Vizualna informacia o lehote vo formulari
    Pri vybranej objednavke sa zobrazuje farebny banner:
      - Zeleny:  zostava viac ako 3 dni — "Lehota: zostava X dni (do DD.MM.RRRR)"
      - Zlty:    zostava 1-3 dni — "Pozor: lehota vyprsie o X dni"
      - Cerveny: vyprsala — "Lehota vyprsala DD.MM.RRRR. Formular nie je mozne odoslat."

  + Automaticke zablokovanie formulara po uplynyti lehoty
    Submit tlacidlo sa deaktivuje v JS ak zakaznik vyberie objednavku
    s vyprsanou lehotou. Server nezavisle overi lehotu aj pri obchadzani JS.

  + Info o lehotach v dropdown menu objednavok
    Kazda objednavka v zozname zobrazuje "(7 d.)" alebo "(lehota vyprsala)".

  + Tlacidlo v My Account sa skryje po 14 dnoch
    Po uplynyti lehoty sa "Odstupit od zmluvy tu" automaticky prestane
    zobrazovat pri danej objednavke. Smernica vyzaduje dostupnost funkcie
    iba pocas lehoty na odstupenie.

  + Serverova kontrola lehoty v AJAX handleri
    Nezavisle overenie aj ked klient obide JS blokovanie.
    Chybova hlaska obsahuje datum vyprsania a kontakt prevadzkovatela.

ZNAME OBMEDZENIA:
  - Klientska vizualizacia lehoty nie je dostupna pre hostovskych zakaznikov
    (nemaju dropdown - lehota sa overi az po serverovom overeni objednavky).
  - Datum dorucenia zavisi na tom kedy prevadzkovatel zmenil stav na "Dokoncena".


[1.2.0] - 2026-05-20
----------------------

PRIDANE:
  + Zalozna verifikacia cez PSC fakturacnej adresy
    Hostovsky zakaznik ktory uz nema pristup k povodnemu emailu moze overit
    objednavku zadanim cisla objednavky + PSC z fakturacnej adresy.

  + Nastavenie "Kontakt pre pripad problemov"
    Admin zada email alebo telefon v WooCommerce > Nastavenia Odstupeni.
    Zobrazi sa v chybovej hlasci ked zakaznik nevie overit objednavku.

  + Rate limiting
    Max 3 odoslania formulara za hodinu na IP adresu (WP transienty).
    Ochrana pred spamovanim AJAX endpointu a zahltenim adminovej schranky.

OPRAVENE:
  ! IDOR bezpecnostna chyba
    Prihlasen zakaznik mohol zadat cislo objednavky ineho zakaznika.
    Opravene: overenie cez customer_id - user moze odoslat len vlastnu objednavku.

  ! Email header injection
    Nazov eshopu v predmete emailu ocisteny od newline znakov (\r, \n).

  ! Text vstupneho tlacidla
    "Odstupit od zmluvy" opravene na "Odstupit od zmluvy tu" (cl. 1 smernice).

  ! Text potvrdzovaciaho tlacidla formulara
    "Odstupit od zmluvy tu" opravene na "Potvrdit odstupenie od zmluvy" (cl. 3).


[1.1.0] - 2026-05-20
----------------------

PRIDANE:
  + Tlacidlo "Odstupit od zmluvy tu" v Moj ucet > Objednavky
    Pri kazdej objednavke prihlaseneho zakaznika. Kliknutim sa otvori formular
    s predvyplnenou objednavkou. Zobrazi sa az po zadani URL v nastaveniach.

  + Pre-fill formulara z URL parametra ?objednavka=CISLO
    Pri prichode z My Account sa automaticky predvoli spravna objednavka.

  + Nastavenie URL stranky s formularom (WooCommerce > Nastavenia Odstupeni)

  + Informacna hlaska pre neprihlasenych zakaznikov
    Upozornenie ze musia zadat email pouzity pri objednavke alebo PSC.

ZMENENE:
  * Overenie objednavky rozdelene na dve vetvy:
    - Prihlasen zakaznik: overenie cez customer_id (nie email)
    - Hostovsky zakaznik: overenie cez billing_email


[1.0.0] - 2026-05-20
----------------------

PRVE VYDANIE

Formular (shortcode [odstupenie_od_zmluvy]):
  + Meno a priezvisko, email, cislo objednavky, rozsah, produkty, poznamka, GDPR
  + Dropdown objednavok pre prihlasenych, textove pole pre hostov
  + AJAX odoslanie bez reloadu, loading spinner, klientska aj serverova validacia

Emaily:
  + Zakaznikovi: HTML potvrdenie s datumom a casom (trvalý nosic, cl. 4 smernice)
  + Prevadzkovatelovi: notifikacia s pripomienkou 14-dnovej lehoty na refund

Databaza:
  + Tabulka wp_oodz_log: meno, email, objednavka, rozsah, poznamka, datum/cas, IP
  + Vytvori sa automaticky pri aktivacii pluginu

Administracia:
  + WooCommerce > Odstupenia od zmluvy: prehlad poslednych 200 ziadosti
  + WooCommerce > Nastavenia Odstupeni: email prevadzkovatela

Bezpecnost:
  + ABSPATH check, CSRF (check_ajax_referer), sanitizacia, escapovanie
  + wpdb->insert() s formatmi (ziadny SQL injection)
  + Capability checks: manage_woocommerce, manage_options

Legislativa:
  + Smernica EU 2023/2673 (ucinnost od 19.06.2026)
  + Zakon c. 102/2014 Z.z. o ochrane spotrebitela pri predaji na dialku

CO PLUGIN NERIESI (zamerane obmedzenia v 1.0.0):
  - Automaticka kontrola 14-dnovej lehoty [pridana v 1.3.0]
  - Vynimky z prava na odstupenie (digitalny obsah, hygienicky tovar a pod.)
  - Automaticke refundy ani zmena stavu objednavky
  - Generovanie dobropisu alebo vratoveho stitku
  - Napojenie na dopravcov


====================================
onlinefotka.sk | info@onlinefotka.sk
====================================
