Netsis Tahsilat Takvimi SQL: TBLCAHAR ile Nakit Akışı
Netsis TBLCAHAR tablosu ile vade bazlı tahsilat takvimi ve nakit akışı SQL sorguları. Devir ve boş vade yönetimiyle hazır yaşlandırma kovaları.
Erp Asistanı
Editör ekibi
8 dk okuma
İçindekiler
Netsis ERP üzerinde finans yönetiminin en kritik raporlarından biri vade bazlı tahsilat takvimi ve nakit akışı projeksiyonudur. Şirket kasasına hangi hafta veya ayda ne kadar nakit girişi olacağını, tedarikçilere hangi tarihlerde ödeme yapılacağını doğru öngörmek işletme sermayesini doğrudan korur. Netsis'te bu verilerin ana kaynağı TBLCAHAR tablosudur. Ancak doğrudan bir vade listesi çekmeye çalıştığınızda vadesi girilmemiş boş kayıtlar ve yıl başı devir hareketleri rapor toplamlarını tamamen saptırabilir.
Bu rehberde, TBLCAHAR ve TBLCASABIT tablolarını kullanarak güvenilir bir tahsilat takvimi oluşturmayı, vade kovalama (bucketing) mantığını kurmayı ve rapor toplamını bozan istisnaları SQL seviyesinde nasıl yöneteceğinizi adım adım inceliyoruz. Netsis veri yapısının genel işleyişi hakkında ek bilgi için Netsis tablo yapısı rehberi içeriğimize göz atabilirsiniz.
Netsis Vade Mimarisinin Temeli: TBLCAHAR ve VADE_TARIHI
Netsis'te fatura, dekont, çek, senet ve devir gibi tüm cari işlemler TBLCAHAR tablosunda satır bazında tutulur. Her cari hareketin borç (BORC), alacak (ALACAK), evrak tarihi (TARIH) ve vade tarihi (VADE_TARIHI) bilgisi bu satırdadır. Vade analizi yaparken sadece VADE_TARIHI kolonunu sorguya almak yanıltıcı sonuçlar üretir; çünkü sisteme girilen her işlemde vade tarihi zorunlu tutulmamış olabilir.
| Kolon | Tip | Anlam ve Kullanım Amacı |
|---|---|---|
INC_KEY_NUMBER |
int | Hareket satırının tekil kimlik numarası (PK). |
CARI_KOD |
varchar(15) | Hareketin bağlı olduğu cari hesap kodu. |
TARIH |
datetime | İşlemin yapıldığı fiş veya fatura tarihi. |
VADE_TARIHI |
datetime | İşlemin vadesi (NULL gelebilir). |
BORC / ALACAK |
decimal | Yerel para birimi cinsinden hareket tutarları. |
HKA |
char(1) | Açık/Kapalı hareket durumu (A: Açık, K: Kapalı). |
HAREKET_TURU |
char(1) | Belge türü (A: Devir, B: Fatura, C: İade, G: Çek vb.). |
SUBE_KODU |
smallint | İşlemin ait olduğu şube kodu. |
1. Vadesi Boş Kayıtlar ve Devir Hareketleri Tuzağı
Vade bazlı nakit akışı raporlarında toplamların tutmamasının iki temel sebebi vardır:
- Vadesi Boş (NULL) Kayıtlar: Evrak girişi sırasında vade girilmediğinde
VADE_TARIHIalanıNULLkalır. Sorguda doğrudanVADE_TARIHIüzerinden gruplama yaparsanız bu tutarlar gruplama dışı kalır veya rapor dışına fırlar. Çözüm: Vade boşsa hareket tarihini (TARIH) veya cari karttaki (TBLCASABIT.VADE_GUNU) opsiyonunu hareket tarihine eklemektir. - Devir Hareketleri (
HAREKET_TURU = 'A'): Yıl başında aktarılan açılış bakiyeleri tek bir hareket olarak aktarılır ve çoğunlukla vadesizdir ya da 1 Ocak tarihini taşır. Bu kayıtlar filtrelenmez veya vadelendirilmezse nakit akışı raporunda devasa bir tutar "Vadesi Geçmiş" kovasına yığılır.
Aşağıdaki sorgu, boş vadeleri cari kartındaki standart vade günü ile tamamlayan ve devir hareketlerini güvenli bir şekilde hesaplanan vadeye dönüştüren temel yapıyı kurar:
SELECT
c.INC_KEY_NUMBER,
c.CARI_KOD,
cs.CARI_ISIM,
c.TARIH,
c.VADE_TARIHI AS [Ham Vade],
c.HAREKET_TURU,
CASE
WHEN c.VADE_TARIHI IS NOT NULL THEN c.VADE_TARIHI
WHEN c.HAREKET_TURU = 'A' AND ISNULL(cs.VADE_GUNU, 0) > 0 THEN DATEADD(day, cs.VADE_GUNU, c.TARIH)
WHEN ISNULL(cs.VADE_GUNU, 0) > 0 THEN DATEADD(day, cs.VADE_GUNU, c.TARIH)
ELSE c.TARIH
END AS [Efektif Vade],
c.BORC,
c.ALACAK
FROM TBLCAHAR c
JOIN TBLCASABIT cs ON c.CARI_KOD = cs.CARI_KOD
WHERE c.SUBE_KODU = 0
ORDER BY c.TARIH DESC, c.INC_KEY_NUMBER DESC;
2. Vade Kovalama (Bucketing) SQL Kalıbı
Nakit akışı ve tahsilat takviminde standart yaklaşım, alacakları vadesine kalan gün sayısına göre aralıklara (kovalara) bölmektir: Vadesi Geçmiş, 0-30 Gün, 31-60 Gün, 61-90 Gün ve 91+ Gün. Cari bakiyeleri üzerinden benzer hesaplamalar için Netsis cari ekstre ve bakiye SQL yazımızdaki yöntemleri de inceleyebilirsiniz.
Müşteriler (CARI_TIP IN ('A', 'T')) için net alacak tutarını (BORC - ALACAK) kovalara ayıran tekrar kullanılabilir SQL kalıbı:
WITH VadeDuzenli AS (
SELECT
c.CARI_KOD,
cs.CARI_ISIM,
c.BORC - c.ALACAK AS NetTutar,
CASE
WHEN c.VADE_TARIHI IS NOT NULL THEN c.VADE_TARIHI
WHEN ISNULL(cs.VADE_GUNU, 0) > 0 THEN DATEADD(day, cs.VADE_GUNU, c.TARIH)
ELSE c.TARIH
END AS EfektifVade
FROM TBLCAHAR c
JOIN TBLCASABIT cs ON c.CARI_KOD = cs.CARI_KOD
WHERE c.SUBE_KODU = 0
AND cs.CARI_TIP IN ('A', 'T')
)
SELECT
CARI_KOD,
CARI_ISIM,
SUM(NetTutar) AS [Toplam Alacak],
SUM(CASE WHEN EfektifVade < CAST(GETDATE() AS DATE) THEN NetTutar ELSE 0 END) AS [Vadesi Gecmis],
SUM(CASE WHEN DATEDIFF(day, CAST(GETDATE() AS DATE), EfektifVade) BETWEEN 0 AND 30 THEN NetTutar ELSE 0 END) AS [0-30 Gun],
SUM(CASE WHEN DATEDIFF(day, CAST(GETDATE() AS DATE), EfektifVade) BETWEEN 31 AND 60 THEN NetTutar ELSE 0 END) AS [31-60 Gun],
SUM(CASE WHEN DATEDIFF(day, CAST(GETDATE() AS DATE), EfektifVade) BETWEEN 61 AND 90 THEN NetTutar ELSE 0 END) AS [61-90 Gun],
SUM(CASE WHEN DATEDIFF(day, CAST(GETDATE() AS DATE), EfektifVade) > 90 THEN NetTutar ELSE 0 END) AS [91+ Gun]
FROM VadeDuzenli
GROUP BY CARI_KOD, CARI_ISIM
HAVING SUM(NetTutar) <> 0
ORDER BY [Toplam Alacak] DESC;
3. Tahsilat ve Ödeme Karşılaştırmalı Nakit Akışı Tablosu
Gerçek bir nakit akışı tablosu yalnızca müşterilerden gelecek tahsilatları değil, satıcılara (CARI_TIP = 'S') yapılacak ödemeleri de içermelidir. Gelecek haftalara göre gruplanmış tahsilat beklentisi ve tedarikçi ödeme yükümlülüğünü net nakit pozisyonu ile birlikte veren sorgu:
WITH NakitHareket AS (
SELECT
cs.CARI_TIP,
c.BORC,
c.ALACAK,
CASE
WHEN c.VADE_TARIHI IS NOT NULL THEN c.VADE_TARIHI
WHEN ISNULL(cs.VADE_GUNU, 0) > 0 THEN DATEADD(day, cs.VADE_GUNU, c.TARIH)
ELSE c.TARIH
END AS EfektifVade
FROM TBLCAHAR c
JOIN TBLCASABIT cs ON c.CARI_KOD = cs.CARI_KOD
WHERE c.SUBE_KODU = 0
)
SELECT
DATEPART(year, EfektifVade) AS [Yil],
DATEPART(iso_week, EfektifVade) AS [Hafta],
MIN(EfektifVade) AS [Hafta Baslangici],
SUM(CASE WHEN CARI_TIP IN ('A', 'T') THEN BORC - ALACAK ELSE 0 END) AS [Beklenen Tahsilat],
SUM(CASE WHEN CARI_TIP = 'S' THEN ALACAK - BORC ELSE 0 END) AS [Beklenen Odeme],
SUM(CASE WHEN CARI_TIP IN ('A', 'T') THEN BORC - ALACAK ELSE 0 END) -
SUM(CASE WHEN CARI_TIP = 'S' THEN ALACAK - BORC ELSE 0 END) AS [Net Nakit Dengesi]
FROM NakitHareket
WHERE EfektifVade >= CAST(GETDATE() AS DATE)
GROUP BY DATEPART(year, EfektifVade), DATEPART(iso_week, EfektifVade)
ORDER BY [Yil], [Hafta];
Müşterilerinizin ödeme disiplinini ölçmek ve tahsilat takviminin güvenilirliğini analiz etmek istiyorsanız Netsis ortalama tahsilat süresi (DSO) rehberimizdeki formülleri kullanabilirsiniz.
4. Açık Evrak Bazlı Tahsilat Detay Listesi
Netsis'te açık hesap takibi yapılıyorsa (HKA = 'A'), henüz kapanmamış faturaları ve vadesine kalan günleri listeleyerek operasyonel bir tahsilat listesi oluşturabilirsiniz:
SELECT
c.CARI_KOD,
cs.CARI_ISIM,
c.BELGE_NO,
c.TARIH AS [Evrak Tarihi],
ISNULL(c.VADE_TARIHI, c.TARIH) AS [Vade Tarihi],
DATEDIFF(day, CAST(GETDATE() AS DATE), ISNULL(c.VADE_TARIHI, c.TARIH)) AS [Kalan Gun],
c.HAREKET_TURU,
c.BORC AS [Tutar],
c.ACIKLAMA
FROM TBLCAHAR c
JOIN TBLCASABIT cs ON c.CARI_KOD = cs.CARI_KOD
WHERE c.SUBE_KODU = 0
AND cs.CARI_TIP IN ('A', 'T')
AND c.BORC > 0
AND c.HKA = 'A'
ORDER BY ISNULL(c.VADE_TARIHI, c.TARIH) ASC;
Sık yapılan hatalar
- VADE_TARIHI alanını ISNULL kontrolü olmadan kullanmak: Vadesi boş kayıtlarda
DATEDIFFfonksiyonuNULLdöner ve ilgili fatura tutarı hiçbir kovaya dahil edilmeyerek genel toplamı bozar. - Devir kayıtlarını (
HAREKET_TURU = 'A') hesaba katmamak: Yıl başı açılış kayıtları vade tarihi taşımıyorsa tüm açılış bakiyesi tek kalemde vadesi geçmiş görünür. - Şube kodunu filtrelememek: Çok şubeli Netsis yapılarında
SUBE_KODUfiltresi konulmadığında mükerrer ya da çapraz şube kayıtları nakit akışını yanıltır. - Açık/Kapalı hareket durumunu (
HKA) yanlış yorumlamak:HKAbir borç/alacak kodu değil, hareketin açık (A) veya kapalı (K) olduğunu belirten durum kodudur. - Alacak bakiyeli müşterileri göz ardı etmek: Müşteri avans veya fazla ödeme yapmışsa (
ALACAKtutarı), net tahsilat projeksiyonunda borçtan düşülmelidir; aksi halde gelecekteki nakit girişi olduğundan fazla görünür.
Sık sorulanlar
Netsis'te çek ve senetlerin vadesi tahsilat takviminde nasıl görünür?
TBLCAHAR tablosunda HAREKET_TURU 'G' (Müşteri Çeki) veya 'E' (Müşteri Senedi) olan kayıtların VADE_TARIHI portföydeki çek/senedin vade tarihidir. Bu kayıtlar da aynı vade kovaları mantığıyla takvime dahil edilir.
Dövizli işlemler yerel para birimiyle nasıl ayrıştırılır?
DOVIZ_TURU alanı 0 olanlar yerel para birimidir. Dövizli işlemler için DOVIZ_TUTAR ve DOVIZ_TURU kolonları dikkate alınmalı, TL nakit akışı için her zaman BORC ve ALACAK kolonları toplanmalıdır.
Açık hesap kapatma yapılmayan sistemlerde evrak bazlı vade analizi doğru sonuç verir mi?
Eğer muhasebe ekibi açık hesap eşleme (HKA) yapmıyorsa evrak bazlı sorgular yerine 2. bölümdeki yürüyen cari bakiye üzerinden kovalama yöntemi tercih edilmelidir.
Netsis veritabanınızdan anlık tahsilat takvimi, geciken alacaklar ve nakit akışı projeksiyonlarını karmaşık SQL kodları yazmadan almak için Erp Asistanı'nı hemen deneyin.
Netsis'te SQL ve raporu konuşarak alın
Türkçe sorunuzu yazın, şemanıza uygun çalışan SQL'i ya da hazır uygulamanızı saniyeler içinde alın. Kredi kartı gerekmez.