Kantongku: aplikasi pencatat keuangan pribadi offline-first

This commit is contained in:
Bro
2026-08-16 12:22:36 +07:00
commit e0c4cef96b
57 changed files with 11641 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
export function formatRupiah(value: number): string {
const formatted = Math.abs(value).toLocaleString('id-ID');
return `${value < 0 ? '-' : ''}Rp ${formatted}`;
}
/** Format angka mentah (string digit) jadi ribuan ber-titik, misal "50000" -> "50.000" */
export function formatRibuan(raw: string): string {
if (!raw) return '';
const n = Number(raw);
if (!Number.isFinite(n)) return raw;
return n.toLocaleString('id-ID');
}
export function formatRupiahShort(value: number): string {
if (Math.abs(value) >= 1_000_000) {
const juta = value / 1_000_000;
return `Rp ${juta.toLocaleString('id-ID', { maximumFractionDigits: 1 })} jt`;
}
if (Math.abs(value) >= 1_000) {
const ribu = value / 1_000;
return `Rp ${ribu.toLocaleString('id-ID', { maximumFractionDigits: 1 })} rb`;
}
return formatRupiah(value);
}
export function formatDate(iso: string): string {
const d = new Date(iso);
return d.toLocaleDateString('id-ID', {
day: 'numeric',
month: 'short',
year: 'numeric',
});
}
export function formatDateTime(iso: string): string {
const d = new Date(iso);
const date = d.toLocaleDateString('id-ID', { day: 'numeric', month: 'short' });
const time = d.toLocaleTimeString('id-ID', {
hour: '2-digit',
minute: '2-digit',
});
return `${date} · ${time}`;
}
export function todayLabel(): string {
return new Date().toLocaleDateString('id-ID', {
weekday: 'long',
day: 'numeric',
month: 'long',
year: 'numeric',
});
}
/** Kunci minggu ISO sederhana: tanggal Senin (YYYY-MM-DD) */
export function isoWeekKey(d: Date): string {
const date = new Date(d);
const day = date.getDay() || 7; // Senin=1, ..., Minggu=7
date.setDate(date.getDate() - (day - 1));
date.setHours(0, 0, 0, 0);
return date.toISOString().slice(0, 10);
}
export function shiftWeekKey(key: string, deltaWeeks: number): string {
const monday = new Date(`${key}T00:00:00Z`);
monday.setUTCDate(monday.getUTCDate() + deltaWeeks * 7);
return monday.toISOString().slice(0, 10);
}