fix(havuz): B8 — KKTC uyruklu ve M.T.O.K. kontenjan satırları havuza girmesin [KARAR]

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 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-10-05 01:15:46 +03:00
parent 497b0247a0
commit 22ac604233
3 changed files with 33 additions and 14 deletions

View File

@@ -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[][]) =>