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']
}
}