---
title: "Ukladanie výsledkov — Purchases for Laravel | Roundly"
description: "Ako handle(), sync() a replay() premenia výsledok na Purchase, Subscription alebo PurchaseRefund — s auditom, idempotentne, udalosti len pri zmene."
url: https://roundly-consulting.com/sk/open-source/navody/purchases-for-laravel/ukladanie-vysledkov
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Purchases for Laravel](https://roundly-consulting.com/sk/open-source/navody/purchases-for-laravel.md)

# Ukladanie výsledkov

handle(), sync(), replay() aj úloha vo fronte zdieľajú jedno jadro ukladania. To nasmeruje výsledok podľa type() — z refundácie vznikne PurchaseRefund, z nákupu Purchase, z predplatného Subscription — a spustí príslušné udalosti. Výsledok typu Notification alebo Unknown je informatívny: nikam sa neuloží, nič nespustí a nikdy neprepíše stav predplatného. Líši sa len auditný záznam okolo neho:

| Vstup | Auditný záznam | Uloženie | Vracia |
| --- | --- | --- | --- |
| `handle()` | Zapíše sa najprv (origin provider, overený podpis) | Hneď, alebo cez frontu pri queue.enabled | Záznam — alebo auditnú notifikáciu pri fronte či informatívnom výsledku |
| `sync()` | Zapíše sa najprv (origin host, signature\_verified false) | Vždy synchrónne | Záznam, alebo null pri informatívnom výsledku |
| `replay()` | Nový sa nezapíše — uložený záznam sa označí ako spracovaný | Synchrónne, zoradené podľa času udalosti | Záznam, alebo null pri informatívnej notifikácii |

## Idempotentné od základu

Každý záznam je kľúčovaný unikátnou dvojicou (provider, provider\_id), takže keď obchod notifikáciu doručí znova, aktualizuje sa ten istý riadok namiesto duplikátu. Položky sa znova zosynchronizujú vždy, keď ich výsledok obsahuje; cena null ponechá uloženú cenu bez zmeny; pôvodný payload sa uchová v stĺpci meta. Nové predplatné, ktorému obchod nepošle názov, sa pomenuje podľa identifikátora produktu, prípadne identifikátora u poskytovateľa; neskoršia udalosť bez názvu uložený názov ponechá.

## Zoradené podľa času udalosti

Ukladanie je zoradené podľa occurredAt(). Každý nákup, predplatné aj refundácia si pamätá čas poslednej uplatnenej udalosti (last\_event\_at): staršia udalosť — opakované doručenie, doručenie mimo poradia, replay — nič nezmení ani nespustí a refundovaný záznam zostane refundovaný, pokiaľ refundáciu nezvráti preukázateľne novšia udalosť (REFUND\_REVERSED od Apple, vyhraný spor v Stripe). Výsledok, ktorý nevie povedať, kedy sa stal (occurredAt() je null — GenericResult zostavený bez neho), sa uplatní ako doteraz, no refundáciu nikdy nezruší. Počas rozhodovania je riadok uzamknutý, takže sa dve súbežné doručenia nemôžu prekrížiť. Záznam, ktorý ste soft-delete zmazali, sa neskoršími notifikáciami stále aktualizuje (zostane zmazaný), no nespustí žiadnu udalosť životného cyklu.

## Súbežné prvé doručenia

Transakcia ukladania sa skúsi až trikrát. Na MySQL uzamknutie kľúča, ktorý ešte neexistuje, vytvorí gap lock, takže dve prvé doručenia toho istého nákupu, predplatného či refundácie môžu pri vkladaní uviaznuť v deadlocku (chyba 1213); neúspešná transakcia sa zopakuje a nájde riadok tej úspešnej, namiesto toho, aby jej webhook alebo úloha vo fronte zlyhali.

## Dátumy a časové pásmo aplikácie

Všetky obchody uvádzajú dátumy v UTC, kým Eloquent ukladá čas na hodinách inštancie, ktorú dostane. Preto sa každý dátum od poskytovateľa — active\_from, trial\_ends\_at, ends\_at, refunded\_at aj čas udalosti — pred uložením prevedie do časového pásma aplikácie: na serveri, ktorého app.timezone nie je UTC, predplatné aj tak expiruje v skutočnom okamihu.

## Uloženie výsledku, ktorý ste získali sami

Pre výsledok, ktorý neprišiel ako webhook, použite Purchases::sync() — alebo jeho akciu SyncProviderResultAction; pozrite Fasáda Purchases a DI a akcie. Akcie Record\* v jadre sú interné (@internal) — vynechajú auditný záznam, ktorý sync() zapíše a označí ako spracovaný.

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/purchases-for-laravel.md)
