Pravidelné obnovenie
Pravidelné obnovenie nastaví zvolené skupiny na presný zostatok raz za obdobie — mesačné bezplatné kredity, denný limit. Je idempotentné pre vlastníka, skupinu a obdobie, takže dvojito naplánovaný beh, dva servery ani zopakovaný job neobnovia skupinu dvakrát. Obnovenie potrebuje tabuľku credit_resets (pozrite Inštalácia) a žiadny prepínač:
use RoundlyConsulting\Credits\Enums\ResetPeriod;
use RoundlyConsulting\Credits\Facades\Credits;
$result = Credits::for($user)->bucket('free')->reset(ResetPeriod::Monthly, to: 100);
$result->reset; // true — false when this bucket was already reset this period
$result->period; // '2026-11'
$result->credit; // the delta row, or null (already reset, or the balance already matched)
Credits::reset($user, 'billing-cycle-7', to: 500, bucket: 'pro'); // an explicit period key
$user->resetCredits(ResetPeriod::Daily, to: 10, bucket: 'daily_allowance');- Idempotentné pre obdobie: jeden riadok credit_resets na vlastníka, skupinu a kľúč obdobia, zapísaný v transakcii obnovenia pod zámkom vlastníka. Druhé obnovenie v tom istom období nič nezapíše a vráti reset: false.
- Kľúče obdobia sa určia z aktuálneho času v časovom pásme aplikácie: Daily → 2026-11-09, Weekly → 2026-W46 (rok podľa ISO týždňov), Monthly → 2026-11, Yearly → 2026. Alebo zadajte vlastný kľúč (1–64 znakov, orezaný) pre fakturačné cykly, ktoré sa neriadia kalendárom.
- Obnovenie je setTo($to): jeden rozdielový záznam (meta ['reset_period' => key], pokiaľ nezadáte vlastné meta), CreditsModified a tá istá ochrana — zníženie skupiny pod jej rezervované kredity sa odmietne, pokiaľ nie je povolené prečerpanie. Odmietnuté obnovenie nezanechá žiadnu značku, takže ho ďalší beh zopakuje.
- K dispozícii je aj Credits::reset($owner, $period, to:, bucket:, description:, meta:, allowOverdraft:) a $user->resetCredits($period, to:, …, bucket:).
Plánovanie — credits:reset
credits:reset {bucket*}
{--period=monthly : daily, weekly, monthly or yearly}
{--key= : an explicit period key instead of --period}
{--to=0 : the balance to reset to}
{--timezone= : the timezone the period is read in (default app.timezone)}
{--description= : description for the delta rows}
{--allow-overdraft : reset even when held credits would breach the minimum}
{--resolvers : reset the owners the credits.modifiable resolvers yield}| Argument / voľba | Predvolené | Význam |
|---|---|---|
bucket* | — | Jedna alebo viac skupín na obnovenie. |
--period | monthly | daily, weekly, monthly alebo yearly. |
--key | — | Explicitný kľúč obdobia namiesto --period (napr. 2026-11). |
--to | 0 | Zostatok, na ktorý sa každá skupina obnoví; musí to byť celé číslo. |
--timezone | app.timezone | Časové pásmo, v ktorom sa obdobie určí. |
--description | null | Popis rozdielových záznamov. |
--allow-overdraft | false | Obnoviť aj vtedy, keď by rezervované kredity dostali dostupný zostatok pod minimum. |
--resolvers | false | Obnoviť vlastníkov, ktorých vrátia closures z credits.modifiable, namiesto každého vlastníka so záznamami v skupine. |
Predvolene obnoví každého vlastníka, ktorý má v danej skupine záznamy — vlastníci sa načítajú cez svoj morph typ a záznam, ktorého vlastník už neexistuje, sa nahlási a preskočí. S --resolvers obnoví namiesto toho vlastníkov, ktorých vrátia closures z credits.modifiable; to potrebujete pre vlastníkov, ktorí kredity ešte nikdy nemali. Kľúč obdobia sa určí raz za beh, takže beh, ktorý prekročí polnoc, obnoví všetkých do toho istého obdobia:
// routes/console.php — free credits back to 100 on the 1st, in the business's timezone
Schedule::command('credits:reset free --period=monthly --to=100 --timezone=Europe/Bratislava')
->monthlyOn(1, '00:05')
->timezone('Europe/Bratislava');
// daily allowance, topping up every user (resolvers in credits.modifiable)
Schedule::command('credits:reset daily_allowance --period=daily --to=10 --resolvers')->dailyAt('00:01');Druhé spustenie toho istého príkazu v jednom období už nič neobnoví. Príkaz vypíše, koľko vlastníkov obnovil a koľko už v danom období obnovených bolo; vlastník, ktorého ochrana odmietne, sa nahlási, beh pokračuje a príkaz skončí s kódom 1. Chybné voľby — --period=hourly, neceločíselné --to, priveľký --key, neznáme --timezone — zlyhajú skôr, než sa čokoľvek zapíše.
Tabuľka credit_resets
| Stĺpec | Typ | Poznámka |
|---|---|---|
creditable_type / creditable_id | morph pair, id per key_type | |
bucket | string | |
period | string(64) | Kľúč obdobia. |
reset_to | bigInteger | |
credit_id | per primary_key_type, nullable | Rozdielový záznam, ak sa zapísal. |
created_at | timestamp |
Primárny kľúč (creditable_type, creditable_id, bucket, period) — záruka idempotencie. Na zostatok sa nikdy nečíta.
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 kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
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.