> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.insurgateway.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.insurgateway.com/_mcp/server.

# InstallmentRuleChange Notification

InsurGateway tarafında bir **taksit tanımı** (sigorta şirketi / branş / ürün / acente kapsamında geçerli taksit seçenekleri) değiştiğinde, ilgili acentelerin platformlarına gönderilen bildirim tipidir. Platform bu bildirim ile hangi kapsamda hangi taksit seçeneklerinin geçerli olduğunu öğrenir ve kendi teklif hazırlama / ödeme ekranı mantığını buna göre günceller.

Bildirim şu dört durumda tetiklenir:

* **Ekleme:** Yeni bir taksit tanımı (genel veya acente özel) oluşturulduğunda.
* **Güncelleme:** Tanımın taksit seçenekleri veya kapsamı (branş/ürün) değiştiğinde.
* **Aktiflik değişimi:** Tanım pasife çekildiğinde veya tekrar aktife alındığında.
* **Silme:** Taksit tanımı silindiğinde.

Bildirim **delta değil, tanımın o anki tam durumunu** taşır: tek bir taksit seçeneği değişse dahi tanıma ait **tüm** seçenekler gönderilir. Tanım açılıp hiçbir alan değiştirilmeden kaydedilirse (seçenekler yalnızca farklı sırada işaretlenmiş olsa bile) bildirim gönderilmez.

> Header ve zarf (envelope) yapısı için: [Platform Entegrasyon Gereksinimleri](../platform-entegrasyon-gereksinimleri). Bu bildirim tipi standart zarfı ve standart retry davranışını kullanır: başarı için hem HTTP `200` hem de gövdede `ResultStatus.Status = "Success"` gerekir.

---

## Endpoint

| Alan               | Değer               |
| ------------------ | ------------------- |
| HTTP Method        | `POST`              |
| Path               | `/PushNotification` |
| `NotificationType` | `12`                |

---

## Örnek İstek

```bash
curl -X POST "https://platform.ornek.com.tr/insurgw/PushNotification" \
  -H "Content-Type: application/json" \
  -H "x-api-key: 9f3c1e8a-2b4d-1234-5678-deadbeefcafe" \
  -d '{
    "ReferanceNo": "10025_20260806073000123a1b2c_0_0",
    "SubReferanceNo": "a1b2c3d4-e5f6-7890abcdef1234567890",
    "RequestKeyValueSet": null,
    "RequestObject": {
      "NotificationType": 12,
      "Payload": "[{\"ChangeType\":\"updated\",\"Values\":[{\"InsuranceCompanyId\":12,\"ProductBranchId\":3,\"ProductId\":null,\"AgentId\":null,\"IsActive\":true,\"UpdatedDate\":\"2026-08-06T07:30:00Z\",\"Installments\":[{\"InstallmentCount\":1,\"PaymentType\":\"A\"},{\"InstallmentCount\":3,\"PaymentType\":\"K\"}]}]}]"
    }
  }'
```

> `ReferanceNo` opak bir idempotency anahtarıdır; format `{AgentId}_{zamanDamgası+benzersiz}_0_0` şeklindedir ve aynı bildirimin retry'larında **değişmez**.

---

## Parse Edilmiş Payload

`RequestObject.Payload` alanı serialize edilmiş bir JSON string'tir; ikinci bir parse sonrasında aşağıdaki yapıya ulaşılır. Kök eleman bir **dizidir**.

```json
[
  {
    "ChangeType": "updated",
    "Values": [
      {
        "InsuranceCompanyId": 12,
        "ProductBranchId": 3,
        "ProductId": null,
        "AgentId": null,
        "IsActive": true,
        "UpdatedDate": "2026-08-06T07:30:00Z",
        "Installments": [
          { "InstallmentCount": 1, "PaymentType": "A" },
          { "InstallmentCount": 3, "PaymentType": "K" }
        ]
      }
    ]
  }
]
```

| Alan            | Tip       | Açıklama                                                       |
| --------------- | --------- | -------------------------------------------------------------- |
| `[]`            | object\[] | Değişiklik tipine göre gruplanmış dizi. En az bir grup içerir. |
| `[].ChangeType` | string    | `added`, `updated` veya `deleted`.                             |
| `[].Values`     | object\[] | O gruptaki değişen taksit tanımları.                           |

**Taksit tanımı objesi alanları (`Values` elemanları):**

| Alan                 | Tip                    | Açıklama                                                                                                                            |
| -------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `InsuranceCompanyId` | int                    | Tanımın ait olduğu sigorta şirketi kodu.                                                                                            |
| `ProductBranchId`    | int\|null              | Tanımın sınırlandığı branş kodu. `null` ise tanım şirketin tamamı için geçerlidir.                                                  |
| `ProductId`          | int\|null              | Tanımın sınırlandığı ürün kodu. `null` ise tanım branş veya şirket seviyesindedir.                                                  |
| `AgentId`            | int\|null              | Tanımın sınırlandığı acente kodu. `null` ise genel (tüm acenteler için geçerli) tanımdır.                                           |
| `IsActive`           | bool                   | Tanımın aktif/pasif durumu. `false` ise taksit çözümlemesinde dikkate alınmaz.                                                      |
| `UpdatedDate`        | string(ISO 8601)\|null | Tanımın son güncellenme zamanı. **UTC** olarak gönderilir (`Z` sonekli). `deleted` bildiriminde silinmeden önceki son değeri taşır. |
| `Installments`       | object\[]              | Tanımdaki **tüm** taksit seçenekleri. Tanımda hiç seçenek yoksa boş dizi gelir.                                                     |

**Taksit seçeneği objesi alanları (`Installments` elemanları):**

| Alan               | Tip    | Açıklama                             |
| ------------------ | ------ | ------------------------------------ |
| `InstallmentCount` | int    | Taksit sayısı (1-12).                |
| `PaymentType`      | string | `A` = açık hesap, `K` = kredi kartı. |

---

## Beklenen Cevap

Platform, standart cevap zarfını döndürmelidir. Başarı kabul edilmesi için hem HTTP `200`, hem de gövdede `ResultStatus.Status = "Success"` gerekir.

**Başarı:**

```http
HTTP/1.1 200 OK
Content-Type: application/json

{ "ResultStatus": { "Status": "Success", "Explanation": null }, "Result": null }
```

**Hata (retry tetikler):**

```http
HTTP/1.1 200 OK
Content-Type: application/json

{ "ResultStatus": { "Status": "Error", "Explanation": "Taksit değişikliği işlenemedi." }, "Result": null }
```

> Bildirim `ReferanceNo` üzerinden **idempotent** işlenmelidir; aynı `ReferanceNo` ile yeniden gelen bir bildirim tekrar uygulanmamalıdır.

---

## Retry

`2xx` dışı HTTP kodu, gövdede `Status ≠ "Success"` ve transport hatası (bağlantı kopması / timeout) durumlarının tamamı retry tetikler.

| Parametre                       | Değer                                                   |
| ------------------------------- | ------------------------------------------------------- |
| Retry koşulu                    | HTTP hatası, `Status ≠ "Success"` veya transport hatası |
| Maksimum retry (orijinal hariç) | **5**                                                   |
| Toplam maksimum deneme          | **6**                                                   |
| Bekleme süreleri                | 3 sn → 10 sn → 1 dk → 1 saat (≥4. retry)                |

Son retry'da HTTP başlığında `IsLastAttemptToReDelivery=true` gönderilir.