Přeskočit na hlavní obsah

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.

EntitaSpouštěcí PodmínkaMetoda SlužbyVyvolaný NástrojAkce
PříjemkaVytvoření / Update (Stav=Processing)GoodsReceipt::processEntityStock\Services\Receiver::receiveNaskladnění: Zvýší množství WarehouseItem. V případě potřeby vytvoří záznamy ProductSerial.
VýdejkaVytvoření / Update (Stav=Reserved)GoodsIssue::processEntityStock\Services\Issuer::reserveRezervace: Zvýší quantityReserved na WarehouseItem.
VýdejkaVytvoření / Update (Stav=Issued)GoodsIssue::processEntityStock\Services\Issuer::issueOdepis: Sníží quantityReserved a quantityAvailable.
PřevodkaVytvoření / Update (Stav=Processing)WarehouseTransfer::processEntityStock\Services\Transferer::transferPohyb: Vydá ze Zdrojového skladu, Přijme na Cílovém skladu.
InventuraStav -> CompletedPhysicalInventory::processEntityStock\Services\PhysicalInventoryHelperKorekce: 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 Produkt povoluje 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 Sold při vracení).
  • Pozicování: Pokud je Sklad "Pozicový", vyžaduje platnou WarehousePosition pro každou položku.

2.2 Issuer (Výdejce - Issuer.php)

Zpracovává odchozí zboží.

  • Determinace: Používá StockDeterminationFactory k 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í: StockManagerInterface
    • addItem($product, $qty, ...)
    • removeItem($product, $qty, ...)

Implementace

  1. SimpleStockManager: Aktualizuje WarehouseItem (Agregovaný záznam).
  2. PositionalStockManager: Aktualizuje WarehouseItem A záznamy WarehousePosition.

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ď).