v2 #10

Merged
bilal merged 34 commits from v2 into main 2026-10-11 01:38:50 +03:00
3 changed files with 24 additions and 0 deletions
Showing only changes of commit 10b3e5bd50 - Show all commits

View File

@@ -41,6 +41,7 @@ import {
SATIR_BUTON_HUCRE, SATIR_BUTON_HUCRE,
SATIR_DUGME_BOYU, SATIR_DUGME_BOYU,
SATIR_ALT_GRUP, SATIR_ALT_GRUP,
SATIR_CIP,
SATIR_IKINCIL_LINK, SATIR_IKINCIL_LINK,
SATIR_META, SATIR_META,
SATIR_MOBIL_SAYI, SATIR_MOBIL_SAYI,
@@ -267,6 +268,10 @@ export function RaporListesi({
unitur={p?.unitur} unitur={p?.unitur}
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
/> />
{/* Burs/dil/öğretim türü: aynı adlı satırları ayırt eder (§4.15 çip) */}
{p?.varyant ? (
<span className={SATIR_CIP}>{p.varyant}</span>
) : null}
{p?.il ? ( {p?.il ? (
<Link <Link
href={ilSayfaHref(p.il)} href={ilSayfaHref(p.il)}

View File

@@ -2,6 +2,8 @@ import "server-only";
import { desc, eq, sql } from "drizzle-orm"; import { desc, eq, sql } from "drizzle-orm";
import { appDb, schema } from "@/lib/appdb"; import { appDb, schema } from "@/lib/appdb";
import { anahtarVar } from "@/lib/ai/client"; import { anahtarVar } from "@/lib/ai/client";
import { programOzellikleriGetir } from "@/lib/program-ozellik";
import { varyantEtiketi } from "@/lib/program-varyant";
import type { RaporSonuc } from "./types/rapor"; import type { RaporSonuc } from "./types/rapor";
// Rapor feature'ının sorgu kapısı: kayıtlı rapor, sohbet geçmişi ve girişsiz // Rapor feature'ının sorgu kapısı: kayıtlı rapor, sohbet geçmişi ve girişsiz
@@ -37,9 +39,23 @@ export async function kullanicininRaporu(userId: string) {
where: eq(schema.reports.userId, userId), where: eq(schema.reports.userId, userId),
}); });
if (satir?.result && bayatMockMu(satir.result as RaporSonuc)) return null; if (satir?.result && bayatMockMu(satir.result as RaporSonuc)) return null;
if (satir?.result) varyantlariEkle(satir.result as RaporSonuc);
return satir ?? null; return satir ?? null;
} }
// Kayıtlı raporun program satırlarına burs/dil/öğretim türü etiketi (okuma
// anında, tek sorgu): rapor JSON'u üretim anında bunu taşımıyor, eski
// kayıtlar da bu yoldan kazanır. yokatlas.db salt okunur; app.db'ye yazılmaz.
function varyantlariEkle(sonuc: RaporSonuc): void {
const idler = Object.keys(sonuc.programlar ?? {});
if (idler.length === 0) return;
const ozellikler = programOzellikleriGetir(idler);
for (const id of idler) {
const o = ozellikler[id];
sonuc.programlar[id].varyant = o ? varyantEtiketi(o) : null;
}
}
/** /**
* Kullanıcının danışman sohbet geçmişi: en YENİ 100 mesaj, eskiden yeniye. * Kullanıcının danışman sohbet geçmişi: en YENİ 100 mesaj, eskiden yeniye.
* created_at saniye çözünürlüklü; aynı saniyedeki soru-cevap sırası rowid ile * created_at saniye çözünürlüklü; aynı saniyedeki soru-cevap sırası rowid ile

View File

@@ -58,6 +58,9 @@ export type RaporSonuc = {
efektifSira?: number | null; efektifSira?: number | null;
siraGecmisi?: (number | null)[]; siraGecmisi?: (number | null)[];
ilkYil?: number; ilkYil?: number;
/** Burs/dil/öğretim türü etiketi; DB'ye yazılmaz, okuma anında
* program_ozellik'ten eklenir (rapor-queries kullanicininRaporu) */
varyant?: string | null;
} }
>; >;
}; };