{
    "schema": "eupdate-package-specification-v1",
    "author": "PB <pavel.bartos.pb@gmail.com>",
    "project_id": "fd1ee17a987b0806",
    "software_id": "epersonal",
    "software": "ePersonal",
    "module": null,
    "release_id": "1954d3c606017315e43f64e67b4a38e7",
    "version": "0.2.0",
    "release_date": "2026-09-17",
    "published_at": "2026-09-17T18:09:16+00:00",
    "bytes": 118172,
    "sha256": "89bea79a24ecfe1485d0ba1059bda56db5ff730c3233d91889fa2f276586825f",
    "file_count": 49,
    "languages": {
        "PHP": {
            "bytes": 179726,
            "files": 22
        },
        "SQL": {
            "bytes": 14543,
            "files": 3
        },
        "CSS": {
            "bytes": 13430,
            "files": 1
        },
        "JavaScript": {
            "bytes": 8233,
            "files": 1
        },
        "Python": {
            "bytes": 2724,
            "files": 1
        }
    },
    "installation_url": "https://update.estudium.eu/package.php?software_id=epersonal&version=0.2.0",
    "update_url": "https://update.estudium.eu/package.php?software_id=epersonal",
    "install_json": {
        "software": "ePersonal",
        "software_id": "epersonal",
        "version": "0.2.0",
        "release_date": "2026-09-17",
        "author": {
            "name": "PB",
            "email": "pavel.bartos.pb@gmail.com",
            "website": ""
        },
        "description": {
            "cs": "Personalistika, číselníky, EQF a přidávání z isEDU s obousměrnou synchronizací.",
            "en": "HR records, codebooks, EQF and linked imports from isEDU with two-way synchronization."
        },
        "package": {
            "type": "release",
            "target": "eloader_app"
        },
        "requirements": {
            "php": ">=8.2 <9.0",
            "eloader": ">=1.16.0 <2.0.0"
        },
        "eloader": {
            "api": 1,
            "data_schema": 1,
            "entry": "app.php",
            "database_tables": {
                "mysql": {
                    "prefix": "epersonal_"
                }
            },
            "shared_shell": 1
        },
        "installation": {
            "web_root": ".",
            "commands": {
                "linux": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "windows": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "macos": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "other": {
                    "command": null,
                    "supported": false,
                    "mode": "unsupported"
                },
                "source": {
                    "command": null,
                    "supported": false,
                    "mode": "manual"
                }
            }
        },
        "license": "custom",
        "license_custom": "Copyright (c) 2026 PB. All rights reserved.",
        "compatibility": {
            "os_types": [
                "source"
            ],
            "os_versions": [],
            "distribution_ids": [],
            "distributions": [],
            "native_windows_supported": false,
            "native_macos_supported": false,
            "any_linux_distribution": false
        },
        "documentation": {
            "readme": "README.md"
        },
        "epersonal": {
            "access": "eloader_superadmin",
            "isedu_schema": 5,
            "isedu_reference_version": "0.3.12",
            "synchronization": "same_assigned_mysql_database",
            "photo_max_upload_bytes": 5242880,
            "database_schema": 2,
            "isedu_immediate_sync_version": "0.3.12"
        },
        "project": {
            "website": ""
        },
        "homepage": "",
        "archive_metadata": {
            "working_directory": ".",
            "publisher": "dcf6d41fbcdf0e16",
            "updated_at": "2026-09-17T18:09:16+00:00",
            "application_author": "PB <pavel.bartos.pb@gmail.com>"
        }
    },
    "readme": "# ePersonal 0.2.0\n\nAktualizace personalistiky pro eLoader / eUpdate, 17. 9. 2026. Současně je připraven balíček **isEDU 0.3.12** s událostmi pro okamžitou synchronizaci po uložení. Bez tohoto doprovodného updatu funguje příjem z isEDU nadále přes cron nebo ruční synchronizaci.\n\nBalíček neobsahuje zaměstnance, přihlašovací údaje ani šifrovací klíč. Přístup má pouze superadmin eLoaderu. Samotné založení nebo spárování zaměstnanci nezakládá přihlášení. Nejde o mzdový systém.\n\n## Instalace a aktualizace\n\n1. Zálohujte databázi obou aplikací a privátní adresář ePersonal s původním `epersonal.key`. Při aktualizaci dočasně pozastavte synchronizaci a cron.\n2. Na eUpdate publikujte `epersonal-0.2.0.zip` jako verzi **0.2.0** projektu **epersonal**. Cíl manifestu je `eloader_app`; `install.json` musí zůstat v kořeni ZIPu. Stejný ZIP lze nahrát ručně v eLoaderu.\n3. V eLoaderu aktualizujte ePersonal. Otevřete aplikaci jako superadmin a potvrďte vytvoření / aktualizaci tabulek. Databázové schéma 1 se rozšíří na **2** o číselníky a frontu změn; existující data a klíč se nemažou. U nové instalace přidělte MySQL spojení.\n4. Publikujte `isedu-0.3.12.zip` do projektu **isedu** a aktualizujte tuto aplikaci stejným způsobem. Je to celý instalační balíček navazující na **0.3.11**, nikoli záloha databáze. Databázové schéma isEDU zůstává 5. Nepřepisujte jím případné novější vlastní změny bez porovnání.\n5. Obě aplikace musí používat **stejnou skutečnou MySQL databázi**, nejen podobný název spojení. Znovu povolte synchronizaci, nastavte cron a vyzkoušejte obě strany na testovací osobě.\n\nPublikování na eUpdate ani nasazení na server nebylo z tohoto prostředí provedeno. Nejprve ověřte balíčky na testovací instalaci podle `docs/OVERENI.md`.\n\n## Číselníky a formuláře\n\n| Číselník | Obsah vydání |\n| --- | --- |\n| Zdravotní pojišťovny | 111 VZP, 201 VoZP, 205 ČPZP, 207 OZP, 209 ZPŠ, 211 ZP MV ČR, 213 RBP. Našeptávání podle kódu, zkratky i názvu; kód doplní název. |\n| Země | 250 zemí a území: 249 ISO položek a rozšíření XK podle CZEM. České krátké názvy, anglické aliasy, alpha-2/alpha-3 a číselné kódy tam, kde jsou přidělené. XK se nevydává za oficiálně přidělený ISO kód. |\n| Tituly | 69 výchozích českých, historických a vybraných zahraničních zkratek. Rozlišení před/za jménem, postupné vložení více titulů. Nejde o vyčerpávající seznam všech titulů světa ani o ověření oprávnění je užívat. |\n| EQF | Úrovně 1–8, neznámá hodnota je prázdná. Samostatně se zadává nejvyšší dosažené vzdělání a upřesnění/obor. EQF se neodvozuje automaticky z titulů. |\n| Vzdělání | 11 aplikačních kategorií; nejde o samostatný oficiální statistický číselník vzdělání. |\n| Pracovní pozice | CZ-ISCO, pětimístný kód a název. Vlastní interní název pozice zůstává samostatně. Součástí ZIPu je **162 ověřených položek**, nikoli kompletní CZ-ISCO. |\n\n### Načtení celého CZ-ISCO\n\nV menu **Číselníky → Pracovní pozice CZ-ISCO** potvrďte stažení celého oficiálního číselníku. Aplikace stahuje pouze pevně určený HTTPS export ČSÚ, validuje strukturu a uloží data do databáze. Základ odpovídá CZ-ISCO **1.9, od 1. 2. 2026**, včetně 23596 Sociální pedagogové.\n\nPři blokovaném odchozím internetu je možné v téže sekci nahrát kompletní HTML výpis ČSÚ (max. 4 MB). Malý nebo neúplný výpis aplikace odmítne. Neúspěšný import nepřepíše dosavadní číselník. Dokud není kompletní import hotový, rozhraní viditelně upozorňuje na základní sadu. Živé stažení z PHP nebylo v tomto prostředí kvůli síti ověřeno; parser byl ověřen strukturálními testy.\n\nČíselníky lze rozšířit, upravit aliasy/názvy nebo položku deaktivovat. Vlastní změny jsou v databázi a update aplikace je nepřepisuje. Deaktivace neodstraní dříve uloženou hodnotu zaměstnance. Hledání číselníků je lokální, bez odesílání osobních dotazů cizí službě.\n\n## Přidání a párování z isEDU\n\nPoužijte **Přidat z isEDU / Z isEDU**. Vyhledejte studenta, lektora nebo obě role dohromady. Hledá se v běžných osobních polích: jména, tituly, ID, UUID, e-maily, telefony, adresa, PSČ, obec, země, datum/místo narození, rodné číslo a další dostupné osobní údaje. Lze kombinovat více slov. Hesla, PIN, autentizační a API klíče jsou z vyhledávání vyloučeny. Nejde o prohledávání všech tabulek celého informačního systému.\n\nVýsledky jsou stránkované po 50. Osobní vyhledávací dotaz jde přes POST s CSRF, nikoli do URL a historie prohlížeče. Před importem se zobrazí náhled a výběr sdílených polí. Po potvrzení se **zaměstnanec a vazba vytvoří v jedné transakci**. Selhání párování nezanechá nového nespárovaného zaměstnance.\n\nU již existujícího zaměstnance použijte jeho záložku **isEDU** se stejným hledáním. Opakované přidání stejné role nevytvoří duplicitu; při stejném isEDU UUID lze připojit i druhou roli k téže osobě. Dva odlišné záznamy bez společného UUID se neslučují jen podle shodného jména.\n\nVazba používá nejen číslo studenta/lektora, ale i stabilní UUID. Přečíslování proto nenaváže zaměstnance na cizí osobu se znovu použitým ID.\n\n### Sdílená pole a EQF\n\nStudent: jméno, příjmení, tituly, hlavní a záložní e-mail, hlavní telefon, narození, rodné číslo, adresa a nově **`eqf` ↔ `eqf_level`**, pokud pole existuje. Lektor: jméno, příjmení, tituly, hlavní e-mail a telefon. Ostatní pole se nesynchronizují jen podle podobnosti názvu. Výběr potvrdí správce; neplatné staré hodnoty lze z párování vynechat.\n\n**Staré vazby z 0.1.0 zachovávají původní výběr polí.** Pro doplnění EQF do staré vazby ji odpojte a znovu spárujte se zaškrtnutým EQF. Odpojení nemaže žádnou osobu ani její data. Nové párování nabídne všechna platná společná pole.\n\n## Automatické změny a mazání\n\nPo uložení v ePersonal se synchronizují jeho vazby. **isEDU 0.3.12** při uložení studenta, lektora nebo osobního profilu zařadí událost do trvalé fronty ve stejné transakci a po potvrzení transakce spustí synchronizaci. Není nutné mít otevřenou personalistiku. Chyba následné synchronizace neodvolá již potvrzenou editaci isEDU; fronta zůstane pro opakování. Selhání samotného zařazení události naopak vrací celou transakci.\n\nJednostranná neproblematická změna se přenese oběma směry. Dvě rozdílné změny téhož pole nebo požadavek na vymazání vyplněné hodnoty vyžadují rozhodnutí v porovnání. **Prázdná hodnota automaticky nemaže vyplněnou.** Další kontakty se nezahazují. Dvě role jedné osoby se zpracují ve dvou průchodech pro přenos na obě role.\n\n**Smazání je bez kaskády do druhé aplikace:** odstranění zaměstnance smaže jen jeho kartu/podřízené záznamy v ePersonal a vazby. Student a lektor v isEDU zůstanou. Smazání studenta standardním formulářem isEDU odstraní jen příslušnou vazbu; zaměstnanec zůstane. Zmizení protějšku mimo podporovaný formulář rozpozná další synchronizace a odpojí ho. Při aktivním importu nebo chybném schématu se odpojení neprovádí jen na základě chyby dotazu.\n\nNesdílejí se hesla, PIN, přihlašovací kontakty (`login_email`, `login_phone`), oprávnění, aktivace, stav studia, pracovní stav, bankovní účty, pojišťovna nebo fotografie. Aktivní isEDU import synchronizaci dočasně blokuje; před ručními SQL importy ji pozastavte sami.\n\n## Cron jako záloha okamžité synchronizace\n\nCron doporučujeme i s isEDU 0.3.12: opakuje neúspěšné pokusy a zachytí změny mimo standardní formuláře. Pro přímé SQL zápisy, hromadné importy a jiné externí nástroje není slibován okamžitý push. Ruční synchronizace a kontrola otevřené stránky po 60 sekundách zůstávají dostupné.\n\nZkopírujte `bin/sync-runner.php` do stabilního privátního umístění mimo verzovaný adresář aplikace, např. `/ABSOLUTNI/PRIVATE/epersonal-sync.php`. Launcher si při každém spuštění vyhledá aktuální aktivní ePersonal přes eLoader. Není nutné do cronu zadávat adresář konkrétní verze.\n\n```cron\n* * * * * /usr/bin/php /ABSOLUTNI/PRIVATE/epersonal-sync.php --eloader=/ABSOLUTNI/ELOADER --limit=100 --budget=45\n```\n\nZástupné absolutní cesty nahraďte skutečnými. `--eloader` ukazuje na stabilní kořen eLoaderu obsahující `bootstrap.php`. Spouštějte pod systémovým účtem, který smí číst konfiguraci a klíč eLoaderu/ePersonal. Používá-li hosting vlastní `ELOADER_DATA`, nastavte tutéž hodnotu i pro cron. Nejprve spusťte příkaz ručně a ověřte výstup.\n\nDávka má omezený počet a časový rozpočet. Rozpočet se kontroluje mezi operacemi, není tvrdým přerušením databázového dotazu.\n\n## Ochrana dat a zálohy\n\nPrivátní osobní pole, celé bankovní účty, fotografie a stav porovnání se ukládají autentizovaně šifrované pomocí Sodium XChaCha20-Poly1305. **Ne všechny údaje jsou šifrované:** základní jména, kontakty, pracovní označení, strukturované CV a publikační údaje jsou uloženy pro běžné vyhledávání/zobrazení. Šifrování nechrání před správcem, který má současně klíč i databázi.\n\nKlíč `epersonal.key` vzniká v privátním `Context::dataPath()` s oprávněním 0600. **Zálohujte databázi i původní klíč.** Samotný SQL dump nestačí. Ztracený nebo jiný klíč aplikace nenahradí novým nad existujícími daty. Při chybě klíče obnovte jeho odpovídající originál a nic nemažte jen proto, aby zmizela hláška. Funkce pravidelné rotace klíče zatím není součástí verze.\n\n**Důležité pro rodné číslo:** zvolíte-li jeho synchronizaci do isEDU, cílové `isedu_students.rc` použije dosavadní uložiště isEDU, které tento adaptér nepřevádí na šifrované. Šifrování v ePersonal tedy automaticky nešifruje kopii v isEDU. Bez potřeby toto pole ke sdílení nevybírejte.\n\nRodné číslo a bankovní účet jsou v běžném přehledu maskované; plné hodnoty vidí superadmin v editaci a vybrané osobní hodnoty v synchronizačním porovnání. Audit zaznamenává událost, identifikátor osoby, správce, názvy polí a chybový kód, ne původní/nové osobní hodnoty. Audit s identifikátorem přežije odstranění karty; jeho retenční pravidla musí zajistit provozovatel. Ve verzi není automatická retenční politika ani role personalisty oddělená od superadmina.\n\nPřed obnovou, aktualizací schématu nebo přesunem databáze pozastavte synchronizaci a cron. Uchovávejte konzistentní zálohu ePersonal i isEDU a jeho vazeb. Návrat ke staršímu ZIPu sám nevrací již synchronizované osobní údaje. Odinstalace s výmazem tabulek může trvale odstranit obsah; nejprve ověřte obnovitelnou zálohu.\n\n## Požadavky a zachované funkce\n\nPHP 8.2–8.x: PDO MySQL, Sodium, Fileinfo, GD, Mbstring a Iconv. Pro automatické stažení CZ-ISCO musí fungovat ověřené odchozí HTTPS přes cURL nebo URL streams. Pro upload oficiálního HTML není odchozí síť nutná. Web a cron musí používat správnou konfiguraci a rozšíření PHP.\n\nePersonal: eLoader `>=1.16.0 <2.0.0`; doprovodné isEDU: `>=1.21.0 <2.0.0` a jeho dosavadní knihovny. MySQL/MariaDB s InnoDB, utf8mb4, transakcemi a pojmenovanými zámky. Nativní MySQL/MariaDB nebylo zde k dispozici pro ověření. Vyžadováno HTTPS a zapisovatelný privátní `Context::dataPath()`; za proxy nastavte důvěryhodný příznak HTTPS na serveru.\n\nDatabázová oprávnění: běžné SELECT/INSERT/UPDATE/DELETE nad `epersonal_*`, CREATE pro upgrade, SELECT a aktualizace mapovaných polí isEDU. isEDU bridge potřebuje přístup také k `epersonal_*` a jeho privátnímu klíči. Nepoužívejte kvůli tomu zbytečně globální oprávnění databáze.\n\nZůstává evidence více e-mailů/telefonů a bankovních účtů, kontrola IBAN a převod českého formátu, formulářový životopis, díla/publikace, fotografie JPEG/PNG/WebP do 5 MiB a tiskové HTML životopisu. Není přidán upload souborových příloh CV/děl ani serverový PDF export.\n\n## Testy a zdroje\n\nAktuální výsledky a jejich omezení: `docs/OVERENI.md`. Technické mapování: `docs/ARCHITEKTURA.md`. Zdrojové adresy číselníků a jejich omezení: `docs/CISELNIKY.md`.\n\n```sh\nphp tests/run.php\nphp tests/features-0.2.php\nphp tests/migration-0.1.php\nEPERSONAL_ISEDU_SOURCE=/ABSOLUTNI/isedu-0.3.12 php tests/isedu-hook.php\n```\n\nSady features a isedu-hook zahrnují i předchozí testy; sčítat opakovaně vypsané kontroly by nadhodnotilo výsledek. Bez MySQL se použije Python 3 / SQLite testovací bridge. Volitelné `EPERSONAL_TEST_DSN`, `EPERSONAL_TEST_USER`, `EPERSONAL_TEST_PASSWORD` používejte jen nad prázdnou vyhrazenou databází `epersonal_test_*`, nikdy nad provozními daty. Migrační sada používá testovací bridge samostatně.",
    "download_url": "https://update.estudium.eu/download.php?project=fd1ee17a987b0806&release=1954d3c606017315e43f64e67b4a38e7",
    "package_target": "eloader_app",
    "requirements": {
        "php": ">=8.2 <9.0",
        "eloader": ">=1.16.0 <2.0.0"
    },
    "license": {
        "id": "custom",
        "name": "Vlastní",
        "custom_text": "Copyright (c) 2026 PB. All rights reserved."
    },
    "deployment": {
        "archive_root": ".",
        "web_root": "."
    },
    "project_type": "application",
    "hosting": null
}