{
  "sema_surumu": 1,
  "tur": "is_sorusu",
  "kimlik": {
    "tur": "is_sorusu",
    "sema": 1,
    "kurum": "12e7b9f9-44d0-4cac-8058-abb5746039c2",
    "grup": "ticari_performans",
    "is_sorusu": "ticari_performans__aging_dso",
    "hesap_surumu": 3,
    "tanim_izi": "2e13aae3add9",
    "uretim": "2026-11-01T01:40:50"
  },
  "ad": "Alacak Tahsil Süresi (DSO)",
  "aciklama": "Müşteri bazında açık alacak, vadesi geçmiş oranı ve tahsil süresi: DSO = açık alacak ÷ son N gün net satış × N (N varsayılan 90, kurum değeriyle değişir). Tahsilat faturayla eşleşmiyorsa yaşlandırma 'ilk giren ilk çıkar' varsayımıyla yapılır (Yöntem kaydı).",
  "tanim_karti": {
    "id": "ticari_performans__aging_dso",
    "ad": "Alacak Tahsil Süresi (DSO)",
    "amac": "Müşteri bazında açık alacak, vadesi geçmiş oranı ve tahsil süresi: DSO = açık alacak ÷ son N gün net satış × N (N varsayılan 90, kurum değeriyle değişir). Tahsilat faturayla eşleşmiyorsa yaşlandırma 'ilk giren ilk çıkar' varsayımıyla yapılır (Yöntem kaydı).",
    "grup": "Müşteri",
    "ciktilar": [
      {
        "anahtar": "acik",
        "ad": "Açık alacak",
        "birim": "₺",
        "kaynak": "Müşteriye göre açık alacak tutarı"
      },
      {
        "anahtar": "gecmis",
        "ad": "Vadesi geçmiş",
        "birim": "₺",
        "kaynak": "Müşteriye göre vadesi geçmiş alacak tutarı"
      },
      {
        "anahtar": "gecmis_orani",
        "ad": "Vadesi geçmiş oranı",
        "birim": "%",
        "formul": "Vadesi geçmiş ÷ Açık alacak × 100"
      },
      {
        "anahtar": "satis90",
        "ad": "Dönem satışı",
        "birim": "₺",
        "kaynak": "Müşteriye göre net satış"
      },
      {
        "anahtar": "dso",
        "ad": "Tahsil süresi (DSO)",
        "birim": "gün",
        "formul": "Dönem satışı < Asgari dönem satışı (₺) (varsayılan 0) ise boş, değilse Açık alacak ÷ Dönem satışı × DSO satış dönemi (gün) (varsayılan 90)"
      },
      {
        "anahtar": "az_satis",
        "ad": "Asgari satış altında",
        "birim": "evet/hayır",
        "formul": "Dönem satışı < Asgari dönem satışı (₺) (varsayılan 0)"
      }
    ],
    "kaynaklar": [
      {
        "adim": "acik",
        "veri_sorusu": "Müşteriye göre açık alacak tutarı",
        "is_birimi": "Alacak ve Tahsilat › Açık Alacaklar"
      },
      {
        "adim": "gecmis",
        "veri_sorusu": "Müşteriye göre vadesi geçmiş alacak tutarı",
        "is_birimi": "Alacak ve Tahsilat › Açık Alacaklar"
      },
      {
        "adim": "satis90",
        "veri_sorusu": "Müşteriye göre net satış",
        "is_birimi": "Satış › Faturalar"
      }
    ],
    "donem": {
      "tanim": "Son 90 gün: Fatura Tarihi alanına göre, bitiş verinin son tarihi (gün sayısı kurum değeriyle değişir)",
      "referans": "verinin son tarihi (en geç bugün)"
    },
    "filtreler": [],
    "eksik_deger": [
      "Paydası 0 ya da boş olan değer boş kalır (0 sayılmaz).",
      "Bir adımda hiç kaydı olmayan grup o adım için 0 sayılır."
    ],
    "siralama": {
      "sutun": "Tahsil süresi (DSO)",
      "yon": "büyükten küçüğe",
      "gerekce": "En uzun tahsil süresi önce."
    },
    "kurallar": [
      {
        "ad": "asgari_satis",
        "varsayilan": 0
      },
      {
        "ad": "pencere_gun",
        "varsayilan": 90
      }
    ],
    "sinirlamalar": [
      "DSO oran temelli bir göstergedir: açık alacak anlık değer, satış son N günlük akış (varsayılan 90 gün, kurum değeriyle değişir). İkisi aynı referans tarihe (verinin son tarihi) bağlıdır.",
      "Dönemde (son N gün) satışı olmayan müşteride DSO hesaplanamaz.",
      "Dönem satışı asgari eşiğin altındaki müşteride DSO hesaplanmaz (küçük satışta oran şişer), satır listenin sonunda 'Asgari satış altında' işaretlidir. Eşik varsayılanı 0'dır, kurum Kural kaydıyla değiştirir.",
      "Tahsilat faturayla eşleşmiyorsa yaşlandırma 'ilk giren ilk çıkar' varsayımıyla yapılır."
    ],
    "kurum_degerleri": [
      {
        "ad": "asgari_satis",
        "etiket": "Asgari dönem satışı",
        "varsayilan": "0 ₺",
        "aciklama": "Bu tutarın altında satışı olan müşteride DSO hesaplanmaz"
      },
      {
        "ad": "pencere_gun",
        "etiket": "DSO satış dönemi",
        "varsayilan": "90 gün",
        "aciklama": "Tahsil süresi bu kadar günün satışına göre hesaplanır (verinin son tarihinden geriye)"
      }
    ],
    "bicim": "tablo",
    "yontem_yapi": {
      "eslesme": "Müşteri",
      "terimler": [
        {
          "harf": "A",
          "ad": "Müşteriye göre açık alacak tutarı",
          "adim": "acik"
        },
        {
          "harf": "B",
          "ad": "Müşteriye göre vadesi geçmiş alacak tutarı",
          "adim": "gecmis"
        },
        {
          "harf": "C",
          "ad": "Müşteriye göre net satış",
          "adim": "satis90"
        }
      ],
      "satirlar": [
        {
          "ad": "Açık alacak",
          "formul": "A",
          "kosul": null
        },
        {
          "ad": "Vadesi geçmiş",
          "formul": "B",
          "kosul": null
        },
        {
          "ad": "Vadesi geçmiş oranı",
          "formul": "B ÷ A × 100",
          "kosul": null
        },
        {
          "ad": "Dönem satışı",
          "formul": "C",
          "kosul": null
        },
        {
          "ad": "Tahsil süresi (DSO)",
          "formul": "A ÷ C × DSO satış dönemi (gün) (varsayılan 90)",
          "kosul": "C < Asgari dönem satışı (₺) (varsayılan 0) ise boş"
        },
        {
          "ad": "Asgari satış altında",
          "formul": "C < Asgari dönem satışı (₺) (varsayılan 0)",
          "kosul": null
        }
      ]
    },
    "yontem": "Formülle hesap",
    "surum": 3,
    "surum_tarihi": "2026-10-29",
    "metin_guncellendi": "2026-10-29"
  },
  "is_birimleri": [
    {
      "ad": "Alacak ve Tahsilat › Açık Alacaklar",
      "veri_baglantisi": "mapped"
    },
    {
      "ad": "Satış › Faturalar",
      "veri_baglantisi": "mapped"
    }
  ],
  "parametreler": [],
  "secimler": {},
  "adimlar": [
    {
      "anahtar": "acik",
      "baslik": "Müşteriye göre açık alacak tutarı",
      "tur": "veri_sorusu",
      "is_birimi": "Alacak ve Tahsilat › Açık Alacaklar",
      "metin": "Müşteri Kodu bazında toplam Kalan Tutar",
      "veri_sorusu": {
        "tur": "veri_sorusu",
        "sema": 1,
        "kurum": "12e7b9f9-44d0-4cac-8058-abb5746039c2",
        "is_birimi": "db49f062-bdf0-4a6e-b97f-362c22d7622f",
        "soru": "sector_ar01_v1__q12",
        "tanim_izi": "da51219255ce",
        "adim": "acik"
      },
      "sistemin_uyguladigi": [],
      "sql": {
        "lehce": "postgresql",
        "sorgu": "SELECT MIN(alacak_ve_tahsilat_acik_alacaklar.customerId) AS customerId,\n       SUM(alacak_ve_tahsilat_acik_alacaklar.remainingAmount) AS toplam_remainingamount\nFROM \"Alacak ve Tahsilat · Açık Alacaklar (şablon)\" alacak_ve_tahsilat_acik_alacaklar\nGROUP BY REGEXP_REPLACE(TRIM(alacak_ve_tahsilat_acik_alacaklar.customerId), ' +', ' ', 'g')\nORDER BY toplam_remainingamount DESC",
        "veri_alma": null,
        "adimlar": [],
        "nasil_yazilir": [],
        "desteklenmeyen": [],
        "notlar": [
          "Müşteri Kodu sistemle aynı biçimde boşluk farkları yok sayılarak gruplanır",
          "'Alacak ve Tahsilat · Açık Alacaklar (şablon)' kaynağının tablo adı bilinmiyor (kaynak şablonu); sorgudaki adı kendi tablonuzla değiştirin",
          "Sistemin sonuç tablosunda her grubun kayıt sayısı da gösterilir (ek bilgi); bu sorguya eklemek için SELECT'e COUNT(*) AS kayit_sayisi yazın",
          "Sorgudaki bazı alanlara henüz kurum adı verilmedi; bunlar iş birimi alan adlarıyla yazıldı (Veri Alanları'ndan kendi kolon adlarınızı verebilirsiniz)"
        ]
      }
    },
    {
      "anahtar": "gecmis",
      "baslik": "Müşteriye göre vadesi geçmiş alacak tutarı",
      "tur": "veri_sorusu",
      "is_birimi": "Alacak ve Tahsilat › Açık Alacaklar",
      "metin": "Müşteri Kodu bazında toplam Vadesi Geçmiş Alacak",
      "veri_sorusu": {
        "tur": "veri_sorusu",
        "sema": 1,
        "kurum": "12e7b9f9-44d0-4cac-8058-abb5746039c2",
        "is_birimi": "db49f062-bdf0-4a6e-b97f-362c22d7622f",
        "soru": "sector_ar01_v1__q13",
        "tanim_izi": "5ec3a8703e07",
        "adim": "gecmis"
      },
      "sistemin_uyguladigi": [],
      "sql": {
        "lehce": "postgresql",
        "sorgu": "SELECT MIN(alacak_ve_tahsilat_acik_alacaklar.customerId) AS customerId,\n       SUM(CASE WHEN (CAST(LEAST((SELECT MAX(a.invoiceDate) FROM \"Alacak ve Tahsilat · Açık Alacaklar (şablon)\" a), CURRENT_DATE) AS DATE) - CAST(alacak_ve_tahsilat_acik_alacaklar.dueDate AS DATE)) > 0 THEN alacak_ve_tahsilat_acik_alacaklar.remainingAmount ELSE 0 END) AS toplam_overdueamount\nFROM \"Alacak ve Tahsilat · Açık Alacaklar (şablon)\" alacak_ve_tahsilat_acik_alacaklar\nGROUP BY REGEXP_REPLACE(TRIM(alacak_ve_tahsilat_acik_alacaklar.customerId), ' +', ' ', 'g')\nORDER BY toplam_overdueamount DESC",
        "veri_alma": null,
        "adimlar": [],
        "nasil_yazilir": [],
        "desteklenmeyen": [],
        "notlar": [
          "Müşteri Kodu sistemle aynı biçimde boşluk farkları yok sayılarak gruplanır",
          "'Gecikme (gün)' hesabında bitiş, verideki son tarihtir (Fatura Tarihi; bugünü geçmez) — sistemin hesabıyla aynı; güncel veride bu bugündür",
          "'Alacak ve Tahsilat · Açık Alacaklar (şablon)' kaynağının tablo adı bilinmiyor (kaynak şablonu); sorgudaki adı kendi tablonuzla değiştirin",
          "Sistemin sonuç tablosunda her grubun kayıt sayısı da gösterilir (ek bilgi); bu sorguya eklemek için SELECT'e COUNT(*) AS kayit_sayisi yazın",
          "Sorgudaki bazı alanlara henüz kurum adı verilmedi; bunlar iş birimi alan adlarıyla yazıldı (Veri Alanları'ndan kendi kolon adlarınızı verebilirsiniz)"
        ]
      }
    },
    {
      "anahtar": "satis90",
      "baslik": "Müşteriye göre net satış",
      "tur": "veri_sorusu",
      "is_birimi": "Satış › Faturalar",
      "metin": "Müşteri Kodu bazında toplam Net Tutar",
      "veri_sorusu": {
        "tur": "veri_sorusu",
        "sema": 1,
        "kurum": "12e7b9f9-44d0-4cac-8058-abb5746039c2",
        "is_birimi": "98d35c27-ab03-42e8-8aa9-555948fb846b",
        "soru": "sector_sales01_v1__net_by_customer",
        "tanim_izi": "f0a06d506c54",
        "adim": "satis90"
      },
      "sistemin_uyguladigi": [
        "dönem: Fatura Tarihi son 90 gün içinde (bitiş verinin son tarihi, en geç bugün. Gün sayısı kurum değeriyle değişir)"
      ],
      "sql": {
        "lehce": "postgresql",
        "sorgu": "SELECT MIN(satis_faturalar.customerId) AS customerId,\n       SUM(satis_faturalar.netAmount) AS toplam_netamount\nFROM \"Satış · Faturalar (şablon)\" satis_faturalar\nGROUP BY REGEXP_REPLACE(TRIM(satis_faturalar.customerId), ' +', ' ', 'g')\nORDER BY toplam_netamount DESC",
        "veri_alma": null,
        "adimlar": [],
        "nasil_yazilir": [],
        "desteklenmeyen": [],
        "notlar": [
          "Müşteri Kodu sistemle aynı biçimde boşluk farkları yok sayılarak gruplanır",
          "'Satış · Faturalar (şablon)' kaynağının tablo adı bilinmiyor (kaynak şablonu); sorgudaki adı kendi tablonuzla değiştirin",
          "Sistemin sonuç tablosunda her grubun kayıt sayısı da gösterilir (ek bilgi); bu sorguya eklemek için SELECT'e COUNT(*) AS kayit_sayisi yazın",
          "Sorgudaki bazı alanlara henüz kurum adı verilmedi; bunlar iş birimi alan adlarıyla yazıldı (Veri Alanları'ndan kendi kolon adlarınızı verebilirsiniz)"
        ]
      }
    }
  ],
  "birlestirme": "Sonuçlar Müşteri Kodu üzerinden eşleştirilir; her Müşteri Kodu için Tahsil süresi (DSO) = “Müşteriye göre net satış” < Asgari dönem satışı (₺) ise boş, değilse “Müşteriye göre açık alacak tutarı” ÷ “Müşteriye göre net satış” × DSO satış dönemi (gün); Vadesi geçmiş oranı = “Müşteriye göre vadesi geçmiş alacak tutarı” ÷ “Müşteriye göre açık alacak tutarı” × 100; Asgari satış altında = “Müşteriye göre net satış” < Asgari dönem satışı (₺); Açık alacak: “Müşteriye göre açık alacak tutarı”; Vadesi geçmiş: “Müşteriye göre vadesi geçmiş alacak tutarı”; Dönem satışı: “Müşteriye göre net satış” hesaplanır.",
  "tek_sorgu": {
    "sorgu": "-- Dönem: son 90 gün (verinin son tarihi, en geç bugün, geriye 90 gün; sistemle aynı kural). Başka bir süre için donem bölümündeki gün sayısını değiştirin.\nWITH donem AS (SELECT CAST((CASE WHEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) IS NULL THEN CURRENT_DATE WHEN CURRENT_DATE IS NULL THEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) WHEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) <= CURRENT_DATE THEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) ELSE CURRENT_DATE END) + INTERVAL '-90 days' AS DATE) AS gun_bas,\n         (CASE WHEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) IS NULL THEN CURRENT_DATE WHEN CURRENT_DATE IS NULL THEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) WHEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) <= CURRENT_DATE THEN (SELECT CAST(MAX(satis_faturalar.invoiceDate) AS DATE) FROM \"Satış · Faturalar (şablon)\" satis_faturalar) ELSE CURRENT_DATE END) AS gun_bit)\n, s_acik AS (SELECT c1 AS k, c2 AS v FROM (\n    SELECT MIN(alacak_ve_tahsilat_acik_alacaklar.customerId) AS customerId,\n           SUM(alacak_ve_tahsilat_acik_alacaklar.remainingAmount) AS toplam_remainingamount\n    FROM \"Alacak ve Tahsilat · Açık Alacaklar (şablon)\" alacak_ve_tahsilat_acik_alacaklar\n    GROUP BY REGEXP_REPLACE(TRIM(alacak_ve_tahsilat_acik_alacaklar.customerId), ' +', ' ', 'g')\n  ) AS t (c1, c2)\n  WHERE NULLIF(TRIM(CAST(c1 AS TEXT)), '') IS NOT NULL)\n, s_gecmis AS (SELECT c1 AS k, c2 AS v FROM (\n    SELECT MIN(alacak_ve_tahsilat_acik_alacaklar.customerId) AS customerId,\n           SUM(CASE WHEN (CAST(LEAST((SELECT MAX(a.invoiceDate) FROM \"Alacak ve Tahsilat · Açık Alacaklar (şablon)\" a), CURRENT_DATE) AS DATE) - CAST(alacak_ve_tahsilat_acik_alacaklar.dueDate AS DATE)) > 0 THEN alacak_ve_tahsilat_acik_alacaklar.remainingAmount ELSE 0 END) AS toplam_overdueamount\n    FROM \"Alacak ve Tahsilat · Açık Alacaklar (şablon)\" alacak_ve_tahsilat_acik_alacaklar\n    GROUP BY REGEXP_REPLACE(TRIM(alacak_ve_tahsilat_acik_alacaklar.customerId), ' +', ' ', 'g')\n  ) AS t (c1, c2)\n  WHERE NULLIF(TRIM(CAST(c1 AS TEXT)), '') IS NOT NULL)\n, s_satis90 AS (SELECT c1 AS k, c2 AS v FROM (\n    SELECT MIN(satis_faturalar.customerId) AS customerId,\n           SUM(satis_faturalar.netAmount) AS toplam_netamount\n    FROM \"Satış · Faturalar (şablon)\" satis_faturalar\n    WHERE CAST(satis_faturalar.invoiceDate AS DATE) >= (SELECT gun_bas FROM donem) AND CAST(satis_faturalar.invoiceDate AS DATE) <= (SELECT gun_bit FROM donem)\n    GROUP BY REGEXP_REPLACE(TRIM(satis_faturalar.customerId), ' +', ' ', 'g')\n  ) AS t (c1, c2)\n  WHERE NULLIF(TRIM(CAST(c1 AS TEXT)), '') IS NOT NULL)\n, anahtar AS (SELECT k FROM s_acik UNION SELECT k FROM s_gecmis UNION SELECT k FROM s_satis90)\n, birlesik AS (SELECT a.k AS anahtar,\n         COALESCE(s_acik.v, 0) AS t_acik,\n         COALESCE(s_gecmis.v, 0) AS t_gecmis,\n         COALESCE(s_satis90.v, 0) AS t_satis90\n  FROM anahtar a\n  LEFT JOIN s_acik ON s_acik.k = a.k\n  LEFT JOIN s_gecmis ON s_gecmis.k = a.k\n  LEFT JOIN s_satis90 ON s_satis90.k = a.k)\n, h1 AS (SELECT birlesik.*, (CASE WHEN t_satis90 IS NULL THEN NULL WHEN t_satis90 < 0 THEN NULL ELSE ((t_acik * 1.0 / NULLIF(t_satis90, 0)) * 90) END) AS o_dso FROM birlesik)\n, h2 AS (SELECT h1.*, ((t_gecmis * 1.0 / NULLIF(t_acik, 0)) * 100) AS o_gecmis_orani FROM h1)\n, h3 AS (SELECT h2.*, (CASE WHEN t_satis90 IS NULL THEN NULL WHEN t_satis90 < 0 THEN 1 ELSE 0 END) AS o_az_satis FROM h2)\nSELECT anahtar AS \"Müşteri\",\n       t_acik AS \"Açık alacak\",\n       t_gecmis AS \"Vadesi geçmiş\",\n       t_satis90 AS \"Dönem satışı\",\n       o_dso AS \"Tahsil süresi (DSO)\",\n       o_gecmis_orani AS \"Vadesi geçmiş oranı\",\n       o_az_satis AS \"Asgari satış altında\"\nFROM h3\nORDER BY CASE WHEN o_dso IS NULL THEN 1 ELSE 0 END, o_dso DESC, anahtar DESC;",
    "neden": null
  },
  "uretim": {
    "zaman": "2026-11-01T01:40:50",
    "kurum": "Telkraft Demo",
    "uretici": "is_analisti"
  }
}