# Жазылым бойынша счёт шықпай жатыр

> Жазылым кестеге сай счёт шығармаса, тексеретін алты нәрсе бар: күйі, келесі кезек уақыты, қайталау сатысы, өткізіп алу саясаты, кассир және тариф лимиті. lastRunStatus пен lastError қайдан оқылады.

## Қысқаша

Жазылым — бұл **счётты кестеге сай автоматты шығару**. Ақша клиенттің шотынан өздігінен алынбайды: әр төлемді клиент Kaspi-де өзі растайды. Сондықтан «жазылым істемей жатыр» дегеннің екі мағынасы бар — счёт мүлде шықпады ма, әлде счёт шықты, бірақ клиент төлемеді ме. Алдымен `lastRunStatus` пен `lastError` өрістерін оқыңыз: жауап әдетте сол екеуінде.

## Симптом → себеп → шешім

| Симптом | Себебі | Шешімі |
|---|---|---|
| Счёт мүлде шықпады | Жазылым `paused` немесе `closed` | Күйін қараңыз, қажет болса `resume` жасаңыз |
| Уақыты келді, счёт жоқ | Келесі кезек басқа уақытқа белгіленген | Келесі кезек өрісін тексеріңіз |
| Счёт кешігіп шықты | Қайталау сатысы жүріп жатыр | `retryDelaysMin` мәндерін қараңыз |
| Бір кезек мүлде өткізіліп жіберілді | `misfirePolicy: skip` | Саясатты `run_once` етіп қойыңыз |
| `lastError` Kaspi байланысын көрсетеді | Кассир сессиясы үзілген | Қайта байланыстырыңыз: [Кассир қосылмай жатыр](/kb/cashier-not-connecting) |
| `lastError` тариф лимитін көрсетеді | Айлық лимит бітті | [Лимитке жеттім](/kb/tariff-limit-hit) |
| Счёттар шығып жатыр, ақша жоқ | Клиенттер төлемей жатыр | Бұл қате емес, төлем клиенттің қолында |

## Алдымен нені оқу керек

Жазылымның өзінде диагностикаға арналған үш өріс бар:

| Өріс | Не көрсетеді |
|---|---|
| `lastRunStatus` | Соңғы кезектің нәтижесі |
| `lastError` | Сәтсіз болса, нақты қате коды |
| `failedRuns` | Қатарынан сәтсіз болған кезектер саны |

`lastError` ішіндегі код қалған бәрін айтып береді. Мысалы `kaspi_session_expired` — кассир мәселесі, `tariff_limit_reached` — тариф мәселесі, `invalid_phone` — клиент деректері.

## Алты тексеру

### 1. Жазылымның күйі

Үш күй бар: `active`, `paused`, `closed`.

- **`paused`** — уақытша тоқтатылған. Кезектер жүрмейді. `POST /subscriptions/{id}/resume` арқылы қайта қосасыз.
- **`closed`** — аяқталған немесе тоқтатылған. Мұны қайта қосуға болмайды, жаңа жазылым жасайсыз (`subscription_closed`).

Жазылым өздігінен `closed` болуы мүмкін: ең көп орындалу саны бітсе.

### 2. Келесі кезектің уақыты

Кестеде екі параметр бар: аралық (`day`, `week`, `month`) және кратность `every`. Мысалы `month` + `every: 2` — екі айда бір рет.

Жиі кездесетін шатасу: жазылым жасалған сәтте бірден счёт шығады деп күту. Кесте бірінші кезектің уақытынан басталады, ол бүгін болмауы мүмкін. Келесі кезек уақытын жазылым карточкасынан немесе `GET /subscriptions/{id}` жауабынан қараңыз.

### 3. Қайталау сатысы

Кезек сәтсіз болса, жазылым бірден тоқтамайды — қайталау сатысы бойынша тағы тырысады. Әдепкі мәні `retryDelaysMin: [15, 60, 360]` минут: 15 минуттан кейін, сосын бір сағаттан, сосын алты сағаттан кейін. Ең көбі 5 мән қоюға болады.

Саты біткенше счёт шықпағандай көрінеді. Сол уақытта `lastError` толып тұрады — себебін содан оқыңыз.

Саты аяқталғанда **сол кезек тасталады, бірақ кесте жалғасады**: келесі жоспарлы кезек өз уақытында жүреді. `failedRuns` санауышы өседі.

### 4. Өткізіп алу саясаты

Кезек уақыты келгенде жүйе қандай да бір себеппен оны өткізіп алса, `misfirePolicy` не істеу керегін шешеді:

| Мән | Не болады |
|---|---|
| `run_once` (әдепкі) | Өткізіп алынған кезек бір рет кейін орындалады |
| `skip` | Өткізіп алынған кезек мүлде орындалмайды |

`misfireAfterMin` — қанша минуттан кейін кезек «өткізіп алынды» деп саналады, әдепкі мәні 1440 (бір тәулік).

Егер сізде `skip` қойылған болса, өткізіп алынған счёт мүлде шықпайды — бұл қате емес, сіз солай бапталған.

Өткізіп алынғанды қолмен жіберу керек болса: `POST /subscriptions/{id}/resume` денесінде `{ "catchUp": true }`.

### 5. Кассир белсенді ме

Жазылым **қай кассир арқылы жасалғанын есте сақтайды**. Сол кассирдің Kaspi байланысы үзілген болса, кезек счёт жасай алмайды.

Бұл жиі кездесетін жағдай: кассир нөмірімен біреу Kaspi Pay қосымшасына кіреді, сессия үзіледі, ал жазылым тыныш тұрып, `lastError` ішіне қате жазып отырады. Тексеру: кабинет → **Kaspi** бөлімінде байланыс белсенді ме. Толығы: [Кассир қосылмай жатыр](/kb/cashier-not-connecting).

### 6. Тариф лимиті

Айлық лимит біткенде жазылым да жаңа счёт жасай алмайды — ол кәдімгі счёт сияқты есептеледі. `lastError` ішінде `tariff_limit_reached` тұрады.

Жазылымдар көп болса, олардың айлық көлемін тариф таңдаған кезде алдын ала есептеңіз: [Қай тарифті таңдау керек](/kb/tariff-choose).

## Жиі шатасатын нәрсе

Жазылым клиенттің шотынан ақшаны өзі алмайды. Ол тек **счёт шығарады**, клиент оны Kaspi-де көреді де, төлеуді өзі растайды. Сондықтан:

- Счёт шығып, клиент төлемесе — жазылым дұрыс жұмыс істеп тұр
- Төлемеген клиентті қайталау сатысы құтқармайды: саты счёт **жасалмаған** жағдайға арналған, төленбеген жағдайға емес
- Төленбеген жазылым үшін өз жағыңыздан еске салу керек

Толығы: [Жазылымдық бизнеске](/kb/for-subscription-business).

## Жиі қойылатын сұрақтар

**Жазылымды тоқтатсам, ашық счёттар жойыла ма?** Жоқ. Бұрын шыққан счёттар өз бетінше өмір сүреді: төленеді, болдырылады немесе мерзімі өтеді.

**Қайталау сатысын өзгертуге бола ма?** Иә, `retryDelaysMin` өрісі арқылы, ең көбі 5 мән. Әдепкісі `[15, 60, 360]` минут.

**Өткізіп алынған кезекті қолмен жіберуге бола ма?** Иә: `POST /subscriptions/{id}/resume` денесінде `{ "catchUp": true }`.

**`closed` жазылымды қайта қосуға бола ма?** Жоқ, `subscription_closed` қатесі келеді. Жаңа жазылым жасаңыз.

**Жазылым қай кассир арқылы жүретінін ауыстыруға бола ма?** Жазылым жасалған кездегі кассирді есте сақтайды. Кассир ауысатын болса, жаңа жазылым жасаған дұрыс.

**Барлық өрістердің толық сипаттамасы қайда?** [Жазылым API](/kb/subscriptions-api) бетінде.
