=== Elementary POS for WooCommerce ===
Contributors: ramble11
Tags: pos, sync, woocommerce, stock, inventory
Requires at least: 5.8
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.9.50
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Obousměrná synchronizace produktů a skladových zásob mezi Elementary POS a WooCommerce.

== Popis ==

[Elementary POS](https://elementarypos.com) je moderní cloudová pokladna pro maloobchodní podniky. Tento plugin umožňuje automatickou synchronizaci produktů a zásob mezi vaším systémem Elementary POS a obchodem WooCommerce v reálném čase.

= Klíčové funkce =

* **HPOS kompatibilní** - Plně kompatibilní s WooCommerce High-Performance Order Storage
* **Obousměrný import produktů** - Import produktů z Elementary POS do WooCommerce, nebo export z WooCommerce do Elementary POS
* **Systém mapování daní** - Inteligentní mapování daní mezi daňovými třídami WooCommerce a typy daní v Elementary POS
* **Import v režimu konceptu** - Možnost importovat nové produkty jako Koncept místo Publikováno
* **Synchronizace konceptových produktů** - Volitelná synchronizace konceptových produktů spolu s publikovanými
* **Bezpečné odstraňování produktů** - Produkty jsou přesunuty do Koše místo trvalého smazání, což umožňuje obnovení
* **Obousměrná synchronizace zásob** - Udržujte skladové množství synchronizované v obou směrech
* **Webhooky v reálném čase** - Okamžité aktualizace při prodeji v Elementary POS
* **Automatická synchronizace objednávek** - Objednávky WooCommerce automaticky aktualizují zásoby Elementary POS
* **Systém fronty** - Spolehlivé zpracování s automatickým opakováním při selhání; neúspěšné položky jsou automaticky opakovány při nové aktivitě
* **Komplexní logování** - Sledování všech synchronizačních aktivit s podrobnými záznamy
* **Manuální ovládání** - Plná manuální kontrola nad synchronizací podle potřeby

= Jak to funguje =

**Co se synchronizuje:**

*Elementary POS → WooCommerce:*
* Data produktů (název, SKU, cena, kategorie, daňové třídy)
* Změny množství zásob ze všech zdrojů (prodeje, manuální úpravy, inventurní opravy)

*WooCommerce → Elementary POS:*
* Data produktů (název, SKU, cena, daňové třídy)
* Změny množství zásob z objednávek, ve chvíli, kdy jim WooCommerce sníží nebo vrátí sklad
* Manuální úpravy zásob v administraci WooCommerce

**Kdy dochází k synchronizaci:**

*Elementary POS → WooCommerce:*
Když dojde ke změně zásob v Elementary POS (prodej, manuální úprava atd.), webhook je odeslán do WooCommerce.
Plugin zpracuje aktualizaci okamžitě v reálném čase a aktualizuje úrovně zásob ve WooCommerce.

*WooCommerce → Elementary POS:*
Když WooCommerce sníží sklad kvůli objednávce - což se děje při zaplacení a při přechodu objednávky do stavu Zpracovává se, Čeká na vyřízení nebo Dokončeno - nebo když sklad ručně změníte v administraci WooCommerce, odešle se změna do Elementary POS automaticky.
Změny se odesílají okamžitě, jakmile k nim dojde. Když pokladna není k zastižení, změna se zařadí do fronty a zkusí se znovu za patnáct minut a pak za hodinu. Změna, která selhala během posledních čtyřiadvaceti hodin, se navíc zkusí znovu při každé další skladové aktivitě, takže pokladna, která byla na chvíli nedostupná, nic nestojí. Starší už se nechává být - rozdíl starý den se lépe spraví ruční synchronizací než slepým dopočítáním - a po třiceti dnech se smaže. Změnu, kterou Elementary POS rovnou odmítne - nemá položku s daným SKU, nebo mu jednotka nic neříká - plugin zapíše do protokolu a dál ji neopakuje, protože odpověď by byla pokaždé stejná.

= Požadavky =

* WordPress 5.8 nebo vyšší
* WooCommerce 9.1 nebo vyšší - hooky, kterými WooCommerce ohlašuje změny skladu z objednávky, přišly až ve verzích 7.6 a 9.1. Na čemkoliv starším se sklad vrácený stornovanou objednávkou do pokladny nedostane a dorovnání proti pokladně pak tiše vrátí prodané zboží na sklad
* PHP 7.4 nebo vyšší
* Elementary POS API klíč
* Produkty musí mít SKU kódy pro synchronizaci zásob (import produktů může fungovat bez SKU)

= Kompatibilita =

* **HPOS kompatibilní** - Plně kompatibilní s WooCommerce High-Performance Order Storage
* **WP Cron** - Používá WordPress cron pro zpracování fronty (spouští se každých 15 minut)

== Omezení ==

* **Desetinná množství nejsou podporována** - WooCommerce počítá sklad v celých číslech a desetinnou změnu neořezává nahoru, ale dolů, takže změna o půl kusu neudělá vůbec nic a z 1,5 se stane 1. U zboží prodávaného po kusech se obchod stejně dorovná, protože plugin porovnává i s množstvím, které hlásí pokladna, a to celé číslo zapíše; rozdíl tedy nikdy nepřeroste jeden kus. U položky, která má v Elementary POS jinou jednotku než kusy, se to dorovnání záměrně nedělá - 2,5 kg nejde převést na počet balení a zapsat místo toho 2 by smazalo vlastní počet obchodu - takže tam se ten zlomek ztratí natrvalo. V opačném směru takovou položku pokladna rovnou odmítne a změna se místo opakování zapíše do logu. Obchod prodávající na váhu, délku nebo objem se tedy směrem do Elementary POS nesynchronizuje vůbec a z druhé strany k němu dorazí jen celé jednotky.
* **Spouštěč synchronizace zásob** - Synchronizace zásob WooCommerce → Elementary POS proběhne, když WooCommerce sníží sklad kvůli objednávce, když ho vrátí zpět při stornu objednávky nebo při vratce se zaškrtnutým „znovu naskladnit vrácené položky“, když se změní nebo smaže položka na existující objednávce, a když sklad ručně změníte v administraci WooCommerce. Co změní množství v databázi mimo tyto cesty - a některé pluginy třetích stran to dělají - plugin nevidí a do pokladny se to nedostane. Pokud má váš obchod vypnutou správu zásob pro určité produkty (např. služby, digitální produkty), tyto produkty nespustí synchronizaci do Elementary POS.
* **Viditelnost produktu a stav zásob** - Nově importované produkty jsou nastaveny jako "Viditelné" v katalogu a viditelnost zůstává při dalších importech zachována. U produktu, který sleduje sklad, odvozuje WooCommerce stav zásob z množství, takže položka, která nemá v Elementary POS nic na skladě - včetně nově importované, než se sklad načte - se zobrazí jako "Není skladem". U produktu, který sklad nesleduje - služba, poukaz, zboží na objednávku - je stav zásob jen váš: nemění ho import ani synchronizace. Viditelnost si po importu upravte ručně, pokud ji potřebujete jinak.
* **Pouze jednoduché produkty** - Plugin importuje všechny produkty jako Jednoduché produkty (WC_Product_Simple). Produkty s variantami v Elementary POS jsou importovány jako jediné jednoduché produkty, ne jako Variabilní produkty s variacemi. Pokud váš katalog silně závisí na variacích produktů (velikost, barva atd.), budete je muset manuálně nakonfigurovat ve WooCommerce po importu.
* **Produkty s variantami se nesynchronizují** - Elementary POS prodává jednotlivé položky a variantu nemá čím zastoupit, takže plugin nechává produkty s variantami stranou v obou směrech. Samotný produkt s variantami se neodesílá: je to jen hlavička pro své varianty, nemá vlastní cenu a jeho odesláním by na pokladně vznikla položka za nulu. Jednotlivé varianty se neodesílají také, a množství prodané na pokladně cestu k variantě nenajde, protože sklad se páruje podle SKU jen proti produktům. Pozor na to, že WooCommerce zobrazuje v poli SKU u varianty SKU nadřazeného produktu, když varianta vlastní nemá - je to jen předvyplněná nápověda, ne kód, který by varianta měla. Seskupené a externí produkty se z exportu vynechávají ze stejného důvodu. Chcete-li varianty prodávat na pokladně, veďte je v Elementary POS jako samostatné položky a ve WooCommerce jako samostatné jednoduché produkty, každý s vlastním SKU.
* **Položky bez SKU vzniknou při každém importu znovu** - SKU je to, čím se položka v Elementary POS páruje s produktem ve WooCommerce, takže položku bez něj nemá import podle čeho poznat a při každém běhu ji založí jako nový produkt. Takový produkt navíc nikdy nedostane sklad, ze stejného důvodu. Zaškrtněte „Importovat pouze produkty s SKU", nebo položkám v Elementary POS SKU nejdřív doplňte.
* **SKU se páruje přesně, včetně velikosti písmen** - „abc-1" a „ABC-1" jsou pro plugin dva různé kódy, zatímco WooCommerce je považuje za tentýž. Položka, jejíž SKU se liší jen velikostí písmen, proto nenajde svůj protějšek a pokus o její založení skončí jako duplicita mezi neúspěšnými. Držte zápis na obou stranách stejný.
* **Daň, která není procentní, se naimportuje jako standardní sazba** - WooCommerce nezná daňovou třídu ve významu „bez daně", takže položka, která má v Elementary POS nulovou daň, pevnou částku nebo kombinaci sazeb, vznikne jako zdanitelná se standardní třídou. Tabulka mapování u každé daně pokladny uvádí její typ a je možné k ní ručně vybrat třídu, třeba „Nulová sazba" - po prvním importu to stojí za kontrolu.
* **Plná synchronizace nečeká na frontu** - Obě ruční synchronizace skladu zapisují absolutní množství a změna, která se ještě nedostala do Elementary POS, se doručí až po nich a připočte se k tomu, co bylo právě zapsáno. Než ji spustíte, nechte frontu vyprázdnit: na nástěnce je vidět, kolik položek čeká, a tlačítko „Zpracovat frontu" v nastavení je doručí hned.
* **Párování kategorií podle názvu** - Kategorie importované z Elementary POS si zachovají strukturu rodič/dítě, ale existující kategorie ve WooCommerce se párují podle názvu v rámci téhož rodiče. Kategorie přejmenovaná v Elementary POS se proto naimportuje jako nová; ta původní zůstane a je potřeba ji odstranit ručně.
* **Kategorie nelze v Elementary POS zakládat** - Při exportu produktů z WooCommerce se produkt zařadí do kategorie v Elementary POS jen tehdy, když tam kategorie stejného názvu už existuje. API Elementary POS zakládání kategorií neumožňuje, takže produkty, jejichž kategorie nemá protějšek, vzniknou bez kategorie (zapíše se to do logu). Kategorie položek, které v Elementary POS už existují, se nikdy nemění.
* **Produkty obnovené z koše ztrácejí vazbu** - Produkt přesunutý do koše si drží své SKU jen do chvíle, než si ho vezme něco jiného. Při použití volby „Přesunout všechny produkty do koše před importem“ import produkty vytvoří znovu se stejnými SKU, takže obnovenému produktu WooCommerce přidělí nové SKU s příponou (např. z 704 se stane 704-1). Obnovený produkt už proto není spárovaný se svou položkou v Elementary POS a nesynchronizuje se; použijte ho k záchraně popisků nebo obrázků, ne jako funkční kopii.
* **Názvy položek musí být v Elementary POS jedinečné** - Elementary POS odmítne druhou položku s názvem, který už má, takže dva produkty ve WooCommerce se shodným názvem nelze exportovat oba. Druhý je nahlášen jako neúspěšný a u výsledku se ukáže vysvětlení z Elementary POS.
* **Omezení WP-Cron** - WP-Cron funguje na základě časových intervalů (např. každou hodinu nebo jednou denně), ale spouští se pouze když někdo navštíví váš web. To znamená, že pokud nikdo neotevře vaše webové stránky, úloha nemusí být spuštěna včas, ale je zařazena do fronty a provedena při první návštěvě.


== Instalace ==

1. Nainstalujte plugin z WordPress.org (Pluginy → Přidat nový → Vyhledat "Elementary POS")
2. Aktivujte plugin
3. Přejděte na Elementary POS v menu WordPress administrace
4. Přejděte na záložku Nastavení
5. Zadejte svůj Elementary POS API klíč
6. Klikněte na "Uložit nastavení" pro uložení API klíče
7. (Volitelné) Klikněte na "Otestovat API připojení" pro ověření spojení

= Počáteční nastavení =

Po instalaci a konfiguraci API klíče můžete začít používat plugin:

1. **(Volitelné) Import produktů**: Přejděte na záložku Import → Načíst produkty → Import pro přenesení produktů z Elementary POS do WooCommerce
2. **(Volitelné) Synchronizace zásob**: Proveďte počáteční synchronizaci zásob v libovolném směru (Elementary POS → WooCommerce nebo WooCommerce → Elementary POS) ze záložky Synchronizace
3. **(Volitelné) Povolit automatickou synchronizaci**: Po provedení počáteční synchronizace zásob můžete povolit automatickou synchronizaci v záložce Nastavení přepnutím přepínače na ZAPNUTO
4. **Ověřit stav**: Zkontrolujte Dashboard pro potvrzení, že všechna nastavení jsou správně nakonfigurována

== Snímky obrazovky ==

1. Dashboard - Přehled stavu synchronizace a rychlé akce
2. Import produktů - Import produktů z Elementary POS do WooCommerce s možnostmi filtrování
3. Synchronizace zásob - Manuální ovládání synchronizace zásob v obou směrech
4. Nastavení - Konfigurace API a přepínač automatické synchronizace
5. Záznamy - Podrobné záznamy aktivit s filtrováním a vyhledáváním

== Changelog ==

= 0.9.50 =
* Vylepšeno: Sklad drží krok s pokladnou i ve třech dalších situacích - objednávka, která dorazí, když starší změna téhož produktu ještě čeká ve frontě; prodej na pokladně během zpracování fronty; a načtení skladu po importu jen nových položek
* Opraveno: Produkt prodávaný bez daně se teď exportuje na pokladnu bez sazby. Dřív se četla jen daňová třída, takže řádek „Bez přiřazení daně" v tabulce mapování neměl účinek - pokud prodáváte něco bez daně, stojí za to si u vyexportovaných položek daň zkontrolovat
* Vylepšeno: Navrhované mapování daní teď páruje jen sazby, které si opravdu odpovídají, takže obchodu s 21 % se už nenabídne 20 % z pokladny
* Vylepšeno: Import jde spustit znovu hned po zrušení a tlačítko Zrušit zůstává dostupné i pro další běh
* Změněno: Popis nově pojmenovává čtyři omezení, která je dobré znát před importem - položky bez SKU, SKU lišící se jen velikostí písmen, daně pokladny, které nejsou procentní, a plnou synchronizaci spuštěnou, když ve frontě ještě něco leží

= 0.9.49 =
* Opraveno: Prodaná nebo vrácená varianta pohnula položkou pokladny, která patří celému produktu, protože WooCommerce variantě bez vlastního SKU podstrčí SKU nadřazeného produktu - a zpátky se nikdy nic nevrátilo, takže se obě strany tiše rozcházely. Varianty teď plugin nechává stranou v obou směrech, což popis vysvětluje
* Opraveno: Produkt s variantami odcházel na pokladnu jako prodejná položka za nulu, protože nemá vlastní cenu, a každý další export tu nulu zapsal znovu. Produkty s variantami, seskupené a externí se teď vynechávají a obrazovka importu řekne, kolik jich bylo
* Opraveno: Změna z pokladny menší než jeden kus nepohnula ničím a přesto se hlásila jako provedená. Nově se zapíše jako varování s tím, co se zahodilo
* Opraveno: Pojmenování nového produktu a zadání množství v jednom kroku vyvolalo varování o změně SKU, ke které nedošlo, takže import několika stovek produktů vypadal poplašně
* Opraveno: Filtr logu „Včera" ukazoval i dnešek a obě denní volby řezaly den o půlnoci v UTC místo podle časové zóny obchodu
* Opraveno: Obnovení přehledu na nástěnce nechalo počet produktů se SKU a oba stavové štítky tak, jak byly
* Změněno: Popis tvrdil, že se desetinné množství z pokladny zaokrouhlí nahoru. Ořezává se dolů, změna pod jeden kus se zahodí celá a u zboží, které se neměří na kusy, je ta ztráta trvalá

= 0.9.48 =
* Opraveno: Změna množství položky na existující objednávce, nebo její smazání, pohnula skladem v e-shopu, ale na pokladnu se nedostala
* Opraveno: Čekání mezi pokusy se zapisovalo v UTC, ale porovnávalo s časem databáze, takže se na většině obchodů neuplatnilo vůbec - pokladna chvíli nedostupná spotřebovala všechny pokusy během minut místo během hodiny
* Opraveno: Poznámka, že je pohyb ještě na cestě k pokladně, vypršela dřív, než ho fronta stihla doručit, a dorovnání proti pokladně pak mohlo vrátit prodané zboží na sklad
* Opraveno: Import přepsal cenu, kterou zákazník platí, běžnou cenou, čímž tiše zrušil akci, ve které produkt byl - a opakoval to při každém importu
* Opraveno: V obchodě, který sklad vůbec nepočítá, vznikl každý importovaný produkt jako nedostupný a nešlo ho pak už nijak vrátit do prodeje
* Změněno: Ve výčtu dat odesílaných do Elementary POS chyběl směr exportu, který posílá název produktu, SKU, cenu, daň, barvu a kategorii
* Změněno: Šest dalších tvrzení v popisu neodpovídalo tomu, co plugin dělá - které objednávky posílají sklad, jak dlouho se neúspěšná změna opakuje, co se stane s položkou, která se neměří na kusy, proč je potřeba WooCommerce 9.1 a co drží fronta

= 0.9.47 =
* Opraveno: Plugin běžel i vedle WooCommerce starší než 9.1, přestože 0.9.46 tuto verzi vyhlásila jako minimum. Hlavička, která to říká, je jen deklarace - WordPress podle ní nejedná a WooCommerce ji jen okomentuje - a kontrola, která instalaci opravdu odmítne, pořád žádala 5.0. V takovém obchodě se prodej do pokladny nikdy nedostal a dorovnání proti pokladně pak vrátilo prodané zboží na sklad, čemuž mělo zvednuté minimum právě zabránit. Plugin teď aktivaci odmítne a na obchodě, kde už zapnutý je, se drží stranou a na každé obrazovce administrace řekne, kterou verzi potřebuje a která je nainstalovaná. Dokud se WooCommerce neaktualizuje, nic se nesynchronizuje

= 0.9.46 =
* Opraveno: Volba „Přesunout všechny produkty do koše před importem" vysypala katalog, aniž by se napřed podívala, jestli je co vrátit zpět. Když produkty načtené z Elementary POS mezitím vypršely nebo pokladna odpověděla prázdnem, obchod se vyprázdnil a import pak skončil hláškou „nejdřív načtěte produkty". Teď to odmítne a řekne proč - a nespustí se, když už jiný import běží
* Změněno: Minimum je nově WooCommerce 9.1. Hooky, kterými WooCommerce ohlašuje změnu skladu z objednávky, přišly až ve verzích 7.6 a 9.1, takže na čemkoliv starším prodej z e-shopu do pokladny nikdy nedorazil - a dorovnání proti pokladně pak prodané zboží tiše vrátilo na sklad. Plugin to teď řekne rovnou
* Opraveno: Odškrtnutí volby „Importovat daňové třídy" se ignorovalo a navržené mapování se stejně zapsalo do každého produktu. jQuery prázdné mapování do požadavku nedá, takže „ne, děkuji" a „nikdo se neptal" dorazilo na server stejně
* Opraveno: Export mohl skončit fatální chybou, když vypršela data z náhledu - řádek, který hlásí nenamapovanou daňovou třídu, dostal místo seznamu boolean
* Opraveno: Výsledek ruční synchronizace skladu ukazoval tatáž dvě čísla dvakrát - „1 produktů aktualizováno, 0 se nezdařilo." a hned za tím „(Aktualizováno: 1, Selhalo: 0)"
* Opraveno: Tatáž věta neskloňovala - psala „1 produktů aktualizováno" místo „1 produkt aktualizován"

= 0.9.45 =
* Opraveno: Sklad změněný hromadnou úpravou v seznamu produktů se do Elementary POS nikdy nedostal. Hromadná úprava nenastavuje množství na produktu tak jako všechny ostatní obrazovky - zapisuje ho rovnou do databáze - takže o tom plugin nevěděl a po navýšení skladu u padesáti produktů najednou zůstala pokladna na starých číslech, aniž by to cokoliv ohlásilo. Hromadná úprava teď dorazí do pokladny stejně jako každá jiná ruční změna
* Opraveno: Zrušení importu ve verzi 0.9.44 nedělalo vůbec nic. Tlačítko se přepnulo na „Ruším…“ a import už tam zůstal, protože se skript odvolával na proměnnou, která tam po úpravě nebyla, a spadl. Kdo import zrušil, musel stránku načíst znovu. Rušení funguje zase ve všech fázích
* Změněno: Nástěnka říkala „Celkem produktů ve WooCommerce“ a záložka Import totéž, ale každá počítala něco jiného - nástěnka vynechává to, co se nesynchronizuje - takže tentýž plugin ukazoval pod jedním popiskem dvě čísla. Nástěnka teď říká „Produkty ve WooCommerce, které se synchronizují“
* Změněno: Dva odstavce za sebou vyzývaly ke kontrole navrženého mapování daní; teď to říká jen jeden
* Opraveno: Se zaškrtnutou volbou „Přepsat zařazení do kategorií“ zůstala pod ní věta, že kategorie zůstanou beze změny, hned vedle věty, že budou přesunuty

= 0.9.44 =
* Opraveno: Zrušení importu během načítání skladu skončilo jen hláškou „Import zrušen uživatelem“, přestože běh už posunul značku synchronizace na okamžik, kdy začal číst. Produkty, na které nedošel, si nechají stará množství a žádná změna z pokladny je nesrovná - hláška to teď říká a odkáže na úplnou synchronizaci, která to spraví. Stejná věta se přidá i tehdy, když načítání skladu skončí chybou, která to sama nevysvětlí
* Opraveno: Porovnání skladu počítalo koncepty jako „Produkty pouze v Elementary POS“, takže majitel obchodu hledal produkt, který v obchodě je - je to jen koncept a koncepty se nesynchronizují, dokud se to nezapne. Teď mají v obou směrech vlastní řádek

= 0.9.43 =
* Opraveno: Vratka objednávky se zaškrtnutým „znovu naskladnit vrácené položky“ zvedla množství ve WooCommerce, ale Elementary POS se to nikdy nedozvědělo a nic to potom nespravilo - obě strany zůstaly rozejité, dokud někdo nespustil ruční synchronizaci. WooCommerce ohlašuje naskladnění z vratky vlastním hookem, který plugin neposlouchal, a ten obecný, na kterém visí, tuhle změnu vůbec nevidí. Sklad vrácený vratkou teď do pokladny dorazí stejnou cestou, jakou už chodil sklad ze stornované objednávky

= 0.9.42 =
* Opraveno: Pohyb skladu u produktu, který Elementary POS nevede, se uložil do fronty a zkoušel donekonečna. Každá změna skladu v obchodě totiž vrátila nedávno neúspěšné položky zpátky do fronty a posunula jim i časové razítko, takže čtyřiadvacetihodinový limit nikdy nevypršel a pokladna dostávala tutéž nezodpověditelnou otázku při každém prodeji. Pohyb, který Elementary POS rovnou odmítne - dané SKU nemá, nebo mu jednotka nic neříká - se teď zapíše jednou a dál se neopakuje, zatímco to, co selhalo kvůli nedostupné pokladně, se zkouší přesně jako dosud. Jedna věc, kterou je dobré vědět: pokud odmítnutí způsobil API klíč patřící k jinému účtu Elementary POS, spusťte po nápravě klíče ruční synchronizaci skladu - tyto pohyby se už samy nezopakují

= 0.9.41 =
* Opraveno: Prodej nebo naskladnění na pokladně se mohly ve WooCommerce započítat dvakrát. Elementary POS vydává skladové pohyby podle času a hranice, kterou k tomu používá, zabírá i tu sekundu, kterou sama vrátí - pohyb zaznamenaný ve stejné sekundě, ve které si o něj plugin řekne (a to je běžný stav, protože pokladna volá hned, jak se to stane), se proto vydá znovu i při dalším volání, přimíchaný do většího čísla, na kterém není nijak poznat, že se opakuje. Plugin teď po aplikaci pohybů načte, kolik pokladna u dotčených položek doopravdy má, a nastaví to - tím se spraví jak pohyb vydaný dvakrát, tak pohyb, který se nepropsal. Množství se zapíše jen tam, kde se produktu mezitím nikdo jiný nedotkl a kde obchod nemá vlastní pohyb ještě na cestě do pokladny, takže objednávka přijatá během té chvíle se nikdy nevrátí zpět

= 0.9.40 =
* Opraveno: Import přepisoval sklad i produktům, u kterých obchod sklad nepočítá - službám, poukazům, zboží na objednávku. Položka stojící v Elementary POS na nule je při každém importu přepnula na „není skladem“ a položka se skladem zase vrátila do prodeje tu, kterou jste záměrně stáhli. Takové produkty teď zůstávají přesně tak, jak jsou, stejně jako je už nechávaly automatická i ruční synchronizace, a import hlásí, kolika se vyhnul
* Opraveno: Ruční synchronizace z Elementary POS, které uprostřed došel čas, nechala část katalogu s novými množstvími, ale záznam o tom, kam až se dostala, ukazoval pořád na starou pozici - další automatická aktualizace tak ty pohyby přičetla podruhé. Ten záznam se teď zapisuje před prvním produktem a při vracení běhu zpět se vrátí s ním
* Opraveno: Obě ruční synchronizace skladu běžely bez zvýšeného časového a paměťového limitu, takže se ve větším obchodě mohly uprostřed zastavit úplně bez hlášky
* Opraveno: Stránka nastavení hlásila každou poruchu webhooku jako „neznámá chyba“, protože se zahazovalo vysvětlení z Elementary POS, a obchodu, který webhook nikdy neregistroval, tvrdila, že je stav neznámý, místo aby řekla, že zatím žádný není
* Opraveno: Chyba při načítání Přehledu skladu se vůbec nezobrazila - hláška se na obrazovku nikdy nedostala
* Opraveno: Neúspěšná dávka importu nechala stát příznak „import už běží“ na pět minut a odmítala každý další pokus
* Opraveno: Synchronizace skladu teď rovnou řekne, že nemůže proběhnout, když je ve WooCommerce vypnutá správa skladu pro celý obchod - dosud tiše přeskočila každý produkt a práci si zapsala jako hotovou

= 0.9.39 =
* Opraveno: Prodej na pokladně během načítání skladu při importu mohl být započítán dvakrát. Fáze načítání teď drží sklad obsazený po celou dobu svého běhu, místo aby ho mezi dávkami pouštěla, a značku dosažené synchronizace zapisuje před prvním produktem, ne až za posledním
* Opraveno: Import zrušený nebo přerušený během načítání skladu nechal část katalogu s množstvím z Elementary POS, ale bez záznamu, kam až se dostal. V obchodě, který nikdy nesynchronizoval, pak další automatická aktualizace přičetla celou historii skladových pohybů k tomu, co bylo právě zapsáno
* Opraveno: Druhý import spuštěný, zatímco první ještě načítal sklad, prošel a přebral prvnímu seznam produktů, se kterými pracoval
* Opraveno: Synchronizace skladu do Elementary POS používala čísla z okamžiku, kdy jste stiskli Načíst, ať už to bylo jakkoli dávno - prodej v mezičase se tak přepsal a prodej na pokladně se přeskočil a už se nikdy nedotáhl. Obě strany se teď načítají znovu ve chvíli, kdy synchronizaci potvrdíte
* Opraveno: Produkt, který existuje jen ve WooCommerce a ne v Elementary POS, se počítal jako chyba a natrvalo blokoval posun značky synchronizace - včetně první synchronizace, po které pak nešlo automatickou synchronizaci vůbec zapnout
* Opraveno: Změna skladu z Elementary POS, kterou nešlo zapsat k žádnému produktu - žádný produkt s tím SKU, nesledovaný sklad, neúspěšný zápis - zmizela beze stopy a už se znovu nenabídla. Dashboard teď ukazuje, co nedorazilo a proč, a úplná synchronizace z Elementary POS to vyprázdní
* Opraveno: Když se zpracování dávky skladových změn přerušilo uprostřed, opakovaný pokus už neměl co dělat a nahlásil úspěch - zbytek dávky se tiše ztratil
* Opraveno: Neúspěšný pokus zapnout automatickou synchronizaci přepsal tajemství, které pokladna už dostala, takže od té chvíle byla každá aktualizace z pokladny odmítnuta a synchronizace tiše odumřela
* Zabezpečení: Automatická synchronizace nastavená verzí starší než 0.9.19 nemá tajemství, které by ji chránilo, takže kdokoli mohl vyvolat aktualizaci skladu. Takový webhook se teď zpracuje nejvýš jednou za minutu, upozornění v administraci vás vyzve k vypnutí a opětovnému zapnutí synchronizace a po třiceti dnech jsou nezabezpečené požadavky odmítány
* Vylepšeno: Načítání skladu při importu už neprochází celou historii skladových pohybů zvlášť pro každý produkt, což je v obchodě s dlouhou historií podstatně rychlejší
* Vylepšeno: Doplněny chybějící české překlady - záložka Přehled skladu a hlášky importu už nejsou anglicky

= 0.9.38 =
* Opraveno: Zapnutí sledování skladu u produktu se zadaným množstvím poslalo celé to množství do Elementary POS, jako by zboží právě naskladnilo, a posunulo tím stav položky. Začít počítat není skladový pohyb, a množství, proti kterému není co porovnávat, se už neposílá vůbec
* Opraveno: Přehled skladu ukazoval u produktů s nesledovaným skladem nulu, jako by neměly nic; teď nechává údaj prázdný a uvádí důvod
* Opraveno: Přehled skladu označoval produkt za „není ve WooCommerce“, i když tam byl jako koncept a jen se nesynchronizoval

= 0.9.37 =
* Přidáno: Záložka Přehled skladu ukazuje vedle sebe, co má u každého produktu Elementary POS a co WooCommerce, s rozdílem a u produktů, které synchronizovat nelze, i s důvodem - chybí SKU, nesleduje se sklad, nebo jde o jinou jednotku než kusy. Lze filtrovat podle toho, co chcete vidět, a hledat podle názvu nebo SKU. Z této obrazovky se nic nemění
* Přidáno: Souhrny synchronizace odkazují do přehledu, takže se počty dají rozkliknout na konkrétní produkty
* Vylepšeno: Přehled si říká Elementary POS o aktuální stavy přímo, místo aby sčítal celou historii skladových pohybů, takže zůstává rychlý i v obchodě běžícím roky

= 0.9.36 =
* Opraveno: Synchronizace skladu do Elementary POS posílala nulu za každý produkt, u kterého obchod sklad nesleduje, a mazala tím stav služeb, poukazů a všeho ostatního s vypnutou správou skladu. Takové produkty se teď nechávají být a počítají se zvlášť
* Opraveno: Daň zahrnutá v ceně - u nás obvyklý způsob zadání DPH - nebyla rozpoznána jako procentní, takže se tyto sazby nikdy nespárovaly a musely se mapovat ručně v obou směrech. Tabulka mapování teď u sazby uvádí, o který z obou druhů jde
* Opraveno: Změna API klíče vypnula webhook na nově připojeném účtu místo na tom opouštěném, takže starý účet volal tento web dál
* Opraveno: Test API klíče klíč po dobu testu uložil do databáze, takže vypršení uprostřed testu nechalo uložený cizí klíč
* Opraveno: Export produktu při každém běhu přebarvil jeho barvu v Elementary POS; barva, kterou položka už má, se zachovává
* Opraveno: Druhý import byl odmítnut až poté, co zapsal svých prvních padesát produktů

= 0.9.35 =
* Opraveno: Import, obě ruční synchronizace i webhook měly každý vlastní zámek, takže se navzájem nevylučovaly - dva z nich mohly pracovat z různých snímků skladu a ten, který skončil později, tiše zrušil práci toho druhého. Teď sdílejí jediný zámek a střídají se
* Opraveno: Fáze načítání skladu při importu nedržela žádný zámek, přestože zapisuje množství celému katalogu
* Opraveno: Spuštění druhého importu během běžícího je odmítnuto s vysvětlením, místo aby se oba proplétaly
* Vylepšeno: Dlouhá úloha teď na zámek pár sekund počká, místo aby se vzdala, takže import už nepřeruší webhook, který zámek drží okamžik. Webhook, který se nedostane dovnitř, jde do fronty a zkusí to znovu, takže prodej za ním se neztratí

= 0.9.34 =
* Přidáno: Produkty, které by Elementary POS odmítlo kvůli už obsazenému názvu, se teď vypíšou ještě před spuštěním exportu, u každého s důvodem, takže lze názvy opravit místo toho, aby se produkty objevily jako chyby až potom
* Vylepšeno: Když Elementary POS produkt přesto odmítne, ukáže se u výsledku důvod, který uvedlo, místo holé „chyby 400“ schované v logu

= 0.9.33 =
* Opraveno: Změna SKU produktu a jeho skladu v jednom uložení poslala rozdíl skladu do Elementary POS pod novým SKU, přestože byl změřený proti starému - pokud to SKU patřilo jiné položce, změna přistála na jejím skladu. Takové uložení už neposílá nic a píše to do logu
* Opraveno: Seznam produktů čekajících na načtení skladu se mazal až po dokončení načítání, takže zrušený import ho nechal ležet a další běh do něj přidával
* Opraveno: Stránka nastavení hlásila poškozenou odpověď z Elementary POS ve chvíli, kdy prostě jen ještě nebyl zaregistrovaný žádný webhook - tedy ve stavu, ve kterém každá instalace začíná
* Odebráno: Vracení importu zpět, které natrvalo mazalo vše vytvořené v dávce. Protože se chybná položka přeskočí místo přerušení celého importu, nic už ho nevolalo

= 0.9.32 =
* Opraveno: Produkty stojící v Elementary POS na nule se do porovnání skladu vůbec nedostaly, protože Elementary POS eviduje sklad jako pohyby a položka, která se nikdy nepohnula, žádné nemá. Špatné množství v obchodě u takového produktu se nikdy nenahlásilo a žádná ruční synchronizace ho neopravila

= 0.9.31 =
* Opraveno: Náhled produktů s odlišnou kategorií přehlížel produkty zařazené do kategorie z Elementary POS plus vlastních kategorií. Přepsání ty další kategorie odebere, takže se teď vypisují mezi dotčenými produkty, místo aby se počítaly jako beze změny

= 0.9.30 =
* Opraveno: Jediná položka, kterou nešlo naimportovat, zastavila celý import a natrvalo smazala každý produkt vytvořený v té dávce. Stačily k tomu dvě položky Elementary POS sdílející jedno SKU. Taková položka se teď přeskočí a nahlásí a zbytek katalogu se naimportuje normálně
* Opraveno: Import z prázdného katalogu Elementary POS hlásil „Fáze 2 selhala“ místo prostého sdělení, že není co importovat
* Opraveno: Položka bez názvu už nezpůsobí PHP varování a produkt s prázdným titulkem; dostane náhradní název a řádek v logu

Starší záznamy jsou odstraněné, aby se changelog vešel do délky, kterou WordPress.org zobrazuje.

== Upozornění na aktualizaci ==

= 0.9.50 =
Sklad drží krok s pokladnou i ve třech dalších situacích, produkt prodávaný bez daně dorazí na pokladnu bez sazby a import jde spustit znovu hned po zrušení.

= 0.9.49 =
Zastaví situaci, kdy sklad varianty hýbal položkou pokladny patřící celému produktu, vynechá z exportu produkty s variantami, které tam dorazily za nulu, a přestane hlásit změnu jako provedenou, když se nic nepohnulo.

= 0.9.48 =
Opravuje tři způsoby, jak se mohl skladový pohyb ztratit mezi e-shopem a pokladnou, a upravuje několik tvrzení v popisu, která neodpovídala tomu, co plugin dělá.

= 0.9.47 =
Dotahuje požadavek na WooCommerce 9.1 zavedený v 0.9.46: plugin se na starším WooCommerce nově opravdu odmítne spustit, místo aby to jen deklaroval.

== Podpora ==

Pro podporu, prosím navštivte [https://elementarypos.com/en/contact/](https://elementarypos.com/en/contact/) nebo napište email na support@elementarypos.com

== Externí služby ==

Tento plugin se spoléhá na Elementary POS API, externí službu třetí strany, pro synchronizaci dat produktů a inventáře mezi vaším obchodem WooCommerce a systémem Elementary POS.

= Co je Elementary POS API a k čemu se používá? =

Elementary POS API je cloudová služba poskytovaná Elementary POS, která spravuje vaše pokladní data. Tento plugin se připojuje k API pro:
* Import produktů z Elementary POS do WooCommerce
* Obousměrnou synchronizaci úrovní zásob
* Odesílání aktualizací objednávek WooCommerce do Elementary POS
* Příjem notifikací o změnách zásob v reálném čase prostřednictvím webhooků

= Jaká data jsou odesílána a kdy? =

Plugin odesílá data do Elementary POS API v následujících situacích:

**Během importu produktů (Elementary POS → WooCommerce):**
* Žádná data se neodesílají - plugin si informace o produktech (SKU, název, cena, množství zásob) jen načítá

**Během exportu produktů (WooCommerce → Elementary POS):**
* Název produktu, SKU, cena, daň, barva a kategorie
* Zda je produkt publikovaný
* K tomu dochází, když spustíte import ve směru WooCommerce → Elementary POS

**Během synchronizace zásob (WooCommerce → Elementary POS):**
* SKU kódy produktů
* Změny množství zásob
* Časové razítko změn
* K tomu dochází, když ručně spustíte synchronizaci WC→EP, a pokaždé, když WooCommerce změní sklad produktu

**Během registrace webhooku:**
* URL vaší WordPress stránky
* URL endpointu webhooku
* K tomu dochází když povolíte automatickou synchronizaci v nastavení pluginu

**Co plugin přijímá z Elementary POS:**
* Informace o produktech (SKU, název, cena, zásoby)
* Notifikace o změnách zásob (SKU, delta množství)
* Informace o stavu webhooku

= Používané API endpointy =

* Produkce: `https://api.elementarypos.com`

Endpoint je pevně dán při sestavení pluginu. Verze zveřejněná zde vždy používá produkční endpoint uvedený výše; z vašeho API klíče se neodvozuje.

= Podmínky služby a soukromí =

* Zásady ochrany osobních údajů Elementary POS: [https://elementarypos.com/en/privacy-policy/](https://elementarypos.com/en/privacy-policy/)

**Důležité:** Pro použití tohoto pluginu musíte mít aktivní Elementary POS účet a API klíč. Používáním tohoto pluginu souhlasíte s podmínkami služby Elementary POS a berete na vědomí, že data budou přenášena na jejich API endpointy.

== Zásady ochrany osobních údajů ==

Tento plugin neshromažďuje ani neukládá osobní data uživatelů (jména, e-maily, adresy).

Plugin ukládá provozní data ve vaší databázi:
* Záznamy synchronizace (časová razítka, typy operací, SKU produktů)
* Data fronty pro opakované operace (ID produktu, SKU, množství a identifikátor požadavku - žádná data objednávky ani zákazníka)

Všechna data jsou ukládána lokálně ve vaší WordPress databázi. Žádná data nejsou odesílána třetím stranám kromě vašeho Elementary POS API endpointu pro účely synchronizace. Záznamy mohou být manuálně vymazány z nastavení pluginu.

Smazání pluginu vezme všechno s sebou: API klíč, veškerá nastavení, protokoly i to, co ještě čeká ve frontě, a cestou ven vypne webhook v Elementary POS. Pouhá deaktivace ne - vypněte a zapněte plugin a naváže tam, kde skončil. Instalace po smazání proto začíná od nuly a API klíč je potřeba zadat znovu.
