fix(odeme): önce kredi sonra paid damgası; çift pakette iade akışı; UNIQUE tespiti
All checks were successful
Deploy / deploy (push) Successful in 8m50s

- odemeyiSonuclandir krediyi yazıp sonra paid damgalar; araya kesinti girerse
  sipariş pending kalır ve yeniden denenir (eskiden: paid görünür, kredi yok).
  paid + deftersiz eski siparişler ilk ziyarette onarılır
- paket tek seferlik: grantCredits({ paketTekil }) zaten paketliye yazmaz
  (kontrol UPDATE'in WHERE'inde). Sipariş paid damgalanır, senkron log +
  destek@ e-postası, /odeme/sonuc 'Bu ödeme iade edilecek' kartı, /kosullar#iade
- drizzle DrizzleQueryError üst mesajında 'UNIQUE' yok → idempotent no-op yerine
  hata fırlıyordu (grant + iki spend yolu); cause zincirine bakılıyor
- callback geçici DB hatasında 500 yerine sonuç sayfasına yönlendirir
- krediKaydiVarMi (reason, ref_id) indeksini kullanır; haftalık mutabakat sorgusu

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 16:36:24 +03:00
parent 8f4669e31d
commit 024a2a49c4
6 changed files with 240 additions and 26 deletions

View File

@@ -36,7 +36,16 @@ export async function POST(request: NextRequest) {
return NextResponse.redirect(`${appUrl}/paket?hata=siparis`, 303);
}
await odemeyiSonuclandir(order.id);
// Geçici DB hatası (yazma kilidi vb.) kullanıcıya çıplak 500 göstermesin:
// sonuç sayfası aynı sonuçlandırmayı yeniden dener (self-healing).
try {
await odemeyiSonuclandir(order.id);
} catch (e) {
console.error("[odeme] callback sonuçlandırma hatası", {
siparis: order.id,
e,
});
}
// 303: iyzico'nun POST'u GET'e döner, kullanıcı sonuç sayfasında yenileme
// yaptığında form yeniden gönderilmez.
return NextResponse.redirect(`${appUrl}/odeme/sonuc?siparis=${order.id}`, 303);

View File

@@ -75,6 +75,13 @@ export default function KosullarPage() {
; talepler 14 gün içinde sonuçlandırılır ve iade, ödeme yaptığın
karta yapılır.
</p>
<p className="mt-2">
Paket hesap başına tek seferliktir. Paketin zaten aktifken
yanlışlıkla ikinci kez ödeme yaptıysan (örneğin iki cihazdan aynı
anda), bu ikinci ödeme için kredi tanımlanmaz ve tutarın tamamı,
talep etmene gerek kalmadan, en geç 14 gün içinde ödeme yaptığın
karta iade edilir.
</p>
</section>
<section>
<h2 className="font-heading text-lg font-bold text-slate-900">