Metadata-Version: 2.4
Name: tr-arsapayi
Version: 0.1.1
Summary: Arsa payı (land share) allocation for Turkish condominiums under Kat Mülkiyeti Kanunu (634) art. 3: value-based coefficients, area-based comparison, exact largest-remainder rounding and kentsel dönüşüm (6306) comparisons.
Author-email: Yusuf Eminoğlu <geospacephilo@gmail.com>
License-Expression: MIT
Project-URL: Homepage, https://github.com/YusufEminoglu/tr_arsapayi_sdk
Project-URL: Repository, https://github.com/YusufEminoglu/tr_arsapayi_sdk
Project-URL: Issues, https://github.com/YusufEminoglu/tr_arsapayi_sdk/issues
Project-URL: Changelog, https://github.com/YusufEminoglu/tr_arsapayi_sdk/blob/main/CHANGELOG.md
Keywords: arsa-payi,kat-mulkiyeti,kat-irtifaki,condominium,land-share,kentsel-donusum,urban-regeneration,real-estate,valuation,turkey,apportionment,largest-remainder
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: Topic :: Scientific/Engineering
Classifier: Topic :: Office/Business
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Legal Industry
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-arsapayi

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

**English summary.** `tr-arsapayi` allocates *arsa payı* (the land share attached to
each independent unit of a condominium) under Article 3 of the Turkish Condominium Law
No. 634, which requires shares proportional to each unit's value. It values units with
overridable coefficients (floor, use, facade, view, position, annexes), offers a pure
area-based method for comparison, rounds to any integer denominator with the
largest-remainder method so shares sum exactly, and compares old vs. new shares in
urban-regeneration (Law No. 6306) projects. The rest of this document is in Turkish.

---

**Kat mülkiyeti ve kat irtifakı için arsa payı hesabı.**

`tr-arsapayi`, 634 sayılı Kat Mülkiyeti Kanunu'nun 3. maddesindeki "bağımsız bölümlerin
konum ve büyüklüklerine göre hesaplanan değerleri ile oranlı" arsa payı ilkesini
uygulayan küçük, bağımlılıksız bir Python kütüphanesi ve komut satırı aracıdır.

- **Değer esaslı hesap:** net alan × kat × nitelik (konut/dükkan/ofis...) × cephe ×
  manzara × konum katsayıları + eklenti (depo, otopark, bahçe, teras...) eşdeğer alanı.
  Ekspertiz değeri varsa doğrudan o kullanılır.
- **Alan esaslı hesap** (yalnızca karşılaştırma için) ve iki yöntemin yan yana tablosu.
- **Tam sayılı payda:** 1000, 2400 gibi sabit payda, EKOK tabanlı kesin payda (`tam`)
  veya hata toleransına göre otomatik payda. Yuvarlama **en büyük kalan (Hamilton)
  yöntemi** ile yapılır; paylar paydaya **tam olarak** eşit toplanır.
- **Kentsel dönüşüm (6306):** eski ve yeni arsa paylarını, malik başına hak edilen ve
  alınan değeri, yüklenici payını karşılaştırır; m.6'daki "hisseleri oranında salt
  çoğunluk" kontrolünü yapar.
- **Çıktılar:** Türkçe başlıklı tablo (terminal), Markdown, CSV (Excel için `;` ve
  ondalık virgül seçeneği).

> **Önemli:** Yerleşik katsayılar **örnek (temsili)** değerlerdir. 634 sayılı Kanun ya
> da başka bir mevzuat bir katsayı tablosu belirlemez. Gerçek bir tescil veya dava için
> katsayıları projeye/ekspertiz raporuna göre değiştirin. Bu araç hukuki görüş değildir.

## Kurulum

```bash
pip install tr-arsapayi
```

Python 3.9 veya üstü gerekir; yalnızca standart kütüphane kullanılır.

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

`bina.csv`:

```csv
bb_no,kat,nitelik,net_alan,cephe,manzara,konum,eklenti,malik
1,Z,dükkan,85,ön,,,depo=12,Malik A
2,Z,dükkan,60,yan,,,,Malik B
3,1,konut,110,ön,kısmi,,,Malik C
4,1,konut,95,arka,,,,Malik D
5,2,konut,110,ön,kısmi,,otopark=12.5,Malik E
6,2,konut,95,arka,,,,Malik F
7,3,konut,110,ön,tam,,otopark=12.5,Malik G
8,3,konut,95,arka,yok,,,Malik H
9,4,konut,180,köşe,tam,çatı dubleks,teras=40,Malik I
```

```bash
tr-arsapayi hesapla bina.csv --payda 1000 --bicim md
```

| BB No | Kat | Nitelik | Net alan (m²) | Eklenti (m²) | Kat k. | Nitelik k. | Cephe k. | Manzara k. | Konum k. | Ek k. | Eşdeğer alan (m²) | Değer | Oran (%) | Arsa payı |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Zemin | dükkan | 85,00 | depo 12,00 | 1,000 | 1,500 | 1,050 | 1,000 | 1,000 | 1,000 | 136,88 | 136,88 | 12,100 | 121/1000 |
| 2 | Zemin | dükkan | 60,00 |  | 1,000 | 1,500 | 1,000 | 1,000 | 1,000 | 1,000 | 90,00 | 90,00 | 8,000 | 80/1000 |
| 3 | 1. Kat | konut | 110,00 |  | 1,000 | 1,000 | 1,050 | 1,030 | 1,000 | 1,000 | 118,97 | 118,97 | 10,500 | 105/1000 |
| ... | | | | | | | | | | | | | | |
| 9 | 4. Kat | konut | 180,00 | teras 40,00 | 1,050 | 1,000 | 1,080 | 1,080 | 1,050 | 1,000 | 243,47 | 243,47 | 21,500 | 215/1000 |
| TOPLAM |  |  | 940,00 |  |  |  |  |  |  |  | 1.131,11 | 1.131,11 | 100,000 | 1000/1000 |

Diğer komutlar:

```bash
tr-arsapayi hesapla bina.csv --payda tam                 # EKOK tabanlı kesin payda
tr-arsapayi hesapla bina.csv --payda otomatik            # en küçük uygun ortak payda
tr-arsapayi hesapla bina.csv --yontem alan               # yalnız net alan
tr-arsapayi hesapla bina.csv --karsilastir               # değer esaslı / alan esaslı
tr-arsapayi hesapla bina.csv --bicim csv --excel -o pay.csv
tr-arsapayi katsayilar -o katsayilar.json                # örnek katsayı setini dışa aktar
tr-arsapayi hesapla bina.csv --katsayilar katsayilar.json
tr-arsapayi donusum eski.csv yeni.csv --bicim md         # kentsel dönüşüm karşılaştırması
```

### CSV sütunları

| Sütun | Zorunlu | Açıklama |
|---|---|---|
| `bb_no` | evet | Bağımsız bölüm numarası (benzersiz) |
| `kat` | evet | `Z`/`zemin` = 0, `B1`/`bodrum` = -1, `3`, `3. kat` ... |
| `net_alan` | evet | m²; `12,5` veya `12.5` |
| `nitelik` | | `konut` (varsayılan), `dükkan`, `ofis`, `isyeri`, `depo`, `otopark` |
| `cephe`, `manzara`, `konum` | | Katsayı tablosundaki anahtarlar; boşsa 1,0 |
| `eklenti` | | `depo=8; otopark=12,5` |
| `malik` | | Malik (dönüşüm karşılaştırması ve çoğunluk için) |
| `ek_katsayi` | | Ek çarpan (varsayılan 1,0) |
| `deger` | | Ekspertiz değeri; verilirse katsayılar bu bölüm için kullanılmaz |

Sütun adları büyük/küçük harf ve Türkçe karakterden bağımsız eşleştirilir; ayraç
(`,` `;` sekme) otomatik bulunur. Tabloda tanımlı olmayan bir kategori (ör. `cephe=güney`)
sessizce 1,0 sayılmaz, **hata verir**.

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

```python
from tr_arsapayi import Unit, allocate, default_coefficients

units = [
    Unit("1", floor=0, net_area=80, use="dukkan", facade="on"),
    Unit("2", floor=1, net_area=100, facade="on"),
    Unit("3", floor=1, net_area=100, facade="arka"),
    Unit("4", floor=2, net_area=100, facade="on", annexes={"depo": 8}),
]
alloc = allocate(units, denominator=1000)
print(alloc.shares())        # {'1': 288, '2': 240, '3': 222, '4': 250}
print(alloc.to_markdown())

# Katsayıları değiştirme (yalnızca farklı olanlar)
k = default_coefficients().updated({"nitelik": {"dukkan": 2.0}, "birim_deger": 40000})
print(allocate(units, k, denominator="tam").denominator)
```

Elle doğrulama (örnek katsayılarla): BB1 = 80 × 1,00 × 1,50 × 1,05 = 126,00;
BB2 = 100 × 1,05 = 105,00; BB3 = 100 × 0,97 = 97,00; BB4 = 100 × 1,02 × 1,05 + 8 × 0,25
= 109,10; toplam 437,10. Kotalar 288,26 / 240,22 / 221,92 / 249,60; tam kısımların
toplamı 998, kalan 2 pay en büyük kalanlara (0,92 ve 0,60) verilir → 288, 240, 222, 250.

### Kentsel dönüşüm

```python
from fractions import Fraction
from tr_arsapayi import allocate, compare_transformation, majority, read_units_csv

old = allocate(read_units_csv("eski.csv"), denominator=1000)
new = allocate(read_units_csv("yeni.csv"), denominator=1000)
print(compare_transformation(old, new).to_markdown())

print(majority(old, ["Malik A", "Malik C"]).describe())
# Onaylayan hisse oranı %52,00; gereken: > 1/2. Çoğunluk SAĞLANDI.
```

`compare_transformation`, yeni yapıda eski maliklere verilen bölümlerin toplam değerini
("maliklere düşen değer") eski arsa payı oranlarına göre paylaştırır:
**hak edilen değer = eski oran × maliklere düşen değer**. Alınan değer bununla
karşılaştırılır (fark ve alınan/hak edilen oranı). Eski malik listesinde olmayan
(veya `Yüklenici`/`müteahhit` etiketli) yeni bölümler yüklenici payı sayılır.

## API özeti

| Nesne | Açıklama |
|---|---|
| `Unit` | Bağımsız bölüm: `no`, `floor`, `net_area`, `use`, `facade`, `view`, `position`, `annexes`, `owner`, `extra_factor`, `value` |
| `CoefficientSet` | Katsayı tabloları; `from_json`, `from_dict(..., base=)`, `updated`, `to_json`, `floor_factor`, `lookup` |
| `default_coefficients()` | **Örnek** katsayı seti (yeni kopya döner) |
| `value_unit(unit, k)` | Katsayı dökümü ve değer (`UnitValuation`) |
| `allocate(units, k, denominator, method, min_share)` | Arsa payı dağıtımı → `Allocation` (`shares`, `owner_ratios`, `max_rounding_error`, `to_markdown`, `to_text`, `to_csv`, `to_dicts`) |
| `compare_methods`, `method_comparison_table` | Değer esaslı / alan esaslı karşılaştırma |
| `suggest_denominator` | Toleransa göre en küçük ortak payda (100, 120, 240, ..., 1000, 2400, ...) |
| `largest_remainder`, `exact_denominator` | Tam sayı paylaştırma çekirdeği |
| `compare_transformation` | Kentsel dönüşüm eski/yeni karşılaştırması → `TransformationResult` |
| `majority` | 6306 m.6 "hisseleri oranında salt çoğunluk" kontrolü |
| `read_units_csv`, `parse_annexes`, `parse_floor` | Girdi okuma yardımcıları |

## Yöntem ve kaynaklar

**Hukuki dayanak** (metinler mevzuat.gov.tr üzerinden kontrol edilmiştir):

- **634 sayılı Kat Mülkiyeti Kanunu, m.2/d:** arsa payı, "arsanın, bu Kanunda yazılı
  esasa göre bağımsız bölümlere tahsis edilen ortak mülkiyet payları"dır.
- **634 s.K. m.3/2** (14/11/2007 tarihli 5711 s.K. ile değişik): kat mülkiyeti ve kat
  irtifakı, bağımsız bölümlerin "konum ve büyüklüklerine göre hesaplanan değerleri ile
  oranlı olarak" tahsis edilen arsa payının gösterilmesi suretiyle kurulur; oranlı
  değilse her malik düzeltme için mahkemeye başvurabilir; sonradan oluşan değer
  artış/azalışı arsa payını değiştirmez.
- **634 s.K. m.4:** ortak yerler (temeller, merdivenler, asansörler, sığınaklar ...);
  bunlara ayrı arsa payı verilmez.
- **634 s.K. m.6:** eklentiler, ait oldukları bağımsız bölümün bütünleyici parçasıdır.
  Bu nedenle eklenti alanı (katsayısıyla) bölümün değerine eklenir.
- **6306 sayılı Kanun, m.6/1** (7/11/2023 tarihli 7471 s.K. ile değişik): riskli
  yapılarda yeniden yapım, kat karşılığı vb. kararlar "yapının paydaşı olup olmadıkları
  gözetilmeksizin sahip oldukları hisseleri oranında paydaşların salt çoğunluğu ile"
  alınır (değişiklikten önce "en az üçte iki"). Yıkım sonrası tescil "payları oranında"
  yapılır.

**Hesap:**

```
değer_i = birim_değer × (net_alan_i × k_kat × k_nitelik × k_cephe × k_manzara × k_konum × k_ek
                         + Σ eklenti_alanı × k_eklenti)
oran_i  = değer_i / Σ değer
pay_i   = en büyük kalan yöntemiyle round(oran_i × payda),  Σ pay_i = payda
```

Değerler `precision` (varsayılan 2) ondalığa yuvarlanıp tam sayıya çevrilir; tüm
paylaştırma tam sayı aritmetiğiyle yapılır. `payda="tam"` için payda
`Σw / ebob(w)` (indirgenmiş kesirlerin paydalarının EKOK'u) olur ve yuvarlama yoktur.
`min_share` (varsayılan 1) hiçbir bölümün sıfır pay almamasını sağlar.

En büyük kalan yöntemi: M. L. Balinski & H. P. Young, *Fair Representation*, 2. bs.,
Brookings Institution Press, 2001.

**Örnek katsayılar** (`tr-arsapayi katsayilar` ile tamamı görülebilir; hiçbiri mevzuattan
alınmamıştır): kat (1. kat = 1,00; zemin 0,95; 1. bodrum 0,80; üst katlarda 1,02–1,06),
dükkan için ayrı kat tablosu (zemin 1,00, 1. bodrum 0,60), nitelik (konut 1,00; dükkan
1,50; ofis 1,10; işyeri 1,20; depo 0,40; otopark 0,35), cephe (ön 1,05; yan 1,00; arka
0,97; köşe 1,08; iç 0,95), manzara (yok 1,00; kısmi 1,03; tam 1,08; deniz 1,12), konum
(normal 1,00; çatı dubleks 1,05; asansörsüz üst 0,97), eklenti eşdeğer alan katsayıları
(depo/kiler 0,25; kömürlük 0,20; otopark 0,35; garaj 0,40; bahçe 0,15; teras ve çatı
arası 0,30).

## Sınırlamalar

- Katsayılar örnektir; piyasa değerini yansıtmaları garanti edilmez. Değer esaslı
  hesap için en sağlam girdi, lisanslı değerleme uzmanının bölüm bazlı değerleridir
  (`deger` sütunu).
- Bir bağımsız bölümün birden çok paydaşı (hisseli mülkiyet) modellenmez; malik
  alanına tek bir ad yazılır.
- Kentsel dönüşüm karşılaştırması, eski arsa payını hak ediş ölçüsü olarak kullanır;
  sözleşmedeki ek bedeller, kira yardımı, KDV vb. hesaba katılmaz.
- Çoğunluk kontrolü yalnızca oran hesabıdır; tebligat, süre ve satış usulleri gibi
  6306 s.K. ve yönetmelik hükümleri kapsam dışıdır.
- Bu yazılım hukuki danışmanlık değildir; tapu tescili için proje müellifi, harita
  mühendisi ve ilgili idare ile çalışın.

## Akademik atıf

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

## Lisans

MIT Lisansı. Ayrıntılar için [LICENSE](https://github.com/YusufEminoglu/tr_arsapayi_sdk/blob/main/LICENSE).
İletişim: geospacephilo@gmail.com
