personel
12 uç · /api/musavir/v1/personel
İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 12 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.
Personel ekle. **Koltuk kotası** (musavir.staff_seats) burada zorlanır: kota dolduysa
403 MUSAVIR/CAP/1 (upsell). Kota kapısı YAZMADAN ÖNCE — aksi halde plan aşılır ve
geri alınması gereken bir kayıt doğar.
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /personel/{id}/atamalar — personelin portföyünü TOPLU kur/boşalt.
id🔴 **ATAMA GÖRÜNÜRLÜK AÇAR** (mukellef::gorunurluk) — yani atamak, YETKİ VERMEKTİR.
Bu yüzden iki kapı birden gerekir ve ikisi de "veremediğini veremezsin" der:
1. **Hedef personel** çağıranın kapsamında olmalı (kapsamda_mi → 404). Değilse
yönetici, göremediği birine portföy açardı.
2. **Her müvekkil** çağıranın kapsamında olmalı — **hepsi ya da hiçbiri**
(hepsi_gorunur_mu → 403). Kapsam dışı olanları sessizce ELEMEK cazip görünür ama
yanlış: yanıt "42 müvekkil atandı" derken kullanıcı 50 sanır ve farkı ASLA görmez
(mukellef::hepsi_gorunur_mu doküman notunun birebir gerekçesi).
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/<id>/atamalar" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}Personelin birim kapsamını ayarla — çekirdek set_member_scope_by'a proxy. Personelin
iduser_ref'i üstünden çalışır; kayıt çekirdekte (core.tenant_users.data_scope +
core.member_locations) tutulur.
🔴 **BU UÇ KAPSAM DAĞITIR** ve iki kapısı birden eksikti (MÜF21 Paket 1 · BLE22-8796):
1. **Hedef kapsam körüydü.** personel_user_ref yalnız tenant-RLS'ten geçer; location
kapsamlı bir yönetici BAŞKA şubenin personelinin kapsamını düzenleyebiliyordu.
Çare atama_ekle_hin (BLE-7192) kapısının aynısı: kapsamda_mi → 404.
2. **Yükseltme kapısı yoktu.** Çağıran kendine all yazabiliyordu; kapı artık
çekirdekte, tek yazarın üstünde (scope::set_member_scope_by).
⚠️ İki kapı AYNI SORUYU sormaz ve biri öbürünün yerine geçmez: birincisi *"bu personeli
yönetebilir misin"*, ikincisi *"bu kapsamı verebilir misin"*. Yalnız birincisi olsaydı
yönetici KENDİ kaydına all yazardı (kendisi her zaman kendi kapsamındadır).
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/<id>/birimler" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /personel/{id}/erisim — **"bu personel hangi müvekkili görüyor ve NEDEN?"**
idKapsam motoru (data_scope + atama + vekâlet) baştan beri vardı ve MÜF21 Paket 0'da DB'ye
de indirildi; eksik olan onu YÖNETENİN görebileceği bir yüzeydi. Atama yalnız MÜKELLEF
ekseninde açılabiliyordu (/mukellefler/{id}/atama) — yani "yeni personelin portföyünü
kur" işi 200 müvekkili tek tek açmak demekti, "bu kişi neyi görüyor?" sorusunun ise
cevabı YOKTU. Erişimi denetleyemeyen bir yönetici onu yönetemez.
🔴 **LİSTE ÇAĞIRANIN KAPSAMIYLA KESİŞİR.** Hedef personel all kapsamlıysa listesi
büronun TAMAMIDIR; onu olduğu gibi basmak, dar kapsamlı bir yöneticiye göremediği
müvekkillerin unvan+VKN'sini vermek olurdu — erişim raporunun kendisi bir sızıntıya
dönüşürdü. Kesişim alınır ve **gizlenen sayısı SÖYLENİR** (gizlenen): "boş liste"
ile "senin göremediğin N kayıt var" farklı cevaplardır (beyanname_parti::parti_getir
ile aynı doktrin).
# Errors
Kapsam dışı/olmayan personel → 404.
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/<id>/erisim" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}Personel-ayrılış portföy devri (BLE-7512). {id} = ayrılan personel; devralan = hedef.
idcurl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/<id>/portfoy-devir" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}Vekâlet ata. {id} = asıl personel (izinli/tatilde olan). İK/portföy kararı → personel.manage.
idcurl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/<id>/vekil" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}"Personel ekle" adaylarını listele. Yalnız yönetici (personel.manage) görür — aday listesi
eklemeden önce bakılan bir şeydir; salt-görüntüleyene sunmak yapamayacağı bir işi teklif ederdi.
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/aday-uyeler" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}Resmî takvimle karşılaştırma — **HİÇBİR ŞEY YAZMAZ**.
🔴 Eski POST …/senkron ucu KALDIRILDI. "Senkron" kelimesi bir yazma vaat ediyordu ve
bağlandığında gerçekten yazacak biçimde okunuyordu; oysa kaynak "uzatıldı" demediği için
yazmaya yetecek bilgi HİÇBİR ZAMAN gelmeyecek (takvim_kaynak modül belgesi). Uç adıyla
birlikte doğru hâline getirildi: GET …/oneriler bir SORU sorar.
İzin ayarlar.manage: öneri yalnız o izne sahip biri tarafından uygulanabilir ve tur
dışarıya 1-5 HTTP isteği çıkarır.
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/atama-onerisi" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /personel/secim — sözleşme müşaviri seçici/çözücü listesi. Kapı mukellef.view
(müşavir bir sözleşme alanı); kapsam süzgeci [list] ile aynı; ad çekirdekten çözülür.
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/personel/secim" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}