From 6dec5a04700bff9276c968c1d87cd6b20571752f Mon Sep 17 00:00:00 2001 From: panggilsajarey <150323912+raynard05@users.noreply.github.com> Date: Mon, 1 Jun 2026 18:27:45 +0700 Subject: [PATCH] add pdf numbering finaal --- .../kelola-data/CetakInstanModal.tsx | 7 ++- .../kelola-data/[id]/CetakPDFButton.tsx | 7 ++- .../perkembangan/ExportPDFButton.tsx | 7 ++- supabase-cetak-balita.sql | 4 ++ tmp/check_cetak.ts | 45 ----------------- tmp/test_insert.ts | 50 ------------------- 6 files changed, 22 insertions(+), 98 deletions(-) create mode 100644 supabase-cetak-balita.sql delete mode 100644 tmp/check_cetak.ts delete mode 100644 tmp/test_insert.ts diff --git a/app/dashboard/kelola-data/CetakInstanModal.tsx b/app/dashboard/kelola-data/CetakInstanModal.tsx index f195dfc..52ec150 100644 --- a/app/dashboard/kelola-data/CetakInstanModal.tsx +++ b/app/dashboard/kelola-data/CetakInstanModal.tsx @@ -194,11 +194,16 @@ export function CetakInstanModal() { setProgress({ current: i + 1, total: targets.length, name: b.nama_anak, mama: b.nama_orang_tua }) // --- Save to cetak_balita --- - await supabase.from('cetak_balita').insert({ + const { error: dbError } = await supabase.from('cetak_balita').insert({ id_berkas: currentIdBerkas, nama_balita: b.nama_anak, + tanggal_cetak: new Date().toISOString(), }) + if (dbError) { + throw new Error(dbError.message) + } + // --- Update template and wait for render --- setActivePrintData({ pengguna: b, row: rowForMonth, allHasil: balitaHasil, idBerkas: currentIdBerkas }) // Give React and Recharts some time to finish rendering the hidden template diff --git a/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx b/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx index c8523d1..b19518b 100644 --- a/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx +++ b/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx @@ -95,11 +95,16 @@ export function CetakPDFButton({ row, allData, pengguna }: Props) { const currentIdBerkas = Date.now() setIdBerkas(currentIdBerkas) - await supabase.from('cetak_balita').insert({ + const { error: dbError } = await supabase.from('cetak_balita').insert({ id_berkas: currentIdBerkas, nama_balita: pengguna.nama_anak, + tanggal_cetak: new Date().toISOString(), }) + if (dbError) { + throw new Error(dbError.message) + } + // Tunggu render React selesai (untuk menampilkan ID Berkas) await new Promise(r => setTimeout(r, 500)) diff --git a/app/user-dashboard/perkembangan/ExportPDFButton.tsx b/app/user-dashboard/perkembangan/ExportPDFButton.tsx index b2a4d03..e09da71 100644 --- a/app/user-dashboard/perkembangan/ExportPDFButton.tsx +++ b/app/user-dashboard/perkembangan/ExportPDFButton.tsx @@ -94,11 +94,16 @@ export function ExportPDFButton({ row, allData, pengguna }: Props) { setIdBerkas(currentIdBerkas) const { supabase } = await import('@/lib/supabase') - await supabase.from('cetak_balita').insert({ + const { error: dbError } = await supabase.from('cetak_balita').insert({ id_berkas: currentIdBerkas, nama_balita: pengguna.nama_anak, + tanggal_cetak: new Date().toISOString(), }) + if (dbError) { + throw new Error(dbError.message) + } + // Tunggu render React selesai (untuk menampilkan ID Berkas) await new Promise(r => setTimeout(r, 500)) diff --git a/supabase-cetak-balita.sql b/supabase-cetak-balita.sql new file mode 100644 index 0000000..6537799 --- /dev/null +++ b/supabase-cetak-balita.sql @@ -0,0 +1,4 @@ +-- Menurunkan/menonaktifkan kebijakan Row-Level Security (RLS) pada tabel cetak_balita +-- Agar sama seperti tabel lainnya di proyek ini (Unrestricted) dan memperbolehkan input data dari aplikasi. + +ALTER TABLE public.cetak_balita DISABLE ROW LEVEL SECURITY; diff --git a/tmp/check_cetak.ts b/tmp/check_cetak.ts deleted file mode 100644 index 7d8ccf9..0000000 --- a/tmp/check_cetak.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createClient } from '@supabase/supabase-js' -import * as fs from 'fs' -import * as path from 'path' - -const envPath = path.join(process.cwd(), '.env.local') -const envContent = fs.readFileSync(envPath, 'utf-8') -const envVars: Record = {} -envContent.split('\n').forEach(line => { - const parts = line.split('=') - if (parts.length >= 2) { - envVars[parts[0].trim()] = parts.slice(1).join('=').trim() - } -}) - -const supabaseUrl = envVars.NEXT_PUBLIC_SUPABASE_URL -const supabaseAnonKey = envVars.NEXT_PUBLIC_SUPABASE_ANON_KEY -const supabase = createClient(supabaseUrl, supabaseAnonKey) - -async function listTables() { - console.log('Listing tables from Supabase...') - // We can query schema tables via rpc or a query, or select from some common tables - // To list tables via PostgREST, we can try to query a non-existent table and see the hint or query pg_class - // Actually, let's query the supabase API or look at common tables - const tables = [ - 'akun_balita', - 'hasil_stunting_balita', - 'cetak_balita', - 'detail_posyandu', - 'petugas_posyandu', - 'petugas_posyandu_lokal', - 'jadwal_posyandu', - 'posyandu_reviews', - 'ulasan_posyandu' - ] - for (const table of tables) { - const { error } = await supabase.from(table).select('*').limit(1) - if (error) { - console.log(`Table "${table}": ERROR (${error.message})`) - } else { - console.log(`Table "${table}": EXISTS`) - } - } -} - -listTables() diff --git a/tmp/test_insert.ts b/tmp/test_insert.ts deleted file mode 100644 index 19764f7..0000000 --- a/tmp/test_insert.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createClient } from '@supabase/supabase-js' -import * as fs from 'fs' -import * as path from 'path' - -const envPath = path.join(process.cwd(), '.env.local') -const envContent = fs.readFileSync(envPath, 'utf-8') -const envVars: Record = {} -envContent.split('\n').forEach(line => { - const parts = line.split('=') - if (parts.length >= 2) { - envVars[parts[0].trim()] = parts.slice(1).join('=').trim() - } -}) - -const supabaseUrl = envVars.NEXT_PUBLIC_SUPABASE_URL -const supabaseAnonKey = envVars.NEXT_PUBLIC_SUPABASE_ANON_KEY - -const supabase = createClient(supabaseUrl, supabaseAnonKey) - -async function testInsert() { - console.log('Inserting into cetak_balita...') - const idBerkas = Date.now() - const { data: insertData, error: insertError } = await supabase - .from('cetak_balita') - .insert({ - id_berkas: idBerkas, - nama_balita: 'Test Balita' - }) - .select() - - if (insertError) { - console.error('Insert Error:', insertError) - } else { - console.log('Insert Success, inserted data:', insertData) - - // Let's delete it so we keep database clean - const { error: deleteError } = await supabase - .from('cetak_balita') - .delete() - .eq('id_berkas', idBerkas) - - if (deleteError) { - console.error('Delete Error:', deleteError) - } else { - console.log('Successfully cleaned up test record') - } - } -} - -testInsert()