AKTIF
0
Register Nikah
AKTIF
0
Arsip Ijazah
31+20
51
Satuan Kerja
ONLINE
0
Operator Aktif
💡 Fitur Arsip Digital yang Disarankan
Roadmap AMANAH✅
OCR Otomatis
Scan berkas → data terisi otomatis via AI
✅
QR + Hash Verifikasi
Setiap dokumen punya kode unik anti-pemalsuan
✅
Watermark Cetak
Setiap cetak/download ada tanda AMANAH
✅
Multi Role Operator
KUA · Madrasah · Kepegawaian · Kabupaten
🔜
Retensi Arsip
Jadwal simpan & musnahkan arsip sesuai JRA Kemenag
🔜
Audit Trail
Log semua aktivitas: siapa ubah apa kapan
🔜
Notifikasi Otomatis
WhatsApp/email saat dokumen hampir kedaluwarsa
🔜
e-Surat & Disposisi
Surat masuk/keluar digital, tanda tangan elektronik
🔜
Backup Otomatis
Export bulk ke Google Drive/lokal terjadwal
🔜
Pencarian Fulltext
Cari isi dokumen PDF, bukan hanya metadata
🔜
Verifikasi Publik
Masyarakat scan QR → cek keaslian dokumen online
🔜
Dashboard Analytics
Grafik tren nikah, ijazah, pegawai per periode
📋 Register Nikah Terbaru
| No Akta | Suami | Istri | KUA |
|---|
🎓 Ijazah Terbaru
| No Ijazah | Nama Siswa | Madrasah | Th |
|---|
📋 Daftar Register Nikah
0 data| # | Nomor Akta | Tanggal | Suami | Istri | KUA | Status | Aksi |
|---|
🎓 Arsip Ijazah Madrasah Negeri
0 data| # | No Ijazah | Nama Siswa | Madrasah | Jenjang | Lulus | Status | Aksi |
|---|
🕌 KUA Kabupaten Jember
| # | Nama Satuan Kerja | Kode | Op. | Total Dok | Status | Aksi |
|---|
👤 Manajemen Operator & Akses
| # | Nama | Satuan Kerja | Role | Status | Aksi |
|---|
Masukkan hash SHA-256 atau nomor akta/ijazah
untuk memverifikasi keaslian dokumen dalam sistem AMANAH
📷 Scan & OCR Dokumen
Drag & drop file scan Register Nikah di sini
atau klik untuk pilih file
atau klik untuk pilih file
Format: PDF · JPG · PNG
⚠️ Panduan teknis untuk developer. Pastikan memiliki akun Google, akun Firebase, dan Node.js terinstal.
1 Buat Project Firebase
aBuka console.firebase.google.com → klik "Add project"
bNama project: amanah-kemenag-jember → lanjutkan
cDi dashboard → klik ikon Web (</>) → Register app → salin firebaseConfig
2 Aktifkan Layanan Firebase
aAuthentication: Sign-in method → aktifkan Google + Email/Password
bFirestore: Create database → Production mode → Region: asia-southeast2 (Jakarta)
cStorage: Get Started → region sama → struktur folder: nikah/ ijazah/ temp/
3 Inisialisasi SDK
// Terminal — install dependencies
npm install firebase
// src/firebase.js — konfigurasi utama
import { initializeApp } from "firebase/app";
import { getAuth, GoogleAuthProvider } from "firebase/auth";
import { getFirestore } from "firebase/firestore";
import { getStorage } from "firebase/storage";
const firebaseConfig = {
apiKey: "AIzaSy...", // dari Firebase Console
authDomain: "amanah-kemenag-jember.firebaseapp.com",
projectId: "amanah-kemenag-jember",
storageBucket: "amanah-kemenag-jember.appspot.com",
messagingSenderId: "123456789",
appId: "1:123456789:web:abc123"
};
const app = initializeApp(firebaseConfig);
export const auth = getAuth(app);
export const db = getFirestore(app);
export const storage = getStorage(app);
export const googleProvider = new GoogleAuthProvider();
4 Fungsi Auth & CRUD
// Login Google
export async function loginGoogle() {
const res = await signInWithPopup(auth, googleProvider);
const userDoc = await getDoc(doc(db, "users", res.user.uid));
return { user: res.user, role: userDoc.data()?.role || "viewer" };
}
// Simpan Register Nikah + hash otomatis
export async function saveRegisterNikah(data) {
const hash = await sha256(JSON.stringify(data));
return await addDoc(collection(db, "registerNikah"), {
...data, hash,
status: "terverifikasi",
createdAt: serverTimestamp(),
createdBy: auth.currentUser.uid
});
}
// SHA-256 native browser (tanpa library tambahan)
export async function sha256(text) {
const buf = await crypto.subtle.digest("SHA-256",
new TextEncoder().encode(text));
return "sha256:" + [...new Uint8Array(buf)]
.map(b => b.toString(16).padStart(2,"0")).join("");
}
5 Security Rules Firestore
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isAuth() { return request.auth != null; }
function role() { return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role; }
function satker() { return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.satker; }
function isAdmin() { return role() == "kabupaten"; }
match /registerNikah/{id} {
allow read: if isAuth();
allow create, update: if isAuth() && (isAdmin() ||
(role() == "kua" && request.resource.data.kua == satker()));
allow delete: if isAdmin();
}
match /ijazah/{id} {
allow read: if isAuth();
allow create, update: if isAuth() && (isAdmin() ||
(role() == "madrasah" && request.resource.data.madrasah == satker()));
allow delete: if isAdmin();
}
match /users/{uid} {
allow read: if isAuth();
allow write: if isAdmin() || request.auth.uid == uid;
}
}
}