{
  "ad": "IsGunu — İş Günü Hesaplama",
  "surum": "1.2.0",
  "slug": "is-gunu",
  "kategori": "tarih-zaman",
  "dil": "tr",
  "motor": "is-gunu-motor.mjs",
  "fonksiyon": "hesapla(girdi, tatilVerisi)",
  "girdiler": {
    "mod": {
      "tip": "string",
      "birim": "kip",
      "degerler": [
        "aralik",
        "ekle"
      ],
      "varsayilan": "bitis varsa aralik, n varsa ekle"
    },
    "baslangic": {
      "tip": "string",
      "format": "YYYY-MM-DD",
      "birim": "tarih",
      "zorunlu": true
    },
    "bitis": {
      "tip": "string",
      "format": "YYYY-MM-DD",
      "birim": "tarih",
      "zorunlu": "mod=aralik"
    },
    "n": {
      "tip": "number/integer",
      "birim": "iş günü",
      "zorunlu": "mod=ekle",
      "negatifOlabilir": true,
      "kural": "ESM yalnız typeof n === \"number\" && Number.isSafeInteger(n) kabul eder; query yalnız boş olmayan /^[+-]?\\d+$/ metnini güvenli tam sayıya çevirir."
    },
    "haftaSonu": {
      "tip": "string",
      "birim": "takvim kuralı",
      "degerler": [
        "cumartesi-pazar",
        "yalniz-pazar",
        "yok"
      ],
      "varsayilan": "cumartesi-pazar"
    },
    "sinirDahil": {
      "tip": "string",
      "birim": "aralık sınırı",
      "degerler": [
        "basDahil-bitDahil",
        "basHaric-bitDahil"
      ],
      "varsayilan": "basDahil-bitDahil"
    },
    "tatilleriDus": {
      "tip": "boolean",
      "birim": "evet/hayır",
      "varsayilan": true,
      "kural": "Alan mevcutsa typeof === \"boolean\" zorunlu; yanlış tip (\"true\", 0, 1, null) GECERSIZ_BOOLEAN ile kapanır, sessizce başka sonuca çevrilmez."
    },
    "idariIzinDahil": {
      "tip": "boolean",
      "birim": "evet/hayır",
      "varsayilan": false,
      "kural": "Alan mevcutsa typeof === \"boolean\" zorunlu; yanlış tip GECERSIZ_BOOLEAN ile kapanır."
    },
    "yarimGunPolitikasi": {
      "tip": "string",
      "birim": "iş günü ağırlığı",
      "degerler": [
        "tam-is-gunu",
        "yarim",
        "tam-tatil"
      ],
      "varsayilan": "tam-is-gunu"
    },
    "hukukiSureModu": {
      "tip": "boolean",
      "birim": "evet/hayır",
      "varsayilan": false,
      "kural": "Alan mevcutsa typeof === \"boolean\" zorunlu; yanlış tip GECERSIZ_BOOLEAN ile kapanır."
    },
    "islemKanali": {
      "tip": "string|null",
      "birim": "hukuki işlem kanalı",
      "degerler": [
        "fiziksel",
        "elektronik",
        null
      ],
      "varsayilan": null,
      "kural": "Kanal belirtilmezse tek bir hukuki son saat yayımlanmaz; fiziksel ve elektronik son ayrı alanlarda gösterilir."
    }
  },
  "derinLinkParametreleri": {
    "mod": "mod",
    "bas": "baslangic",
    "bit": "bitis",
    "n": "n",
    "haftaSonu": "haftaSonu",
    "sinirDahil": "sinirDahil",
    "tatilleriDus": "tatilleriDus",
    "idariIzinDahil": "idariIzinDahil",
    "yarimGunPolitikasi": "yarimGunPolitikasi",
    "hukukiSureModu": "hukukiSureModu",
    "islemKanali": "islemKanali"
  },
  "ciktiSemasi": {
    "ortak": {
      "mod": "aralik|ekle",
      "takvimGunu": "number",
      "haftaSonuSayisi": "number",
      "tatilSayisi": "number; hafta sonuyla çakışmayan iş-günü kaybı",
      "dusenTatiller": [
        {
          "tarih": "YYYY-MM-DD",
          "ad": "string",
          "tur": "ulusal|dini|idari|kanuni(türetilmiş çıktı)",
          "yarimGun": "boolean",
          "haftaSonunaDenkGeldi": "boolean",
          "kaynak": "URL",
          "dogrulandi": "boolean",
          "etki": "0|0.5|1; aynı tarihte önceki satırlara göre marjinal etki",
          "gunToplamEtkisi": "0|0.5|1; tarihin birleştirilmiş toplam etkisi",
          "turetilmis": "boolean; yalnız motorun ürettiği kanuni satırda true",
          "kaynakTarih": "YYYY-MM-DD|null; türetimi doğuran Cuma"
        }
      ],
      "uyarilar": [
        "string"
      ],
      "konvansiyonlar": [
        "string"
      ],
      "sonucKesin": "boolean",
      "kesinlikDurumu": "kesin|kesin-degil|kaynak-dogrulanmadi",
      "tamlikDurumu": "kanuni-dini-kapsam-ici|idari-izin-kapsam-ici-dogrulanmis|...-kapsami-disi",
      "kanuniDiniTatilKapsami": "object",
      "idariIzinKapsami": "object|null",
      "idariIzinDogrulamaTarihi": "YYYY-MM-DD|null"
    },
    "aralik": {
      "isGunu": "number; ters aralıkta negatif",
      "baslangic": "YYYY-MM-DD",
      "bitis": "YYYY-MM-DD"
    },
    "ekle": {
      "hedefTarih": "YYYY-MM-DD",
      "haftaninGunu": "string",
      "n": "integer"
    },
    "hukukiSureModuEkleri": {
      "takvimGunuSonu": "YYYY-MM-DD",
      "hukukiSonGun": "YYYY-MM-DD",
      "islemKanali": "fiziksel|elektronik|null",
      "hukukiSonSaat": "HH:MM|null; yalnız seçilen fiziksel kanalın yarım tatil saatinde ör. 13:00",
      "hukukiSonAn": "13:00|calisma-saati-sonu|gun-sonu|islem-kanalina-bagli",
      "hukukiSaatDilimi": "Europe/Istanbul",
      "hukukiSaatSemantigi": "tatil-baslangici|calisma-saati-sonu|hmk-445-4-gun-sonu|islem-kanalina-bagli",
      "fizikselSonSaat": "HH:MM|null",
      "fizikselSonAn": "HH:MM|calisma-saati-sonu",
      "elektronikSonSaat": "gun-sonu",
      "elektronikSonAn": "gun-sonu",
      "hukukiSureAciklamasi": "string"
    },
    "hata": {
      "hata": {
        "kod": "GECERSIZ_TARIH|GECERSIZ_N|GECERSIZ_BOOLEAN|ARALIK_COK_BUYUK|PARAMETRE_EKSIK|HAFTA_SONU_TANIMSIZ|ISLEM_KANALI_TANIMSIZ|TATIL_VERISI_GECERSIZ|VERI_KAPSAMI_DISI|IDARI_IZIN_KAPSAMI_DISI|DESTEKLENEN_TARIH_DISI",
        "mesaj": "string"
      },
      "sonucKesin": "false",
      "hesapAlanlari": "yok; hata sonucunda isGunu/hedefTarih/hukukiSonGun yayımlanmaz"
    }
  },
  "ornekCagri": {
    "fonksiyon": "hesapla",
    "girdi": {
      "mod": "ekle",
      "baslangic": "2026-04-22",
      "n": 3,
      "haftaSonu": "cumartesi-pazar",
      "tatilleriDus": true,
      "idariIzinDahil": false,
      "yarimGunPolitikasi": "tam-is-gunu",
      "hukukiSureModu": false
    },
    "tatilVerisi": "veri/tatiller.json",
    "beklenen": {
      "hedefTarih": "2026-04-28",
      "haftaninGunu": "Salı"
    }
  },
  "formul": [
    "K2: Bir gün, seçilen hafta sonu tanımına göre hafta sonu değilse ve etkin tam-gün tatil değilse iş günüdür. Yarım günün ağırlığı yarimGunPolitikasi ile belirlenir.",
    "K3: Hafta sonuna rastlayan tatil listede görünür fakat tatilSayisi ve isGunu değerinden ikinci kez düşülmez. Aynı tarihteki zaman aralıkları birleştirilir; satır etki değerleri marjinaldir ve gunToplamEtkisi ile birlikte okunur.",
    "K4: 2429 md.2 uyarınca tam genel tatil bloğu Cuma akşamı biterse izleyen Cumartesi tam tatildir; motor bu satırı kaynaklı türetir.",
    "K5: Aralık modu seçilen sınırlarda günleri sayar. bitis < baslangic ise isGunu negatif, tanısal sayılar pozitif döner.",
    "K6: Gün eklemede başlangıç sayılmaz; n yönünde ilerlenir ve iş-günü ağırlıkları n değerine ulaşınca durulur.",
    "K7: Hukuki süre karşılaştırması işyeri seçeneklerinden bağımsız sabit takvim kullanır. Yarım tatilde fiziksel işlem tatil başlangıcında, HMK 445/4 kapsamındaki elektronik işlem gün sonunda biter; kanal bilinmiyorsa tek saat yayımlanmaz.",
    "K8: tatilleriDus=true veya hukukiSureModu=true iken kanuni/dinî tatil kapsamı aşılırsa VERI_KAPSAMI_DISI; idariIzinDahil=true iken idari tarama kapsamı ya da doğrulama tarihi aşılırsa IDARI_IZIN_KAPSAMI_DISI ve sonucKesin=false döner."
  ],
  "veriKunyesi": {
    "yol": "veri/tatiller.json",
    "kapsananYillar": [
      2020,
      2032
    ],
    "guncelleme": "2026-07-29",
    "surum": "2026.07.29-1",
    "toplamSatir": 235,
    "turetilmisCumaCumartesiSatiri": 20,
    "etkinToplamSatir": 255,
    "dogrulanmamisSatirSayisi": 0,
    "oranSemantigi": "235/235 yalnız mevcut kaynak satırlarının kaynak/doğrulama oranıdır; tarihsel tamlık veya gelecek kesinliği iddiası değildir.",
    "kanuniDiniTatilKapsami": {
      "ilkYil": 2020,
      "sonYil": 2032,
      "durum": "kapsam-ici-tam"
    },
    "idariIzinKapsami": {
      "ilkYil": 2021,
      "sonYil": 2026,
      "tarananYillar": [
        2021,
        2022,
        2023,
        2024,
        2025,
        2026
      ],
      "durum": "resmi-kaynak-taramasi",
      "kaynakNitelikleri": "2021–2025 birincil resmî açıklamalarla; 2026 SGK 2026/288 süresi uzatma kararıyla resmî, dolaylı teyitli; özgün idari izin işlemi 2026 için bulunamadı.",
      "kapsamDisi": "dogrulanmadi"
    },
    "idariIzinDogrulamaTarihi": "2026-07-28",
    "tamlikDurumu": {
      "kanuniDini": "kapsam-ici-tam",
      "idariIzin": "kapsam-ve-dogrulama-tarihi-ile-sinirli"
    }
  },
  "dayanak": [
    {
      "iddia": "Ulusal bayram, sabit genel tatiller ve dini bayram süreleri",
      "kaynakUrl": "https://www.mevzuat.gov.tr/MevzuatMetin/1.5.2429.pdf",
      "erisim": "2026-07-27"
    },
    {
      "iddia": "2026 Ramazan ve Kurban Bayramı tarihleri",
      "kaynakUrl": "https://vakithesaplama.diyanet.gov.tr/icerik.php?icerik=153",
      "erisim": "2026-07-27"
    },
    {
      "iddia": "Gün olarak usul süresinde ilk gün ve tatil olan son gün",
      "kaynakUrl": "https://www.mevzuat.gov.tr/MevzuatMetin/1.5.6100.pdf",
      "erisim": "2026-07-27"
    },
    {
      "iddia": "HMK 445/4 kapsamında elektronik işlemlerde sürenin gün sonunda bitmesi",
      "kaynakUrl": "https://rayp.adalet.gov.tr/resimler/31/dosya/kurulus-mevzuati-417-08-202011-06.pdf",
      "erisim": "2026-07-28"
    },
    {
      "iddia": "Hafta tatili ve çalışma günleri",
      "kaynakUrl": "https://www.mevzuat.gov.tr/MevzuatMetin/1.5.4857.pdf",
      "erisim": "2026-07-27"
    },
    {
      "iddia": "19 Temmuz 2021 öğlene kadar kamu idari izni",
      "kaynakTarihi": "2021-07-12",
      "kaynakUrl": "https://www.iletisim.gov.tr/turkce/haberler/detay/cumhurbaskani-erdogan-2021de-ihracatimizi-200-milyar-dolarin-uzerine-cikartarak-tum-zamanlarin-rekorunu-kiracagiz",
      "erisim": "2026-07-28"
    },
    {
      "iddia": "13–14 Temmuz 2022 kamu idari izni",
      "kaynakTarihi": "2022-06-27",
      "kaynakUrl": "https://www.iletisim.gov.tr/turkce/haberler/detay/cumhurbaskani-erdogan-kabine-toplantisinin-ardindan-millete-seslendi-27-06",
      "erisim": "2026-07-28"
    },
    {
      "iddia": "2024 Kurban Bayramı sonrası kamu idari izni",
      "kaynakUrl": "https://siverek.meb.gov.tr/meb_iys_dosyalar/2024_06/12164613_idariizin.pdf",
      "erisim": "2026-07-27"
    },
    {
      "iddia": "25–26 Mayıs 2026 kamu idari izni (resmî, dolaylı teyit)",
      "kaynakTarihi": "2026-05-20",
      "kararNo": "2026/288",
      "kaynakTuru": "resmi-dolayli-teyit",
      "kaynakNotu": "2026/288 idari izin kararı değildir; 25–26 Mayısın idari izin kabul edilmesi nedeniyle SGK bildirim/ödeme sürelerini uzatan karardır. İdari izni tesis eden özgün Cumhurbaşkanlığı/CİİB işlemi bu pakette bulunamadı.",
      "kaynakUrl": "https://sgk.gov.tr/duyuru/detay/2026Nisan-AyiDonemi-Muhtasar-ve-Prim-Hizmet-Beyannamelerinin-ve-Aylik-Prim-ve-Hizmet-Belgelerinin-Verilme-ve-Odeme-Suresinin-Uzatilmasi-Hakkinda-2026-05-20-02-33-45",
      "erisim": "2026-07-28"
    }
  ],
  "sinirlar": [
    "İdari izinler kamu içindir; özel sektör için genel tatil değildir ve idariIzinDahil varsayılanı false'tur.",
    "Kanuni/dinî tatil kapsamı 2020–2032'dir; idari izinlerde resmî kaynak taraması 2021–2026 ve 2026-07-28 doğrulama tarihiyle sınırlıdır (2026 SGK 2026/288 ile dolaylı teyitli), dışındaki yıllar tam kabul edilmez.",
    "Dini bayram tarihleri Diyanet İşleri Başkanlığının resmî ilanına tabidir.",
    "Hukuki sürelerde ilgili usul ve özel kanun esastır; hukuk karşılaştırması işyeri seçeneklerinden bağımsızdır.",
    "Kurum içi çalışma takvimi, vardiya, yurt dışı tatili ve özel izin günü bilinmez.",
    "Tatil gerektiren kapsam dışı hesap sayısal başarı yayımlamaz; VERI_KAPSAMI_DISI ve sonucKesin=false döner."
  ],
  "desteklenenTarihAraligi": {
    "ilk": "1000-01-01",
    "son": "9999-12-31"
  },
  "tatilVerisi": {
    "tip": "object",
    "zorunluAlanlar": [
      "surum",
      "kapsananYillar",
      "guncelleme",
      "kanuniDiniTatilKapsami",
      "idariIzinKapsami",
      "idariIzinDogrulamaTarihi",
      "tamlikDurumu",
      "kesinlikDurumu",
      "tatiller"
    ],
    "kapsananYillar": {
      "tip": "tuple<integer,integer>",
      "ogeSirasi": [
        "ilkYil",
        "sonYil"
      ],
      "kural": "ilkYil <= sonYil; tatil gereken sonuç yalnız bu kapalı yıl aralığında kesindir.",
      "birim": "Gregoryen takvim yılı"
    },
    "kanuniDiniTatilKapsami": {
      "tip": "object",
      "zorunluAlanlar": [
        "ilkYil",
        "sonYil",
        "durum"
      ]
    },
    "idariIzinKapsami": {
      "tip": "object",
      "zorunluAlanlar": [
        "ilkYil",
        "sonYil",
        "tarananYillar",
        "durum",
        "kapsamDisi"
      ],
      "kural": "Taranmayan yıl tam kabul edilmez; idariIzinDahil=true hesapları bu kapsam dışında fail-closed kapanır."
    },
    "idariIzinDogrulamaTarihi": {
      "tip": "string",
      "format": "YYYY-MM-DD",
      "kural": "Bu tarihten sonraya taşan idari izin hesabı kesin sonuç yayımlamaz."
    },
    "tatiller": {
      "tip": "array<TatilSatiri>",
      "zorunluAlanlar": [
        "tarih",
        "ad",
        "tur",
        "tamGun",
        "dayanak",
        "dogrulandi"
      ],
      "alanlar": {
        "tarih": {
          "tip": "string",
          "format": "YYYY-MM-DD",
          "birim": "Europe/Istanbul yerel takvim tarihi"
        },
        "ad": {
          "tip": "string"
        },
        "tur": {
          "tip": "string",
          "enum": [
            "ulusal",
            "dini",
            "idari"
          ]
        },
        "tamGun": {
          "tip": "boolean",
          "kural": "true ise günün tamamı kapalıdır ve saat alanları yazılmaz."
        },
        "baslangicSaati": {
          "tip": "string|null",
          "format": "HH:MM",
          "birim": "Europe/Istanbul yerel saati",
          "kural": "tamGun=false satırında yoksa 00:00 kabul edilir."
        },
        "bitisSaati": {
          "tip": "string|null",
          "format": "HH:MM",
          "birim": "Europe/Istanbul yerel saati",
          "kural": "tamGun=false satırında yoksa 24:00 gün sonu kabul edilir."
        },
        "dayanak": {
          "tip": "object",
          "zorunluAlanlar": [
            "kaynakUrl",
            "erisim"
          ],
          "alanlar": {
            "kanun": "string|null",
            "karar": "string|null",
            "kararNo": "string|null",
            "kaynakTarihi": "YYYY-MM-DD|null",
            "kaynakUrl": "https URL",
            "erisim": "YYYY-MM-DD"
          },
          "kural": "kanun veya karar alanlarından en az biri bulunur; karar numarası ve kaynak tarihi biliniyorsa ayrı alanlarda taşınır."
        },
        "dogrulandi": {
          "tip": "boolean"
        }
      },
      "cakisma": "Aynı tarihte satırlar zaman aralığı birleşimiyle en çok 1 gün kaybı üretir.",
      "etkiBirimi": "iş günü; 0, 0.5 veya 1"
    },
    "turetimKurallari": {
      "tip": "array<TuretimKurali>",
      "desteklenenKod": "2429-CUMA-CUMARTESI",
      "kural": "Tam genel tatil bloğu Cuma akşamı bitip Cumartesi ayrıca tam tatil değilse kaynaklı tam-gün kanuni satır türetilir."
    },
    "birimler": {
      "tarih": "Gregoryen YYYY-MM-DD",
      "saat": "Europe/Istanbul yerel HH:MM",
      "etki": "iş günü"
    }
  },
  "hukukiSureModu": {
    "tip": "sabit hukuk takvimi karşılaştırması",
    "gecerliBirlesimler": [
      "tatilleriDus=true",
      "tatilleriDus=false",
      "haftaSonu=cumartesi-pazar|yalniz-pazar|yok",
      "yarimGunPolitikasi=tam-is-gunu|yarim|tam-tatil"
    ],
    "bagimsizAlanlar": [
      "tatilleriDus",
      "idariIzinDahil",
      "haftaSonu",
      "yarimGunPolitikasi"
    ],
    "sabitTakvim": "Cumartesi–Pazar, 2429 kapsamındaki tam/yarım tatiller; idari izin hariç",
    "semantik": "İşyeri iş-günü sonucu ayrı kalır; hukuki son gün HMK 92–93 karşılaştırmasıdır. Fiziksel yarım tatil saati ile HMK 445/4 elektronik gün sonu ayrıdır."
  }
}
