Metadata-Version: 2.4
Name: tr-dop
Version: 0.1.1
Summary: Turkish land readjustment (arazi ve arsa düzenlemesi, İmar Kanunu m.18) calculations: DOP ratio, per-parcel DOP/KOP deductions with earlier surrenders, distribution and shareholding tables, checks, Markdown/CSV reports and a Turkish CLI.
Author-email: Yusuf Eminoğlu <geospacephilo@gmail.com>
License-Expression: MIT
Project-URL: Homepage, https://github.com/YusufEminoglu/tr_dop_sdk
Project-URL: Repository, https://github.com/YusufEminoglu/tr_dop_sdk
Project-URL: Issues, https://github.com/YusufEminoglu/tr_dop_sdk/issues
Project-URL: Changelog, https://github.com/YusufEminoglu/tr_dop_sdk/blob/main/CHANGELOG.md
Keywords: land-readjustment,land-pooling,arazi-duzenlemesi,imar,18-madde,dop,duzenleme-ortaklik-payi,parselasyon,hisselendirme,cadastre,urban-planning,turkey
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Operating System :: OS Independent
Classifier: Environment :: Console
Classifier: Natural Language :: Turkish
Classifier: Natural Language :: English
Classifier: Topic :: Scientific/Engineering :: GIS
Classifier: Topic :: Utilities
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Other Audience
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"
Requires-Dist: mypy>=1.0.0; extra == "dev"
Dynamic: license-file

# tr-dop

[![PyPI version](https://img.shields.io/pypi/v/tr-dop.svg)](https://pypi.org/project/tr-dop/)
[![Python versions](https://img.shields.io/pypi/pyversions/tr-dop.svg)](https://pypi.org/project/tr-dop/)
[![CI](https://github.com/YusufEminoglu/tr_dop_sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/YusufEminoglu/tr_dop_sdk/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

**English summary.** `tr-dop` computes Turkish land readjustment ("arazi ve arsa düzenlemesi",
Article 18 of Zoning Law No. 3194) on the standard library alone: the DOP contribution ratio
under the 45 % cap, per-parcel DOP and KOP deductions that credit earlier surrenders, and the
distribution and shareholding of the new parcels with exact share checks. Inputs are JSON or
CSV; outputs are Markdown, CSV and JSON reports and a Turkish command-line tool, with every rule
traced to the article of the law or regulation it implements.

---

**3194 sayılı İmar Kanunu 18. madde uygulaması (arazi ve arsa düzenlemesi) için hesap
kütüphanesi ve komut satırı aracı.**

`tr-dop` şunları yapar:

- Plan kullanımlarından **düzenleme ortaklık payı oranını (DOPO)** hesaplar. Hangi kullanımın
  DOP'tan karşılanacağı veri dosyasından okunur ve değiştirilebilir. Üst sınır %45'tir, oran
  virgülden sonra yedi basamakla hesaplanır.
- **Parsel bazında DOP kesintisini** hesaplar. Önceki terk ve kesintiler (bedelsiz terk, ifraz
  ve tevhit yoluyla terk, evvelce alınmış DOP), bağışlar, kamulaştırmalar, kapanan yollar ve
  kamu tahsisli parseller dikkate alınır. Mevcut yapılar nedeniyle alınamayan DOP bedele
  dönüştürülür.
- %45'i aşan kamu alanlarını önce bedelsiz kamu alanlarından karşılar, kalanını **KOP
  (kamu ortaklık payı) hissesi** olarak parsellere paylaştırır.
- Yeni imar parsellerine **dağıtım ve hisselendirme** yapar. Önce eski parselin yeri ve
  tercihleri esas alınır, gerekmedikçe tahsis bölünmez. Payda parsel alanıdır ve paylar tam
  sayıdır.
- **Kontrolleri** yapar: hisse toplamları, %45 sınırı, parsel bazında toplam kesinti, DOP'un
  karşılanması, saha ve dağıtım dengesi, pay ve payda eşitliği, asgari parsel büyüklüğü.
- **Tapu ve kadastro alanı farkını** yanılma sınırına göre değerlendirir (Yön. m.31).
- Sonuçları **Markdown, CSV ve JSON** olarak yazar. Türkçe bir CLI (`tr-dop`) sunar.

Bağımlılığı yoktur, yalnızca Python standart kütüphanesini kullanır. Python 3.9 ve üzeri ile
çalışır.

```bash
pip install tr-dop
```

## Hızlı başlangıç (komut satırı)

```bash
# JSON proje dosyasıyla: rapor ekrana
tr-dop hesapla examples/proje.json

# CSV girdileriyle: Markdown rapor + CSV cetvelleri + JSON
tr-dop hesapla --parseller examples/parseller.csv --plan examples/plan.csv \
    --yeni-parseller examples/yeni_parseller.csv --kapanan-yol 450 \
    -o rapor.md --csv-klasoru cikti --ayrac ";" --json sonuc.json

# Plan kullanımları kataloğu: hangi kullanım DOP'tan karşılanır, hangi bentte
tr-dop kullanimlar

# Tapu alanı ile hesap alanı karşılaştırması (Yön. m.31)
tr-dop yanilma --tapu 1800 --hesap 1752 --olcek 1000
```

`hesapla` seçenekleri: `--yontem dengeli|dogrudan`, `--kop orantili|cakisma|yok`,
`--ust-sinir 0.45`, `--kapanan-yol`, `--hazine-taskin`, `--kamu-alani`, `--asgari-parsel`,
`--tahsisler` (elle tahsis CSV'si), `--katalog` (kullanım kataloğu değişiklikleri).
Çıkış kodu 0 başarı, 1 bir kontrol hata verdi, 2 girdi hatası anlamına gelir.

Örnek rapordan bir bölüm (`examples/proje.json`):

```text
- Düzenleme ortaklık payı oranı (DOPO): **0.3551697** (%35,51697)
- Düşülen alanlar: kapanan yollar 450,00 m², bağış 0,00 m², kamu tahsisli parseller 600,00 m²
| 120/3 | 1500.00 | 1500.00 | tapu | 250.00 | 371.55 | 0.3551714 | 0.00 | 1128.45 | Önceki terk ... |
```

## Hızlı başlangıç (Python)

```python
from tr_dop import NewParcel, Owner, Parcel, PlanUse, Scheme, Settings, run, to_markdown

scheme = Scheme(
    parcels=[
        Parcel("101/1", 2000, [Owner("Ali", "1/2"), Owner("Ayşe", "1/2")]),
        Parcel("101/2", 3000, [Owner("Mehmet", "1")]),
        # ifraz sırasında 300 m² yola bedelsiz terk etmiş parsel (3194 m.18/9)
        Parcel("101/3", 1500, [Owner("Zeynep", "1")], prior_deduction=300),
    ],
    plan_uses=[PlanUse("yol", 1800), PlanUse("park", 700), PlanUse("konut", 4300)],
    new_parcels=[NewParcel("5/1", 1100), NewParcel("5/2", 1100),
                 NewParcel("5/3", 1050), NewParcel("5/4", 1050)],
    settings=Settings(closed_roads_area=300, min_parcel_area=400),
)
result = run(scheme)
result.dop.ratio                      # 0.3676471  ( = 2500 / 6800 )
result.dop.parcel("101/3").dop_area   # 361.76     ( = 0.3676471 x 1800 - 300 )
result.ok                             # tüm "hata" düzeyindeki kontroller geçti mi
print(to_markdown(result))
```

## Girdi biçimleri

**JSON proje dosyası** (`examples/proje.json`): `parcels`, `plan_uses`, `new_parcels`,
isteğe bağlı `allocations` ve `settings`.

**CSV** dosyalarında ayraç `,` ya da `;` olabilir (otomatik algılanır). Ondalık virgül
(`1.234,56`) kabul edilir. Sütun adları Türkçe ya da İngilizce yazılabilir.

| Dosya | Sütunlar |
|---|---|
| `parseller.csv` (malik başına bir satır) | `parsel`, `malik`, `hisse` (`1/3`, `0,25`), `tapu_alani`; isteğe bağlı `hesap_alani`, `olcek`, `yerlesik`, `yanilma_siniri`, `giren_alan`, `onceki_kesinti`, `onceki_kesinti_turu` (`terk`/`dop`), `deger_artisi`, `bagis`, `kamulastirilan`, `durum` (`ozel`/`kamu_tahsisli`), `azami_kesinti`, `cakisma_alani`, `tercih` (`"1/1;1/2"`) |
| `plan.csv` | `kullanim`, `alan`, isteğe bağlı `dop` (evet/hayır, katalogdaki değeri geçersiz kılar) |
| `yeni_parseller.csv` | `yeni_parsel`, `alan`; isteğe bağlı `ada`, `kullanim`, `asgari_alan`, `kop` |
| `tahsisler.csv` | `parsel`, `yeni_parsel`, `alan` (verilirse otomatik dağıtım yerine kullanılır) |

Parsel düzeyindeki sütunlar aynı parselin ilk satırında yazılır, sonraki satırlarda boş
bırakılabilir.

## API özeti

| Nesne / fonksiyon | Görev |
|---|---|
| `Owner`, `Parcel`, `PlanUse`, `NewParcel`, `Allocation`, `Settings`, `Scheme` | Girdi modeli. Hisseler `Fraction` olarak tutulur, toplamları tam olarak 1 olmalıdır. |
| `run(scheme, catalog=None)` → `ReadjustmentResult` | DOP, KOP, dağıtım ve kontroller (`.dop`, `.distribution`, `.checks`, `.ok`) |
| `compute_dop(parcels, plan_uses, settings, catalog)` → `DopResult` | Oran (`ratio`, `applied_ratio`), parsel satırları (`ParcelDop`), kullanım karşılama tablosu (`UseCoverage`) |
| `distribute(entitlements, owners, new_parcels, ...)` → `Distribution` | Yerleştirme ve hisse satırları (`ShareRow`: pay/payda) |
| `conversion_payments(dop_result, toplam_bedel)` | Bedele dönüştürülen DOP bedelinin fazladan kesinti yapılan parsellere dağıtımı |
| `basis_area`, `area_tolerance` | Tapu ve hesap alanı seçimi, yanılma sınırı |
| `default_catalog()`, `load_catalog(overrides)` | Plan kullanımları kataloğu |
| `load_scheme`, `read_*_csv`, `scheme_from_mapping` | Girdi okuma |
| `to_markdown`, `write_outputs`, `dop_table`, `distribution_table`, `coverage_table`, `result_to_mapping` | Çıktılar |

## Yöntem ve dayanak

Metinler mevzuat.gov.tr'deki güncel İmar Kanunu metni ve Resmî Gazete'de yayımlanan yönetmelik
ve değişiklikleriyle Kasım 2026'da karşılaştırılmıştır.

- **3194 sayılı İmar Kanunu m.18** (7181/2019, 7333/2021 ve 7534/2024 sayılı Kanunlarla
  değişik):
  - fıkra 2: DOP, düzenlemeden önceki yüzölçümünün **%45**'ini geçemez. 5006 sayılı Kanun
    sınırı %35'ten %40'a, 7181 sayılı Kanun %45'e çıkarmıştır.
  - fıkra 3: DOP'un oluşabileceği kullanımların kapalı listesini verir. Taşkın kontrol tesisi
    önce Hazine taşınmazlarından, sonra kalan oran kadar DOP'tan karşılanır. Kapanan imar ve
    kadastro yolları toplam DOP'tan düşülür.
  - fıkra 6: Kamulaştırılan kısım düşüldükten sonra kalan sahadan DOP alınır.
  - fıkra 7: DOP kural olarak bir kez alınır. Yapılaşma koşulu ve nüfus artarsa, önceki terk
    ve kesintiler dikkate alınarak ilk uygulamadaki oran %45'e kadar tamamlanabilir.
  - fıkra 8: 2981 m.10 uygulamalarında tamamlayıcı kesinti yapılabilir; toplam %45'i geçemez.
  - fıkra 9: İfraz ve tevhitle terk edilen alanın oranı, DOPO'ya tamamlayan fark kadar DOP alınır.
  - fıkra 11-12: Yapılar nedeniyle alınamayan DOP bedele dönüştürülür ve fazladan kesinti
    yapılan parsel sahiplerine ödenir.
  - fıkra 13: Tahsis önce düzenlemeye alınan taşınmazın bulunduğu yerden yapılır.
  - fıkra 15: Asgari parsel büyüklüğünün altında parsel oluşturulamaz.
- **Arazi ve Arsa Düzenlemeleri Hakkında Yönetmelik** (RG 22/2/2020-31047; değişiklikler
  RG 11/9/2025-33014 ve 13/12/2025-33106):
  - m.4/1-d: DOPO = toplam DOP / düzenlemeye giren parsellerin toplam yüzölçümü; yedi basamak.
  - m.14/2: Öncelik sırası (a ... i). m.14/3: taşkın kontrol tesisi. m.14/4-5: kapanan yollar
    ve fazlası. m.14/6-7: önceki terkler (toplam %45). m.14/8: bağış ve tahsis.
  - m.15: %45'i aşan kamu alanları. Önce tescil harici, belediye, kamu ve Hazine alanları
    kullanılır, sonra trampa, imar hakkı aktarımı ya da kamulaştırma. m.15/4'e göre aşan alan,
    çakışan parsellere kamulaştırma şerhiyle tahsis edilir.
  - m.16: DOP alınmayan durumlar (yapılar ve bedele dönüştürme formülü m.16/3, kamu tahsisli
    parseller m.16/4, evvelce DOP alınmış parseller m.16/5).
  - m.17: Dağıtım esasları ve KOP hisselendirmesi (m.17/3). m.31: yüzölçümü kontrolü.
    m.32: hisse hesabı (payda = parsel alanı).

**Oran yöntemleri.** Varsayılan `dengeli` yöntem, önceki terkleri olan parsellerin de
katkısını eşitleyecek oranı çözer: `Σ max(0, r·A⁰ᵢ − Tᵢ) = gereken DOP` (`A⁰` terk öncesi
alan, `T` önceki terk). Böylece her parselin toplam katkısı özgün alanının aynı `r` oranı olur
ve kamu alanları tam karşılanır. `dogrudan` yöntem Yönetmelik m.4/1-d tanımını harfiyen
uygular: `r = gereken DOP / Σ parsel alanı`. Önceki terkler tamamlayan fark olarak düşüldüğü
için ortaya çıkan açık raporda gösterilir.

**KOP.** 2019-2020 düzenlemesiyle eski "kamu ortaklık payı" kesintisi kaldırılmıştır; ancak
%45'i aşan kamu alanlarının karşılanması gerekir. `tr-dop` aşan alanı hesaplar. Bu alanı önce
`excess_cover_area` (bedelsiz kamu alanı) ile karşılar, kalanını iki yöntemden biriyle
paylaştırır. `orantili` yöntemde pay, DOP sonrası tahsis miktarıyla orantılıdır (eski KOP
uygulaması, Yön. m.17/3). `cakisma` yöntemde pay, parselin aşan kamu alanına düşen kısmıyla
orantılıdır (Yön. m.15/4). KOP hisseleri malikin mülkiyetinde kalır ve kamulaştırma şerhiyle
`kop_target` parsellere hisselendirilir.

**Dağıtım.** Eski parseller verilen sırayla işlenir. Her parsel önce tercih ettiği yeni
parsellere, sonra tahsisi bütün olarak alabilen ilk parsele yerleştirilir. Kalan parseller en
geniş boş parselleri doldurur, son kalan kısım tahsisi tam alabilen en dar parsele konur. Toplam
tahsis yeni parsel alanından yuvarlama kadar farklıysa en büyük kalan yöntemiyle dengelenir; bu
dengeleme raporda gösterilir. Hesaplar 0,01 m² tamsayı biriminde yapılır, bu yüzden payların
toplamı paydaya tam olarak eşittir.

## Kontroller

| Kod | Düzey | İçerik |
|---|---|---|
| `hisse_toplami` | hata | Her eski parselde malik hisselerinin toplamı 1 |
| `dop_ust_siniri` | hata | DOPO ≤ üst sınır |
| `dop_asimi` | uyarı | Kamu alanları %45'i aşıyor (KOP/kamulaştırma gerekli) |
| `parsel_toplam_kesinti` | uyarı | Önceki kesintiler dahil parsel bazında %45 |
| `dop_karsilama` | uyarı | Toplanan DOP = gereken DOP |
| `saha_dengesi` | uyarı | Plan kullanımları toplamı = parseller + yollar + kamu alanları |
| `dagitim_dengesi` | hata | Tahsis toplamı = yeni parsel alanı toplamı (bağıl tolerans) |
| `dagitilamayan` | hata | Bütün tahsisler dağıtıldı |
| `pay_payda` | hata | Her yeni parselde Σ pay = payda |
| `asgari_parsel` | hata | Yeni parsel ≥ asgari büyüklük |
| `kop_parseli`, `yeni_parsel_plan`, `kapanan_yol_fazlasi`, `bedele_donusturme` | uyarı/bilgi | Ek bilgiler |

## Sınırlamalar ve doğrulanamayan noktalar

- **Yanılma sınırı:** Formüller Yönetmelik m.31/3'ün 2020 metnindendir. 2025 değişikliğiyle
  fıkra, *Tapu Planlarında Yanılma Sınırının Belirlenmesi Hakkında Yönetmelik*'e (RG
  27/9/2022-31966) atıf yapar hale gelmiştir ve o yönetmeliğin formülleri bu pakette
  doğrulanmamıştır. Yerleşik alan formülündeki karekökün `M·F` çarpımının tamamını kapsadığı
  varsayılmıştır, çünkü RG dizgisi bu konuda belirsizdir. Güncel değer için `tolerance`
  alanını kullanın.
- **Kullanım kataloğu:** Kanun listesindeki kullanımların DOP kapsamı doğrulanmıştır. Bazı
  satırlar `verified: false` olarak işaretlidir: mezarlık (yalnızca Yönetmelik m.14/2-i'de
  geçer), kent meydanı, kent parkı ve idari tesis (2025'te öncelik listesinden çıkarılmış ya
  da yalnızca tanımda geçer). Öncelik bentlerinden a (ilk kısmı), b, d, e, g ve ı'nın 2025
  metni ikincil kaynaktan doğrulanmıştır. Öteki bentler 2020 metninden alınmıştır.
  `tr-dop kullanimlar` komutu (*) ile işaretli satırları gösterir. `--katalog` ile
  değiştirebilirsiniz.
- **Hesap yorumları:** `dengeli` yöntem, önceki terklerin "toplam parsel alanı" olarak terk
  öncesi alana (`A⁰ = alan + terk`) oranlandığı yorumuna dayanır. Değer artışı nedeniyle ilave
  DOP alınan parsellerde (3194 m.18/7) ilave kesinti `min(r, %45)·A⁰ − önceki kesinti` olarak
  hesaplanır.
- **KOP:** `orantili` paylaştırma uygulamadaki eski KOP yöntemine dayanır; güncel mevzuatta
  bu adla bir kesinti yoktur. `cakisma` yöntemi m.15/4'e daha yakındır, ancak çakışma
  alanlarını kullanıcının girmesi gerekir.
- **Geometri:** Geometri yoktur. Plan kullanım alanları, yeni parsel alanları ve tercihler
  kullanıcıdan alınır. Değer esaslı (eşdeğer) dağıtım, kat mülkiyeti esaslı hisselendirme
  (m.19) ve imar hakkı aktarımı (m.38/A-C) kapsam dışıdır.
- **Asgari parsel büyüklükleri** plan ve Planlı Alanlar İmar Yönetmeliği'ne göre değişir.
  Varsayılan bir değer yoktur, `min_area` ya da `--asgari-parsel` ile verilmelidir.
- Sonuçlar ön hesap niteliğindedir. Parselasyon planı yetkili idare tarafından mevzuata göre
  hazırlanır ve onaylanır.

## Geliştirme

```bash
pip install -e ".[dev]"
pytest --cov=tr_dop
ruff check . && ruff format --check src tests && mypy src
```

Testler ağ kullanmaz. Her sayısal örnek test dosyalarında elle hesaplanarak gösterilmiştir
(`tests/test_dop.py`, `tests/test_engine.py`).

## Lisans

MIT © 2026 Yusuf Eminoğlu. Ayrıntılar için [LICENSE](LICENSE) dosyasına, atıf için
[CITATION.cff](CITATION.cff) dosyasına bakın.

## Akademik atıf (Academic citation)

```bibtex
@software{eminoglu_tr_dop,
  author  = {Eminoğlu, Yusuf},
  title   = {tr-dop},
  year    = {2026},
  version = {0.1.1},
  url     = {https://github.com/YusufEminoglu/tr_dop_sdk}
}
```

`CITATION.cff` dosyasına da bakın.
