From 22ac604233f3ec20e9f9a883fc90725a97bd9124 Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Mon, 5 Oct 2026 01:15:46 +0300 Subject: [PATCH] =?UTF-8?q?fix(havuz):=20B8=20=E2=80=94=20KKTC=20uyruklu?= =?UTF-8?q?=20ve=20M.T.O.K.=20kontenjan=20sat=C4=B1rlar=C4=B1=20havuza=20g?= =?UTF-8?q?irmesin=20[KARAR]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit YÖK Atlas özel kontenjanları ayrı program satırı olarak veriyor; adında "(KKTC Uyruklu)" ya da "(M.T.O.K.)" geçen, taban sırası olan 118 satır herkesin aday havuzuna giriyordu (p02'de 54 programın 7'si). Sihirbaz uyruk ya da lise türü sormadığı için bu satırlar herkese önerilemez. Kural tek yerde ve export'lu: rapor-havuzu.ts → ozelKontenjanSatiriMi(). Kanıt (havuzdaki özel kontenjan satırı, önce → sonra): p02 7 → 0, p14 6 → 0, p05 4 → 0, p09 3 → 0, a09 3 → 0; 40 profilin hepsinde 0. Gevşetme basamağı ve liste uzunluğu hiçbir profilde değişmedi. /meraklisina şeması (aday havuzu düğümü), 4. bölüm anlatımı, aria-label ve figcaption aynı kuralla güncellendi. Co-Authored-By: Claude Fable 5.1 --- .../pazarlama/components/huni-semasi.tsx | 8 +++-- .../components/meraklisina-icerik.tsx | 7 ++-- src/lib/rapor-havuzu.ts | 32 +++++++++++++------ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/features/pazarlama/components/huni-semasi.tsx b/src/features/pazarlama/components/huni-semasi.tsx index 0bfc4f1..33579d9 100644 --- a/src/features/pazarlama/components/huni-semasi.tsx +++ b/src/features/pazarlama/components/huni-semasi.tsx @@ -17,7 +17,7 @@ flowchart TD A --> B("2. adım · İl seçimi
programı olan tüm iller, seçtiğin alanlardaki program sayısına göre yeniden sayılır") B --> C("3. adım · Devlet / Vakıf
sayılar hem alanı hem ili hesaba katar") C --> P("Danışmana söylediklerin
öğretim dili, uzaktan/örgün, burs, yıllık ücret sınırı, evden uzaklık — sohbette söyleyip kaydettiklerin varsa havuzu bunlar da süzer") - P --> H("Aday havuzu
elde kalan gerçek programlar — yalnızca en son tercih kılavuzunda yer alanlar
kapanan ya da kodu değişip eski kaydı kalan programlar önerilmez") + P --> H("Aday havuzu
elde kalan gerçek programlar — yalnızca en son tercih kılavuzunda yer alanlar
kapanan ya da kodu değişip eski kaydı kalan programlar önerilmez
yalnızca KKTC uyruklulara ya da meslek lisesi mezunlarına ayrılmış kontenjanlar da havuza girmez") H --> S{"Havuzda 24'ten az program mı kaldı?"} S -- "evet" --> G("Filtreler adım adım gevşetilir
önce danışmana söylediklerin, sonra il, sonra alan — listede açıkça belirtilir
seçimine uyan programlar havuzda kalır, boşluk sıralamana en yakın diğer programlarla dolar") G --> H @@ -45,11 +45,13 @@ export function HuniSemasi() { return ( Havuza yalnızca en son tercih kılavuzunda yer alan programlar girer; - kapanan ya da kodu değişip eski kaydı kalan programlar önerilmez. Her + kapanan ya da kodu değişip eski kaydı kalan programlar, yalnızca KKTC + uyruklulara ya da meslek lisesi mezunlarına ayrılmış kontenjanlar + önerilmez. Her adım havuzu biraz daha daraltır; danışmana söyleyip kaydettiğin tercihler de (dil, ücret, uzaklık gibi) havuzu süzer. Yapay zekâ listeyi bu havuzun{" "} diff --git a/src/features/pazarlama/components/meraklisina-icerik.tsx b/src/features/pazarlama/components/meraklisina-icerik.tsx index dabdec5..3925cb0 100644 --- a/src/features/pazarlama/components/meraklisina-icerik.tsx +++ b/src/features/pazarlama/components/meraklisina-icerik.tsx @@ -124,8 +124,11 @@ export function MeraklisinaIcerik() { verilir. Havuza yalnızca{" "} en son tercih kılavuzunda yer alan{" "} programlar girer: kapanmış ya da kodu değiştiği için eski kaydı - kalmış bir program sana önerilmez. Aşağıdaki şema akışın tamamını - gösterir — havuz 24'ün altına düşerse filtrelerin hangi + kalmış bir program sana önerilmez. Adında “KKTC + Uyruklu” ya da “M.T.O.K.” (meslek lisesi + mezunlarına ayrılmış) yazan kontenjanlar da havuza girmez; onlar + herkesin yazabileceği tercihler değildir. Aşağıdaki şema akışın + tamamını gösterir — havuz 24'ün altına düşerse filtrelerin hangi sırayla gevşetildiği (önce danışmana söylediklerin, sonra il, sonra alan), yine de yetmezse listenin eldeki programlarla, sana açıkça belirtilerek nasıl kurulduğu da dahil. Bir filtre diff --git a/src/lib/rapor-havuzu.ts b/src/lib/rapor-havuzu.ts index afedc75..2876199 100644 --- a/src/lib/rapor-havuzu.ts +++ b/src/lib/rapor-havuzu.ts @@ -176,6 +176,21 @@ function oncelikliBirlestir(...katmanlar: AdayProgram[][]): AdayProgram[] { return sonuc; } +// Program adının sonundaki kontenjan eki; YÖK Atlas bu kontenjanları ayrı +// program satırı olarak verir. +const OZEL_KONTENJAN = /\((KKTC Uyruklu|M\.T\.O\.K\.)\)/; + +/** + * Yalnızca belirli adaylara ayrılmış kontenjan satırı mı: "(KKTC Uyruklu)" + * KKTC vatandaşlarına, "(M.T.O.K.)" mesleki ve teknik ortaöğretim kurumu + * mezunlarına ayrılır. Sihirbaz adayın uyruğunu ya da lise türünü sormaz; bu + * satırlar herkese önerilemez, aday havuzuna girmez. Kural tek yerde: aynı + * ayrımı yapacak her yer (ör. danışman araçları) bunu kullanmalı. + */ +export function ozelKontenjanSatiriMi(isim: string): boolean { + return OZEL_KONTENJAN.test(isim); +} + function dilimEkle(r: { hayal: Program[]; dengeli: Program[]; @@ -227,17 +242,18 @@ export function havuzOlustur( // Bırakmazsa profil gevşetilir ve aşağıdaki sihirbaz akışı aynen sürer; // liste yine kurulur, gevşetme yapay zekâya ve adaya söylenir. const suzgec = profilSuzgeci(profil, iller.length > 0); + // Dilimin tamamı; özel kontenjan satırları (KKTC uyruklu, M.T.O.K.) hariç + const adaylar = (ozellik?: OzellikSuzgeci) => + dilimEkle( + havuzAdaylari(params.sira, params.tur, { uniturGrubu, ozellik }), + ).filter((p) => !ozelKontenjanSatiriMi(p.isim)); + const profilGevsetildi: Gevsetilen[] = []; // Profil gevşerse profile uyan (24'ten az) programlar yine en önde tutulur let profilliFiltreli: AdayProgram[] = []; if (suzgec.ozellik || suzgec.iller) { const profilliHam = ilFiltre( - dilimEkle( - havuzAdaylari(params.sira, params.tur, { - uniturGrubu, - ozellik: suzgec.ozellik, - }), - ), + adaylar(suzgec.ozellik), iller.length > 0 ? iller : suzgec.iller, ); profilliFiltreli = kategoriFiltre(profilliHam); @@ -251,9 +267,7 @@ export function havuzOlustur( } // 1. Tam filtre: üniversite tipi (SQL), iller + kategori (JS) - const ilsizHam = dilimEkle( - havuzAdaylari(params.sira, params.tur, { uniturGrubu }), - ); + const ilsizHam = adaylar(); const tamHam = ilFiltre(ilsizHam, iller); const tamFiltreli = kategoriFiltre(tamHam); const kirp = (...katmanlar: AdayProgram[][]) =>