{
    "schema": "eupdate-package-specification-v1",
    "author": "PB <pavel.bartos.pb@gmail.com>",
    "project_id": "722cefc7e20e6bc9",
    "software_id": "isedu",
    "software": "isEDU",
    "module": null,
    "release_id": "ad6aeccae26dc5cfeef24bb1a4e5eff0",
    "version": "0.3.4",
    "release_date": "2026-09-16",
    "published_at": "2026-09-15T20:33:49+00:00",
    "bytes": 245913,
    "sha256": "df389d1445275def31d8808638cd971cb20122527bfc3ac7add79b8d6da47b7e",
    "file_count": 178,
    "languages": {
        "PHP": {
            "bytes": 282654,
            "files": 43
        },
        "SQL": {
            "bytes": 70489,
            "files": 11
        },
        "Python": {
            "bytes": 46054,
            "files": 4
        },
        "HTML": {
            "bytes": 13382,
            "files": 80
        },
        "CSS": {
            "bytes": 10459,
            "files": 3
        },
        "JavaScript": {
            "bytes": 5987,
            "files": 2
        }
    },
    "installation_url": "https://update.estudium.eu/package.php?software_id=isedu&version=0.3.4",
    "update_url": "https://update.estudium.eu/package.php?software_id=isedu",
    "install_json": {
        "software": "isEDU",
        "software_id": "isedu",
        "version": "0.3.4",
        "release_date": "2026-09-16",
        "author": {
            "name": "PB",
            "email": "pavel.bartos.pb@gmail.com",
            "website": ""
        },
        "description": {
            "cs": "Společná evidence studentů a lektorů; původní SQLite tabulky v MySQL, instituce u programů, centrální služby eLoaderu.",
            "en": "Shared student and lecturer register; original SQLite table names in MySQL, program institutions and central eLoader services."
        },
        "package": {
            "type": "release",
            "target": "eloader_app"
        },
        "requirements": {
            "php": ">=8.2 <9.0",
            "eloader": ">=1.19.1 <2.0.0"
        },
        "eloader": {
            "api": 1,
            "data_schema": 1,
            "entry": "app.php",
            "database_tables": {
                "mysql": {
                    "prefix": "isedu_"
                }
            },
            "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"
        },
        "project": {
            "website": ""
        },
        "homepage": "",
        "archive_metadata": {
            "working_directory": ".",
            "publisher": "dcf6d41fbcdf0e16",
            "updated_at": "2026-09-15T20:33:49+00:00",
            "application_author": "PB <pavel.bartos.pb@gmail.com>"
        }
    },
    "readme": "# isEDU 0.3.4\n\n## Opravy v 0.3.4\n\nUpload SQLite i pokračování dávkového importu používají správnou adresu formuláře i při přítomnosti skrytého pole `action`. Průběh přenosu a ruční potvrzení zůstávají zachované. Po instalaci obou ZIPů znovu otevřete import; rozpracovanou úlohu lze otevřít v uložených importech.\n\neLoader 1.19.1 hledá ID studenta/lektora, e-mail či telefon ve všech pověřených zdrojích a při shodě nabídne jednotlivé účty. Přihlašovací formulář uvádí seznam prohledávaných aplikací. Nouzové heslo správce eLoaderu slouží pouze pro jeho účet; pro výběr studentského nebo lektorského účtu použijte hlavní formulář PINu. Pokud mezi zdroji chybí isEDU, povolte jeho přihlašování v nastavení nainstalované aplikace eLoaderu a ověřte přiřazení MySQL.\n\nSpolečná evidence studentů a lektorů v eLoaderu. MySQL schéma 5 přebírá původní názvy a sloupce SQLite s prefixem `isedu_`. Instituce uskutečňuje studijní program; studenti ani třídy se mezi instituce nerozdělují. Dokumenty a testy patří do dalších aplikací. `students_exams` se nevytváří ani neimportuje.\n\n## Instalace a aktualizace\n\nVyžaduje eLoader **1.19.1 nebo novější 1.x**, PHP 8.2–8.x, PDO MySQL/SQLite a mbstring. Ověřeno na PHP 8.3 a MariaDB 10.11. SQL používá syntaxi společnou s MySQL 8; samostatný běh na MySQL 8 nebyl v tomto prostředí ověřen.\n\nPři aktualizaci **z 0.3.2/0.3.3** se schéma 5 nemění. Stačí nejdříve aktualizovat eLoader a potom nainstalovat tento ZIP; žádný import není nutný.\n\n1. V eLoaderu nainstalujte ZIP isEDU nebo nastavte jeho zdroj v eUpdate. V **Nastavení → Databázová spojení** přidělte aplikaci spojení a databázi. Přístupové údaje k MySQL spravuje eLoader.\n\n2. Při nové instalaci otevřete isEDU jako superadmin, zadejte název organizace a potvrďte vytvoření tabulek. DDL a výchozí role jsou v `sql/install.sql` a `sql/seed.sql`. Nevytváří se databáze serveru ani ukázkoví studenti.\n3. Při aktualizaci **z 0.3.0/0.3.1** otevřete isEDU jako superadmin a zvolte **Doplnit ukládání průběhu importu**. Schéma 5 přidá `isedu_import_jobs`; z verze 0.3.0 nejprve doplní také údaje institucí. Zachová stávající data a neimportuje SQLite. DDL je v `sql/upgrade-0.3.1-0.3.2.sql`, starší doplnění institucí v `sql/upgrade-0.3.0-0.3.1.sql`. Pro přechod ze schématu 4 stačí běžná práva aplikace a CREATE.\n   Při aktualizaci **z 0.1.x/0.2.x** nejdříve vypněte nekompatibilní moduly (např. Student List 1.0.1). Zvolte **Zálohovat a aktualizovat databázi**; převod zachová současné úpravy, pořídí soukromý SQL soubor v `backups/` a původní tabulky ponechá jako `isedu_backup2_*`. Vyžaduje navíc DDL, LOCK TABLES a TRIGGER. Následně doplní aktuální schéma. Pouhá instalace ZIPu nepřevádí databázi. Podrobnosti: [SCHEMA.md](docs/SCHEMA.md).\n4. Instituce založte v **Nastavení → Instituce** a přiřaďte je jednotlivým programům včetně údaje o akreditaci. Počet institucí není omezen. Studenta lze založit ještě před institucemi, bez studia.\n5. U dříve importované databáze převod doplní chybějící pole z již uloženého archivu a zachová současné úpravy. Tabulky, které starší isEDU nikdy neimportovalo, doplníte novým **ručním** importem stejné SQLite se stejným identifikátorem zdroje.\n\nNespouštějte `install.sql` přes stávající schéma 1/2 jako náhradu převodu. Přechod 2 → 3 koordinuje `src/SchemaUpgrade.php`; `sql/schema-2.sql` slouží pouze k jeho inventáři. Přechod ze schématu 1 nejdříve používá `sql/upgrade-0.1.0-0.2.0.sql`.\n\n## Údaje institucí a místa vzdělávání\n\nV **Nastavení → Instituce** jsou IČO / identifikátor, RED IZO, IZO, strukturovaná adresa sídla, telefon, e-mail, web a logo. Identifikátory jsou textové, zachovávají úvodní nuly a jsou volitelné. Neprobíhá dotaz do rejstříku. Web zadávejte včetně `https://` nebo `http://`.\n\nPo uložení instituce lze přidávat samostatná místa vzdělávání: název, volitelné IZO, adresu, kontakty a příznak aktivity. Míst může být více; upravují se jednotlivě. Sídlo je oddělené od těchto adres. Instituce je stále přiřazena programu; studenti ani třídy nedostávají vlastní instituci.\n\nLogo nahrajete jako PNG, JPEG nebo WebP do **2 MiB**, nejvýše 4096 pixelů na stranu. Lze je vyměnit nebo odstranit. Obrázek se ukládá v MySQL spolu s údaji instituce, takže patří do její databázové zálohy. Čtení obrázku vyžaduje oprávněný přístup. Pro navazující modul smluv je připraveno `ModuleApi::institutionForProgram(programId)`; samotná tvorba smluv do tohoto vydání nepatří.\n\n## Evidence a přístupy\n\n- Student má všechna původní osobní a kontaktní pole přímo v `isedu_students`, včetně dvou adresních řádků, zákonného zástupce, země narození a fakturačních údajů. Jejich oprávněná úprava se projeví ve všech jeho studiích.\n- Lektor má původní pole přímo v `isedu_lectors`, včetně veřejného e-mailu, popisů, obrázku a interních údajů. Starý příznak `administrator` je jen historický údaj a nepřiděluje roli.\n- Studijní programy, plány, předměty, sylaby, třídy a jejich vazby zachovávají názvy ze SQLite. Plány a sylaby mají navíc verze, aby úprava nepřepsala publikovanou historii.\n- Poznámky, platby a závěrečné práce jsou na kartě studenta. Původní `students_logs` je dostupná pouze oprávněným správcům ke čtení; nové logy jsou výhradně v CentralLog.\n- Lektor vidí jen studenty přiřazeného programu, předmětu nebo třídy. Přiřazení předmětu může zahrnout programy různých institucí. Studijní oddělení lze omezit podle institucí programů; tím nevzniká vlastnictví studenta institucí. Společné třídy a lektory spravují celkové role.\n- Student upravuje vlastní osobní údaje. Přihlašovací údaje, aktivaci, úhrady a interní agendu mění oprávněný správce. Veřejná přihláška se souhlasy a automatickým cenovým procesem se tímto vydáním nezavádí; [audit registrace](docs/POLOZKY-0.3.0.md) rozlišuje její datová a procesní pole.\n\n## Přihlášení a společné služby\n\nKořenový `login.json` čte `isedu_students` a `isedu_lectors`; zvláštní tabulka přihlášení neexistuje. Student `active=0` nejdříve uvidí upozornění, že účet musí aktivovat. Samostatným tlačítkem **Pokračovat k aktivaci** si nechá poslat PIN, který zpřístupní pouze aktivaci; `active=1` má přístup i bez aktivního studia, absolvent `active=2` a ostatní stavy přístup nemají. Lektor musí mít `active=1`. U obou zdrojů se vyžaduje `login_enabled=1`. Kontaktní e-mail je oddělen od ověřovacího `login_email`.\n\nPřihlásit se lze pomocí vlastního ID, původního ID, loginu, `login_email` nebo `login_phone` (včetně mezer a závorek). Shodné hodnoty v eLoaderu, u studenta/lektora nebo v dalších povolených aplikacích otevřou seznam účtů. PIN patří vybrané identitě; aktivní student a lektor téže osoby mají samostatnou volbu a odpovídající roli. Výslovné role osoby, například studijní oddělení, se zachovávají. Neexistující účet oznámí neplatné údaje, neaktivní účet nutnost aktivace. Absolvent a blokovaný účet nemají možnost samoaktivace.\n\nSQLite se nahraje přes výběr souboru nebo přetažení a tlačítko **Načíst a zkontrolovat**. Ukazatel přenosu zobrazuje procenta a MiB, po 100 % se kontroluje databáze. Teprve následující náhled umožní ručně potvrdit import. Při chybě přenosu nebo serveru se formulář znovu odblokuje a ukáže chybu; opakování nahrání neprovádí import. Limit aplikace zůstává 200 MiB. Server potřebuje prostor i pro multipart obálku, viz [UPLOAD-200MB.md](docs/UPLOAD-200MB.md).\n\n\neLoader zajišťuje přihlášení, přidělení MySQL, CentralLog, maily/SMS a další spárované komunikační brány, workspace, menu/submenu, hlavičku a patičku. Obsah používá `html/academic-blue`, `html/b-w`, `html/ea` a katalogy `lang/cz.json`, `lang/en.json`; nastavení vzhledu a systémové kolečko v menu přebírá z eLoaderu. Sdílené knihovny se nebalí do aplikace.\n\nModuly a aktualizace vyřizuje centrální správce balíčků eLoaderu. Manifest deklaruje prefix `isedu_` pro jeho odinstalaci, včetně záložních tabulek této aplikace. Budoucí aplikace pro testy potřebuje vlastní prefix a oprávnění. Ukázkový modul Student List 1.1.0 je v `examples/student-list/`; [rozhraní modulů](docs/MODULES.md).\n\n## Ruční import SQLite\n\n1. Otevřete **Nastavení → Import SQLite**. Vyberte soubor z privátního `import/`, nebo jej přetáhněte/vyberte ve formuláři. Samotné vložení ani přetažení import nespustí.\n2. Zvolte **Načíst a zkontrolovat**. Náhled ukáže počty, chybějící volitelné tabulky a nevyřešené vazby.\n3. Přiřaďte **pouze programy** k institucím. Při opakování zachovejte identifikátor původního zdroje, aby platilo mapování existujících záznamů. Zkontrolujte údaje, zaškrtněte potvrzení přiřazení a zvolte **Spustit import**. Náhled platí 60 minut v přihlášené relaci; každý má vlastní adresu a token, takže otevření dalšího náhledu předchozí nepřepíše. Chybějící potvrzení zachová zvolený zdroj i instituce.\n4. Potvrzení založí uložený import a otevře stránku průběhu. Prohlížeč posílá krátké požadavky, nejvýše 100 řádků na dávku s cílovou dobou zpracování 2 sekundy. Zobrazuje počty a aktuální tabulku. Každá dávka ukládá data, mapování i stav postupu v jedné transakci. **Při chybě se vrátí pouze aktuální dávka; předchozí dokončené části zůstanou dostupné.**\n5. Tlačítko **Pozastavit** zastaví další dávky; právě běžící dávka se dokončí. Po zavření stránky se další dávky neposílají. V **Nastavení → Import SQLite → Uložené importy** import znovu otevřete a zvolte **Pokračovat v importu**. Postup přežije nové přihlášení stejného oprávněného účtu. Nezávisí na hodinové platnosti původního náhledu. Bez JavaScriptu tlačítko provede vždy jednu dávku.\n6. Opakovaný požadavek stejné dávky nezpůsobí dvojí zápis. Opakovaný stejný zdroj nepřepisuje současné úpravy a zachová mapování. Změněné zdrojové záznamy hlásí jako konflikt. Původní chybná vazba se uchová a označí `_import_valid=0`, aby nerozšířila přístup. Nový identifikátor zdroje znamená nové mapování, nikoli aktualizaci starého. Zdroj se před každou dávkou kontroluje a otevírá pouze pro čtení.\n\n**Po chybě 504 ve starší verzi:** samotná chybová stránka nepotvrzuje, zda PHP zápis dokončilo. Po aktualizaci načtěte nový náhled původního souboru a použijte **stejný identifikátor zdroje**. Již potvrzené záznamy se díky mapování přeskočí. Průběh starého jednorázového importu nelze zpětně obnovit po dávkách; trvalý stav vzniká až ve verzi 0.3.2. Pokud starý import ještě drží zápisový zámek, aplikace další zapisující operaci odmítne, dokud neskončí.\n\nDávky nemění časové limity Nginxu/PHP-FPM. Mimořádně pomalá nebo nedostupná databáze může způsobit selhání i jednotlivého požadavku; v takovém případě lze po odstranění příčiny pokračovat. Podrobnosti: [IMPORT-504.md](docs/IMPORT-504.md).\n\nLimit souboru je **200 MiB (209 715 200 bajtů)**. Pro celý multipart požadavek je potřeba rezerva: PHP `upload_max_filesize=200M`, PHP POST a Nginx alespoň `210M` / `210m`. Absolutní cesta s read-only příznakem PDO funguje i při `open_basedir`. [Postup konfigurace uploadu](docs/UPLOAD-200MB.md). Instalace aplikace nemění Nginx ani PHP-FPM na hostingu.\n\nDistribuce neobsahuje skutečná osobní data, SQLite ani produkční hesla. Ověření popisují `tests/README.md` a výsledky 0.3.2. Produkční nasazení nebylo provedeno.",
    "download_url": "https://update.estudium.eu/download.php?project=722cefc7e20e6bc9&release=ad6aeccae26dc5cfeef24bb1a4e5eff0",
    "package_target": "eloader_app",
    "requirements": {
        "php": ">=8.2 <9.0",
        "eloader": ">=1.19.1 <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
}