# OpenOrderBook — Analiza i plan poprawek

## 🔴 Krytyczne

1. ✅ **Brak kontroli dostępu** (`restrictedArea()` / `isModEnabled()`)
   - Dotyczy: `paper_work.php`, `completed.php`, `arrears.php` — top sekcja
   - **Zasada**: każdy zalogowany użytkownik może CZYTAĆ zamówienia, ale modyfikacja (save, create SO, delete) wymaga uprawnień
   - Do zrobienia: dodać `isModEnabled()` check + oddzielić uprawnienia read vs write

2. ✅ **N+1 w widoku listy** — 63 zapytania na 20 wierszy
   - `Societe::fetch()` per row (~line 574–643) — można zastąpić JOIN
   - `User::fetch()` per row CAŁKOWICIE ZBĘDNY — dane już są w `$obj` z głównego JOIN
   - `SELECT action, COUNT(*) GROUP BY action` per row — potrzebny bulk
   - Dotyczy też `completed.php` identycznie

3. ✅ **`save_all` nigdy nie pokazuje błędów** — sprawdza `$GLOBALS['mesgs']` zamiast `$_SESSION['dol_events']`
   - Przekierowanie następuje zawsze, nawet po błędzie SQL (~line 384–390)

## 🟠 Średnie

4. ✅ **Auto-append nowego wiersza nie działa** — błędny selektor JS `line_no_*` zamiast `line_no[]` (~line 107, 56 w paper_work.js)
5. ✅ **Numeracja wierszy JS zawsze =20** — ten sam błąd selektora
6. ✅ **DELETE przez GET link** z tokenem zamiast POST form (~line 636, 1094)
7. ✅ **`contracted_month`** — VARCHAR vs `<input type="date">`, niespójność ze schematem

## 🟡 Niskie / Info

8.  ✅ `SHOW TABLES` przy każdym request (~line 22) — brak cache
9.  ✅ Dropdown klientów bez LIMIT (~line 695) — ładuje wszystkich klientów
10. ✅ `$fk_soc` w `customerpn_autocomplete.php` — odbierany ale nigdy nie używany w SQL (brak filtrowania po kliencie)
11. ✅ **CSS osierocone**: `.oob-ws-badge`, `.oob-ws-icon`, `a:has(.oob-ws-badge)` — zostały po usunięciu kolumny MACHINE
12. ✅ 3 nieużywane tabele w schemacie: `llx_openorderbook_customer_pn`, `llx_openorderbook_line_supplier`, `llx_openorderbook_link`
13. ⏳ 5 funkcji subcon `// TODO` w `openorderbook_mo_subcon.lib.php` (~line 160–270) — stubs zwracające -1
14. ✅ ~15x `console.log()` w `paper_work.js` — produkcyjny plik
15. ✅ **Column name injection** w `oob_subcon_set_status()` — `$db->escape()` na nazwie kolumny zamiast whitelist (~line 156)
16. ✅ `value[]` (SOLD VALUE) przesyłany w POST ale nigdy nie czytany przez `save_all` — dead weight
17. ✅ `applyAutocompleteSelection()` w JS — nigdy nie wywołana, dead code
18. ✅ JS: `step="0.1"` server-rendered vs `step="0.01"` JS-appended dla QTY/PRICE — niespójność
19. ✅ `$_SERVER['PHP_SELF']` w `action=` formularzy (~line 552, 675) — lepiej `dol_buildpath()`
20. ⏳ `arrears.php` — pusty stub bez funkcjonalności
21. ✅ Brak linku z paper order do powiązanych SO w widoku listy
