--- cara mengaktifkan pg_net
create extension if not exists pg_net;
--- cara mengecek pg_net
select * from pg_available_extensions where name = 'pg_net';
create or replace function trg_send_wa_on_booking_insert()
returns trigger
language plpgsql
as $$
declare
wa_url text;
pesan_raw text;
pesan_encoded text;
penerima text;
begin
if new.nomor_wa is null then
return new;
end if;
-- Pesan asli
pesan_raw := format(
'Assalamu’alaikum warahmatullahi wabarakatuh.%s' ||
'Pengajuan peminjaman aula untuk kegiatan "%s" telah kami terima dan saat ini sedang menunggu proses persetujuan.%s%s' ||
'Mohon menunggu konfirmasi selanjutnya — informasi resmi akan disampaikan oleh Admin Aula melalui nomor berikut:%s' ||
'📞 +62 858-5573-1575.%s%s' ||
'Status saat ini: %s.',
E'\\n\\n',
new.event_name,
E'\\n\\n',
E'\\n\\n',
E'\\n',
E'\\n\\n',
E'\\n',
new.status
);
-- Encode karakter agar aman di URL
pesan_encoded := replace(pesan_raw, ' ', '%20');
pesan_encoded := replace(pesan_encoded, E'\\n', '%0A');
pesan_encoded := replace(pesan_encoded, '''', '%27');
pesan_encoded := replace(pesan_encoded, '’', '%27');
pesan_encoded := replace(pesan_encoded, '“', '%22');
pesan_encoded := replace(pesan_encoded, '”', '%22');
pesan_encoded := replace(pesan_encoded, ',', '%2C');
pesan_encoded := replace(pesan_encoded, '.', '%2E');
-- Nomor penerima
penerima := new.nomor_wa || '|6285855731575';
-- Buat URL final
wa_url := '<https://sender.digilunar.com/send-message>'
|| '?api_key=tq1t9SX4udY7gwDGkdFsKlBP03J103'
|| '&sender=6285708249267'
|| '&number=' || penerima
|| '&message=' || pesan_encoded;
-- Debug opsional: bisa diaktifkan dulu untuk tes
-- raise notice 'WA URL: %', wa_url;
perform net.http_get(url := wa_url);
return new;
end;
$$;
drop trigger if exists trg_booking_send_wa on bookings;
create trigger trg_booking_send_wa
after insert on bookings
for each row
execute function trg_send_wa_on_booking_insert();
-----------------
INFORMASI
-----------------
Izin melaporkan laporan keuangan kantin putra, sebagai berikut :
Laporan transaksi yang ke- 15
Tanggal : 19 Januari 2026
Periode : Januari 2026
Perolehan : Rp 140.500
Pengeluaran : Rp 24.000
Sisa Bersih : Rp 116.500
---------------------------------------------
Total Sisa Bersih Sampai Saat Ini: Rp 351.800
---------------------------------------------
⚠️ Pola pengiriman, encoding, sender SAMA PERSIS
(karena sudah terbukti terkirim)
create or replace function send_wa_laporan_keuangan(
p_tanggal date
)
returns void
language plpgsql
as $$
declare
v record;
total_sisa numeric;
jumlah_transaksi integer;
wa_url text;
pesan_raw text;
pesan_encoded text;
penerima text;
begin
-- Ambil laporan harian
select
tanggal,
periode_bulan,
infaq_pondok,
total_pengeluaran,
sisa_bersih_setor
into v
from view_laporan_keuangan_detail
where tanggal = p_tanggal
limit 1;
if not found then
raise exception 'Data laporan tidak ditemukan';
end if;
-- Hitung jumlah transaksi bulan ini
select count(*)
into jumlah_transaksi
from view_laporan_keuangan_detail
where periode_bulan = v.periode_bulan;
-- Total sisa bersih sampai saat ini
select coalesce(sum(sisa_bersih_setor), 0)
into total_sisa
from view_laporan_keuangan_detail
where tanggal <= p_tanggal;
-- Ambil WA kepala pondok
select "WA Kepala Pondok"
into penerima
from tahun_pelajaran
where aktif = true
limit 1;
if penerima is null then
raise exception 'WA Kepala Pondok kosong';
end if;
-- PESAN (FORMAT FINAL)
pesan_raw :=
'-----------------' || E'\\n' ||
'INFORMASI' || E'\\n' ||
'-----------------' || E'\\n\\n' ||
'Izin melaporkan laporan keuangan kantin putra, sebagai berikut :' || E'\\n' ||
'Laporan transaksi yang ke- ' || jumlah_transaksi || E'\\n\\n' ||
'Tanggal : ' || to_char(v.tanggal, 'DD FMMonth YYYY') || E'\\n' ||
'Periode : ' || to_char(v.tanggal, 'FMMonth YYYY') || E'\\n\\n' ||
'Perolehan : Rp ' || to_char(v.infaq_pondok, 'FM999G999G999') || E'\\n' ||
'Pengeluaran : Rp ' || to_char(v.total_pengeluaran, 'FM999G999G999') || E'\\n' ||
'Sisa Bersih : Rp ' || to_char(v.sisa_bersih_setor, 'FM999G999G999') || E'\\n\\n' ||
'---------------------------------------------' || E'\\n' ||
'Total Sisa Bersih Sampai Saat Ini: Rp ' ||
to_char(total_sisa, 'FM999G999G999') || E'\\n' ||
'---------------------------------------------';
-- ENCODE (JANGAN DIUBAH)
pesan_encoded := replace(pesan_raw, ' ', '%20');
pesan_encoded := replace(pesan_encoded, E'\\n', '%0A');
pesan_encoded := replace(pesan_encoded, '''', '%27');
pesan_encoded := replace(pesan_encoded, '’', '%27');
pesan_encoded := replace(pesan_encoded, ',', '%2C');
pesan_encoded := replace(pesan_encoded, '.', '%2E');
-- URL FINAL
wa_url :=
'<https://sender.digilunar.com/send-message>'
|| '?api_key=tq1t9SX4udY7gwDGkdFsKlBP03J103'
|| '&sender=6285229944411'
|| '&number=' || penerima
|| '&message=' || pesan_encoded;
perform net.http_get(url := wa_url);
end;
$$;
select send_wa_laporan_keuangan('2026-01-19');
create or replace function send_wa_laporan_delivery(
p_delivery_id uuid
)
returns void
language plpgsql
as $$
declare
v_delivery_date date;
v_store_name text;
v_penerima text;
v_pengirim text;
v_petugas_name text;
v_items text;
v_tanggal_id text;
v_hari text;
v_bulan text;
wa_url text;
pesan_raw text;
pesan_encoded text;
begin
-- Ambil data delivery + store
select
d.delivery_date,
s.name,
s."No WA Petugas",
s."Nama Petugas",
s.nomor_pengirim
into
v_delivery_date,
v_store_name,
v_penerima,
v_petugas_name,
v_pengirim
from deliveries d
join stores s on s.id = d.store_id
where d.id = p_delivery_id;
if not found then
raise exception 'Delivery tidak ditemukan';
end if;
if v_penerima is null then
raise exception 'No WA Petugas kosong';
end if;
if v_pengirim is null then
raise exception 'Nomor pengirim kosong';
end if;
if v_petugas_name is null then
raise exception 'Nama Petugas kosong';
end if;
-- Nama hari (Indonesia)
v_hari := case extract(dow from v_delivery_date)
when 0 then 'Minggu'
when 1 then 'Senin'
when 2 then 'Selasa'
when 3 then 'Rabu'
when 4 then 'Kamis'
when 5 then 'Jumat'
when 6 then 'Sabtu'
end;
-- Nama bulan (Indonesia)
v_bulan := case extract(month from v_delivery_date)
when 1 then 'Januari'
when 2 then 'Februari'
when 3 then 'Maret'
when 4 then 'April'
when 5 then 'Mei'
when 6 then 'Juni'
when 7 then 'Juli'
when 8 then 'Agustus'
when 9 then 'September'
when 10 then 'Oktober'
when 11 then 'November'
when 12 then 'Desember'
end;
-- Format tanggal final
v_tanggal_id :=
v_hari || ', ' ||
extract(day from v_delivery_date)::int || ' ' ||
v_bulan || ' ' ||
extract(year from v_delivery_date)::int;
-- Ambil daftar item delivery
select string_agg(
'- ' || p.name || ' sebanyak ' || di.quantity || ' buah',
E'\\n'
)
into v_items
from delivery_items di
join products p on p.id = di.product_id
where di.delivery_id = p_delivery_id;
if v_items is null then
raise exception 'Delivery item kosong';
end if;
-- PESAN FINAL
pesan_raw :=
'Assalamu’alaikum warahmatullahi wabarakatuh.' || E'\\n\\n' ||
v_petugas_name || ', hari ' || v_tanggal_id ||
' saya menyetorkan:' || E'\\n' ||
v_items || E'\\n' ||
'di ' || v_store_name || '.';
-- ENCODE
pesan_encoded := replace(pesan_raw, ' ', '%20');
pesan_encoded := replace(pesan_encoded, E'\\n', '%0A');
pesan_encoded := replace(pesan_encoded, '''', '%27');
pesan_encoded := replace(pesan_encoded, '’', '%27');
pesan_encoded := replace(pesan_encoded, ',', '%2C');
pesan_encoded := replace(pesan_encoded, '.', '%2E');
-- URL FINAL
wa_url :=
'<https://sender.digilunar.com/send-message>'
|| '?api_key=tq1t9SX4udY7gwDGkdFsKlBP03J103'
|| '&sender=' || v_pengirim
|| '&number=' || v_penerima
|| '&message=' || pesan_encoded;
perform net.http_get(url := wa_url);
end;
$$;