Fatura Yönetimi
Fatura kesen, okuyan, düzenleyen ve gelir özetini veren altı uç.
Genel Bakış
Bu altı uç faturanın kendisiyle ilgilenir: listelemek, kesmek, okumak, başlık alanlarını düzenlemek ve silmek. Yanına bir de dönem toplamı veren gelir özeti girer.
Fatura anlık bir görüntü taşır: müşterinin adı, adresi ve vergi bilgileri kesim anındaki hâliyle kaydın içinde durur. Müşteri sonradan adresini değiştirse bile fatura değişmez, çünkü kesilmiş bir belge geçmişi anlatır.
Para tarafı üç katmanlıdır: kalemler ara toplamı, vergi onun üstüne geleni, komisyon ve vade farkı ise ödeme yönteminin getirdiğini anlatır. Üçü birlikte genel toplamı verir.
Referans
Faturaları Listeleme
Faturaları süzerek ve sayfalayarak döndürür.
waiting, unpaid, paid, cancelled, refund. Ayrıca vadesi geçmiş, yaklaşan, resmî ve resmî olmayan gibi türetilmiş süzgeçler alır.waiting, unpaid, paid, cancelled, refund.curl 'https://panel.ornek.com/api/v1/admin/invoices?status=unpaid&limit=25' \
-H "Authorization: Bearer $API_KEY"const url = new URL('https://panel.ornek.com/api/v1/admin/invoices');
url.searchParams.set('status', 'unpaid');
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices?' . http_build_query(['status' => 'unpaid', 'limit' => 25]));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Taslak ve sistem faturalari listeye HIC girmez; sayim tabloyla birebir tutmaz.
$rows = Api::Invoices()->GetInvoices([], ['status' => 'unpaid'])['data'];Fatura Kesme
Bir müşteriye elle fatura keser ve kalemlerini yazar.
curl -X POST 'https://panel.ornek.com/api/v1/admin/invoices' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"client_id":87,"currency_id":840,"items":[{"description":"Hosting","quantity":1,"amount":12.5}]}'const res = await fetch('https://panel.ornek.com/api/v1/admin/invoices', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
client_id: 87,
currency_id: 840,
due_date: '2026-07-01',
items: [
{ description: 'Hosting Plan', quantity: 1, amount: 12.5 },
],
}),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 87,
'currency_id' => 840,
'items' => [
['description' => 'Hosting Plan', 'quantity' => 1, 'amount' => 12.5],
],
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Bildirim ISTEGE BAGLIDIR: gondermezseniz musteri faturadan haberdar olmaz.
Api::Invoices()->CreateInvoice([
'client_id' => $uid,
'items' => $lines,
'send_notification' => true,
]);Gelir Özetini Okuma
Seçtiğiniz tip ve dönem için toplam tutarı döndürür.
curl 'https://panel.ornek.com/api/v1/admin/invoices/stats?type=unpaid&period=this-month' \
-H "Authorization: Bearer $API_KEY"const url = new URL('https://panel.ornek.com/api/v1/admin/invoices/stats');
url.searchParams.set('type', 'unpaid');
url.searchParams.set('period', 'this-month');
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/stats?' . http_build_query(['type' => 'unpaid', 'period' => 'this-month']));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Tutar CEVRILMIS bir toplamdir: gunun kuruna gore hesaplanir, biciminizi siz verirsiniz.
$s = Api::Invoices()->GetInvoiceStats([], ['type' => 'unpaid'])['data'];
$sum = Money::formatter_symbol($s['amount'], $s['currency_id']);Fatura Detayı
Faturayı kalemleri, ödemeleri ve müşteri anlık görüntüsüyle döndürür.
waiting, unpaid, paid, cancelled, refund.curl 'https://panel.ornek.com/api/v1/admin/invoices/1212' \
-H "Authorization: Bearer $API_KEY"const res = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/${id}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/' . $id);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Toplami YENIDEN URETIRKEN iki vergiyi ayrica ekleyin; 'tax' alani onlari icermez.
$inv = Api::Invoices()->GetInvoice(['id' => $id])['data'];
$sum = $inv['subtotal'] + $inv['tax']
+ $inv['payment_method_commission'] + $inv['payment_method_commission_tax']
+ $inv['installment_surcharge'] + $inv['installment_surcharge_tax'];Faturayı Düzenleme
Faturanın başlık alanlarını değiştirir ve gerekirse toplamları yeniden hesaplar.
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/invoices/1212' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"number":"INV-2026-0042","tax_rate":20}'const res = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/${id}`, {
method: 'PATCH',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
number: 'INV-2026-0042',
tax_rate: 20,
due_date: '2026-07-15 23:59:00',
}),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/' . $id);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'number' => 'INV-2026-0042',
'tax_rate' => 20,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Vergiden muaf yapmak RESMILESTIRMEYI EZER; ikisini birlikte gondermek anlamsizdir.
Api::Invoices()->UpdateInvoice(['id' => $id, 'formalized' => true]);Faturayı Silme
Faturayı ve ona bağlı bütün kayıtları kaldırır.
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/invoices/1226' \
-H "Authorization: Bearer $API_KEY"const res = await fetch(`https://panel.ornek.com/api/v1/admin/invoices/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/invoices/' . $id);
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);// Silmek yerine IPTAL edin: muhasebe izi durur, fatura da odenecekler arasindan cikar.
Api::Invoices()->SetInvoiceStatus(['id' => $id, 'status' => 'cancelled']);Tuzaklar
Ödeme komisyonunun ve taksit vade farkının vergileri genel toplama girer ama vergi alanına girmez. Ara toplam ile vergiyi toplayıp genel toplama eşit çıkmasını beklerseniz aradaki farkı bulamazsınız. Toplamı yeniden üretmek için bu iki vergiyi kendi alanlarından ayrıca eklemeniz gerekir.
Listeleme ucu taslak ve sistem faturalarını gizler. Bu, panelin gördüğüyle aynıdır, ama listeden çıkan sayı veritabanındaki satır sayısıyla tutmaz. Muhasebe raporu yazarken bu fark hesaba katılmalıdır; süzgeç eklemek gizlenenleri geri getirmez.
Faturanın vergi durumu tek bir alanda üç değerden birini alır: normal, resmî ya da vergisiz. Bu yüzden vergiden muaf yapmak resmileştirmeyi ezer; ikisini birlikte göndermenin bir anlamı yoktur. Resmileştirme ilk kez uygulandığında müşteriye bildirim de gider.
Fatura silmek yalnız kaydı kaldırmaz: kalemleri, gelir ve gider kayıtlarını, hizmetlerle kurulan bağları ve bekleyen metrik kayıtlarını da çözer. Bir kanca silmeyi engelleyebilir, çünkü bazı faturaların gitmesi muhasebeyi bozar. Vazgeçmek istiyorsanız silmek yerine iptal edin; iz kalır, borç kalmaz.
Ödeme ve iade tarihleri gibi henüz gerçekleşmemiş alanlar boş gelir. Veritabanında bunlar yer tutucu tarihlerle durur; yanıt onları temizler. Yani bir tarihi okumadan önce varlığını sınayın, yoksa yer tutucu bir tarihi gerçek sanan bir ekran ortaya çıkar.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.