feat(veri): Program tipi yılsız — db eşleyicisi, lib ve snapshot ilkYil (P-B a)

Program artık siraGecmisi (YILLAR ile hizalı) + efektifSira + siraSon/puanSon/
kontenjanSon/yerlesenSon taşır. db.ts kolonları YILLAR'dan üretip takma adla
seçer, programSatiri eşleyicisi ham satırı Program'a çevirir; SELECT_COLS'un
üç tüketicisi de eşleyiciden geçer. EFEKTIF_SIRA veri-yillari'dan gelir.

- trend: ILK_YIL tek kaynaktan, opsiyonel ilkYil parametresi
- rapor snapshot'ına opsiyonel ilkYil yazılır (eski kayıtlar: okurken ILK_YIL)
- rapor promptu son 4 yılı göndermeye devam eder, anahtarlar dinamik
- tadımlık "son N yıl" filtresi genel: N != VERI_YIL_SAYISI ise servis edilmez
- veri-kapsami VERI_YIL_SAYISI'nı veri-yillari'dan türetir

Bileşenler bir sonraki commit'te yeni tipe geçer (ikisi birlikte derlenir).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 17:00:39 +03:00
parent 38e02e0ed9
commit ce40b7c5b3
14 changed files with 195 additions and 106 deletions

View File

@@ -28,8 +28,7 @@ export type BekleyenProgram = {
| "il"
| "unitur"
| "tur"
| "sira2025"
| "sira2024"
| "efektifSira"
>;
kaynak: ManuelKaynak;
adaySira?: number;

View File

@@ -8,7 +8,8 @@ import type {
UniturGrubu,
} from "@/types/yokatlas";
// Tabloda kullanılmayan alanlar (fakulte, puan2025) client'a serileşmesin.
// Tabloda kullanılmayan alanlar (fakulte, puanSon, siraSon) client'a
// serileşmesin.
// Alanlar tek tek seçilir: Program'a alan eklenirse ProgramListeSatiri
// üzerinden derleyici burada da karar vermeye zorlar.
export function programOzetle(p: Program): ProgramListeSatiri {
@@ -20,13 +21,10 @@ export function programOzetle(p: Program): ProgramListeSatiri {
il: p.il,
tur: p.tur,
sure: p.sure,
sira2025: p.sira2025,
sira2024: p.sira2024,
sira2023: p.sira2023,
sira2022: p.sira2022,
sira2021: p.sira2021,
kontenjan2025: p.kontenjan2025,
yerlesen2025: p.yerlesen2025,
siraGecmisi: p.siraGecmisi,
efektifSira: p.efektifSira,
kontenjanSon: p.kontenjanSon,
yerlesenSon: p.yerlesenSon,
};
}

View File

@@ -158,10 +158,8 @@ export function sunucuylaBirlestir(sunucuItems: ManuelTercih[]): ManuelTercih[]
return liste;
}
export function efektifSiraAl(
p: Pick<Program, "sira2025" | "sira2024">,
): number | null {
return p.sira2025 ?? p.sira2024 ?? null;
export function efektifSiraAl(p: Pick<Program, "efektifSira">): number | null {
return p.efektifSira ?? null;
}
/** Program satırını manuel liste kaydına çevirir. */
@@ -174,8 +172,7 @@ export function programdanManuelTercih(
| "il"
| "unitur"
| "tur"
| "sira2025"
| "sira2024"
| "efektifSira"
>,
adaySira?: number | null,
kaynak: ManuelKaynak = "sonuc",

View File

@@ -34,8 +34,13 @@ export type RaporSonuc = {
// ayıklamak için (bkz. features/rapor/rapor-queries.ts)
devMock?: boolean;
// Render için havuzdan zenginleştirilmiş program bilgisi
// efektifSira: COALESCE(sira2025, sira2024) — eski kayıtlı raporlarda yok
// siraGecmisi: [2021..2025] taban sıralamaları — deterministik trend oku
// efektifSira: üretim anındaki son yılın sırası, yoksa bir önceki yılınki —
// eski kayıtlı raporlarda yok
// siraGecmisi: [ilkYil..] taban sıralamaları — deterministik trend oku.
// Uzunluk üretim anındaki veri penceresidir (eski kayıtlarda 5 eleman);
// okuyan taraf diziyi doldurmaz, yılı `ilkYil + indeks` ile bulur.
// ilkYil: dizinin ilk elemanının yılı — eski kayıtlarda yok (okurken
// lib/veri-yillari ILK_YIL)
programlar: Record<
string,
{
@@ -45,6 +50,7 @@ export type RaporSonuc = {
unitur: string | null;
efektifSira?: number | null;
siraGecmisi?: (number | null)[];
ilkYil?: number;
}
>;
};