Architektura Hooků a Služeb
Modul Sklad používá Službami Řízenou Architekturu (Service-Driven Architecture). Místo spoléhání se pouze na Hooky, hlavní třídy Service (např. GoodsReceipt) přímo vyvolávají specializované Skladové Nástroje (Stock Tools), když dojde ke specifickým změnám stavu.
1. Logika Řízená Událostmi (Triggers)
Následující tabulka mapuje akce uživatele na konkrétní kód, který provádí pohyb zásob.
| Entita | Spouštěcí Podmínka | Metoda Služby | Vyvolaný Nástroj | Akce |
|---|---|---|---|---|
| Příjemka | Vytvoření / Update (Stav=Processing) | GoodsReceipt::processEntity | Stock\Services\Receiver::receive | Naskladnění: Zvýší množství WarehouseItem. V případě potřeby vytvoří záznamy ProductSerial. |
| Výdejka | Vytvoření / Update (Stav=Reserved) | GoodsIssue::processEntity | Stock\Services\Issuer::reserve | Rezervace: Zvýší quantityReserved na WarehouseItem. |
| Výdejka | Vytvoření / Update (Stav=Issued) | GoodsIssue::processEntity | Stock\Services\Issuer::issue | Odepis: Sníží quantityReserved a quantityAvailable. |
| Převodka | Vytvoření / Update (Stav=Processing) | WarehouseTransfer::processEntity | Stock\Services\Transferer::transfer | Pohyb: Vydá ze Zdrojového skladu, Přijme na Cílovém skladu. |
| Inventura | Stav -> Completed | PhysicalInventory::processEntity | Stock\Services\PhysicalInventoryHelper | Korekce: Vytvoří GoodsIssue (pro manko) nebo GoodsReceipt (pro přebytek) k vyrovnání stavu. |
2. Architektura Skladových Nástrojů
Složitá logika jak měnit zásoby je zapouzdřena v src/backend/Tools/Stock/Services.
2.1 Receiver (Příjemce - Receiver.php)
Zpracovává příchozí zboží.
- Validace: Kontroluje, zda
Produktpovoluje konkrétní Sklad. - Sériová čísla: Pokud je produkt řízen sériovými čísly, ověřuje, že příchozí čísla již neexistují (nebo nejsou ve stavu
Soldpři vracení). - Pozicování: Pokud je Sklad "Pozicový", vyžaduje platnou
WarehousePositionpro každou položku.
2.2 Issuer (Výdejce - Issuer.php)
Zpracovává odchozí zboží.
- Determinace: Používá
StockDeterminationFactoryk rozhodnutí, které konkrétní položky vybrat (např. FIFO - První dovnitř, první ven). - Rezervace: Uzamkne zásoby, aby se zabránilo dvojímu prodeji.
- Validace: Zajišťuje, že existuje dostatečné
quantityAvailable(dostupné množství).
2.3 Transferer (Převodce - Transferer.php)
Orchestruje přesun.
- Atomická Operace: Zabalí Výdej a Příjem do jedné transakce. Pokud Příjem selže (např. neplatná cílová pozice), celý Převod se vrátí zpět (rollback).
3. Vzor Stock Manager (Manažer Skladu)
Pro podporu různých typů skladů (Jednoduchý vs. Pozicový) bez přepisování logiky modul používá vzor Stock Manager.
- Továrna:
StockManagerFactory::create($warehouse) - Rozhraní:
StockManagerInterfaceaddItem($product, $qty, ...)removeItem($product, $qty, ...)
Implementace
SimpleStockManager: AktualizujeWarehouseItem(Agregovaný záznam).PositionalStockManager: AktualizujeWarehouseItemA záznamyWarehousePosition.
4. Hooky
Zatímco Služby řeší hlavní práci, Hooky řeší vedlejší efekty.
4.1 Aktualizace Nákladové Ceny
Soubor: Hooks/Product/UpdateCostPrice.php
Spouštěč: afterSave
Logika: Když je Produkt uložen, spustí přepočet averageCost (průměrné ceny) na základě aktuální hodnoty zásob.
4.2 Pole Příjemky
Soubor: Hooks/GoodsReceipt/SetFields.php
Spouštěč: beforeSave
Logika: Nastavuje výchozí hodnoty pro nové Příjemky (např. Datum přijetí = Teď).