Files
penyaluran_app/assets/sql/batch_update_jadwal_status.sql
Khafidh Fuadi 5aaeb58d2b h-1 lebaran
2025-03-30 14:45:16 +07:00

80 lines
2.4 KiB
PL/PgSQL

-- 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;
$$;