/**
* Faraidh Application for MCP Server
* Menggunakan library KalkulatorFaraidh untuk perhitungan waris Islam
*/
// Import library faraidh yang sudah dibuat
import { KalkulatorFaraidh } from './faraidh-id.js';
export interface HartaData {
totalHarta?: number;
hutang?: number;
biayaPemakaman?: number;
wasiat?: number;
}
export interface AhliWarisData {
// Pasangan
suami?: number;
istri?: number;
// Keturunan langsung
anakLaki?: number;
anakPerempuan?: number;
cucuLakiDariAnakLaki?: number;
cucuPerempuanDariAnakLaki?: number;
// Orang tua dan kakek nenek
ayah?: number;
ibu?: number;
kakekDariAyah?: number;
nenekDariIbu?: number;
nenekDariAyah?: number;
// Saudara
saudaraLakiKandung?: number;
saudaraPerempuanKandung?: number;
saudaraLakiSeAyah?: number;
saudaraPerempuanSeAyah?: number;
saudaraLakiSeIbu?: number;
saudaraPerempuanSeIbu?: number;
// Keponakan dan paman
anakLakiSaudaraKandung?: number;
anakLakiSaudaraSeAyah?: number;
pamanKandungAyah?: number;
anakLakiPamanKandung?: number;
}
export interface KasusFaraidh {
id: string;
nama: string;
deskripsi: string;
harta: HartaData;
ahliWaris: AhliWarisData;
hasil?: any;
createdAt: Date;
}
export class FaraidhApp {
private kasus: KasusFaraidh[] = [];
private kalkulator: any;
constructor() {
this.kalkulator = new KalkulatorFaraidh();
}
/**
* Tambah kasus faraidh baru
*/
tambahKasus(nama: string, deskripsi: string, harta: HartaData, ahliWaris: AhliWarisData): KasusFaraidh {
const kasusBarr: KasusFaraidh = {
id: Date.now().toString(),
nama,
deskripsi,
harta,
ahliWaris,
createdAt: new Date()
};
this.kasus.push(kasusBarr);
return kasusBarr;
}
/**
* Hitung warisan untuk kasus tertentu
*/
hitungWarisan(kasusId: string): any {
const kasus = this.kasus.find(k => k.id === kasusId);
if (!kasus) {
throw new Error(`Kasus dengan ID ${kasusId} tidak ditemukan`);
}
try {
// Reset kalkulator dan set data
this.kalkulator.reset();
this.kalkulator.setHarta(kasus.harta);
this.kalkulator.setAhliWaris(kasus.ahliWaris);
// Hitung warisan
const hasil = this.kalkulator.hitung();
// Simpan hasil ke kasus
kasus.hasil = hasil;
return hasil;
} catch (error) {
throw new Error(`Gagal menghitung warisan: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* Buat laporan untuk kasus tertentu
*/
buatLaporan(kasusId: string): string {
const kasus = this.kasus.find(k => k.id === kasusId);
if (!kasus) {
throw new Error(`Kasus dengan ID ${kasusId} tidak ditemukan`);
}
// Pastikan sudah ada hasil perhitungan
if (!kasus.hasil) {
this.hitungWarisan(kasusId);
}
try {
this.kalkulator.reset();
this.kalkulator.setHarta(kasus.harta);
this.kalkulator.setAhliWaris(kasus.ahliWaris);
this.kalkulator.hitung();
return this.kalkulator.buatLaporan();
} catch (error) {
throw new Error(`Gagal membuat laporan: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* Hitung warisan langsung tanpa menyimpan kasus
*/
hitungLangsung(harta: HartaData, ahliWaris: AhliWarisData): any {
try {
this.kalkulator.reset();
this.kalkulator.setHarta(harta);
this.kalkulator.setAhliWaris(ahliWaris);
return this.kalkulator.hitung();
} catch (error) {
throw new Error(`Gagal menghitung warisan: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* Buat laporan langsung tanpa menyimpan kasus
*/
buatLaporanLangsung(harta: HartaData, ahliWaris: AhliWarisData): string {
try {
this.kalkulator.reset();
this.kalkulator.setHarta(harta);
this.kalkulator.setAhliWaris(ahliWaris);
this.kalkulator.hitung();
return this.kalkulator.buatLaporan();
} catch (error) {
throw new Error(`Gagal membuat laporan: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* Dapatkan semua kasus
*/
semuaKasus(): KasusFaraidh[] {
return [...this.kasus];
}
/**
* Dapatkan kasus berdasarkan ID
*/
dapatkanKasus(kasusId: string): KasusFaraidh | null {
return this.kasus.find(k => k.id === kasusId) || null;
}
/**
* Hapus kasus
*/
hapusKasus(kasusId: string): boolean {
const index = this.kasus.findIndex(k => k.id === kasusId);
if (index === -1) return false;
this.kasus.splice(index, 1);
return true;
}
/**
* Update kasus
*/
updateKasus(kasusId: string, nama?: string, deskripsi?: string, harta?: HartaData, ahliWaris?: AhliWarisData): KasusFaraidh | null {
const kasus = this.kasus.find(k => k.id === kasusId);
if (!kasus) return null;
if (nama) kasus.nama = nama;
if (deskripsi) kasus.deskripsi = deskripsi;
if (harta) {
kasus.harta = { ...kasus.harta, ...harta };
kasus.hasil = undefined; // Reset hasil karena data berubah
}
if (ahliWaris) {
kasus.ahliWaris = { ...kasus.ahliWaris, ...ahliWaris };
kasus.hasil = undefined; // Reset hasil karena data berubah
}
return kasus;
}
/**
* Validasi data harta
*/
validasiHarta(harta: HartaData): string[] {
const errors: string[] = [];
if (!harta.totalHarta || harta.totalHarta <= 0) {
errors.push("Total harta harus lebih besar dari 0");
}
if (harta.wasiat && harta.totalHarta && harta.wasiat > (harta.totalHarta / 3)) {
errors.push("Wasiat tidak boleh melebihi 1/3 dari total harta");
}
return errors;
}
/**
* Validasi data ahli waris
*/
validasiAhliWaris(ahliWaris: AhliWarisData): string[] {
const errors: string[] = [];
if (ahliWaris.suami && ahliWaris.istri) {
errors.push("Tidak boleh ada suami dan istri sekaligus");
}
if (ahliWaris.suami && ahliWaris.suami > 1) {
errors.push("Suami tidak boleh lebih dari 1 orang");
}
// Periksa apakah ada minimal satu ahli waris
const totalAhliWaris = Object.values(ahliWaris).reduce((sum, count) => sum + (count || 0), 0);
if (totalAhliWaris === 0) {
errors.push("Harus ada minimal satu ahli waris");
}
return errors;
}
/**
* Template kasus umum
*/
templateKasus(): { [key: string]: { harta: HartaData; ahliWaris: AhliWarisData; deskripsi: string } } {
return {
keluargaSederhana: {
deskripsi: "Kasus keluarga sederhana: suami meninggal, ada istri dan anak",
harta: {
totalHarta: 1000000000,
hutang: 50000000,
biayaPemakaman: 10000000,
wasiat: 100000000
},
ahliWaris: {
istri: 1,
anakLaki: 1,
anakPerempuan: 1,
ayah: 1,
ibu: 1
}
},
hanyaAnakPerempuan: {
deskripsi: "Kasus hanya anak perempuan tanpa anak laki-laki",
harta: {
totalHarta: 800000000,
hutang: 30000000,
biayaPemakaman: 15000000,
wasiat: 100000000
},
ahliWaris: {
suami: 1,
anakPerempuan: 2,
ibu: 1
}
},
tanpaKeturunan: {
deskripsi: "Kasus tanpa keturunan, hanya orang tua dan saudara",
harta: {
totalHarta: 500000000,
hutang: 20000000,
biayaPemakaman: 8000000,
wasiat: 50000000
},
ahliWaris: {
istri: 1,
ayah: 1,
ibu: 1,
saudaraLakiKandung: 1,
saudaraPerempuanKandung: 1
}
}
};
}
}