Revize klientského reportu
Pokud klient požádá o úpravu už odeslaného reportu, vytvoříte revizi. Originální verze (v1) zůstává nedotčená — klient ji má v e-mailu — a vy editujete novou verzi (v2, v3, …).
Proč revize a ne přímá úprava?
Sent report je immutable ze dvou důvodů:
- Důvěra klienta: PDF, které jste poslali, musí odpovídat tomu, co máte v systému. Kdybyste ho upravili po odeslání, klient by měl jiné PDF než vy.
- Audit trail: Můžete kdykoli zpětně doložit, co přesně bylo odesláno — důležité při sporných fakturách.
Jak vytvořit revizi
- Klientské reporty → najděte sent report.
- Klikněte na Revidovat (nebo otevřete report a klikněte tlačítko v hlavičce).
- Systém vytvoří draft v2 s identickými řádky jako v1.
- Editujete v2 (sloučíte/upravíte/přidáte/smažete řádky).
- Klikněte Odeslat klientovi — v2 se stane sent.
Po odeslání:
- v1 zůstává sent, immutable, dohledatelná v seznamu.
- v2 je sent revision number 2.
- v seznamu reportů vidíte badge v2 vedle čísla (např. "FV-Acme-březen 2026 — v2").
Co se zkopíruje do v2
- Všechny řádky z v1 (description, durationMinutes, amount, projectName, sortOrder, entityType).
- Source pointers (
source_entry_ids,source_expense_ids). - Klientské metadata (název, období, e-mail příjemce).
Co se NEzkopíruje: stav sent + sent_at + sent_to (v2 začíná jako draft).
Řetězec revizí
Verze jsou propojené přes self-FK revisionOfId:
v1 (sent) ← revisionOfId ← v2 (sent) ← revisionOfId ← v3 (draft)
revision_number je v client_reports.revision_number integer (default 1, increment per revision). Latest revision je dohledatelná přes max(revision_number) v chain.
Sprint 91.5 — revize jsou exempt z duplicate gate
Sprint 91.5 zavedl 3-vrstvou ochranu proti duplicitním sent reportům per (klient × overlapping period). Revize jsou explicitně exempt — můžete vytvořit v2/v3/v4 pro stejné období, protože jsou propojené přes revisionOfId chain.
Sprint 92 — co se stane když Karel revidoval report po vystavení faktury
Pokud máte:
- Sent report v1 → vystavili jste fakturu (Sprint 92 invoice from client report).
- Karel teď revidoval report → vznikla v2 (draft).
Faktura stále zrcadlí v1 (snapshot). Sprint 92 je snapshot, ne continuous mirror — proto faktura zůstává konzistentní s tím, co klient dostal.
Pokud chcete fakturu aktualizovat na v2:
- Otevřete fakturu v
/invoicing. - V sekci "Vytvořeno z reportu" klikněte Aktualizovat z reportu.
- Confirm dialog — řádky se přepíší podle latest revision (v2).
- Faktura má teď řádky podle v2.
Snapshot pattern znamená, že karel může revidovat report bez vlivu na fakturu. Refresh je explicit user action — Michala (účetní) vědomě rozhodne, zda fakturu upravit podle revize, nebo nechat originální verzi.