# Periyodik Giderler

https://dev.wisecp.com/tr/periyodik-giderler

Her ay tekrarlanan sabit giderleri tanımlayan altı uç.

## Genel Bakış

Periyodik giderler sunucu kirası, lisans ücreti ya da abonelik gibi **her ay tekrarlanan ödemeleri** tanımlar. Buradaki kayıtlar bir gider değil, gider doğuran bir **kuraldır**.

Her kural bir **gün ve saat** taşır. Zamanlanmış görev o anı yakaladığında kural çalışır ve kasa defterine o ayın gider kaydını düşer. Yani buradaki kayıt sayısı defterdeki kayıt sayısıyla aynı değildir.

Özet ucu **ileriye bakar**: kurulumun her ay ne kadar sabit gideri olduğunu söyler. Geçmişte ne ödendiğini görmek için kasa defterine bakılır.

## Referans

### Giderleri Listeleme

get/api/v1/admin/invoices/periodic

`Invoices/GetPeriodicExpenses` admin

Her ay tekrarlanan giderleri süzerek döndürür.

Sorgu 8

pageintKaçıncı sayfa.

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

searchstringAçıklamada arar.

currency_idintPara birimine 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[] — 9 + meta — 4

idintKaydın numarası.

amountfloatHer ay işlenecek tutar.

currency_idintTutarın para birimi.

descriptionstringGiderin ne olduğu.

dayintAyın hangi günü işleneceği.

hourintİşleneceği saat.

minuteintİşleneceği dakika.

timestringSaat ve dakikanın birleşik hâli.

created_atstring | nullKaydın açıldığı an.

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/periodic' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Bunlar KURALLARDIR, kayitlar degil: her biri her ay bir kasa gideri dogurur.
$rules = Api::Invoices()->GetPeriodicExpenses()['data'];
```

### Gider Ekleme

post/api/v1/admin/invoices/periodic

`Invoices/CreatePeriodicExpense` admin gün ve saat şart

Her ay kendiliğinden işlenecek bir gider tanımlar.

Gövde 5

currency_idintreqTutarın para birimi.

amountfloatreqHer ay işlenecek tutar. Sıfırdan büyük olmalı.

dayintreqAyın hangi günü işleneceği. Bir ile otuz bir arasında.

timestringreqİşlenme saati. Saat ve dakika olarak verilir ve ikisine ayrıştırılır.

descriptionstringGiderin ne olduğu.

Dönen alanlar 201 — data — 9

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

Hatalar 6

currency_required422Para birimi verilmedi.

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

invalid_day422Gün aralığın dışında.

invalid_time422Saat beklenen biçimde değil.

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/periodic' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"currency_id":840,"amount":49.9,"day":1,"time":"09:00","description":"Aylik sunucu gideri"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/invoices/periodic', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    currency_id: 840,
    amount: 49.9,
    day: 1,
    time: '09:00',
    description: 'Monthly server cost',
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/periodic');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'currency_id' => 840,
        'amount'      => 49.9,
        'day'         => 1,
        'time'        => '09:00',
    ]),
]);

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

```php
// Otuz birinci gunu secmek KISA aylarda kaydin islenmemesine yol acabilir.
Api::Invoices()->CreatePeriodicExpense([
    'currency_id' => 840,
    'amount'      => 49.9,
    'day'         => 1,
    'time'        => '09:00',
]);
```

### Özeti Okuma

get/api/v1/admin/invoices/periodic/summary

`Invoices/GetPeriodicSummary` admin

Aylık toplam sabit gideri döndürür.

Dönen alanlar data — 3

currency_idintToplamın para birimi.

totalfloatAylık toplam gider. Farklı para birimleri çevrilerek toplanır.

countintToplama giren kayıt sayısı.

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/periodic/summary' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Bu toplam GELECEGE bakar: her ay ne odeyecegini soyler, ne odendigini degil.
$plan = Api::Invoices()->GetPeriodicSummary()['data'];
```

### Gider Detayı

get/api/v1/admin/invoices/periodic/{periodic_id}

`Invoices/GetPeriodicExpense` admin

Tek bir periyodik gideri döndürür.

Dönen alanlar data — 9

idintKaydın numarası.

amountfloatHer ay işlenecek tutar.

currency_idintTutarın para birimi.

descriptionstringGiderin ne olduğu.

dayintAyın hangi günü işleneceği.

hourintİşleneceği saat.

minuteintİşleneceği dakika.

timestringSaat ve dakikanın birleşik hâli.

created_atstring | nullKaydın açıldığı an.

Hatalar 2

not_found404Periyodik gider 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/periodic/8' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Kayit SON NE ZAMAN islendigini tasimaz; onu kasa defterinden okumaniz gerekir.
$rule = Api::Invoices()->GetPeriodicExpense(['periodic_id' => $id])['data'];
```

### Gideri Güncelleme

patch/api/v1/admin/invoices/periodic/{periodic_id}

`Invoices/UpdatePeriodicExpense` admin

Periyodik giderin tutarını ya da zamanını değiştirir.

Gövde 5

currency_idintTutarın para birimi.

amountfloatHer ay işlenecek tutar. Sıfırdan büyük olmalı.

dayintAyın hangi günü işleneceği. Bir ile otuz bir arasında.

timestringİşlenme saati. Saat ve dakika olarak, yirmi dört saatlik düzende.

descriptionstringGiderin ne olduğu.

Dönen alanlar data — 9

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

Hatalar 6

not_found404Periyodik gider bulunamadı.

currency_required422Para birimi verilmedi.

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

invalid_day422Gün aralığın dışında.

invalid_time422Saat beklenen biçimde değil.

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/periodic/8' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"amount":59.9,"day":5,"time":"10:30"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/periodic/${periodicId}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ amount: 59.9, day: 5, time: '10:30' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/periodic/' . $periodicId);
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, 'day' => 5]),
]);

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

```php
// Degisiklik GECMISE islemez: bu ay islenmis kayit eski tutarla defterde kalir.
Api::Invoices()->UpdatePeriodicExpense(['periodic_id' => $id, 'amount' => 59.9]);
```

### Gideri Silme

delete/api/v1/admin/invoices/periodic/{periodic_id}

`Invoices/DeletePeriodicExpense` admin

Periyodik gideri kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen kaydın numarası.

Hatalar 3

not_found404Periyodik gider bulunamadı.

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/periodic/8' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/periodic/' . $periodicId);
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
// Silmek GECMIS kasa kayitlarina dokunmaz; yalniz bir daha islenmesini durdurur.
Api::Invoices()->DeletePeriodicExpense(['periodic_id' => $id]);
```

## Tuzaklar

> **Kısa aylarda geç günler atlanabilir**
> 
> Ayın otuz birinci günü **her ayda yoktur**; otuzuncu ve yirmi dokuzuncu günler de kimi aylarda yoktur. Böyle bir gün seçen kural o aylarda işlenmeyebilir ve gider defterde görünmez. Her ay çalışması gereken bir gider için ayın ilk günlerinden birini seçin.

> **Kural değişikliği geçmişe işlemez**
> 
> Tutarı ya da günü değiştirmek **yalnız bundan sonrasını** etkiler. Bu ay zaten işlenmiş bir gider defterde eski tutarıyla kalır; yeni tutarı görmek için gelecek ayı beklemek gerekir. Geçmişi düzeltmek istiyorsanız kasa defterindeki kaydı ayrıca güncelleyin.

> **Silmek geçmiş giderleri kaldırmaz**
> 
> Kuralı silmek yalnız **bir daha işlenmesini** durdurur; o güne kadar defterde oluşmuş gider kayıtları yerinde kalır. Bu doğru davranıştır, çünkü o ödemeler gerçekten yapılmıştır. Geçmişi de temizlemek istiyorsanız kasa kayıtlarını ayrıca silmeniz gerekir.

> **Kayıt son çalışma anını taşımaz**
> 
> Periyodik gider kaydında **son ne zaman işlendiği** yazmaz. Bir kuralın bu ay çalışıp çalışmadığını anlamak için kasa defterine bakıp o açıklamayla eşleşen kaydı aramanız gerekir. Denetim yazıyorsanız bunu hesaba katın: buradaki liste tek başına bir çalışma geçmişi vermez.

> **Özet ileriye, defter geriye bakar**
> 
> Buradaki özet **her ay ne ödeneceğini** söyler; kasa özeti ise bu ay ne ödendiğini. İkisi birbirini tutmaz ve tutması da beklenmez: bir kural ayın yirmisinde çalışıyorsa ayın onunda defterde henüz yoktur. Raporda ikisini aynı satıra koymayın.

## İlgili Makaleler

- [Kasa Kayıtları](https://dev.wisecp.com/tr/kasa-kayitlari)
- [Fatura Yönetimi](https://dev.wisecp.com/tr/fatura-yonetimi)
- [Zamanlanmış Görev Ekleme](https://dev.wisecp.com/tr/zamanlanmis-gorev-ekleme)
