# Aktualizacja `date_end_planned` przy Calc — analiza

Data: 2026-03-27

## Idea

Algorytm w `calc.php` po zbudowaniu `$newSchedule` **już wie** dokładnie kiedy
kończy się każde MO — to ostatni `schedule_date` dla danego `fk_mo`.
Można go bezpośrednio zapisać do `llx_mrp_mo.date_end_planned`.

---

## Implementacja (szkic)

Dodać po bloku `DELETE + INSERT`, wewnątrz tej samej transakcji:

```php
// Zbierz ostatni dzień harmonogramu dla każdego MO
$moLastDate = array();
foreach ($newSchedule as $sr) {
    $moId = $sr['fk_mo'];
    if (!isset($moLastDate[$moId]) || $sr['schedule_date'] > $moLastDate[$moId]) {
        $moLastDate[$moId] = $sr['schedule_date'];
    }
}

// UPDATE date_end_planned na każdym MO
foreach ($moLastDate as $moId => $lastDate) {
    $db->query("UPDATE " . MAIN_DB_PREFIX . "mrp_mo
                SET date_end_planned = '" . $db->escape($lastDate . ' 23:59:00') . "'
                WHERE rowid = " . (int)$moId);
}
```

---

## Pytania projektowe do rozstrzygnięcia

| Kwestia | Opcja A | Opcja B |
|---|---|---|
| **Czas końca dnia** | Stały `23:59:00` | `shift_start + hours_allocated` (precyzyjniejsze) |
| **Nadpisywać zawsze?** | Tak — calc jest autorytatywny | Tylko gdy `date_end_planned IS NULL` |
| **MOs pominięte przez calc** (brak `qty_per_hr`, w pełni zrobione) | Zostawić bez zmian | Wyczyścić na `NULL` |
| **Uprawnienia** | `editjob` już wymagane przez `calc.php` — wystarczy | — |

---

## Wartość praktyczna

- Pole `date_end_planned` jest już używane w gridzie do oznaczania **`pl-row-late`**
  (czerwony wiersz gdy termin minął i są jeszcze niewykonane sztuki)
- Lista MOs w Dolibarr (`/mrp/mo_list.php`) pokazuje `Date end planned` —
  po każdym calc byłoby automatycznie aktualne
- Możliwość filtrowania/sortowania MOs po wyliczonej dacie zakończenia

---

## Ryzyko

Jeśli `date_end_planned` jest używane jako **obietnica terminu dla klienta**
(ustawiona ręcznie), calc by ją bezpowrotnie nadpisał.

**Ewentualne rozwiązanie:** dodatkowe extrafield `date_promised` (termin klienta)
oddzielone od `date_end_planned` (termin wyliczony przez calc).
