{
    "schema": "eupdate-package-specification-v1",
    "author": "PB <pavel.bartos.pb@gmail.com>",
    "project_id": "de61c5e7d8d5a0c7",
    "software_id": "ereal",
    "software": "eReal",
    "module": null,
    "release_id": "b91f06028c30b4f54c2290b364d4a6a5",
    "version": "0.1.0-alpha.6",
    "release_date": "2026-11-08",
    "published_at": "2026-11-08T22:37:21+00:00",
    "bytes": 1125392,
    "sha256": "470d884e3186cb9fb056a3d6f4a8de283c1bedfa902e8432a284707d3b70410d",
    "file_count": 197,
    "languages": {
        "PHP": {
            "bytes": 839533,
            "files": 136
        },
        "JavaScript": {
            "bytes": 117710,
            "files": 3
        },
        "CSS": {
            "bytes": 33611,
            "files": 1
        },
        "Python": {
            "bytes": 25192,
            "files": 4
        },
        "HTML": {
            "bytes": 1502,
            "files": 3
        }
    },
    "installation_url": "https://update.estudium.eu/package.php?software_id=ereal&version=0.1.0-alpha.6",
    "update_url": "https://update.estudium.eu/package.php?software_id=ereal",
    "install_json": {
        "schema": "ereal-package-v1",
        "software": "eReal",
        "software_id": "ereal",
        "version": "0.1.0-alpha.6",
        "release_date": "2026-11-08",
        "description": {
            "cs": "Správa nemovitostí pro eWeb: 116 polí, makléři a galerie, automatický příjem Realmanu s rozšířením číselníků a stažením fotografií, monitoring soukromých inzerátů s kontakty, veřejný export aktivních nabídek a ZIP jednotlivé nemovitosti, drag/drop, PHPMailer SMTP a BulkGate SMS s více odesílateli. Check-in eUpdate, aktualizace aplikace i Composeru a úplné zálohy. Alpha.5 opravuje výběr PHP CLI a předání php.ini při aktualizacích, přidává nastavení cesty PHP a podrobnou diagnostiku kontroly. Alpha.6: seskupené menu s ikonami a jedinou otevřenou sekcí, opravené fotografie náhledů, API aktivních nabídek pod výpisem, import videí z Realmanu, sedmisegmentový ukazatel posunu a třísekundová obrazovka po přihlášení ve stylu eSite.",
            "en": "Property management for eWeb: automatic Realman imports with observed catalogs and local photos, contactable private listings, offer feeds and per-property ZIP, drag/drop, PHPMailer SMTP, multiple BulkGate SMS senders, eUpdate and backups. Alpha.5 fixes PHP CLI/config selection and adds private validation diagnostics. Alpha.6: grouped navigation, corrected photo previews, persistent active offer API link, Realman video import, page scroll indicator and eSite-style three-second login transition."
        },
        "author": {
            "name": "PhDr. Pavel Bartoš, LL.M., DBA.",
            "email": "pavel.bartos.pb@gmail.com",
            "website": "https://www.bartos.online"
        },
        "homepage": "https://www.bartos.online",
        "license": "custom",
        "license_custom": "Licenci aplikace stanoví vlastník projektu eReal. pavel852/php-templates a pavel852/latex: MIT. PHPMailer: LGPL-2.1-only.",
        "package": {
            "type": "release",
            "target": "hosting",
            "access": "open",
            "requires_license": false
        },
        "compatibility": {
            "os_types": [
                "source"
            ],
            "os_versions": [],
            "distribution_ids": [],
            "distributions": [],
            "native_windows_supported": false,
            "native_macos_supported": false,
            "any_linux_distribution": false
        },
        "requirements": {
            "php": ">=8.1 <9.0"
        },
        "archive_metadata": {
            "working_directory": ".",
            "publisher": "dcf6d41fbcdf0e16",
            "updated_at": "2026-11-08T22:37:21+00:00",
            "application_author": "PB <pavel.bartos.pb@gmail.com>"
        },
        "documentation": {
            "readme": "README.md"
        },
        "installation": {
            "web_root": "public",
            "instructions": "Nainstalujte přes eWeb a otevřete /admin. Výchozí přihlášení nové instalace admin/admin. Existující účty a hesla se zachovají. Data jsou v private/ereal/shared. Údržba běží přes FPM nebo samostatný cron.",
            "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"
                }
            }
        },
        "runtime": {
            "php_extensions": [
                "json",
                "mbstring",
                "fileinfo",
                "curl",
                "dom",
                "zip",
                "ctype"
            ],
            "data_format": "json",
            "document_root": "public",
            "optional_extensions": [
                "gd"
            ]
        },
        "ereal": {
            "data_schema": 1,
            "persistent_paths": [
                "private/ereal/shared"
            ],
            "deployment": "single-writer-node",
            "default_password": "admin",
            "realman_parity": "supplied multipart update packet verified; full vendor UI parity not claimed",
            "irmonitor_protocol": "XML v6, export documentation v1.7; live account untested",
            "checkin": {
                "schema": "eupdate-checkin-v1",
                "endpoint": "https://update.estudium.eu/check/",
                "interval_hours": 24
            }
        },
        "verification": {
            "live_eweb_eupdate": "not_run",
            "live_realman": "not_run",
            "live_irmonitor": "not_run",
            "realman_sample": "supplied actual request: property and broker, 10 property photos and 1 broker photo verified locally",
            "live_bulkgate": "not_run; documented API and mocked transport tested",
            "realman_video": "supplied CDN MP4 URL currently returns HTTP 403; local fixture import, playback, ZIP and API ranges passed"
        },
        "project": {
            "website": "https://www.bartos.online"
        }
    },
    "readme": "<!-- eReal distribution attribution: Author: PhDr. Pavel Bartoš, LL.M., DBA. | Website: https://www.bartos.online. -->\n# eReal 0.1.0-alpha.6\n\neReal je instalovatelná první verze evidence realitních nabídek a náběrů pro jednu kancelář a více makléřů. Používá PHP, Composer, pavel852/php-templates a JSON soubory. Neobsahuje nájemní agendu ani veřejný realitní web.\n\n## Co je hotové\n\n| Část | Funkce |\n| --- | --- |\n| Přehled | Počty nemovitostí, rezervace, náběry, končící smlouvy, poslední změny |\n| Nemovitosti | Založení a editace, 116 polí, stav zakázky, hledání, filtry, tabulka, karty a přetahování mezi stavy, ZIP nemovitosti a aktivní JSON feed |\n| Majitel | Kontakty, IČO, adresa, smlouva a její platnost jako součást zakázky |\n| Číselníky | 29 výchozích sad, automatické doplňování hodnot a dalších zdrojových číselníků z Realmanu |\n| Přílohy | Fotografie a dokumenty do 10 MiB, soukromé soubory, kontrola přístupu při stažení |\n| Historie | Posledních 50 verzí zakázky, obnova údajů, posledních 2 000 systémových událostí |\n| Makléři | Administrátor celé kanceláře, makléř pouze vlastních zakázek, vypnutí účtu, změna hesla |\n| Realman | Automatický import dodaného multipart formátu na `/import`, archiv, fotografie do galerie, ruční mapování jiných formátů |\n| iRMonitor | XML export v6 podle dokumentace 1.7, exportní heslo exwbps, kontakty, historie cen, opakované načítání a převod na náběr |\n| Zálohy | 10 datových stavů před změnou, úplné ZIP zálohy včetně příloh/requestů, stažení a obnova, denní plán a retence |\n| Aktualizace | Check-in eUpdate, aktualizace aplikace do nového vydání, Composer 2 a závislosti, automatický plán |\n| Instalace | Distribuční manifest pro eUpdate → eWeb, předem přibalené závislosti, inicializace soukromého úložiště |\n\n**Výchozí číselníky a model nejsou prohlášeny za úplnou kopii aktuálního Realmanu.** Dodaný skutečný export je ověřen; úplná shoda všech formulářů, podmínek a kódů vaší licence vyžaduje další reprezentativní ukázky. Veškerá zdrojová data importu zůstávají zachována i mimo normalizovaná pole.\n\n## Požadavky\n\n- PHP 8.1–8.x; ověřeno na PHP 8.3.6.\n- Rozšíření json, mbstring, fileinfo, curl, dom, zip, ctype.\n- Zapisovatelná soukromá složka domény `private/`.\n- Bez databázového serveru; stavový JSON má aplikační limit 64 MiB. Pro rozsáhlý provoz plánujte archivaci nebo pozdější databázový adaptér.\n- Odchozí HTTPS na `www.irmonitor.cz`, platné exportní oprávnění a samostatné exportní heslo.\n- Pro lokální testy navíc Python 3 a PHP CLI s pcntl; není požadováno pro provoz přes FPM.\n\nphp-templates a latex vycházejí z eSite RC17. PHPMailer 7.2.0 je přidaný přes Composer z oficiálního balíčku. Composer 2.7.1 vytvořil optimalizovaný autoload. Přesné SHA-256 knihoven jsou v `resources/dependency-provenance.json`. Samostatná síťová instalace závislostí pomocí Composeru se při instalaci do eWebu nespouští; balíček je úplný.\n\n## Instalace přes eUpdate do eWebu\n\n1. Do projektu eReal v eUpdate vložte **celý tento ZIP**, se zachovaným `install.json` v kořeni. Typ vydání: hlavní aplikace, cíl `hosting`, systém `source`. `software_id` musí zůstat `ereal`.\n2. Z eUpdate zkopírujte skutečný instalační odkaz projektu/vydání. V eWebu ho vložte v Domény → eUpdate u cílové domény. Balíček v této konverzaci zatím nebyl zveřejněn v eUpdate ani nasazen na doménu.\n3. V náhledu zkontrolujte aplikaci a webový kořen `public`. eWeb nasadí její obsah do `web/`. Databázi nezakládejte.\n4. Otevřete doménu nebo `/admin`. První požadavek ověří instalační archiv SHA-256, rozbalí kód do `private/ereal/releases/` a připraví `private/ereal/shared/`.\n5. Přihlaste se **admin / admin**. Jde o výchozí údaje nové instalace podle zadání. Instalační token se již nepoužívá. Při aktualizaci existující instalace se účty a hesla zachovají; nedokončený prázdný průvodce alpha.1 se převede na výchozí účet.\n6. V Nastavení zadejte název kanceláře; v Makléři a uživatelé vytvořte účty.\n\neWeb 0.8.44 má v Nginxu zákaz veřejného přístupu ke složce `/private/`. Při provozu mimo eWeb nastavte stejný zákaz; pro Apache jsou přibalené `.htaccess`. PHP vývojový router směruje všechny požadavky přes kontroler.\n\nInstalační mechanismus je lokálně testován se samotnou veřejnou částí archivu, včetně zachování soukromých dat po opakované instalaci. Skutečná instalace přes váš živý eUpdate/eWeb dosud nebyla provedena.\n\n## Místní spuštění ze zdrojů\n\n```sh\nphp bin/console.php init\nphp -S 127.0.0.1:8080 -t public bin/router.php\n```\n\nData jsou v `var/`. Alternativní umístění nastaví proměnná `EREAL_DATA`. Nová instalace má účet **admin / admin**. Přihlášení používá stejné principy jako eSite (PHP relace, hashe, CSRF, role), ale účty jsou samostatné; nejde o společné SSO eWebu/eSite.\n\n## Data, souběh a aktualizace\n\nPo instalaci do eWebu:\n\n```text\nprivate/ereal/\n  current.json                  aktivní vydání pro cron\n  monitor-cron.php              stálý CLI vstup pro monitoring\n  maintenance-cron.php          stálý CLI vstup pro check-in, aktualizace a zálohy\n  releases/VERSION-HASH/        aplikace včetně vendor/\n  shared/\n    state.json                 uživatelé, zakázky, číselníky, nastavení, monitoring a plán údržby\n    identity.json              ID instalace a neveřejný check-in klíč\n    snapshots/                 úplné ZIP zálohy\n    maintenance-state.json     fronta a výsledek údržby\n    state.json.lock            stálý transakční zámek\n    captures/ID.json            požadavky do /import\n    uploads/ID                 neveřejné fotografie a dokumenty\n    sessions/                  PHP relace\n    backups/                   posledních 10 stavů před změnou\n    rate.json                  omezení pokusů\n```\n\nVeškeré zápisy stavu probíhají pod zámkem a atomickým přejmenováním. Editace zakázky vyžaduje její aktuální číslo verze; starší editace vrátí HTTP 409 a musí se znovu načíst. Import celé dávky se zapisuje jednou transakcí. Historie uchovává 50 předchozích stavů; obnova se týká údajů a přiřazení makléře, přílohy zůstávají aktuální.\n\nAktualizace v eWebu nahrazuje veřejný vstup a instalační payload. Soukromé `shared/` se nepřepisuje. Před aktualizací proveďte plnou zálohu souborů domény. Pro návrat použijte odpovídající plnou zálohu eWebu; při ruční obnově `state.json` nejprve zastavte zápisy. Samotný datový JSON neobsahuje fyzické přílohy ani archiv zachycených requestů.\n\n**JSON režim je určen pro jeden aktivní uzel.** Více makléřů na témže uzlu je podporováno. Současný zápis z několika serverů do kopií souborů synchronizovaných například Syncthingem podporován není. Doménu a cron směrujte na jeden zapisující uzel; pro souběžné uzly je nutné jiné sdílené úložiště a relace.\n\n## Automatický Realman import a archiv\n\nPo nasazení je příjem například `https://is.realsp.cz/import`. V alpha.3 stačí do Realmanu zadat přesně tuto adresu. **GET a POST jsou ve výchozím stavu přijímané bez přihlášení, HTTP Basic nebo přístupového klíče.** Čtení a stažení přijatých dat vyžaduje přihlášeného administrátora.\n\nGET požadavek zachovává přesný původní query string v Base64 i rozparsované parametry. POST zachovává původní tělo v Base64 a jeho SHA-256. Parametry jako `r` nebo `asset` na `/import` se považují za data exportu a neodklánějí request do jiných částí aplikace. Multipart PHP zpracovává samo: uloží se formulářová pole a obsah jednotlivých souborů; nejde o bajtově shodnou multipart obálku.\n\nV nabídce **Příjem z Realmanu → Stáhnout poslední request** je poslední přijatý požadavek v souboru `realman-last-request.json`. Zachovává se i archiv předchozích požadavků. Při dosažení 500 requestů nebo 256 MiB se nejstarší postupně odstraní, aby se mohl uložit nový. Limit jednoho požadavku je 10 MiB; rate limit 1000 přijetí z jedné IP za 15 minut. U rozpoznaného Realman exportu se ihned zapisují údaje nemovitosti; fotografie se dokončí na pozadí.\n\nV Nastavení lze příjem vypnout a volitelně zapnout ověřování pomocí X-Import-Key, Bearer klíče, HTTP Basic nebo adresy s klíčem. Výchozí adresa zůstává `/import`.\n\nNový balíček nemá fyzickou veřejnou složku import/, takže POST na `/import` neprochází přesměrováním na `/import/`. Po aktualizaci staršího nasazení jednou otevřete `/admin`: známý starý route wrapper se automaticky přesune do soukromé složky. Neznámé soubory aplikace nemaže. Standardní eWeb musí mít zapnutý svůj front-controller fallback na index.php.\n\nVe výchozím stavu odpověď HTTP 202 obsahuje `saved:true`, ID zachycení a po rozpoznaném importu `imported:true` s `property_id`; u jiných formátů zůstává `imported:false`. Vlastní nastavená odpověď se zachová. Přijetí odpovědi vzdáleným exportérem je třeba ověřit na živé instalaci.\n\n`operation` update/insert/add/create založí nebo aktualizuje nemovitost podle stabilního ID; delete/remove ji archivuje. Popis, cena, plochy a další podporované údaje se propíší do formuláře. Hodnoty `*_s` rozšiřují číselníky o dodané názvy a kódy; nová nezmapovaná hodnota dostane stabilní interní kód `rm-…`. Další neznámé zdrojové číselníky se také uloží. Kompletní původní payload zůstává u nemovitosti. Bity sítí bez názvů se neodhadují; nulový řetězec znamená prázdný výběr. Přesnost adresy je konzervativně obec, dokud není význam externích kódů ověřen.\n\nMakléř se propojí podle exportovaného ID nebo shodného e-mailu; nový profil dostane náhodné neznámé heslo, které může správce nastavit. Fotografie se stahují jen přes HTTPS z CDN `t.rmcl.cz`, bez přesměrování, do soukromé galerie. Platí limit 10 MiB na snímek a nejvýše 100 fotografií na export. Dvě fotografie se zpracují při jednom běhu fronty. Opakovaný hash nestahuje druhou kopii. Po úspěšném dokončení se sjednotí pořadí a odstraní odkazy na fotografie, které nový export už neobsahuje; ruční přílohy zůstanou. Neúspěšné fotografie lze zopakovat tlačítkem **Zpracovat Realman**; při vypršení podepsaných URL pošlete nový export. Stav je vidět v přehledu requestů.\n\nAutomatický režim je výchozím stavem zapnutý, lze jej vypnout v Nastavení → Kancelář a Realman. Po aktualizaci zpracuje fronta také starší uložené requesty bez stavu zpracování. Pod FPM běží po odpovědi; bez FPM použijte `php bin/console.php realman:work` opakovaně nebo cron údržby. Starší request nepřepíše novější import.\n\nPro jiný formát exportu zůstává dostupné explicitní ruční mapování:\n\nV Příjem z Realmanu otevřete záznam. JSON a běžné XML se zobrazí ve stromu; XML atributy mají prefix `@`, opakované prvky jsou pole. Mapování používá tečkové cesty:\n\n```json\n{\n  \"items_path\": \"items\",\n  \"id_path\": \"id\",\n  \"fields\": {\"reference\": \"rkid\", \"title\": \"name\", \"transaction\": \"operation\", \"category\": \"kind\", \"price\": \"price\"},\n  \"values\": {\"transaction\": {\"P\": \"sale\", \"N\": \"rent\"}, \"category\": {\"B\": \"apartment\", \"D\": \"house\"}}\n}\n```\n\nJde o ilustraci, nikoli tvrzení o skutečných klíčích Realmanu. Konkrétní hodnoty vyplňte podle prvního exportu. Externí číselníky lze místo `values` mapovat také v Číselníky → `external_codes`. Neznámý kód dávku zastaví. Před importem musí být znám typ zakázky a druh nemovitosti. Chybějící RKID/název dostanou technický název RM-ID a stav je bez mapování rozpracovaný.\n\nNejprve použijte Náhled, pak Potvrdit a importovat. Zdrojové ID je povinné a tvoří spolu se zdrojem stabilní vazbu. Opakovaný totožný export nevytvoří duplicitní zakázku. Ručně změněná pole mají přednost před dalším importem. Stav se nemění jen proto, že položka v další dávce chybí; v režimu ručního mapování se vzdálené fotografie nestahují. V první verzi má importovanou zakázku správce, který import potvrdil; ten ji může přiřadit makléři.\n\nPro dokončení parity všech funkcí jsou potřeba aktuální formuláře/číselníky vaší licence a další typy exportu. Připojení ke katastru, generování smluv/PDF, překlady, párování poptávek, hromadné operace a export na realitní portály součástí této první verze nejsou.\n\n## iRMonitor podle dodané dokumentace\n\nZdroj: dodaný dokument `export_inzeratu_popis1.7.pdf`, 6 stran; implementace odpovídá exportu XML dataver 6 a veřejnému `https://www.irmonitor.cz/Data/AdvertExport_ver6.xsd`. Jeho kopie je v resources/. Dokumentovaný export nepoužívá Bearer klíč ani přihlašovací heslo běžného webového účtu.\n\nV Nastavení vložte **samostatné exportní heslo exwbps**, v konfiguraci nastavte `enabled:true`. Výchozí URL je `https://www.irmonitor.cz/AdvExport.aspx`. Heslo se ukládá neveřejně. Podle zadání se přihlášenému správci znovu zobrazuje čitelně v poli exportního hesla. Běžný makléř ani nepřihlášený návštěvník k nastavení přístup nemají. Monitoring je v alpha.3 výchozím stavem zapnutý; migrace jej jednorázově zapne i na starších instalacích, uložený klíč zachová. Pozdější explicitní vypnutí se respektuje. Protokol vyžaduje heslo v parametru HTTP požadavku; aplikace ho nezapisuje do svého logu.\n\nVolání obsahuje:\n\n| Parametr | Hodnota |\n| --- | --- |\n| exwbps | nastavené exportní heslo |\n| extstamp | hodnota `since`, formát yyyy-MM-ddTHH:mm:ss |\n| exnewonly | 0 — umožní znovu načíst již exportované hodnoty při opakování po chybě |\n| extformat | xml |\n| xmlstyle | 2 |\n| dataver | 6 |\n\nVýchozí `since` je půlnoc dne prvního spuštění aplikace. Pro historické načtení ji změňte. Po úspěšném zpracování se posune na čas začátku požadavku s dvouminutovým překryvem. Překryv zachytí změny během načítání; duplicity se aktualizují podle ID. Časová zóna aplikace je Europe/Prague; dokumentace posílá datum bez časové zóny.\n\nPři chybě autentizace, neplatném XML, neshodě Count, síťové chybě nebo chybě transakce se checkpoint neposune. `No data` je zpracováno jako prázdný výsledek. Pokud export dosáhne 5000 záznamů, dávka se zpracuje, ale checkpoint zůstane stejný a aplikace oznámí dosažený limit. Rozhraní podle dokumentace nemá stránkování; pro úplné načtení saturovaného výsledku je nutné řešení s poskytovatelem. Export nad 10 MiB aplikace odmítne bez posunutí checkpointu.\n\nPřenášejí se název, cena, řádky textu, lokalita, původní odkaz, všechny kontakty a zdrojové údaje, předchozí ceny, změny ceny/kontaktu a územní ID. Ve výpisu je samostatný sloupec všech platných e-mailů a telefonů. Ukládají se jen nabídky s alespoň jedním platným e-mailem nebo telefonem; nabídky bez kontaktů se vyřadí. Dříve uložené nabídky bez kontaktů zůstávají v soukromých datech, ale ve výpisu se nezobrazí. Při převodu na náběr se jako hlavní e-mail použije první adresa; všechny zůstávají ve zdrojových datech. Původní XML jednotlivého inzerátu zůstává ve zdrojových datech. Uživatel při založení náběru potvrdí druh a typ zakázky; navržené hodnoty vycházejí z dokumentovaných Activity/RealityType.\n\nDo nabídky náběrů se načtou jen aktivity 1, 2, 5, 6 a 7 (prodej, pronájem, nabídkové výměny, nabízené spolubydlení). Poptávky po koupi/pronájmu se vyřadí. XML **nemá příznak RK vs. soukromý inzerent**. V této konfiguraci je `private_feed_confirmed:true`, protože zadavatel výslovně potvrdil, že jeho export obsahuje pouze soukromé inzerenty. Aplikace se spoléhá na toto nastavení poskytovatele; neprovádí vlastní klasifikaci RK. Při přechodu na smíšený export potvrzení vypněte a upravte zdrojová pravidla.\n\nTlačítko Načíst z API provede jednu synchronizaci. Bez exportního hesla se reálné volání nespustí. Živé placené rozhraní nebylo testováno; ověřeny jsou parser, dávky a chyby na syntetickém XML odpovídajícím dokumentované struktuře. V Nastavení lze zkušebně vložit XML odpověď nebo syntetický JSON.\n\n## Cron v eWebu\n\nCron nevytváří instalace ZIPu automaticky. Nastavte ho u příslušné domény pod jejím účtem, například každých 15 minut, pokud to umožňuje smlouva s poskytovatelem. Zvolte PHP binárku stejné verze jako FPM domény a její skutečnou cestu:\n\n```sh\n/cesta/k/php /var/www/DOMENA/private/ereal/monitor-cron.php\n```\n\nPrvní návštěva domény vytvoří tento stálý vstup. Používá aktuální vydání z `current.json`. Běží pouze jeden synchronizační proces; další spuštění při obsazeném zámku skončí s chybou. Výstupem je počet uložených a vyřazených inzerátů a informace o případném limitu.\n\n## Diagnostika a ověření\n\n- Chyby PHP: log PHP-FPM příslušné domény; databázový server není potřeba.\n- Data a příjem: `private/ereal/shared/state.json`, `captures/`.\n- CLI zdraví ve zdrojové instalaci: `php bin/console.php health`.\n- Aplikační kontroly: `php tests/run.php`.\n- HTTP kontroly: `python3 tests/http_integration.py`; volitelné proměnné PHP_BINARY a PHP_INI.\n- Ověření balíčku a aktuální výsledky: `VALIDATION.json`, `SHA256SUMS`.\n\nProdukční data ani osobní přístupové klíče nejsou součástí distribučního archivu. Výchozí heslo admin je součástí inicializace podle zadání. Syntetické XML/JSON ukázky v tests/ a resources/ jsou označené jako testovací data.\n\n## Licence a autor\n\nAutor projektu: PhDr. Pavel Bartoš, LL.M., DBA. Web autora: https://www.bartos.online/. Licenci eReal stanoví vlastník projektu. Přibalené php-templates a latex si zachovávají MIT licence, PHPMailer LGPL-2.1-only; úplná znění jsou ve vendor/. Tento balíček neobsahuje zdrojový kód ani grafické podklady Realmanu.\n\n\n## Alpha.2: přihlášení, check-in a údržba\n\nPřihlášení používá stejné rozvržení a animovanou trojúhelníkovou scénu jako eSite/eWeb: modré pozadí, logo eStudium v bílé kartě a bílý přihlašovací formulář. Účty zůstávají samostatné. Nová instalace má admin/admin; aktualizace již nastavené heslo nemění.\n\n### Check-in eUpdate\n\nKlient posílá na `https://update.estudium.eu/check/` JSON `eupdate-checkin-v1`, hlavičku `X-Checkin-API-Key` a stabilní ID `ereal-…`. Klíč vznikne při prvním použití a zůstává v neveřejném identity.json. Odpověď musí potvrdit stejné server_id a autentizaci pinned/tofu-pinned. Bez tohoto potvrzení se vydání nepovažují za ověřená.\n\nPřenáší se ID instalace, verze aplikace, PHP, OS, architektura a doména aplikace. Neposílají se zakázky, adresy nemovitostí, kontakty, uživatelské účty ani integrační hesla. Veřejnou adresu lze změnit v Aktualizace. Přesun na jinou doménu zneplatní dřívější cache nabídky vydání.\n\n### Aktualizace aplikace\n\nV Aktualizace lze ručně odeslat check-in a nainstalovat novější vydání nabídnuté právě této instalaci. Stažení je omezené na HTTPS host update.estudium.eu, používá identitu instalace a volitelný X-Project-Secret. Kontroluje se SHA-256, manifest software_id=ereal, verze, cíl hosting, požadované PHP a bezpečnost ZIP cest. Po úplné záloze se připraví soukromé vydání, ověří se závislosti a syntaxe PHP a atomicky se přepne current.json. Veřejný vstup už tento ukazatel při příštím požadavku nevrací na starší přibalenou verzi.\n\nAutomatická kontrola/aktualizace je ve výchozím stavu zapnutá jednou za 24 hodin a lze ji vypnout. Je určena pro verzi instalovanou do eWebu. Zdrojová instalace nabízí check-in a zálohy; kód se v ní mění nasazením nového balíčku.\n\n### Composer\n\nJednou týdně nebo ručním tlačítkem se ověří nejnovější kompatibilní stabilní Composer 2 z getcomposer.org včetně oficiálního SHA-256. Po úplné záloze se klonuje aktivní vydání a provede se composer update s no-dev, no-plugins, no-scripts a optimalizovaným autoloadem. Omezení z composer.json se zachovají: php-templates 2.6.1, latex >=3.3 <4.0 a PHPMailer ^7.0. Přibalené kopie těchto knihoven jsou také fallback path repozitářem v resources/dependency-packages, takže soukromá verze šablon nemusí mít veřejný tag. Vydání se aktivuje až po úspěšné kontrole; při chybě zůstane původní kód aktivní.\n\nPro spuštění je potřeba proc_open a kompatibilní PHP CLI s rozšířením Phar. Volitelná proměnná EREAL_PHP_CLI určuje binárku PHP CLI domény. Síťová aktualizace vyžaduje HTTPS přístup na getcomposer.org a případné repozitáře závislostí. Instalace z přibaleného composer.lock byla ověřena; živé projektové vydání v eUpdate nebylo publikováno ani instalováno.\n\n### Úplné ZIP zálohy\n\nVedle posledních 10 datových stavů existují samostatné úplné ZIP zálohy: state.json, identity.json, uploads/ a captures/. Neobsahují relace, cache Composeru ani další zálohy. Každý soubor má velikost a SHA-256 v manifestu snapshot.json. Zápis a obnova vyžadují výhradní zámek aplikace, aby nevznikla směs různých stavů.\n\nVýchozí plán je denně, nejvýše 7 záloh a 512 MiB pro všechny ZIPy. Nastavit lze 1–30 záloh a prostor 10–2048 MiB. Maximální rozbalená záloha je 512 MiB; při vyšších objemech použijte zálohu domény v eWebu. Nová záloha se zveřejní až po dokončení ZIPu; nedokončené soubory nejsou nabízené ke stažení.\n\nV nabídce Zálohy lze ZIP vytvořit, stáhnout, obnovit a smazat. Obnova ověří celý archiv a před změnou vytvoří zálohu současného stavu. Potom doplní chybějící neměnné přílohy/requesty a atomicky obnoví datový JSON. Při kolizi stejného ID s jiným obsahem se zastaví. Fyzické soubory vytvořené po záloze se nemažou, ale obnovená evidence na ně neodkazuje. Identita eUpdate zůstává místní; všichni uživatelé se po obnově znovu přihlásí.\n\n### Spouštění na pozadí a cron\n\nPod PHP-FPM se odpověď nejprve dokončí a údržba pokračuje na pozadí. Pro běh bez návštěv nastavte každých 5 minut pod účtem domény například:\n\n```sh\n/cesta/k/php /var/www/DOMENA/private/ereal/maintenance-cron.php\n```\n\nMonitor-cron.php zůstává samostatný. Údržba při jednom spuštění provede jednu úlohu, v pořadí splatná záloha, check-in, aktualizace aplikace, Composer. Vypínače a poslední pokusy se uchovávají mezi požadavky. Při deaktivovaném proc_open pro web se aktualizace závislostí spouští přes CLI cron. Ve zdrojové instalaci jsou odpovídající příkazy:\n\n```sh\nphp bin/console.php cron\nphp bin/console.php work\nphp bin/console.php checkin\nphp bin/console.php core-update\nphp bin/console.php composer-update\nphp bin/console.php backup\nphp bin/console.php restore NAZEV_ZALOHY.zip\n```\n\nPHP vývojový server neprovádí údržbu po odpovědi; pro něj je nutný CLI worker. Automaticky se netvoří systémový cron.\n\n\n## Alpha.3: makléři, galerie a vzhled\n\nProfil makléře má jméno, popis, profilovou fotografii, e-mail a telefon. Záložka Makléři a uživatelé obsahuje editor profilu a pod výpisem samostatný API odkaz pro integraci webu. Viditelnost profilu v API lze vypnout; neaktivní účet se neexportuje. Změna kontaktů neodhlašuje makléře, změna hesla nebo oprávnění jeho předchozí relace zneplatní.\n\nAPI má tvar `https://DOMENA/api/brokers?key=KLIC`. Samostatný klíč pro čtení je uložený v config.broker_api_key a zobrazuje se správci pod makléři. API vrací pouze aktivní zveřejněné profily: id, name, description, email, phone, photo_url. Nikdy nevrací login, hash hesla, role, interní přílohy ani integrační klíče. Profilové fotografie mají vlastní API adresu se stejným klíčem. Klíč lze místo URL poslat v X-Broker-Key nebo Authorization: Bearer. Vygenerovaná photo_url používá veřejnou adresu aplikace z nastavení údržby.\n\nMediální galerie je v hlavním menu. Má složky Nemovitosti → jednotlivá RKID a Makléři → jednotlivá jména, s vlastními podsložkami. Fotografie a dokumenty z původních příloh nemovitostí jsou viditelné automaticky, bez druhé kopie dat. Galerie umožňuje více souborů nahrát přetažením, hledat, řadit, filtrovat fotografie/dokumenty, zobrazit náhled, stáhnout, přejmenovat, přesunout do podsložky a odebrat. Prázdné složky lze přejmenovat a smazat. Přiřazenou profilovou fotografii makléře lze vybrat nebo nahrát ve stejném galerijním popupu.\n\nAdministrátor vidí všechna média. Makléř vidí pouze média svých nemovitostí a vlastní profilové složky. Profilové API zpřístupňuje pouze vybranou zveřejněnou profilovou fotografii, nikoli všechny soubory makléře. Galerie a profilové fotografie jsou zahrnuté v úplných ZIP zálohách a obnově.\n\nVolitelné PHP GD zpřístupní otočení o 90 stupňů, zrcadlení, černobílý filtr a ořez. Úpravy se ukládají jako nové PNG kopie; původní soubor se nepřepisuje. Maximální obrázek pro úpravy má 12 megapixelů. Bez GD zůstávají nahrávání, složky, náhledy a stahování dostupné.\n\nProstředí používá výraznější modré barvy sidebaru, tlačítek, karet a galerie. Vlastní HTML, CSS, JS a PHP zdroje mají hlavičku s autorem PhDr. Pavel Bartoš, LL.M., DBA. a webem https://www.bartos.online. U závislostí je přidáno distribuční označení eReal a ponechané původní autorství a licence. Striktní datové soubory, binární soubory, VERSION a SHA256SUMS jsou uvedené v registru resources/AUTHORSHIP.json.\n\nCheck-in eUpdate obsahuje `active_properties_count`: počet nemovitostí přesně ve stavu active. Rozpracované, náběrové, rezervované, realizované a archivované zakázky se do tohoto počtu nezapočítávají. Jednotlivé zakázky ani kontakty se do check-inu neposílají.\n\n\n## Alpha.4: exporty, ovládání, zprávy\n\nV menu je skutečná instalovaná verze a Nastavení má podmenu pro Realman, monitoring, SMTP, SMS, aktualizace, zálohy a datový export. Přihlašovací obrazovka i administrace zobrazují Powered by eStudium.eu.\n\nU každé uložené nemovitosti je **Export ZIP** v seznamu a detailu. Obsahuje `property.json` (údaje, čitelné číselníkové hodnoty, kontakty makléře a seznam snímků) a složku `images/` s jejími fotografiemi v aktuálním pořadí. Je dostupný pro všechny stavy zakázky jen přihlášenému správci nebo přiřazenému makléři. Obsahuje i soukromé údaje vyplněné v polích nemovitosti; neposílejte jej jako veřejný feed. Neobsahuje přístupové údaje aplikace, historii ani původní podepsané CDN URL. Limit fotografií v archivu je 512 MiB.\n\nPod počtem aktivních nabídek je odkaz na export. Samostatný firemní feed `/api/properties?key=KLIC` vrací pouze aktivní nabídky s veřejnými poli; majitelé, interní poznámky a dokumenty se vynechávají. Respektuje přesnost adresy a textovou cenu. Veřejné snímky se označují **Fotografie do exportu** v přílohách či galerii; fotografie stažené z Realmanu jsou označené automaticky. Přímé foto API používá stejný čtecí klíč. Odkaz spravuje administrátor, makléř stáhne jen svoje aktivní nabídky. Veřejná adresa vychází z Nastavení → Aktualizace.\n\nPřetahovat lze soubory do galerie, příloh a portrétu makléře; pořadí příloh, média v galerii, soubory i složky mezi podsložkami, zakázky mezi stavy na nástěnce, skupiny hlavního menu a SMS profily. Lokální pořadí menu se pamatuje pro účet v prohlížeči. Textové/JSON/XML soubory do 2 MiB lze přetáhnout do textových polí.\n\n### PHPMailer / SMTP\n\nComposer přibaluje PHPMailer 7.2.0. V Nastavení → E-mail / SMTP uložte server, port, TLS/SMTPS, účet, heslo, odesílatele a příjemce. Zapněte vybraná upozornění na nové inzeráty, změny zakázek nebo chyby údržby. SMTP je do vyplnění vypnuté. Testovací e-mail se zařadí do fronty; zpracovává ji FPM, cron údržby nebo `php bin/console.php mail:work`. Heslo se při prázdném uložení zachová a do klienta se nevrací. Po nejvýše třech chybách zůstane zpráva ve stavu selhání; odesílání přerušené v neznámém stavu se automaticky neopakuje.\n\n### SMS / BulkGate\n\nV Nastavení → SMS / BulkGate uložte Application ID a Application Token. Přidejte až 50 pojmenovaných profilů: vlastní ověřené číslo (`gOwn`), text odesílatele (`gText`, formulář dovoluje 1–11 znaků bez diakritiky) nebo systémové číslo (`gSystem`). Jeden profil zvolte jako výchozí; pro testovací SMS lze vybrat jiný. Vlastní čísla/názvy musí být dostupné na vašem účtu a pro cílovou zemi. Přístup spravuje pouze administrátor; token se prázdným uložením nepřepíše a neposílá se do prohlížeče.\n\n**Ověřit spojení a kredit** volá pouze `/simple/info`, neodesílá SMS. Formulář testovací informační SMS volá `/simple/transactional`, přijímá mezinárodní číslo a nejvýše 268 znaků včetně diakritiky. Odeslání je zpoplatněné podle vašeho účtu a vyžaduje stisk tlačítka s potvrzením. Používá kontrolu duplicit, neopakuje automaticky nejisté síťové výsledky. Protokol přijetí obsahuje číslo, vybraného odesílatele a SMS ID, ne token ani obsah. „Přijato bránou“ není potvrzení doručení telefonu. Automatické hromadné odesílání není zapnuté.\n\nDokumentace rozhraní: https://www.bulkgate.com/en/docs/simple-api/simple-transactional/ a https://www.bulkgate.com/en/docs/simple-api/simple-check-credit-balance/ . Konektor byl ověřen simulovanými odpověďmi, živý BulkGate účet nebyl použit.\n\n### Další ověření\n\n```sh\nphp tests/features_alpha4.php\nPHP_BINARY=/cesta/php python3 tests/smtp_integration.py\nPLAYWRIGHT_MODULE=/cesta/playwright PHP_BINARY=/cesta/php BROWSER_PATH=/cesta/chromium node tests/browser_alpha4.cjs\n```\n\nDodaný skutečný Realman request byl ověřen mimo distribuční balíček: jedna nemovitost, makléř, 10 fotografií a portrét. Podepsané URL a konkrétní data zadavatele nejsou v balíčku přibalené. Síťové stažení fotografií bylo ověřeno samostatně a stažené bajty použity při lokální integrační kontrole; odchozí PHP HTTPS se následně musí ověřit na cílovém hostingu.\n\n\n## Alpha.5: oprava kontroly aktualizací\n\nStarší aktualizátor spouštěl pod FPM obecné `php`, v CLI předával samotnou binárku bez aktivního `php.ini`. Kontrolní podproces tak mohl používat jiné PHP či jiná rozšíření. Výstup neúspěšné kontroly byl skrytý za obecnou chybou. Reprodukce při sestavení: starý postup skončil `Chybí mbstring`, opravený ve stejném prostředí úspěšně ověřil závislosti a syntax.\n\nAutomatický výběr zkouší odpovídající verzi PHP CLI a ověřuje SAPI, podporovanou verzi a rozšíření. Neprovádí filesystem testy cest k binárkám mimo eWeb open_basedir; kandidáty spouští jako pole argumentů bez shellu. CLI podprocesy zachovávají načtený php.ini. Ve webu mají přednost CLI konfigurace odpovídající binárky. V Nastavení → Aktualizace lze zadat cestu PHP CLI; prázdné pole obnoví automatický výběr. Proměnná `EREAL_PHP_CLI` má přednost před nastavením.\n\nTlačítko **Ověřit PHP CLI** zobrazí skutečnou verzi, SAPI, php.ini a rozšíření. Chyby validace včetně výstupu, návratového kódu a použitých verzí zůstávají v soukromém `validation-result.json` a jsou dostupné jen správci v **Aktualizace → Diagnostika PHP**. Přístupové údaje se z diagnostiky odstraní. Kontrola má 120 s a její vlastní PHP lint používá stejný interpret a konfiguraci. Chyba ani neúplný výstup nikdy nepřepnou aktivní vydání. Stejná oprava platí pro aktualizace závislostí Composeru.\n\n### První nasazení opravy při nefunkčním interním aktualizátoru\n\nNahrajte celý balíček alpha.5 jako nové vydání eReal do eUpdate. U stejné domény v eWebu spusťte instalaci/aktualizaci z tohoto vydání. Nasadí se nová veřejná část a při otevření `/admin` se aktivuje alpha.5 přímo přes instalační vstup, bez závislosti na staré CLI kontrole. Zachovejte adresář `private/ereal/shared`; eWeb instalace ponechává účty, nemovitosti, requesty, přílohy a nastavení v této soukromé složce. Před nasazením lze použít běžnou zálohu domény v eWebu.\n\nPotom otevřete Nastavení → Aktualizace → Ověřit PHP CLI. Pokud server nemá požadovaná CLI rozšíření nebo dovoleno `proc_open`, diagnostika ukáže konkrétní problém; opraví jej správce hostingu. Samotný balíček nemění systémové PHP ani oprávnění serveru. Přesnou příčinu původní produkční chyby nelze určit bez jejího konkrétního výstupu.\n\nDoplňkové testy: `php tests/update_validation.php` a `php bin/console.php runtime:check`.\n\n\n## Alpha.6: menu, náhledy, videa a přihlášení\n\nNavigace má pět hlavních položek: Přehled, Nemovitosti, Příjem a monitoring, Kancelář a Nastavení. Běžný makléř vidí pouze své povolené sekce. Ikona je před názvem každé položky; podmenu má spojovací čáru a menší ikony. Rozbalená může být pouze aktuální sekce; přechod na Přehled sbalí všechny. Pořadí hlavních skupin lze měnit přetažením a pamatuje se v prohlížeči. Verze v menu obsahuje jen číslo.\n\nNáhledová fotografie se vybírá z prvního existujícího obrázku v pořadí příloh. Chybějící a poškozené soubory se přeskočí, starší příloha bez MIME se rozpozná podle souboru. Serverový endpoint `/?r=api/property-thumbnail&id=ID` vyžaduje přihlášení a kontroluje přiřazení makléře; privátní snímky se kvůli náhledům nezveřejňují. Karty mají opravenou velikost fotografie v odkazu, fotografie jsou i na nástěnce. Pokud dosud není dostupný žádný stažený obrázek, zůstane zástupná ikona.\n\nPřímo pod seznamem nemovitostí je pro administrátora stálý **API odkaz aktivních nemovitostí** s tlačítkem kopírování a otevření JSON. Používá existující klíč a endpoint `/api/properties?key=…`, takže předchozí napojení zůstává funkční. Formát je `ereal-properties-v1`; není deklarován jako plná implementace API Realmanu. Nabídky v jiném stavu, interní pole a nezveřejněná média se do něj nepřenášejí.\n\n### Videa z Realmanu\n\nAdaptér čte `video_url` a `video_title`, zapisuje první platný odkaz také do pole video_url a uchovává více videí v záložce **Videa**. Přímé HTTPS videosoubory z `c.rmcl.cz` a `t.rmcl.cz` se stahují na pozadí do soukromých příloh a galerie. Podporované kontejnery jsou MP4, WebM, Ogg video a MOV; přehratelnost kodeku záleží na prohlížeči. Limit je 20 videí v exportu, 128 MiB na soubor a jedno video při jednom běhu workeru. Data se stahují do souboru po částech, bez přesměrování, a před zařazením se ověřuje MIME a velikost. Odkazy YouTube/Vimeo zůstávají externími odkazy.\n\nWorker se pokusí převést i videa z dříve uložených source_data. Opakovaný stejný soubor se nestahuje znovu, ruční přílohy zůstávají zachované. Chyba CDN se zobrazí v záložce Videa; opakování importu ji vrátí do fronty. Podepsaný odkaz z dodané ukázky při přímém ověření vrací HTTP 403. Pro tento konkrétní soubor je potřeba ověřit přístup z cílového hostingu; příčinu HTTP 403 ani vypršení odkazu nelze z tohoto prostředí potvrdit. Úspěšné stažení produkčního videa z tohoto odkazu nebylo ověřeno.\n\nV galerii je filtr Videa a přehrávač. Lokální videa jsou zahrnutá i do ZIPu nemovitosti ve složce videos/; celkový limit médií ZIPu zůstává 512 MiB. Veřejné API vrací zveřejněná lokální videa pod `/api/properties/video/ID?key=…`; endpoint respektuje aktivní stav zakázky a označení média. Přehrávání podporuje jednotlivé HTTP byte ranges pro posun videem. Privátní podepsané CDN odkazy se do veřejného API ani ZIPu nepřenášejí.\n\n### Posun stránky a přihlašovací přechod\n\nNad Powered by eStudium.eu je poloprůhledný sedmisegmentový ukazatel 000–100 % a tenká postupová linka. Měří posun hlavní stránky a přepočítává se při změně její délky nebo velikosti okna. Pokud se celá stránka vejde do okna, ukazuje 100 %. Nezachytává kliknutí a zůstává nad patičkou také na mobilu.\n\nPo úspěšném přihlášení se zobrazí stejná načítací obrazovka jako v eSite RC17: animované trojúhelníky, bílé logo eStudium, označení eReal, kruhový průběh a procenta. Zůstává alespoň tři sekundy a do dokončení načtení prostředí. Chybné heslo ji nespustí; při běžném obnovení stránky s platnou relací se neopakuje.\n\nOvěření navíc: `php tests/features_alpha6.php`. Součástí testů je krátký syntetický modrý MP4 klip; původní request, podepsané URL ani skutečná média zadavatele v balíčku nejsou.",
    "download_url": "https://update.estudium.eu/download.php?project=de61c5e7d8d5a0c7&release=b91f06028c30b4f54c2290b364d4a6a5",
    "package_target": "hosting",
    "requirements": {
        "php": ">=8.1 <9.0"
    },
    "license": {
        "id": "custom",
        "name": "Vlastní",
        "custom_text": "Licenci aplikace stanoví vlastník projektu eReal. pavel852/php-templates a pavel852/latex: MIT. PHPMailer: LGPL-2.1-only."
    },
    "deployment": {
        "archive_root": ".",
        "web_root": "public"
    },
    "project_type": "application",
    "hosting": null
}