Erp Asistanı Erp Asistanı
Netsis SQL

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ı Erp Asistanı Editör ekibi 8 dk okuma
Netsis Tahsilat Takvimi SQL: TBLCAHAR ile Nakit Akışı

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:

  1. Vadesi Boş (NULL) Kayıtlar: Evrak girişi sırasında vade girilmediğinde VADE_TARIHI alanı NULL kalır. Sorguda doğrudan VADE_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.
  2. 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 DATEDIFF fonksiyonu NULL dö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_KODU filtresi konulmadığında mükerrer ya da çapraz şube kayıtları nakit akışını yanıltır.
  • Açık/Kapalı hareket durumunu (HKA) yanlış yorumlamak: HKA bir 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 (ALACAK tutarı), 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.

Ücretsiz üye olun, istediğiniz sorguyu doğal dille alın →

Bu yazıyı paylaş
Konuşarak raporlayın

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.