# Plan: Wyświetlanie downtime per shift, per dzień

> **STATUS:**
> - ✅ **Faza 1 DONE (2026-04-05)** — `shift_code` saved to `llx_planning_downtime` on INSERT from ScanStation (commit `888dd9c`); planning tooltip shows `[shift_code]` prefix per entry (commit `f662e97`)
> - ✅ **Faza 2 DONE (2026-04-05)** — `SS_SHIFT_START` exported from `scan_station.php`; `getShiftDate()` implemented in JS; `loadDtBar()` uses `getShiftDate()`; DT panel default date uses `getShiftDate()`; `get_ws_mos` returns `shift_start`; label changed to `⏱️ Shift downtime:` (commit `bf4cc35`)

---

Data: 2026-04-04

---

## Problem

Pasek downtime używa zmiennej `SS_TODAY` (data kalendarzowa `YYYY-MM-DD`) do zapytania SQL.
Jeśli `shift_start = 6`, zmiana robocza trwa od 06:00 do 06:00 następnego dnia.
Operator logujący downtime o godzinie 02:00 jest nadal w tej samej zmianie co wczoraj,
ale data kalendarzowa przeszła już na "dzisiaj" — pasek pokazuje zero.

---

## Rozwiązanie

### Idea

Zamiast `SS_TODAY` (zawsze bieżąca data kalendarzowa) używamy funkcji `getShiftDate()`,
która oblicza datę **aktualnej zmiany**:

- Jeśli bieżąca godzina >= `shift_start` → data zmiany = dzisiaj  
- Jeśli bieżąca godzina < `shift_start` → data zmiany = wczoraj (wciąż w poprzedniej zmianie)

Przykłady:

| `shift_start` | Godzina bieżąca | `getShiftDate()` |
|---------------|-----------------|-----------------|
| 6             | 07:30           | dzisiaj          |
| 6             | 04:00           | wczoraj          |
| 22            | 23:00           | dzisiaj          |
| 22            | 01:00           | wczoraj          |

---

## Zmiany do wdrożenia

### 1. `scan_station.php` — eksport `SS_SHIFT_START`

Dodać zapytanie do `llx_planning_ws_config` dla wybranego WS i wyeksportować:

```php
$shiftStart = 0;
$sqlShift = "SELECT shift_start FROM ".MAIN_DB_PREFIX."planning_ws_config"
          . " WHERE fk_ws = ".(int)$currentWsId." AND entity = ".(int)$conf->entity." LIMIT 1";
$resShift = $db->query($sqlShift);
if ($resShift && ($objShift = $db->fetch_object($resShift))) {
    $shiftStart = (int)$objShift->shift_start;
}
```

```js
var SS_SHIFT_START = <?= (int)$shiftStart ?>;  // np. 6
```

Domyślnie `0` jeśli brak konfiguracji WS.

---

### 2. `ajax/scan_action.php` — `shift_start` w odpowiedzi `get_ws_mos`

Akcja `get_ws_mos` jest już wywoływana przy każdej zmianie WS.
Dodać `shift_start` do zwracanego JSON, żeby `SS_SHIFT_START` aktualizowało się
dynamicznie przy przełączaniu stanowiska (bez przeładowania strony).

```php
echo json_encode(array(
    'status'      => 'ok',
    'mos'         => $mos,
    'shift_start' => (int)$shiftStart,   // ← nowe pole
));
```

---

### 3. `js/scanstation.js` — funkcja `getShiftDate()`

```js
function getShiftDate() {
    var h = (typeof SS_SHIFT_START !== 'undefined') ? SS_SHIFT_START : 0;
    var d = new Date();
    if (d.getHours() < h) d.setDate(d.getDate() - 1); // wciąż w poprzedniej zmianie
    return d.toISOString().slice(0, 10);
}
```

**Gdzie używać zamiast `SS_TODAY`:**

- `loadDtBar()` — zapytanie `get_dt_summary` → `date: getShiftDate()`
- Otwarcie panelu downtime — domyślna data w polu `$dtDate.value = getShiftDate()`
- Etykieta paska: `"⏱️ Today's downtime:"` → `"⏱️ Shift downtime:"`
- Handler zmiany WS: po odebraniu `shift_start` z `get_ws_mos` → `SS_SHIFT_START = resp.shift_start` przed wywołaniem `loadDtBar`

---

### 4. `ajax/scan_action.php` — `get_dt_summary` — bez zmian

Już filtruje po `downtime_date = $date` (klient przekazuje prawidłową datę zmiany).

---

### 5. `planning/downtime_list.php` — kosmetyka (opcjonalnie)

Aktualnie grupuje wiersze po dacie kalendarzowej.
Można dodać kolumnę **"Zmiana"** pokazującą godzinę startu (np. `Zmiana 06:00`).
Sama data przechowywana w DB będzie poprawna po wdrożeniu kroków 3+4, więc
zmiana w liście jest wyłącznie wizualna.

---

## Co się NIE zmienia

| Element | Powód |
|---------|-------|
| Schemat DB (`downtime_date DATE`) | Data zmiany obliczana w JS to nadal `YYYY-MM-DD` — mapuje się bezpośrednio |
| INSERT w `scan_action.php → downtime` | Używa `dt_date` z POST — poprawna data przyjdzie z JS |
| Siatka planowania | Agreguje downtime po `downtime_date` per WS — działa poprawnie |
| Logika edycji/usuwania wpisów | Działają na `rowid` — niezależne od daty |

---

## Pliki do modyfikacji

| Plik | Zmiana |
|------|--------|
| `scan_station.php` | + zapytanie `shift_start`, + eksport `SS_SHIFT_START` |
| `ajax/scan_action.php` | + `shift_start` w odpowiedzi `get_ws_mos` |
| `js/scanstation.js` | + `getShiftDate()`, aktualizacja `loadDtBar`, domyślna data panelu, handler WS, etykieta paska |
| `planning/downtime_list.php` | + kolumna "Zmiana" w nagłówku grupowania (opcjonalne) |
