fix(kredi): paketliden liste ve revizyon kredisi düşmez #6

Merged
bilal merged 2 commits from odeme/paket-vaadi into main 2026-09-22 23:34:44 +03:00
Showing only changes of commit 4acfd27ab1 - Show all commits

View File

@@ -149,10 +149,18 @@ async function listeOlusturKilitli(
params: RaporParams,
requestId: string,
): Promise<ListeSonuc> {
// Paket vaadi (docs/urun/vizyon.md): liste ve revizyon pakete dâhil; krediler
// yalnız danışman sorusu için. Çağrı BİLEREK duruyor — ledger'daki
// UNIQUE(reason, ref_id) (appdb/schema.ts:133) üretimin tek idempotency
// çapası; paketliye delta 0 satır yazılır, aynı requestId ikinci kez
// DUPLICATE döner. hasPaket tek yerden okunur (zaten elimizdeki user
// nesnesi) ki harcama ile iade aynı değeri görsün.
const maliyet = user.hasPaket ? 0 : RAPOR_KREDI;
// 3 kredi düş (idempotent: aynı requestId ile retry çifte harcamaz)
const harcama = await spendCredits({
userId: user.id,
amount: RAPOR_KREDI,
amount: maliyet,
reason: "report_generate",
refId: requestId,
});
@@ -208,10 +216,13 @@ async function listeOlusturKilitli(
try {
sonuc = await raporUret(params);
} catch (err) {
// Üretim başarısız → krediyi iade et
// Üretim başarısız → krediyi iade et. Satır paketlide de yazılır (delta 0):
// yukarıdaki DUPLICATE dalı "önceki deneme başarısız mıydı" sorusunu tam
// olarak bu refund kaydının varlığıyla cevaplıyor. Tutar koşullu, yoksa
// harcaması 0 olan paketliye her başarısız denemede bedava kredi yazardık.
await grantCredits({
userId: user.id,
delta: RAPOR_KREDI,
delta: maliyet,
reason: "refund",
refId: requestId,
}).catch(() => {});
@@ -240,7 +251,7 @@ async function listeOlusturKilitli(
rapor: user.hasPaket ? sonuc : raporMaskele(sonuc),
params,
revisionCount: 0,
kredi: user.creditBalance - RAPOR_KREDI,
kredi: user.creditBalance - maliyet,
hasPaket: user.hasPaket,
};
}
@@ -282,9 +293,15 @@ export async function listeRevize(input: {
const params = rapor.params as RaporParams;
const onceki = rapor.result as RaporSonuc;
// Revizyon pakete dâhil (bkz. listeOlusturKilitli'deki aynı not). Yukarıdaki
// hasPaket kapısı yüzünden burada maliyet her zaman 0; ifade yine de koşullu
// yazılıyor ki kapı ileride gevşerse paketsiz kullanıcıdan ücret düşmeye
// devam etsin. Revizyon hakkını MAX_REVIZYON sayacı sınırlıyor, kredi değil.
const maliyet = user.hasPaket ? 0 : RAPOR_KREDI;
const harcama = await spendCredits({
userId: user.id,
amount: RAPOR_KREDI,
amount: maliyet,
reason: "report_revision",
refId: input.requestId,
});
@@ -336,9 +353,11 @@ export async function listeRevize(input: {
listeOzetiCikar(onceki, params.sira),
);
} catch (err) {
// İade satırı burada da yazılır (paketlide delta 0) — DUPLICATE dalındaki
// "önceki deneme başarısızdı" çıkarımı buna dayanıyor.
await grantCredits({
userId: user.id,
delta: RAPOR_KREDI,
delta: maliyet,
reason: "refund",
refId: input.requestId,
}).catch(() => {});
@@ -360,7 +379,7 @@ export async function listeRevize(input: {
rapor: sonuc,
params,
revisionCount: rapor.revisionCount + 1,
kredi: user.creditBalance - RAPOR_KREDI,
kredi: user.creditBalance - maliyet,
hasPaket: true,
};
}