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

@@ -11,14 +11,16 @@ export type Program = {
fakulte: string | null;
tur: string;
sure: number | null;
sira2025: number | null;
sira2024: number | null;
sira2023: number | null;
sira2022: number | null;
sira2021: number | null;
puan2025: number | null;
kontenjan2025: number | null;
yerlesen2025: number | null;
/** Taban sıralamaları; `YILLAR` (lib/veri-yillari) ile indeks hizalı. */
siraGecmisi: (number | null)[];
/** Son yılın sırası; o yıl verisi yoksa bir önceki yılınki. */
efektifSira: number | null;
// "Son" = en son yerleştirme yılı (SON_YIL). Alan adları bilinçli yılsız:
// yeni veri yılı yüklenince tip ve tüketiciler değişmez.
siraSon: number | null;
puanSon: number | null;
kontenjanSon: number | null;
yerlesenSon: number | null;
};
export const PUAN_TURLERI = {
@@ -42,11 +44,15 @@ export type RankResults = {
};
/**
* /sonuc ham tablosunun satırı: tablo `fakulte` ve `puan2025`'i hiç
* /sonuc ham tablosunun satırı: tablo `fakulte`, `puanSon` ve `siraSon`'u
* (dizinin son elemanı; tablo `efektifSira` + `siraGecmisi` ile çalışır) hiç
* kullanmadığı için bu alanlar client'a serileştirilmez (satır başına en
* uzun string alanlardan biri fakulte). Katalog sayfaları tam Program kullanır.
*/
export type ProgramListeSatiri = Omit<Program, "fakulte" | "puan2025">;
export type ProgramListeSatiri = Omit<
Program,
"fakulte" | "puanSon" | "siraSon"
>;
export type RankResultsListe = {
hayal: ProgramListeSatiri[];