> ## Documentation Index
> Fetch the complete documentation index at: https://docs.payven.com.tr/llms.txt
> Use this file to discover all available pages before exploring further.

# Transfer Reddet (Reject)

> Pending durumdaki transferleri onaylamadan reddetme — alternatif 2. adım.

Reject, 4-eyes akışında **onay yerine** uygulanan alternatif aksiyondur. `pending` durumdaki transferler reddedildiğinde kalıcı olarak `rejected` durumuna geçer; bankaya hiçbir istek gönderilmez ve hesaplarınızdan para çekilmez.

## Endpoint

```http theme={null}
POST /api/v1/transfers/bulk/reject
```

**Yetki:** `transfer-admin` rolü gerektirir (onay yetkisiyle aynı).

## Ne zaman kullanılır?

| Senaryo                                              | Aksiyon                                 |
| ---------------------------------------------------- | --------------------------------------- |
| Yanlış kaynak hesap seçildi                          | Reject + yeniden create                 |
| Hatalı tutar veya alıcı                              | Reject + yeniden create                 |
| 4-eyes onay süreci başarısız (operatör itiraz etti)  | Reject                                  |
| Toplu transfer içinde bir kalem hatalı, kalanı temiz | Sadece hatalıyı reject + yeniden create |

<Note>
  **Reject ≠ İptal.** Bir transfer **bankaya gönderildikten** sonra reject edilemez (`pending` durumunda değildir). Bankaya gitmiş bir transferin geri alınması için banka tarafı iade akışı (sonradan `transfer.refunded` olabilir) gerekir.
</Note>

## İstek

```bash theme={null}
curl -X POST https://transfer.payven.com.tr/api/v1/transfers/bulk/reject \
  -H "Authorization: Bearer $PAYVEN_TOKEN" \
  -H "X-Tenant-Id: $TENANT_ID" \
  -H "Idempotency-Key: payroll-2026-05-01-reject" \
  -H "Content-Type: application/json" \
  -d '{
    "transfer_ids": [
      "8e3f5c12-9a7b-4c8d-bc4e-2c963f66afa6",
      "9f3d2b8e-..."
    ],
    "reason": "Yanlış kaynak hesap seçildi — düzeltilmiş listeyle yeniden oluşturulacak"
  }'
```

| Alan             | Tip        | Zorunluluk | Açıklama                                                  |
| ---------------- | ---------- | ---------- | --------------------------------------------------------- |
| `transfer_ids[]` | UUID array | Zorunlu    | Reddedilecek transfer kimlikleri (max 1000 / istek)       |
| `reason`         | string     | Opsiyonel  | Operatör notu (audit kaydında saklanır, max 500 karakter) |

## Yanıt

```http theme={null}
HTTP/1.1 200 OK
Content-Type: application/json
```

```json theme={null}
{
  "rejected": [
    {
      "id":            "8e3f5c12-9a7b-4c8d-bc4e-2c963f66afa6",
      "status":        "rejected",
      "rejected_at":   "2026-05-03T12:34:55.000+00:00",
      "rejected_by":   "operator-user-id"
    },
    {
      "id":            "9f3d2b8e-...",
      "status":        "rejected",
      "rejected_at":   "2026-05-03T12:34:55.000+00:00",
      "rejected_by":   "operator-user-id"
    }
  ],
  "skipped": [],
  "total_rejected": 2
}
```

| Alan             | Açıklama                                                                                |
| ---------------- | --------------------------------------------------------------------------------------- |
| `rejected[]`     | Başarıyla reddedilen transferler                                                        |
| `skipped[]`      | Reddedilemeyenler (zaten approved, sent, completed, vb.) — her biri için `reason` döner |
| `total_rejected` | Reddedilen transfer sayısı                                                              |

## Kısmi başarı

Bir veya daha fazla transfer reddedilemeyebilir (örn. zaten onaylanmış, gönderilmiş veya başka tenant'a ait). Bu durumda yine `200 OK` döner; başarısızlar `skipped[]` array'inde gözükür:

```json theme={null}
{
  "rejected": [
    { "id": "8e3f5c12-...", "status": "rejected", "rejected_at": "..." }
  ],
  "skipped": [
    {
      "id":      "9f3d2b8e-...",
      "reason":  "already_sent",
      "message": "Bu transfer zaten bankaya gönderilmiş, reddedilemez."
    }
  ],
  "total_rejected": 1
}
```

İstek tamamen başarısızsa (örn. tüm transfer ID'ler geçersiz) `422 Unprocessable Entity` döner.

## Hata response'ları

| HTTP  | `code`                     | Anlam                                               |
| ----- | -------------------------- | --------------------------------------------------- |
| `400` | `validation_failed`        | `transfer_ids[]` boş veya ID formatı geçersiz       |
| `403` | `forbidden`                | `transfer-admin` rolü yok                           |
| `404` | `transfer_not_found`       | Tüm verilen ID'ler bulunamadı                       |
| `422` | `invalid_state_transition` | Transfer `pending` durumunda değil                  |
| `409` | `idempotency_key_in_use`   | Aynı `Idempotency-Key` farklı body için kullanılmış |

Hata yanıtı RFC 9457 problem+json.

## Webhook olayı

Reject şu an dedicated bir webhook olayı yayınlamaz — operatör eylemi olarak konsoldaki audit log'a düşer. İleride `transfer.rejected` olayı yol haritasındadır.
