Müşavir

portal

66 uç · /api/musavir/v1/portal

İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 66 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.

GET/api/musavir/v1/portal/alici-sicil

Alıcının e-Fatura mükellefiyeti — **öneri**, karar değil.

Oturum

🔴 Canlı GİB sorgusu MÜF22'de bağlanır; bugün yalnız büronun daha önce doğruladığı **önbellek** okunur ve bayat kayıtta öneri VERİLMEZ. Ekran "şunu kes" diyorsa kullanıcı sorgulamaz, güvenir — ve mükellefiyeti değişmiş bir alıcıda GİB faturayı reddeder. ⚠️ musavir.gib_sicil apply_staff_onlydır ve bu okuma bilinçli olarak begin_staff_ro ile yapılır: tablo mükellef VERİSİ değil, **büro geneli referans**tır (bir VKN'nin e-Fatura mükellefi olup olmadığı GİB'in kamuya açık listesidir). Portala açılmadı — açılsaydı mukellef_ref kolonu olmayan bir tabloya portal politikası yazmak gerekirdi ve o politika hiçbir satırı elemezdi.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/alici-sicil" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/beklenen

Müvekkilin kendi beklenti listesi.

Oturum

🔴 Eksiklik yüklemi **personel ekranıyla AYNI sabitten** gelir ([crate::beklenen::EKSIK_IFADESI]). İkinci bir kopya yazsaydık portal "gönderdim" derken büro "gelmedi" görebilirdi — iki taraf aynı cümleyi okumak zorunda. Muaf tutulan beklenti listeye GİRMEZ: büro "bu dönem beklemiyoruz" dediyse müvekkile hâlâ istiyormuş gibi görünmek yanlış bilgidir.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/beklenen" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/belge/toplu

Tek istekte birden çok belge — **dosya başına sonuç**.

Oturum

🔴 Neden ayrı bir uç var (istemcinin dosyaları tek tek göndermesi yerine): bildirim. Tekil uç her belgede büroya bir zil çalar; çoklu seçim onu bildirim fırtınasına çevirirdi ([yukleme_bildir] notu). Toplulaştırma ancak sunucunun "bunlar bir seçimdi" bilgisi varsa yapılabilir. 🔴 Neden HEPSİ-ya-da-HİÇBİRİ DEĞİL: girdi 12 ayrı fiş fotoğrafıdır; 7.'si okunamıyor diye 11 sağlam belgeyi geri çevirmek müvekkilin işini durdururdu. Şart şu — **hiçbir dosya sessizce düşmez**: her dosya için satır döner, hatalının sebebi yazılır ([crate::belge::toplu_arsivle] sözleşmesi). Gövde tavanı ([crate::belge::AZAMI_YUKLEME_GOVDE_BAYT]) TEK dosyanın tavanıyla aynıdır: istemci seçimi tavana sığan paketlere böler, büyük dosyayı tek başına yollar. İkinci bir tavan yazmak, aynı sorunun iki farklı cevabı olurdu.

İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/belge/toplu" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/belge/yukle

🔴 Portal, **personelinkiyle AYNI** belge::arsivle yolunu kullanır — portala özel bir

Oturum

kısayol YOKTUR. O yol şunları zaten yapıyor: magic-byte doğrulaması (uzantı yalan söyler), içerik-adresli dedup (aynı belge iki kez kota tüketmez), kota kontrolü YAZMADAN ÖNCE. Portal için ayrı bir yol yazsaydık, bu korumaların hepsini yeniden — ve eksik — yazardık.

İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/belge/yukle" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/belgelerim

Müvekkilin kendi belgeleri + onay durumu.

Oturum

🔴 Onay GEÇMİŞİ dönmez (belge_onay_gecmisi portala kapalı): defter, kararı kimin verdiğini ve büro içindeki fikir değişikliklerini taşır. Müvekkilin görmesi gereken şey büronun iç muhakemesi değil, GÜNCEL karar ve gerekçesidir.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/belgelerim" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/beyannameler

Bakiye + defter.

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/beyannameler" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/beyannameler/{id}

Bir beyannamenin mükellefe görünen tam hâli.

OturumYol parametresi: id

🔴 404 mesajı "yetkiniz yok" DEMEZ ve dememeli: RLS satırı zaten elediği için başka bir müvekkilin beyannamesi ile hiç var olmayan bir id **ayırt edilemez** — ayırt edilebilseydi uç, "bu büroda şu id'de bir beyanname var mı" sorusunu cevaplayan bir sızıntı olurdu.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/beyannameler/<id>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/beyannameler/{id}/pdf

Pdf

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/beyannameler/<id>/pdf" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/bildirim

Ayar

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bildirim" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/bildirim/abonelik

Abone ol

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bildirim/abonelik" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
DELETE/api/musavir/v1/portal/bildirim/abonelik

Abonelikten cik

Oturum
İstek
curl -X DELETE "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bildirim/abonelik" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/bordro-donemleri

Donemler

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bordro-donemleri" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/bordro-donemleri/{donem}/pusula.pdf

Bir dönemin TÜM pusulaları — tek çok sayfalı PDF.

OturumYol parametresi: donem

İşveren için bu bir yükümlülüktür (İş K. m.37: pusula İŞVEREN tarafından verilir), bu yüzden toplu çıktı portalda da vardır. Biçim personelinkiyle AYNI ([crate::pusula::pdf]): zip DEĞİL tek dosya — yapılacak iş bu dosyayı yazdırmaktır ve 40 ayrı dosyayı tek tek açmak yapılmayan iş hâline gelir.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bordro-donemleri/<donem>/pusula.pdf" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/bordrolar

Bakiye + defter.

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bordrolar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/bordrolar/{id}

Bir beyannamenin mükellefe görünen tam hâli.

OturumYol parametresi: id

🔴 404 mesajı "yetkiniz yok" DEMEZ ve dememeli: RLS satırı zaten elediği için başka bir müvekkilin beyannamesi ile hiç var olmayan bir id **ayırt edilemez** — ayırt edilebilseydi uç, "bu büroda şu id'de bir beyanname var mı" sorusunu cevaplayan bir sızıntı olurdu.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bordrolar/<id>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/bordrolar/{id}/pusula.pdf

Pusula pdf

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/bordrolar/<id>/pusula.pdf" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/cariler

Müvekkilin cari kartları.

Oturum

⚠ Bakiyeler TEK sorguda çekilir (N+1 yok): 200 kartlı bir müvekkilde kart başına bakiye sorgusu açmak ekranı saniyelerce bekletirdi.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/cariler" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/cariler/{id}/ekstre

Ekstre

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/cariler/<id>/ekstre" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/cariler/{id}/ekstre/pdf

Ekstre pdf

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/cariler/<id>/ekstre/pdf" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/duyurular

Portal liste

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/duyurular" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/duyurular/{id}/okundu

🔴 Bu uç YAZMAdır ve portal_yetki matrisi onu yalnız tam yetkiye açar — kasıtlı ve

OturumYol parametresi: id

mig 1659'un okundu_at gerekçesinin aynısı: damga büronun ekranında *"müvekkil gördü"* diye bir İDDİA üretir. Salt-okunur bir ortağın ya da dış denetçinin ekranı açması, o iddiayı firma adına doğrulamaz.

İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/duyurular/<id>/okundu" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/duyurular/okunmamis

Portal okunmamis

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/duyurular/okunmamis" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/ekstre

Tüm carilerin SON hareketleri — bir özet akışıdır, **ekstre değildir**.

Oturum

🔴 Yürüyen bakiye BİLEREK YOK: birden çok hesabın hareketleri iç içe geldiğinde "yürüyen bakiye" diye bir şey yoktur ve uydurulan bir sütun, ekstre sanılıp mutabakata sokulurdu. Bakiye tek hesabın ekstresinde ([ekstre_h]) yürür.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/ekstre" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/fatura

Fatura kes

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/fatura" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/faturalar

Bakiye + defter.

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/faturalar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/faturalar

Kes

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/faturalar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/faturalar/{id}

Bir beyannamenin mükellefe görünen tam hâli.

OturumYol parametresi: id

🔴 404 mesajı "yetkiniz yok" DEMEZ ve dememeli: RLS satırı zaten elediği için başka bir müvekkilin beyannamesi ile hiç var olmayan bir id **ayırt edilemez** — ayırt edilebilseydi uç, "bu büroda şu id'de bir beyanname var mı" sorusunu cevaplayan bir sızıntı olurdu.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/faturalar/<id>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/musavir/v1/portal/faturalar/{id}

Taslağı yeniden yaz (başlık + satırların TAMAMI).

OturumYol parametresi: id

🔴 Yalnız TASLAK. Onaylı fatura resmî belgedir: düzeltilmez, **iptal edilir ya da iade faturası kesilir** (0723 · DB trigger'ıyla da zorlu). Portal o kuralı delmez. 🔴 Satırlar silinip yeniden yazılır, tek tek yamalanmaz — "başlık satırlardan TÜRETİLİR" değişmezi kısmi güncellemede kırılırdı ([crate::satis_fatura::taslak_guncelle]'nin kendi gerekçesi). Bu yüzden gövde, kesme gövdesiyle AYNI şekildedir.

İstek
curl -X PATCH "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/faturalar/<id>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/faturalar/{id}/onayla

Onayla

OturumYol parametresi: id
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/faturalar/<id>/onayla" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/finansal-ozet

Uyum özeti — BÜRO GENELİ sayılar.

Oturum

🔴 aktarim_uyum_ozeti security definerdır: kapsam kilidi DETAYI gizler (bir müvekkilin adı, onu göremeyen personele sızmaz) ama uyum SAYISI eksik okunmamalıdır. Kapsamlı bir personel "3 dayanaksız aktarım" yerine "0" görseydi, gördüğü sıfır bir güvence olurdu — P7'nin 72 saat sayacının birebir aynı ayrımı. Fonksiyon hiçbir müvekkil kimliği döndürmez.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/finansal-ozet" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/kdv-durumu

Kdv

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/kdv-durumu" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/kullanici-davetleri

Portal davet

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/kullanici-davetleri" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/kullanici-davetleri/{id}/iptal

Portal davet iptal

OturumYol parametresi: id
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/kullanici-davetleri/<id>/iptal" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/kullanicilar

Portal gorunum

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/kullanicilar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/musavir/v1/portal/kullanicilar/{id}

Portal kullanici

OturumYol parametresi: id
İstek
curl -X PATCH "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/kullanicilar/<id>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/kvkk/aydinlatma

GET /portal/kvkk/aydinlatma — müvekkil yürürlükteki metni OKUR.

Oturum

Taslak ve gelecek tarihli sürümler RLS'te elenir (mig 1730); handler ikinci bir yüklem YAZMAZ — iki yerde iki kural olsaydı biri gevşediğinde diğerinin koruduğu sanılırdı.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/kvkk/aydinlatma" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/makbuz-oranlari

e-SMM stopaj kodları — FE seçicisinin kaynağı.

Oturum

🔴 Katalog KODDA (STOPAJ_ORANLARI) ve ekran onu SUNUCUDAN alır. FE'ye kopyalansaydı oran bir Cumhurbaşkanı kararıyla değiştiği gün iki taraf ayrışır ve müvekkil ekranda gördüğünden farklı bir oranla belge keserdi.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/makbuz-oranlari" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/makbuzlar

Makbuz liste

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/makbuzlar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/makbuzlar

Makbuz kes

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/makbuzlar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/makbuzlar/{id}/onayla

Makbuz onayla

OturumYol parametresi: id
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/makbuzlar/<id>/onayla" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/marka

Portal oku

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/marka" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/me

Mükellef-portal düzleminin kanıt ucu (BLE-6927): portal kullanıcısının çözülmüş mükellef

Oturum

kimliğini döner. mukellef_id **client-input değildir** — sunucuda portal_users eşlemesinden türetilir; istemci onu seçemez. MÜF17 gerçek portal uçlarını bu düzleme ekler.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/me" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/mesaj

Portal mesaj gonder

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/mesaj" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/mesajlar

Portal yazisma

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/mesajlar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/mesajlar/okundu

🔴 Bu uç YAZMAdır ve portal_yetki matrisi onu yalnız tam yetkiye açar — kasıtlı ve

Oturum

mig 1659'un okundu_at gerekçesinin aynısı: damga büronun ekranında *"müvekkil gördü"* diye bir İDDİA üretir. Salt-okunur bir ortağın ya da dış denetçinin ekranı açması, o iddiayı firma adına doğrulamaz.

İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/mesajlar/okundu" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/nakit-ozet

Portal (müvekkil) düzlemi: **yalnız kendi** satırı.

Oturum

🔴 mukellef_id OTURUMDAN gelir, gövdeden değil (portal.rs'in değişmezi) ve görünürlük [Gorunurluk::tek_mukellef] ile en dar hâline kilitlenir. Burada buro_geneli() kullanmak müvekkile bütün büronun kasasını açmak olurdu.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/nakit-ozet" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/odeme/{token}

🔴 Portal ucu token'ı yol parametresinden alır ama kimliği DE doğrular: linki ele geçiren

OturumYol parametresi: token

biri, o faturanın müvekkili olarak oturum açmış olmadıkça özeti göremez. Token tek başına yeterli sayılsaydı, e-postası yönlendirilen bir müvekkilin ücreti üçüncü kişiye açılırdı.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/odeme/<token>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/odeme/{token}/baslat

Portal baslat

OturumYol parametresi: token
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/odeme/<token>/baslat" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/odeme/islem/{islem_no}

Müvekkilin ödeme sonrası tekrar SORDURMA ucu (oturumlu).

OturumYol parametresi: islem_no

🔴 Sağlayıcının bildirimi gecikebilir ya da hiç gelmeyebilir; müvekkil ekranda *"ödedim ama görünmüyor"* ile kalmamalı. Bu uç bir SONUÇ BİLDİRMEZ — sağlayıcıya sordurur ([sonuc_isle]) ve otorite yine sağlayıcıdır. Kimlikli olduğu için soğumaya tabi değil.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/odeme/islem/<islem_no>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/onay

Onayla

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/onay" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/onay-talepleri

Portal: "onayınız bekleniyor" listesi.

Oturum

🔴 gecersiz_kilan_ref is null: yürürlükten kalkmış (düzeltmeyle geçersiz kılınmış) bir beyanname için onay istemek, artık verilmeyecek bir beyanı onaylatmaktır. P2 aynı tuzağı liste ucunda ödemişti; talep listesi onun ikizidir. 🔴 Cevaplanmış talep listede DURMAZ ([talep_bekliyor]) ama silinmez: büro talebi geri çekmedikçe damga yerinde kalır ve "ne zaman soruldu" sorusunun cevabı korunur.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/onay-talepleri" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/onay/durum

Bir konunun onay durumu — **bayat onayı da söyler**.

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/onay/durum" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/randevular

Portal liste

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/randevular" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/randevular

Portal olustur

Oturum
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/randevular" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/musavir/v1/portal/randevular/{id}

Portal iptal

OturumYol parametresi: id
İstek
curl -X PATCH "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/randevular/<id>" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/sgk-bildirimleri

Sgk

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/sgk-bildirimleri" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/sozlesme-notlari

Portal list

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/sozlesme-notlari" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/sozlesmeler

Portal: müvekkilin kendi sözleşmeleri + imza hâli.

Oturum

🔴 Bu liste 8559'un eksik yarısıydı. imza::portal_list_h (/portal/sozlesmeler/{id}/imza) 1072'den beri duruyordu ama müvekkilin o {id}yi öğreneceği hiçbir uç yoktu: kapı vardı, kapının önüne çıkan yol yoktu. taslak sözleşme LİSTEDE YOKTUR — büronun hazırladığı, henüz yürürlüğe alınmamış bir metni müvekkile göstermek taslak beyanname/bordro kararıyla aynı sınıftır.

İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/sozlesmeler" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/sozlesmeler/{id}/imza

Portal list

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/sozlesmeler/<id>/imza" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/sozlesmeler/{id}/vis

Portal oku

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/sozlesmeler/<id>/vis" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/sozlesmeler/{id}/vis/onay

Müvekkil kendi VİS ekini kabul eder ya da reddeder.

OturumYol parametresi: id
İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/sozlesmeler/<id>/vis/onay" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/tebligatlar

Bakiye + defter.

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/tebligatlar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/ucret

Bakiye + defter.

Oturum
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/ucret" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/ucret/{id}/dekont

Dekont

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/ucret/<id>/dekont" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/musavir/v1/portal/ucret/{id}/odeme

Müvekkil KENDİ açık faturası için ödeme linki üretir.

OturumYol parametresi: id

🔴 **ÖNCE DOĞRULA, SONRA YAZ.** Sahiplik begin_mukellef_ro altında sorulur ve ancak ondan sonra personel düzleminde link üretilir. Ters sıra (önce üret, sonra sahiplik kontrolü) bu depoda daha önce bir bypass'a yol açtı (odeme-kunye-kapisi) ve P6'da aynı hatanın "commit'ten SONRA karşılaştır" hâli görüldü. 🔴 Tutar İSTEMCİDEN ALINMAZ: link_olustura None geçilir ve o, faturayı KİLİTLEYİP kalan borcu kendisi hesaplar (fazla-ödeme kapısı orada). İstemcinin gönderdiği bir tutar, kısmen ödenmiş bir faturada müvekkile ikinci kez TAM tutarı ödetebilirdi — P9'un kapatmaya çalıştığı yaranın ta kendisi.

İstek
curl -X POST "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/ucret/<id>/odeme" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/musavir/v1/portal/ucret/{id}/tahsilatlar

Dokum

OturumYol parametresi: id
İstek
curl -X GET "https://{slug}.musavir.blesyum.app/api/musavir/v1/portal/ucret/<id>/tahsilatlar" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
Bu sayfa işine yaradı mı?