Mengaktifkan pg_net

  --- cara mengaktifkan pg_net
create extension if not exists pg_net;
 
 --- cara mengecek pg_net
 select * from pg_available_extensions where name = 'pg_net';
 

Trigger + Function (AFTER INSERT)

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();

PAKAI FUNCTION BIASA


2️⃣ FORMAT PESAN (FINAL SESUAI PERMINTAAN)

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


3️⃣ FUNCTION FINAL (SUDAH DIPERBAIKI & SIAP PRODUKSI)

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


4️⃣ CARA TES

select send_wa_laporan_keuangan('2026-01-19');


Kirim WA Roti

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