diff --git a/src/features/liste/liste-store.ts b/src/features/liste/liste-store.ts index cd74bdb..26167dc 100644 --- a/src/features/liste/liste-store.ts +++ b/src/features/liste/liste-store.ts @@ -152,9 +152,11 @@ export function sunucuylaBirlestir(sunucuItems: ManuelTercih[]): ManuelTercih[] liste = [...liste, ...ekler].slice(0, MANUEL_LISTE_MAX); kaydet(); yayinla(); - // Başka cihazda profilsiz eklenmiş kayıtlar risksiz gelir; profil lokalde - // zaten varsa PROFIL_DEGISTI_EVENT yayılmaz, riski burada doldur. - if (liste.some((t) => t.risk == null)) riskleriYenile(); + // Sunucudan gelen kayıtların riski başka cihazın o günkü tabanına göredir + // (ya da profilsiz eklendiyse hiç yoktur); sunucu tabanı tazeler ama riski + // yenilemez. Profil lokalde varsa hepsini güncel tabanla yeniden hesapla + // (profil yoksa riskleriYenile zaten işlem yapmaz). + riskleriYenile(); return liste; } diff --git a/src/lib/db.ts b/src/lib/db.ts index 97744cc..0d3b1be 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -210,6 +210,14 @@ export function netlerGetir(programId: string): ProgramNetSatiri[] { .all(programId) as ProgramNetSatiri[]; } +/** Güncel kılavuzdaki tek program; arşivlenmiş ya da bilinmeyen id'de null. */ +export function programGetir(id: string): Program | null { + const row = getDb() + .prepare(`SELECT ${SELECT_COLS} FROM programs WHERE id = ?`) + .get(id) as ProgramHamSatiri | undefined; + return row ? programSatiri(row) : null; +} + /** * Kayıtlı manuel liste satırlarının güncel efektif sırası (son yıl, yoksa bir * önceki). Kayıtlar efektif sırayı ekleme anının snapshot'ı olarak taşır; yeni diff --git a/src/lib/tadimlik-havuzu.ts b/src/lib/tadimlik-havuzu.ts index 90071fb..70412cf 100644 --- a/src/lib/tadimlik-havuzu.ts +++ b/src/lib/tadimlik-havuzu.ts @@ -10,7 +10,8 @@ import type { Dilim } from "./rapor-havuzu"; import type { RaporSonuc } from "@/features/rapor/types/rapor"; import { dilimdenRisk, riskHesapla, riskNotuMetni } from "./risk"; import { trendOzetiMetni } from "./trend"; -import { VERI_YIL_SAYISI } from "./veri-yillari"; +import { ILK_YIL, VERI_YIL_SAYISI } from "./veri-yillari"; +import { programGetir } from "./db"; /** Sihirbaz kategorisi seçilmemiş kullanıcı için kova×tür başına fallback satır. */ export const GENEL_KATEGORI = "genel"; @@ -123,7 +124,18 @@ export async function tadimlikSec( ), }); if (satir && gerekceServisEdilebilir(satir.gerekce)) { - const program = satir.program as RaporSonuc["programlar"][string]; + // Havuz batch'te üretilir ve yeni yerleştirme yılı yüklenince bayatlar: + // snapshot'taki taban/geçmiş yerine CANLI veri servis edilir ki örnek + // satır aynı sayfadaki tabloyla çelişmesin. Güncel kılavuzdan çıkmış + // (arşivlenmiş) program örnek gösterilmez — sıradaki kategoriye düşülür. + const canli = programGetir(satir.programId); + if (!canli) continue; + const program: RaporSonuc["programlar"][string] = { + ...(satir.program as RaporSonuc["programlar"][string]), + efektifSira: canli.efektifSira, + siraGecmisi: canli.siraGecmisi, + ilkYil: ILK_YIL, + }; return { programId: satir.programId, dilim: satir.dilim,