kaza namazı hesaplama düzeltildi.

This commit is contained in:
2026-07-31 04:42:57 +02:00
parent 143a1de4e1
commit 8e4ac266c1
2 changed files with 35 additions and 34 deletions
+13 -13
View File
@@ -24,7 +24,7 @@ export function renderKaza(pb) {
<span class="text-3xl">📿</span> <span class="text-3xl">📿</span>
<div> <div>
<h2 class="text-2xl font-bold text-white">Kaza Namazı Sayaç & Takip</h2> <h2 class="text-2xl font-bold text-white">Kaza Namazı Sayaç & Takip</h2>
<p class="text-slate-400 text-xs">Kaza namazı borçlarınızı sabitleyin ve kıldıkça düşün.</p> <p class="text-slate-400 text-xs">Hicri takvime göre kaza borcunuzu hesaplayın ve PocketBase'de takip edin.</p>
</div> </div>
</div> </div>
@@ -33,7 +33,7 @@ export function renderKaza(pb) {
? ` ? `
<div class="bg-slate-950/50 border border-white/10 p-6 rounded-2xl my-auto text-center max-w-md mx-auto w-full"> <div class="bg-slate-950/50 border border-white/10 p-6 rounded-2xl my-auto text-center max-w-md mx-auto w-full">
<h3 class="text-base font-bold text-white mb-2">Doğum Tarihi Gerekli</h3> <h3 class="text-base font-bold text-white mb-2">Doğum Tarihi Gerekli</h3>
<p class="text-xs text-slate-400 mb-6">Kaza namazı borcunu hesaplayabilmemiz için profil bilgilerinizi girin.</p> <p class="text-xs text-slate-400 mb-6">Kaza namazı borcunuzu Hicri takvime göre hesaplayabilmemiz için doğum tarihini ve saatinizi girin.</p>
<form id="profileForm" class="space-y-4"> <form id="profileForm" class="space-y-4">
<div class="text-left"> <div class="text-left">
<label class="block text-xs text-slate-300 mb-1">Doğum Tarihi ve Saati</label> <label class="block text-xs text-slate-300 mb-1">Doğum Tarihi ve Saati</label>
@@ -57,11 +57,11 @@ export function renderKaza(pb) {
<div class="bg-slate-950/60 border border-white/10 p-5 rounded-2xl mb-6 mt-2 flex flex-col gap-4"> <div class="bg-slate-950/60 border border-white/10 p-5 rounded-2xl mb-6 mt-2 flex flex-col gap-4">
<div class="flex flex-wrap items-center justify-between gap-2 border-b border-white/10 pb-3"> <div class="flex flex-wrap items-center justify-between gap-2 border-b border-white/10 pb-3">
<div> <div>
<h3 class="text-xs font-bold text-indigo-300 uppercase tracking-wider">Borç Tanımlama</h3> <h3 class="text-xs font-bold text-indigo-300 uppercase tracking-wider">Hicri Kaza Borcu Tanımlama</h3>
<p class="text-[11px] text-slate-400">Doğum tarihinize göre kaza borcunuzu hesaplayıp veritabanına sabitler.</p> <p class="text-[11px] text-slate-400">12 yaş mükellefiyeti ve doğum saatiniz (hilal düzeltmesi) baz alınarak borcunuz sabitlenir.</p>
</div> </div>
<button id="calcAndSaveBtn" class="bg-indigo-600 hover:bg-indigo-500 text-white px-4 py-2 rounded-xl text-xs font-semibold transition-all shadow-md active:scale-95"> <button id="calcAndSaveBtn" class="bg-indigo-600 hover:bg-indigo-500 text-white px-4 py-2 rounded-xl text-xs font-semibold transition-all shadow-md active:scale-95">
⚡ Kaza Borçlarını Otomatik Hesapla & Kaydet ⚡ Kaza Borçlarını Otomatik Hesapla & PB'ye Kaydet
</button> </button>
</div> </div>
@@ -150,7 +150,7 @@ export function renderKaza(pb) {
); );
} catch (err) { } catch (err) {
alert( alert(
"Profil kaydedilemedi. PocketBase alan adlarını kontrol edin.", "Profil kaydedilemedi. PocketBase kullanıcı alanlarını kontrol edin.",
); );
} }
}); });
@@ -162,7 +162,7 @@ export function renderKaza(pb) {
?.addEventListener("click", async () => { ?.addEventListener("click", async () => {
if ( if (
confirm( confirm(
"Kaza borçlarınız doğum tarihinize göre yeniden hesaplanıp veritabanına sabitlenecek. Onaylıyor musunuz?", "Doğum tarihiniz ve saatiniz Hicri takvime dönüştürülüp 12 yaş borcunuz PocketBase'e kaydedilecek. Onaylıyor musunuz?",
) )
) { ) {
const res = await initAndSaveInitialKaza(pb, birthDate, gender); const res = await initAndSaveInitialKaza(pb, birthDate, gender);
@@ -170,7 +170,7 @@ export function renderKaza(pb) {
await refreshKazaStats(container, pb); await refreshKazaStats(container, pb);
showKazaMsg( showKazaMsg(
container.querySelector("#kazaMsg"), container.querySelector("#kazaMsg"),
`Kaza borçları hesaplandı (${res.days} gün = ${res.fajr} vakit) ve PocketBase'e kaydedildi!`, `Hicri borç hesaplandı (${res.days} gün) ve PocketBase'e kaydedildi!`,
true, true,
); );
} else { } else {
@@ -203,11 +203,11 @@ async function initAndSaveInitialKaza(pb, birthDate, gender) {
try { try {
const calc = calculateMissedPrayers(birthDate, gender, 12); const calc = calculateMissedPrayers(birthDate, gender, 12);
if (!calc || calc.fajr === 0) { if (!calc || calc.days <= 0) {
return { return {
success: false, success: false,
error: error:
"Hesaplanan gün sayısı 0 çıktı. Doğum tarihinizin doğrulunu kontrol edin.", "Doğum tarihiniz henüz mükellefiyet yaşından (12 Hicri yıl) küçük görünüyor.",
}; };
} }
@@ -219,7 +219,7 @@ async function initAndSaveInitialKaza(pb, birthDate, gender) {
.collection("kaza_logs") .collection("kaza_logs")
.getFirstListItem(`user = "${userId}"`); .getFirstListItem(`user = "${userId}"`);
} catch (e) { } catch (e) {
// Kayıt bulunamazsa sorun yok, yenisini oluşturacağız // Kayıt yoksa yeni oluşturulacak
} }
const initialData = { const initialData = {
@@ -251,7 +251,7 @@ async function initAndSaveInitialKaza(pb, birthDate, gender) {
success: false, success: false,
error: error:
err?.message || err?.message ||
"PocketBase kayıt yaparken hata oluştu. kaza_logs koleksiyon izinlerini (API Rules) ve alan adlarını kontrol edin.", "PocketBase kayıt yaparken hata oluştu. kaza_logs izinlerini kontrol edin.",
}; };
} }
} }
@@ -272,7 +272,7 @@ async function updateKazaCount(container, pb, direction) {
if (!userRecord) { if (!userRecord) {
showKazaMsg( showKazaMsg(
msg, msg,
"Önce yukarıdaki 'Hesapla & Kaydet' butonuna tıklamalısınız.", "Önce yukarıdaki 'Kaza Borçlarını Otomatik Hesapla & PB'ye Kaydet' butonuna tıklamalısınız.",
false, false,
); );
return; return;
+22 -21
View File
@@ -25,23 +25,17 @@ const DAYS = [
export function gregorianToHijri(dateInput = new Date()) { export function gregorianToHijri(dateInput = new Date()) {
const date = new Date(dateInput); const date = new Date(dateInput);
// Akşam 19:00 ve sonrası doğumlarda Hicri takvim bir sonraki güne geçer
const hours = date.getHours(); const hours = date.getHours();
let dayOffset = 2; // Türkiye coğrafi hilal düzeltmesi let dayOffset = 2; // Türkiye coğrafi hilal düzeltmesi
if (hours >= 19) { if (hours >= 19) {
dayOffset += 1; dayOffset += 1;
} }
const adjustedDate = new Date( const adjustedDate = new Date(
date.getTime() + dayOffset * 24 * 60 * 60 * 1000, date.getTime() + dayOffset * 24 * 60 * 60 * 1000,
); );
const year = adjustedDate.getFullYear(); const year = adjustedDate.getFullYear();
const month = adjustedDate.getMonth() + 1; const month = adjustedDate.getMonth() + 1;
const day = adjustedDate.getDate(); const day = adjustedDate.getDate();
let a = Math.floor((14 - month) / 12); let a = Math.floor((14 - month) / 12);
let y = year + 4800 - a; let y = year + 4800 - a;
let m = month + 12 * a - 3; let m = month + 12 * a - 3;
@@ -53,7 +47,6 @@ export function gregorianToHijri(dateInput = new Date()) {
Math.floor(y / 100) + Math.floor(y / 100) +
Math.floor(y / 400) - Math.floor(y / 400) -
32045; 32045;
let l = jdn - 1948440 + 10632; let l = jdn - 1948440 + 10632;
let n = Math.floor((l - 1) / 10631); let n = Math.floor((l - 1) / 10631);
l = l - 10631 * n + 354; l = l - 10631 * n + 354;
@@ -65,18 +58,14 @@ export function gregorianToHijri(dateInput = new Date()) {
Math.floor((30 - j) / 15) * Math.floor((17719 * j) / 50) - Math.floor((30 - j) / 15) * Math.floor((17719 * j) / 50) -
Math.floor(j / 16) * Math.floor((15238 * j) / 43) + Math.floor(j / 16) * Math.floor((15238 * j) / 43) +
29; 29;
let hijriMonth = Math.floor((24 * l) / 709); let hijriMonth = Math.floor((24 * l) / 709);
let hijriDay = l - Math.floor((709 * hijriMonth) / 24); let hijriDay = l - Math.floor((709 * hijriMonth) / 24);
let hijriYear = 30 * n + j - 30; let hijriYear = 30 * n + j - 30;
if (hijriMonth > 12) { if (hijriMonth > 12) {
hijriMonth -= 12; hijriMonth -= 12;
hijriYear += 1; hijriYear += 1;
} }
const weekday = DAYS[date.getDay()]; const weekday = DAYS[date.getDay()];
return { return {
year: hijriYear, year: hijriYear,
month: hijriMonth, month: hijriMonth,
@@ -86,20 +75,31 @@ export function gregorianToHijri(dateInput = new Date()) {
}; };
} }
export function calculateMissedPrayers(birthDate, gender, mukallafAge = 12) { export function calculateMissedPrayers(birthDateStr, gender, mukallafAge = 12) {
const birth = new Date(birthDate); if (!birthDateStr)
const today = new Date(); return { fajr: 0, dhuhr: 0, asr: 0, maghrib: 0, isha: 0, vitr: 0, days: 0 };
today.setHours(0, 0, 0, 0);
const mukallafDate = new Date(birth); const birthDate = new Date(birthDateStr);
mukallafDate.setFullYear(mukallafDate.getFullYear() + mukallafAge); if (isNaN(birthDate.getTime())) {
if (today <= mukallafDate) {
return { fajr: 0, dhuhr: 0, asr: 0, maghrib: 0, isha: 0, vitr: 0, days: 0 }; return { fajr: 0, dhuhr: 0, asr: 0, maghrib: 0, isha: 0, vitr: 0, days: 0 };
} }
const diffTime = today - mukallafDate; // 1. Doğum tarihini Hicri'ye çevirip saat detayına göre kontrol ediyoruz
const days = Math.floor(diffTime / (1000 * 60 * 60 * 24)); const hijriBirth = gregorianToHijri(birthDate);
// 2. Mükellefiyet Yaşı (12 Hicri Yıl = 12 * 354.367 gün ≈ 4252.4 gün)
const HICRI_YEAR_IN_MS = 354.367 * 24 * 60 * 60 * 1000;
const mukallafTimeMs = birthDate.getTime() + mukallafAge * HICRI_YEAR_IN_MS;
const today = new Date();
if (today.getTime() <= mukallafTimeMs) {
return { fajr: 0, dhuhr: 0, asr: 0, maghrib: 0, isha: 0, vitr: 0, days: 0 };
}
// 3. Mükellefiyetten bugüne geçen Hicri Gün sayısı
const diffTimeMs = today.getTime() - mukallafTimeMs;
const days = Math.floor(diffTimeMs / (1000 * 60 * 60 * 24));
return { return {
fajr: days, fajr: days,
@@ -109,6 +109,7 @@ export function calculateMissedPrayers(birthDate, gender, mukallafAge = 12) {
isha: days, isha: days,
vitr: days, vitr: days,
days, days,
hijriBirthYear: hijriBirth.year,
}; };
} }