Události (např: změna stavu objednávky) - TomAtomCZ/depotoPhpClient GitHub Wiki

Seznam základních událostí:

Identifikace / typ Popis
product.availability Změna dostupnosti (počtu kusů skladem) produktu
product.sellPrice Změna prodejní ceny produktu
order.status Změna stavu objednávky (reservation > bill)
order.delete Storno/smazání objednávky
order.processStatus Změna procesního stavu objednávky

Seznam všech událostí najdete v Depotu v sekci Nastavení -> Pokladny -> úprava konkrétní pokladny. Události jsou vždy ve tvaru "entita.event". Entita = product / order / productMovePack / atd. . Event = create / update / delete / atp.

Registrace URL pro odběr událostí:

Každé prodejní místo (checkout) může mít zaregistrovanou vlastní url. Můžeme vám ji nastavit ručně, nebo si ji nastavíte samy přes API:

$depoto->mutation('updateCheckout', [
            'id' => 132456, #Depoto ID vašeho prodejního místa
            'eventUrl' => 'https://moje.url/event_subscriber.php'
        ], ['data' => ['id', 'event_url'], 'errors']
);

Informace se na URL odesílají metodou POST a tělo requestu obsahuje JSON s typem, daty (payload) a časem vytvoření události (created). Například:

{
  type: "order.processStatus",
  payload: {
    id: 11111, #Depoto ID objednávky
    processStatus: "packed"
  },
  created: "2017-01-01T12:00:00Z"
}

Na základě události a ID entity (objednávky, produktu, ...), si přes API stáhnete informace, které vás zajímají. Například čísla balíků přiřazené k objednávce po předání dopravci.

Nakládání s událostmi:

S událostmi z Depota nikdy nenakládejte v reálném čase tak, jak přijdou. Události si ukládejte do vlastní fronty (typ události + ID objektu + doplňková data - např. čísla balíků v případě změny stavu objednávky) a zpracovávejte např. cronem či jiným typem workera. Depoto očekává, že doba spojení bude v řádu milisekund. Dlouhá spojení po několika sekundách automaticky ukončí. Stejně tak serveru, který bude vracet velmi často chyby typu 5XX, bude odejmut webhook.

Příklad práce se základními událostmi:

Příklad implementace "product.availability"

$depotIds = [];
$res = $depoto->query('checkout', ['id' => 123], [
    'data' => ['id', 'depots' => ['id']],
    'errors'
]);
foreach ($res['data']['depots'] as $d) {
    $depotIds[] = $d['id'];
}

// poznámka - výše uvedené $depotIds si prosím nestahujte live, ale ukládejte si k sobě do nastavení. K nastavení pokladny nedochází tak často a product.availability nejčastěji volaný event (volá se po vytvoření / změně objednávky, rezervací, příjmu, výdeji, převodu mezi sklady). Naopak si prosím rozšiřte eventy o checkout.update, díky kterému se dozvíte o změně nastavení pokladny, mj. při změně přiřazených skladů.



$res = $depoto->query('product', ['id' => $event['payload']['id']], [
    'data' => [
        'id', 'code', 'quantityAvailable', 'isBundle',
        'quantities' => ['depot' => ['id'], 'quantityAvailable', 'quantityStock', 'quantityReservation']
    ],
    'errors'
]);

$quantityStock = 0;
$quantityReservation = 0;
$quantityAvailable = 0;
foreach ($res['data']['quantities'] as $d) {
    if (in_array($d['depot']['id'], $depotIds)) {
        $quantityStock += $d['quantityStock'];
        $quantityReservation += $d['quantityReservation'];
        $quantityAvailable += $d['quantityAvailable'];
    }
}

// v e-shopu nabízejte maximální množství kusů = $quantityAvailable

Příklad implementace "order.processStatus"

$res = $depoto->query('order', ['id' => $event['payload']['id']], [
    'data' => ['id', 'reservationNumber', 'status' => ['id'],
        'processStatusRelation' => ['status' => ['id']], 'packages' => ['id', 'code', 'sent']
    ],
    'errors'
]);

if (isset($data['id']) && count($data['packages'])) {
    foreach ($data['packages'] as $package) {
        // kód zásilky = $package['code']
    }
}