h-1 lebaran

This commit is contained in:
Khafidh Fuadi
2025-03-30 14:45:16 +07:00
parent c008020705
commit 5aaeb58d2b
91 changed files with 9448 additions and 3756 deletions

108
assets/sql/README.md Normal file
View File

@ -0,0 +1,108 @@
# Fungsi SQL untuk Supabase
File-file SQL di direktori ini berisi fungsi-fungsi yang perlu dijalankan pada database Supabase untuk mendukung fitur-fitur aplikasi.
## Cara Menginstal Fungsi SQL
1. Login ke dashboard Supabase untuk project Anda
2. Buka bagian "SQL Editor"
3. Klik "New Query"
4. Copy dan paste isi file SQL yang ingin diinstal (misalnya `batch_update_jadwal_status.sql`)
5. Jalankan query dengan mengklik tombol "Run"
## Daftar Fungsi SQL
### batch_update_jadwal_status
Fungsi ini digunakan untuk mengupdate status banyak jadwal sekaligus, yang lebih efisien daripada melakukan update satu per satu.
**Sintaks Penggunaan:**
```sql
SELECT batch_update_jadwal_status(
ARRAY[
'{"id": "jadwal-id-1", "status": "AKTIF"}',
'{"id": "jadwal-id-2", "status": "BATALTERLAKSANA"}'
]::jsonb[],
'2023-01-01T00:00:00Z'
);
```
**Parameter:**
- `jadwal_updates`: Array dari objek JSON dengan properti `id` dan `status`
- `updated_timestamp` (opsional): Waktu update dalam format ISO 8601
**Status yang Valid:**
Berikut adalah nilai-nilai yang valid untuk kolom status (enum `StatusPenyaluranBantuan`):
- `DIJADWALKAN` - Jadwal telah dibuat tapi belum aktif
- `AKTIF` - Jadwal sedang berlangsung
- `TERLAKSANA` - Jadwal telah berhasil dilaksanakan
- `BATALTERLAKSANA` - Jadwal tidak terlaksana atau dibatalkan
**Contoh Response:**
```json
{
"success": true,
"updated_count": 2,
"success_ids": ["jadwal-id-1", "jadwal-id-2"],
"timestamp": "2023-01-01T00:00:00Z",
"errors": {
"count": 0,
"ids": [],
"messages": []
}
}
```
## Cara Menguji Fungsi
Setelah fungsi diinstal, Anda dapat mengujinya dengan menjalankan query berikut pada SQL Editor:
```sql
-- Pastikan status yang digunakan sesuai dengan enum StatusPenyaluranBantuan
SELECT batch_update_jadwal_status(
ARRAY[
'{"id": "534cb328-1fd9-4945-8642-c99b8e1acb2d", "status": "DIJADWALKAN"}'
]::jsonb[]
);
```
Ganti `534cb328-1fd9-4945-8642-c99b8e1acb2d` dengan ID jadwal yang valid dari tabel `penyaluran_bantuan` Anda.
## Membuat Enum di Database (Jika Belum Ada)
Jika enum `StatusPenyaluranBantuan` belum ada di database, Anda dapat membuatnya dengan query berikut:
```sql
CREATE TYPE "StatusPenyaluranBantuan" AS ENUM (
'DIJADWALKAN',
'AKTIF',
'TERLAKSANA',
'BATALTERLAKSANA'
);
```
## Troubleshooting
Jika muncul error:
- Periksa apakah ID jadwal valid dan ada di tabel `penyaluran_bantuan`
- Pastikan format UUID benar (harus berupa UUID valid, bukan string biasa)
- Periksa apakah nilai status valid dan sesuai dengan tipe enum `StatusPenyaluranBantuan`
- Pastikan tabel `penyaluran_bantuan` memiliki kolom `status` dengan tipe data enum `StatusPenyaluranBantuan` dan kolom `updated_at`
Error umum:
1. `column "status" is of type "StatusPenyaluranBantuan" but expression is of type text` - Ini terjadi karena kolom status memiliki tipe enum, bukan teks biasa. Fungsi sudah menyertakan cast ke enum.
2. `operator does not exist: uuid = text` - Ini terjadi jika ID tidak dikonversi ke UUID. Fungsi sudah menyertakan cast ke UUID.
## Menambahkan Nilai Baru ke Enum
Jika perlu menambahkan nilai enum baru di masa depan, gunakan SQL berikut:
```sql
ALTER TYPE "StatusPenyaluranBantuan" ADD VALUE 'NILAI_BARU';
```

View File

@ -0,0 +1,80 @@
-- Fungsi untuk memperbarui status banyak jadwal sekaligus
-- Penggunaan:
-- SELECT batch_update_jadwal_status(
-- ARRAY[
-- '{"id": "jadwal-id-1", "status": "AKTIF"}',
-- '{"id": "jadwal-id-2", "status": "BATALTERLAKSANA"}'
-- ]::jsonb[],
-- '2023-01-01T00:00:00Z'
-- );
CREATE OR REPLACE FUNCTION public.batch_update_jadwal_status(
jadwal_updates jsonb[],
updated_timestamp text DEFAULT NOW()
) RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
jadwal_item jsonb;
jadwal_id text;
new_status text;
updated_count int := 0;
success_ids text[] := '{}';
result jsonb;
error_ids text[] := '{}';
error_messages text[] := '{}';
BEGIN
-- Loop melalui setiap item dalam array
FOREACH jadwal_item IN ARRAY jadwal_updates
LOOP
-- Ekstrak ID dan status dari item JSON
jadwal_id := jadwal_item->>'id';
new_status := jadwal_item->>'status';
-- Konversi ID string ke UUID secara eksplisit dan status ke enum
BEGIN
-- Update jadwal penyaluran dengan cast eksplisit ke UUID dan StatusPenyaluranBantuan
UPDATE public.penyaluran_bantuan
SET
status = new_status::public."StatusPenyaluranBantuan",
updated_at = updated_timestamp
WHERE id = jadwal_id::uuid;
-- Jika berhasil diperbarui
IF FOUND THEN
updated_count := updated_count + 1;
success_ids := array_append(success_ids, jadwal_id);
END IF;
EXCEPTION
WHEN invalid_text_representation THEN
-- Log error jika konversi UUID gagal
RAISE NOTICE 'Invalid UUID format: %', jadwal_id;
error_ids := array_append(error_ids, jadwal_id);
error_messages := array_append(error_messages, 'Invalid UUID format');
WHEN others THEN
-- Tangkap error lainnya
RAISE NOTICE 'Error updating status for jadwal ID %: %', jadwal_id, SQLERRM;
error_ids := array_append(error_ids, jadwal_id);
error_messages := array_append(error_messages, SQLERRM);
END;
END LOOP;
-- Buat hasil dalam format JSON
result := jsonb_build_object(
'success', updated_count > 0,
'updated_count', updated_count,
'success_ids', success_ids,
'timestamp', updated_timestamp,
'errors', jsonb_build_object(
'count', array_length(error_ids, 1),
'ids', error_ids,
'messages', error_messages
)
);
RETURN result;
END;
$$;