{
    "schema": "eupdate-package-specification-v1",
    "author": "PB <pavel.bartos.pb@gmail.com>",
    "project_id": "722cefc7e20e6bc9",
    "software_id": "isedu",
    "software": "isEDU",
    "module": null,
    "release_id": "f87190d34eab61c100b47ca93c992e05",
    "version": "0.2.0",
    "release_date": "2026-09-13",
    "published_at": "2026-09-13T16:44:07+00:00",
    "bytes": 95658,
    "sha256": "6b523b96eb7e6e0839885226aa3490e07988ff9f0678dee62c3c2ed2a38be5f4",
    "file_count": 108,
    "languages": {
        "PHP": {
            "bytes": 138507,
            "files": 18
        },
        "SQL": {
            "bytes": 19058,
            "files": 3
        },
        "CSS": {
            "bytes": 12787,
            "files": 3
        },
        "HTML": {
            "bytes": 7715,
            "files": 68
        }
    },
    "installation_url": "https://update.estudium.eu/package.php?software_id=isedu&version=0.2.0",
    "update_url": "https://update.estudium.eu/package.php?software_id=isedu",
    "install_json": {
        "software": "isEDU",
        "software_id": "isedu",
        "version": "0.2.0",
        "release_date": "2026-09-13",
        "author": {
            "name": "PB",
            "email": "pavel.bartos.pb@gmail.com",
            "website": ""
        },
        "description": {
            "cs": "Studijní evidence více škol, studenti, lektoři, programy, předměty a sylaby. Centrální přihlášení a MySQL přes eLoader.",
            "en": "Multi-school student information system with central eLoader authentication and MySQL."
        },
        "package": {
            "type": "release",
            "target": "eloader_app"
        },
        "requirements": {
            "php": ">=8.2 <9.0",
            "eloader": ">=1.16.0 <2.0"
        },
        "eloader": {
            "api": 1,
            "data_schema": 1,
            "entry": "app.php"
        },
        "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"
        },
        "project": {
            "website": ""
        },
        "homepage": "",
        "archive_metadata": {
            "working_directory": ".",
            "publisher": "dcf6d41fbcdf0e16",
            "updated_at": "2026-09-13T16:44:07+00:00",
            "application_author": "PB <pavel.bartos.pb@gmail.com>"
        }
    },
    "readme": "# isEDU 0.2.0\n\nAutor: PB · 13. 9. 2026\n\nPrvní provozní etapa studijního informačního systému pro více škol. Aplikace běží v eLoaderu, používá jeho společné knihovny `./lib/`, HTML šablony, přihlášení, MySQL spojení a centrální log. Dokumenty a testy patří do dalších samostatných aplikací.\n\n## Instalace\n\n1. Aktualizujte eLoader **1.15.0** na přiloženou **1.16.0**. Ta doplňuje přihlášení přímo z více aplikačních tabulek (`login.json`, schéma 2) a předání zvoleného vzhledu přes SDK. Funkce 1.15.0 zůstávají zachovány.\n2. V eLoaderu otevřete **Nastavení → Databázová připojení**. Založte povolený profil MariaDB/MySQL s hostem, portem, uživatelem a heslem. U profilu vyplňte existující databázi a použijte **Testovat spojení**. Heslo spravuje výhradně eLoader.\n3. V **Aplikace → ZIP** nahrajte `isedu-0.2.0.zip`, prohlédněte balíček a nainstalujte jej. Stejný ZIP lze publikovat jako projekt isEDU na eUpdate a instalovat z jeho odkazu.\n4. V **Databázová připojení → Přidělení aplikacím** vyberte isEDU, typ MySQL, vytvořený profil a jméno databáze.\n5. Otevřete isEDU jako superadmin. Zadejte název organizace a vytvořte tabulky. Vzniknou pouze tabulky `isedu_*` v přidělené MySQL.\n6. V **Školy** založte své tři školy. Nejsou dodána smyšlená jména ani omezení počtu škol.\n7. Volitelně spusťte **Import SQLite** podle postupu níže. Import se nespustí při instalaci, otevření aplikace, vložení souboru ani aktualizaci.\n8. V eLoaderu ve správě aplikací povolte isEDU jako zdroj přihlášení. E-mailové SSO pro další aplikace povolujte samostatně podle požadované důvěry. Nastavte doručování PINů v eLoaderu.\n9. Přidělte zaměstnancům role a lektorům programy, předměty nebo třídy. Účet bez takového přiřazení studenty neuvidí.\n\n## První rozsah\n\n- Více škol v jedné organizaci; oddělené rozsahy oprávnění zaměstnanců.\n- Studentské a lektorské profily nad společnou evidencí osob; přihlašovací údaje patří přímo profilům.\n- Více studií jedné osoby, vazba na konkrétní publikovanou verzi studijního plánu.\n- Programy, předměty, ECTS, EQF, zakončení, třídy a členství.\n- Verze studijních plánů: koncept lze upravovat, publikovaný plán je uzamčen. Kopie vytváří novou verzi.\n- Sylaby CZ/EN, cíle, výstupy, osnova, literatura, rozsah, historie verzí a publikování.\n- Seznamy, hledání, řazení, stránkování, formuláře, mobilní zobrazení.\n- Ruční import, centrální logy, instalace modulů a aktualizace z eUpdate i ZIPu.\n\n## Přihlašování a stav účtu\n\nKořenový **login.json** popisuje tabulky, sloupce a podmínky. MySQL čte eLoader; isEDU neimplementuje vlastní ověřování PINu nebo hesla. Přihlašovací identity mají tvar `student:<id studenta>` a `lecturer:<id lektora>`. `login.json` čte přímo tabulky `isedu_students` a `isedu_lecturers`, sloupce `login`, `login_email`, `login_phone`, `login_enabled`. Nevytváří se samostatná přihlašovací tabulka ani SQL pohled pro přihlášení. Lze hledat přihlašovacím jménem, e-mailem a původním ID; při nejednoznačném výsledku se přihlášení odmítne. Importované loginy mají tvar `s:<původní ID>` a `l:<původní ID>`.\n\n- Nový student: `pending`. Po ověření kontaktu PINem má přístup pouze k aktivaci. Stisknutím **Aktivovat můj účet** získá běžný přístup.\n- Aktivovaný student: `active`. Aktivní studium není podmínkou přístupu.\n- Absolvent: `graduated`. Nemá studentský přístup. Historie jeho dat zůstává zachována.\n- Blokovaný student: `blocked`. Nemá studentský přístup.\n- Lektor musí mít `active=1` a `login_enabled=1`. Vidí studenty přiřazeného programu, předmětu nebo třídy, vždy v příslušné škole.\n- Další zaměstnanecká nebo lektorská role téže osoby se posuzuje samostatně. Pro zákaz konkrétního přihlášení nastavte na příslušném profilu `login_enabled=0`; pro zákaz obou profilů zakažte oba. Neaktivovaný student nezíská běžný přístup pouhým přidělením další role. Aktivní lektorský profil téže osoby se posuzuje samostatně.\n- Stav **studia** `completed` neoznačuje automaticky celou osobu za absolventa; může mít souběžná studia. Celkový stav absolventa nastavuje studijní oddělení na kartě studenta.\n\nStudent upravuje vlastní jméno, tituly a kontaktní údaje. Přihlašovací e-mail a telefon pro PIN jsou oddělené od kontaktů a spravuje je administrátor. Student si nemůže změnit roli, aktivaci/absolvování ani studijní zařazení prostřednictvím editace profilu.\n\n## Ruční import\n\nSQLite vložte do `./import/` isEDU nebo nahrajte ve formuláři. Podporován je také trvalý adresář `private/app/isedu/import/` při standardním nasazení eLoaderu a soukromá složka `Context::dataPath()/import/`. Všechny tyto cesty mají zůstat mimo veřejný kořen hostingu. Preferujte trvalou složku; adresář konkrétního vydání může být při aktualizaci nahrazen.\n\n1. **Načíst a zkontrolovat**: ověří integritu a zobrazí počty zdrojových tabulek. Nic nezapisuje do MySQL.\n2. Přiřaďte každý program a třídu ke škole. Zvolte školu pro osoby bez studia i bez třídy. Zdroj nerozlišuje školy dostatečně jednoznačně, proto nejsou hádány z číselných rozsahů.\n3. Používejte stále stejný identifikátor zdroje, například `legacy-main`.\n4. Potvrďte přiřazení a stiskněte **Spustit import**. Import ověří i SHA-256 souboru proti náhledu a provede zápis v jedné MySQL transakci.\n5. Zkontrolujte souhrn a centrální události `isedu.import.*`.\n\nImport zachovává původní ID a mapuje je do nových vnitřních ID/UUID. Předměty zachovávají textové kódy. Zdroj je otevřen pouze pro čtení. Opakovaný import nevytváří duplicity a nepřepisuje nové editace; změněné původní řádky se hlásí jako konflikty. Jde o vložení/mapování dat, nikoli trvalou obousměrnou synchronizaci.\n\nChybějící rodičovský záznam se nevymýšlí. Řádek zůstane v importním archivu MySQL a nevyřešená vazba se zapíše do centrálního logu. Neznámý stav studia dostane `unmapped`, nikoli domyšlený běžný stav. Importovaný historický `students.active=1` je považován za již aktivovaný účet; stav 2 je absolvent a 9 blokovaný/stornovaný.\n\nImport nepřenáší staré PINy, API klíče ani implicitní administrátorská práva. Nepřenáší automaticky nejednoznačné přiřazení výuky z volného textu `lectors.teach`. Administrátor je nastaví v novém modelu. Data pro dokumentovou a testovou aplikaci zůstávají v původním souboru; odpovídající aplikace dostanou vlastní importní kroky.\n\n## Aktualizace a moduly\n\nSekce **Moduly a aktualizace** nabízí kontrolu uloženého zdroje isEDU, nový odkaz na eUpdate, modul z eUpdate a ruční ZIP. Operace přechází do instalačního náhledu eLoaderu, který kontroluje kompatibilitu a aktivuje vydání. isEDU samo nepřepisuje sdílené knihovny. Instalace je oprávnění superadmina eLoaderu.\n\nPříklad instalovatelného modulu je `examples/student-list-1.0.1.zip`. Je volitelný a ukazuje použití filtrovaného `ModuleApi`. Uživatel jej spouští v sekci **Doplňky**. Dokumentace je v `docs/MODULES.md`.\n\nKonfigurace isEDU obsahuje pouze lokální nastavení organizace, nikoli databázové heslo. MySQL data zůstávají ve společné DB. Před budoucí nekompatibilní migrací použijte konzistentní zálohu DB a kódu; návrat ZIPu nenahrazuje obnovu databáze. Verze 0.2.0 vytváří schéma 2 při ručním prvním zprovoznění. Migrace z 0.1.0 se spouští výslovně podle následujícího postupu.\n\n## Přechod z isEDU 0.1.0\n\n1. Aktualizujte eLoader z 1.15.0 na 1.16.0.\n2. Pokud používáte ukázkový modul Student List 1.0.0, nejprve nainstalujte jeho aktualizaci `examples/student-list-1.0.1.zip` z tohoto archivu. Podporuje isEDU 0.1.0 i 0.2.0. Starší modul má v manifestu omezení `<0.2.0`.\n3. Nainstalujte aktualizaci `isedu-0.2.0.zip` přes ZIP nebo eUpdate. Otevřete isEDU jako superadmin.\n4. Stiskněte **Zálohovat a aktualizovat databázi**. V soukromém `Context::dataPath()/backups/before-schema-2.sql` se uloží záloha původních tabulek. Při selhání zálohy se migrace nespustí.\n5. Přihlašovací údaje se přenesou do studentů/lektorů, přidělené role do `isedu_person_roles`, autorství sylabů do `author_person_id`. Staré tabulky `isedu_accounts` a `isedu_account_roles` se odstraní až po přenosu vazeb. Počet studentů, lektorů ani studií se nemění.\n6. Uživatelé se znovu přihlásí. Původní interní identity `u:*` se nepovažují za nové identity profilů. Preference eLoaderu uložené pod původním ID se automaticky nepřenášejí; uživatel může znovu zvolit svůj jazyk.\n\nÚčet bez studenta i lektora migraci zastaví, aby se neztratila jeho identita. Před přechodem mu přiřaďte správný profil. SQL kroky lze po přerušení zopakovat a původní záloha se nepřepisuje. V průběhu změny schématu aplikace běžné operace nepovolí. Návrat samotného aplikačního ZIPu na 0.1.0 nestačí; při návratu obnovte odpovídající SQL zálohu. Import původní SQLite je i nadále samostatná, pouze ručně spuštěná operace.\n\n## Instalační SQL a vzhledy\n\n- `sql/install.sql`: všech 20 tabulek MySQL/InnoDB, utf8mb4 a jejich vazby.\n- `sql/seed.sql`: vestavěné role, oprávnění a verze schématu. Spouští se po `install.sql`.\n- `sql/upgrade-0.1.0-0.2.0.sql`: převod existující databáze. Nikdy jej nespouštějte jako nový import dat. Při ručním spuštění SQL si nejprve vytvořte vlastní zálohu; automatická záloha je součástí tlačítka v aplikaci.\n\nSQL neobsahuje `CREATE DATABASE`, hesla ani názvy konkrétních škol. Běží v databázi přidělené přes eLoader.\n\nŠablony jsou ve složkách `html/academic-blue/`, `html/b-w/` a `html/ea/`. Každá má úplnou sadu HTML souborů a vlastní `app.css`. Academic Blue používá modré prvky, B/W světlou černobílou paletu a EA tmavě modrou se žlutými prvky, podle eLoaderu. Složka `templates/` se nepoužívá.\n\nisEDU přebírá vzhled z `Context::theme()` a jazyk z `Context::language()`. V sekci **Vzhled a jazyk** je aktuální nastavení; superadmin má odkaz na nastavení eLoaderu. Samostatná volba vzhledu v isEDU se neukládá. Překlady jsou v `lang/cz.json` a `lang/en.json` (stejné klíče). Kód jazyka `cs` odpovídá souboru `cz.json`; další jazyky eLoaderu mají v této verzi český fallback. Knihovny zůstávají společné v `./lib/` eLoaderu.\n\n## Logy\n\nisEDU nemá vlastní logovací databázi ani logové soubory. Události zapisuje přes `Context::log()` do CentralLogu eLoaderu. Zápis obsahuje zdroj aplikace, identitu aktéra, čas, událost, typ/ID dotčeného záznamu a názvy změněných polí. Rodná čísla, obsah sylabů, databázová hesla ani celé importované řádky se do logu nevkládají. Audit eviduje operaci a měněná pole, nikoli kompletní historii předchozích osobních hodnot.\n\nHledání, filtry, stránkování, retence a výmaz jsou v **eLoader → Diagnostika → CentralLog**. Uchování zpráv i aplikačních událostí je společné (1–3650 dní, výchozí 30). Události isEDU mají prefix `isedu.` a samostatně vyplněné ID aplikace. Konzistentní záloha centrálního SQLite patří k záloze privátních dat eLoaderu.\n\n## Technické požadavky\n\nPHP 8.2–8.x, rozšíření `pdo_mysql`, `pdo_sqlite`, `mbstring` a požadavky eLoaderu. SQL používá InnoDB, utf8mb4, připravené dotazy, cizí klíče a transakce. Ověřeno na PHP 8.3.6 a MariaDB 10.11.7. MySQL 8 je cílově kompatibilní, samostatný běh na serveru MySQL 8 nebyl proveden. Nepotřebuje Node.js ani Composer na produkčním serveru; knihovny dodává eLoader.\n\nPři připojování provozní databáze doporučujeme nejprve provést ruční import do testovací kopie a zkontrolovat přiřazení škol. Distribuční balíček neobsahuje osobní údaje ani původní SQLite.",
    "download_url": "https://update.estudium.eu/download.php?project=722cefc7e20e6bc9&release=f87190d34eab61c100b47ca93c992e05",
    "package_target": "eloader_app",
    "requirements": {
        "php": ">=8.2 <9.0",
        "eloader": ">=1.16.0 <2.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
}