# Planning — Swap Job / Locked MO Bug

> **STATUS: ✅ FIXED — 2026-04-05** — commits `b0b522a` (lock transfer on drag) and `ca81b29` (skip transfer when target already locked)

## Kontekst

Moduł: **Planning** (`planning.php`)
Funkcja: przeciąganie i przestawianie kolejności MO (swap job / drag & drop row)

---

## Definicje

| Termin | Znaczenie |
|--------|-----------|
| **Locked MO** | MO z ustawionym `Date Start Planned` — zakotwiczone w czasie, stanowi punkt startowy kalkulacji harmonogramu |
| **Swap** | Zamiana kolejności dwóch MO w tabeli (przeciągnięcie wiersza) |
| **Top position** | Pierwsza pozycja na liście MO dla danego workstation — od niej startuje kalkulacja |

---

## Stan przed swapem (AS-IS — przykład)

```
Poz. │ MO           │ Date Start Planned │ Lock │ Uwagi
─────┼──────────────┼────────────────────┼──────┼──────────────────────────
  1  │ MO2604-0002  │ 04/04 (Sat)        │  🔒  │ locked — punkt startowy kalkulacji
  2  │ MO2604-0003  │ —                  │      │ brak daty, kalkulowana względem poz. 1
  3  │ MO2604-0005  │ —                  │      │
  4  │ MO2604-0006  │ —                  │      │
```

Kalkulacja godzin przebiega poprawnie: start = `04/04`, MO2604-0002 → MO2604-0003 → …

---

## Problem — po swapie (BUG)

Operator przestawia MO2604-0003 na pozycję 1 (powyżej MO2604-0002):

```
Poz. │ MO           │ Date Start Planned │ Lock │ Uwagi
─────┼──────────────┼────────────────────┼──────┼──────────────────────────
  1  │ MO2604-0003  │ —                  │      │ ← NOWY TOP, bez daty
  2  │ MO2604-0002  │ 04/04 (Sat)        │  🔒  │ lock pozostał na MO2604-0002
  3  │ MO2604-0005  │ —                  │      │
  4  │ MO2604-0006  │ —                  │      │
```

**Skutek:** Kalkulacja jest rozjechana — MO2604-0003 na poz. 1 nie ma daty startowej, więc harmonogram nie potrafi poprawnie wyliczyć godzin dla żadnego kolejnego MO.

---

## Oczekiwane zachowanie (TO-BE)

> **Reguła:** `Date Start Planned` (lock) jest właściwością **pozycji TOP**, nie konkretnego MO.
> Przy każdym swapie, który zmienia TOP, lock musi zostać przeniesiony na nowe MO zajmujące pozycję 1.

### Algorytm po swapie

```
1. Wykryj, które MO przechodzi na pozycję TOP (rank = 1).
2. Sprawdź, czy poprzednie TOP miało Date Start Planned (lock).
3. Jeśli tak:
   a. Skopiuj Date Start Planned na nowe TOP MO.
   b. Zdejmij lock z poprzedniego TOP (lub zostaw datę, jeśli logika downstream tego wymaga).
4. Uruchom kalkulację harmonogramu od nowego TOP MO.
```

### Stan po swapie — poprawny

```
Poz. │ MO           │ Date Start Planned │ Lock │ Uwagi
─────┼──────────────┼────────────────────┼──────┼──────────────────────────
  1  │ MO2604-0003  │ 04/04 (Sat)        │  🔒  │ lock przeniesiony → nowy punkt startowy
  2  │ MO2604-0002  │ —                  │      │ lock zdjęty, data kalkulowana z poz. 1
  3  │ MO2604-0005  │ —                  │      │
  4  │ MO2604-0006  │ —                  │      │
```

Kalkulacja startuje od MO2604-0003 `04/04` → godziny rozkładają się poprawnie.

---

## Przypadki brzegowe do obsłużenia

| Scenariusz | Zachowanie |
|------------|-----------|
| Swap dwóch MO, żadne nie jest TOP | Lock nie zmienia się — nie rób nic |
| Swap: MO z lockiem schodzi z TOP | Lock przeniesiony na nowe TOP |
| Swap: MO bez locka wchodzi na TOP, poprzednie TOP też bez locka | Brak locka — kalkuluj od `today` lub ostrzeż użytkownika |
| Drag & drop wielu pozycji naraz | Sprawdź finalną poz. 1 po wszystkich przesunięciach i zastosuj regułę |
| Ręczna edycja `Date Start Planned` na MO nie-TOP | Dozwolone, nie wpływa na lock TOP |

---

## Wpływ na widok

Po poprawnym swapie widok kalkulacji (`Planned hrs`, godziny w komórkach) powinien się odświeżyć automatycznie — tak samo jak po kliknięciu **Calc**.

---

## Lokalizacja kodu (do uzupełnienia)

- [ ] `planning.php` — handler swap/reorder rows
- [ ] funkcja kalkulacji harmonogramu — `recalcSchedule()` / odpowiednik
- [ ] zapis `date_start_planned` + flagi `locked` do bazy / state

---

## Status

- [ ] Bug potwierdzony
- [ ] Implementacja
- [ ] Testy (scenariusze powyżej)
- [ ] Deploy

---

# Planning — Mobile Display Review

## Kontekst

Moduł: **Planning** (`planning.php`)
Wszystkie zakładki / widoki modułu wymagają przeglądu i poprawek pod kątem wyświetlania na urządzeniach mobilnych (szerokość ekranu ≤ 768 px).

---

## Przegląd zakładek i problemów

### 1. Główny widok — tabela harmonogramu

**Opis:** Tabela z kolumnami tygodni (Week 14, 15, 16…) i datami, wierszami MO.

| Element | Problem na mobile |
|---------|-------------------|
| Tabela tygodni/dat | Poziomy overflow — kolumny wychodzą poza ekran, brak poziomego scrolla lub jest niezauważalny |
| Kolumna „Job + Info" | Zbyt wąska lub ucinana przez overflow tabeli |
| Belka nagłówkowa (Avail hrs / Planned hrs / Unplanned) | Gubi się przy scrollowaniu poziomym — nie jest frozen/sticky |
| Komórki z godzinami | Mała czcionka, trudne do tapnięcia |
| Oznaczenia tygodni (WEEK 14 / WEEK 15) | Colspan nie skaluje się — rozjeżdżają się nagłówki |

**Oczekiwane zachowanie:**
- Kolumna `Job` + `Info` zafixowana po lewej (`position: sticky; left: 0`).
- Reszta tabeli przewijalna poziomo z wyraźnym wskaźnikiem scrolla.
- Minimalny `touch target` dla komórek ≥ 44 px wysokości.

---

### 2. Pasek narzędzi (toolbar)

**Opis:** Górna belka z przyciskami: `Completed`, `Downtime`, filtry workstation (`FM7`, `LASER1`), `Weeks`, `active MOs`, `Sat`, `Sun`, `DT`, `Calc`, `Setup`.

| Element | Problem na mobile |
|---------|-------------------|
| Wszystkie przyciski w jednym rzędzie | Przepełnienie — przyciski wychodzą poza ekran lub zachodzą na siebie |
| Filtry workstation (FM7, LASER1…) | Przyciski toggle nie zawijają się — ucinane |
| Selector `Weeks` | Za mały — trudny do obsługi dotykiem |
| Przyciski `Calc` i `Setup` | Mogą być ukryte (poza ekranem) |

**Oczekiwane zachowanie:**
- Toolbar zawija się w 2–3 wiersze na mobile (`flex-wrap: wrap`).
- Filtry workstation mogą być zwinięte do dropdownu na małych ekranach.
- Przyciski `Calc` i `Setup` zawsze widoczne (priorytet wyświetlania).

---

### 3. Wiersz MO — kolumna „Info"

**Opis:** Każdy wiersz MO zawiera: numer MO, part, customer, progress bar, badges (B:, D:, R:, Fxxx).

| Element | Problem na mobile |
|---------|-------------------|
| Badges (B:20, D:2, R:18h, F1625) | Zawijają się nieestetycznie lub wypadają poza kolumnę |
| Progress bar | Może być niewidoczny przy wąskiej kolumnie |
| Numer MO + nazwa | Ucinane przez `overflow: hidden` bez `...` |

**Oczekiwane zachowanie:**
- Kolumna Info ma minimalną szerokość `min-width: 160px` i `overflow: hidden; text-overflow: ellipsis`.
- Badges zawijają się w 2 wiersze jeśli potrzeba.

---

### 4. Widok „Completed" (zakładka)

**Opis:** Lista zakończonych MO z historią.

| Element | Problem na mobile |
|---------|-------------------|
| Tabela wyników | Identyczny problem co główna tabela — poziomy overflow |
| Filtry daty / workstation | Mogą być poza ekranem |

**Oczekiwane zachowanie:**
- Tabela z poziomym scrollem lub uproszczony widok listy (card layout) na mobile.

---

### 5. Widok „Downtime" (zakładka)

**Opis:** Lista przestojów przypisanych do workstations.

| Element | Problem na mobile |
|---------|-------------------|
| Tabela przestojów | Kolumny dat rozjeżdżają się jak w głównym widoku |
| Przyciski edycji (✏️ 🗑️) | Zbyt małe touch targety |

**Oczekiwane zachowanie:**
- Przyciski edycji ≥ 44×44 px.
- Opcjonalnie: widok kart zamiast tabeli.

---

### 6. Modal / panel „Setup"

**Opis:** Konfiguracja parametrów planowania.

| Element | Problem na mobile |
|---------|-------------------|
| Modal może być szerszy niż ekran | Przycięty lub nie można go zamknąć |
| Pola formularza | Mogą być zbyt małe (font-size < 16px → iOS auto-zoom) |

**Oczekiwane zachowanie:**
- Modal `max-width: 100vw`, `overflow-y: auto`, `margin: 0`.
- `font-size ≥ 16px` na polach input (zapobiega auto-zoom na iOS).

---

## Priorytety napraw

| # | Problem | Priorytet | Wpływ |
|---|---------|-----------|-------|
| 1 | Tabela harmonogramu — sticky kolumna Job + horizontal scroll | 🔴 Krytyczny | Nieużywalność głównego widoku |
| 2 | Toolbar — flex-wrap | 🔴 Krytyczny | Ukryte przyciski Calc/Setup |
| 3 | Touch targety (komórki, przyciski edit) | 🟠 Wysoki | UX operatora na tablecie/telefonie |
| 4 | Modal Setup — max-width | 🟠 Wysoki | Nie można zapisać konfiguracji |
| 5 | Kolumna Info — badges wrapping | 🟡 Średni | Estetyka |
| 6 | Widoki Completed / Downtime — card layout | 🟡 Średni | Czytelność |

---

## Zalecane breakpointy

```css
/* Mobile */
@media (max-width: 768px) { ... }

/* Tablet */
@media (min-width: 769px) and (max-width: 1024px) { ... }
```

---

## Status mobile review

- [ ] Główna tabela harmonogramu — sticky + horizontal scroll
- [ ] Toolbar — flex-wrap
- [ ] Touch targety
- [ ] Modal Setup
- [ ] Zakładka Completed
- [ ] Zakładka Downtime
- [ ] Testy na urządzeniach (iOS Safari, Android Chrome)
- [ ] Deploy
