Animowane kompendium · modelowanie domeny

Archetypy w praktyce

Ten sam szkielet pod setką kostiumów: klient banku, pacjent i kierowca floty to jeden Party; kredyt, paczka i taryfa to jeden Product z Pricing. Nauczysz się widzieć te szkielety w wymaganiach, dobierać ich konfigurację i nie przekombinować. Przewijaj — diagramy ruszają same.

od rozpoznania do konfiguracji 🧠
przewiń ↓

Jak czytać to kompendium

mechanizmy, nie definicje do wkucia

To nie jest katalog klas do przepisania. Każdy rozdział pokazuje jeden mechanizm: jakie zdania w wymaganiach go zdradzają, jak wygląda jego szkielet, jakie ma konfiguracje i gdzie łatwo się wyłożyć. Prawie każdy rozdział ma diagram, który możesz klikać. Ma też przycisk 💥, który psuje model w typowy sposób, żebyś zobaczył skutki.

Podstawą jest szkolenie Archetypy Oprogramowania (Bartłomiej Słota, Jakub Pilimon, Sławomir Sobótka) i jego publiczne repozytorium kodu. Szkolenie traktuje archetypy jako uzupełnienie DDD i architektury. Do tego dochodzi literatura: Arlow i Neustadt Enterprise Patterns and MDA, Fowler Analysis Patterns, Coad Java Modeling in Color with UML, Evans Domain-Driven Design i Silverston The Data Model Resource Book. Nazwy klas w tekście (np. PartyRelationship) pochodzą z repozytorium szkolenia. Kodu z repozytorium nie kopiujemy: jest na licencji CC BY-NC-SA 4.0.

Kompendium ma poziomy. Rozdziały i bloki mają znaczki: L1 podstawy, L2 praktyk, L3 ekspert, L4 mistrz (studia przypadków i antywzorce). Głębokość wybierasz przełącznikiem w lewym dolnym rogu. Mapa poniżej przenosi do dowolnego rozdziału i zaznacza przeczytane.

Zaczynasz od zera? Ustaw głębokość 1 i przeczytaj najpierw Część 0. Wyjaśnia, czym są archetypy, jak z nich korzystać krok po kroku i od którego zacząć. Potem w każdym rozdziale archetypu czytaj w tej kolejności: blok 🔰 „Co to jest”, schemat anatomii, „Kiedy stosować, a kiedy nie”, tabelę opcji i „Minimum na start”. Dopiero po nich przychodzą przykłady z repozytorium, nazwy klas i bloki eksperckie. Głębokość zwiększysz, gdy podstawy przestaną zaskakiwać.

Kolory archetypów są stałe w całym tekście: QuantityPartyProductPricingRulesInventoryOrderingAccountingSchedulingPlan vs Execution

🧠 Pomyśl

Kierowca firmy kurierskiej tankuje na stacji. Płaci kartą flotową wydaną przez firmę leasingową. Firma leasingowa obciąża potem kuriera, a on obciąża swojego klienta za paliwo w cenie usługi. Ilu „klientów” jest w tej historii i ile różnych modeli danych potrzebujesz, żeby ją obsłużyć? Zapamiętaj swoją odpowiedź. Wrócimy do niej na końcu.

Część 0

Start: archetypy od zera

Dla osób, które słyszą o archetypach pierwszy raz. Czym są, jak z nich korzystać krok po kroku, gdzie siedzą w kodzie i od którego zacząć.

Archetyp w 5 minut

ten sam problem rozwiązany raz, porządnie

W typowej firmie Jan Kowalski istnieje trzy razy. Dział sprzedaży ma go w CRM jako „klienta”. Księgowość ma go w programie do faktur jako „kontrahenta”. Sklep internetowy ma go jako „użytkownika”. Każdy z tych systemów zbudował inny zespół, w innym roku, z innym modelem danych. Działa to do pierwszej przeprowadzki Jana.

▶ Jeden człowiek, trzy kartoteki przeprowadź Jana, potem połącz kartoteki w jeden Party
Trzy systemy, trzy kartoteki tego samego człowieka.
Systemy, dane i adresy są wymyślone. W prawdziwym modelu Party adres jest osobnym bytem z zastosowaniami (rozliczeniowy, dostawy), a dokumenty, takie jak faktura, zapisują jego migawkę z chwili wystawienia.

Problem nie polega na tym, że ktoś źle napisał kod. Polega na tym, że każdy zespół od nowa wymyślił pojęcie, które ludzkość dawno opisała. „Ktoś, kto występuje w różnych rolach” to stary, dobrze poznany problem. Tak samo „rzecz z katalogu kontra konkretny egzemplarz”, „cena zależna od warunków” albo „saldo, które musi się zgadzać”.

Archetyp to gotowy, sprawdzony szkielet modelu dla takiego powtarzalnego pojęcia. Mówi, z jakich części pojęcie się składa, które części są obowiązkowe, które opcjonalne i jakie pytania zadać biznesowi, żeby dobrać wariant. Najbliższa analogia z kuchni to przepis bazowy, np. ciasto drożdżowe. Mąka, drożdże i wyrastanie są zawsze. Kruszonka, śliwki albo ser to warianty. Nie wymyślasz ciasta od zera dla każdej okazji. Bierzesz przepis i dobierasz dodatki do gości.

🔰 Trzy problemy, które archetypy rozwiązują
Wymyślanie od nowaKażdy projekt modeluje „klienta”, „cenę” i „saldo” po swojemu, z tymi samymi błędami. Archetyp daje gotowy szkielet i listę znanych pułapek. IfologiaKod pełen warunków typu „jeśli klient firmowy, to…”, „jeśli produkt X, to…”. Archetyp zamienia takie warianty w dane: role, typy, reguły i kalkulatory, które dodaje się bez zmiany kodu. Brak historiiModel, który zna tylko „teraz”, nie odpowie na pytania „ile kosztowało w lutym?”, „kto był prezesem rok temu?”, „jaki był plan wczoraj?”. Archetypy mają wbudowane okresy ważności, wersje i niezmienne zapisy.

Słowniczek startowy

Te dziesięć pojęć wraca w każdym rozdziale. Wystarczy je rozumieć intuicyjnie. Dokładne definicje są w rozdziałach i w słowniku.

Typ i egzemplarzTyp to opis z katalogu („iPhone 15, 256 GB”). Egzemplarz to konkretna rzecz („ten telefon z tym numerem IMEI”).Jak przepis i upieczone według niego ciasto.
RolaCharakter, w jakim ktoś występuje: klient, dostawca, pracownik, płatnik. Jedna osoba ma wiele ról naraz.Jak kapelusze, które zmieniasz, zostając tą samą osobą.
RelacjaNazwane powiązanie dwóch ról, np. „pracownik zatrudniony przez pracodawcę”, zwykle z datą początku i końca.Jak umowa między dwiema stronami.
WażnośćOkres, w którym coś obowiązuje: od kiedy do kiedy. Mają ją ceny, relacje, uprawnienia i bonusy.Jak data ważności na bilecie miesięcznym.
WersjaKolejny wariant tej samej rzeczy. Stary nie znika, tylko przestaje obowiązywać.Jak kolejne wydania podręcznika.
MigawkaKopia danych z chwili zdarzenia, zapisana w dokumencie. Faktura pamięta adres z dnia wystawienia.Jak zdjęcie: osoba się zmienia, zdjęcie nie.
BlokadaZajęcie zasobu przez kogoś, często na określony czas, po którym blokada sama wygasa.Jak ręcznik na leżaku przy basenie.
Zapis i saldoZapis to niezmienny wpis „+100” albo „−30”. Saldo to suma zapisów. Nie nadpisujesz salda, tylko dopisujesz zapisy.Jak wyciąg z konta bankowego.
Plan i wykonaniePlan to osobno zapisany zamiar („300 sztuk w marcu”). Wykonanie to fakty. Porównuje się je jawnymi regułami.Jak budżet domowy i paragony.
PolitykaReguła biznesowa zapisana jako osobny, wymienny element modelu, np. „kto może mieć jaką rolę”.Jak regulamin, który można zmienić bez przebudowy budynku.
❓ Nie ma głupich pytań
P:
Czy muszę znać wszystkie archetypy, żeby zacząć?
O:
Nie. Większość systemów zaczyna od dwóch, trzech: kto (Party), co (Product) i ile (Pricing albo Accounting). Resztę dokładasz, gdy w wymaganiach pojawi się zdanie, które jej potrzebuje. Rozdział Mapa decyzji na start pomaga wybrać pierwsze.
P:
Czy archetyp to biblioteka, którą instaluję?
O:
Nie. To sposób modelowania: części, reguły i pytania. Możesz go zaimplementować w dowolnym języku i bazie. Repozytorium szkolenia pokazuje przykładową implementację w Javie, ale celem jest zrozumienie szkieletu, a nie kopiowanie klas.
P:
Czy archetypy nie skomplikują prostego systemu?
O:
Mogą, jeśli wdrożysz wszystkie opcje naraz. Dlatego każdy rozdział ma sekcję „Minimum na start”. Archetyp w wersji minimalnej jest zwykle tak samo prosty jak model „na szybko”, ale ma miejsce na rozbudowę bez przepisywania.
📌 W punktach
  • Archetyp to sprawdzony szkielet modelu dla pojęcia, które powtarza się w prawie każdym biznesie.
  • Ma części obowiązkowe i opcjonalne. Opcje dobierasz do wymagań, jak dodatki do przepisu bazowego.
  • Rozwiązuje trzy problemy: wymyślanie od nowa, ifologię i brak historii.
  • Zaczynasz od dwóch, trzech archetypów w wersji minimalnej.

Jak korzystać z archetypów: proces w 5 krokach

od zdania w wymaganiach do modelu

Archetypy nie są listą klas do skopiowania. Są narzędziem do czytania wymagań. Ten sam proces działa dla sklepu, banku i szpitala. Przejdziemy go na jednym przykładzie: wypożyczalni rowerów miejskich.

  1. Wypisz wymagania jako zdania. Rozmawiaj z biznesem i zapisuj pełne zdania z liczbami i wyjątkami: „pierwsze 20 minut za darmo, potem…”, a nie hasła w rodzaju „cennik”.
  2. Znajdź sygnały. W każdym zdaniu zaznacz frazę, która coś zdradza: „osoba albo firma” (role), „numer ramy” (egzemplarz), „zarezerwować na 15 minut” (blokada z czasem), „saldo” (konto). Ściąga sygnałów jest w rozdziale Jak rozpoznać archetyp.
  3. Dobierz konfigurację. Każdy archetyp ma opcje. Rower to egzemplarz śledzony indywidualnie, a nie „5 sztuk na stanie”. Stacja to pula stojaków. Opcje każdego archetypu znajdziesz w jego tabeli „Opcje i konfiguracje”.
  4. Połącz archetypy. Archetypy rozmawiają przez identyfikatory (przejazd zna identyfikator roweru), migawki (przejazd pamięta dane użytkownika z chwili startu) i zdarzenia („przejazd zakończony” uruchamia opłatę). Nigdy przez wspólne tabele.
  5. Zacznij od minimum. Zbuduj najprostszą wersję, która obsłuży dzisiejsze zdania. Opcje dokładaj, gdy pojawi się nowe zdanie, które ich wymaga. Na koniec sprawdź model z biznesem na konkretnych scenariuszach: „klient rezerwuje, rezygnuje po minucie, ile płaci?”.
▶ Wypożyczalnia rowerów krok po kroku przejdź pięć kroków, potem zobacz model z rzeczowników
Klikaj „Krok ▶”.
Wymagania, kwoty i czasy są wymyślone. Przykład wypożyczalni wraca w ćwiczeniu z rozdziału Czym jest archetyp. Konfiguracje to jedna z rozsądnych odpowiedzi, a nie jedyna.
KrokPytanie kontrolneSygnał, że trzeba wrócić
1. ZdaniaCzy każde wymaganie ma czasownik i przykład z liczbami?Na liście są same rzeczowniki: „klient”, „cennik”, „rezerwacja”.
2. SygnałyCzy każde zdanie ma przypisany co najmniej jeden archetyp?Zdanie „nie pasuje nigdzie”. Często to proces albo raport, a nie nowe pojęcie.
3. KonfiguracjaCzy przy każdej opcji jest zdanie z wymagań, które jej potrzebuje?Opcja jest w modelu „bo może się przyda”.
4. PołączeniaCzy archetypy łączą tylko identyfikatory, migawki i zdarzenia?Jeden moduł czyta tabele drugiego albo trzyma referencję do jego obiektu.
5. MinimumCzy da się to zbudować w kilka dni i sprawdzić na scenariuszach?Pierwsza wersja ma wszystkie opcje wszystkich archetypów.
⚠️ Uwaga: nie modeluj z rzeczowników

Najczęstszy błąd początkujących to zrobienie klasy z każdego rzeczownika w wymaganiach. Powstają wtedy Uzytkownik i UzytkownikFirmowy, Rower i RowerElektryczny, Cennik i CennikAbonamentowy. Każda para to ten sam archetyp w innym kostiumie, a różnica między nimi powinna być daną (rolą, typem, wersją), a nie klasą.

✏️ Zaostrz ołówek

Siłownia: „Karnet miesięczny kosztuje 150 zł, studenci płacą 120 zł. Zajęcia grupowe mają 12 miejsc i zapisuje się na nie w aplikacji. Trener prowadzi zajęcia tylko z ważnym certyfikatem. Niewykorzystane wejścia z karnetu 10-wejściowego wygasają po 3 miesiącach.” Przejdź kroki 2–4.

Odpowiedź

Sygnały: „studenci” to rola klienta (Party) i warunek reguły ceny (Pricing lub Rules). „12 miejsc i zapisuje się” to Inventory: zajęcia w danym terminie jako pula o pojemności 12. „Ważny certyfikat” to kompetencja z okresem ważności w Party. „Wejścia wygasają po 3 miesiącach” to Accounting: konto wejść z ważnością zapisu i transakcją kompensującą. Połączenia: zapis na zajęcia zna identyfikator klienta i zajęć, a wejście na salę to zdarzenie, które zdejmuje jedno wejście z konta.

📌 W punktach
  • Pięć kroków: zdania, sygnały, konfiguracja, połączenia, minimum.
  • Sygnałem są frazy z liczbami, czasem i wyjątkami, a nie same rzeczowniki.
  • Archetypy łączą się przez identyfikatory, migawki i zdarzenia.
  • Pierwsza wersja ma tylko te opcje, których wymagają dzisiejsze zdania.

Gdzie archetyp siedzi w kodzie i architekturze

moduł z jedną fasadą

W kodzie archetyp to najczęściej osobny moduł: pakiet, biblioteka albo usługa z jednym wejściem (fasadą). W środku jest model archetypu, polityki, które zmienia biznes, i repozytorium do zapisu. Na zewnątrz wychodzą tylko identyfikatory, widoki i zdarzenia. Repozytorium szkolenia jest zbudowane właśnie tak: każdy archetyp to osobny moduł Maven (party, product, pricing, inventory, ordering, accounting i inne).

▶ Anatomia modułu archetypu kliknij warstwę
Schemat jest uproszczony. Nazwy w nawiasach to przykłady z repozytorium szkolenia. Zdarzenia mogą być wysyłane w tym samym procesie albo przez kolejkę, zależnie od architektury.

Co jest kodem, a co daną

Kod (zmienia programista)Dane (zmienia biznes, z wersją)
szkielet: Party ma role, transakcja sumuje się do zerajakie role i relacje istnieją i kto może je mieć
rodzaje kalkulatorów cenyparametry kalkulatorów: progi, stawki, okresy ważności
rodzaje reguł wyboru i warunkówkonkretne pakiety, promocje i ich kolejność
mechanizm blokad i kolejekczas trwania blokady, polityka kolejki, pojemności
mechanizm reguł księgowaniakonkretne reguły: kiedy naliczyć prowizję, podatek, bonus

Ta granica to poziom wiedzy (opisany szerzej w rozdziale Poziom wiedzy): typy i reguły są danymi, a kod zna tylko mechanizm. Nie przesadzaj jednak w drugą stronę. Jeśli wariant zmienia się raz na dwa lata, stała w kodzie jest tańsza niż ekran konfiguracji.

❓ Nie ma głupich pytań
P:
Czy każdy archetyp to osobny mikroserwis?
O:
Nie musi. Archetyp to granica modelu, a nie jednostka wdrożenia. Może być modułem w monolicie, tak jak w repozytorium szkolenia. Ważne, żeby inne moduły nie sięgały do jego wnętrza.
P:
Jak to się ma do DDD?
O:
DDD daje granice (bounded context) i wspólny język. Archetyp podpowiada, co włożyć do środka granicy. Wiele archetypów to obszary, które Evans nazywa poddziedzinami generycznymi (generic subdomains): potrzebne, ale nie wyróżniają firmy na rynku. Dlatego warto je modelować sprawdzonym szkieletem, a kreatywność zostawić dla domeny głównej.
P:
A baza danych?
O:
Każdy moduł ma swoje tabele. Między modułami przechodzą identyfikatory, a nie klucze obce do cudzych tabel. Raport, który potrzebuje danych z kilku modułów, czyta je przez fasady albo z osobnej bazy raportowej zasilanej zdarzeniami.
📌 W punktach
  • Archetyp to moduł: fasada, model, polityki, repozytorium, zdarzenia.
  • Szkielet jest kodem. Warianty biznesu są danymi z wersją.
  • Moduły wymieniają identyfikatory, migawki i zdarzenia, a nie tabele.

Dziesięć archetypów w pigułce

jedna karta na archetyp

Każda karta odpowiada na cztery pytania: czym archetyp jest, z czego się składa, po jakim zdaniu go poznać i jakie ma główne opcje. Szczegóły są w rozdziale, do którego prowadzi link.

Quantity i Money

Liczba zawsze razem z jednostką albo walutą.

Części

wartość, jednostka lub waluta, operacje sprawdzające jednostki

Sygnał

„litry”, „kWh”, „w euro”, „podziel na raty”

Opcje

konwersje jednostek, polityka zaokrągleń, alokacja kwot, procenty

Rozdział →
Party

Osoba albo organizacja, która występuje w wielu rolach.

Części

osoba lub organizacja, role, identyfikatory, adresy, relacje

Sygnał

„ten sam klient jest też dostawcą”, „kto był pełnomocnikiem w marcu?”

Opcje

polityki ról i identyfikatorów, relacje z ważnością, kompetencje

Rozdział →
Product

Co sprzedajesz: typ z katalogu i konkretny egzemplarz.

Części

typ, egzemplarz, cechy, wpis w katalogu, strategia śledzenia

Sygnał

„numer seryjny”, „partia”, „wariant”, „pakiet”, „wycofany z oferty”

Opcje

pięć strategii śledzenia, partie, pakiety z regułami, relacje produktów

Rozdział →
Pricing

Cena jako drzewo składników, z których każdy liczy osobny kalkulator.

Części

kalkulator, komponent, zależności, rozbicie ceny, wersje

Sygnał

„cena zależy od…”, „pierwsze 5 GB w cenie”, „ile kosztowało w lutym?”

Opcje

8 kalkulatorów, 3 interpretacje ceny, wersje z ważnością

Rozdział →
Rules

Wyjątki i promocje jako dane: kiedy działają, co robią i czego nie wolno.

Części

warunek (predykat), zmiana (aplikator), strażnik, łańcuch

Sygnał

„chyba że”, „dla VIP −10%”, „promocje się (nie) łączą”

Opcje

procent od bazy lub od wyniku, kwota, cena stała, strażnik marży, algebry

Rozdział →
Inventory

Co jest dostępne, ile i kto to zablokował.

Części

zasób, model dostępności, blokada z właścicielem, rezerwacja

Sygnał

„czy jest wolne?”, „zarezerwuj”, „lista oczekujących”

Opcje

egzemplarz, pula, slot czasu, grupy slotów, zasób złożony, kolejki

Rozdział →
Ordering

Zlecenie: kto zamawia, co, za ile i w jakim jest stanie.

Części

strony z rolami, linie, wycena linii, stany, porty do innych modułów

Sygnał

„zamawia dział, płaci spółka, odbiera oddział”, „status zamówienia”

Opcje

role na zamówieniu i liniach, stany wyceny, migawki, kompensacje

Rozdział →
Accounting

Saldo jako suma niezmiennych zapisów, a każda operacja się bilansuje.

Części

konto, zapis, transakcja, reguła księgowania

Sygnał

„saldo”, „limit”, „punkty”, „portfel”, „na dzień”

Opcje

typy kont, reguły księgowania, dwa zegary, ważność zapisów, korekty

Rozdział →
Scheduling

Harmonogram jako graf zależności, z którego wynikają daty.

Części

kroki, zależności, czasy trwania, porządek, ścieżka krytyczna

Sygnał

„nie wcześniej niż”, „po zakończeniu”, „co się opóźni, jeśli…”

Opcje

typy zależności (w repozytorium gotowy jest FS; SS/FF/SF i zwłoka to rozszerzenia), wykrywanie cykli, algorytmy grafowe

Rozdział →
Plan vs Execution

Plan zapisany jako osobny byt i porównywany z faktami jawnymi regułami.

Części

plan z wersjami, wykonanie, tolerancja, delta

Sygnał

„planowaliśmy, a wyszło”, „harmonogram rat a wpłaty”

Opcje

strategie tolerancji, rozdzielczość porównania, symulacje „co jeśli”

Rozdział →
📌 W punktach
  • Kto: Party. Co: Product. Ile: Quantity, Pricing, Rules. Czy wolne: Inventory.
  • Zlecenie: Ordering. Saldo: Accounting. Kolejność: Scheduling. Zamiar kontra fakt: Plan vs Execution.

Mapa decyzji na start

dziesięć pytań, Twoja ścieżka czytania

Nie musisz czytać wszystkiego. Zaznacz pytania, na które w Twoim projekcie odpowiedź brzmi „tak”. Dostaniesz listę rozdziałów do przeczytania najpierw. Pełne drzewo decyzyjne z konfiguracjami jest na końcu kompendium, w rozdziale Drzewo decyzyjne.

▶ Od którego archetypu zacząć? klikaj pytania
Kliknij pytania, które pasują do Twojego projektu.
Pytania są uproszczeniem sygnałów z rozdziału „Jak rozpoznać archetyp”. Przykład wypożyczalni zaznacza tylko najważniejsze pytania.
😌 Spokojnie

Jedno albo dwa zaznaczone pytania to dobry znak: masz mały, czytelny start. Kolejne archetypy przyjdą same, razem z nowymi zdaniami w wymaganiach. Dalej czytaj Część I, która uczy rozpoznawać archetypy w tekście wymagań.

Część I

Myślenie archetypami

Czym archetyp różni się od wzorca projektowego, po czym go poznać w wymaganiach i jak archetypy łączą się w system.

Czym jest archetyp

ten sam szkielet, inny kostium

Kredyt hipoteczny, przesyłka kurierska i sesja ładowania auta elektrycznego wyglądają jak trzy różne światy. Każdy ma jednak kogoś, kto kupuje, coś, co jest sprzedawane, cenę zależną od parametrów i zobowiązanie rozliczane w czasie. Pod kostiumem branży jest ten sam szkielet. Archetyp to nazwa takiego szkieletu razem z wiedzą, jak go zbudować.

Arlow i Neustadt definiują business archetype jako „primordial thing that occurs consistently and universally in business domains and business software systems”, czyli pierwotną rzecz, która występuje stale i powszechnie w dziedzinach biznesowych i w systemach, które je obsługują. Ich przykładem jest Party: identyfikowalna, adresowalna jednostka, która może mieć status prawny. Zwykle to osoba albo jakaś organizacja. Gdy archetypy współpracują w powtarzalny sposób, mamy archetype pattern. Według autorów współpraca Party, Product i Order jest podstawą niemal każdego biznesu, który sprzedaje towary lub usługi.

▶ Jeden szkielet, cztery kostiumy przełącz branżę, a potem spróbuj modelować osobno
Wybierz branżę.
Przypisania są uproszczone: jedna komórka to jeden przykład, a nie pełny model. Liczba „pojęć do utrzymania” jest ilustracyjna: liczy osobne klasy, które powstałyby przy modelu per branża.

Archetyp nie jest wzorcem projektowym w sensie Gang of Four. Wzorzec GoF porządkuje kod: jak obiekty tworzą się, składają i komunikują. Archetyp porządkuje pojęcia biznesowe: jakie są, jakie mają cechy i reguły oraz jak zmieniają się w czasie. W podsumowaniu transmisji o archetypach na devstyle.pl pada porównanie: wzorce projektowe są jak wzory skróconego mnożenia, a archetypy jak prawa fizyki, bo działają tak samo niezależnie od specyfiki biznesu. Ten sam tekst opisuje je jako „wieloaspektowe wzorce modelowania łączące funkcje, logikę i strukturę informacji”.

❓ Nie ma głupich pytań
P:
Czy to nie jest po prostu DDD?
O:
Nie. DDD daje granice (bounded context) i język (ubiquitous language). Nie mówi jednak, jak ma wyglądać model rezerwacji w środku tych granic. Archetyp podpowiada treść modelu. Szkolenie przedstawia te trzy warstwy jako uzupełniające się: DDD (granice i język), architektura (skalowalność i elastyczność) oraz archetypy.
P:
Czy archetyp to gotowa biblioteka do wpięcia?
O:
Raczej przepis z wariantami. Arlow i Neustadt zaznaczają w notacji, które części archetypu są opcjonalne (stereotyp «o»). Wariant wzorca dopasowany do konkretnego biznesu nazywają pleomorph, a samo zjawisko pleomorphism. Ten sam Party w banku ma identyfikatory podatkowe i relacje pełnomocnictwa. W przychodni ma uprawnienia zawodowe lekarza.
P:
Skąd wiem, że coś jest archetypem, a nie moim pomysłem?
O:
Arlow i Neustadt podają cechy: uniwersalny (występuje stale w różnych biznesach), wszechobecny (jest i w biznesie, i w oprogramowaniu), z głęboką historią (produkt istnieje od czasów handlu wymiennego) i oczywisty dla ekspertów dziedzinowych. Jeśli ekspert dziedzinowy nie rozpoznaje pojęcia, autorzy radzą zakwestionować, czy to naprawdę archetyp.
🤓 Dla dociekliwych: cztery kolory Coada

Wcześniej, w 1999 roku, Peter Coad, Eric Lefebvre i Jeff De Luca opisali w Java Modeling in Color with UML cztery bardzo ogólne archetypy oznaczane kolorami. Różowy to moment-interval: coś, co dzieje się w chwili lub przez okres i co trzeba śledzić z powodów biznesowych lub prawnych, np. sprzedaż lub wynajem. Żółty to role, czyli sposób uczestnictwa osoby, miejsca lub rzeczy. Niebieski to description, opis katalogowy, np. marka i model auta opisujące wiele fizycznych pojazdów. Zielony to party, place or thing: coś namacalnego i jednoznacznie identyfikowalnego. Klasyfikując klasę, pyta się po kolei: różowa? żółta? niebieska? Jeśli żadna, to zielona.

Arlow i Neustadt zauważają, że archetypy Coada są na dużo wyższym poziomie abstrakcji. Mimo to warto je znać. „Niebieski” opis to zalążek poziomu wiedzy, a „różowy” moment-interval to szkielet zamówień, rezerwacji i zapisów księgowych.

✏️ Zaostrz ołówek

Wypożyczalnia rowerów miejskich: użytkownik aplikacji, firma sponsorująca stacje, rower o numerze ramy, stacja dokująca z 20 miejscami, cennik „pierwsze 20 minut za darmo”, przejazd. Przypisz każde pojęcie do archetypu.

Odpowiedź

Użytkownik i sponsor to Party (osoba i organizacja w różnych rolach). Rower z numerem ramy to egzemplarz Product śledzony indywidualnie. Stacja z 20 miejscami to Inventory typu pula. Cennik to Pricing z kalkulatorem progowym po czasie. Przejazd to Ordering (zlecenie z cyklem życia) i źródło zapisów w Accounting.

📌 W punktach
  • Archetyp to powtarzalny szkielet pojęcia biznesowego razem ze sprawdzonym sposobem modelowania.
  • Wzorzec archetypów to powtarzalna współpraca archetypów (Party + Product + Order).
  • Archetyp ma części opcjonalne i warianty (pleomorfy). To przepis, a nie biblioteka.
  • DDD wyznacza granice i język, a archetyp podpowiada treść modelu w tych granicach.

Jak rozpoznać archetyp w wymaganiach

czasowniki i pytania, nie rzeczowniki

Klasyczna rada „podkreśl rzeczowniki, to będą klasy” prowadzi prosto do klas Kierowca, Firma, Klient i Pracownik, które po roku mają po 80% wspólnych pól. Archetyp zdradza się inaczej: przez zachowanie w czasie i przez pytania, których biznes jeszcze nie zadał, ale zada.

Sygnał w rozmowie lub w kodziePodejrzany archetypPytanie kontrolne
Ta sama osoba lub firma siedzi w kilku tabelach (klient, dostawca, pracownik)Party„A co, jeśli nasz pracownik zostanie też klientem?”
„Zależy od…” przy cenie, opłacie, prowizjiPricing„Ile kosztowało to 3 miesiące temu i dlaczego?”
Rabaty, wykluczenia, „chyba że”, wyjątki dla VIPRules„Kto zmienia tę regułę i jak często?”
Numer seryjny, partia, data ważności, pakiet, wariantProduct„Czy rozróżniamy egzemplarze, czy tylko liczymy sztuki?”
„Czy jest wolne?”, rezerwacja, „ile zostało”, kolejka chętnychInventory„Co się dzieje, gdy dwie osoby chcą tego samego naraz?”
Status, zatwierdzenie, anulowanie, kto zamawia, kto płaci, kto odbieraOrdering„Czy zamawiający i płacący to zawsze ta sama strona?”
Saldo, limit, „na dzień”, korekta, wygasanie środkówAccounting„Jakie było saldo 31 marca według stanu wiedzy z 2 kwietnia?”
„Nie można zacząć, zanim…”, kolejność kroków, konflikty zasobówScheduling„Co się przesunie, jeśli ten krok się spóźni?”
Harmonogram, „planowaliśmy, a wyszło”, odchyłka, tolerancjaPlan vs Execution„Jaki był plan wczoraj i dlaczego się zmienił?”
Liczba bez jednostki, waluta w nazwie kolumny, double priceQuantity„W jakiej jednostce i jak zaokrąglamy?”

Najmocniejszy sygnał w kodzie to ifologia po typie: if (klient.typ == FIRMA), switch (produkt.rodzaj), rozsiane po serwisach. Taki if mówi, że typ powinien być daną na poziomie wiedzy, a nie gałęzią w kodzie. Wrócimy do tego w następnym rozdziale.

▶ Detektor archetypów brief: karta flotowa do ładowania aut elektrycznych
Kliknij zdanie

Tu pojawi się, co zdradza archetyp i jaka konfiguracja pasuje.

Kliknij „Skanuj” albo pojedyncze zdanie.
Brief jest wymyślony, ale złożony z prawdziwych mechanizmów rynku e-mobility: operatora punktów ładowania (CPO) i dostawcy usług (EMSP), które występują też w scenariuszach repozytorium szkolenia. Jedno zdanie zwykle uruchamia kilka archetypów naraz.
⚠️ Uwaga

Nie wszystko jest archetypem. Gdy pojęcie nie zmienia się w czasie, nie ma wariantów i biznes nie pyta o jego historię, zwykła encja wystarczy. Archetyp kosztuje: więcej pojęć, więcej konfiguracji, więcej testów. Płacisz ten koszt tylko wtedy, gdy sygnały z tabeli rzeczywiście występują. Więcej w rozdziale o antywzorcach.

✏️ Zaostrz ołówek

Zdanie z wymagań: „Wynajmujący może podnająć lokal, ale tylko za zgodą właściciela, a czynsz od podnajemcy nie może przekroczyć 120% czynszu głównego”. Ile archetypów słyszysz?

Odpowiedź

Co najmniej trzy. Party: ta sama osoba jest najemcą w jednej relacji i wynajmującym w drugiej, a zgoda właściciela to warunek utworzenia relacji (polityka relacji). Pricing: czynsz podnajmu zależy od innej ceny (zależność komponentów). Rules: limit 120% to „strażnik” odrzucający niedozwolony wynik.

📌 W punktach
  • Szukaj zachowań w czasie i pytań „a co, jeśli…”, a nie samych rzeczowników.
  • Ifologia po typie to sygnał, że typ powinien być daną (poziom wiedzy).
  • Jedno zdanie biznesowe często dotyka kilku archetypów naraz.
  • Brak sygnałów oznacza, że zwykła encja wystarczy.

Poziom wiedzy i poziom operacyjny

meta-wzorzec pod każdym archetypem

Fowler w Analysis Patterns (1997) dzieli model na dwa piętra. Poziom operacyjny to fakty: ta umowa, ta paczka, ten zapis. Poziom wiedzy (knowledge level) to reguły, które mówią, jakie fakty są dozwolone: jakie są typy umów, jakie role może pełnić firma, jakie konta istnieją. Evans w Domain-Driven Design opisuje Knowledge Level jako jedną ze struktur dużej skali.

Każdy archetyp w tym kompendium ma oba piętra. W repozytorium szkolenia widać to wprost:

ArchetypPoziom wiedzy (typ, reguła)Poziom operacyjny (fakt)
Partydozwolone role, polityki relacji, wymagania kompetencjiAnna jest pełnomocnikiem firmy X od 1 marca
ProductProductType: cechy, ograniczenia, strategia śledzeniaegzemplarz z numerem seryjnym, partia
Pricingkomponent, kalkulator, wersja z okresem ważnościwyliczona cena z rozbiciem
Accountingtyp konta, reguła księgowania (posting rule)zapis na koncie, transakcja
Inventorymodel dostępności, polityka kolejkiblokada złożona przez właściciela

Praktyczny skutek: nowy wariant biznesu staje się nowym wierszem danych, a nie nową gałęzią w kodzie. Repozytorium showcase szkolenia pokazuje to na serwisie logistycznym w czterech wersjach. Wersja 1 to if-y wybierające kalkulator. W wersji 4 każda opcja (express, SMS, pobranie) jest produktem, ich kombinacja jest nazwanym ProductSet, a wybór kalkulatora to wyszukanie w mapie ProductSet → kalkulator. Autorzy podsumowują to tak: „konfiguracja jest DANYMI, nie KODEM”.

▶ Nowy wariant: kod czy dane? dodawaj opcje i patrz, co rośnie
Poziom operacyjny: if-y w serwisie
commitreviewtestydeploy
Poziom wiedzy: tabela ProductSet → kalkulator
Kliknij „Dostawa w sobotę”.
Kod jest pseudokodem, a liczby gałęzi to szacunek: n niezależnych opcji daje do 2ⁿ kombinacji. Po prawej każda kombinacja, której biznes używa, to jeden wiersz. W prawdziwym systemie konfiguracja też przechodzi przegląd i testy, ale bez wdrażania kodu.
⚠️ Uwaga: efekt wewnętrznej platformy

Poziom wiedzy kusi, żeby wszystko zrobić konfigurowalnym. Kończy się to własnym, gorszym językiem programowania w tabelach (tzw. inner-platform effect). Zasada praktyczna: przenoś do danych to, co biznes faktycznie zmienia i co ma się zmieniać bez wdrożenia. Algorytm kalkulatora zostaje w kodzie, a jego parametry i wybór trafiają do danych. Konfiguracja potrzebuje wersji z okresem ważności, inaczej zmiana cennika dziś zmieni wyliczenie wczorajszego zamówienia (przycisk 💥 na diagramie).

🔬 Głębiej: skąd się bierze ifologia i dlaczego wraca

Ifologia powstaje, gdy przestrzeń wyboru (który wariant?) miesza się z przestrzenią obliczeń (jak policzyć?). Showcase szkolenia pokazuje pośredni etap: jeden „mądry” kalkulator, który ma wszystkie if-y w sobie. Z zewnątrz wygląda czysto, ale problem tylko się przeniósł. Rozwiązanie rozdziela te przestrzenie: wybór jest indeksem (zestaw produktów → identyfikator kalkulatora), a obliczenie jest małym, testowalnym kalkulatorem bez if-ów biznesowych.

Ifologia wraca, gdy do indeksu trafiają warunki, które nie są nazwanymi pojęciami biznesu („jeśli kwota > 1000 i klient z Mazowsza i wtorek”). Jeśli kombinacja nie ma nazwy w języku biznesu, to zwykle nie jest wariantem produktu, tylko regułą. Jej miejsce jest w archetypie Rules.

✏️ Zaostrz ołówek

W ubezpieczeniach komunikacyjnych co kwartał pojawia się nowy „wariant” polisy: inne sumy ubezpieczenia, inne wyłączenia, czasem nowy dodatek (assistance, szyby). Co powinno być na poziomie wiedzy, a co w kodzie?

Odpowiedź

Na poziomie wiedzy: typy produktów i dodatków, cechy z ograniczeniami (suma ubezpieczenia w zakresie), reguły dopuszczalnych kombinacji, wersje taryf z okresem ważności. W kodzie: algorytmy kalkulatorów (np. funkcja progowa, procent od bazy), walidacja reguł i mechanizm wyboru wersji. Nowy wariant to wtedy nowe dane, a nowy rodzaj obliczenia to nowy kalkulator w kodzie.

📌 W punktach
  • Poziom wiedzy opisuje, co jest dozwolone, a poziom operacyjny zapisuje, co się stało.
  • Nowy wariant biznesu to nowy wiersz, a nie nowy if.
  • Oddziel wybór wariantu (indeks) od obliczenia (kalkulator).
  • Konfiguracja potrzebuje wersji z okresem ważności. Nie rób konfigurowalnym wszystkiego.

Jak archetypy łączą się w system

identyfikatory i migawki, nie wspólne obiekty

Archetypy rzadko występują pojedynczo. Zamówienie potrzebuje stron (Party), tego, co zamawiane (Product), ceny (Pricing), sprawdzenia dostępności (Inventory) i pieniędzy (Accounting). W repozytorium szkolenia zatwierdzenie zamówienia robi dokładnie to: dla każdej linii prosi magazyn o alokację, potem autoryzuje i pobiera płatność, a na końcu uruchamia realizację. Jeśli którykolwiek krok się nie uda, zamówienie zostaje w stanie DRAFT.

Kluczowe jest to, jak się łączą. Zamówienie nie trzyma obiektu klienta. Trzyma jego identyfikator i migawkę (PartySnapshot: identyfikator, nazwa, dane kontaktowe) z chwili złożenia. Gdy klient zmieni adres, wysłane zamówienie nie może zmienić się wstecz.

▶ Mapa archetypów kliknij węzeł albo puść przepływ zamówienia
Kliknij węzeł, żeby zobaczyć, co bierze i co daje.
Strzałka oznacza „korzysta z”. Mapa jest uproszczeniem: pokazuje typowe zależności z repozytorium szkolenia i literatury, a nie jedyną poprawną architekturę.
🔥 Rozmowa przy kominku
OrderDaj mi klienta. Całego. Z adresami, rolami, historią.
PartyDostaniesz identyfikator i migawkę. Jak zmienię adres, nie chcę, żeby twoja faktura z marca nagle pokazała adres z czerwca.
OrderA jak potrzebuję aktualnych danych?
PartyTo zapytaj mnie po identyfikatorze. Ja odpowiadam za „kim jest”, a ty za to, „co zostało zamówione i przez kogo w tamtej chwili”.
📌 W punktach
  • Archetypy współpracują przez identyfikatory, migawki i zdarzenia, a nie przez wspólne obiekty.
  • Ordering jest orkiestratorem: korzysta z Party, Product, Pricing, Inventory i płatności.
  • Accounting zwykle słucha zdarzeń (np. zapisów księgowych), a Plan vs Execution porównuje plan z tym, co wykonano (wpłaty, produkcja, dostawy).
Część II

Fundamenty: wielkości i podmioty

Liczby z jednostką, pieniądze, które nie gubią groszy, i podmioty, które pełnią wiele ról naraz.

Quantity i Money

liczba bez jednostki to plotka

23 września 1999 roku NASA straciła sondę Mars Climate Orbiter. Oprogramowanie naziemne dostawcy podawało impuls w funtach-sekundach (lbf·s), a system nawigacji oczekiwał niutonosekund (N·s). Sonda weszła za nisko w atmosferę Marsa. W 1983 roku Boeing 767 Air Canada (lot 143, „Gimli Glider”) skończył paliwo w locie, bo przy tankowaniu pomylono przelicznik na kilogramy z przelicznikiem na funty. W obu przypadkach liczba była poprawna. Zła była jej jednostka.

🔰 Co to jest

Quantity to liczba zawsze związana z jednostką (5 kg, 12 kWh, 3 szt.). Money to kwota zawsze związana z walutą (100,00 PLN). Operacje na nich pilnują jednostek i nie gubią groszy.

AnalogiaPrzepis kulinarny. „Dodaj 2” nic nie znaczy, dopóki nie wiesz, czy chodzi o łyżki, szklanki czy kilogramy. Rozwiązujedodawanie kilogramów do funtów, „zgubione” grosze przy dzieleniu na raty, błędy zaokrągleń, mylenie procentów z punktami procentowymi. Czym NIE jestNie jest „liczbą z opisem w osobnej kolumnie”. Jednostka jest częścią wartości: dwie ilości w różnych jednostkach to różne rzeczy, dopóki ktoś jawnie ich nie przeliczy.
▶ Anatomia: Quantity i Money kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Konwersji jednostek, polityki zaokrągleń i alokacji repozytorium nie modeluje jako osobnych obiektów: to opcje, które dokładasz sam.
✅ Sięgnij, gdy
  • ta sama rzecz bywa liczona w różnych jednostkach (paliwo w litrach i w tonach, czas w minutach i w godzinach);
  • dzielisz kwoty: raty, udziały, rozksięgowanie kosztu na działy;
  • obsługujesz więcej niż jedną walutę;
  • zaokrąglenia mają znaczenie prawne lub podatkowe (VAT, odsetki).
⛔ Odpuść, gdy
  • liczba nie ma jednostki z natury (numer wersji, liczba kliknięć w raporcie);
  • cały system liczy jedną rzecz w jednej jednostce i nic tego nie zmieni. Nawet wtedy pieniądze trzymaj w typie dziesiętnym.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Jednostka jako typIlość to para (wartość, jednostka). Dodawanie różnych jednostek kończy się błędem.Zawsze, gdy liczysz coś fizycznego lub umownego (szt., kg, l, h, min).Niski. Trzeba ustalić listę jednostek.
Zakaz wartości ujemnychIlość nie może być mniejsza od zera. W repozytorium sprawdza to konstruktor Quantity.Stany, zamówione ilości, pojemności.Ruchy „minus” trzeba wtedy modelować osobno, np. zapisem rozchodu.
Konwersja jednostekJawne przeliczenie z zapisanym współczynnikiem (Fowler: Conversion Ratio).Kupujesz w tonach, sprzedajesz w litrach. Rozliczasz godziny i minuty.Współczynnik bywa zmienny (gęstość zależy od temperatury). Zapisuj go razem z wynikiem.
Money z walutąKwota + kod waluty, w typie dziesiętnym. Różnych walut nie dodaje się bez kursu.Każde pieniądze w systemie.Kurs to dana z datą i źródłem, a nie stała w kodzie.
Polityka zaokrągleńUstala, kiedy (linia czy suma), jak (w górę, do parzystej) i gdzie trafia różnica.VAT, odsetki, ceny jednostkowe z wieloma miejscami po przecinku.Zmiana polityki zmienia kwoty na dokumentach. Wersjonuj ją.
AlokacjaDzieli kwotę na części tak, że suma części zawsze równa się całości.Raty, udziały, podział kosztu, zwroty częściowe.Trzeba zdecydować, która część dostaje resztę groszy.
Procent jako typOsobny typ procentu (Percentage), żeby 5% nie pomylić z 0,05 ani z 5 punktami procentowymi.Stawki, rabaty, prowizje, oprocentowanie.Niski.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: pieniądze w typie dziesiętnym z walutą, ilości z jednostką, zakaz dodawania różnych jednostek.
  2. Sygnał „rata” lub „udział”: dodaj alokację zamiast dzielenia.
  3. Sygnał „VAT” lub „odsetki”: zapisz politykę zaokrągleń jako regułę z nazwą.
  4. Sygnał „kupujemy w tonach, sprzedajemy w litrach”: dodaj jawną konwersję z zapisanym współczynnikiem.
⚠️ Typowe błędy początkujących
  • double dla pieniędzy. Skutek: 0.1 + 0.2 ≠ 0.3 i rozjazd sum na raportach.
  • Kwota bez waluty „bo i tak jest PLN”. Skutek: pierwszy klient z euro psuje wszystkie sumy.
  • Dzielenie 100 zł na 3 przez zaokrąglenie każdej części. Skutek: 99,99 zł i grosz, którego nikt nie umie znaleźć.

W praktyce i w repozytorium

Archetyp Quantity (Fowler, Analysis Patterns; Arlow i Neustadt mają osobne archetypy Quantity i Money) mówi prosto: ilość = wartość + jednostka, a operacje sprawdzają jednostki. W repozytorium szkolenia Quantity to para (kwota BigDecimal, Unit). Dodawanie i odejmowanie różnych jednostek kończy się wyjątkiem, a ujemna ilość jest odrzucana już w konstruktorze. Money opakowuje JavaMoney (JSR 354), czyli kwotę z walutą.

▶ Pieniądze, które nie gubią groszy podziel kwotę na raty albo udziały
Wpisz kwotę i porównaj „Podziel” z „Alokuj”.
Alokacja: każda część dostaje kwotę zaokrągloną w dół do grosza, a pozostałe grosze rozdaje się po jednym od pierwszej części. To jedna z możliwych polityk. Biznes może woleć resztę na ostatniej racie. Ważne, żeby suma zawsze się zgadzała. Przykład 70/30 z 5 groszy pochodzi z dyskusji o wzorcu Money Fowlera.
❓ Nie ma głupich pytań
P:
Czemu nie double? Przecież ma dużo miejsc po przecinku.
O:
double to liczba binarna. 0,1 nie da się w niej zapisać dokładnie, więc 0.1 + 0.2 daje 0.30000000000000004. Do pieniędzy używaj typów dziesiętnych (BigDecimal) albo liczb całkowitych w groszach. Do tego potrzebna jest jawna polityka zaokrągleń.
P:
Czy przeliczanie jednostek to część Quantity?
O:
Może być. Fowler opisuje osobny wzorzec współczynnika konwersji (Conversion Ratio). Repozytorium szkolenia celowo go nie ma: różne jednostki po prostu się nie sumują. To bezpieczny domyślny wybór. Konwersję dodajesz świadomie tam, gdzie biznes jej potrzebuje, np. litry paliwa na kilogramy przy zadanej gęstości. Gęstość zależy od temperatury, więc konwersja też jest daną z kontekstem.
🤓 Praktyka: zaokrąglenia to reguła biznesowa

„Zaokrąglij do grosza” to nie wszystko. Trzeba wiedzieć kiedy (po każdej linii czy od sumy), jak (połówki w górę czy do parzystej, tzw. zaokrąglenie bankierskie) i gdzie trafia różnica. Ilustracyjny przykład: trzy pozycje po 0,10 zł netto z 23% VAT. Zaokrąglając podatek w każdej linii, dostajesz 3 × 0,02 zł (bo 0,023 ≈ 0,02) = 0,06 zł VAT. Liczony od sumy wychodzi 0,30 × 0,23 = 0,069 ≈ 0,07 zł. Różnica to grosz. Każda z metod może być poprawna, jeśli jest zapisana jako reguła i stosowana konsekwentnie.

Z Money wiąże się jeszcze procent kontra punkt procentowy. Podwyżka stopy z 5% do 6% to +1 punkt procentowy, ale +20%. Repozytorium ma osobny typ Percentage, właśnie żeby nie mieszać „0,05” z „5”.

✏️ Zaostrz ołówek

Hurtownia paliw sprzedaje olej napędowy w litrach, kupuje go w tonach, a akcyzę rozlicza w tysiącach litrów w temperaturze referencyjnej. Ile archetypów Quantity widzisz i gdzie jest pułapka?

Odpowiedź

Jeden archetyp z trzema jednostkami (l, t, 1000 l) i co najmniej jedną konwersją zależną od kontekstu (gęstość i temperatura). Pułapka to „cicha” konwersja w kodzie z jedną stałą gęstością. Wtedy stany magazynowe w litrach i w tonach rozjeżdżają się z każdą dostawą. Lepiej zapisywać ilość w jednostce, w której ją zmierzono, i konwertować jawnie, z zapisanym współczynnikiem.

📌 W punktach
  • Ilość to wartość + jednostka. Różnych jednostek nie dodajesz bez jawnej konwersji.
  • Pieniądze to kwota + waluta, w typie dziesiętnym, nigdy w double.
  • Dzielenie pieniędzy to alokacja: suma części zawsze równa całości.
  • Zaokrąglenia (kiedy, jak, gdzie trafia różnica) to reguła biznesowa.

Party: kto jest kim

jedna osoba, wiele kapeluszy

Strona szkolenia opisuje problem tak: „wieczny chaos z userami”. Klient, firma, pracownik i partner siedzą w osobnych strukturach, które się rozjeżdżają. Rozwiązanie: zamiast osobnych klas Client czy Partner modelujesz uniwersalny Party i przypisujesz mu role.

Weź bank. Jan Kowalski ma tam konto osobiste (klient detaliczny). Pracuje w tym banku, więc obowiązują go zasady konfliktu interesów. Jest poręczycielem kredytu brata. Zasiada też w zarządzie spółki, która jest klientem korporacyjnym. W modelu „tabela na rolę” Jan to cztery rekordy, które o sobie nie wiedzą. Dział ryzyka nie zobaczy wtedy, że jedna osoba łączy cztery ekspozycje. Rozporządzenie CRR ma na to pojęcie „grupy powiązanych klientów” (group of connected clients). Bez Party nie da się go policzyć.

🔰 Co to jest

Party to każdy, kto może być stroną w biznesie: osoba albo organizacja. „Klient”, „dostawca”, „pracownik” i „płatnik” to nie osobne typy, tylko role, które ta sama strona pełni naraz albo po kolei.

AnalogiaAktor i jego role. Ten sam człowiek gra w trzech filmach. Nikt nie zakłada mu trzech dowodów osobistych. Rozwiązujeduplikaty klientów w kilku tabelach, „zmianę typu klienta”, brak odpowiedzi na pytanie „z kim jeszcze ta osoba jest powiązana?”. Czym NIE jestNie jest kontem logowania (User). Nie jest też „klientem z flagą isSupplier”. Party mówi kto, rola mówi w jakim charakterze.
▶ Anatomia: Party kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Relacje i kompetencje mają własne rozdziały na wyższych poziomach: Role i relacje oraz Kompetencje i zakresy.
✅ Sięgnij, gdy
  • ta sama osoba lub firma pojawia się w kilku rolach (klient i dostawca, pacjent i pracownik);
  • obsługujesz i osoby, i firmy, i działy firm;
  • ktoś pyta „kto był pełnomocnikiem w marcu?” albo „kto kontroluje tę spółkę?”;
  • dane tej samej strony rozjeżdżają się między systemami.
⛔ Odpuść, gdy
  • system ma jedną rolę i nie zanosi się na drugą (np. wewnętrzna lista uczestników szkolenia);
  • stroną zarządza zewnętrzny system (CRM, ERP), a Ty potrzebujesz tylko jego identyfikatora. Wtedy trzymaj identyfikator i migawkę danych.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Osoba / organizacja / jednostkaDwa rodzaje stron: osoba i organizacja. Organizacja to firma albo jednostka organizacyjna (dział, oddział).Zawsze. Jednostki dokładasz, gdy działy mają własne role (np. płacą osobno).Niski. Pułapka: jednoosobowa działalność to osoba, a nie firma.
Role przez politykęRola to nazwany „kapelusz”. Polityka decyduje, kto może mieć jaką rolę.Gdy role mają warunki, np. „lekarz” tylko dla osoby.Polityki trzeba utrzymywać razem z biznesem.
Identyfikatory z politykąPESEL, paszport, NIP, REGON, KRS jako osobne obiekty. Polityka pilnuje, że PESEL ma tylko osoba, a REGON tylko organizacja.Gdy identyfikatorów jest kilka albo pochodzą z różnych krajów.Walidacja numerów (sumy kontrolne) to osobna praca.
Adresy jako osobny bytAdres pocztowy, e-mail, telefon, WWW z zastosowaniami: rozliczeniowy, korespondencyjny, dostawy, zamieszkania, kontaktowy.Gdy faktura i towar idą na różne adresy albo adresy często się zmieniają.Dokumenty muszą zapisywać migawkę adresu, a nie referencję.
Relacje bez ważnościNazwane powiązanie dwóch ról, np. „oddział należy do firmy”.Relacje trwałe z natury, w małym systemie.Brak historii. Zmiana relacji kasuje przeszłość.
Relacje z ważnościąPowiązanie ma datę od i do.Zatrudnienie, pełnomocnictwo, opieka nad klientem, kontrola kapitałowa.Każde zapytanie musi mówić „na kiedy”.
Polityka relacjiDecyduje, które role mogą być powiązane jaką relacją.Gdy relacje tworzą użytkownicy lub integracje.Domyślna polityka w repozytorium pozwala na wszystko. Reguły musisz dopisać sam.
Kompetencje i zakresyCo strona potrafi, gdzie, kiedy, ile i na jakim poziomie, z datą ważności.Dopasowanie wykonawcy do zlecenia: uprawnienia, certyfikaty, regiony.Ważność trzeba sprawdzać w chwili przydziału.
Zdarzenia i wersjaKażda zmiana daje zdarzenie. Pole wersji służy do wykrywania równoległych zmian. W repozytorium Party tylko je przechowuje, a sprawdzanie konfliktów trzeba dopisać.Gdy inne moduły reagują na zmiany stron albo kilka osób edytuje te same dane.Potrzebny mechanizm publikacji zdarzeń.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: osoba i organizacja, lista ról, jeden identyfikator (np. NIP), jeden adres.
  2. Sygnał „faktura na inny adres niż dostawa”: adresy jako osobny byt z zastosowaniami.
  3. Sygnał „działa w imieniu”, „pełnomocnik”, „opiekun klienta”: relacje z ważnością.
  4. Sygnał „tylko z uprawnieniami”, „tylko w regionie”: kompetencje z zakresami.
⚠️ Typowe błędy początkujących
  • Osobne tabele Klient, Dostawca, Pracownik. Skutek: ta sama firma istnieje trzy razy i nikt nie widzi łącznej ekspozycji.
  • Pole typKlienta zmieniane w czasie. Skutek: historia znika, a stare dokumenty pokazują dzisiejszy typ.
  • Login jako Party. Skutek: księgowa obsługująca 30 firm „jest” jedną z nich.

W praktyce i w repozytorium

W repozytorium szkolenia Party jest klasą zamkniętą (sealed) z dwiema gałęziami: Person i Organization. Organizacja dzieli się na Company i OrganizationUnit (np. dział, oddział). Party ma:

▶ Jan w czterech rolach dodawaj role, potem zmień adres
Kliknij „Następna rola”.
Model jest uproszczony: adresy w repozytorium to osobny agregat z własnym cyklem życia (patrz niżej), a role mogą mieć wymagania kompetencji. Log pokazuje nazwy zdarzeń w stylu repozytorium.
🤓 Adresy i kanały kontaktu

Silverston w The Data Model Resource Book wydziela mechanizm kontaktu (contact mechanism) z Party. Adres pocztowy, e-mail, telefon i strona WWW to różne rodzaje tego samego pojęcia. Repozytorium szkolenia robi podobnie. Adresy są osobnym agregatem (Addresses) z rodzajami GeoAddress, EmailAddress, PhoneAddress i WebAddress. Każdy adres ma zastosowania (AddressUseType): BILLING, MAILING, SHIPPING, RESIDENTIAL, CONTACT.

Dlaczego osobno? Bo adres ma własny cykl życia. Firma przenosi siedzibę, ale magazyn zostaje. Faktura idzie na adres księgowości, a towar na adres magazynu. Zamówienia nie trzymają referencji do adresu, tylko jego migawkę z chwili złożenia.

⚠️ Uwaga: User to nie Party

Konto logowania to sposób uwierzytelnienia, a nie podmiot. Księgowa obsługuje 30 firm z jednego loginu. Właściciel firmy ma login prywatny i firmowy. Klient korporacyjny ma 200 pracowników z dostępem. Gdy połączysz User z Party w jedną tabelę, każda z tych sytuacji staje się hackiem. Trzymaj tożsamość i dostęp (osobny bounded context, jak u Vernona w Implementing DDD) oddzielnie od Party. Łącz je relacją „działa w imieniu” z zakresem uprawnień.

🔬 Głębiej: RODO, anonimizacja i role

Prawo do usunięcia danych (RODO, art. 17) ma wyjątki, m.in. gdy przetwarzanie jest potrzebne do wypełnienia obowiązku prawnego (art. 17 ust. 3 lit. b), np. przechowywania dokumentów księgowych. Party z rolami pomaga tu naturalnie. Gdy klient odchodzi, możesz anonimizować dane osobowe w Party i jednocześnie zachować identyfikator, do którego odwołują się zapisy księgowe i zamówienia. Migawki w zamówieniach też trzeba objąć polityką retencji. Często to właśnie one są ostatnim miejscem, gdzie zostaje nazwisko.

✏️ Zaostrz ołówek

Marketplace: osoba prywatna kupuje, potem zaczyna sprzedawać, potem zakłada jednoosobową działalność, a na końcu spółkę z o.o. i przenosi do niej sklep. Ile Party, ile ról i co się dzieje z ocenami sprzedawcy?

Odpowiedź

Dwa Party: osoba (z rolami kupujący, sprzedawca, przedsiębiorca, bo JDG nie ma odrębnej osobowości prawnej) i spółka (nowa organizacja z rolą sprzedawca). Między nimi relacja „wspólnik/założyciel” i „następca sklepu” z datą. Oceny sprzedawcy są przypięte do roli sprzedawcy konkretnego Party. Przeniesienie ich na spółkę to decyzja biznesowa zapisana relacją, a nie „zmiana typu klienta” w tabeli.

📌 W punktach
  • Party to osoba albo organizacja. Klient, dostawca i pracownik to role, a nie typy.
  • Role i identyfikatory dodaje się przez polityki, a każda zmiana daje zdarzenie.
  • Adres ma własny cykl życia i zastosowania. Zamówienie zapisuje jego migawkę.
  • Login to nie Party. Łącz je relacją „działa w imieniu”.

Role i relacje między stronami

relacja łączy role, nie ludzi
🔰 Co to jest

Relacja między stronami to nazwane powiązanie dwóch ról (np. „pełnomocnik” i „mocodawca”), zwykle z okresem ważności. Polityka relacji decyduje, które powiązania są dozwolone.

AnalogiaUmowa z datą zawarcia i rozwiązania. Ludzie zostają ci sami, a umowy się zaczynają, kończą i zmieniają. Rozwiązujepytania „kto był prezesem 3 lata temu?”, „kto kontroluje tę spółkę?”, wiele hierarchii naraz w jednej organizacji. Czym NIE jestNie jest kluczem obcym firma_id w tabeli osób. Taki klucz pamięta tylko jedno, bieżące powiązanie i nie ma nazwy ani dat.

Ubezpieczenie na życie: ubezpieczający zawiera umowę i płaci składkę. Ubezpieczony to osoba, której życie jest chronione. Uposażony dostaje świadczenie. Pracodawca może być ubezpieczającym dla stu pracowników, a każdy z nich wskazuje innych uposażonych. Ta sama osoba może być ubezpieczonym w jednej polisie i uposażonym w trzech innych. Takie sieci powiązań to codzienność archetypu Party.

Kluczowa decyzja z repozytorium szkolenia: PartyRelationship łączy role (PartyRole = Party + rola), a nie gołe Party. Relacja ma nazwę i okres ważności (Validity). Tworzy ją polityka PartyRelationshipDefiningPolicy, która dostaje rolę źródłową, rolę docelową i nazwę relacji, i decyduje, czy relacja jest dozwolona. Domyślna polityka pozwala na wszystko. W prawdziwym systemie to właśnie tu mieszka wiedza dziedzinowa.

Fowler opisuje to samo jako Accountability: typowaną relację odpowiedzialności między stronami, z okresem obowiązywania. Typy relacji i reguły, kto może być po której stronie, należą do poziomu wiedzy. Dzięki temu ten sam mechanizm obsługuje strukturę organizacyjną, nadzór, pełnomocnictwa i kontrolę kapitałową, a do tego kilka hierarchii naraz, np. podległość służbową i podległość regionalną w organizacji macierzowej.

▶ Sieć powiązań holding, pełnomocnik i polisa
Kliknij „Następna relacja”.
Strony, role i daty są wymyślone. Polityka w symulacji ma dwie reguły: rolę „zależna” może mieć tylko organizacja, a nikt nie jest własnym pełnomocnikiem. Przykłady polityk nie pochodzą z przepisów.
KonfiguracjaCo dajeKiedy
Relacja bez okresu ważności (Validity.ALWAYS)Najprostsza. Brak historii.Relacje trwałe z natury, np. „oddział należy do firmy” w małym systemie.
Relacja z okresem ważnościOdpowiedź na pytanie „kto był prezesem 3 lata temu?”.Pełnomocnictwa, zatrudnienie, kontrola kapitałowa, opieka nad klientem.
Polityka relacji (role × role × nazwa)Model sam odrzuca nonsensowne powiązania.Gdy relacje tworzą użytkownicy lub integracje, a nie tylko administrator.
Wiele typów hierarchii narazPodległość służbowa ≠ regionalna ≠ kapitałowa.Holdingi, organizacje macierzowe, sieci franczyzowe.
Atrybuty relacji (udział %, zakres pełnomocnictwa)Relacja staje się bytem z danymi. To rozszerzenie: PartyRelationship w repozytorium ma tylko strony, nazwę i ważność.Beneficjenci rzeczywiści, pełnomocnictwa rodzajowe.
🤓 Ekspert: beneficjent rzeczywisty to zapytanie po grafie

Przepisy AML każą ustalić beneficjenta rzeczywistego klienta, czyli osobę fizyczną, która ostatecznie go kontroluje. Dyrektywy unijne wskazują jako przesłankę m.in. posiadanie ponad 25% udziałów. W Polsce takie dane trafiają do Centralnego Rejestru Beneficjentów Rzeczywistych. W modelu Party to przejście po grafie relacji kontroli: udziały mnoży się po ścieżce, a ścieżki sumuje. Spółka A ma 60% B, a B ma 50% C, więc A ma pośrednio 30% C. Bez typowanych relacji z atrybutem „udział” takie zapytanie staje się ręcznym arkuszem.

✏️ Zaostrz ołówek

Sieć franczyzowa: centrala, 300 franczyzobiorców (spółki i JDG), kierownicy sklepów, opiekunowie regionów z centrali. Franczyzobiorca kupuje towar od centrali, a centrala kupuje od niego usługi marketingu lokalnego. Jakie relacje i polityki?

Odpowiedź

Relacje: „umowa franczyzy” (centrala jako franczyzodawca ↔ franczyzobiorca), „opieka regionalna” (opiekun ↔ franczyzobiorca, z okresem ważności, bo opiekunowie rotują), „kieruje sklepem” (osoba ↔ jednostka organizacyjna). Ta sama para stron ma dwie relacje handlowe w przeciwnych kierunkach: klient/dostawca i dostawca/klient. Polityka: opiekunem może być tylko osoba w roli pracownika centrali. Umowa franczyzy wymaga roli franczyzobiorcy z ważnym identyfikatorem podatkowym.

📌 W punktach
  • Relacja łączy role (Party + rola), ma nazwę i okres ważności.
  • Polityka relacji to miejsce na wiedzę: kto z kim i w jakiej roli może być powiązany.
  • Ten sam mechanizm obsługuje wiele hierarchii naraz (Fowler: Accountability).
  • Atrybuty relacji, takie jak udział czy zakres, zamieniają pytania regulacyjne w zapytania po grafie.

Kompetencje i zakresy działania

rola wymaga, strona potrafi
🔰 Co to jest

Kompetencja mówi, co strona potrafi, a zakres działania mówi gdzie, kiedy, ile i na jakim poziomie. Rola może wymagać kompetencji, a system dopasowuje wykonawców do zleceń.

AnalogiaPrawo jazdy z kategoriami i datą ważności. Nie wystarczy być kierowcą. Trzeba mieć właściwą kategorię, ważną dzisiaj. Rozwiązujeprzydział zleceń ludziom bez uprawnień, ręczne sprawdzanie certyfikatów, wyszukiwanie wykonawców po regionie, terminie i poziomie. Czym NIE jestNie jest rolą. Rola mówi „kim jesteś w relacji”, kompetencja mówi „co umiesz i gdzie wolno Ci to robić”.

Rola mówi, kim ktoś jest w relacji. Nie mówi, co potrafi. Dyspozytor transportu nie szuka „przewoźnika”. Szuka przewoźnika z uprawnieniem ADR do przewozu materiałów niebezpiecznych, który działa na Śląsku, w weekend, i ma wolną cysternę. Szpital nie szuka „radiologa”, tylko radiologa poziomu senior z ważnym prawem wykonywania zawodu w szpitalu A.

Repozytorium szkolenia rozdziela te pojęcia. Capability to kompetencja strony: typ (np. „ADR”), lista zakresów działania (OperatingScope) i okres ważności. Zakresy to zamknięta lista siedmiu rodzajów, a każdy umie powiedzieć, czy spełnia wymaganie:

ZakresSpełnia wymaganie, gdy…Przykład
LocationScopezawiera wszystkie wymagane lokalizacjeprzewoźnik obsługuje Śląsk i Małopolskę
TemporalScopepokrywa wymagane dni i godzinyserwis dostępny w soboty 8–14
QuantityScopeten sam okres i limit ≥ wymaganego (albo bez limitu)do 5 zleceń dziennie
SkillLevelScoperanga ≥ wymaganej (junior < mid < senior < expert)radiolog senior
ProtocolScopeobsługuje wszystkie wymagane protokoły lub proceduryzespół pracujący wg procedury sterylizacji X
ProductScopeobejmuje wszystkie wymagane produktyautoryzowany serwis marek A i B
ResourceScopedysponuje wszystkimi wymaganymi zasobamima cysternę i dźwig HDS

Po drugiej stronie są RoleRequirements: rola wymaga listy kompetencji, każdej z wymaganymi zakresami. Rola jest spełniona, gdy każde wymaganie pokrywa któraś ważna kompetencja. Wygasła kompetencja nie spełnia niczego. W scenariuszach repozytorium radiolog z wygasłym prawem wykonywania zawodu po prostu znika z wyników wyszukiwania. Fowler w rozdziale o Accountability też opisuje zakresy działania (Operating Scopes), co pokazuje, że to dojrzały pomysł, a nie wynalazek jednego projektu.

▶ Dopasowanie przewoźnika do zlecenia zmieniaj wymagania i patrz, kto odpada
Dodawaj wymagania.
Przewoźnicy i daty ważności są wymyśleni. Reguły dopasowania (zawieranie zbiorów, ranga, ważność) odpowiadają semantyce OperatingScope z repozytorium szkolenia.
⚠️ Uwaga

Kompetencja z okresem ważności to nie ozdoba. Uprawnienia zawodowe, certyfikaty i badania lekarskie wygasają. System, który sprawdza je tylko przy rejestracji, po roku przydziela zlecenia ludziom bez uprawnień. Sprawdzaj ważność w chwili przydziału (repozytorium ma do tego satisfiesAt(requirement, instant)), a nie przy zapisie.

📌 W punktach
  • Rola mówi „kim”, a kompetencja mówi „co potrafi, gdzie, kiedy, ile i na jakim poziomie”.
  • Siedem rodzajów zakresów: lokalizacja, czas, ilość, poziom, protokół, produkt, zasób.
  • Rola jest spełniona, gdy każde wymaganie pokrywa któraś ważna kompetencja.
  • Ważność sprawdzaj w chwili przydziału.
Część III

Produkt, cena, reguły

Co sprzedajesz, ile to kosztuje teraz i kiedyś, i jak nakładać wyjątki tak, żeby się nie pozabijały.

Product: typ, egzemplarz, partia

„iPhone” to nie jest ten iPhone
🔰 Co to jest

Product opisuje to, co sprzedajesz: towar, usługę, umowę. Rozdziela typ (opis z katalogu, np. „kredyt Stała stopa 5 lat”) od egzemplarza (ta konkretna umowa, ten telefon, ta wizyta).

AnalogiaKarta dania w menu i talerz, który kelner stawia na stole. Karta jest jedna, talerzy setki, a każdy może mieć inne dodatki. Rozwiązuje„który egzemplarz trafił do którego klienta”, wycofania partii, warianty i cechy bez nowych kolumn, pakiety z regułami „wybierz jeden z…”. Czym NIE jestNie jest cennikiem: cena żyje w Pricing. Nie jest też stanem magazynu: to, ile sztuk jest wolnych, wie Inventory.
▶ Anatomia: Product kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Pakiety i relacje produktów opisuje szerzej rozdział Pakiety i relacje.
✅ Sięgnij, gdy
  • sprzedajesz coś z katalogu, w wariantach albo z parametrami;
  • musisz wiedzieć, który egzemplarz dostał klient (gwarancja, serwis, wycofanie);
  • produkt może zniknąć z oferty, ale umowy na niego dalej trwają;
  • sprzedajesz zestawy i pakiety z regułami wyboru.
⛔ Odpuść, gdy
  • masz kilka stałych pozycji bez cech i wariantów (np. trzy rodzaje biletu wstępu). Wystarczy prosta lista typów;
  • katalogiem zarządza zewnętrzny system (PIM). Trzymaj wtedy identyfikator i migawkę opisu.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Typ i egzemplarzOpis katalogowy osobno, konkretna rzecz lub umowa osobno.Zawsze, gdy egzemplarze się różnią albo trzeba je śledzić.Niski. Dla towarów zamiennych egzemplarz może być tylko ilością.
Cechy z ograniczeniamiTyp definiuje cechy (obowiązkowe lub opcjonalne) i ograniczenia: lista wartości, zakres liczb, zakres dat, wyrażenie regularne. Egzemplarz ma wartości.Warianty: kolor, pojemność, okres umowy, kwota kredytu.Ograniczenia są danymi, więc trzeba je testować jak konfigurację.
Śledzenie: unikatDokładnie jeden egzemplarz na świecie, z numerem.Dzieła sztuki, nieruchomości, instrumenty kolekcjonerskie.Niski.
Śledzenie: indywidualneKażdy egzemplarz ma numer seryjny (tekstowy, IMEI, VIN).Gwarancja, serwis, leasing, wypożyczanie.Każda sztuka to rekord.
Śledzenie: partiaEgzemplarze należą do partii z datą produkcji i datami ważności.Żywność, leki, chemia, wycofania.Trzeba pilnować, z której partii wydano towar.
Śledzenie: numer i partiaNumer seryjny i partia naraz.Elektronika, leki na receptę.Największy koszt danych.
Śledzenie: zamienneEgzemplarze są nieodróżnialne, liczy się tylko ilość. Numer i partia są zabronione.Śruby, materiały sypkie, energia.Brak możliwości wycofania „tej jednej sztuki”.
Wpis w katalogu z ważnościąNazwa wyświetlana, kategorie i okres, w którym produkt jest w ofercie.Produkty sezonowe, wycofywane taryfy.Trzeba odróżniać „nie ma w ofercie” od „nie istnieje”.
Ograniczenie stosowalnościWarunek, komu i w jakim kontekście wolno zaproponować produkt (np. wiek 18–45).Produkty finansowe, oferty regionalne, oferty dla segmentów.Warunki są danymi: potrzebują wersji i testów.
PakietProdukt złożony z nazwanych zestawów i reguł wyboru: dokładnie jeden, najwyżej dwa, „jeśli A, to B”.Abonament z telefonem, usługa kurierska z dodatkami.Reguły trzeba sprawdzać przy każdym wyborze klienta.
Relacje produktówSześć typów: przejście na lepszy, zamiennik, następca, uzupełnienie, zgodny, niezgodny.Migracje taryf, cross-sell, konfiguratory.Relacje trzeba utrzymywać razem z katalogiem.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: typ z nazwą i jednostką, egzemplarz (albo sama ilość dla towarów zamiennych), jedna strategia śledzenia.
  2. Sygnał „warianty”, „parametry umowy”: cechy z ograniczeniami zamiast nowych kolumn.
  3. Sygnał „wycofanie”, „data ważności”: partie jako osobny byt.
  4. Sygnał „zestaw”, „pakiet”, „tylko z”: pakiety z regułami wyboru i relacje produktów.
⚠️ Typowe błędy początkujących
  • Kolumna cena w tabeli produktów. Skutek: pierwsza promocja albo cennik dla firm wymaga przebudowy.
  • Nowa kolumna na każdą cechę. Skutek: tabela z setką pustych pól.
  • Usunięcie produktu z bazy, gdy znika z oferty. Skutek: stare umowy wskazują na nieistniejący typ.

W praktyce i w repozytorium

Strona szkolenia ujmuje to tak: niemal każdy biznes to sklep, który sprzedaje „produkt” (ubezpieczenie, usługę kurierską, kredyt) o określonej konfiguracji i cenie. Pierwsza rzecz do rozdzielenia to typ i egzemplarz. ProductType „iPhone 15 Pro 256 GB” to opis z katalogu. Twój telefon z numerem IMEI to ProductInstance. Kredyt hipoteczny „Stała stopa 5 lat” to typ, a umowa nr 123 to egzemplarz z konkretną kwotą.

Typ w repozytorium szkolenia ma: identyfikator (UUID, GTIN, ISBN), nazwę i opis, preferowaną jednostkę (sztuki, litry, kWh), definicje cech (obowiązkowe lub opcjonalne, z ograniczeniami: lista dozwolonych wartości, zakres liczb, zakres dat, wyrażenie regularne), ograniczenie stosowalności (dla kogo i w jakim kontekście produkt jest dostępny) oraz strategię śledzenia. Egzemplarz ma wartości cech, które muszą spełniać ograniczenia typu, numer seryjny (tekstowy, IMEI, VIN) albo partię.

Osobno jest wpis w katalogu (CatalogEntry): nazwa wyświetlana, kategorie i okres ważności. Produkt może istnieć dłużej niż jego obecność w ofercie. Umowy na wycofany produkt nadal trzeba obsługiwać.

▶ Strategia śledzenia pięć produktów z repozytorium szkolenia i jedno wycofanie z rynku
Wybierz produkt.
Strategie i przykłady (gitara, iPhone, mleko, telewizor, śruby) pochodzą ze scenariuszy repozytorium szkolenia. Liczby egzemplarzy i numery partii są ilustracyjne.
StrategiaCo wymagaKiedy
UNIQUEnumer seryjny; istnieje dokładnie jedendzieła sztuki, instrumenty kolekcjonerskie, nieruchomości
INDIVIDUALLY_TRACKEDnumer seryjny każdego egzemplarzatelefony (IMEI), auta (VIN), sprzęt na gwarancji
BATCH_TRACKEDidentyfikator partiiżywność, leki, chemia: wycofania i daty ważności
INDIVIDUALLY_AND_BATCH_TRACKEDnumer seryjny i partiaelektronika: gwarancja po numerze, wycofanie po partii komponentów
IDENTICALnic; egzemplarze są zamienne, numer seryjny i partia są wręcz zabronioneśruby, materiały sypkie, kWh energii
❓ Nie ma głupich pytań
P:
Czy usługa też jest produktem? Nie ma numeru seryjnego.
O:
Tak. Usługa jest typem produktu, a jej wykonanie egzemplarzem z cyklem życia. Repozytorium ma dla usług status realizacji: SCHEDULED, EXECUTING, COMPLETED, CANCELLED. Wizyta u lekarza, sesja ładowania i przewóz to egzemplarze usług.
P:
Partia to tylko numer na etykiecie?
O:
Partia w repozytorium to byt: do jakiego typu należy, ile sztuk zawiera, kiedy wyprodukowana, daty „sprzedaj do”, „zużyj do” i „najlepiej spożyć przed”, a także zakres numerów seryjnych. Unijne prawo żywnościowe (rozporządzenie 178/2002, art. 18) wymaga identyfikowalności w łańcuchu dostaw. Bez partii jako bytu wycofanie produktu oznacza wycofanie wszystkiego.
⚠️ Uwaga

Cena nie jest atrybutem produktu. Kolumna price w tabeli produktów działa do pierwszej promocji, cennika dla firm, waluty albo zmiany cen od 1. dnia miesiąca. Produkt mówi, czym jest rzecz. To, ile kosztuje, zależy od kontekstu, czasu i reguł. Tym zajmuje się archetyp Pricing.

✏️ Zaostrz ołówek

Apteka sprzedaje: lek na receptę (partia, data ważności, numer serii do weryfikacji autentyczności), syrop bez recepty, glukometr na gwarancji i usługę pomiaru ciśnienia. Dobierz strategie śledzenia.

Odpowiedź

Lek na receptę: partia i indywidualny identyfikator opakowania, czyli INDIVIDUALLY_AND_BATCH_TRACKED (w UE opakowania leków na receptę mają unikalny identyfikator do weryfikacji autentyczności). Syrop: BATCH_TRACKED. Glukometr: INDIVIDUALLY_TRACKED (gwarancja). Pomiar ciśnienia: usługa, egzemplarz to wykonanie ze statusem, bez śledzenia fizycznego.

📌 W punktach
  • Typ (katalog) ≠ egzemplarz (ta rzecz, ta umowa, to wykonanie usługi).
  • Cechy mają typy i ograniczenia na poziomie typu i wartości na poziomie egzemplarza.
  • Strategia śledzenia decyduje, czy liczysz sztuki, partie, czy pojedyncze egzemplarze.
  • Wpis w katalogu ma własny okres ważności. Cena nie jest polem produktu.

Pakiety, zestawy i relacje produktów

„wybierz dokładnie jeden, ale nie z tym”
🔰 Co to jest

Pakiet to produkt złożony z nazwanych zestawów i reguł wyboru („dokładnie jeden z…”, „najwyżej dwa”, „jeśli A, to B”). Relacje produktów mówią, co jest następcą, zamiennikiem, ulepszeniem albo czym się nie łączy.

AnalogiaZestaw obiadowy w barze: wybierz jedną zupę, jedno drugie danie i najwyżej dwa dodatki. Deser tylko do zestawu dużego. Rozwiązujekonfiguratory oparte na if-ach, niedozwolone kombinacje w koszyku, migracje taryf i podpowiedzi „pasuje do”. Czym NIE jestNie jest koszykiem. Koszyk to wybór klienta, a pakiet to opis tego, co wolno wybrać.

Operator komórkowy sprzedaje pakiet: abonament + telefon + starter z kartą SIM i akcesoriami. W scenariuszu repozytorium szkolenia obowiązuje reguła: flagowy telefon wymaga abonamentu premium. Starter musi mieć kartę SIM i może mieć najwyżej dwa akcesoria. Starter jest zagnieżdżony w pakiecie z telefonem. To jest archetyp Product w wersji z konfiguracją, a nie lista produktów w koszyku.

Szkielet z repozytorium: PackageType jest produktem (ma identyfikator, nazwę, strategię śledzenia, ograniczenie stosowalności), ale zamiast cech ma strukturę. Struktura to nazwane zbiory produktów (ProductSet) i reguły wyboru (SelectionRule):

RegułaZnaczeniePrzykład
single(set)dokładnie 1 z zestawujedna opcja śledzenia przesyłki
optional(set)0 lub 1kanał powiadomień: SMS albo e-mail albo nic
required(set)co najmniej 1co najmniej jeden numer w ofercie rodzinnej
isSubsetOf(set, min, max)od min do maxdo 2 dodatków
and / or / notzłożenia regułubezpieczenie standardowe albo rozszerzone, nie oba
ifThen(warunek, wtedy)reguła warunkowajeśli telefon flagowy, to abonament premium
▶ Konfigurator pakietu kurierskiego „Transport Premium” klikaj opcje, reguły sprawdzają na żywo
Klikaj opcje w zestawach.
Struktura pakietu (śledzenie, powiadomienia, transport, ubezpieczenie, dodatki; „ubezpieczenie standardowe nie dla transportu zagranicznego”; „najwyżej 2 dodatki”) odtwarza scenariusz logistyczny z repozytorium szkolenia. Nazwy opcji są przetłumaczone.

Relacje między produktami to druga połowa rozdziału. Repozytorium definiuje sześć typów: UPGRADABLE_TO (można przejść na lepszy), SUBSTITUTED_BY (zamiennik, gdy brak), REPLACED_BY (następca po wycofaniu), COMPLEMENTED_BY (pasuje do, czyli cross-sell), COMPATIBLE_WITH i INCOMPATIBLE_WITH. Tworzenie relacji przechodzi przez politykę, tak samo jak w Party.

🧰 Wzorzec działania: migracja taryf
  1. Stara taryfa „Smart 2019” dostaje relację REPLACED_BY → „Smart 2026”. Wpis w katalogu „Smart 2019” kończy ważność, ale typ produktu zostaje: obecni abonenci nadal go mają.
  2. „Smart 2026” ma UPGRADABLE_TO → „Smart Max”. Aplikacja klienta pokazuje ścieżkę podwyższenia bez if-ów po nazwie taryfy.
  3. Dodatek „Roaming UE+” ma INCOMPATIBLE_WITH → „Smart Junior”. Konfigurator nie pozwoli go dołożyć.
  4. Cena obu taryf żyje w Pricing z wersjami. Zmiana ceny „Smart 2019” dla obecnych abonentów to nowa wersja komponentu, a nie edycja produktu.
🔬 Głębiej: ograniczenie stosowalności — produkt nie dla każdego

Repozytorium ma ApplicabilityConstraint: zamkniętą algebrę warunków (equalsTo, in, większe, mniejsze, pomiędzy, and, or, not, zawsze prawda). Warunki są sprawdzane na kontekście (ApplicabilityContext) z nazwanymi parametrami. Kredyt „Pierwsze mieszkanie” jest dostępny, gdy wiek between 18 and 45 and kraj = PL. Takie ograniczenie jest daną, nie kodem, więc dział produktowy może je zmienić bez wdrożenia. Ta sama algebra wraca w Pricing, gdzie decyduje, czy komponent ceny w ogóle się stosuje.

📌 W punktach
  • Pakiet to produkt ze strukturą: nazwane zestawy + reguły wyboru, które można zagnieżdżać.
  • Reguły: single, optional, required, isSubsetOf(min,max), and/or/not, ifThen.
  • Relacje produktów (upgrade, zamiennik, następca, cross-sell, zgodność) zastępują if-y po nazwach.
  • Ograniczenie stosowalności decyduje, komu produkt w ogóle wolno zaproponować.

Pricing: komponenty i kalkulatory

cena to drzewo, nie liczba
🔰 Co to jest

Pricing liczy cenę jako drzewo składników (komponentów), a nie jedną liczbę. Każdy składnik ma nazwę i własny sposób liczenia (kalkulator), a wynik pokazuje, z czego składa się kwota.

AnalogiaRachunek za prąd. Nie ma na nim jednej kwoty „za prąd”, tylko energia, opłata sieciowa, opłata stała i podatek, każda liczona inaczej. Rozwiązujeif-y w kodzie liczącym cenę, brak odpowiedzi na „za co płacę?”, ceny zależne od ilości, czasu i klienta, pytanie „ile kosztowało w lutym?”. Czym NIE jestNie jest polem cena w produkcie. Nie jest też silnikiem promocji: wyjątki typu „−10% dla VIP” to Rules, które nakładają się na cenę.
▶ Anatomia: Pricing kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Wersje cen opisuje szerzej rozdział Cena w czasie (poziom 3).
✅ Sięgnij, gdy
  • cena ma kilka składników i klient chce widzieć każdy z nich;
  • cena zależy od ilości (progi), czasu (minuty, dni) albo parametrów (kwota, okres);
  • cenniki się zmieniają, a stare transakcje trzeba umieć przeliczyć „po staremu”;
  • kod liczący cenę ma rosnącą listę if-ów po typie produktu lub klienta.
⛔ Odpuść, gdy
  • każdy produkt ma jedną stałą cenę i zmienia się ona rzadko. Wystarczy cennik z datą obowiązywania;
  • cenę ustala człowiek przy każdej transakcji (wycena indywidualna). Wtedy zapisz kwotę i powód.

Opcje i konfiguracje

Najpierw kalkulatory, czyli sposoby liczenia jednego składnika. Repozytorium szkolenia ma osiem rodzajów:

KalkulatorCo liczyPrzykład
Stała kwotazawsze tę samą kwotę, niezależnie od parametrówopłata za rozpoczęcie sesji ładowania
Odsetki roczneroczną stopę procentową od kwoty bazowej, przeliczoną na okresodsetki od kredytu
Funkcja progowacenę bazową z przyrostem co określoną liczbę jednostekenergia drożeje o 0,10 zł co 5 kWh
Punkty dyskretnecenę z tabeli „ilość → cena”pakiety 5, 10, 20 sztuk
Dzienny przyrostcenę rosnącą o stałą kwotę każdego dnia od daty startucena biletu rośnie z każdym dniem bliżej wydarzenia
Liniowa w czasiecenę przechodzącą płynnie od wartości A do B między dwiema chwilamistopniowe wprowadzanie nowej stawki
Procentprocent od kwoty bazowejVAT, ubezpieczenie 2% od kwoty kredytu
Złożonywybiera inny kalkulator zależnie od zakresu parametruopłata za konto zależna od wysokości wpływów

Potem decyzje o strukturze ceny:

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Komponent prostyNazwany składnik ceny z jednym kalkulatorem.Każda pozycja, którą klient widzi na rachunku.Niski.
Komponent złożonyGrupa komponentów z sumą i rozbiciem.Cena z kilku składników: „opłaty bazowe”, „nadwyżki”, „podatki”.Drzewo trzeba umieć pokazać klientowi.
Zależności między komponentamiParametr jednego komponentu to wynik innego: wartość, suma, różnica albo iloczyn wyników.VAT od sumy netto, ubezpieczenie od odsetek i prowizji.Cykl zależności to błąd konfiguracji. Wykrywaj go przy zapisie.
Interpretacja: całkowitaWynik to cena za całą ilość.Rachunki, faktury.Pomylenie interpretacji daje ceny wielokrotnie za duże lub za małe.
Interpretacja: jednostkowaWynik to średnia cena jednej jednostki.Cenniki „za sztukę”, porównania ofert.Jak wyżej.
Interpretacja: marginalnaWynik to cena n-tej konkretnej jednostki.Taryfy progowe, „każdy GB ponad limit”.Jak wyżej.
Adaptery interpretacjiSześć przeliczeń między interpretacjami, np. „suma cen marginalnych = cena całkowita”.Gdy kalkulator liczy w jednej interpretacji, a dokument potrzebuje innej.Niski, jeśli interpretacja jest zapisana przy kalkulatorze.
Wersje z ważnościąKomponent ma wersje „od–do”. Promocja to nakładka na krótszy okres.Zmiany cenników, promocje czasowe, reklamacje sprzed miesięcy.Każde liczenie potrzebuje daty, „na kiedy”.
Strategia dodawania wersjiOdrzuć identyczne okresy, odrzuć nachodzące albo pozwól na wszystko.Ceny regulowane: odrzuć nachodzące. Korekty: pozwól na wszystko.Zła strategia pozwala na dwie ceny tego samego dnia.
Ograniczenie stosowalnościWarunek, kiedy komponent w ogóle się liczy.Dopłata tylko dla przesyłek zagranicznych, opłata tylko dla klientów bez abonamentu.Warunki są danymi: potrzebują testów.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: jeden komponent na pozycję rachunku, kalkulator stały albo procentowy, wynik z rozbiciem.
  2. Sygnał „cena zależy od ilości”: kalkulator progowy albo tabela punktów i jawna interpretacja.
  3. Sygnał „VAT od sumy”, „opłata od odsetek”: komponent złożony z zależnościami.
  4. Sygnał „od przyszłego miesiąca drożej”, „promocja w lutym”: wersje z ważnością.
⚠️ Typowe błędy początkujących
  • Jedna metoda liczCene() z if-ami po typie produktu. Skutek: każdy nowy produkt to zmiana kodu.
  • Wynik bez rozbicia. Skutek: reklamacja „dlaczego 81 zł?” wymaga programisty.
  • Nadpisanie ceny w cenniku zamiast nowej wersji. Skutek: nie da się przeliczyć zamówienia sprzed zmiany.

W praktyce i w repozytorium

Sesja ładowania auta w scenariuszu e-mobility z repozytorium szkolenia kosztuje: energię hurtową w progach (0,60 zł/kWh za pierwsze 5 kWh, każdy kolejny próg 5 kWh droższy o 0,10 zł), opłatę sieciową 0,15 zł/kWh, opłatę operatora ładowarki 1,50 zł za sesję plus 0,25 zł/kWh i 0,10 zł/min oraz marżę dostawcy usługi 0,10 zł/kWh. Cena jest drzewem komponentów, a każdy komponent liczy inny kalkulator.

Archetyp Pricing w repozytorium ma trzy piętra:

▶ Plac zabaw kalkulatorów ta sama krzywa, trzy interpretacje
Przesuń suwak ilości.
Funkcja progowa używa parametrów z repozytorium (0,60 zł bazowo, +0,10 zł co 5 kWh) i jest tu traktowana jako cena marginalna n-tej kWh. „Złożony” odtwarza opłatę za konto zależną od wpływów (pełna opłata poniżej 1000 zł, obniżona od 1000 zł); kwoty opłat i próg 3000 zł są ilustracyjne. Punkty dyskretne (pakiety 5/10/20/40 sztuk) są wymyślone.

Najmniej oczywisty element to interpretacja (Interpretation). TOTAL to cena za całą ilość. UNIT to średnia cena jednostki. MARGINAL to cena n-tej konkretnej jednostki. Repozytorium ma adaptery między nimi, np. „marginalna → całkowita = suma marginalnych od 1 do n” albo „całkowita → marginalna = total(n) − total(n−1)”. To nie jest akademickie: taryfy progowe energii, rabaty ilościowe i cenniki „pierwsze 5 GB w abonamencie, potem 2 zł za GB” różnią się dokładnie interpretacją.

🧰 Wzorzec działania: od if-ów do konfiguracji (showcase szkolenia)
  1. v1: if-y w serwisie wybierają kalkulator („jeśli express, to mnożnik 1,5”).
  2. v2: jeden „mądry” kalkulator dostaje wszystkie parametry i ma if-y w środku. Problem się tylko przeniósł.
  3. v4: każda opcja (basic, express, SMS, pobranie) to produkt, a kombinacja to nazwany ProductSet. Wybór kalkulatora to wyszukanie w mapie ProductSet → CalculatorId. If-y znikają, a nowa kombinacja to nowy wpis.
  4. Ten sam wzorzec showcase powtarza dla banku (kredyt konsumpcyjny, hipoteka, karta debetowa; cztery wersje) i dla telekomunikacji (od razu w wersji z ProductSet). Logika jest identyczna, zmienia się tylko kostium.
🤓 Ekspert: zależności komponentów to graf

W scenariuszu bankowym z repozytorium kredyt 100 000 zł na rok to: odsetki 5 500 zł (5,5%), prowizja 500 zł, czyli „baza kredytu” 6 000 zł. Ubezpieczenie liczy się jako 2% od tej bazy, więc 120 zł. Razem 6 120 zł. Ubezpieczenie zależy od wyniku dwóch innych komponentów. Zależności tworzą graf skierowany. Cykl w nim (VAT od kwoty brutto, która zawiera VAT) to błąd konfiguracji, który warto wykrywać przy zapisie, np. sortowaniem topologicznym z części o grafach. Moduł pricing w repozytorium nie robi tego jawnie.

✏️ Zaostrz ołówek

Abonament telco: 45 zł opłat bazowych (dwa komponenty: 25 zł i 20 zł), w cenie 5 GB danych i 30 minut roamingu, każdy GB ponad limit po 2 zł, roaming ponad 30 minut po 1,50 zł/min, a VAT od sumy netto. Narysuj drzewo komponentów. Ile kosztuje miesiąc z 8 GB i 50 minutami roamingu (netto)?

Odpowiedź

Drzewo: Rachunek = [Bazowa A (25) + Bazowa B (20) + Nadwyżka danych (progowo, 2 zł × GB ponad 5) + Nadwyżka roamingu (1,50 zł × min ponad 30)], a VAT jest dzieckiem zależnym od sumy netto. Netto: 45 + 3 × 2 + 20 × 1,50 = 45 + 6 + 30 = 81 zł. Kwoty składowe odpowiadają scenariuszom telco z repozytorium szkolenia (tam bazowo 45 zł, nadwyżka danych 6 zł, nadwyżka roamingu 30 zł).

📌 W punktach
  • Cena to drzewo komponentów z rozbiciem, a nie jedna liczba.
  • Kalkulator to czysta funkcja. Komponent go nazywa i łączy z zależnościami.
  • Interpretacje TOTAL, UNIT i MARGINAL to trzy różne odpowiedzi na „ile to kosztuje”.
  • Wybór wariantu to indeks (ProductSet → kalkulator), a nie if-y.

Cena w czasie: wersje i ważność

„ile kosztowało 14 lutego?”

Scenariusz z repozytorium: ładowanie kosztuje 2,50 zł/kWh netto + 23% VAT. Sesja 20 kWh w styczniu to 50,00 zł + VAT = 61,50 zł. W lutym jest promocja walentynkowa, a od maja dochodzi opłata parkingowa 5 zł. Klient reklamuje sesję z 14 lutego w czerwcu. System musi policzyć cenę tak, jak obowiązywała 14 lutego, a nie dzisiejszą.

Rozwiązanie z repozytorium: komponent ma listę wersji, a każda wersja ma kalkulator, okres ważności (validFrom, validTo) i chwilę zdefiniowania (definedAt). Przy liczeniu na chwilę t:

  1. bierze się wersje ważne w t,
  2. wygrywa ta z najmłodszym validFrom, czyli najbardziej szczegółowa nakładka,
  3. przy równym validFrom wygrywa później zdefiniowana (definedAt),
  4. brak ważnej wersji to jawny błąd, a nie cicha cena zero.

Promocja nie nadpisuje ceny bazowej. Jest nakładką: wersja „od 1 lutego do 28 lutego” przykrywa wersję „od 1 stycznia bezterminowo”. 1 marca baza znów wygrywa i nikt nie musi pamiętać o „przywróceniu ceny”. Test z repozytorium sprawdza właśnie to: 100 zł w styczniu, 80 zł w lutym, 100 zł w marcu.

▶ Oś wersji przesuń datę, dodaj nakładki
Przesuń datę.
Wersje i kwoty w stylu testów repozytorium (baza 100 zł, luty 80 zł). Druga promocja i korekta są dodane dla ilustracji. Rok 2026 nie jest przestępny, więc oś ma 365 dni.
Strategia dodawania wersjiCo odrzucaKiedy
REJECT_IDENTICALwersję z identycznym okresem ważnościdomyślnie: nakładki tak, duplikaty nie
REJECT_OVERLAPPINGkażdą wersję nachodzącą na istniejącąregulowane cenniki, gdzie w danym dniu może obowiązywać tylko jedna cena
ALLOW_ALLnic; przy remisie wygrywa nowsza (definedAt)korekty: „ta sama ważność, ale poprawiona wartość”
🔬 Głębiej: dwa czasy — kiedy obowiązuje i kiedy się dowiedzieliśmy

validFrom/validTo to czas obowiązywania (Fowler: actual time, w bazach danych: valid time). definedAt to czas zapisu (Fowler: record time, w bazach: transaction time). Oba razem to model bitemporalny. Dzięki niemu odpowiesz na dwa różne pytania: „ile kosztowało 14 lutego?” i „ile myśleliśmy 15 lutego, że kosztowało 14 lutego?”. To drugie zadaje audytor, gdy po korekcie wstecz klient ma fakturę z inną kwotą niż dzisiejsze wyliczenie. Pełne odtworzenie stanu wiedzy wymaga filtrowania także po definedAt ≤ chwila_pytania. Mechanizm z repozytorium używa definedAt tylko do rozstrzygania remisów. Więcej o dwóch czasach jest w rozdziale o czasie w księgowości.

⚠️ Uwaga

Zamówienie nie przelicza ceny przy każdym odczycie. Po zatwierdzeniu linia ma wycenę z rozbiciem, czyli migawkę. Wersje cen służą do wyceny nowych zamówień, symulacji „co by było” i reklamacji. Nie służą do cichej zmiany kwot na wystawionych dokumentach.

📌 W punktach
  • Komponent ma wersje z okresem ważności. Promocja to nakładka, a nie nadpisanie.
  • Wygrywa najmłodszy validFrom, przy remisie później zdefiniowana wersja.
  • Strategie: odrzuć identyczne, odrzuć nachodzące, pozwól na wszystko.
  • Ważność + chwila zapisu = model bitemporalny dla reklamacji i audytu.

Rules: predykat, aplikator, strażnik

kolejność rabatów to decyzja biznesowa

Sklep ma trzy promocje: −10% dla VIP, −20% na kategorię „ogród” i −15 zł przy koszyku powyżej 200 zł. Cena bazowa 100 zł. Ile płaci VIP za grill? 100 → 90 → 72 → 57? A może −10% i −20% liczone od bazy, czyli 70 zł? A może promocje się nie łączą? Każda z tych odpowiedzi jest gdzieś na świecie poprawna. Arlow i Neustadt mają osobny archetyp Rule, a repozytorium szkolenia moduł rules. Oba z tego samego powodu: reguły zmieniają się szybciej niż reszta modelu i muszą być danymi z jawną semantyką.

🔰 Co to jest

Rules to wyjątki i promocje zapisane jako osobne, nazwane reguły. Każda reguła mówi: kiedy działa (warunek), co zmienia (np. −10%) i czego nie wolno (np. zejść poniżej marży).

AnalogiaRegulamin promocji na kartce przy kasie: „−20% na ogród, nie łączy się z kartą stałego klienta, cena nie niższa niż…”. Kasjer stosuje punkty po kolei, a paragon pokazuje każdy rabat osobno. Rozwiązujeif-y „jeśli VIP i ogród, ale nie w czwartek” rozsiane po kodzie, spory o kolejność rabatów, pytanie klienta „dlaczego nie dostałem zniżki?”. Czym NIE jestNie jest cennikiem. Cena bazowa przychodzi z Pricing, a reguły ją modyfikują. Nie jest też ogólnym „silnikiem reguł” do wszystkiego: to model jednej rodziny decyzji z jawną kolejnością.
▶ Anatomia: Rules kliknij część
Nazwy w nawiasach pochodzą z modułu rules repozytorium szkolenia (część o rabatach). Algebry reguł opisuje rozdział Algebra reguł (poziom 3).
✅ Sięgnij, gdy
  • w wymaganiach są zdania „chyba że”, „nie łączy się z”, „tylko dla”;
  • dział marketingu chce dodawać promocje bez wdrożeń;
  • trzeba pokazać klientowi, która reguła dała ile;
  • istnieje granica, której żadna promocja nie może przekroczyć (marża, cena minimalna).
⛔ Odpuść, gdy
  • jest jeden rabat, który nigdy się nie zmienia. Wystarczy komponent ceny;
  • „reguła” to w istocie proces z krokami i decyzjami ludzi. Wtedy modeluj proces, a nie regułę.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Warunek na pozycjiSprawdza pozycję: który produkt, czy droższa niż X. Warunki łączy się przez i, lub, nie.Promocje na kategorie, produkty, progi cenowe.W repozytorium warunek na ilości jest tylko szkicem. Trzeba go dopisać.
Warunek na kliencieOsobny warunek mówi, którzy klienci dostają regułę: status (np. VIP), staż, suma wydatków.Programy lojalnościowe, segmenty klientów.Dane o kliencie muszą być aktualne w chwili liczenia.
Zmiana: procent od bazyLiczy procent od ceny bazowej, niezależnie od innych reguł.Gdy rabaty mają się sumować „od ceny katalogowej”.Kilka rabatów może dać cenę bliską zeru. Dodaj strażnika.
Zmiana: procent od wynikuLiczy procent od ceny po poprzednich regułach.Gdy rabaty mają się „składać” (−10%, potem −20% od tego).Wynik zależy od kolejności reguł.
Zmiana: kwotaOdejmuje stałą kwotę od bieżącej ceny.„−15 zł przy koszyku powyżej 200 zł”.Kolejność względem procentów zmienia wynik.
Zmiana: cena stałaUstawia cenę na podaną kwotę.„Wszystko po 9,99 zł”.Unieważnia wcześniejsze reguły w łańcuchu.
StrażnikOdrzuca zmianę, gdy wynik jest niedopuszczalny, np. poniżej 75% ceny bazowej. Pozycja zostaje bez zmian.Ochrona marży, ceny minimalne z umów.Klient może nie rozumieć, czemu rabat „nie zadziałał”. Pokazuj listę zmian.
Łańcuch i kolejnośćReguły działają po kolei. Każda zapisuje w pozycji nazwaną zmianę.Zawsze, gdy reguł jest więcej niż jedna.Kolejność to decyzja biznesowa. Zapisz ją jawnie.
Źródło konfiguracji: kodReguły wpisane na stałe w klasie konfiguracji.Mało reguł, rzadkie zmiany.Każda zmiana to wdrożenie.
Źródło konfiguracji: wyliczaneReguły tworzone z danych, np. rabat na produkty, których jest za dużo w magazynie.Promocje sterowane stanem firmy.Trzeba testować wynik dla różnych stanów danych.
Źródło konfiguracji: bazaReguły i ich parametry zapisane jako wiersze w bazie i składane w obiekty.Marketing zmienia promocje sam.Potrzebne wersje i podgląd skutków przed publikacją.
Algebry interpretacjiTo samo wyrażenie reguły daje odpowiedź „tak/nie”, „jak bardzo”, „ile punktów” albo „dlaczego”.Lojalność, scoring, wyjaśnienia dla obsługi klienta.Wyższy próg wejścia. Opisane na poziomie 3.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: jedna reguła = warunek + zmiana + nazwa. Każda zastosowana zmiana jest zapisana w pozycji.
  2. Sygnał „promocje się łączą”: łańcuch z jawną kolejnością i decyzją „od bazy” albo „od wyniku”.
  3. Sygnał „nie poniżej marży”: strażnik.
  4. Sygnał „marketing chce sam”: konfiguracja z bazy, z wersjami i podglądem.
⚠️ Typowe błędy początkujących
  • Rabaty jako if-y w metodzie liczącej cenę. Skutek: nikt nie wie, w jakiej kolejności działają.
  • Brak decyzji „od bazy czy od wyniku”. Skutek: ta sama promocja daje inne kwoty w sklepie i w aplikacji.
  • Brak listy zastosowanych zmian. Skutek: reklamacja „gdzie mój rabat?” wymaga przeglądania logów.

W praktyce i w repozytorium

Szkielet modyfikatora oferty w repozytorium (ConfigurableItemModifier) ma trzy części:

Modyfikatory łączy się w łańcuch (ChainOfferItemModifier). Każda zastosowana zmiana zapisuje się w pozycji jako nazwana modyfikacja, więc klient i dział reklamacji widzą, która reguła ile dała.

▶ Łańcuch rabatów zmieniaj kolejność i sposób liczenia, włącz strażnika marży
Kliknij przyciski.
Promocje i kwoty są ilustracyjne. Mechanika (predykat, aplikator „od bazy” lub „od wyniku”, strażnik, który zostawia pozycję bez zmian) odpowiada modułowi rules z repozytorium szkolenia.
🔥 Rozmowa przy kominku
MarketingChcę, żeby promocje się sumowały. Klienci to lubią.
Strażnik marżySumuj, ile chcesz. Ale jeśli wynik zejdzie poniżej 75% ceny bazowej, ta zmiana się nie stanie. Pozycja zostanie, jaka była przed tą regułą.
MarketingTo skąd klient będzie wiedział, czemu nie dostał rabatu?
Strażnik marżyZ listy modyfikacji. Każda reguła, która zadziałała, jest tam z nazwą. Tej, która nie zadziałała, tam nie ma. Możesz to pokazać w koszyku.
📌 W punktach
  • Reguła = predykat (czy dotyczy) + aplikator (jak zmienia) + strażnik (czy wynik dopuszczalny).
  • „Procent od bazy” i „procent od wyniku” dają różne ceny. To decyzja biznesowa, a nie szczegół.
  • Kolejność w łańcuchu ma znaczenie, gdy mieszasz kwoty stałe i procenty.
  • Każda zastosowana modyfikacja jest nazwana i widoczna.

Algebra reguł: jedno wyrażenie, wiele odpowiedzi

„czy?”, „jak pewnie?”, „dlaczego?”

Program lojalnościowy ma regułę: „klient jest aktywny, jeśli w ostatnich 90 dniach wydał ponad 500 zł i (zrobił ponad 5 zakupów lub ma status VIP)”. Różne części firmy zadają o nią różne pytania. Sklep pyta: czy klient spełnia regułę? Marketing pyta: jak pewnie ją spełnia? Ktoś, kto ledwo przekroczył próg, łatwo straci status i jest dobrym celem kampanii utrzymaniowej. Obsługa klienta pyta: dlaczego klient nie dostał statusu?

Repozytorium szkolenia rozwiązuje to algebrą: wyrażenie reguły jest drzewem (and, or, not, porównanie metryki w oknie czasowym, stała), a interpretacja jest wymienna. Interfejs Algebra<R> definiuje operacje and, or, not, metricCmp i constScore (oraz sum, ifThenElse i label) dla dowolnego typu wyniku R. Implementacje:

▶ Jedna reguła, cztery algebry przesuwaj metryki klientki
aktywny = wydatki > 500 AND ( zakupy > 5 OR VIP )
Przesuwaj suwaki.
Marginesy rozmycia (100 zł, 2 zakupy) i punktacja (40 + 30 + 30) są ilustracyjne. Repozytorium definiuje marginesy per metryka w konfiguracji FuzzyAlgebra. Operatory rozmyte min, max i 1−x odpowiadają implementacji z repozytorium.
🤓 Dlaczego to działa: Visitor albo „tagless final”

Wyrażenie nie wie, jak będzie interpretowane. Repozytorium pokazuje dwa sposoby. Pierwszy to klasyczny wzorzec Visitor (ExpressionVisitor). Drugi to interfejs algebry z parametrem typu wyniku (w programowaniu funkcyjnym znany jako tagless final). Zysk biznesowy: jedna definicja reguły zasila decyzję, kampanię i wyjaśnienie. Nie ma trzech kopii logiki, które rozjadą się przy pierwszej zmianie progu.

📌 W punktach
  • Regułę zapisz raz jako drzewo wyrażenia, a interpretacje wymieniaj.
  • Logika odpowiada „czy”, rozmyta „jak pewnie”, punktowa „ile punktów”, wyjaśniająca „dlaczego”.
  • Rozmyte and/or/not: minimum, maksimum, 1 − x.
Część IV

Zasoby i zamówienia

Co jest dostępne, kto to blokuje i na jak długo, i jak zamówienie prowadzi wszystkie archetypy przez swój cykl życia.

Inventory: trzy rodzaje dostępności

rezonans, zbiornik i pokój hotelowy

Scenariusze repozytorium szkolenia pokazują trzy zupełnie różne „czy jest wolne?”. Radiologia rezerwuje rezonans magnetyczny: jest jeden, albo wolny, albo zajęty. Firmy flotowe rezerwują paliwo ze zbiornika 10 000 litrów: każda bierze ile chce, dopóki starcza. Gość rezerwuje pokój 101 na noc 15 czerwca: ten sam pokój jest wolny 14 i 16 czerwca. Trzy modele dostępności, jeden archetyp.

🔰 Co to jest

Inventory odpowiada na pytanie „czy jest wolne?”. Wie, jakie zasoby istnieją, ile ich jest i kto, na ile i na jak długo je zablokował.

AnalogiaRecepcja hotelu z tablicą kluczy i grafikiem pokoi. Recepcjonista nie wie, ile kosztuje pobyt, ale wie, który pokój jest wolny w którą noc i dla kogo jest odłożony. Rozwiązujesprzedaż tego samego miejsca dwóm osobom, porzucone koszyki blokujące towar, rezerwacje „wszystko albo nic” (pokój na trzy noce, sala z zespołem), kolejki chętnych. Czym NIE jestNie jest katalogiem produktów (Product) ani zamówieniem (Ordering). Nie liczy cen. Nie jest też księgowością magazynową: wartość zapasów to Accounting.
▶ Anatomia: Inventory kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Blokady, rezerwacje i listy oczekujących opisuje szerzej rozdział Blokady i kolejki (poziom 3).
✅ Sięgnij, gdy
  • dwie osoby mogą chcieć tego samego naraz (miejsce, termin, urządzenie, towar);
  • coś trzeba „odłożyć” na chwilę: koszyk, rezerwacja wstępna, przedsprzedaż;
  • zasób jest dostępny w czasie: pokój na noc, gabinet na godzinę, auto na dzień;
  • kilka zasobów trzeba zarezerwować razem albo wcale.
⛔ Odpuść, gdy
  • zasób jest praktycznie nieograniczony (pliki do pobrania, licencje bez limitu);
  • jedyne pytanie to „ile mamy na stanie?” bez rezerwacji i bez konkurencji o zasób. Wystarczy saldo ilości.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Dostępność indywidualnaJeden konkretny zasób: wolny albo zajęty w całości.Rezonans, auto o numerze VIN, laptop z wypożyczalni.Niski.
PulaZasób o pojemności (ilość). Każdy bierze część, dopóki starcza.Paliwo w zbiorniku, miejsca bez numerów, limit wejściówek.Nie wiadomo, „która” część jest czyja. Gdy to ważne, wybierz indywidualną.
Dostępność w czasieZasób w przedziale czasu (slocie). Ten sam pokój jest wolny 14 i zajęty 15 czerwca.Hotele, wizyty, sale, sprzęt na godziny.Trzeba ustalić długość slotów i strefę czasową.
Grupa slotówRezerwacja kilku slotów naraz: wszystkie albo żaden.Pobyt na kilka nocy, cykl zabiegów.Większa szansa odmowy. Warto podpowiadać inne terminy.
Zasób złożonyKilka różnych zasobów blokowanych razem. Gdy jeden się nie uda, reszta jest zwalniana.Sala operacyjna z anestezjologiem i aparatem.Trudniej znaleźć termin wspólny dla wszystkich składników.
Blokada bezterminowaZajęcie trwa, dopóki ktoś go nie zwolni.Ostateczny przydział po opłaceniu.Zapomniana blokada to zasób stracony na zawsze.
Blokada czasowaZajęcie wygasa samo po zadanym czasie.Koszyk, rezerwacja wstępna, „trzymamy dla Ciebie 15 minut”.Ktoś musi regularnie zwalniać wygasłe blokady.
Cel rezerwacjiRezerwacja (BOOKING), przydział (ALLOCATION), odłożenie (HOLD), blokada chwilowa (TEMPORARY_LOCK).Gdy różne cele mają różne reguły i raporty.Niski.
Status rezerwacjiOczekująca, potwierdzona, anulowana, wygasła, zrealizowana.Każda rezerwacja z cyklem życia.Przejścia między statusami trzeba pilnować.
Lista oczekującychKolejka chętnych z pojemnością i polityką: kolejność zgłoszeń, priorytet, kwoty dla grup, „kogo da się obsłużyć”.Przedsprzedaż, zapisy, szczepienia, miejsca w przedszkolu.Polityka bywa regulowana prawem. Zapisz ją w modelu.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: jeden model dostępności (indywidualna, pula albo czas), blokada z właścicielem, operacje zablokuj i zwolnij.
  2. Sygnał „koszyk”, „trzymamy przez 15 minut”: blokady czasowe i regularne zwalnianie wygasłych.
  3. Sygnał „kilka nocy”, „razem z zespołem”: grupy slotów i zasoby złożone.
  4. Sygnał „zapisz mnie, jak się zwolni”: lista oczekujących z polityką.
⚠️ Typowe błędy początkujących
  • Kolumna zajety = true. Skutek: nie wiadomo, kto zajął, do kiedy i czy to jeszcze aktualne.
  • Sprawdzenie „czy wolne” i zapis rezerwacji w dwóch krokach bez blokady. Skutek: dwie osoby dostają to samo miejsce.
  • Rezerwacja wielu nocy jako osobne rezerwacje. Skutek: klient dostaje dwie noce z trzech.

W praktyce i w repozytorium

W repozytorium wszystkie trzy implementują wspólny interfejs ResourceAvailability: lock, unlock, isAvailable, availableQuantity i releaseExpired. Wpis magazynowy (InventoryEntry) łączy produkt z jego egzemplarzami, a egzemplarze z zasobami, których dostępność się śledzi. Inventory nie trzyma zamówień i cen. Wie tylko, co, ile i kiedy jest zablokowane i przez kogo.

▶ Trzy modele dostępności rezerwuj i patrz, kiedy system mówi „nie”
Każdy panel startuje z jedną istniejącą rezerwacją.
Stany początkowe odtwarzają scenariusze testowe repozytorium: MRI zarezerwowany przez radiologię; zbiornik 5000 l, w tym 4000 l zablokowane przez flotę A; pokój 101 zajęty przez Annę w nocy 16 czerwca. Rezerwacja wielu nocy blokuje wszystkie albo żadną.
❓ Nie ma głupich pytań
P:
Pokój hotelowy to przecież egzemplarz. Dlaczego nie Individual?
O:
Bo rezerwuje się nie pokój, tylko pokój w czasie. Individual mówi „zajęty albo wolny teraz”. Temporal mówi „wolny 14, zajęty 16”. Ten sam fizyczny zasób ma tyle dostępności, ile slotów. Repozytorium ma też grupowanie slotów (TemporalResourceGroupedAvailability): rezerwacja trzech nocy blokuje wszystkie trzy albo żadną.
P:
A jak zarezerwować salę operacyjną razem z anestezjologiem i aparatem?
O:
Zasobem złożonym. CompositeResourceAvailability najpierw sprawdza dostępność wszystkich składników, potem blokuje każdy. Gdy któraś blokada się nie uda, wycofuje już założone. Albo cały zespół, albo nic.
✏️ Zaostrz ołówek

Lotnisko: miejsca w samolocie z numerami, bagaż rejestrowany do limitu wagi samolotu, rękawy do przylotów w oknach 30-minutowych, wózek dla osoby z niepełnosprawnością. Dobierz modele dostępności.

Odpowiedź

Miejsce z numerem: Individual w obrębie lotu (albo Temporal, jeśli modelujesz fotel w czasie, ale lot i tak jest jednorazowy). Bagaż: Pool w kilogramach. Rękaw: Temporal (slot 30 minut). Wózek z obsługą: zasób złożony (wózek Individual + asystent Temporal), żeby nie zarezerwować wózka bez osoby, która go pcha.

📌 W punktach
  • Individual: egzemplarz. Pool: ilość z pojemności. Temporal: zasób w slocie czasu.
  • Wszystkie mają lock/unlock/availableQuantity/releaseExpired.
  • Wiele slotów i zasoby złożone blokuje się atomowo: wszystko albo nic.
  • Inventory wie, co i przez kogo jest zablokowane. Ceny i zamówienia zostają poza nim.

Blokady, wygasanie i lista oczekujących

kto dostaje zwolnione miejsce?
🔰 Co to jest

Blokada to zajęcie zasobu przez konkretnego właściciela, na zawsze albo na określony czas. Rezerwacja grupuje blokady i ma cel oraz status. Lista oczekujących decyduje, kto dostaje zwolnione miejsce.

AnalogiaBilet w kasie kina trzymany przez 15 minut na Twoje nazwisko. Jeśli nie odbierzesz, wraca do puli, a kasjer bierze następną osobę z listy. Rozwiązujeporzucone koszyki, które blokują towar, rezerwacje „na zawsze”, spory o to, kto powinien dostać zwolnione miejsce. Czym NIE jestNie jest flagą „zajęte”. Blokada zawsze wie, czyja jest i do kiedy obowiązuje.

Szczepienia w 2021 roku, przedsprzedaż biletów na koncert, wolne miejsca w przedszkolu: zasób się zwalnia, a chętnych jest wielu. „Kto pierwszy, ten lepszy” to tylko jedna z polityk. Repozytorium szkolenia rozbiera ten problem na części:

PolitykaKto dostaje miejsceKiedy
FifoSelectionPolicykto pierwszy się zapisałsprawiedliwość proceduralna, prosta do wyjaśnienia
PrioritySelectionPolicynajwyższy priorytettriaż medyczny, klienci z SLA premium
QuotaSelectionPolicypierwszy z segmentu, który nie wyczerpał kwotypule dla grup (np. miejsca dla mieszkańców i dla przyjezdnych)
CriteriaSelectionPolicypierwszy, którego da się obsłużyć tym, co się zwolniłozwolniło się 2 miejsca, a pierwsza grupa w kolejce liczy 4 osoby
▶ Zwolniło się miejsce ta sama kolejka, cztery polityki
Wybierz politykę i zwolnij miejsca.
Kolejka, priorytety, segmenty i czasy są ilustracyjne. Polityki działają jak w repozytorium: priorytet bierze pierwszego z kolejki priorytetowej, kwota pomija segmenty z wyczerpanym limitem, kryterium bierze pierwszego, którego da się obsłużyć. Blokada „koszyka” trwa 15 minut.
⚠️ Uwaga

Blokada bez terminu to wyciek zasobu. Klient wkłada bilet do koszyka i zamyka kartę. Bez czasu trwania bilet jest „zajęty” na zawsze, a kolejka stoi. Każda blokada, która nie jest ostateczną alokacją, powinna mieć czas trwania (HOLD, TEMPORARY_LOCK). Trzeba też ustalić, kto i kiedy woła releaseExpired(): zadanie cykliczne czy sprawdzenie przy każdym odczycie.

📌 W punktach
  • Blokada ma właściciela i czas trwania. Czasowe wygasają same.
  • Rezerwacja grupuje blokady, ma cel i cykl życia.
  • Lista oczekujących to pojemność + polityka: FIFO, priorytet, kwota, kryterium.
  • Wybór polityki to decyzja biznesowa, często regulowana. Zapisz ją w modelu.

Ordering: cykl życia i role w zamówieniu

kto zamawia, kto płaci, kto odbiera

Zamówienie korporacyjne: dział zakupów centrali zamawia, księgowość spółki zależnej płaci, a towar trafia do trzech oddziałów, każdy z innym odbiorcą i inną osobą do kontaktu przy dostawie. Jedna linia jest do odbioru osobistego przez upoważnionego kierowcę. Model „zamówienie ma klienta i adres” tego nie udźwignie. Scenariusze repozytorium szkolenia (zamówienia korporacyjne, różni odbiorcy na liniach) testują dokładnie takie przypadki.

🔰 Co to jest

Ordering modeluje zlecenie: kto zamawia, płaci, odbiera i wykonuje, co jest zamówione (linie), za ile (wycena każdej linii) i w jakim stanie jest całość.

AnalogiaKartka zamówienia w restauracji. Stolik zamawia, jedna osoba płaci za wszystkich, każde danie trafia do innej osoby, a kuchnia odhacza, co już wydała. Rozwiązuje„zamówienie ma jednego klienta i jeden adres”, zmiany po zatwierdzeniu bez kontroli, ceny ręczne bez śladu, zamówienia zawieszone po nieudanej płatności. Czym NIE jestNie jest fakturą, płatnością ani wysyłką. To osobne byty, z którymi zamówienie rozmawia przez porty. Nie przechowuje też „żywych” danych klienta, tylko ich migawkę.
▶ Anatomia: Ordering kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Porty to interfejsy, przez które zamówienie prosi inne moduły o alokację, płatność, realizację i wycenę.
✅ Sięgnij, gdy
  • zamawia ktoś inny niż płaci albo odbiera;
  • zamówienie ma stany i reguły, co wolno zmienić w którym stanie;
  • linie mają różnych odbiorców, terminy lub sposoby realizacji;
  • zatwierdzenie uruchamia kilka kroków: rezerwację, płatność, realizację.
⛔ Odpuść, gdy
  • „zamówienie” to natychmiastowa sprzedaż przy kasie bez stanów pośrednich. Wystarczy paragon i zapis w Accounting;
  • zamówieniami zarządza zewnętrzna platforma, a Ty dostajesz tylko gotowe zlecenia do realizacji.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Role w zamówieniuSześć ról: zamawiający, płatnik, odbiorca, wykonawca, kontakt przy dostawie, osoba upoważniona do odbioru.Zamówienia firmowe, dostawy do wielu miejsc, odbiór osobisty.Każda rola to migawka danych strony, którą trzeba aktualizować świadomie.
Polityka ról zamówieniaIlu może być zamawiających, płatników i odbiorców na całe zamówienie.Zawsze. W repozytorium: jeden zamawiający, jeden wykonawca, najwyżej jeden płatnik.Płatność „po równo przez kilku” wymaga zmiany polityki albo osobnych zamówień.
Polityka ról liniiKtóre role wolno przypiąć do pojedynczej linii.Różni odbiorcy i osoby kontaktowe per linia.Reguły na dwóch poziomach trzeba testować razem.
Migawki stronZamówienie zapisuje identyfikator i kopię danych strony z chwili złożenia.Zawsze. Dokument ma pokazywać dane z dnia złożenia.Migawki trzeba objąć polityką retencji danych osobowych.
Wycena linii: brakLinia jeszcze nie ma ceny.Szkic zamówienia, zapytanie ofertowe.Nie wolno zatwierdzić bez ceny ostatecznej.
Wycena linii: wstępnaCena orientacyjna, nieostateczna.B2B, kursy walut, dostępność do potwierdzenia.Klient może traktować ją jak obietnicę.
Wycena linii: wyliczonaCena z kalkulatora z rozbiciem. Ostateczna.Standardowa sprzedaż.Niski.
Wycena linii: ręcznaCena wpisana przez człowieka, z polem na powód. Ostateczna.Negocjacje, wyjątki handlowe.Powód trzeba wymusić. Repozytorium go nie waliduje.
Stany zamówieniaSzkic, zatwierdzone, oczekujące na alokację, w realizacji, zrealizowane, zamknięte, anulowane. W repozytorium dwa z nich (oczekujące na alokację i zamknięte) są w słowniku stanów, ale zamówienie jeszcze do nich nie przechodzi.Zawsze.Każde przejście potrzebuje reguły, co wolno w danym stanie.
Porty do innych modułówMagazyn, płatności, realizacja, wycena, fakturowanie jako interfejsy.Gdy zatwierdzenie dotyka innych archetypów.Porażka w połowie wymaga kompensacji.
Kompensacja albo blokady czasoweCofnięcie wcześniejszych kroków, gdy późniejszy się nie uda, albo blokady, które same wygasną.Płatność kartą po rezerwacji towaru.Bez tego odrzucone płatności „zjadają” stan magazynu.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: zamawiający jako migawka, linie z produktem i ilością, wycena wyliczona, stany szkic → zatwierdzone → zrealizowane.
  2. Sygnał „płaci kto inny”, „dostawa do oddziałów”: role na zamówieniu i liniach z politykami.
  3. Sygnał „cena do negocjacji”: wyceny wstępne i ręczne z powodem.
  4. Sygnał „płatność się nie udała”: kompensacja albo blokady czasowe w Inventory.
⚠️ Typowe błędy początkujących
  • Referencja do klienta zamiast migawki. Skutek: stare zamówienie nagle pokazuje nowy adres.
  • Status jako dowolny tekst. Skutek: „wysłane”, „Wysłane” i „w drodze” w jednym raporcie.
  • Faktury, płatności i wysyłki jako pola zamówienia. Skutek: druga rata albo druga paczka wymaga przebudowy.

W praktyce i w repozytorium

Szkielet z repozytorium:

▶ Zatwierdzenie zamówienia alokacja → płatność → realizacja, i co się dzieje, gdy coś pęknie
Zamówienie jest w stanie DRAFT.
Przebieg odtwarza metodę zatwierdzania z repozytorium szkolenia: alokacja każdej linii, potem autoryzacja i pobranie płatności, potem start realizacji. Każda porażka zostawia zamówienie w DRAFT. Kwoty i produkty są ilustracyjne.
⚠️ Uwaga: kompensacja

Jeśli płatność się nie uda po alokacji towaru, zamówienie zostaje w DRAFT. Ale alokacje już istnieją. Uproszczony kod demonstracyjny repozytorium kończy się w tym miejscu wyjątkiem. W systemie produkcyjnym trzeba je zwolnić (kompensacja w stylu sagi) albo zakładać je jako blokady czasowe (HOLD), które wygasną same. Inaczej każda odrzucona karta „zjada” stan magazynu.

🤓 Praktyk: wycena linii to też stan

B2B często zaczyna od wyceny wstępnej (EstimatedPricing): „około 12 000 zł, zależnie od kursu i dostępności”. Przed zatwierdzeniem przychodzi wycena wyliczona z rozbiciem. Handlowiec może nadpisać cenę, ale tylko jako ArbitraryPricing z powodem (repozytorium ma na niego pole, ale go nie waliduje, więc wymuś niepusty powód) („negocjacje, zgoda dyrektora 14.03”). Tylko wyliczona i ręczna są ostateczne (isDefinitive). Raport „ile sprzedaliśmy poniżej cennika i dlaczego” to wtedy proste zapytanie, a nie śledztwo.

🔬 Głębiej: Order ≠ faktura ≠ płatność ≠ wysyłka

Arlow i Neustadt opisują Order jako osobny wzorzec, a płatność (Payment) jako osobny archetyp z w większości opcjonalnymi atrybutami. Jedno zamówienie może mieć trzy wysyłki, dwie faktury i pięć wpłat (zaliczka, raty, dopłata). Repozytorium szkolenia oddziela je przez porty: InventoryService, PaymentService, FulfillmentService, PricingService i BillingService. Zamówienie zna tylko wynik (zaalokowano, pobrano, status realizacji), a realizacja raportuje postęp zdarzeniem FulfillmentUpdated. Status realizacji (NOT_STARTED, IN_PROGRESS, PARTIALLY_COMPLETED, COMPLETED, FAILED) przesuwa zamówienie do PROCESSING albo FULFILLED. Kiedy wrzucisz wysyłki, faktury i wpłaty do encji zamówienia, dostaniesz boski obiekt z rozdziału o mapie archetypów.

✏️ Zaostrz ołówek

Firma cateringowa: szkoła zamawia obiady dla 4 klas, rodzice płacą indywidualnie za swoje dzieci, kuchnia centralna przygotowuje posiłki, a woźna w każdej szkole odbiera dostawę. Rozpisz role na poziomie zamówienia i linii.

Odpowiedź

Zamówienie: ORDERER = szkoła, EXECUTOR = kuchnia centralna. Linie na dziecko (albo na klasę) mają RECEIVER i DELIVERY_CONTACT = woźna. PAYER na liniach jest w repozytorium zabroniony, a na poziomie zamówienia może być najwyżej jeden. Płatności per rodzic wymagają więc osobnych zamówień rozliczeniowych (po jednym na płacącego) albo rozszerzenia polityki ról. Warto o to zapytać biznes, zanim napiszesz kod.

📌 W punktach
  • Strony w zamówieniu to migawki Party z rolą: zamawia, płaci, odbiera, wykonuje, kontakt, odbiór.
  • Polityki ról działają osobno dla zamówienia i dla linii.
  • Zatwierdzenie: alokacja → płatność → realizacja. Każda porażka zostawia DRAFT.
  • Wycena linii ma stany, a cena ręczna niesie powód (wymuś, żeby nie był pusty).
Część V

Pieniądze i salda

Saldo to wynik, nie pole. Zapisy, transakcje, reguły księgowania i dwa zegary, które musi znać każdy system z pieniędzmi, punktami albo limitami.

Accounting: konta, zapisy, transakcje

saldo się liczy, nie zapisuje

Luca Pacioli opisał podwójny zapis w 1494 roku. Od tamtej pory działa ta sama zasada: nie nadpisujesz salda, tylko dopisujesz zapisy, a każda operacja ma dwie strony, które się równoważą. Ten archetyp nie dotyczy tylko działu księgowości. Działa wszędzie, gdzie jest saldo: punkty lojalnościowe, minuty w abonamencie, limit karty flotowej, portfel w aplikacji, kaucje, środki pobrania u kuriera. Fowler w Analysis Patterns łączy go z magazynem w jednym rozdziale („Inventory and Accounting”), bo konto może trzymać ilość czegokolwiek, nie tylko pieniądze.

🔰 Co to jest

Accounting modeluje wszystko, co ma saldo. Saldo nie jest polem, które się nadpisuje. To suma niezmiennych zapisów na koncie, a każda operacja (transakcja) przenosi wartość między kontami tak, że nic nie ginie i nic nie powstaje z niczego.

AnalogiaWyciąg z konta bankowego. Bank nie „poprawia salda”. Dopisuje wpływy i obciążenia, a błędny przelew cofa kolejnym zapisem, który też widać na wyciągu. Rozwiązuje„skąd wzięło się to saldo?”, znikające punkty i bonusy, limity, które się nie zgadzają, korekty, które niszczą historię, salda „na dzień”. Czym NIE jestNie jest tylko programem księgowym firmy. Ten sam szkielet obsługuje punkty lojalnościowe, minuty w abonamencie, limity kart i portfele w aplikacji.
▶ Anatomia: Accounting kliknij część
Nazwy w nawiasach pochodzą z repozytorium szkolenia. Reguły księgowania i czas w księgowości mają osobne rozdziały na poziomie 3: Posting rules i Czas w księgowości.
✅ Sięgnij, gdy
  • w wymaganiach jest „saldo”, „limit”, „punkty”, „portfel”, „do wykorzystania”;
  • trzeba udowodnić, skąd się wzięła kwota (spory, audyt, reklamacje);
  • wartości wygasają albo mają datę obowiązywania;
  • jedna operacja zmienia kilka sald naraz (wpłata dzielona na kapitał, odsetki i opłaty).
⛔ Odpuść, gdy
  • liczba to tylko licznik bez znaczenia finansowego i bez sporów (np. liczba wyświetleń);
  • salda prowadzi zewnętrzny system (bank, ERP), a Ty tylko je wyświetlasz.

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Konta bilansoweAktywa, zobowiązania, przychody, koszty. Transakcja na nich zawsze sumuje się do zera.Pieniądze firmy i klientów.Trzeba dobrać typ konta. Pieniądze klienta to zobowiązanie, a nie przychód.
Konta pozabilansoweKonta poza zasadą „suma zero”.Limity, bonusy, punkty, ewidencje pomocnicze.Łatwo pomylić z bilansowymi. Nazwij je jasno.
Typy transakcjiOtwarcie, przeniesienie, odwrócenie, przealokowanie, kompensacja wygaśnięcia albo własny typ.Zawsze. Typ odpowiada na pytanie „co to była za operacja?”.Niski.
Dwie daty zapisuKiedy zapis zarejestrowano i od kiedy obowiązuje.Wpłaty z datą wsteczną, operacje z przyszłą datą, salda „na dzień”.Każde pytanie o saldo musi mówić „na kiedy”.
Ważność zapisuZapis obowiązuje do daty. Po niej niewykorzystana reszta jest jawnie przenoszona transakcją kompensującą.Bonusy, punkty, vouchery, limity okresowe.Ktoś musi regularnie uruchamiać wygaszanie.
Kolejność zużyciaNajstarsze najpierw (FIFO), najnowsze najpierw (LIFO) albo wskazane ręcznie.Gdy zapisy mają różne daty ważności albo różne źródła.Zmiana kolejności zmienia, co wygaśnie.
Reguły księgowaniaZapis na koncie automatycznie tworzy kolejne zapisy: podatek, prowizję, bonus. Reguły mają warunek, sposób liczenia i priorytet.Powtarzalne skutki operacji, które biznes chce zmieniać bez wdrożeń.Reguła może wywołać samą siebie. Sprawdzaj cykle.
Konta-projekcjeKonto „wirtualne” z filtrem na zapisach, bez własnych zapisów.Raporty przekrojowe: przychody z jednego regionu, opłaty jednego segmentu.Wydajność filtra przy dużej liczbie zapisów.
KorektyOdwrócenie, czyli transakcja typu reversal z repozytorium, a w razie potrzeby po nim nowa, poprawna transakcja. Poza repozytorium: korekta różnicowa (Fowler) oraz storno czerwone lub czarne (polska praktyka księgowa).Każdy błąd w zaksięgowanej operacji.Nigdy edycja zapisu. Wybór rodzaju korekty bywa wymogiem prawa.
Migawka saldaSaldo zapamiętane na dzień i dalej liczone od migawki. To opcja projektowa spoza repozytorium.Miliony zapisów na koncie.Migawka to pamięć podręczna. Źródłem prawdy są zapisy.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: konta z typem, niezmienne zapisy, transakcja sumująca się do zera, saldo liczone z zapisów, korekta przez odwrócenie.
  2. Sygnał „limit”, „bonus”: konta pozabilansowe.
  3. Sygnał „wygasa”, „na dzień”: dwie daty, ważność zapisu i kompensacja wygaśnięcia.
  4. Sygnał „zawsze, gdy wpłynie…, nalicz…”: reguły księgowania.
⚠️ Typowe błędy początkujących
  • Kolumna saldo aktualizowana przy każdej operacji. Skutek: przy pierwszym sporze nie da się pokazać, skąd się wzięła kwota.
  • Edycja błędnego zapisu. Skutek: raport z wczoraj i raport z dziś pokazują różne liczby bez śladu dlaczego.
  • Pieniądze klienta (pobranie, kaucja) na koncie przychodu. Skutek: zawyżony przychód i podatek od cudzych pieniędzy.

W praktyce i w repozytorium

Szkielet z repozytorium szkolenia:

▶ Spłata raty kredytu jedna wpłata, cztery konta, zero do zera
Kliknij „Wpłata”.
Podział 1 060 zł na 1 000 zł kapitału, 50 zł odsetek i 10 zł opłat pochodzi ze scenariusza bankowego w repozytorium szkolenia, podobnie jak konto pozabilansowe śledzące spłaty klienta. Znaki zapisów są uproszczone do „+” (uznanie) i „−” (obciążenie). Komunikat błędu jest z repozytorium.
❓ Nie ma głupich pytań
P:
Liczenie salda z tysięcy zapisów nie będzie wolne?
O:
Saldo możesz cache'ować (migawka na koniec dnia + zapisy od migawki), ale źródłem prawdy są zapisy. Gdy cache i zapisy się różnią, rację mają zapisy. Odwrotnie (saldo w kolumnie, historia „dla informacji”) przy pierwszym sporze nie da się udowodnić, skąd wzięła się kwota.
P:
Po co konta pozabilansowe w systemie, który nie jest księgowością?
O:
Bo to idealne miejsce na „pieniądze, które nie są pieniędzmi”: przyznany limit, bonus w minutach, gwarancję, ewidencję spłat na klienta. Mają saldo, historię i ważność, ale nie zaburzają bilansu. W scenariuszach repozytorium bonusy telco i limity kart flotowych są właśnie na kontach pozabilansowych.
✏️ Zaostrz ołówek

Firma kurierska pobiera od odbiorcy 500 zł za pobraniem, a po tygodniu przelewa je nadawcy, potrącając 5 zł prowizji. Jakie konta i jakie transakcje?

Odpowiedź

Konta: kasa/rachunek kuriera (aktywo), „pobrania do wypłaty – nadawca X” (zobowiązanie, bo to nie są pieniądze kuriera), przychód z prowizji. Transakcja 1 (doręczenie): kasa rośnie o 500, zobowiązanie wobec nadawcy rośnie o 500. Transakcja 2 (wypłata): zobowiązanie maleje o 500, kasa maleje o 495, przychód z prowizji rośnie o 5. To zmiany sald; w zapisie księgowym każda transakcja i tak sumuje się do zera. Klasyczny błąd to księgowanie pobrania jako przychodu kuriera.

📌 W punktach
  • Saldo to suma zapisów. Zapisy są niezmienne, a korekta to nowa transakcja.
  • Transakcja na kontach bilansowych sumuje się do zera.
  • Konta pozabilansowe trzymają limity, bonusy i ewidencje bez psucia bilansu.
  • Archetyp działa wszędzie, gdzie jest saldo: punkty, minuty, limity, portfele.

Reguły księgowania i konta-projekcje

zapis wywołuje zapisy

Fowler w Analysis Patterns opisuje regułę księgowania (posting rule): gdy na koncie pojawia się zapis, reguła z poziomu wiedzy tworzy kolejne zapisy na innych kontach. Wpływ na należności odprowadza podatek. Sprzedaż nalicza prowizję handlowcowi. Doładowanie powyżej 100 zł daje bonus. Reguła jest daną, więc nową prowizję wprowadza się konfiguracją.

W repozytorium szkolenia reguła (PostingRule) ma nazwę, warunek kwalifikacji (EligibilityCondition: konto równe X, typ zapisu, typ konta albo własny predykat, łączone przez and), kalkulator (np. stała kwota, procent), konta docelowe i priorytet (domyślnie 100). Mniejsza liczba wykonuje się wcześniej. Reguły uruchamia obsługa zdarzeń o nowych zapisach (PostingRulesEventHandler).

▶ Kolejność reguł zmienia wynik scenariusz z repozytorium: podatek i bonus
Kliknij „Uznanie”.
Reguły, kwoty i priorytety są wzięte ze scenariusza „posting rules in priority order” z repozytorium szkolenia: podatek 50 zł (priorytet 10) i bonus 1% tylko przy saldzie ≥ 1 000 zł (priorytet 20). Pętla z przycisku 💥 jest ilustracją. W symulacji zatrzymuje ją bezpiecznik po 6 iteracjach.
🧰 Wzorzec działania: zwrot w sklepie z VAT (scenariusz z repozytorium)
  1. Sprzedaż: 123 zł brutto = 100 zł netto (przychód) + 23 zł VAT (zobowiązanie podatkowe).
  2. Pełny zwrot to transakcja, która odwraca obie części: przychód −100 i VAT −23. Zwrot „123 zł z przychodu” zawyża dochód i zaniża podatek należny.
  3. Zwrot częściowy 123 zł z zamówienia 246 zł (200 + 46) dzieli się proporcjonalnie: −100 netto i −23 VAT.
  4. Reguła księgowania „zwrot → podział netto/VAT według stawki z oryginalnej sprzedaży” jest daną. Gdy zmieni się stawka VAT, stare zwroty nadal liczą się po starej, bo biorą ją z zapisu sprzedaży.
🤓 Konta-projekcje

Repozytorium ma też ProjectionAccount: konto wirtualne, zdefiniowane filtrem na zapisach. Nie ma typu i nie przyjmuje zapisów. Pokazuje tylko to, co pasuje do filtra, np. „wszystkie przychody z e-mobility w województwie śląskim” albo „wszystkie opłaty naliczone klientom flotowym”. Dzięki temu raporty przekrojowe nie wymagają dodatkowych kont i podwójnego księgowania.

⚠️ Uwaga

Reguły reagują na zapisy, a same tworzą zapisy. Reguła, której warunek obejmuje jej własne konto docelowe, wywołuje samą siebie. Zabezpieczenia: warunek wykluczający transakcje utworzone przez regułę (np. po typie lub metadanych), test konfiguracji szukający cykli w grafie „konto → reguła → konto” i limit głębokości kaskady.

📌 W punktach
  • Reguła księgowania: warunek + kalkulator + konta docelowe + priorytet.
  • Kolejność reguł zmienia wynik, gdy warunek jednej zależy od salda zmienianego przez drugą.
  • Konta-projekcje to filtry na zapisach do raportów przekrojowych.
  • Sprawdzaj konfigurację reguł pod kątem cykli.

Czas w księgowości: dwa zegary i wygasanie

„saldo na poniedziałek według wiedzy ze środy”

Każdy zapis w repozytorium ma dwie daty: occurredAt (kiedy go zarejestrowano) i appliesAt (od kiedy obowiązuje). Scenariusze bitemporalne z repozytorium pokazują oba kierunki. Wpłatę zarejestrowaną w środę, ale z datą poniedziałku, widać w saldzie na poniedziałek. Zapis z datą w przyszłości nie zmienia dzisiejszego salda, dopóki ta data nie nadejdzie. Saldo „na dzień” (balanceAsOf) liczy się po dacie zastosowania.

Drugi wymiar czasu to ważność zapisu. Bonus w scenariuszu telco: w poniedziałek klient dostaje 50 zł w minutach, ważne do środy 10:00. W czwartek osobna transakcja expiration_compensation przenosi niewykorzystaną kwotę na konto „Bonusy wygasłe”. Saldo bonusu spada do zera, a firma wie dokładnie, ile i kiedy wygasło. Kolejne scenariusze: bonus częściowo wykorzystany (kompensuje się tylko reszta) i wiele bonusów naraz zużywanych w kolejności FIFO, z których każdy wygasa osobno. Limity kart flotowych z okresem ważności działają tak samo.

▶ Bonusy z datą ważności tydzień z życia konta minut
Kliknij „Odtwórz tydzień”.
Pierwszy bonus (50 zł, ważny do środy 10:00) i kompensacja w czwartek odpowiadają scenariuszowi telco z repozytorium. Drugi bonus (40 zł, ważny do piątku) i zużycie 30 zł we wtorek są dodane dla ilustracji FIFO i LIFO. Repozytorium ma strategie alokacji zapisów FIFO, LIFO i MANUAL.
KorektaCo robiKiedy
Odwrócenie (reversal)nowa transakcja z zapisami przeciwnymi do oryginału i odwołaniem do niego (refId)błędna transakcja w całości
Odwrócenie + nowa transakcjawycofaj błędną, zaksięguj poprawnąbłąd kwoty lub konta, gdy audyt chce widzieć obie wersje
Korekta różnicowazaksięguj tylko różnicęmała zmiana kwoty, gdy liczy się czytelność obrotów
Storno czerwonezapis po tej samej stronie ze znakiem minuspolska praktyka: korekta, która nie zawyża obrotów konta
Storno czarnezapis po przeciwnej stroniepolska praktyka: korekta widoczna jako osobny obrót
🔬 Głębiej: nazwy u Fowlera i pytanie audytora

Fowler w swoich materiałach o wzorcach księgowych opisuje trzy rodzaje korekt: Reversal Adjustment (odwróć i zaksięguj ponownie), Difference Adjustment (zaksięguj różnicę) i Replacement Adjustment (zastąp oryginał). Ta ostatnia jest wygodna, ale niszczy historię. Dopuszczaj ją tylko przed zamknięciem okresu.

Audytor zadaje pytanie bitemporalne: „jakie było saldo 31 marca według stanu wiedzy z 2 kwietnia?”. Żeby odpowiedzieć, filtrujesz zapisy po appliesAt ≤ 31.03 i occurredAt ≤ 2.04. Zapis wsteczny dodany 10 kwietnia zmienia saldo na 31 marca, ale nie zmienia tego, co raportowałeś 2 kwietnia. Dlatego zamknięcie okresu w praktyce oznacza „od teraz korekty idą z appliesAt w bieżącym okresie”.

📌 W punktach
  • Dwa zegary: kiedy zarejestrowano (occurredAt) i od kiedy obowiązuje (appliesAt).
  • Saldo „na dzień” liczy się po appliesAt. Pełny audyt filtruje po obu datach.
  • Ważność zapisu + transakcja kompensująca = jawne wygasanie z historią.
  • Korekty to nowe transakcje: odwrócenie, różnica, storno. Nigdy edycja zapisu.
Część VI

Czas, zależności i plan

Pod harmonogramem zawsze jest graf. Pod raportem „plan kontra wykonanie” zawsze jest plan, który musi istnieć jako byt, a nie jako zapytanie.

Scheduling: pod spodem zawsze graf

kolejność, cykle, ścieżka krytyczna
🔰 Co to jest

Scheduling układa kroki w czasie na podstawie zależności między nimi („tynki po instalacjach”). Zależności tworzą graf, a daty startu i końca są wynikiem liczenia, a nie ręcznie wpisanymi polami.

AnalogiaGotowanie obiadu. Ziemniaki muszą się ugotować, zanim zrobisz puree. Sos możesz robić w tym czasie. Gdy ziemniaki gotują się dłużej, wiesz od razu, co się przesunie. Rozwiązujeręczne przesuwanie dat po każdym opóźnieniu, zależności w kółko („A po B, B po A”), pytanie „co jest krytyczne?”, planowanie zadań, które się wykluczają. Czym NIE jestNie jest wykresem Gantta: Gantt to tylko widok wyniku. Nie jest też kalendarzem rezerwacji. To, czy sala jest wolna, wie Inventory.
▶ Anatomia: Scheduling kliknij część
Nazwy w nawiasach pochodzą z modułu graphs repozytorium szkolenia. Moduł graphs liczy kolejność (porządek topologiczny), a gdy w grafie jest cykl, zgłasza błąd. Ma też osobne wyszukiwanie cyklu (findFirstCycle). Czasy trwania, daty, typy SS/FF/SF, zwłoki i ścieżkę krytyczną (klasyczna metoda CPM) dopisujesz sam.
✅ Sięgnij, gdy
  • w wymaganiach jest „nie wcześniej niż”, „po zakończeniu”, „równolegle z”;
  • opóźnienie jednego kroku ma przesuwać kolejne;
  • trzeba wiedzieć, które kroki są krytyczne, a które mają zapas;
  • kroki się wykluczają (ta sama sala, ta sama ekipa) albo na siebie wpływają.
⛔ Odpuść, gdy
  • kroki nie zależą od siebie, liczy się tylko termin każdego z nich;
  • kolejność jest zawsze ta sama i zapisana w procesie (np. stałe etapy obsługi zgłoszenia).

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Graf zależnościKroki to wierzchołki, zależności to krawędzie. Kolejność wynika z porządku topologicznego.Zawsze, gdy kroki zależą od siebie.Niski.
Typ zależności: koniec–start (FS)B zaczyna się po końcu A.Najczęstszy przypadek.Niski.
Typy SS, FF, SF (poza repozytorium)Start–start, koniec–koniec, start–koniec.Prace równoległe z przesunięciem, odbiory, zmiany wart.Trudniejsze do wyjaśnienia użytkownikom.
Zwłoka, lag (poza repozytorium)Wymagany odstęp na zależności, np. 28 dni dojrzewania betonu.Czasy technologiczne, okresy oczekiwania.Trzeba ustalić, czy zwłoka liczy się w dniach kalendarzowych, czy roboczych.
Wykrywanie cykliOdrzuca zależność, która tworzy pętlę.Zawsze, gdy zależności wpisują ludzie lub integracje.Sprawdzaj przy zapisie, a nie przy liczeniu.
Ścieżka krytyczna i zapasNajdłuższa ścieżka wyznacza koniec. Zapas mówi, o ile krok może się spóźnić.Projekty, budowy, wdrożenia.Wymaga czasów trwania kroków.
Kolorowanie konfliktówKroki, które się wykluczają, dostają różne „kolory” (sale, ekipy, środowiska).Planowanie egzaminów, środowisk testowych.Szybki algorytm daje górną granicę, a nie zawsze minimum.
Składowe i punkty artykulacjiGrupy elementów, które na siebie wpływają, i elementy, które je łączą.Analiza wpływu zmian w rezerwacjach.Poziom 3.
Cykl zamianWykrywa łańcuch „A chce slotu B, B slotu C, C slotu A” i wykonuje go paczką.Zamiany terminów, wymiany.Cała paczka musi być jedną transakcją.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: kroki z czasem trwania, zależności koniec–start, wykrywanie cykli przy zapisie, daty liczone z grafu.
  2. Sygnał „równolegle, ale z przesunięciem”: typy SS i FF oraz zwłoka.
  3. Sygnał „co nam opóźni koniec?”: ścieżka krytyczna i zapas.
  4. Sygnał „nie mogą iść naraz”: graf konfliktów i kolorowanie.
⚠️ Typowe błędy początkujących
  • Daty startu i końca jako jedyne dane. Skutek: każde opóźnienie to ręczne przesuwanie wszystkiego.
  • Brak sprawdzania cykli. Skutek: harmonogram „liczy się w nieskończoność” albo pokazuje bzdury.
  • Mylenie harmonogramu z dostępnością. Skutek: plan zakłada salę, która jest zajęta.

W praktyce i w repozytorium

Strona szkolenia: „Tworzysz złożony harmonogram. […] Pod spodem to zawsze graf zależności”. Przykłady stamtąd to planowanie zadań na budowie i ścieżka nauki nowej technologii, a domeny to logistyka, edukacja i finanse. Wierzchołki to kroki, krawędzie to zależności, a harmonogram to porządek topologiczny z czasami.

Ten aparat ma długą historię. Metodę ścieżki krytycznej (CPM) opracowali pod koniec lat 50. James Kelley z Remington Rand i Morgan Walker z DuPont. Równolegle marynarka wojenna USA stworzyła PERT dla programu rakiet Polaris. Współczesne narzędzia do harmonogramów używają metody diagramów następstw (PDM) z czterema typami zależności:

TypZnaczeniePrzykład z budowy
FS finish-to-startB zaczyna się po końcu Atynki po instalacjach
SS start-to-startB zaczyna się po starcie A (z opóźnieniem lub bez)hydraulika rusza 2 dni po elektryce, potem idą równolegle
FF finish-to-finishB kończy się po końcu Aodbiór instalacji kończy się po ostatnim podłączeniu
SF start-to-finishB kończy się po starcie Astara ochrona obiektu kończy, gdy nowa zaczyna

Do tego dochodzi zwłoka (lag). Beton fundamentów potrzebuje czasu na dojrzewanie. Jego wytrzymałość projektową określa się zwykle po 28 dniach. Moduł graphs w repozytorium szkolenia ma typ zależności z dowolnymi cechami (DependencyType z gotowym finishToStart), wykrywanie cykli przeszukiwaniem w głąb (findFirstCycle) oraz testy harmonogramów: liniowy, złożony i „diament” (dwie równoległe gałęzie, które się łączą).

▶ Harmonogram domu policz, opóźnij, zapętl
Kliknij „Policz harmonogram”.
Zadania i czasy trwania (w dniach) są ilustracyjne i uproszczone; wszystkie zależności są typu FS, a dojrzewanie betonu pokazano jako osobny krok (w PDM byłaby to zwłoka na zależności). Ścieżka krytyczna (najdłuższa) jest pogrubiona. Zapas to dni, o które zadanie może się spóźnić bez przesuwania końca budowy.
❓ Nie ma głupich pytań
P:
To nie jest po prostu Gantt?
O:
Gantt to widok. Pod nim jest graf. Gdy trzymasz w bazie tylko daty startu i końca, każda zmiana wymaga ręcznego przesuwania wszystkiego, co zależy. Gdy trzymasz graf, daty są wynikiem, a zmiana jednego czasu przelicza resztę.
P:
Skąd cykl w prawdziwych danych?
O:
Z ludzi i integracji. „Kurs A wymaga kursu B” wpisuje jeden dziekanat, a „B wymaga A” drugi. Na budowie „fundamenty po odbiorze geodezyjnym”, a „odbiór po fundamentach”. Cykl to błąd danych, który trzeba złapać przy zapisie zależności, a nie przy liczeniu harmonogramu w poniedziałek rano.
✏️ Zaostrz ołówek

Wdrożenie nowego pracownika: konto w AD, laptop, szkolenie BHP, dostęp do repozytorium (wymaga konta), szkolenie z produktu (wymaga laptopa i dostępu), pierwszy ticket (wymaga obu szkoleń). Które kroki mogą iść równolegle i co jest na ścieżce krytycznej, jeśli laptop dociera 5 dni, a konto zakłada się 1 dzień?

Odpowiedź

Równolegle: konto, laptop i BHP od dnia 0. Dostęp do repozytorium po koncie (dzień 1+). Szkolenie produktowe czeka na laptopa (dzień 5), więc ścieżka krytyczna to laptop → szkolenie produktowe → pierwszy ticket. Zakładamy, że nadanie dostępu do repozytorium zajmuje mniej niż 4 dni. Wtedy przyspieszanie zakładania konta niczego nie zmieni. Zamów laptop wcześniej.

📌 W punktach
  • Harmonogram = graf zależności + porządek topologiczny + czasy.
  • Typy zależności: FS, SS, FF, SF, z opóźnieniem.
  • Ścieżka krytyczna to najdłuższa ścieżka. Opóźnienie poza nią zjada zapas.
  • Cykle wykrywaj przy zapisie zależności.

Algorytmy grafowe w biznesie

kolorowanie, składowe, punkty artykulacji i cykle zamian

Moduł graphs repozytorium szkolenia pokazuje, że „graf” to nie tylko harmonogram. Te same algorytmy rozwiązują problemy, które w biznesie brzmią zupełnie inaczej:

Pytanie biznesoweGrafAlgorytmW repozytorium
Ilu środowisk testowych (sal, ekip) potrzebujemy, skoro część kroków się wyklucza?graf konfliktówkolorowanie wierzchołkówConcurrency (zachłanne kolorowanie z JGraphT)
Które rezerwacje muszą negocjować razem, bo na siebie wpływają?graf wpływówspójne składoweInfluanceAnalyzer, InfluenceZone
Które laboratoria wpływają na siebie przez sąsiedztwo i rodzaj procesu (np. drgania)?sąsiedztwo × procesyiloczyn grafów (procesy × sąsiedztwo)PhysicsInfluence, LaboratoryAdjacency
Której rezerwacji nie wolno ruszyć, bo łączy dwie grupy?graf wpływówpunkty artykulacjiBridgingReservations
A chce slotu B, B chce slotu C, C chce slotu A. Jak to zrobić?graf „kto czyj slot chce”wykrycie cyklu + wykonanie paczkąBatchReservationUseCase
Jak klient może dojść do rabatu? Najtaniej czy najszybciej?stany i warunkiścieżki, ścieżki ważoneCustomerPath, testy WaysToAchieve, WeightedPaths

Najbardziej zawiłym przypadkiem są zamiany w cyklu. Każda pojedyncza zmiana jest niemożliwa, bo docelowy slot jest zajęty. Cała paczka jest możliwa. Ten sam kształt ma wymiana nerek między parami dawca–biorca. Za prace o projektowaniu takich rynków Alvin Roth i Lloyd Shapley dostali w 2012 roku Nagrodę Nobla z ekonomii. W repozytorium przypadek użycia buduje graf próśb o zmianę, znajduje prośby zależne, najpierw zwalnia wszystkie sloty źródłowe, a potem przydziela docelowe.

▶ Zamiana terminów w cyklu trzy osoby, trzy zajęte sloty
Anna chce slotu Bartka, Bartek slotu Celiny, Celina slotu Anny.
Osoby i sloty są wymyślone. Kolejność „najpierw zwolnij wszystkie źródła, potem przydziel cele” odpowiada BatchReservationUseCase z repozytorium. W prawdziwym systemie cała paczka musi być jedną transakcją.
🤓 Ekspert: zachłanne kolorowanie to oszacowanie

Minimalna liczba kolorów grafu (liczba chromatyczna) to problem NP-trudny. Zachłanne kolorowanie z repozytorium daje dobrą, szybką górną granicę: „wystarczy najwyżej tyle środowisk”, ale nie zawsze „mniej się nie da”. Kolejność odwiedzania wierzchołków zmienia wynik. Dla planowania sal egzaminacyjnych albo stanowisk testowych to zwykle wystarcza. Raport powinien jednak mówić „potrzeba co najwyżej N”, a nie „potrzeba dokładnie N”.

📌 W punktach
  • Konflikty → kolorowanie. Wpływy → składowe. Krytyczne powiązania → punkty artykulacji.
  • Zamiany w cyklu wykonuje się paczką: najpierw zwolnij wszystkie źródła, potem przydziel cele, w jednej transakcji.
  • Ścieżki w grafie stanów odpowiadają na pytanie „jak klient może dojść do X”.

Plan vs Execution: plan musi istnieć

„jaki był plan wczoraj?”
🔰 Co to jest

Plan vs Execution trzyma plan jako osobny, zapisany byt (najlepiej z wersjami), a wykonanie jako fakty. Porównanie obu daje deltę według jawnej reguły tolerancji: co zgodne, co spóźnione, czego brakuje, co ponad plan.

AnalogiaBudżet domowy i paragony. Budżet zapisujesz na początku miesiąca. Paragony zbierasz przez miesiąc. Na koniec porównujesz, a różnica 3 zł na zakupach to „w normie”, bo taką tolerancję ustaliliście w domu. Rozwiązujepytania „jaki był plan wczoraj?”, „dlaczego raport się zmienił?”, spory o to, co jest spóźnieniem, porównania planu miesięcznego z wykonaniem dziennym, symulacje „co, jeśli”. Czym NIE jestNie jest zapytaniem, które „liczy plan” z bieżących ustawień. Nie jest też harmonogramem: Scheduling układa kroki, a ten archetyp porównuje zamiar z faktami.
▶ Anatomia: Plan vs Execution kliknij część
Nazwy w nawiasach pochodzą z modułu planvsexecution repozytorium szkolenia. Rozdzielczość i symulacje opisuje rozdział Rozdzielczość i symulacje (poziom 3). Wersji planu repozytorium nie ma: to zalecane rozszerzenie.
✅ Sięgnij, gdy
  • w wymaganiach jest „planowaliśmy, a wyszło”, „harmonogram”, „odchylenie”, „zaległość”;
  • trzeba odtworzyć, jaki plan obowiązywał w danym dniu;
  • od wyniku porównania zależą pieniądze lub prawo (odsetki, kary, monity, premie);
  • biznes chce sprawdzać scenariusze „co, jeśli zmienimy plan”.
⛔ Odpuść, gdy
  • nikt nie pyta o przeszłe plany, a porównanie jest tylko informacyjne;
  • plan nie zmienia się w trakcie, a wykonanie jest zawsze „tak albo nie” (np. lista kontrolna).

Opcje i konfiguracje

OpcjaCo robiKiedy wybraćKoszt / ryzyko
Plan jako byt z wersjamiPlan jest zapisany. Zmiana planu tworzy nową wersję z datą i powodem. Repozytorium trzyma tylko bieżący plan: wersje to zalecane rozszerzenie.Zawsze, gdy ktoś zapyta o plan z przeszłości.Trzeba zdecydować, kto może zatwierdzić nową wersję.
Tolerancja dokładnaZgodne tylko identyczne kwoty i daty.Rzadko. Pokazuje, ile „szumu” jest w danych.Prawie wszystko wygląda na odchylenie.
Tolerancja kwotyZgodne, gdy różnica kwot nie przekracza progu (np. 5 gr).Wpłaty z zaokrągleniami, prowizje banków.Próg to decyzja biznesowa z konsekwencjami.
Tolerancja datyZgodne, gdy różnica dat nie przekracza N dni.Karencja, weekendy, sesje rozliczeniowe.Jak wyżej.
Tolerancja ilości lub procentuZgodne, gdy różnica ilości mieści się w sztukach albo procentach.Produkcja, dostawy, zużycie energii.Jak wyżej.
Tolerancja łączonaWszystkie warunki naraz, np. „do 5 gr i do 3 dni”.Harmonogramy płatności.Trudniej wyjaśnić, który warunek nie przeszedł.
Wpłaty częścioweSuma kilku wpłat może pokryć jedną ratę.Klienci płacący ratę w częściach.Trzeba ustalić, której racie przypisać nadwyżkę.
Wynik porównania (delta)Dopasowane pary, pozycje planu bez wykonania, wykonania spoza planu i statystyki.Zawsze.Niski.
Rozdzielczość porównaniaWykonanie sumuje się do szczegółowości planu (np. dni do miesiąca).Plan miesięczny, wykonanie dzienne.Trzeba ustalić, co się liczy (np. poprawki tak, braki nie).
Symulacje i modyfikatoryModyfikator dostaje plan i deltę, a zwraca nowy plan: bufor, rozłożenie reszty, usunięcie raty. W repozytorium nowy plan zastępuje aktywny. Symulację na kopii dopisujesz sam.„Co, jeśli zaplanujemy więcej?”, restrukturyzacja.Symulacja nie może nadpisać planu. Zatwierdzona to nowa wersja.
🧰 Minimum na start, rozbudowa na sygnał
  1. Dzień pierwszy: plan zapisany jako byt, wykonanie jako fakty, jedna tolerancja (kwoty albo daty), wynik z dopasowaniami i brakami.
  2. Sygnał „plan się zmienia”: wersje planu z datą i powodem.
  3. Sygnał „płacą w częściach”, „do 3 dni to nie spóźnienie”: tolerancje łączone i wpłaty częściowe.
  4. Sygnał „plan miesięczny, dane dzienne”, „co, jeśli”: agregacja do rozdzielczości planu i symulacje.
⚠️ Typowe błędy początkujących
  • Plan liczony zapytaniem z bieżących ustawień. Skutek: zmiana SLA zmienia wstecz plan wszystkich otwartych spraw.
  • Tolerancja wpisana w kod raportu. Skutek: wczorajszy i dzisiejszy raport różnią się bez wyjaśnienia.
  • Porównywanie dnia z dniem, gdy plan jest miesięczny. Skutek: same „odchylenia”, choć miesiąc się zgadza.

W praktyce i w repozytorium

Repozytorium szkolenia zaczyna ten moduł od antywzorca. Serwis „liczy” planowaną datę dostawy z SLA klienta, pojemności magazynu, kalendarza dni roboczych i dostępności kierowców. Plan nie jest bytem, tylko wnioskiem z zapytania. Gdy ktoś zmieni SLA klienta z 3 na 5 dni, plan wszystkich otwartych dostaw zmienia się wstecz. Nie da się odpowiedzieć na pytania: jaki był plan wczoraj, dlaczego się zmienił, czy to była decyzja biznesowa, czy poprawka błędu. Nie da się też porównać dzisiejszego wykonania z wczorajszym planem.

Fowler w Analysis Patterns poświęca planowaniu cały rozdział i oddziela działanie zaproponowane (proposed action) od zrealizowanego (implemented action). Repozytorium szkolenia robi to samo dla harmonogramów płatności i produkcji. Plan to osobny byt z wersjami. Wykonanie to fakty: wpłaty, wyprodukowane partie. Delta to wynik porównania według jawnej strategii tolerancji.

TolerancjaDopasowuje, gdy…Kiedy
ExactMatchkwota i data są identycznerzadko: pokazuje, ile „szumu” jest w danych
MoneyToleranceróżnica kwoty ≤ X (np. 5 gr)wpłaty z zaokrągleniami, prowizje banków
DateToleranceróżnica dat ≤ N dniokres karencji, weekendy, sesje rozliczeniowe
QuantityTolerance, PercentageToleranceróżnica ilości w sztukach lub procentachprodukcja, dostawy, zużycie energii
CombinedTolerance / andwszystkie warunki naraz„do 5 gr i do 3 dni”
PartialPaymentsStrategysuma wpłat częściowych pokrywa ratęklient płaci ratę w dwóch przelewach

Moduły analizy w repozytorium zwracają DeltaResult: dopasowane pary plan–wykonanie, pozycje planu bez wykonania, wykonania spoza planu i statystyki (np. kwoty niedopłat i nadpłat, liczba wpłat spóźnionych). Moduł z antywzorcem ma dodatkowo enum DeltaType, który dobrze nazywa możliwe wyniki porównania: PERFECT_MATCH, LATE, EARLY, UNDER_DELIVERED, OVER_DELIVERED, DEVIATION, NO_EXECUTION. Tych nazw używa diagram poniżej.

▶ Harmonogram rat kontra wpłaty stroisz tolerancję, a raport się zmienia
Zmieniaj tolerancje.
Raty i wpłaty są ilustracyjne. Zjawiska (odchyłki o grosz, dopasowane przy tolerancji 5 gr; rata zapłacona w dwóch częściach; wpłaty na czas i spóźnione) odpowiadają scenariuszom analizy harmonogramu płatności w repozytorium. Uproszczenie: tolerancja dni rozstrzyga tu, czy wpłata „pasuje”, a typ delty mówi, czy była spóźniona.
⚠️ Uwaga

Tolerancja to decyzja biznesowa z konsekwencjami prawnymi. Czy wpłata 2 dni po terminie to opóźnienie, od którego liczysz odsetki? Czy niedopłata 3 grosze to zaległość, która uruchamia monit? Zapisz tolerancję jako konfigurację z wersją. Inaczej po zmianie progu nie wytłumaczysz, dlaczego wczorajszy raport różni się od dzisiejszego.

📌 W punktach
  • Plan jest bytem z wersjami, a nie wynikiem zapytania po bieżących ustawieniach.
  • Wykonanie to fakty. Delta to porównanie według jawnej strategii tolerancji.
  • Wynik porównania: dopasowania, braki wykonania, wykonania spoza planu i statystyki. Nazwy rodzajów delty: idealnie, spóźnione, przedwczesne, za mało, za dużo, odchylenie, brak wykonania.
  • Tolerancja to decyzja biznesowa. Wersjonuj ją.

Rozdzielczość planu i symulacje „co jeśli”

plan miesięczny, wykonanie dzienne

Komentarz z repozytorium szkolenia streszcza problem jednym zdaniem. Plan jest „uproszczony, z góry”: 300 sztuk w miesiącu. Wykonanie jest „szczegółowe, z dołu”: 270 + 12 braków + 18 poprawek w dniach 2, 4, 7, 12. Porównanie dnia z dniem nie ma sensu, bo plan nie ma dni. Porównanie miesiąca z miesiącem wymaga zagregowania wykonania do rozdzielczości planu i ustalenia, co się liczy: czy poprawki to produkcja? Czy braki odejmujesz?

Druga połowa modułu to symulacje. Modyfikator harmonogramu przyjmuje bieżący plan i wynik delty, a zwraca nowy plan. Rzeczywistości nie zmienia. Repozytorium ma m.in.:

▶ Miesiąc produkcji porównaj w złej i w dobrej rozdzielczości, potem symuluj
Plan: 300 sztuk w miesiącu. Wykonanie: dni 2, 4, 7 i 12.
Liczby 300 / 270 / 12 / 18 i dni 2, 4, 7, 12 pochodzą z komentarza w repozytorium szkolenia. Podział 270 sztuk na dni jest ilustracyjny. Przyjęto, że braki się nie liczą, a poprawki tak (270 + 18 = 288). To założenie, które w prawdziwym projekcie musi potwierdzić biznes.
🔥 Rozmowa przy kominku
PlanMówię „300 w miesiącu”. Nie obchodzi mnie, który to dzień.
WykonanieA ja wiem wszystko: dzień, zmianę, braki, poprawki. Jak mam się z tobą porównać?
PlanZsumuj się do mojej rozdzielczości. I nie zmieniaj mnie, gdy ktoś pyta „co jeśli”. Symulacja to moja kopia.
WykonanieA jak kierownik zatwierdzi symulację?
PlanWtedy powstaje moja nowa wersja z datą i powodem. Stara zostaje w historii.
📌 W punktach
  • Porównuj w rozdzielczości planu: agreguj wykonanie i ustal, co się liczy.
  • Modyfikator dostaje plan i deltę, a zwraca nowy plan. Rzeczywistość zostaje nietknięta.
  • Zatwierdzona symulacja to nowa wersja planu, a nie nadpisanie starej.
Część VII

Studia przypadków

Cztery zawiłe biznesy rozebrane na archetypy: zdanie z wymagań → archetyp → konfiguracja → pułapka. W każdym rozdziale przycisk 💥 pokazuje, jak wyglądałby model „z rzeczowników”.

Leasing floty aut

kto prowadził auto 12 marca o 14:05?

Leasingodawca finansuje 120 aut dla firmy dystrybucyjnej. Podpisuje umowę ramową, a pod nią umowy wykonawcze na każde auto. Auta jeżdżą z pracownikami klienta, którzy się zmieniają. Do tego dochodzą karty paliwowe z limitami, serwisy, opony sezonowe, auta zastępcze, rozliczenie przebiegu po zwrocie i zdarzenia „spoza umowy”: mandaty, szkody, wcześniejsze zakończenie. Biznes wygląda jak jeden produkt. W rzeczywistości dotyka prawie każdego archetypu.

▶ Rozbiór wymagań: leasing floty kliknij zdanie albo przeskanuj całość
Kliknij „Skanuj” albo pojedyncze zdanie.
Wymagania są wymyślone, ale złożone z typowych mechanizmów leasingu flotowego. Konfiguracje to propozycje autora oparte na archetypach z poprzednich rozdziałów, a nie jedyne poprawne rozwiązanie.
⚠️ Pułapki tej domeny
  • Kierowca jako pole auta. Kolumna auto.kierowca odpowiada tylko na pytanie „kto jeździ dziś”. Wezwanie po mandacie pyta o dzień i godzinę sprzed miesięcy. Potrzebna jest relacja „użytkuje” z okresem ważności.
  • Rata jako liczba w umowie. Rata jest wynikiem kalkulacji z parametrów. Bez rozbicia (finansowanie, serwis, opony, ubezpieczenie) nie przeliczysz jej przy aneksie, gdy klient zmieni limit kilometrów.
  • Limit karty jako kolumna. „Nie przechodzi na kolejny miesiąc” wymaga zapisu z ważnością i kompensacji. Inaczej nie odróżnisz kierowcy, który oszczędzał, od kierowcy, któremu limit wygasł.
🧰 Kolejność wdrażania
  1. Party z relacjami i ważnością. To fundament mandatów, kart i uprawnień fleet managera.
  2. Product: typ umowy wykonawczej jako pakiet (finansowanie + usługi), auto jako egzemplarz po VIN.
  3. Pricing: komponenty raty z zależnościami. Nadprzebieg jako cena marginalna za km.
  4. Accounting + Plan vs Execution: harmonogram rat, wpłaty, limity kart.
  5. Inventory aut zastępczych na końcu. To dobrze odizolowany moduł.

Telco: oferta rodzinna i migracja taryf

jeden płaci, pięciu dzwoni, taryfa znika z oferty

Operator sprzedaje ofertę rodzinną: do pięciu numerów na jednym koncie. Właściciel konta płaci, a członkowie rodziny korzystają. Do numeru można dokupić telefon na raty, ale flagowy model tylko z abonamentem premium. Za rok operator wycofuje taryfę „Smart 2019” i proponuje „Smart 2026”. Część klientów przechodzi w środku okresu rozliczeniowego, część zostaje na starej taryfie z nową ceną od 1. dnia kolejnego miesiąca. Do tego bonusy z datą ważności, roaming z limitem i przeniesienie numeru do innego operatora w zaplanowanym oknie.

▶ Rozbiór wymagań: telco kliknij zdanie albo przeskanuj całość
Kliknij „Skanuj” albo pojedyncze zdanie.
Taryfy, kwoty i reguły są wymyślone. Reguła „flagowy telefon tylko z abonamentem premium” i kwoty nadwyżek pochodzą ze scenariuszy telco w repozytorium szkolenia.
⚠️ Pułapki tej domeny
  • „Abonent” jako jedna osoba. Właściciel umowy, płatnik i użytkownik numeru to trzy role. Dziecko korzysta z numeru, a rodzic za nie płaci.
  • Edycja taryfy zamiast nowej wersji. Zmiana ceny „Smart 2019” to nowa wersja komponentu od daty. Edycja w miejscu przelicza zamknięte okresy rozliczeniowe.
  • Migracja jako UPDATE. Przejście na nową taryfę to nowy egzemplarz produktu od daty i zakończenie starego. Proporcjonalne naliczenie wynika wtedy z dwóch okresów ważności, a nie z if-a w fakturowaniu.

Szpital: zabieg planowy

sala, zespół, sprzęt, krew, łóżko — wszystko albo nic

Zabieg planowy wymaga naraz: sali operacyjnej w oknie czasowym, chirurga z odpowiednią specjalizacją, anestezjologa, konkretnego sprzętu, zarezerwowanych jednostek krwi danej grupy i łóżka na oddziale na kilka nocy po zabiegu. Wcześniej pacjent musi mieć badania, które są ważne tylko przez określony czas. Pacjenci czekają w kolejce z priorytetem medycznym, a szpital ma umowę z płatnikiem na określoną liczbę świadczeń w kwartale. W Polsce publiczne świadczenia szpitalne rozlicza się z NFZ w grupach JGP (Jednorodne Grupy Pacjentów), a prywatni pacjenci mają osobny cennik.

▶ Rozbiór wymagań: szpital kliknij zdanie albo przeskanuj całość
Kliknij „Skanuj” albo pojedyncze zdanie.
Proces jest uproszczony i nie opisuje procedur żadnego konkretnego szpitala. Scenariusze repozytorium szkolenia, które tu wracają: MRI jako dostępność indywidualna, wizyty jako sloty czasowe, wyszukiwanie lekarzy po kompetencjach z ważnym prawem wykonywania zawodu.
⚠️ Pułapki tej domeny
  • Rezerwacje po kolei. Sala zarezerwowana, anestezjolog niedostępny, sala wisi zablokowana. Zespół i sprzęt to zasób złożony blokowany atomowo, z blokadą czasową na czas kompletowania.
  • Krew jako licznik. „Mamy 12 jednostek A Rh+” nie wystarczy. Jednostki mają partie i daty ważności, a przy rezerwacji trzeba brać te, które wygasają najwcześniej.
  • Kontrakt jako raport. Plan kwartalny wobec płatnika to byt z wersjami (aneksy), a wykonanie agreguje się do kwartału. Porównanie dzień do dnia nie ma sensu.

Budowa: harmonogram i odchylenia

dźwig, beton, deszcz i roboty dodatkowe

Generalny wykonawca stawia budynek biurowy dla inwestora. Ma kilkunastu podwykonawców, dźwig wieżowy dzielony między brygady, dostawy materiałów w oknach czasowych (centrum miasta, wąska ulica), kosztorys z przedmiarem, roboty dodatkowe zlecane w trakcie, płatności etapowe po odbiorach i zatrzymaną część wynagrodzenia jako zabezpieczenie. Inwestor co miesiąc pyta, o ile jesteśmy w plecy i co by było, gdyby padało jeszcze dwa tygodnie.

▶ Rozbiór wymagań: budowa kliknij zdanie albo przeskanuj całość
Kliknij „Skanuj” albo pojedyncze zdanie.
Wymagania są wymyślone i uproszczone. Procent zabezpieczenia, czasy i nazwy są ilustracyjne i nie wynikają z żadnej konkretnej umowy ani przepisu.
⚠️ Pułapki tej domeny
  • Harmonogram w Excelu jako źródło prawdy. Daty bez grafu zależności nie przeliczą się po opóźnieniu, a „o ile jesteśmy w plecy” wymaga wersji planu bazowego.
  • Robota dodatkowa jako edycja kosztorysu. Zmiana zakresu to nowa pozycja (zamówienie) z ceną ustaloną i powodem. Pierwotny kosztorys zostaje jako plan bazowy.
  • Zabezpieczenie jako „pomniejszenie faktury”. Zatrzymana kwota to zobowiązanie z terminem zwrotu, a nie rabat. Ma swoje konto i swoją datę ważności.
Część VIII

Mistrzostwo

Kiedy archetyp szkodzi, jak wybrać właściwy w pięć pytań, słownik pojęć i mapa literatury.

Antywzorce i kiedy NIE stosować archetypów

objaw → diagnoza → terapia

Archetypy leczą konkretne choroby. Podane bez choroby szkodzą jak każdy lek. Poniżej są objawy, które widać w kodzie i w bazie, z diagnozą i terapią. Przycisk 💥 pokazuje typowe leczenie objawowe: poprawkę, która uspokaja dziś i pogarsza jutro.

▶ Klinika antywzorców kliknij objaw
Kliknij objaw.
Objawy są złożone z typowych sytuacji projektowych. Diagnozy i terapie odwołują się do rozdziałów tego kompendium. To heurystyki, a nie twarde reguły.

Kiedy nie stosować

SytuacjaRekomendacja (heurystyka)Dlaczego
Prosta aplikacja CRUD: jedna rola, brak historii, brak wariantówzwykłe encjeżaden sygnał z rozdziału o rozpoznawaniu nie występuje, więc archetyp to tylko koszt
MVP do sprawdzenia hipotezyod razu tylko tanie elementy: identyfikatory zamiast obiektów, migawki w zamówieniach, kwoty z walutąto niemal nic nie kosztuje dziś, a później trudno to dodać
Poddziedzina generyczna (np. księgowość finansowa firmy)kup lub zintegruj gotowy system; archetyp służy do mapowania na granicyEvans przy poddziedzinach generycznych zaleca rozważyć gotowe rozwiązanie, zamiast budować je od zera
Zespół nie rozumie archetypu, ale „tak było na szkoleniu”najpierw rozbiór wymagań (jak w studiach przypadków), dopiero potem klasykopiowanie struktury bez zrozumienia tworzy martwe abstrakcje
Archetyp „na zapas” dla wariantu, którego nikt nie zamówiłzostaw szew (interfejs, identyfikator), bez implementacjiArlow i Neustadt oznaczają części archetypu jako opcjonalne właśnie po to, żeby je pomijać
⚠️ Archetyp ≠ EAV

Model „wszystko jest Entity z listą Attribute(name, value)” wygląda na maksymalnie elastyczny archetyp. Nie jest nim. Archetyp ma nazwane pojęcia z regułami (rola, relacja z ważnością, wersja ceny, blokada z właścicielem). EAV ma tylko worek wartości, a reguły uciekają do kodu, który ten worek interpretuje. Archetyp przenosi do danych parametry znanych mechanizmów. EAV przenosi do danych wszystko, łącznie z tym, czego nikt nie umie potem przeczytać.

📌 W punktach
  • Archetyp leczy konkretne objawy: role w kolumnach, cenę w polu produktu, saldo w kolumnie, plan jako zapytanie.
  • Bez objawów zwykła encja wygrywa.
  • Tanie elementy (identyfikatory, migawki, Money) stosuj od początku. Drogie dopiero, gdy pojawi się sygnał.
  • Archetyp to nazwane pojęcia z regułami, a nie generyczny worek atrybutów.

Który archetyp i jaka konfiguracja?

drzewo decyzyjne w kilku pytaniach

To pełna wersja drzewa. Prostsza, dla początkujących, jest w rozdziale Mapa decyzji na start. Drzewo zbiera heurystyki z całego kompendium. Zaczyna od pytania „co modelujesz?” i schodzi do konkretnej konfiguracji: strategii śledzenia, modelu dostępności, rodzaju korekty. Jedno przejście daje jeden archetyp. Prawdziwy system przechodzi drzewo wiele razy, raz dla każdego zdania z wymagań.

▶ Drzewo decyzyjne odpowiadaj na pytania
Zacznij od pierwszego pytania.
Drzewo jest uproszczeniem heurystyk z tego kompendium. Pomaga zacząć rozmowę z biznesem, ale jej nie zastępuje.
😌 Spokojnie

Nie musisz pamiętać drzewa. Pamiętaj trzy pytania, które otwierają większość gałęzi: „a co, jeśli to samo X jest jednocześnie Y?” (Party, role), „jak było 3 miesiące temu?” (wersje, ważność, dwa zegary) i „co, jeśli dwie osoby chcą tego samego naraz?” (Inventory, blokady).

Słownik pojęć i mapa literatury

PL ↔ EN, i gdzie czytać dalej

Polskie terminy prowadzą do rozdziałów, w których pojęcie jest wyjaśnione od podstaw (blok 🔰 „Co to jest”). Najprostsze definicje z analogiami są w słowniczku startowym.

PolskiAngielski (repozytorium / literatura)Znaczenie
strona, podmiotParty (Person, Organization)identyfikowalna osoba lub organizacja
rola stronyRole, PartyRolekapelusz, w którym strona występuje
relacja między stronamiPartyRelationship; Fowler: Accountabilitynazwane powiązanie dwóch ról z okresem ważności
kompetencja, zakres działaniaCapability, OperatingScopeco strona potrafi, gdzie, kiedy, ile, na jakim poziomie
typ produktu, egzemplarzProductType, ProductInstanceopis katalogowy a konkretna rzecz, umowa lub wykonanie usługi
strategia śledzeniaProductTrackingStrategyunikat, numer seryjny, partia, oba, zamienne
pakiet, zestaw, reguła wyboruPackageType, ProductSet, SelectionRuleprodukt złożony z nazwanych zestawów z regułami
komponent ceny, kalkulatorComponent, Calculatornazwany element ceny i funkcja, która go liczy
interpretacja cenyInterpretation: TOTAL, UNIT, MARGINALcena całkowita, średnia jednostkowa, cena n-tej jednostki
ważnośćValidity (validFrom, validTo)okres, w którym coś obowiązuje
predykat, aplikator, strażnikpredicate, applier, guardianczy reguła dotyczy, jak zmienia, czy wynik jest dopuszczalny
dostępność: indywidualna, pula, czasowaIndividual/Pool/TemporalResourceAvailabilityegzemplarz, ilość z pojemności, zasób w slocie
blokada, lista oczekującychBlockade, LockDuration, WaitListzajęcie zasobu przez właściciela na czas i kolejka z polityką
role w zamówieniuRoleInOrder: ORDERER, PAYER, RECEIVER, EXECUTOR…kto zamawia, płaci, odbiera, wykonuje
migawkasnapshot, PartySnapshotkopia danych z chwili zdarzenia
konto, zapis, transakcjaAccount, Entry, Transactionsaldo jako suma niezmiennych zapisów
reguła księgowaniaPostingRulezapis wywołuje kolejne zapisy
czas zdarzenia / czas zapisuappliesAt / occurredAt; Fowler: actual / record timeod kiedy obowiązuje / kiedy się dowiedzieliśmy
odwrócenie, stornoreversalkorekta przez nową transakcję przeciwną
ścieżka krytycznacritical path (CPM)najdłuższa ścieżka w grafie zadań
tolerancja, deltaToleranceStrategy, DeltaResultjak porównać plan z wykonaniem i jaki jest wynik
poziom wiedzyknowledge level (Fowler, Evans)typy i reguły, które definiują dozwolone fakty
wariant archetypupleomorph (Arlow i Neustadt)dopasowana do biznesu odmiana wzorca archetypów

Mapa literatury

ŹródłoCo dajeCzytaj, gdy…
Szkolenie i repozytoria Archetypy Oprogramowania (Słota, Pilimon, Sobótka)11 modułów kodu w Javie, scenariusze z wielu branż, ewolucja „od if-ów do konfiguracji”chcesz zobaczyć działający kod i testy scenariuszowe
Arlow, Neustadt, Enterprise Patterns and MDA (2004)definicje archetypu i wzorca archetypów, pleomorfizm, Party, PartyRelationship, CRM, Product, Inventory, Order, Quantity, Money, Rulepotrzebujesz pełnych modeli UML i języka do rozmowy o wariantach
Fowler, Analysis Patterns (1997)Accountability, Observations and Measurements, Inventory and Accounting, Planning, Trading; poziom wiedzymodelujesz organizacje, księgowanie, plany i pomiary
Fowler, martinfowler.comwzorce księgowe (posting rules, korekty), historia bitemporalna, Money (w PoEAA)projektujesz salda, korekty i dwa zegary
Coad, Lefebvre, De Luca, Java Modeling in Color with UML (1999)cztery archetypy kolorowe: moment-interval, role, description, party/place/thingchcesz szybko klasyfikować klasy na tablicy z biznesem
Evans, Domain-Driven Design (2003); Vernon, Implementing DDD (2013)bounded contexts, język wszechobecny, knowledge level, specyfikacjawyznaczasz granice, w których archetypy żyją
Silverston, The Data Model Resource Bookuniwersalne modele danych: Party, Party Role, Party Relationship, Contact Mechanism, Productprojektujesz schemat bazy, a nie tylko model obiektowy

Egzamin i ściąga

sprawdź, co zostało

Najpierw pytania dla początkujących: po jednym na rozdział Części 0 i na każdy archetyp. Potem jedno pytanie na rozdział. Błędne odpowiedzi to nieporozumienia, które rozdziały próbowały rozbroić. Pytania oznaczone (L3) i (L4) dotyczą bloków eksperckich i studiów przypadków.

Wynik: 0 / 0

Ściąga

Archetyp / elementW jednym zdaniuSygnał w wymaganiachKonfiguracje i decyzje
Quantity / Moneyliczba zawsze z jednostką, kwota zawsze z walutąliczba z jednostką lub walutąwartość + jednostka; brak cichej konwersji; alokacja zamiast dzielenia; reguła zaokrągleń
Partyosoba albo organizacja w wielu rolachta sama osoba/firma w wielu tabelachPerson/Organization(Company, Unit); role przez politykę; identyfikatory z polityką; adresy z użyciami
PartyRelationshipnazwane powiązanie dwóch ról z okresem ważności„kto był … w marcu?”relacja ról + nazwa + Validity; polityka relacji; udział lub zakres jako rozszerzenie (w repozytorium relacja ich nie ma)
Capabilityco strona potrafi, gdzie, kiedy, ile i na jakim poziomieuprawnienia, region, poziom, „kto może”7 rodzajów OperatingScope; RoleRequirements; ważność sprawdzana w chwili przydziału
Producttyp z katalogu i konkretny egzemplarznumer seryjny, partia, wariant, katalogtyp vs egzemplarz; cechy z ograniczeniami; UNIQUE / INDIVIDUALLY / BATCH / BOTH / IDENTICAL
Packageprodukt z zestawów i reguł wyboru„dokładnie jeden”, „najwyżej dwa”, „tylko z…”ProductSet + SelectionRule (single, optional, required, isSubsetOf, and/or/not, ifThen); relacje produktów
Pricingcena jako drzewo nazwanych składników„cena zależy od…”drzewo komponentów; kalkulatory; zależności (ValueOf/SumOf…); TOTAL/UNIT/MARGINAL
Wersje cencena z okresem obowiązywania i nakładkami„ile kosztowało wtedy?”validFrom/validTo + definedAt; najmłodszy validFrom wygrywa; REJECT_IDENTICAL / REJECT_OVERLAPPING / ALLOW_ALL
Ruleswyjątek jako warunek, zmiana i strażnik„chyba że”, promocje, wyjątkipredykat + aplikator (od bazy / od wyniku) + strażnik; łańcuch; algebry: logiczna, rozmyta, punktowa, wyjaśniająca
Inventoryco jest wolne i kto to zablokował„czy jest wolne?”, rezerwacjaIndividual / Pool / Temporal; grupowanie slotów; zasób złożony (wszystko albo nic)
Blokady i kolejkazajęcie z właścicielem i czasem, kolejka z politykąkoszyk, przedsprzedaż, „kto dostanie zwolnione”LockDuration (czasowa/bezterminowa); releaseExpired; WaitList: FIFO / priorytet / kwota / kryterium
Orderingzlecenie ze stronami w rolach, liniami, wyceną i stanamikto zamawia, płaci, odbiera; statusyrole na zamówieniu i liniach; migawki; DRAFT→CONFIRMED→(PENDING_ALLOCATION)→PROCESSING→FULFILLED→CLOSED, albo CANCELLED (w repozytorium PENDING_ALLOCATION i CLOSED są w enumie, ale Order nie wykonuje do nich przejść); stany wyceny linii
Accountingsaldo jako suma niezmiennych zapisówsaldo, limit, punkty, portfelkonta (ASSET, LIABILITY, REVENUE, EXPENSE, OFF_BALANCE); transakcja = 0 na bilansowych; korekty jako transakcje
Posting ruleszapis, który wywołuje kolejne zapisy„gdy wpłynie, to nalicz…”warunek + kalkulator + cel + priorytet; konta-projekcje; ochronę przed cyklami trzeba dodać samemu (repozytorium jej nie ma)
Czas w księgowościkiedy zarejestrowano, od kiedy obowiązuje, do kiedy ważne„na dzień”, „wstecz”, „wygasa”occurredAt vs appliesAt; balanceAsOf; ważność zapisu + expiration_compensation; FIFO / LIFO / MANUAL
Schedulingharmonogram jako graf zależności„nie wcześniej niż…”, kolejnośćgraf + porządek topologiczny; FS/SS/FF/SF + lag (repozytorium ma gotowy tylko FS); cykle przy zapisie; CPM i zapas (do dopisania, repozytorium ich nie liczy)
Grafy w biznesiekonflikty, wpływy i zamiany jako problemy grafowekonflikty, wpływy, zamianykolorowanie (górna granica); składowe; punkty artykulacji; cykl zamian wykonywany paczką
Plan vs Executionplan jako byt porównywany z faktami jawną tolerancją„planowaliśmy, a wyszło”plan jako byt z wersjami; tolerancje (kwota, dni, ilość, %; and); delty; agregacja do rozdzielczości planu; symulacje na kopii
🎓 Gratulacje

Wróćmy do pytania z początku: kierowca kuriera tankuje kartą flotową firmy leasingowej, a koszt ostatecznie trafia do klienta kuriera. „Klientów” jest tu przynajmniej czterech: firma kurierska wobec leasingodawcy, leasingodawca wobec stacji (jako wydawca kart), klient kuriera wobec kuriera i kierowca jako użytkownik karty. Każdy jest klientem w innej relacji. Model danych potrzebny do tego jest jeden: Party z rolami i relacjami z okresem ważności. Do tego Accounting dla limitu karty i refaktur, Pricing dla doliczenia paliwa do usługi, a cała reszta to konfiguracja. Jeśli Twoja odpowiedź na początku brzmiała „cztery tabele klientów”, to właśnie przeszedłeś drogę, którą to kompendium miało pokazać.

Co dalej: weź jedną funkcję z własnego projektu, wypisz jej wymagania zdaniami i przepuść je przez drzewo decyzyjne i klinikę antywzorców. Potem otwórz repozytorium szkolenia i porównaj swój model z testami scenariuszowymi odpowiedniego modułu.