{
  "name": "Zam ve Artış Oranı Hesaplama",
  "slug": "zam-hesaplama",
  "category": "finans",
  "version": "1.2.0",
  "date": "2026-07-29",
  "language": "tr-TR",
  "entrypoint": {
    "page": "./index.html",
    "function": "zamHesapla",
    "function_type": "pure",
    "network_required": false
  },
  "schema_package": {
    "draft": "https://json-schema.org/draft/2020-12/schema",
    "input": {
      "file": "./zam-hesaplama-input.schema.json",
      "$id": "https://hesapla.narch.tech/arac/zam-hesaplama/zam-hesaplama-input.schema.json"
    },
    "output": {
      "file": "./zam-hesaplama-output.schema.json",
      "$id": "https://hesapla.narch.tech/arac/zam-hesaplama/zam-hesaplama-output.schema.json"
    },
    "ajv_options": {
      "strict": false,
      "multipleOfPrecision": 2
    },
    "usage": "Her dosya bağımsızdır; JSON olarak okuyup doğrudan ajv.compile(schema) çağrısına verin. unit açıklama anahtarları için strict:false, ondalık 0.01 katlarında ikili Number reddini önlemek için multipleOfPrecision:2 kullanın. Özel $defs birleştirmesi gerekmez."
  },
  "rate_policy": {
    "official_rate_provided": false,
    "default_rate_provided": false,
    "rule": "Araç TÜFE, kira, maaş, memur zammı veya başka bir resmî/güncel oran sağlamaz. oran ve enflasyon değerlerini çağıran taraf girmelidir.",
    "percent_notation": "25 sayısı %25 anlamına gelir; 0.25 anlamına gelmez."
  },
  "precision_policy": {
    "money_input": "Tutarlar en fazla iki ondalıkla alınır ve tam kuruşa çevrilir.",
    "money_calculation": "zamli_bul, zamsiz_bul, ardisik.liste ara tutarları ve reel parasal sonuçları; oran ondalığını tam sayı pay/payda olarak uygulayıp kuruşa çevirir. İkili Number sapması bağ kararı değildir.",
    "tie_rule_id": "positive_half_up",
    "tie_rule": "Tam yarım kuruşa bağlanan pozitif parasal sonuçta pozitif para için yarım yukarı uygulanır.",
    "tie_example": "1,00 × 1,005 = 1,005 TL, positive_half_up ile 1,01 TL olur.",
    "difference_invariant": "Yeni tutar ile değişim tutarı bağımsız yuvarlanmaz; değişim = yeni − eski invarianti korunur.",
    "rates": "ardisik.liste için bilesik_oran ve toplam_carpan fiilî kuruş tutarlarının etkin değişimidir; teorik_bilesik_oran ve teorik_toplam_carpan girilen oranların yuvarlanmamış çarpımıdır. Başlangıç tutarı 0 ise etkin iki alan null döner.",
    "equal_rate": "esit_oran_bul, sayısal iptali önlemek için expm1(log1p(hedef/100)/donem_sayisi)*100 kullanır; donem_sayisi JavaScript güvenli tam sayı aralığında olmalıdır.",
    "rounding": "yuvarlama=kurus veya yuvarlama=tam_tl yalnız sunumu etkiler; çekirdek sonuçları ve ardışık zinciri değiştirmez.",
    "safe_cent_limit": 9007199254740991
  },
  "required_by_mode": {
    "zamli_bul": ["eski_tutar", "oran", "yuvarlama"],
    "oran_bul": ["eski_tutar", "yeni_tutar", "yuvarlama"],
    "zamsiz_bul": ["yeni_tutar", "oran", "yuvarlama"],
    "ardisik.liste": ["ardisik_islem=liste", "eski_tutar", "oranlar", "yuvarlama"],
    "ardisik.esit_oran_bul": ["ardisik_islem=esit_oran_bul", "hedef_toplam_oran", "donem_sayisi", "yuvarlama"],
    "reel": ["eski_tutar", "oran", "enflasyon", "yuvarlama"]
  },
  "output_by_mode": {
    "zamli_bul": [
      "basarili", "mod", "yuvarlama", "eski_tutar", "eski_tutar_kurus", "yeni_tutar",
      "yeni_tutar_kurus", "degisim_tutari", "degisim_tutari_kurus", "oran", "islem_turu"
    ],
    "oran_bul": [
      "basarili", "mod", "yuvarlama", "eski_tutar", "eski_tutar_kurus", "yeni_tutar",
      "yeni_tutar_kurus", "degisim_tutari", "degisim_tutari_kurus", "oran", "islem_turu"
    ],
    "zamsiz_bul": [
      "basarili", "mod", "yuvarlama", "eski_tutar", "eski_tutar_kurus", "yeni_tutar",
      "yeni_tutar_kurus", "degisim_tutari", "degisim_tutari_kurus", "oran", "toplam_carpan", "islem_turu"
    ],
    "ardisik.liste": [
      "basarili", "mod", "yuvarlama", "ardisik_islem", "eski_tutar", "eski_tutar_kurus",
      "yeni_tutar", "yeni_tutar_kurus", "degisim_tutari", "degisim_tutari_kurus", "oranlar",
      "toplam_carpan", "bilesik_oran", "teorik_toplam_carpan", "teorik_bilesik_oran", "adimlar"
    ],
    "ardisik.esit_oran_bul": [
      "basarili", "mod", "yuvarlama", "ardisik_islem", "hedef_toplam_oran", "donem_sayisi",
      "tek_zam_orani", "toplam_carpan"
    ],
    "reel": [
      "basarili", "mod", "yuvarlama", "eski_tutar", "eski_tutar_kurus", "zam_orani",
      "enflasyon_orani", "nominal_yeni_tutar", "nominal_yeni_tutar_kurus", "reel_deger",
      "reel_deger_kurus", "reel_degisim_tutari", "reel_degisim_tutari_kurus", "reel_oran",
      "basit_fark_orani", "yontem_farki_yuzde_puani"
    ]
  },
  "sources": [
    {
      "claim": "TBK m.344, yenilenen konut ve çatılı işyeri kira bedellerindeki anlaşmalar için TÜFE'nin on iki aylık ortalamalara göre değişimiyle bağlantılı sınırı ve özel durumları düzenler.",
      "publisher": "T.C. Mevzuat Bilgi Sistemi",
      "url": "https://www.mevzuat.gov.tr/MevzuatMetin/1.5.6098.pdf",
      "retrieved_at": "2026-07-29",
      "dynamic_value_provided": false
    },
    {
      "claim": "7161 sayılı Kanun m.56, TBK m.344'teki endeks ibarelerini tüketici fiyat endeksindeki on iki aylık ortalamalara göre değişim olarak değiştirmiştir.",
      "publisher": "T.C. Resmî Gazete",
      "url": "https://www.resmigazete.gov.tr/eskiler/2019/01/20190118-1.htm",
      "retrieved_at": "2026-07-29",
      "dynamic_value_provided": false
    },
    {
      "claim": "TÜİK'in sabit bülten/metadata sayfası resmîdir; ancak ham HTTP yanıtında bülten verisi değil JavaScript uygulama kabuğu vardır ve sabit bülten numarası güncel dönemi garanti etmez.",
      "publisher": "Türkiye İstatistik Kurumu (TÜİK)",
      "url": "https://veriportali.tuik.gov.tr/tr/press/58289/metadata",
      "retrieved_at": "2026-07-29",
      "dynamic_value_provided": false,
      "javascript_required": true,
      "machine_readable": false,
      "authentication_required": false,
      "raw_access_evidence": {
        "command": "curl -sS -L -D - https://veriportali.tuik.gov.tr/tr/press/58289/metadata",
        "result": "HTTP 200 text/html; gövde #root, harici module script ve JavaScript Gerekli noscript metni içeriyor; metadata/veri ham yanıtta yok."
      },
      "period_validation_fallback": [
        "Aramayı site:veriportali.tuik.gov.tr/tr/press alanıyla ve Tüketici Fiyat Endeksi + hedef dönem terimleriyle sınırlandır.",
        "Resmî alan dışındaki sonuçtan oran alma.",
        "Bulunan bülteni JavaScript çalıştırabilen tarayıcıda açıp içerik adı, yayım tarihi ve referans dönemini hedef dönemle karşılaştır.",
        "Dönem eşleşmiyorsa sabit 58289 numarasını en güncel sayma; oran kullanmadan doğrulama başarısızlığını bildir."
      ]
    },
    {
      "claim": "GİB Ücret Geliri Rehberi, ücretin safi tutarı, sigorta ve işsizlik primi indirimleri ile vergi tarifesini açıklar; bu nedenle brüt zam net zammı tek başına belirlemez.",
      "publisher": "Gelir İdaresi Başkanlığı (GİB)",
      "url": "https://intvrg.gib.gov.tr/hazirbeyan/assets/pdf/DUYURU_UNIVERSAL_2026_2026_Ucret_Geliri.pdf",
      "retrieved_at": "2026-07-29",
      "dynamic_value_provided": false
    }
  ],
  "formulas": {
    "forward": {
      "increase_amount": "zam_tutari = eski × oran/100",
      "new_amount": "yeni = eski × (1 + oran/100)",
      "derivation": "yeni = eski + eski×oran/100 = eski×(1+oran/100)"
    },
    "find_rate": {
      "formula": "oran = (yeni − eski) / eski × 100",
      "undefined_case": "eski = 0 ise bölme tanımsızdır ve ESKI_TUTAR_SIFIR hatası döner."
    },
    "find_original": {
      "formula": "eski = yeni / (1 + oran/100)",
      "warning": "%20 zamlı 120'nin zamsız hâli 120 − %20 = 96 değil, 120/1,20 = 100'dür."
    },
    "compound": {
      "effective_factor": "toplam_carpan = yeni_tutar_kurus / eski_tutar_kurus",
      "effective_rate": "bilesik_oran = (yeni_tutar_kurus − eski_tutar_kurus) / eski_tutar_kurus × 100",
      "effective_undefined_case": "eski_tutar_kurus = 0 ise toplam_carpan ve bilesik_oran null döner.",
      "theoretical_factor": "teorik_toplam_carpan = Π(1 + oran_k/100)",
      "theoretical_rate": "teorik_bilesik_oran = (teorik_toplam_carpan − 1) × 100",
      "proof": "%20 ardından %10 için hem etkin hem teorik oran %32'dir. 0,01'e %50 ardından %50 uygulandığında etkin oran %200, teorik oran %125'tir."
    },
    "equal_steps": {
      "stable_formula": "tek_zam = expm1(log1p(T/100)/n) × 100",
      "period_constraint": "n, 1 ile Number.MAX_SAFE_INTEGER arasında güvenli bir tam sayıdır."
    },
    "real": {
      "formula": "reel_oran = ((1 + zam/100) / (1 + enflasyon/100) − 1) × 100",
      "warning": "zam − enflasyon basit farkı yüksek oranlarda sapar; Fisher oranını kullanın."
    }
  },
  "examples": [
    {
      "name": "İleri maaş zammı",
      "request": { "mod": "zamli_bul", "eski_tutar": 30000, "oran": 25, "yuvarlama": "kurus" },
      "response": {
        "basarili": true, "mod": "zamli_bul", "yuvarlama": "kurus", "eski_tutar": 30000,
        "eski_tutar_kurus": 3000000, "yeni_tutar": 37500, "yeni_tutar_kurus": 3750000,
        "degisim_tutari": 7500, "degisim_tutari_kurus": 750000, "oran": 25, "islem_turu": "zam"
      }
    },
    {
      "name": "Tersine yüzde",
      "request": { "mod": "zamsiz_bul", "yeni_tutar": 120, "oran": 20, "yuvarlama": "kurus" },
      "response": {
        "basarili": true, "mod": "zamsiz_bul", "yuvarlama": "kurus", "eski_tutar": 100,
        "eski_tutar_kurus": 10000, "yeni_tutar": 120, "yeni_tutar_kurus": 12000,
        "degisim_tutari": 20, "degisim_tutari_kurus": 2000, "oran": 20,
        "toplam_carpan": 1.2, "islem_turu": "zam"
      }
    },
    {
      "name": "Ardışık bileşik zam",
      "request": {
        "mod": "ardisik", "ardisik_islem": "liste", "eski_tutar": 100,
        "oranlar": [20, 10], "yuvarlama": "kurus"
      },
      "response": {
        "basarili": true, "mod": "ardisik", "yuvarlama": "kurus", "ardisik_islem": "liste",
        "eski_tutar": 100, "eski_tutar_kurus": 10000, "yeni_tutar": 132,
        "yeni_tutar_kurus": 13200, "degisim_tutari": 32, "degisim_tutari_kurus": 3200,
        "oranlar": [20, 10], "toplam_carpan": 1.32, "bilesik_oran": 32,
        "teorik_toplam_carpan": 1.32, "teorik_bilesik_oran": 32,
        "adimlar": [
          {
            "sira": 1, "oran": 20, "onceki_tutar": 100, "onceki_tutar_kurus": 10000,
            "degisim_tutari": 20, "degisim_tutari_kurus": 2000,
            "sonraki_tutar": 120, "sonraki_tutar_kurus": 12000
          },
          {
            "sira": 2, "oran": 10, "onceki_tutar": 120, "onceki_tutar_kurus": 12000,
            "degisim_tutari": 12, "degisim_tutari_kurus": 1200,
            "sonraki_tutar": 132, "sonraki_tutar_kurus": 13200
          }
        ]
      }
    },
    {
      "name": "Eşit ara zamı bul",
      "request": {
        "mod": "ardisik", "ardisik_islem": "esit_oran_bul", "hedef_toplam_oran": 60,
        "donem_sayisi": 2, "yuvarlama": "kurus"
      },
      "response": {
        "basarili": true, "mod": "ardisik", "yuvarlama": "kurus",
        "ardisik_islem": "esit_oran_bul", "hedef_toplam_oran": 60,
        "donem_sayisi": 2, "tek_zam_orani": 26.491106406735177, "toplam_carpan": 1.6
      }
    },
    {
      "name": "Reel değişim",
      "request": { "mod": "reel", "eski_tutar": 30000, "oran": 25, "enflasyon": 40, "yuvarlama": "kurus" },
      "response": {
        "basarili": true, "mod": "reel", "yuvarlama": "kurus", "eski_tutar": 30000,
        "eski_tutar_kurus": 3000000, "zam_orani": 25, "enflasyon_orani": 40,
        "nominal_yeni_tutar": 37500, "nominal_yeni_tutar_kurus": 3750000,
        "reel_deger": 26785.71, "reel_deger_kurus": 2678571,
        "reel_degisim_tutari": -3214.29, "reel_degisim_tutari_kurus": -321429,
        "reel_oran": -10.71428571428571, "basit_fark_orani": -15,
        "yontem_farki_yuzde_puani": 4.28571428571429
      }
    }
  ],
  "error_examples": [
    {
      "request": { "mod": "oran_bul", "eski_tutar": 0, "yeni_tutar": 100, "yuvarlama": "kurus" },
      "response": {
        "basarili": false,
        "hata": {
          "kod": "ESKI_TUTAR_SIFIR",
          "mesaj": "Eski tutar 0 iken yüzde değişim tanımsızdır; oran için sıfırdan farklı bir eski tutar girin.",
          "alan": "eski_tutar"
        }
      }
    }
  ]
}
