Przejdź do głównej zawartości

credit_limits

Metoda płatności Credit Limit. Administratorzy przyznają limit per Organization; Klienci konsumują go przy checkout. Rezerwacje są atomowe i idempotentnie zwalniane przy opłaceniu faktury lub anulowaniu zamówienia.

Publiczne API​

Wszystkie trasy admin są chronione uprawnieniem credit_limits:manage.

Verb + PathOdbiorcaCel
GET /api/v1/me/credit-limitcustomerPodgląd przyznanego limitu + aktualnie zarezerwowanego (404 CREDIT_LIMIT_NOT_GRANTED, gdy brak)
GET /api/v1/admin/credit-limitsadminRejestr wszystkich przyznanych limitów z aktywnymi rezerwacjami
GET /api/v1/admin/organizations/:id/credit-limitadminLimit jednej organization + rezerwacje
POST /api/v1/admin/organizations/:id/credit-limitadminPrzyznanie początkowego limitu
PATCH /api/v1/admin/organizations/:id/credit-limitadminKorekta kwoty (odrzuca poniżej aktywnych rezerwacji, chyba że allowOverAllocation)

UX storefront: profil konta i strona Checkout renderują CreditLimitWidget (przyznany / dostępny / rozbicie rezerwacji), gdy limit istnieje; metody płatności typu credit_limit są filtrowane z Checkout, gdy limit nie jest przyznany lub suma koszyka przekracza dostępny kredyt.

Model współbieżności​

CreditLimitService.reserve() otwiera SELECT … FOR UPDATE na wierszu credit_limits, następnie wstawia rezerwację. Dwa równoczesne zamówienia, które łącznie przekroczyłyby limit, są serializowane; jedno kończy się sukcesem, a drugie otrzymuje 409 LIMIT_INSUFFICIENT. Zobacz backend/test/contract/credit_limits/concurrent-race.test.ts.

Encje​

CreditLimit, CreditLimitReservation (status: active | released). Indeks na (credit_limit_id, status) utrzymuje szybkie zapytanie o dostępne saldo.

Emitowane zdarzenia​

credit_limit.granted.v1, credit_limit.adjusted.v1, credit_limit.reservation_released.v1.

Punkty rozszerzenia​

  • Powody zwolnienia — releaseByOrder(reason) akceptuje dziś 'invoice_paid' i 'order_cancelled'. Nowe powody (np. 'manual_override') dodaje się przez rozszerzenie enumu i podłączenie wywołującego.