# Legacy SoftSPM - źródło migracji **Katalog źródłowy: `C:\Programy\xampp_old\htdocs\trzeciCloude_v1\`** To jest jedyne źródło, do którego się odwołujemy przy przepisywaniu na Laravela. W `htdocs/` leży kilka równoległych kopii tej samej aplikacji (`newPGE`, `trzeciTestowy`, `pierwszyPodstawowy`, `wellsctrl*`) - **ignorujemy je**. `trzeciCloude_v1` jako jedyna ma repozytorium git (`Initial commit`) oraz własną dokumentację. ## Nie powielamy istniejącej dokumentacji W legacy leżą dwa opracowania - **czytać je zamiast wyprowadzać wnioski od nowa**: | Plik | Co zawiera | |---|---| | `trzeciCloude_v1/CLAUDE.md` (181 linii, EN) | architektura, konwencje nazewnicze bazy, routing shardów historii, martwy kod | | `trzeciCloude_v1/AUDYT.md` (125 linii, PL) | audyt techniczny 2026-06-09 + plan P0/P1/P2 (SQLi, LFI, MD5, SSO, sekrety) | Schemat baz: `trzeciCloude_v1/db_structure/*.sql` - **zrzuty struktury bez danych** dla wszystkich trzech baz. Grepować je zamiast zgadywać kolumny. ## Skala (zmierzone 2026-09-03) | | | |---|---| | plików PHP | 983 (1933 pliki łącznie) | | fragmentów stron `sites/*.php` | 198, w 50 numerach `siteNNN` | | raportów `reports/*.php` | 73 | | eksportów `export/*.php` | 45 | | `func.php` | **4156 linii, 111 funkcji** | | `index.php` (front controller + menu + auth) | 435 linii | | `ajax_func.php` / `ajax_getdata4well.php` | 315 / 208 linii | > Rozbieżność: `CLAUDE.md` legacy podaje „func.php ~3400 linii, ~140 funkcji", > `AUDYT.md` „~4000 linii, ~140 funkcji". Faktycznie **4156 / 111**. > `CLAUDE.md` twierdzi też „Not a git repository" - dla `trzeciCloude_v1` > to już nieprawda. ## Architektura w skrócie - **Front controller**: `index.php`, dispatch po `?pg=siteNNN` → `include sites/siteNNN.php` (domyślnie `site401`). Menu, bramka auth i połączenie z bazą też są w `index.php`. - **Warianty stron po sufiksie**: `A`=add, `E`=edit, `inf`=szczegóły, `his`/`ahis`/`mhis`/`offhis`=historie, `charts`, `det`/`pdet`=detale, `mark`=widok mapowy. Przykłady: `site301` ma 18 wariantów, `site401` ma 19. - **Uprawnienia per strona**: `sys_user_profiles → sys_profile_site → sys_site_access` spłaszczone do `$_SESSION['siteNNN']` / `$_SESSION['siteNNN_edit']`. **Router ich nie sprawdza** - każda strona i handler AJAX sprawdza sam. - **SOAP w dwóch rolach**: klient SYNDIS (`soap.php` + `soap_*.php`, pobieranie SCADA) oraz serwer SOAP (`webservice/`, wystawianie danych do SYNDIS). - **Zadania cykliczne**: Windows `.bat` + php-cli (`soap_update5min.php` co 5 min, `reports/rep_003_hours.bat` per oddział B/S/D). ## Bazy i sharding historii Połączenie otwiera `softspm`, ale zapytania sięgają dwóch pozostałych przez **twardy prefiks w SQL** (~240 wystąpień `softspm_rep.`, ~90 `softspm_his.`). Wszystkie trzy muszą stać na jednym serwerze. - `softspm` - dane operacyjne (w tym tabele `rep_*` bieżące). - `softspm_rep` - tabele raportowe (`rep_002_*` per miesiąc `styc…grud`, `rep_003_data`, `rep_015_*`). - `softspm_his` - archiwum: **shardy kwartalne** `rep_his_data_everyday_YYYY_qN` i `seg_dev_resources_det_YYYY_qN`, piezometry per rok. Routing shardów: `getTableNameFrom_everyday_his()` / `getTableNameFrom_resources_det()` (`func.php`). Reguła: bieżący rok → tabela bazowa, ale po **180 dniach** przełącza się na wariant `_his`; starsze → shard `YYYY_qN`; data w **pierwszych 3 dniach miesiąca** jest cofana do poprzedniego miesiąca (więc początek stycznia trafia w Q4 poprzedniego roku); wszystko sprzed 2014 → `2014_q1`. > W SoftSPM_2 tej logiki **jeszcze nie ma** - `WellOperationController` czyta tylko > bieżące `rep_his_data_everyday` z bazy `softspm`. Połączenia `softspm_rep` > i `softspm_his` są skonfigurowane, ale nieużywane. Przy migracji historii > trzeba odtworzyć reguły shardowania. ## Mapa sekcji legacy → SoftSPM_2 Górne menu legacy = sekcje; `config/navigation.php` odtwarza je 1:1. Status: ✅ = przepisane, ⬜ = `route => null` (placeholder w menu). | Sekcja | site | Nazwa | Status w SoftSPM_2 | |---|---|---|---| | **Start (100)** | 100/101/102 | Start, Parametry studni 01/02 | ✅ `dashboard` (mapa = placeholder) | | **Katalogi (200)** | 203 | Katalog pomp | ✅ `pumps.*` (pełny CRUD) | | | 204 | Katalog silników | ✅ `engines.*` | | | 205 | Katalog agregatów | ✅ `aggregates.*` (lista/szczegóły/edycja) | | | 201 | Wybór agregatu pompowego | ✅ `aggregate-selection.index` | | | 206 | Katalog kabli | ✅ `cables.*` | | | 207 | Katalog orurowania i armatury | ✅ `piping.*` | | | 208 | Katalog opomiarowania | ✅ `metering.*` | | | 202 | Katalog piezometrów | ⬜ **brak w `navigation.php`** | | **Stan (300)** | 303,304,301,302,309,306,307,308 | Stan pomp/silników/studni/zbiorników/piezometrów/kabli/orurowania/opomiarowania | ⬜ wszystkie | | | 310 | (bez etykiety w menu; 1204 linie - największy plik `sites/`) | ⬜ | | **Eksploatacja (400)** | 401 | Eksploatacja studni | ✅ `well-operation.*` (lista + karta, etap 1) | | | 402,404,405,406,403,407 | zbiorniki, piezometry, ujęcia, kreator doboru pompy, parametry stałe, zrzut wody | ⬜ | | **Stacja prób (500)** | 501-504 | Pompy, Silniki, Agregaty, Kable | ⬜ | | **Remonty (600)** | 601-603 | Demontaż, Weryfikacja, Jakość remontów | ⬜ | | **Gospodarka (700)** | 701-704 | Statystyki rezerw studni, rezerwy części nowych/regenerowanych, drutów i kabli | ⬜ | | **Administracja (800)** | 801-807, 809, 810 | użytkownicy, profile, baza wiedzy, producenci, słowniki, parametryzacja, raporty, zlecenia, zmiana hasła | ⬜ | | **Baza wiedzy (900)** | 900 | Baza wiedzy | ⬜ (sekcja bez pozycji) | Ciężar pracy wg liczby plików `sites/`: **Stan (65)**, Administracja (42), Eksploatacja (39), Katalogi (27) - reszta po 1-4. ### Moduł „Studnie" (`wells.*`) - odklejony od menu `routes/web.php` ma pełny CRUD studni (`wells.index/create/store/edit/update`), widoki istnieją, ale **`config/navigation.php` nigdzie go nie wskazuje** - pozycja „Stan studni" (site301) ma `route => null`. Moduł jest osiągalny wyłącznie przez wpisanie URL-a. Do decyzji: podpiąć pod „Stan studni" czy pod inną pozycję. Pochodzenie: lista z `site401.php` (przepisana bez N+1), formularze z `site301A/E/inf`. `WellOperationController` bierze się z tej samej grupy `site401` - te dwa moduły łatwo pomylić. ## Pułapki przy czytaniu legacy - **Duża część drzewa to martwy kod.** Przed edycją potwierdzić, że plik jest żywy: `sites/backup/` (23 pliki), kopie z datą w nazwie (`20161228_soap.php`, `20170130_soap.php`, `20210926_soap.php`), skrypty jednorazowe (`naprawa_20210312.php`, `repair_20210313_data.php`, `rollback.php`, `test*.php`), pięć wariantów tego samego importera `soap_of_while{,_back,_last,_manual,_new}.php`, klony raportów per miesiąc (`rep_002_wrze_print.php`). - **Ścieżki twardo wpisane w `.bat`** potrafią wskazywać na *inną kopię* aplikacji (`reports/rep_003_hours.bat` kieruje na `htdocs\trzeciTestowy\`) - sprawdzić, zanim się założy, że dany skrypt to ten działający. - **Etykiety UI**: `language/{polish,english,german}.php`, zmienne `$lab_*`. `polish.php` (45 kB) jest źródłem prawdy; `english.php`/`german.php` (po ~19 kB) mają braki. SoftSPM_2 ma `SetLocale`, ale **zero wywołań `__()`** - tłumaczenia to osobny, jeszcze nierozpoczęty etap. - **Środowisko legacy**: PHP 5.4/5.6 + usunięte `ext/mysql` (`mysql_connect`), dlatego uruchamia się je tylko starym XAMPP-em (`C:\Programy\xampp_old\php\php.exe`). Facet Eclipse w `.settings/` kłamie, że to PHP 8.2.