# Kasa Kayıtları

https://dev.wisecp.com/tr/kasa-kayitlari

Kurulumun gelir ve gider defterini tutan altı uç.

## Genel Bakış

Kasa defteri kurulumun **gelir ve giderlerini** tutar. İçinde iki tür kayıt bir arada durur: faturaların ödendiğinde kendiliğinden açtığı kayıtlar ve operatörün elle girdiği kayıtlar.

Ayrımı **sistem işareti** yapar. Faturadan gelen bir kayıt salt bir yansımadır; değiştirilemez ve silinemez, çünkü kaynağı faturanın kendisidir. Elle girilen kayıtlar ise düzenlenebilir.

Özet ucu **bu ayın** gelirini, giderini ve aradaki farkı verir. Farklı para birimlerindeki tutarlar yerel para birimine çevrilerek toplanır.

## Referans

### Kayıtları Listeleme

get/api/v1/admin/invoices/cash

`Invoices/GetCashEntries` admin

Gelir ve gider kayıtlarını süzerek döndürür.

Sorgu 10

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. Aralık dışı bir değer öntanımlıya döner.

searchstringAçıklama, personel ve fatura numarasında arar.

typestringGelir ya da giderle sınırlar.

currency_idintPara birimine göre süzer.

staff_idintPersonele göre süzer.

amountstringTutara göre süzer.

amount_opstringTutar karşılaştırmasının yönü.

descriptionstringAçıklamada arar.

daterangestringİki tarih arasını süzer.

Dönen alanlar data[] — 13 + meta — 4

idintKaydın numarası.

invoice_idintBağlı olduğu fatura. Sıfır, kaydın elle girildiğini söyler.

typestringGelir mi gider mi: `income`, `expense`.

amountfloatTutar.

currency_idintTutarın para birimi.

staff_idintKaydı giren personel.

payment_methodstring | nullParanın hangi yolla alındığı ya da ödendiği.

descriptionstringKaydın açıklaması.

created_atstring | nullKaydın tarihi.

is_systemboolFaturadan gelen bir kayıt mı. Doğruysa kayıt değiştirilemez.

invoice_numberstring | nullBağlı faturanın numarası.

staff_namestring | nullPersonelin adı.

clientobject | nullBağlı faturanın müşterisi. Yalnız listede gelir.

totalintSüzgece uyan toplam kayıt. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa. Sıfır, son sayfadasınız demektir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/invoices/cash?type=expense' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/invoices/cash');
url.searchParams.set('type', 'expense');

const res  = await fetch(url, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/cash?' . http_build_query(['type' => 'expense']));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Liste FATURADAN gelen kayitlari da tasir; elle girilenler icin sistem isaretini suzun.
$manual = array_filter(
    Api::Invoices()->GetCashEntries()['data'],
    fn ($e) => ! $e['is_system'],
);
```

### Kayıt Ekleme

post/api/v1/admin/invoices/cash

`Invoices/CreateCashEntry` admin

Deftere elle bir gelir ya da gider kaydı düşer.

Gövde 7

typestringreqGelir mi gider mi: `income`, `expense`.

currency_idintreqTutarın para birimi.

amountfloatreqTutar. Sıfırdan büyük olmalı.

descriptionstringKaydın açıklaması.

payment_methodstringParanın hangi yolla hareket ettiği. Etkin olmayan bir yöntem boşa çıkar.

staff_idintKaydı giren personel. Verilmezse anahtarın sahibi yazılır.

created_atstringKaydın tarihi. Verilmezse şu an alınır.

Dönen alanlar 201 — data — 13

dataobjectAçılan kayıt. Listedeki öğeyle aynı şekildedir.

Hatalar 5

invalid_type422Tür gelir ya da gider değil.

currency_required422Para birimi verilmedi.

invalid_amount422Tutar sıfır ya da altında.

create_failed422Kayıt açılamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/invoices/cash' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"expense","currency_id":840,"amount":49.9,"description":"Sunucu gideri"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/invoices/cash', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'expense',
    currency_id: 840,
    amount: 49.9,
    description: 'Server cost',
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/cash');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'        => 'expense',
        'currency_id' => 840,
        'amount'      => 49.9,
        'description' => 'Server cost',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Elle acilan kayit FATURAYA BAGLANMAZ; fatura kaydi ancak odeme akisiyla dogar.
Api::Invoices()->CreateCashEntry([
    'type'        => 'expense',
    'currency_id' => 840,
    'amount'      => 49.9,
]);
```

### Kasa Özetini Okuma

get/api/v1/admin/invoices/cash/summary

`Invoices/GetCashSummary` admin

Bu ayın gelir, gider ve bakiye toplamını döndürür.

Dönen alanlar data — 4

currency_idintToplamların para birimi.

incomefloatBu ayın gelir toplamı.

expensefloatBu ayın gider toplamı.

balancefloatGelirden giderin düşülmüş hâli.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/invoices/cash/summary' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/invoices/cash/summary', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/cash/summary');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Ozet DAIMA bu aydir; baska bir donem icin listeyi tarih araligiyla cekip kendiniz toplayin.
$sum = Api::Invoices()->GetCashSummary()['data'];
```

### Kayıt Detayı

get/api/v1/admin/invoices/cash/{cash_id}

`Invoices/GetCashEntry` admin

Tek bir kasa kaydını döndürür.

Dönen alanlar data — 13

idintKaydın numarası.

invoice_idintBağlı olduğu fatura. Sıfır, kaydın elle girildiğini söyler.

typestringGelir mi gider mi: `income`, `expense`.

amountfloatTutar.

currency_idintTutarın para birimi.

staff_idintKaydı giren personel.

payment_methodstring | nullParanın hangi yolla alındığı ya da ödendiği.

descriptionstringKaydın açıklaması.

created_atstring | nullKaydın tarihi.

is_systemboolFaturadan gelen bir kayıt mı. Doğruysa kayıt değiştirilemez.

invoice_numberstring | nullBağlı faturanın numarası.

staff_namestring | nullPersonelin adı.

clientobject | nullBağlı faturanın müşterisi. Yalnız listede gelir.

Hatalar 2

not_found404Kasa kaydı bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/invoices/cash/51' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/cash/${cashId}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/cash/' . $cashId);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Musteri bilgisi burada GELMEZ; o alan yalniz liste birlestirmesinde doludur.
$entry = Api::Invoices()->GetCashEntry(['cash_id' => $cashId])['data'];
```

### Kaydı Güncelleme

patch/api/v1/admin/invoices/cash/{cash_id}

`Invoices/UpdateCashEntry` admin fatura kaydı düzenlenemez

Elle girilmiş bir kasa kaydını değiştirir.

Gövde 7

typestringGelir mi gider mi.

currency_idintTutarın para birimi.

amountfloatTutar.

descriptionstringKaydın açıklaması.

payment_methodstringParanın hangi yolla hareket ettiği.

staff_idintKaydı giren personel.

created_atstringKaydın tarihi.

Dönen alanlar data — 13

dataobjectGüncel kayıt. Listedeki öğeyle aynı şekildedir.

Hatalar 6

not_found404Kasa kaydı bulunamadı.

system_record422Faturaya bağlı kayda dokunulamaz.

invalid_type422Tür gelir ya da gider değil.

currency_required422Para birimi verilmedi.

invalid_amount422Tutar sıfır ya da altında.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/invoices/cash/51' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"amount":59.9,"description":"Sunucu gideri (guncellendi)"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/cash/${cashId}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ amount: 59.9, description: 'Server cost (updated)' }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/cash/' . $cashId);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['amount' => 59.9]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Sistem isaretli kayit 422 verir; toplu duzeltmede once bu alani suzun.
$entry = Api::Invoices()->GetCashEntry(['cash_id' => $cashId])['data'];
if (! $entry['is_system'])
    Api::Invoices()->UpdateCashEntry(['cash_id' => $cashId, 'amount' => 59.9]);
```

### Kaydı Silme

delete/api/v1/admin/invoices/cash/{cash_id}

`Invoices/DeleteCashEntry` admin

Elle girilmiş bir kasa kaydını kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen kaydın numarası.

Hatalar 4

not_found404Kasa kaydı bulunamadı.

system_record422Faturaya bağlı kayda dokunulamaz.

delete_failed422Kayıt silinemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/invoices/cash/52' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/cash/${cashId}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/cash/' . $cashId);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Faturadan gelen kaydi kaldirmanin yolu FATURA tarafindadir; buradan silinemez.
Api::Invoices()->DeleteCashEntry(['cash_id' => $cashId]);
```

## Tuzaklar

> **Faturadan gelen kayıt değiştirilemez**
> 
> Bir faturaya bağlı kasa kaydı **değiştirilemez**: düzenleme ve silme çağrıları reddedilir. Bu kasıtlıdır, çünkü o kayıt faturanın yansımasıdır ve faturayla çelişemez. Tutarı düzeltmek istiyorsanız faturaya dönün; kasa kaydı onunla birlikte düzelir.

> **Liste iki türü karıştırır**
> 
> Listeleme ucu elle girilenlerle faturadan gelenleri **bir arada** döndürür ve ayıran bir süzgeç yoktur. Bir raporda yalnız elle girilen giderleri toplamak istiyorsanız sistem işaretine göre kendiniz ayıklayın; yoksa fatura gelirleri de hesaba karışır.

> **Özet her zaman bu aydır**
> 
> Özet ucu dönem almaz; **daima içinde bulunulan ayı** verir. Geçen ayın ya da bir çeyreğin toplamını istiyorsanız listeyi tarih aralığıyla çekip kendiniz toplamanız gerekir. Toplarken para birimi dönüşümünü de kendiniz yapmalısınız; özetteki gibi çevrilmiş gelmezler.

> **Detayda müşteri bilgisi yoktur**
> 
> Bağlı faturanın müşterisi **yalnız listede** gelir; tek kayıt okurken o alan boş kalır. Bu, listenin bir birleştirme yapmasından, detayın yapmamasından kaynaklanır. Müşteriyi tek kayıt için de istiyorsanız fatura numarasından faturayı okuyun.

> **Elle kayıt faturaya bağlanmaz**
> 
> Ekleme ucu her zaman **bağımsız** bir kayıt açar; bir fatura numarası vererek kaydı ona bağlayamazsınız. Faturaya bağlı kayıtlar ancak ödeme akışının kendisinden doğar. Bu yüzden elle bir gelir girip aynı faturayı da ödenmiş yapmak, defterde aynı parayı iki kez gösterir.

## İlgili Makaleler

- [Periyodik Giderler](https://dev.wisecp.com/tr/periyodik-giderler)
- [Fatura Yönetimi](https://dev.wisecp.com/tr/fatura-yonetimi)
- [Fatura Durumu ve Bildirimleri](https://dev.wisecp.com/tr/fatura-durumu-ve-bildirimleri)
