SMS handler functions

Daftar isi

AH: Akhir Hewan

Format pesan

AH [ID Pemilik] [ID Hewan] [Kondisi Hewan]

Reply SQL

select format(get_string('AH_reply', sms_userid),
  h.identifikasi,
  get_species_name(h.idspesies,sms_userid),
  s.name[get_lang(sms_userid)],
  nama(get_farmer_id(params[1])),
  t.name[get_lang(sms_userid)])
from kejadian k
join hewan h on h.id = k.idhewan and not h.del
join sex s on s.id = h.idsex and not s.del
join tipeakhir t on t.id = k.datakejadian::integer and not t.del
where k.msgid = sms_msgid 

Business Rules

Hook: sms_postinsert; Order: 1
update pemilik_hewan
set tanggalakhir = now(),
    modifiedon = now(),
    modifiedby = $1
from hewan h
where h.id = idhewan
  and idpemilik = get_farmer_id($2[1],$1)
  and h.identifikasi = upper($2[2])
  and tanggalakhir is null
  and not pemilik_hewan.del
  and not h.del

BB: Berat Badan

Format pesan

BB [ID Pemilik] [ID hewan] [Berat Badan]

Reply SQL

select format(get_string('BB_reply',sms_userid),
get_species_name(h.idspesies,sms_userid), 
h.identifikasi,
sex.name[get_lang(sms_userid)], 
nama(p.idpemilik::integer),
l.name,
k.datakejadian)
from kejadian k
left outer join hewan h on k.idhewan = h.id
left outer join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
left outer join sex on sex.id = h.idsex
left outer join users u on u.id = p.idpemilik
left outer join locations l on l.id = u.locationid
where k.msgid = sms_msgid 

Business Rules

Hook: sms_validate; Order: 10
Select 
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan berat badan yang sama pada hari ini.') end
from 
(select k.id
-- get_animal_id(upper($2[1]),upper($2[2]),$1) as x 
from kejadian k

where k.idtipekejadian=4  -- kelahiran
and not k.del 
AND k.idhewan=get_animal_id(upper($2[1]),upper($2[2]),$1) -- same animal
AND k.createdon::date=now()::date -- same date
AND k.datakejadian = $2[3]--same calve
AND k.createdby = $1 -- same inseminator

 ) as z

BCS: Kondisi Score

Format pesan

BCS [ID Pemilik] [ID Hewan] [score 1,2,3,4,5]

Reply SQL

select format(get_string('BCS_reply',sms_userid),
  k.datakejadian,
  get_species_name(h.idspesies,sms_userid), 
  h.identifikasi,
  -- sex.name[get_lang(sms_userid)], 
  nama(p.idpemilik::integer),
  l.name)
from kejadian k
left outer join hewan h on k.idhewan = h.id
left outer join pemilik_hewan p on p.idhewan = h.id --and p.tanggalakhir is null
left outer join sex on sex.id = h.idsex
left outer join users u on u.id = p.idpemilik
left outer join locations l on l.id = u.locationid
where k.msgid = sms_msgid 

BCSK: Kondisi Score Kelompok Hewan

Format pesan

BCSK [Kode Kelompok] ([Nilai Kondisi] [Jumlah hewan]...)

Reply SQL

select
format(get_string('BCSK_reply', sms_userid), 
string_agg(format ('%s (%s)', t1.nilai, t1.jumlahhewan),', '))
from
(select
bcs.nilai
, sum(kk.jumlahhewan) as jumlahhewan
from kejadiankelompok kk 
join bcs on bcs.id=kk.idklasifikasi and not bcs.del
where 
kk.idtipekejadian=15
and not kk.del
and kk.msgid=sms_msgid
group by 1
order by 1) t1 

BH: Birahi

Format pesan

BH {ID Pemilik} [ID Hewan]

Reply SQL

with an as (
select 
  ph.idpemilik as idpemilik
  , h.id as idhewan
  from hewan h
  join pemilik_hewan ph on ph.idhewan=h.id and ph.idpemilik=get_farmer_id(coalesce(params[1],sms_phone),sms_userid)
  where h.identifikasi=upper(params[2])
)
select format(get_string('BH_reply', sms_userid),
  get_species_name(idspesies,sms_userid),
  identifikasi,
  coalesce(inseminator, registrar)) 
from hewan h
join an on true
left outer join (
  select format ('%s (%s)',nama(u.id), local_phone(phone)) as inseminator 
  from kejadian k
  join an on true
  join users u on k.createdby = u.id and not u.del
  where k.idhewan = an.idhewan
  and not k.del
  and k.idtipekejadian in (2,3)
  and k.createdby <> an.idpemilik
  order by reportdate desc
  limit 1) as foo on true
 left outer join ( 
select format ('%s (%s)',nama(u.createdby), local_phone(phone)) 
as registrar 
from users u where u.id=get_farmer_id(coalesce(params[1],sms_phone))) as bar on true
where h.id = an.idhewan 

Alert SQL

with an as (
select 
  ph.idpemilik as idpemilik
  , h.id as idhewan
  from hewan h
  join pemilik_hewan ph on ph.idhewan=h.id and ph.idpemilik=get_farmer_id(coalesce(params[1],sms_phone),sms_userid)
  where h.identifikasi=upper(params[2])
)
select u1.phone, format(get_string('BH_alert', u1.id),
  h.identifikasi,
  get_species_name(h.idspesies,u1.id),
  nama(u.id), 
  local_phone(u.phone),
  l.name) 
from users u1 
join an on true
join users u on u.id = an.idpemilik
join hewan h on h.id = an.idhewan
join locations l on u.locationid = l.id
where u1.id in  (
select distinct uid from (
select * from
  (select 1 as natord, k.createdby as uid
  from kejadian k
  join users u on k.createdby = u.id and not u.del
  where k.idhewan in (
    select idhewan from pemilik_hewan
    where idpemilik = get_farmer_id(coalesce(params[1],sms_phone),sms_userid)
    and tanggalakhir is null
    and not del
  )
  and not k.del
  and idtipekejadian in (2,3)
  order by reportdate desc
  limit 1) as foo
union
select 2, createdby from users u
where u.id = sms_userid
/*
-- ========== Training Modifications ============
-- add all local inseminators for training
union
select 3, u.id from users u 
join users u2 on u2.id = sms_userid
where is_permitted('get_bh_alert',u.id)
-- 19 = any(u.groupid)
and ischildlocation(u.area, u2.locationid)
and not u.del */
-- disable limit for training
order by natord 
limit 1
) as foo )
 

CIP: Cari Identifikasi Peternak

Format pesan

CIP [Nama Peternak] [Kode Lokasi]

Reply SQL

/* 
-- old version
-- doesn't work because no order clause

select * from
(
Select format(get_string('CIP_notfound', sms_userid)) 
UNION 
(
select * from ( 
select format(get_string('CIP_reply',sms_userid), lokasi, string_agg(format('%s(%s)',nama,idpeternak),',')) as ab 
from 
(
select upper(firstname) as nama, local_phone(phone) as idpeternak, get_location_rev(u.locationid) AS lokasi 
from users u join locations s on u.locationid=s.id and s.code= params[2] and s.validto is null and not s.del and s.level=5 where groupid =array[10] ) as x 
where upper(nama) LIKE upper(params[1]||'%') group by lokasi ) as y 
) ) as xz limit 1
*/
-- new version
select msg from (
select 2 as seq, format(get_string('CIP_notfound', sms_userid)) as msg
UNION 
select 1, format(get_string('CIP_reply',sms_userid),lokasi,
      string_agg(format('%s(%s)',nama,idpeternak),','))
from ( 
  select 
    upper(firstname) as nama, 
    local_phone(phone) as idpeternak, 
    get_location_rev(u.locationid) AS lokasi 
  from users u 
  join locations s on u.locationid=s.id 
    and s.code= params[2]
    and s.validto is null 
    and not s.del 
    and s.level=5 
  where groupid =array[10] 
) as x 
where upper(nama) LIKE upper(params[1]||'%') 
group by lokasi 
order by seq asc
limit 1) y
 

CKAB: Cari Kode Asal Bibit

Format pesan

CKAB [asal bibit]

Reply SQL

select 
  coalesce(
    case when length(msg) < 160 then msg 
    else
      left(msg, 160)
    end,
  format(get_string('CKAB_notfound',sms_userid),params[1]))
from (
  select 
    get_string('CKAB_reply',sms_userid)||string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name[1], code) as sgn
    from asalbibit
    where similarity(upper(name[1]), upper(params[1])) > 0.1
    order by similarity(upper(name[1]), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar 

CKH: Cari Kode Hewan

Format pesan

CKH [species]

Reply SQL

select 
  coalesce(msg, format(get_string('CKH_notfound',sms_userid),params[1]))
from (
  select string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name[1], code) as sgn
    from species 
    where not del and level >=3 and similarity(upper(name[1]), upper(params[1])) > 0.1 and left(hiercode,2) not in ('10','11')
    order by similarity(upper(name[1]), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar 

CKHI: Cari Kode Hijauan

Format pesan

CKHI [jenis hijauan]

Reply SQL

select 
  coalesce(
    case when length(msg) < 160 then msg 
    else
      left(msg, 160)
    end,
  format(get_string('CKHI_notfound',sms_userid),params[1]))
from (
  select 
    get_string('CKHI_reply',sms_userid)||string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name[1], code) as sgn
    from jenishijauan
    where similarity(upper(name[1]), upper(params[1])) > 0.1
    order by similarity(upper(name[1]), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar 

CKI: Cari kode infrastruktur

Format pesan

CKI [jenis infrastruktur] [lokasi]

Reply SQL

select rep from (
select  
  1 as ord,
  format( get_string('CKI_reply',sms_userid),
    it2.name[get_lang(sms_userid)],
    get_location(l.id),
    string_agg(format('%s: %s',i.name, i.code),'; ')) as rep
from infrastructure i
join infrastructure_types it1
  on it1.id = i.infrastructure_typeid
join infrastructure_types it2 
  on it2.code = upper(params[1])
join locations l on l.code = params[2]
where 
  is_child(it2.hiercode, it1.hiercode) 
  and is_parent_area(i.locationid, l.id)
  and not i.del
group by it2.name[get_lang(sms_userid)], get_location(l.id)

UNION

select 
  2,
  (get_string('CKI_notfound', 2) ) 
)foo
order by ord limit 1 

CKJS: Cari kode jenis spesimen

Format pesan

CKJS [jenis specimen]

Reply SQL

select 
  coalesce(msg, format(get_string('CKJS_notfound',sms_userid),params[1]))
from (
  select string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name[1], code) as sgn
    from specimentypes
    where similarity(upper(name[1]), upper(params[1])) > 0.1
    order by similarity(upper(name[1]), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar 

CKL: Cari kode lokasi

Format pesan

CKL [nama lokasi]

Reply SQL

select trunc_sms(string_agg(msg, '; '),2)
from (
select coalesce(name, format(get_string('CKL_notfound',sms_userid),params[1])) as msg
from (

select 
  format('%s: %s', name, code) as name,
  (3.0+ (1.0-length(code)/10.0))::float as match
from locations
where upper(trim(params[1])) = upper(name)
and not del
and validto is null

UNION

select 
  format('%s: %s', name, code) as name,
  (2.0+ (1.0-length(code)/10.0))::float as match
from locations
where (name ~* ('^'||params[1]||'\M'))
and not del
and upper(trim(params[1])) <> upper(name)
and validto is null

UNION

select 
  format('%s: %s', name, code) as name,
  (1.0+ (1.0-length(code)/10.0))::float as match
from locations
where (name ~* ('.+\m'||params[1]||'\M'))
and not del
and upper(trim(params[1])) <> upper(name)
and validto is null

UNION

select name, match from (
select 
  format('%s: %s', name, code) as name, 
  similarity(upper(name), upper(params[1])) as match
from locations 
where not del
and validto is null
and (name !~* ('\m'||params[1]||'\M'))
order by match desc
limit 10) as foo

order by match desc
limit 100

) as bar
) as too
 

CKO: Cari kode obat

Format pesan

CKO [obat]

Reply SQL

select 
  coalesce(
    case when length(msg) < 160 then msg 
    else
      left(msg, 160)
    end,
  format(get_string('CKO_notfound',sms_userid),params[1]))
from (
  select 
    get_string('CKO_reply',sms_userid)||string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name, code) as sgn
    from drugs
    where similarity(upper(name), upper(params[1])) > 0.1
    order by similarity(upper(name), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar 

CKP: Cari kode penyakit

Format pesan

CKP [penyakit]

Reply SQL

select 
  coalesce(string_agg(msg,'; '), format(get_string('CKP_notfound',sms_userid), params[1]))
from (
select 
  id,
  format('%s%s: %s',
    syn, 
    case when syn=name then  else format(' (%s)', name) end, 

    code
  ) as msg,
  similarity(syn,  params[1]) as sim 
from (
  select 
    id,
    code,
    name[1] as name,
    unnest(name||synname||code) as syn
  from diseases
  where not del
) as foo
where params[1] % syn
order by sim desc
limit 10
) as bar 

CKPR: Cari Kode Produk

Format pesan

CKPR [Produk]

Reply SQL

select coalesce(msg, format(get_string('CKPR_notfound',sms_userid),params[1])) 
from ( 
	select string_agg(sgn, '; ') as msg 
	from ( 
		select format('%s %s', name[1], code) as sgn 
		from species 
		where not del and level >= 3 and similarity(upper(name[1]), upper(params[1])) > 0.1 
		and left(hiercode,2) in ('11')
		order by similarity(upper(name[1]), upper(params[1]))
		desc limit 20 
	) foo
) as bar 

CKS: Cari Kode Sampel (lingkungan)

Format pesan

CKS [species]

Reply SQL

select 
  coalesce(msg, format(get_string('CKS_notfound',sms_userid),params[1]))
from (
  select string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name[1], code) as sgn
    from species
    where similarity(upper(name[1]), upper(params[1])) > 0.1 and left(hiercode,2) in ('10','11')
    order by similarity(upper(name[1]), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar 

CKT: Cari kode tanda

Format pesan

CKT [tanda]

Reply SQL

/*select 
  coalesce(msg, format(get_string('CKT_notfound',sms_userid),params[1]))
from (
  select string_agg(sgn, '; ') as msg 
  from (
    select format('%s %s', name[1], code) as sgn
    from signs
    where similarity(upper(name[1]), upper(params[1])) > 0.1
    or
    similarity(upper(synname), upper(params[1])) > 0.1
    order by similarity(upper(name[1]), upper(params[1])) desc 
    limit 20
  ) foo 
) as bar */

select 
  coalesce(string_agg(msg,'; '), format(get_string('CKT_notfound',sms_userid), params[1]))
from (
select 
  id,
  format('%s%s: %s',
    syn, 
    case when syn=name then  else format(' (%s)', name) end, 

    code
  ) as msg,
  similarity(syn,  params[1]) as sim 
from (
  select 
    id,
    code,
    name[1] as name,
    unnest(name||synname||code) as syn
  from signs
  where not del
) as foo
where params[1] % syn
order by sim desc
limit 10
) as bar 

CPD: Cek Populasi Desa

Format pesan

CPD [spesies] [kode lokasi]

Reply SQL

select coalesce(foo,
case when get_location(params[2]) is null then format(get_string('E_location', sms_userid),params[2]) 
end)
from
(Select format(' %s jumlah populasi %s '||populasi,lokasi,hewan
)as foo 

from (
select  
case when (get_population(hid,lid)).total is not null  then (get_population(hid,lid)).total::text
  else ' tidak diketahui.'
end as populasi, lokasi, hewan, hid,lid from
(
	select 1 as xx, get_location_rev(loc.id) as "lokasi",loc.id as lid from locations loc where loc.code=params[2]
	) as lo
	Join
	(
	select 1 as xx,sp.id as hid, get_species_name(sp.id,sms_userid) as "hewan" from species sp where lower(sp.code)=lower(params[1])
	) as ho
	ON lo.xx=ho.xx
) as po
) as xxx  

Business Rules

Hook: sms_validate; Order: 10
select
  case 
    when length($2[2]) < 8 then 
      (1,get_string('E_notdesacode',$1))
    else 
      (0,null)
  end

CSR: Cari Status Reproduksi

Format pesan

CSR [ID Peternak] [ID Hewan]

Reply SQL

with bcs as (select coalesce(bcs.datakejadian,'tidak dilaporkan') as val 
  from hewan h 
  join pemilik_hewan ph on ph.idhewan=h.id and not ph.del and ph.tanggalakhir is null 
  join users u on u.id=ph.idpemilik and not u.del and local_phone(u.phone) ~ (params[1]||'$') 
  left join kejadian bcs on bcs.idtipekejadian=15 and h.id=bcs.idhewan and not bcs.del 
  where upper(h.identifikasi) = upper(params[2]) and not h.del 
  order by bcs.reportdate desc limit 1)

select 
msg 
from 
(select 
2 as seq
, get_string('CSR_notfound', sms_userid) as msg
union
select
*
from
(select 
1
, format(get_string('CSR_reply', sms_userid)
, add_checkdigit(k.id)
, get_farmer_id(params[1])
, h.identifikasi
, sr.name[get_lang(sms_userid)]
, bcs.val
, tanggal(k.reportdate))
from kejadian k
join statusrepro sr on k.datakejadian::integer=sr.id and not sr.del
join hewan h on h.id = k.idhewan and not h.del 
join pemilik_hewan ph on ph.idhewan=h.id and not ph.del and ph.tanggalakhir is null 
join users u on u.id=ph.idpemilik and not u.del and local_phone(u.phone) ~ (params[1]||'$') 
join bcs on true
where 
upper(h.identifikasi) = upper(params[2])
and not k.del 
and k.idtipekejadian=16
order by k.reportdate desc limit 1) t1
order by seq asc
limit 1) t2
 

CUL: Pemusnahan

Format pesan

CUL [ID program] ([spesies] [jumlah hewan]...) [ID lokasi]

Reply SQL

select format(get_string('CUL_reply',sms_userid),
  res, get_disease_names(p.diseaseid,2), 
  get_location(locationid), p.name)
from (
select 
  min(programafkirid) as programid,
  min(locationid) as locationid,
  string_agg(format('%s %s',jumlah, get_species_name(speciesid, sms_userid)), ', ') as res
from afkir
where msgid = sms_msgid) as foo
join programafkir p on p.id = foo.programid 

CV: Cek cakupan vaksinasi

Format pesan

CV [kode lokasi]

Reply SQL

select 
  x7 
from (

select 1 as srtodr, coalesce(foo,
case when get_location(params[1]) is null then format(get_string('E_location', sms_userid),params[1]) 
else get_location(params[1]) end) as x7
from
(Select format('%s (%s %s divaksin %s) cakupan %s',lokasi,hewan,populasi,dose,round(cakupan::numeric,2)*100||'%')
as foo from (
select lokasi, hewan, populasi, sum(dose) as dose,sum(cakupan) as cakupan from 
(
Select lokasi,hewan,jumlah as populasi,
case when not dosis is null then dosis else 0 end as dose, 
case when not dosis/jumlah::numeric(8,3) is null then dosis/jumlah::numeric(8,3) else 0 end as cakupan from
(select
  get_location_rev(p.locationid) as "lokasi",
  at.name[1] as "hewan",
  p.locationid,
  total as "jumlah",
  at.species,
  reportdate::date as "Tanggal laporan"
from population p
join animal_types at on at.id = p.animaltypeid
join locations l on p.locationid = l.id and l.code=params[1]
join (
  select max(reportdate) as mdate, animaltypeid, locationid
  from population
  group by animaltypeid, locationid
) as maxdate on maxdate.animaltypeid = p.animaltypeid
  and maxdate.locationid = p.locationid
  and maxdate.mdate = p.reportdate
where not p.del  and at.species in(60)
  and ischildlocation( ARRAY[1], p.locationid )
order by l.code, at.name
) as pop
Join 
(Select 
v.locationid,
get_location_rev(v.locationid) as "Lokasi1",
get_species_name(sp.id,sms_userid) as "hewan1",
sp.id,
sum(v.firstdose) as "dosis"
 from vaccinations v 
 join species spc on spc.id=v.speciesid
 join species sp on sp.hiercode=left(spc.hiercode,5)
 where not v.del and left(spc.hiercode,5) in ('4.1.1')
 group by v.locationid,get_location(v.locationid) ,
spc.hiercode, sp.id order by get_species_name(sp.id,sms_userid) asc
) as vak

ON pop.locationid=vak.locationid 
AND pop.species=vak.id
) as xxx 
group by lokasi,hewan,populasi
) as zzz) as aaa 
Union
select 2, 
format(get_string('CV_notfound',sms_userid),params[1])

order by srtodr limit 1
) as bar 

CVR: Cek cakupan vaksinasi rabies

Format pesan

CVR [kode lokasi]

Reply SQL

select 
  x7 
from (

select 1 as srtodr, coalesce(foo,
format(get_string('CV_data', sms_userid),get_location(params[1]))) as x7 
from
(Select format('%s (%s %s divaksin %s) cakupan %s',lokasi,hewan,populasi,dose,round(cakupan::numeric,2)*100||'%')
as foo from (
select lokasi, hewan, populasi, sum(dose) as dose,sum(cakupan) as cakupan from 
(
Select lokasi,hewan,jumlah as populasi,
case when not dosis is null then dosis else 0 end as dose, 
case when not dosis/jumlah::numeric(8,3) is null then dosis/jumlah::numeric(8,3) else 0 end as cakupan from
(select
  get_location_rev(p.locationid) as "lokasi",
  at.name[1] as "hewan",
  p.locationid,
  total as "jumlah",
  at.species,
  reportdate::date as "Tanggal laporan"
from population p
join animal_types at on at.id = p.animaltypeid
join locations l on p.locationid = l.id and l.code=params[1]
join (
  select max(reportdate) as mdate, animaltypeid, locationid
  from population
  group by animaltypeid, locationid
) as maxdate on maxdate.animaltypeid = p.animaltypeid
  and maxdate.locationid = p.locationid
  and maxdate.mdate = p.reportdate
where not p.del  and at.species in(60)
  and ischildlocation( ARRAY[1], p.locationid )
order by l.code, at.name
) as pop
Join 
(Select 
v.locationid,
get_location_rev(v.locationid) as "Lokasi1",
get_species_name(sp.id,sms_userid) as "hewan1",
sp.id,
sum(v.firstdose) as "dosis"
 from vaccinations v 
 join species spc on spc.id=v.speciesid
 join species sp on sp.hiercode=left(spc.hiercode,5)
 where not v.del and left(spc.hiercode,5) in ('4.1.1')
 group by v.locationid,get_location(v.locationid) ,
spc.hiercode, sp.id order by get_species_name(sp.id,sms_userid) asc
) as vak

ON pop.locationid=vak.locationid 
AND pop.species=vak.id
) as xxx 
group by lokasi,hewan,populasi
) as zzz) as aaa 
Union
select 2, 
format(get_string('CV_notfound',sms_userid),params[1])

order by srtodr limit 1
) as bar 

Business Rules

Hook: sms_validate; Order: 10
select
  case 
    when length($2[1]) < 8 then 
      (1,get_string('E_notdesacode',$1))
    else 
      (0,null)
  end

D: Daftar pengguna

Format pesan

D 

Reply SQL

select 1 

DH: Daftar Hewan

Format pesan

DH [ID Peternak] ([Identifikasi Hewan] [Kode spesies] [Jenis Kelamin] [Umur]...)

Reply SQL

select 
  format (get_string('DH_reply',sms_userid),name, 
  string_agg(format('%s %s (%s)',species, sex, ids),'; '))
from (
select 
  nama(u.id) as name,  
  get_species_name(h.idspesies,sms_userid) as species, 
  sex.name[get_lang(sms_userid)] as sex,
  string_agg( h.identifikasi,', ') as ids
from hewan h
join pemilik_hewan p on p.idhewan = h.id
join users u on u.id = p.idpemilik 
join sex on sex.id = h.idsex
where h.msgid = sms_msgid
group by u.id, idspesies, sex.name[get_lang(sms_userid)]) as foo
group by name


 

Business Rules

Hook: sms_validate; Order: 0
drop table if exists regans
Hook: sms_validate; Order: 1
create temporary table regans (
  re text[], 
  ident varchar,
  species integer,
  sex integer,
  birth date
)
Hook: sms_validate; Order: 2
insert into regans (re)
--  select regexp_matches($2[2],
--    '(\w+)[\s,]+(\w+)[\s,]+(\w+)[\s]+(\d+[\.,]?\d*)', 'igm') as data;
  select array[data[1], data[2], data[3], replace(data[4],',','.')]::text[]    
  from (
    select regexp_matches($2[2],
      '(\w+)[\s,]+(\w+)[\s,]+(\w+)[\s]+(\d+[\.,]?\d*)', 'igm') as data 
  ) foo
Hook: sms_validate; Order: 3
select 
case when animals is not null
then (1,format(get_string('DH_duplicate',$1),animals)) 
else (0,) 

end as result
from ( 
select 
string_agg(code,',') as animals
from (
  select upper(re[1]) as code, count(*) as num from regans 
  group by upper(re[1])
) foo
where num>1) foo2

-- previous code
/*
select 
  case when max(count) > 1 
    then (1,format(get_string('DH_duplicate',$1), code))  
  else 
    (0,) 

  end as result 
from (
  select upper(re[1]) as code, count(*) from regans 
  group by upper(re[1])
) foo
group by code
*/
Hook: sms_validate; Order: 4
select 
  case when bool_and(emsg is null) then
    (0,)

  else
    (1,string_agg(emsg,'; '))
  end 
from (
select 
  case when count(*) = 0 then
    null
  else
    format(get_string('DHM_invspec',$1),
      string_agg(format('%s (%s)',r.re[1], r.re[2]),', '))
  end as emsg
from regans r
left outer join species s
  on s.code = upper(r.re[2])
where s.id is null
UNION
select 
  case when count(*) = 0 then
    null
  else
    format(get_string('DHM_invsex',$1),
      string_agg(format('%s (%s)',r.re[1], r.re[3]),', '))
  end as emsg
from regans r
left outer join sex s
  on s.code = upper(left(r.re[3],1))
where s.id is null
UNION
select 
  case when count(*) = 0 then
    null
  else
    format(get_string('DHM_invage',$1),
      string_agg(format('%s (%s)',r.re[1], r.re[4]),', '))
  end as emsg
from regans r
where r.re[4]::float > 30
UNION
select 
  case count(*)
  when 1 then null
  when 0 then format(get_string('DH_invfarmerid',$1), $2[1])
  else format(get_string('DH_matches',$1), count(*), $2[1])
  end as emsg
from get_farmer_ids($2[1],$1) 
/*
users u
join users u2 on u2.id = $1
where local_phone(u.phone) ~ ($2[1]||'$')
  and not u.del
  and ischildlocation(u2.area,u.locationid)
  and 10 = any(u.groupid)
*/
UNION
select 
  case count(*)
  when 0 then null
  else format(get_string('DH_dupan',$1), nama(u.id), string_agg(r.re[1],', '))
  end as emsg
from users u
join pemilik_hewan p on p.idpemilik = u.id
  and p.tanggalakhir is null
  and not p.del
join hewan h on h.id = p.idhewan
  and not h.del  
join regans r on h.identifikasi = upper(r.re[1])
where u.id = get_farmer_id($2[1],$1)
-- where u.phone ~ ($2[1]||'$')
  and not u.del
group by u.id
) as foo

Hook: sms_postinsert; Order: 1
update regans 
  set ident = upper(re[1]),
  species = s.id,
  sex = sex.id,
  birth = now()-(replace(re[4],',','.')||' years')::interval
from species s, sex 
where s.code = upper(re[2])
 and sex.code = upper(left(re[3], 1))
Hook: sms_postinsert; Order: 2
select 
  case when count(*) = 0 then
    (0,)

  else 
  (1,format(get_string('IDHEWANBARU_error',$1),string_agg(r.ident,',')))
  end
from hewan h
join pemilik_hewan ph on ph.idhewan = h.id
  and tanggalakhir is null and not ph.del
join users u on u.id = ph.idpemilik
  --and local_phone(u.phone) ~ ($2[1]||'$')
  and u.id = get_farmer_id($2[1], $1)
  and 10 = any(groupid)
  and not u.del
join regans r on upper(r.ident) = upper(h.identifikasi)
where not h.del
Hook: sms_postinsert; Order: 3
with andata as (
  insert into hewan (identifikasi, idspesies, idsex, tanggallahir, msgid, createdby)
  select ident, species, sex, birth, $3, $1
  from regans
  returning id
)
insert into pemilik_hewan (idpemilik, idhewan, msgid, createdby) 
  select get_farmer_id($2[1],$1), id, $3, $1 
  from andata

Hook: sms_postinsert; Order: 4
drop table regans
Hook: sms_postinsert; Order: 10
select
  case when  
    send_template_report('ID hewan', u.email, h.id, 
    case when get_param('hostname') = 'sidecar'
      then 'sidecar'
      else 'live'
    end) = 'True'
  then (0,)

  else (1,'Unable to send animal ID certificate by email') end
from hewan h
join users u on u.id = h.createdby
where h.msgid = $3
and u.email is not null
and trim(u.email) <> 

and not h.del

DHK: Daftar Hewan Kasus

Format pesan

DHK [ID Kasus]

Reply SQL

select format(get_string('DHK_reply',sms_userid),string_agg(seq,';') )as msg
from
	(select format('%s:%s',bar.name,string_agg(ansp,',')) as seq
	from
		(select name, format ('%s(%s)',foo.ids,row_number()over (order by urutan asc))as ansp
		from
			(select 
			 nama(p.idpemilik::integer) as name,
			 h.identifikasi as ids,
			ca.createdon as urutan
			from case_animals ca
			join hewan h on h.id = ca.idhewan and not h.del
			join pemilik_hewan p on p.idhewan = ca.idhewan and not p.del and tanggalakhir is null
			where add_checkdigit(ca.idcase) =  params[1]::integer
			and not ca.del
			and p.tanggalakhir is null
			order by ca.createdon) as foo
		group by name,ids,urutan) as bar
	group by name) as bee
 

DHP: Daftar hewan peternak

Format pesan

DHP {ID Peternak}

Reply SQL

with farmer as (
  select get_farmer_id(params[1],sms_userid) as id
) 
select msg from (
select 1 as ord,  format(get_string('DHP_reply',sms_userid),name, string_agg(ansp,'; ')) as msg
from (
select name, format ('%s %s: %s',species, gend, string_agg(foo.ids, ',')) as ansp
from (
select
  nama(p.idpemilik::integer) as name,
  sp.name[get_lang(sms_userid)] as species,
  s.name[get_lang(sms_userid)] as gend,
  identifikasi as ids
from pemilik_hewan p
join hewan h on h.id = p.idhewan and not h.del
join sex s on s.id = h.idsex
join species sp on sp.id = h.idspesies
join farmer on true
where p.idpemilik = farmer.id  
  and not p.del
  and p.tanggalakhir is null
order by identifikasi
) foo
group by name, species, gend) bar
group by name
UNION 
select 2, format(get_string('DHP_noanreg',sms_userid),nama(farmer.id)) from farmer
order by ord limit 1) as bar

/*
select msg from (
select 1 as ord,  format(get_string('DHP_reply',sms_userid),name, string_agg(ansp,'; ')) as msg
from (
select name, format ('%s %s: %s',species, gend, string_agg(foo.ids, ',')) as ansp
from (
select
  nama(p.idpemilik::integer) as name,
  sp.name[get_lang(sms_userid)] as species,
  s.name[get_lang(sms_userid)] as gend,
  identifikasi as ids
from pemilik_hewan p
join hewan h on h.id = p.idhewan
join sex s on s.id = h.idsex
join species sp on sp.id = h.idspesies
join users u on u.id = p.idpemilik 
  and u.phone = case     
    when params[1] ~ '^08\d{9,10}$' then -- valid mobile number
      '62'||ltrim(params[1],'0')
    when params[1] ~ '^[1-9]\d{11}$' then -- valid SIM number
      '1'||params[1]
    when params[1] ~ '^[1-9]\d{5,11}$' then  -- other numeric code
      '2'||lpad(params[1],12,'0')  end
and not h.del
and not p.del
and p.tanggalakhir is null
order by identifikasi
) foo
group by name, species, gend) bar
group by name
UNION 
select 2, format(get_string('DHP_noanreg',sms_userid),nama(get_farmer_id(params[1],sms_userid)))
order by ord limit 1) as bar
*/

-- old version
/*
select msg from (
select 1 as ord,  format(get_string('DHP_reply',sms_userid),name, string_agg(ansp,'; ')) as msg
from (
select name, format ('%s %s: %s',species, gend, string_agg(foo.ids, ',')) as ansp
from (
select 
  nama(p.idpemilik::integer) as name, 
  sp.name[get_lang(sms_userid)] as species, 
  s.name[get_lang(sms_userid)] as gend,
  identifikasi as ids
from pemilik_hewan p
join hewan h on h.id = p.idhewan
join sex s on s.id = h.idsex
join species sp on sp.id = h.idspesies
where p.idpemilik = coalesce(get_farmer_id(params[1],sms_userid), sms_userid)
and not h.del
and not p.del
and p.tanggalakhir is null
order by identifikasi
) foo
group by name, species, gend) bar
group by name
UNION 
select 2, format(get_string('DHP_noanreg',sms_userid),nama(get_farmer_id(params[1],sms_userid)))
order by ord limit 1) as bar
*/ 

DIP: Daftar Infrastruktur Pengguna

Format pesan

DIP [ID Pengguna] [Kode Infrastruktur] [Jenis Infrastruktur]

Reply SQL

select
  format(get_string('DIP_reply',sms_userid),
  nama(u.id),
  i.name) as msg
from users u
join infrastructure i on i.id=u.infraid and not i.del
join infrastructure_types it on it.id=i.infrastructure_typeid
and not it.del and it.code=upper(params[3])
where 
u.id = get_farmer_id(params[1],sms_userid)
and i.code = params[2]
and not u.del 

Business Rules

Hook: sms_postinsert; Order: 1
update users
set infraid=i.id
, modifiedby=$1
, modifiedon=now()
from infrastructure i
join infrastructure_types it on it.id=i.infrastructure_typeid and it.code=upper($2[3]) and not it.del
where 
i.code=$2[2]
and not i.del
and users.id = get_farmer_id($2[1],$1)

DKB: Daftar kode bangsa hewan

Format pesan

DKB [kode spesies]

Reply SQL

select string_agg(format('%s (%s)',s1.name[get_lang(sms_userid)], s1.code),'; ')
from species s1
where is_child_species(v_species_code, s1.id)
and s1.id <> v_species_code 

DKL: Daftar kode lokasi

Format pesan

DKL [kode lokasi]

Reply SQL

select rep from (select
  1 as srtodr,format('%s %s: %s',n, c,string_agg(lc,'; ')) as rep
from 
(select l2.name as n, l2.code as c, format('%s %s',l1.name,right(l1.code,2)) as lc
from locations l1
join locations l2 on l1.level = l2.level+1 
  and left(l1.code,length(l2.code))=l2.code
  and l2.validto is null and not l2.del
where l2.code = params[1]
and l1.validto is null
order by l1.code) as foo
group by n,c
union 
select 2, format(get_string('DKL_notfound',sms_userid),params[1])
order by srtodr limit 1) as bar 

DNC: Distribusi Nitrogen Cair

Format pesan

DNC [Jumlah liter] [Kode infrastruktur tujuan]

Reply SQL

select format(get_string('DNC_reply', sms_userid), add_checkdigit(s.id), ns.volume, i1.shortname, get_location(i1.locationid), i2.shortname, get_location(i2.locationid)) from shipments s join infrastructure i1 on i1.id = s.origininfraid join infrastructure i2 on i2.id = s.destinfraid join nitrogenshipment ns on ns.shipmentid = s.id where s.msgid = sms_msgid 

Alert SQL

with lid as (
 select 
  centroid,
format(get_string('DNC_alert',sms_userid),
add_checkdigit(s.id),ns.volume,i.name, i2.name,s.createdon::date 
) as msg
from shipments s 
join nitrogenshipment ns on ns.shipmentid = s.id 
join infrastructure i on i.id = s.origininfraid
join infrastructure i2 on i2.id = s.destinfraid
join users u2 on u2.id = s.createdby
join locations l on l.id = i2.locationid
where s.msgid = sms_msgid

),
gperm as (
  select array_agg(groupid) as p from group_permissions
  where permission_typeid = 37 and permission = 1
)
select
  u.phone,
  lid.msg
from users u
left join gperm on true
left join user_permissions up 
  on up.userid = u.id
  and up.permission_typeid =37
join locations l on array[l.id] && u.area
join lid on true 
-- reporter location
where (coalesce(up.permission=1,gperm.p && u.groupid))
  and st_contains(l.geom,lid.centroid) 

DP: Daftar Pemilik

Format pesan

DP [Nama] [Kode Lokasi] {Identifikasi pemilik}

Reply SQL

SELECT 
 case 
   when phone is null then format ('%s dari %s harus mengirimkan' ||
 ' pesan konfirmasi "KDP %s" dari nomor' ||
 ' handphone pengguna yang didaftarkan',
  firstname, 
  get_location(locationid),
 pin)
  else
    format ('%s dari %s telah didaftarkan dengan identifikasi %s %s', 
    firstname, get_location(locationid),
    case left(phone,1)
    when '6' then 'nomor HP'
    when '1' then 'nomor SIM'
    when '2' then 'nomor identifikasi'
    end,
    phone)
  end
 FROM 
  users
 where msgid=sms_msgid 

DSB: Distribusi Semen Beku

Format pesan

DSB ([Bangsa hewan] [Jumlah straw]...) [Kode infrastruktur tujuan]

Reply SQL

select format(get_string('DSB_reply', sms_userid), add_checkdigit(s.id), string_agg(format('%s (%s)',sp.name[1], total),', '), i1.shortname, get_location(i1.locationid), i2.shortname, get_location(i2.locationid) ) from shipments s join infrastructure i1 on i1.id = s.origininfraid join infrastructure i2 on i2.id = s.destinfraid join strawshipment ns on ns.shipmentid = s.id join species sp on sp.id = ns.breedid where s.msgid = sms_msgid group by s.id, i1.shortname, i1.locationid, i2.shortname, i2.locationid  

Alert SQL

with lid as (
 select 
  centroid,
format(get_string('DSB_alert',sms_userid),
add_checkdigit(s.id),i.name, i2.name,tanggal(s.createdon::date),
string_agg(format('%s(%s unit)', sp.name[1],ss.total), ', ') 
 
) as msg
from shipments s 
join strawshipment ss on ss.shipmentid = s.id 
join species sp on sp.id = ss.breedid
join infrastructure i on i.id = s.origininfraid
join infrastructure i2 on i2.id = s.destinfraid
join users u2 on u2.id = s.createdby
join locations l on l.id = i2.locationid
where s.msgid = sms_msgid
group by centroid,s.id,i.name,i2.name
),
gperm as (
  select array_agg(groupid) as p from group_permissions
  where permission_typeid = 37 and permission = 1
)
select
  u.phone,
  lid.msg
from users u
left join gperm on true
left join user_permissions up 
  on up.userid = u.id
  and up.permission_typeid =37
join locations l on array[l.id] && u.area
join lid on true 
-- reporter location
where (coalesce(up.permission=1,gperm.p && u.groupid))
  and st_contains(l.geom,lid.centroid) 

DX: Diagnosa definitif

Format pesan

DX [ID kasus] [diagnosa]

Reply SQL

select
  format(get_string('DX_reply', sms_userid), 
  d.name[get_lang(sms_userid)], 
  get_species_name(coalesce(s.speciesid, sy.speciesid),sms_userid),
  coalesce(get_syndrome_name(sy.syndromeid,sms_userid),
  get_sign_names(s.signsid,sms_userid)),
  get_location(c.locationid),
  tanggal(c.reportdate))
from diagnoses dx
join diseases d on dx.diseaseid = d.id
join cases c on c.id = dx.caseid
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where dx.msgid = sms_msgid 

GI: Ganti Identifikasi hewan

Format pesan

GI [ID Peternak] [ID Hewan Lama] [ID Hewan Baru]

Reply SQL

with foo as (
select get_animal_id(params[1],params[3]) as id
)
select format(get_string('GI_reply', sms_userid), 
  get_species_name(h.idspesies, sms_userid), 
  s.name[get_lang(sms_userid)], 
  nama(get_farmer_id(params[1])),
  params[2],
  params[3])
from hewan h
join sex s on h.idsex = s.id
join foo on true
where h.id = foo.id
and not h.del


/*
-- old version
select format(get_string('GI_reply', sms_userid), 
  get_species_name(h.idspesies, sms_userid), 
  s.name[get_lang(sms_userid)], 
  nama(get_farmer_id(params[1])),
  params[2],
  params[3])
from hewan h
join sex s on h.idsex = s.id
where h.id = get_animal_id(params[1],params[3])
and not h.del
*/ 

Business Rules

Hook: sms_validate; Order: 1
select 
case count(*)
when 1 then (0, null)
when 0 then (1,format(get_string('DH_invfarmerid',$1), $2[1]))
else (1,format(get_string('DH_matches',$1), count(*), $2[1]))
end as emsg
from get_farmer_ids($2[1],$1) 

/*select 
  case count(u.id)
  when 0 then (1,format(get_string('E_owner', $1),$2[1]))
  when 1 then (0,null)
  else (1,format(get_string('E_multiowner',$1),count(u.id)))
  end
from users u
join users u2 on u2.id = $1
where local_phone(u.phone) ~ ($2[1]||'$')
--where u.phone = '62'||trim($2[1],'0')
  and not u.del
  and ischildlocation(u2.area,u.locationid)
  and 10 = any(u.groupid)
*/
Hook: sms_postinsert; Order: 1
with an as (
  select get_animal_id($2[1],$2[2]) as id
)
update hewan
  set identifikasi = upper($2[3]),
  modifiedby = $1,
  modifiedon = now()
from an
where hewan.id = an.id

/*update hewan
  set identifikasi = upper($2[3]),
  modifiedby = $1,
  modifiedon = now()
where id = get_animal_id($2[1],$2[2])
*/

H: Hapus

Format pesan

H [Uji_field] [Uji_field123] [Uji_field4321]

Reply SQL

select 1 

HK: Hewan terkait Kasus

Format pesan

HK [ID Kasus] [ID Pemilik] ([Identifikasi Hewan]...)

Reply SQL

select format(get_string('HK_reply',sms_userid),
  string_agg(hewan,'; '), pemilik, ik)
 from (
select  format ('%s (%s)',
  get_species_name(h.idspesies,sms_userid), 
  string_agg(h.identifikasi,',')) as hewan,
  nama(p.idpemilik::integer) as pemilik,
  add_checkdigit(c.id) as ik
from case_animals ca
join hewan h on ca.idhewan=h.id and not h.del
left outer join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
left outer join sex on sex.id = h.idsex
left outer join users u on u.id = p.idpemilik
join cases c on ca.idcase=c.id and not c.del
where ca.msgid = sms_msgid
group by p.idpemilik,add_checkdigit(c.id),  h.idspesies) as foo
group by pemilik,ik
 

HPT: Statistik Pakan Ternak

Format pesan

HPT ([jenishijauan] [produsen] [jeniskebun] [luas] [Jumlah bibit] [Bulan untuk panen] [sumberanggaran] [tahun_fasilitasi]...) [lokasi]

Reply SQL

select
      format(get_string('HPT_replay',sms_userid), get_location_rev(s.locationid)
        , i.name, 
        string_agg(format('%s: %s %s hektar (%s stek),%s-%s, bulan perkiraan panen: %s',
        j.name [get_lang(sms_userid)], 
        t.name[get_lang(sms_userid)], 
        luas,
        jumlahbibit,
        sa.name[1],
        s.tahunfasilitasi,
        m.name[get_lang(sms_userid)]), '; '))
 from hijauan s 
 join jenishijauan t on t.id = s.idjenishijauan and not t.del
 join infrastructure i on s.idasalbibit = i.id and i.infratype = 9 and not i.del
 join jeniskebun j on j.id = s.idjeniskebun and not j.del
join sumberanggaran sa on sa.id=s.idanggaran and not sa.del
 left join months m on m.id=s.bulanpanen and not m.del
 where msgid = sms_msgid
 group by i.name, get_location_rev(s.locationid) 

IB: Inseminasi Buatan

Format pesan

IB [ID Peternak] [ID hewan] [ID pejantan] [Kode pembuatan]

Reply SQL

select format(get_string('IB_reply', sms_userid),
  h.identifikasi, 
  get_species_name(h.idspesies,sms_userid),
  s.name[get_lang(sms_userid)],
  nama(p.idpemilik::integer),
  l.name,
  case when st.idpejantan is null then
    format(get_string('IB_unregstraw',sms_userid),
      params[3], params[4] 
    )
  else
    format(get_string('IB_regstraw',sms_userid), 
      st.idpejantan, 
      st.idpembuatan,
      get_species_name(h2.idspesies,sms_userid),
      i.name)
   end 
   )
from kejadian k
join hewan h on k.idhewan = h.id
join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
join sex s on s.id = h.idsex
join users u on u.id = p.idpemilik
join locations l on l.id = u.locationid
left outer join straws st on st.id = k.datakejadian::integer
left outer join hewan h2 on h2.id = st.idhewan
left outer join infrastructure i on i.id = st.idbib
where k.msgid = sms_msgid
 

Business Rules

Hook: sms_validate; Order: 1
Select 
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan IB yang sama pada hari ini.') end
from (
select k.id
-- get_animal_id(upper($2[1]),upper($2[2]),$1) as x 
from kejadian k
join straws s on k.datakejadian = s.id::text
where k.idtipekejadian=2  -- insemination
and not k.del 
AND k.idhewan=get_animal_id(upper($2[1]),upper($2[2]),$1) -- same animal
AND k.createdon::date=now()::date -- same date
AND k.createdby = $1 -- same inseminator
AND upper(s.idpejantan) = upper($2[3]) and upper(s.idpembuatan) = 
(regexp_replace(upper($2[4]),'[^a-z0-9]+',,'i')) 

and not s.del
 ) as z

IH: Informasi hewan

Format pesan

IH [ID Pemilik] [ID hewan]

Reply SQL

select string_agg(detail,'; ') from (
select detail from (
with anid as (
select coalesce (
  get_animal_id(params[1], params[2]), id) as animalid from
  (select p.idhewan as id
  from pemilik_hewan p
  join hewan h on h.id = p.idhewan and  upper(identifikasi) = upper(params[2])
  where idpemilik = get_farmer_id(params[1],sms_userid)
  order by p.createdon desc limit 1) as fb
)

select k.reportdate, format('%s %s%s',
  to_char(k.reportdate, 'DD/MM/YYY'), t.name[get_lang(sms_userid)], 
  case idtipekejadian 
    when 1 then  -- lahir
      format(get_string('IH_lahir',sms_userid), 
        x.name[get_lang(sms_userid)], 
        h2.identifikasi)  
    when 2 then  -- inseminasi
      ': '||get_species_name(h.idspesies,sms_userid)				
    when 3 then -- PKB
      ': '||datakejadian||' '||get_string('IH_months',sms_userid)	
    when 4 then -- berat badan
      ': '||datakejadian||' kg'	
    when 5 then -- akhir hewan
      ': '||a.name[get_lang(sms_userid)]
    when 6 then -- keguguran
      ': trimester '||datakejadian				
  end) as detail
from kejadian k
join hewan h1 on k.idhewan = h1.id
   and k.idhewan in (select animalid from anid)
join tipekejadian t on t.id = k.idtipekejadian
left outer join straws s on s.id = k.datakejadian::integer
  -- round(k.datakejadian::float) 
    and idtipekejadian = 2 and not s.del
left outer join hewan h on s.idhewan = h.id 
    and not h.del
left outer join tipeakhir a on a.id = k.datakejadian::integer
  -- round(k.datakejadian::float) 
    and idtipekejadian = 5 and not a.del
left outer join hewan h2 on h2.id = k.datakejadian::integer
  -- round(k.datakejadian::float) 
    and idtipekejadian = 1 and not h2.del
left outer join sex x on x.id = h2.idsex and not x.del
where not k.del

UNION

select tanggallahir, 
    format('%s %s',get_string('IH_born',sms_userid),to_char(tanggallahir, 'DD/MM/YYYY')) 
from hewan
where id in (select animalid from anid) and not del

UNION

select * from (
select tanggalmulai, format(get_string('IH_reg',sms_userid),
    to_char(tanggalmulai, 'DD/MM/YYYY'),
    nama(idpemilik::integer)) 
from pemilik_hewan 
where idhewan in (select animalid from anid) and not del
order by createdon asc limit 1
) as foo 

UNION

select * from (
select s.tanggalakhir, format (get_string('IH_sold',sms_userid),
    to_char(s.tanggalakhir,'DD/MM/YYYY'), nama(b.idpemilik::integer)) 
from pemilik_hewan s
left outer join pemilik_hewan b on s.tanggalakhir = b.tanggalmulai 
where s.idhewan  in (select animalid from anid)
  and not s.del
  and s.tanggalakhir is not null
  and b.idpemilik is not null
order by s.createdon) as bar

order by reportdate desc
limit 10) as foobar

order by reportdate asc) as foobarbar 

IMAGE: Upload foto

Format pesan

IMAGE [URL]

Reply SQL

select 
  case when i.caseid is null then
    format(get_string('IMAGE_nocase',sms_userid),
    add_checkdigit(i.id))
  else 
  format(get_string('IMAGE_reply',sms_userid),
    add_checkdigit(i.id), 
    add_checkdigit(c.id),
    coalesce(s.cases, sy.cases),
    get_species_name(coalesce(s.speciesid, sy.speciesid),sms_userid),
    l.name
  )
  end
from caseimages i
left outer join cases c on i.caseid = c.id
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
left outer join locations l on l.id = c.locationid
where i.msgid = sms_msgid 

IO: Informasi Obat

Format pesan

IO [Kode Obat]

Reply SQL

select string_agg
(format ('nama obat:%s, regnumber:%s, manufacturer:%s, composition:%s',name,regnumber,manufacturer,composition),',')

from drugs
where upper (code) = upper (params[1])
 

JBH: Jual/Beli Hewan

Format pesan

JBH [ID penjual] [ID Pembeli] ([ID Hewan]...) [Tipe]

Reply SQL

select format(get_string('JH_reply',sms_userid), nama(sellerid), nama(buyerid),
string_agg( newname, ', '),ta.name[get_lang(sms_userid)])
from animaltransfers
join tipeakhir ta on ta.code=upper(params[4])
group by sellerid, buyerid, ta.name 

Business Rules

Hook: sms_validate; Order: 1
select 
  case count(u.id)
  when 0 then (1,format(get_string('JH_invsellid', $1),$2[1]))
  when 1 then (0,null)
  else (1,format(get_string('JH_multisellid',$1),count(u.id)))
  end
from users u
join users u2 on u2.id = $1
where local_phone(u.phone) ~ ($2[1]||'$')
  and not u.del
  and ischildlocation(u2.area,u.locationid)
  and 10 = any(u.groupid)
Hook: sms_validate; Order: 2
select
  case count(u.id)
  when 0 then (1,format(get_string('JH_invbuyid', $1),$2[2]))
  when 1 then (0,null)
  else (1,format(get_string('JH_multibuyid',$1),count(u.id)))
  end
from users u
join users u2 on u2.id = $1
where local_phone(u.phone) ~ ($2[2]||'$')
  and not u.del
  -- and ischildlocation(u2.area,u.locationid)
  and 10 = any(u.groupid)
Hook: sms_validate; Order: 3
select   
  case count(*)
    when 0 then  (0, null)
    else (1,format(get_string('JH_invanid', $1), string_agg(hid,', ')))
  end
from (
  select regexp_split_to_table($2[3],E'[^a-z|^0-9]+','i') as hid
  ) as hewanid 
where get_animal_id($2[1],hewanid.hid)  is null

Hook: sms_validate; Order: 4
select
  case count(*)
    when 0 then (0, null)
    else (0,format(get_string('JH_buyhasid', $1), string_agg(hid,', ')))
  end
from (
  select regexp_split_to_table($2[3],E'[^a-z|^0-9]+','i') as hid
  ) as hewanid 
join hewan h on h.identifikasi = upper(hid) 
join pemilik_hewan p on h.id = p.idhewan 
  and p.tanggalakhir is null
  and not p.del
join users u on p.idpemilik = u.id 
  and not u.del
  and u.phone ~ ($2[2]||'$')
  and 10 = any(u.groupid)
join users u2 on u2.id = $1
 and ischildlocation(u2.area,u.locationid)
where h.id is not null 
Hook: sms_postinsert; Order: -1
create temp table animaltransfers (
  sellerid integer,
  buyerid integer,
  saleanimals integer,
  newname varchar
)
on commit drop
Hook: sms_postinsert; Order: 0
insert into animaltransfers 
select
  get_farmer_id($2[1]) as sellerid,
  get_farmer_id($2[2]) as buyerid,
  get_animal_id($2[1],hw.id) as saleanimals, 
  case when get_animal_id($2[2],hw.id) is not null 
    then get_dup_anident($2[2],hw.id,$1)
    --upper(hw.id)||'BARU' 
    else upper(hw.id) end as newname
from (
  select upper(regexp_split_to_table($2[3],E'[^a-z|^0-9]+','i')) as id
  ) as hw
Hook: sms_postinsert; Order: 1
insert into pemilik_hewan (idpemilik, idhewan, createdby) 
select buyerid, saleanimals,$1 from animaltransfers
Hook: sms_postinsert; Order: 2
update hewan 
  set identifikasi = newname,
  modifiedby = $1,
  modifiedon = now()
from animaltransfers
where hewan.id = saleanimals

Hook: sms_postinsert; Order: 3
update pemilik_hewan 
  set tanggalakhir = now(),
    modifiedon = now(),
    modifiedby = $1
from animaltransfers
where idpemilik = sellerid
  and idhewan = saleanimals
Hook: sms_postinsert; Order: 4
insert into kejadian 
(reportdate,idhewan,idtipekejadian,datakejadian,createdby,msgid) 
select 
now()
, saleanimals
, 5
, ta.id
, $1
, $3
from animaltransfers
join tipeakhir ta on true and not ta.del and ta.live=true and ta.code=upper($2[4])

KA: Pembiakan alam

Format pesan

KA [ID Pemilik hewan] [ID Hewan] {ID Pemilik pejantan} [ID Pejantan]

Reply SQL

select format(get_string('KA_reply', sms_userid),
  h.identifikasi, 
  get_species_name(h.idspesies,sms_userid),
  nama(p.idpemilik::integer),
  l.name,
  h2.identifikasi)
from kejadian k
join hewan h on k.idhewan = h.id
join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
join users u on u.id = p.idpemilik
join locations l on l.id = u.locationid
join hewan h2 on h2.id=k.datakejadian::integer
where k.msgid = sms_msgid 

Business Rules

Hook: sms_validate; Order: 1
select 
case when count(*)=1 then (0,) else

(1,format(get_string('Inval_owner_id',$1),$2[1])) end
from (select get_farmer_ids($2[1],$1)) t1
Hook: sms_validate; Order: 2
select 
case when count(*)=1 then (0,) else

(1,format(get_string('Inval_hewan_id',$1),$2[2])) end
from (
    select h.id from 
    hewan h
    join pemilik_hewan ph on ph.idhewan=h.id and ph.tanggalakhir is null and not ph.del
    where not h.del
    and h.idsex=2
    and ph.idpemilik=get_farmer_id($2[1],$1)
    and upper(h.identifikasi)=upper($2[2])) t1
Hook: sms_validate; Order: 3
with owner_bull as
(select case when $2[3] is NULL then $2[1] else $2[3] end as id)
select 
msg from
(select
1 as ord
, case when count(*)=1 then (0,) else

(1,format(get_string('Inval_owner_id',$1),owner_bull.id)) end as msg
from (select get_farmer_ids(owner_bull.id,$1) from owner_bull) t1
join owner_bull on true
group by owner_bull.id

union all

select 2 as ord, (1,format(get_string('Inval_owner_id',$1),$2[3])) as msg) t2
order by ord
limit 1
Hook: sms_validate; Order: 4
with owner_bull as
(select case when $2[3] is NULL then $2[1] else $2[3] end as id)
select 
case when count(*)=1 then (0,) else

      (1,format(get_string('Inval_hewan_id',$1),$2[4])) end
from (
    select h.id from 
    hewan h
    join pemilik_hewan ph on ph.idhewan=h.id and ph.tanggalakhir is null and not ph.del
    join owner_bull on true
    where not h.del
    and ph.idpemilik=get_farmer_id(owner_bull.id,$1)
    and upper(h.identifikasi)=upper($2[4])
)t1
Hook: sms_validate; Order: 5
select
case when count(*)>0 then (1,format(get_string('KA_exists',$1),$2[2])) else
(0,) end

from kejadian k
join hewan h on h.id=k.idhewan and not h.del
join pemilik_hewan ph on ph.idhewan=h.id and ph.tanggalakhir is null and not ph.del
where 
not k.del
and k.idtipekejadian=10
and ph.idpemilik=get_farmer_id($2[1],$1)
and upper(h.identifikasi)=upper($2[2])
and k.reportdate::date=now()::date
Hook: sms_postinsert; Order: 1
insert into kejadian (reportdate,idhewan,idtipekejadian,datakejadian,createdby,createdon,msgid) 
select 
now()
, h.id 
, 10
, bull_id.id::varchar
, $1
, now()
, $3
from 
hewan h
join pemilik_hewan ph on ph.idhewan=h.id and ph.tanggalakhir is null and not ph.del
join (select h.id
from hewan h
join pemilik_hewan ph on ph.idhewan=h.id and ph.tanggalakhir is null and not ph.del
join (select case when $2[3] is NULL then $2[1] else $2[3] end as id) owner_bull on true
where 
upper(h.identifikasi)=upper($2[4])
and ph.idpemilik=get_farmer_id(owner_bull.id,$1)
) bull_id on true
where 
ph.idpemilik=get_farmer_id($2[1],$1)
and upper(h.identifikasi)=upper($2[2])

KDP: Konfirmasi daftar peternak

Format pesan

KDP [PIN]

Reply SQL

select 
  format(get_string('KDP_reply', id),
    firstname, 
    get_location(locationid)
  )
from users 
where phone = sms_phone
 

Business Rules

Hook: sms_validate; Order: 1
select 
  case 
    when $1 = -1 then (0,null) 
    else (1, format(get_string('KDP_numreg',$1), nama(id), format_phone(phone)))
  end
from users 
where id = $1

Hook: sms_postinsert; Order: 10

KGG: Keguguran

Format pesan

KGG [ID Pemilik] [ID Hewan] [Trimester 1,2,3]

Reply SQL

select format(get_string('KGG_reply',sms_userid),
  k.datakejadian,
  get_species_name(h.idspesies,sms_userid), 
  h.identifikasi,
  -- sex.name[get_lang(sms_userid)], 
  nama(p.idpemilik::integer),
  l.name)
from kejadian k
left outer join hewan h on k.idhewan = h.id
left outer join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
left outer join sex on sex.id = h.idsex
left outer join users u on u.id = p.idpemilik
left outer join locations l on l.id = u.locationid
where k.msgid = sms_msgid 

KODE: Kode

Format pesan

KODE {jenis kode}

Reply SQL

select case upper(trim(params[1]))
  when 'SP' then 
    (select string_agg(code||' '||name[get_lang(sms_userid)],'; ') from species where level = 3 and not del and not lab)
  when 'RP' then 
    (select 
  case 
    when length(l1.code) <> 4 then get_string('KODE_rphkab',sms_userid)
    else format(get_string('KODE_rph',sms_userid), l1.name, string_agg(i.name||' '||right(i.code,2),'; '))
  end  
from users u
join locations l1 on u.area[1] = l1.id
join locations l2 on l1.code = left(l2.code,length(l1.code))
left outer join infrastructure i on i.locationid = l2.id
where u.id = sms_userid
and i.infrastructure_typeid in (1,2,3,4,5,6,7)
group by l1.name, l1.code)
  when 'JHRP' then
    (select string_agg(code||' '||name[get_lang(sms_userid)],'; ') from animal_types where slaughter and not del)
  when 'POP' then 
    (select get_string('KODE_pop',sms_userid))
  when 'TAN' then 
    (select string_agg(code||' '||name[get_lang(sms_userid)],'; ') from signs where pelsa and not del)
  when 'PK' then 
    (select string_agg(code||' '||name[get_lang(sms_userid)],'; ') from caseresulttypes where not del)
  when 'JP' then 
    (select string_agg(id||' '||name[get_lang(sms_userid)],'; ') from groups where not del)
  when 'PROD' then 
    (select string_agg(code||' '||name[get_lang(sms_userid)],'; ') from productionsystems where not del)
  when 'SL' then 
    (select string_agg(code||' '||name[get_lang(sms_userid)],'; ') from labsections where not del)
  when 'BS' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from specimenforms where not del)
  when 'AH' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from tipeakhir where not del)
  when 'SUM' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from sumber where not del)
  when 'UC' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from testtypes where rapid and not del)
  when 'JI' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from infrastructure_types
    where array_length(string_to_array(hiercode,'.'),1) = 1 and not del)
  when 'TL' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from tindakan where not del)
  When 'SIN' then
  (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from syndromes where not del)
when 'PL' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from tipepenanganan where not del)
when 'ABH' then
   (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from asalbibit where not del)
when 'JHI' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from jenishijauan where not del)
when 'JB' then 
    (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from jenisbibit where not del)
when 'JKB' then
     (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from jeniskebun where not del)
when 'JK' then (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from jeniskontainer where not del)
when 'KK' then (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from kondisikontainer where not del)
when 'TP' then (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from alasanpenolakan where not del)
when 'JBH' then (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from tipeakhir where not del and id in (4,6))
when 'SA' then (select string_agg(format('%s %s',name[get_lang(sms_userid)],code),'; ') from sumberanggaran where not del)

  else get_string('KODE_format',sms_userid)
  end 

KOM: Komentar

Format pesan

KOM [ID kasus] [komentar]

Reply SQL

select format(get_string('KOM_reply',sms_userid), 
  coalesce(si.cases, sy.cases),
  get_species_name(coalesce(si.speciesid, sy.speciesid),sms_userid),
  coalesce(get_syndrome_name(sy.syndromeid, sms_userid), get_sign_names(si.signsid,sms_userid)),  
  get_location(c.locationid),
  tanggal(c.reportdate))
from cases c 
join komentar k on k.caseid = c.id
left outer join signreports si on si.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where k.msgid = sms_msgid 

Alert SQL

select 
  u.phone,
  format('Komentar %s untuk kasus[%s]: %s ',
    nama(k.createdby),
    add_checkdigit(c.id),
    k.komentar   
  )
from users u
join response r on r.userid=u.id
join cases c on c.id = r.caseid
join komentar k on k.caseid =c.id and k.msgid=sms_msgid
where not u.del
group by  u.phone,nama(u.id), c.id, nama(k.createdby), add_checkdigit(c.id), k.komentar, u.id 

LAB: Laboratory submission report

Format pesan

LAB [ID kasus] ([jenis spesimen] [bentuk spesimen] {seksi} [jumlah spesimen]...) [lab ID]

Reply SQL

select
format (get_string('LAB_reply',sms_userid), 
  add_checkdigit(s.caseid), 
  i.name,
  string_agg(
    format('%s %s %s %s', 
      s.total, 
      t.name[get_lang(sms_userid)], 
      f.name[get_lang(sms_userid)], 
      coalesce(
        case when get_lang(sms_userid) = 1 
        then 'untuk '||ls.name[1]
        else 'for '||ls.name[2] end, )

    ),
  ', '),
  get_location(c.locationid)) 
from submissions s
join specimentypes t on s.specimentypeid = t.id and not t.del
join specimenforms f on s.specimenformid = f.id and not s.del
left outer join labsections ls on s.sectionid = ls.id and not ls.del
join users u on s.userid = u.id 
join cases c on c.id = s.caseid and not s.del
join infrastructure i on s.labid = i.id
where s.msgid = sms_msgid
group by s.caseid, c.locationid, i.name 

LAPD: Laporan desa

Format pesan

LAPD [kode desa]

Reply SQL

select coalesce(string_agg(caselist,'; '),
  case when get_location(params[1]) is null then 
    format(get_string('E_location', sms_userid),params[1]) 
  else
  format(get_string('LAPD_nocases', sms_userid),get_location(params[1])) end)
from
( select format('[%s] %s, %s, %s',
  add_checkdigit(c.id),
  tanggal(c.reportdate),
  string_agg(sp.name[get_lang(sms_userid)],', '), 
  case when signsid is not null then 
    get_sign_names(si.signsid,sms_userid)
  else
      sd.name[get_lang(sms_userid)]
  end
  ) as caselist
from cases c
join locations l on c.locationid = l.id
join locations l2 on l2.code = params[1]
  and ischildlocation(l2.id, l.id)
left outer join signreports si on si.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
left outer join species sp on sp.id = coalesce(si.speciesid, sy.speciesid)
left outer join syndromes sd on sy.syndromeid = sd.id 
where not c.del 
group by c.id, signsid, sd.id
order by c.id desc limit 5) as foo 

LAPK: Laporan kasus

Format pesan

LAPK [ID kasus]

Reply SQL

select string_agg(summ,'; ') from 
(select (rep_case).summary as summ from
(select rep_case(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_signs(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_syndromes(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_response(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_treatment(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_caseresult(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_rabies(remove_checkdigit(params[1]::integer)::integer,sms_userid)
union
select rep_ai(remove_checkdigit(params[1]::integer)::integer,sms_userid))
as reports
order by (rep_case).repdate) as reps 

LAPP: Laporan Pengguna

Format pesan

LAPP 

Reply SQL

select string_agg(casesum,'; ') from (
select casesum from (
select 
  format('%s %s %s %s %s %s',
  add_checkdigit(c.id),
  to_char(c.createdon,'DD Mon'),
  coalesce(si.cases, sy.cases),
  sp.code,
  coalesce(s.code,syn.code),
  l.name) as casesum
from cases c
left join signreports si on si.caseid = c.id and not si.del
left join syndromereports sy on sy.caseid = c.id and not sy.del
join species sp on sp.id = coalesce(si.speciesid, sy.speciesid)
join locations l on l.id = c.locationid 
left join signs s on s.id = si.signsid[1]
left join syndromes syn on syn.id = sy.syndromeid
--where c.createdby = sms_userid
where c.createdby = params[1]
and not (si.id is null and sy.id is null)
and not c.del
order by c.createdon desc
limit 11) foo) bar 

LH: Lahir

Format pesan

LH [ID Pemilik] [ID Hewan] [Jenis Kelamin] [Identifikasi Pedet] [tanggal_lahir] {Berat Lahir}

Reply SQL

select format(get_string('LH_reply',sms_userid),
initcap(get_species_name(h.idspesies,sms_userid)), 
h.identifikasi,
nama(p.idpemilik::integer),
l.name,
tanggal(h2.tanggallahir),
sex.name[get_lang(sms_userid)],
h2.identifikasi,
coalesce(k2.datakejadian,'-'))
from kejadian k
left outer join hewan h on k.idhewan = h.id
left outer join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
left outer join users u on u.id = p.idpemilik
left outer join locations l on l.id = u.locationid
left outer join hewan h2 on h2.id = k.datakejadian::integer
left outer join sex on sex.id = h2.idsex
left join kejadian k2 on k2.msgid = sms_msgid and k2.idtipekejadian=4
where k.msgid = sms_msgid and k.idtipekejadian=1 

Business Rules

Hook: sms_validate; Order: 1
Select 
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan kelahiran yang sama pada hari ini.') end
from (
select k.id
-- get_animal_id(upper($2[1]),upper($2[2]),$1) as x 
from kejadian k

where k.idtipekejadian=1  -- kelahiran
and not k.del 
AND k.idhewan=get_animal_id(upper($2[1]),upper($2[2]),$1) -- same animal
--AND k.createdon::date=now()::date -- same date
AND k.datakejadian::integer = get_animal_id(upper($2[1]),upper($2[4]),$1)--same calve
--AND k.createdby = $1 -- same inseminator

 ) as z
Hook: sms_validate; Order: 2
SELECT 
	case 
	when $2[5]::date <=now()::date 
	then (0,null)
	else (1,'Maaf, tanggal tidak bisa di masa depan')
	end
Hook: sms_postinsert; Order: 1
with andata as (
  insert into hewan (identifikasi, indukbetina, idspesies, idsex, tanggallahir, msgid, createdby)
  select upper($2[4]), h.id, h.idspesies, s.id, $2[5]::date, $3, $1
  from kejadian k
  join hewan h on h.id = k.idhewan
  join sex s on s.code = upper($2[3]) 
  where k.msgid = $3
  returning id
)
insert into pemilik_hewan (idpemilik, idhewan, msgid, createdby) 
  select get_farmer_id($2[1],$1), id, $3, $1 
  from andata
Hook: sms_postinsert; Order: 2
update kejadian k
  set datakejadian = h.id
from hewan h
where k.msgid = $3
and h.msgid = $3
Hook: sms_postinsert; Order: 3
insert into kejadian
(reportdate, idhewan, idtipekejadian, datakejadian, msgid, createdby)
select 
now()
, h.id
, 4
, $2[6]
, $3
, $1
from hewan h
where h.msgid = $3
and h.identifikasi=upper($2[4])

Hook: sms_postinsert; Order: 5
select
  case when  
    send_template_report('ID hewan', u.email, h.id, 
    case when get_param('hostname') = 'sidecar'
      then 'sidecar'
      else 'live'
    end) = 'True'
  then (0,)

  else (1,'Unable to send animal ID certificate by email') end
from hewan h
join users u on u.id = h.createdby
where h.msgid = $3
and u.email is not null
and trim(u.email) <> 

and not h.del

LINK: Link photo to case

Format pesan

LINK [ID Foto] [ID Kasus]

Reply SQL

select 
  format(get_string('LINK_reply',sms_userid),
  add_checkdigit(i.id),
  add_checkdigit(c.id), 
  coalesce(s.cases, sy.cases),
  get_species_name(coalesce(s.speciesid, sy.speciesid),sms_userid),
  coalesce(get_sign_names(s.signsid,sms_userid),get_syndrome_name(sy.syndromeid,sms_userid)),
  get_location(c.id),
  tanggal(c.reportdate)) 
from caseimages i
join cases c on c.id = i.caseid
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where i.id = remove_checkdigit(params[1]::bigint)  

Business Rules

Hook: sms_validate; Order: 5
update caseimages 
set caseid = remove_checkdigit(($2[2])::bigint),
modifiedon = now(),
modifiedby = $1
where id = remove_checkdigit(($2[1])::bigint)
returning (0,)

LTL: Laporan tindak lanjut

Format pesan

LTL [ID kasus] ([spesies] [jumlah sakit] [jumlah mati] [jumlah dimusnahkan] [jumlah berisiko]...) {selesai}

Reply SQL

select format (get_string('LTL_reply',sms_userid),l1.name, add_checkdigit(i.caseid), 
  string_agg(format ('%s: %s '||
  get_string('LTL_sick',sms_userid)||', %s '||
  get_string('LTL_dead',sms_userid)||', %s '||
  get_string('LTL_culled',sms_userid)||', %s '||
  get_string('LTL_atrisk',sms_userid), s.name[get_lang(sms_userid)], i.sick, i.dead, i.slaughtered, i.atrisk),'; '), 
case when i.resolved then get_string('LTL_resolved',3) else get_string('LTL_ongoing',3) end) 
from investigationanimals i
join cases c on c.id = i.caseid
join species s on s.id = i. speciesid
join locations l1 on l1.id = c.locationid
where i.msgid = sms_msgid
group by l1.name, i.caseid, i.resolved 

OB: Laporan pengobatan

Format pesan

OB [ID kasus] ([kode obat] [dosis] [jumlah hewan]...)

Reply SQL

select format(get_string('OB_reply',sms_userid), dinfo, s.name[get_lang(sms_userid)], l.name)
from ( 
select t.caseid, string_agg(format('%s (%s %s, %s ekor)', 
case when length(trim(d.name))<11 then d.name
else substring(trim(d.name) from '(.{1,10}[^s]*)')||
case when length(trim(d.name))>length(substring(trim(d.name) from '(.{1,10}[^s]*)')) then '...' else  end end, 

dose, doseunits, animals ), ', ') as dinfo 
  from treatments t
  join treatmentanimals a on t.id = a.treatmentid
  join drugs d on d.id = a.drugid
where t.msgid = sms_msgid group by t.caseid) as dd
left join cases c on c.id = dd.caseid
left join locations l on l.id = c.locationid
left outer join signreports sr on sr.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
left outer join species s on s.id = case when sr.speciesid is null then sy.speciesid else sr.speciesid end 

Alert SQL

select 
  u.phone,
  format('Telah dilakukan pengobatan kasus %s di %s oleh %s pada %s ekor %s (%s) dengan %s',
    add_checkdigit(c.id),
    get_location(c.locationid),
    nama(t.userid),
    a.animals,
    get_species_name(s.speciesid,u.id),
    get_sign_names(s.signsid,u.id),
    string_agg(format('%s %s %s',
      a.dose,
      d.doseunits,
      d.name
    ),' dan ')
  )
from users u
join treatments t on t.msgid = sms_msgid
join cases c on c.id = t.caseid
join treatmentanimals a on a.treatmentid = t.id
join drugs d on d.id = a.drugid
join signreports s on s.caseid = c.id
where is_permitted('get_ob_alert',u.id)
  and ischildlocation(area,c.locationid)
  and not u.del
group by  u.phone, c.id, c.locationid, t.userid, a.animals, s.speciesid, u.id, s.signsid 

OBI: Laporan Pengobatan Individu

Format pesan

OBI [Id Kasus] ([kode obat] [dosis]...) [urutan hewan]

Reply SQL

select 
  format(get_string('OBI_reply',sms_userid), 
    dinfo, 
    s.name[get_lang(sms_userid)], 
    string_agg(anid, ', '),
    l.name)
from ( 
select distinct t.caseid, h.identifikasi as anid, string_agg(format('%s (%s %s)', 
case when length(trim(d.name))<11 then d.name
else substring(trim(d.name) from '(.{1,10}[^s]*)')||
case when length(trim(d.name))>length(substring(trim(d.name) from '(.{1,10}[^s]*)')) then '...' else  end end, 

dose, doseunits ), ', ') as dinfo 
  from treatments t
  join treatmentanimals a on t.id = a.treatmentid
  join drugs d on d.id = a.drugid
  join hewan h on h.id = any(a.animalid)
where t.msgid = sms_msgid 
group by t.caseid, h.identifikasi) as dd
left join cases c on c.id = dd.caseid
left join locations l on l.id = c.locationid
left outer join signreports sr on sr.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
left outer join species s on s.id = case when sr.speciesid is null then sy.speciesid else sr.speciesid end
group by dinfo, s.name, l.name 

Business Rules

Hook: sms_validate; Order: 10
Select
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan OBI pada hewan yang sama hari ini.') end
from (
with animal as (
    select idhewan, row_number() Over(order by id asc) as r_n
from case_animals a
where a.idcase =remove_checkdigit($2[1]::integer))
select
ta.id
from treatmentanimals ta
JOIN drugs d ON d.id=ta.drugid and NOT d.del
JOIN hewan h on h.id = any(ta.animalid) and not h.del
JOIN pemilik_hewan ph ON ph.idhewan=any(ta.animalid) and NOT ph.del
JOIN users u ON u.id=ph.idpemilik and NOT u.del
JOIN animal on animal.r_n in ($2[3]::integer)
where
upper(d.code) in (select upper(dnames[1]) from
(select regexp_matches($2[2],'([a-z0-9]+)\s+(\d+[,.]{0,1}\d*)', 'igx') as dnames) t1)
and
animal.idhewan=any(ta.animalid)
and ta.reportdate::date=now()::date
and ta.createdby=$1
and not ta.del
)
as z

P: Laporan prioritas

Format pesan

P [sindrom] [spesies] [jumlah hewan] {lokasi} {diagnosa,diagnosa...}

Reply SQL

select 
  format(get_string('P_posrep',sms_userid),
  add_checkdigit(c.id) ,s.cases,
  sy.name[get_lang(sms_userid)],
  sp.name[get_lang(sms_userid)],
  get_location(c.locationid)) ||coalesce('. Ddx: '||get_disease_names(r.diagnosisid, sms_userid),)

from cases c
join syndromereports s on caseid = c.id
join syndromes sy on sy.id = s.syndromeid
join species sp on sp.id = s.speciesid
left outer join response r on r.caseid = c.id
where c.msgid = sms_msgid 

Alert SQL

select u.phone, 
  format(get_string('P_alert',u.id),
    add_checkdigit(s.caseid), nama(u2.firstname, u2.surname), 
    format_phone(u2.phone), 
    s.cases, d.name[get_lang(u.id)],
    get_species_name(s.speciesid,u.id),
    get_location(c.locationid),
    coalesce('. DDx: '||get_disease_names(r.diagnosisid,2),)

  )
from users u 
join cases c on c.msgid = sms_msgid
join syndromereports s on c.id = s.caseid
join syndromes sy on sy.id = s.syndromeid
join diseases d on d.id = sy.targetdiseaseid
join users u2 on u2.id = c.userid
left outer join response r on r.caseid = c.id 
join locations l on c.locationid = l.id
where is_permitted('get_pelsa_alert_p',u.id) 
and u.id in (
  select distinct uid from (
    select id as uid, unnest(area) as area from users
  ) as foo
  where is_parent_area(c.locationid, foo.area)
  and u.id <> sms_userid
) 

Business Rules

Hook: sms_preparse; Order: 10
select 
  case 
    when spcode is null then (0,null) 
    else (1,
    case spcode::integer 
      when 1 then format(get_string('U_speccodechange',$1),'AY',spcode)
      when 2 then format(get_string('U_speccodechange',$1),'SP',spcode)
      when 3 then format(get_string('U_speccodechange',$1),'KR',spcode)
      when 4 then format(get_string('U_speccodechange',$1),'AJ',spcode)
      when 5 then format(get_string('U_speccodechange',$1),'KB',spcode)
      when 6 then format(get_string('U_speccodechange',$1),'KL',spcode)
      when 7 then format(get_string('U_speccodechange',$1),'KD',spcode)
      when 9 then format(get_string('U_speccodechange',$1),'DB',spcode)
      when 10 then format(get_string('U_speccodechange',$1),'BB',spcode)
      when 11 then format(get_string('U_speccodechange',$1),'KE',spcode)
      when 12 then format(get_string('U_speccodechange',$1),'IT',spcode)
      when 13 then format(get_string('U_speccodechange',$1),'IK',spcode)
      when 14 then format(get_string('U_speccodechange',$1),'KC',spcode)
      when 16 then format(get_string('U_speccodechange',$1),'UL',spcode)
      else format(get_string('E_invspec',$1),spcode)
    end)
  end
from (
  select (regexp_matches($2[1],
'^P
[;#\s]+
[a-z]+
[;#\s]+
(\d+)
[;#\s]*
\d+
(?:(?:[;#\s]*)\d{2,8}(?:\.\d{1,})?)?
[;#\s]*
(?:(?:[;#\s]*)[a-z]+(?:\s*,\s*[a-z]+)*)?
[;#\s]*
$', 'igx'))[1] as spcode
union
select null order by spcode limit 1  
) as foo

Hook: sms_validate; Order: 10
select
  case 
    -- allowed to make a diagnosis
    when is_permitted('can_send_r',$1) then
      case when $2[5] is null then
        (1,get_string('E_missingdx',$1))
      else
        (0,null)
      end
    -- Pelsa
    else
      case when $2[5] is not null then
        (1,get_string('E_dxnotallowed',$1))
      else
        (0,null)
      end
  end
from users u
where u.id = $1
Hook: sms_validate; Order: 20
select
  case 
    when $2[4] is not null then
      case 
        when length($2[4]) < 7 then 
          (1,get_string('E_notdesacode',$1))
        else 
          (0,null)
      end
    else
      (0,null)
  end

PG: Injeksi Prostaglandin (sinkronisasi)

Format pesan

PG [ID Pemilik] ([ID Hewan]...)

Reply SQL

select format(get_string('PG_reply', sms_userid),
  string_agg(hewan,'; '), pemilik, lokasi)
 from (
select  format ('%s (%s)',
  get_species_name(h.idspesies, sms_userid), 
  string_agg(h.identifikasi,',')) as hewan,
  nama(p.idpemilik::integer) as pemilik,
  l.name as lokasi
from kejadian k
left outer join hewan h on k.idhewan = h.id
left outer join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
left outer join sex on sex.id = h.idsex
left outer join users u on u.id = p.idpemilik
left outer join locations l on l.id = u.locationid
where k.msgid = sms_msgid
group by p.idpemilik, l.name, h.idspesies) as foo
group by pemilik, lokasi  

Business Rules

Hook: sms_validate; Order: 10
Select 
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan injeksi prostaglandin yang sama pada hari ini.') end
from (
select k.id
-- get_animal_id(upper($2[1]),upper($2[2]),$1) as x 
from kejadian k
where k.idtipekejadian=8  -- Injeksi Prostaglandin
and not k.del 
AND k.idhewan=get_animal_id(upper($2[1]),upper($2[2]),$1) -- same animal
AND k.createdon::date=now()::date -- same date
AND k.createdby = $1 -- same inseminator
) as z

PK: Perkembangan kasus

Format pesan

PK [ID kasus] [kode perkembangan kasus]

Reply SQL

select 
  format(get_string('PK_response', sms_userid),
    add_checkdigit(r.caseid), 
    coalesce(s.cases,sy.cases),
    get_species_name(coalesce(s.speciesid, sy.speciesid), sms_userid),
    get_location(c.locationid),
    t.name[get_lang(sms_userid)] 
  )
from caseresults r
join caseresulttypes t on t.id = r.result
join cases c on c.id = r.caseid
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where r.msgid = sms_msgid 

PKB: Pemeriksaan kebuntingan

Format pesan

PKB [ID Pemilik] [ID hewan] [Bulan]

Reply SQL

select format(get_string('PKB_reply', sms_userid),
get_species_name(h.idspesies,sms_userid), 
h.identifikasi,
sex.name[get_lang(sms_userid)], 
nama(p.idpemilik::integer),
l.name,
case 
when datakejadian =  '0' then  get_string('PKB_tidakbunting', sms_userid)
 else datakejadian || ' ' || get_string('PKB_bunting', sms_userid)
 end)
from kejadian k
join hewan h on k.idhewan = h.id
join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
join sex on sex.id = h.idsex
join users u on u.id = p.idpemilik
join locations l on l.id = u.locationid
--join tipekejadian t on t.id = k.datakejadian
where k.msgid = sms_msgid 

Business Rules

Hook: sms_validate; Order: 1
Select 
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan PKB yang sama pada hari ini.') end
from (
select k.id
-- get_animal_id(upper($2[1]),upper($2[2]),$1) as x 
from kejadian k

where k.idtipekejadian=3  -- insemination
and not k.del 
AND k.idhewan=get_animal_id(upper($2[1]),upper($2[2]),$1) -- same animal
AND k.createdon::date=now()::date -- same date
AND k.createdby = $1 -- same inseminator

 ) as z

PKHI: Perkembangan kasus hewan individual

Format pesan

PKHI [ID kasus] [kode perkembangan kasus] [ID Pemilik] [ID Hewan]

Reply SQL

select format(get_string('PKHI_response', sms_userid),
add_checkdigit(r.caseid)
,string_agg(format('%s %s %s'
, h.identifikasi
, get_species_name(coalesce(s.speciesid, sy.speciesid), sms_userid)
, t.name[get_lang(sms_userid)]),',' )
, get_location(c.locationid))
from caseresults r 
join caseresulttypes t on t.id = r.result
join cases c on c.id = r.caseid 
left outer join signreports s on s.caseid = c.id 
join hewan h on h.id = s.animalid
join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
join users u on u.id = p.idpemilik
left outer join syndromereports sy on sy.caseid = c.id where r.msgid = sms_msgid
group by r.caseid, c.locationid 

PKL: Perkembangan kasus lengkap

Format pesan

PKL [ID kasus] ([kode perkembangan kasus] [jumlah hewan]...)

Reply SQL

select format(get_string('PKL_response', sms_userid),
add_checkdigit(r.caseid)
,string_agg(format('%s %s %s'
,r.jumlah
, get_species_name(coalesce(s.speciesid, sy.speciesid), sms_userid)
, t.name[get_lang(sms_userid)]),',' )
, get_location(c.locationid))
from caseresults r 
join caseresulttypes t on t.id = r.result 
join cases c on c.id = r.caseid 
left outer join signreports s on s.caseid = c.id 
left outer join syndromereports sy on sy.caseid = c.id where r.msgid =sms_msgid
group by r.caseid, c.locationid 

PL: Penanganan Lain

Format pesan

PL [ID Pemilik] [ID Hewan] [tipepenanganan]

Reply SQL

select format(get_string('PL_reply', sms_userid),
  h.identifikasi,
  get_species_name(h.idspesies,sms_userid),
  s.name[get_lang(sms_userid)],
  nama(get_farmer_id(params[1])),
  t.name[get_lang(sms_userid)])
from kejadian k
join hewan h on h.id = k.idhewan and not h.del
join sex s on s.id = h.idsex and not s.del
join tipepenanganan t on t.id = k.datakejadian::integer and not t.del
where k.msgid = sms_msgid 

Business Rules

Hook: sms_validate; Order: 10
with penanganan as (
select id from tipepenanganan
where upper(code) = upper($2[3]))

Select 
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan penanganan lain yang sama pada hari ini.') end
from (
select k.id
from kejadian k
join penanganan on penanganan.id =k.datakejadian::integer
where k.idtipekejadian=8 and not k.del
AND k.idhewan=get_animal_id(upper($2[1]),upper($2[2]),$1) -- same animal
AND k.createdon::date=now()::date -- same date
AND k.createdby = $1 -- same inseminator
) as z

PNC: Penerimaan Nitrogen Cair

Format pesan

PNC [ID pengiriman] [Jumlah liter]

Reply SQL

select 
  format(get_string('PNC_reply', sms_userid), 
    ns.volume, 
    ns2.volume,
    get_location(i.locationid), 
    to_char(s.datesent, 'DD/MM/YYYY') ) 
from receipt r 
join nitrogenshipment ns on ns.receiptid = r.id 
join shipments s on s.id = r.shipmentid 
join infrastructure i on i.id = s.origininfraid 
join nitrogenshipment ns2 on ns2.shipmentid = s.id 
  and ns2.receiptid is null 
where r.msgid = sms_msgid
 

Business Rules

Hook: sms_validate; Order: 2
select 
  case when $2[2]::integer > ns.volume::integer then
(1,'Volume salah. Volume yang diterima lebih besar daripada yang dikirim')
else
(0,)

end as result
from shipments s
join nitrogenshipment ns on ns.shipmentid = s.id and ns.receiptid is null
and s.id = remove_checkdigit($2[1]::integer)
Hook: sms_postinsert; Order: 1
update receipt set shipmentid = nitrogenshipment.shipmentid from nitrogenshipment where receipt.id = receiptid and receipt.msgid = $3 returning (0,) 

PNEG: Laporan negatif

Format pesan

PNEG 

Reply SQL

select format(get_string('PNEG_reply', sms_userid),
  get_location(u.locationid),
  case checked 
    when true then get_string('PNEG_active',sms_userid)
    when false then get_string('PNEG_passive',sms_userid)
    else  

  end) 
from negativereports n
join users u on u.id = n.userid
where n.msgid = sms_msgid 

POP: Laporan populasi

Format pesan

POP ([jenis hewan] [jumlah hewan]...) {lokasi}

Reply SQL

select format(get_string('POP_reply',sms_userid), get_location(l.id), 
string_agg(format('%s: %s',t.name[get_lang(sms_userid)], p.total),'; ')) 
from population p
join animal_types t on t.id = p.animaltypeid
join locations l on l.id = p.locationid
where p.msgid =sms_msgid
group by l.id 

Business Rules

Hook: sms_validate; Order: 10
select
case 
  when ((get_user_groups($1, 251)) like '%tim vaksinasi%') then (1,get_string('E_ketuavaksin',$1))
else 
  case 
    when $2[2] is not null then
      case 
        when length($2[2]) < 8 then (1,get_string('E_notdesacode',$1))
        else (0,null)
      end	
   else (0,null)
  end
end

PS: Produksi Susu

Format pesan

PS [ID Pemilik] [ID hewan] [Liter]

Reply SQL

select format(get_string('PS_reply',sms_userid),
get_species_name(h.idspesies,sms_userid), 
h.identifikasi,
sex.name[get_lang(sms_userid)], 
nama(p.idpemilik::integer),
l.name,
k.datakejadian)
from kejadian k
left outer join hewan h on k.idhewan = h.id
left outer join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
left outer join sex on sex.id = h.idsex
left outer join users u on u.id = p.idpemilik
left outer join locations l on l.id = u.locationid
where k.msgid = sms_msgid 

PSB: Penerimaan Semen Beku

Format pesan

PSB [ID pengiriman] ([Bangsa hewan] [Jumlah straw]...)

Reply SQL

select format (get_string('PSB_reply', sms_userid), string_agg( format ('%s (%s/%s)', sp.name[get_lang(sms_userid)], coalesce(ns.total,0), coalesce(ns2.total,0)), ', '), get_location(i.locationid), to_char(s.datesent, 'DD/MM/YYYY')) from receipt r join strawshipment ns on ns.receiptid = r.id join shipments s on s.id = r.shipmentid join infrastructure i on i.id = s.origininfraid join strawshipment ns2 on ns2.shipmentid = s.id and ns2.breedid = ns.breedid and ns2.receiptid is null left outer join species sp on sp.id = ns.breedid where r.msgid = sms_msgid group by i.locationid, s.datesent 

Business Rules

Hook: sms_validate; Order: 0
select 
  case when 
    verify_checksum($2[1]::bigint)
  then
    case when (select count(*)=1 from shipments where id = remove_checkdigit($2[1]::bigint) and not del) then
      (0,null)
    else
      (1,format(get_string('PSB_shipiderror', $1), $2[1]))
    end
  else
    (1,format(get_string('PSB_checksumerror', $1), $2[1]))
  end
Hook: sms_validate; Order: 1
select 
  case when count(*) = 0 then (0,null) else
  (1,format('Jumlah straw tidak valid.jumlah diterima lebih besar daripada jumlah dikirim: %s',
  string_agg(
  format ('%s (%s/%s)', 
  s.name[1],
  coalesce(col[2],'0'), 
  coalesce(ss.total,'0')), ', '))) end
from (
select regexp_matches($2[2],'([a-z]+)[;,#\s]*(-?\d+\.?\d*)', 'igx') 
) as foo(col)
left join species s on s.code = upper(col[1])
left join strawshipment ss on ss.shipmentid = remove_checkdigit($2[1]::integer)
  and ss.breedid = s.id
  and ss.receiptid is null
where col[2]::integer > coalesce(ss.total,0)
Hook: sms_postinsert; Order: 1
update receipt set shipmentid = strawshipment.shipmentid from strawshipment where receipt.id = receiptid and receipt.msgid = $3 returning (0,) 

Q: Pertanyaan

Format pesan

Q [petanyaan]

Reply SQL

select get_string('Q_response',sms_userid) 

Alert SQL

-- new version
with lid as (
	select 
	  l.centroid as centroid,
	  nama(u.firstname, u.surname) as nama,
	  local_phone(u.phone) as phone,
	  to_char(reportdate,'HH:MM:SS') as rtime, 
          question
	from questions q
	join users u on u.id = q.userid
	join locations l on l.id = u.locationid
	where q.msgid = sms_msgid
),
gperm as (
  select array_agg(groupid) as p from group_permissions
  where permission_typeid = 4 and permission = 1
)
select
  u.phone, 
  format(get_string('Q_alert',sms_userid),
    lid.nama, 
    lid.phone,
    lid.rtime, 
    lid.question
  )
from users u
left join gperm on true
left join user_permissions up 
  on up.userid = u.id 
  and up.permission_typeid = 4 
join locations l on array[l.id] && u.area
join lid on true -- reporter location
where (gperm.p && u.groupid AND coalesce(up.permission,1) = 1)
--where (gperm.p && u.groupid OR up.permission = 1)
  and st_contains(l.geom,lid.centroid)


/*
-- old version - Extremely slow!!
select u.phone, 
  format(get_string('Q_alert',2), 
    nama(u2.firstname,u2.surname), 
    local_phone(u2.phone), 
    to_char(reportdate,'HH:MM:SS'), 
    question
  )
from users u
left outer join questions q on q.msgid = sms_msgid
join users u2 on u2.id = q.userid 
where is_permitted('get_questions',u.id)
and u.id in (
  select distinct uid from (
    select id as uid, unnest(area) as area from users
  ) as foo
  where is_parent_area(u2.locationid, foo.area)
  and u.id <> sms_userid
)
*/ 

R: Response report

Format pesan

R [ID Kasus] [dikunjung (K/T)] [diagnosa banding,diagnosa banding...] {diagnosa lain}

Reply SQL

select
    format(get_string('R_conf',sms_userid), add_checkdigit(c.id), get_location(c.locationid),
      to_char(c.reportdate,'DD/MM/YYYY'), 
      get_disease_names(diagnosisid,sms_userid)||coalesce(', '||otherdiagnosis, ) )

    from cases c
    join response r on r.caseid = c.id
    where r.msgid = sms_msgid 

Alert SQL

with lid as (
 select 
   l.centroid as centroid,
   format(get_string('R_alert',u.id),
        add_checkdigit(c.id), 
        nama(u.firstname, u.surname), 
        format_phone(u.phone), 
        get_location(c.locationid), coalesce(si.cases, sy.cases), 
        get_disease_names(diagnosisid,u.id)||coalesce(', '||otherdiagnosis, )

      ) as msg
 from response r
 join cases c on c.id = r.caseid
 join locations l on l.id = c.locationid
 join users u on u.id = c.createdby
 left join signreports si on si.caseid = c.id
 left join syndromereports sy on sy.caseid = c.id 
 where r.msgid = sms_msgid
), 
gperm as (
  select array_agg(groupid) as p from group_permissions
  where permission_typeid = 5 and permission = 1
)
select
  u.phone,
  lid.msg
from users u
left join gperm on true
left join user_permissions up 
  on up.userid = u.id 
  and up.permission_typeid = 5 
join locations l on array[l.id] && u.area
join lid on true -- reporter location
where (coalesce(up.permission=1,gperm.p && u.groupid))
  and st_contains(l.geom,lid.centroid)

/*
select u.phone, 
      format(get_string('R_alert',u.id),
        add_checkdigit(c.id), 
        nama(u2.firstname, u2.surname), 
        format_phone(u2.phone), 
        get_location(c.locationid), coalesce(sr.cases, sy.cases), 
        get_disease_names(diagnosisid,u.id)||coalesce(', '||otherdiagnosis, ) 

      )     
from users u
join response r on r.msgid = sms_msgid
join cases c on c.id = r.caseid
left outer join signreports sr on sr.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
left outer join syndromes syn on sy.syndromeid = syn.id
join users u2 on u2.id = r.userid
where is_permitted('get_response_conf',u.id) 
and u.id in (
  select distinct uid from (
    select id as uid, unnest(area) as area from users
  ) as foo
  where is_parent_area(c.locationid, foo.area)
  and u.id <> sms_userid
)
*/
 

Business Rules

Hook: sms_validate; Order: 10
select (0,
  case when 
   (select max(
  case when similarity(dz,d.name[1]) > similarity(dz,d.name[2])
  then similarity(dz,d.name[1])
  else similarity(dz,d.name[2])
  end)
  from (
  select regexp_split_to_table($2[4],',') as dz) as foo
  join diseases d on dz % d.name[1] or dz % d.name[2]) > 0.5 then
 (select 
  format('[Code suggestions] %s',string_agg(format('%s %s',d.code,d.name[1]),'; '))
from diseases d
join (
select regexp_split_to_table($2[4],',') as dz) as foo
  on similarity(dz, d.name[1])>0.5 
  or similarity(dz, d.name[2])>0.5)
else null end);

RP: Statistic rumah potong

Format pesan

RP ([jenis hewan] [jumlah dipotong]...) {kode RP}

Reply SQL

select
      format(get_string('RP_totalsrep',sms_userid), 
        i.name, to_char(s.reportdate,'dd/mm/YYYY'), 
        string_agg(format('%s: %s ekor',
          t.name[get_lang(sms_userid)],total), '; '))
      from slaughtertotals s 
      join animal_types t on t.id = s.animaltypeid and not t.del
      join infrastructure i on s.infrastructureid = i.id and not i.del
      where msgid = sms_msgid
      group by i.name,s.reportdate 

RVAK: Riwayat vaksinasi

Format pesan

RVAK [ID kasus] ([kode penyakit] [tanggal vaksinasi]...)

Reply SQL

select 
  format(get_string('RVAK_reply',sms_userid),
    get_species_name(coalesce(si.speciesid, sy.speciesid),sms_userid), 
    coalesce(case when trim(get_sign_names(si.signsid,sms_userid))= then null else get_sign_names(si.signsid,sms_userid) end,

       get_syndrome_name(sy.syndromeid,sms_userid)), 
    get_location(c.locationid), foo.result
  )
from (
select 
  min(caseid) as caseid,
  string_agg(format('%s %s',
  get_disease_name(diseaseid,2),
  to_char(tanggal, 'mm/yyyy')), ', ') as result
from riwayatvaksinasi
where msgid = sms_msgid) as foo
join cases c on c.id = foo.caseid
left outer join signreports si on si.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id 
 

SAP: Sapih

Format pesan

SAP [ID Pemilik] [ID Hewan]

Reply SQL

select format(get_string('SAP_reply',sms_userid),
initcap(get_species_name(h.idspesies,sms_userid)), 
h.identifikasi,
nama(p.idpemilik::integer),
l.name)
from kejadian k
join hewan h on k.idhewan = h.id and not h.del
join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null and not p.del
join users u on u.id = p.idpemilik and not u.del
join locations l on l.id = u.locationid
where k.msgid = sms_msgid 

SHP: Stok hijauan pakan

Format pesan

SHP ([jenis hijauan] [jumlah] [satuan] [harga]...) [produsen]

Reply SQL

select 
format(get_string('SBH_reply',sms_userid)
,case when infra is null or trim(infra) =  then get_string('SSB_office',sms_userid) 

else infra 
end
,string_agg(format('%s(%s %s)@ %s rupiah', jh,total,jb,harga), ', ') 
 )
from
(
select i.name as infra,jh.name[1] as jh ,jb.name[1] as jb , harga, total
from stokbibit s 
join infrastructure i on i.id = s.asalid
join jenisbibit jb on jb.id = s.jenisbibitid
join jenishijauan jh on jh.id = s.jenishijauanid
where s.msgid = sms_msgid

) as aa
group by infra 

SK: Surat Keterangan Keswan

Format pesan

SK [ID pemilik] [asal] [tujuan] ([spesies/bangsa] [jumlah hewan]...) {telepon pemilik}

Reply SQL

select format(get_string('SK_reply',sms_userid),
  add_checkdigit(m.id), 
  ownerid||coalesce(' ('||ownerphone||')',), 

  mans.animals, 
  get_location(origin), 
  get_location(destination)) 
from movement m
join (
select ma.movementid, string_agg(total||' '||s.name[get_lang(sms_userid)], ', ') as animals 
from movementanimals ma
join species s on ma.speciesid = s.id
where not ma.del
group by ma.movementid 
) as mans on mans.movementid = m.id 
where m.msgid = sms_msgid and not m.del 

Alert SQL

/*select 
  int_phone(m.ownerphone), 
  format(get_string('SK_owner',sms_userid),
    add_checkdigit(m.id), 
    mans.animals, 
    get_location(origin), 
    get_location(destination)
  ) as output 
from movement m
join (
  select 
    ma.movementid, 
    string_agg(total||' '||s.name[get_lang(sms_userid)], ', ') as animals 
  from movementanimals ma
  join species s on ma.speciesid = s.id
  group by ma.movementid 
) as mans on mans.movementid = m.id 
where msgid = sms_msgid 
  and not m.del 
  and m.ownerphone is not null
  and trim(m.ownerphone) <> 

*/

select nama(u.id),u.phone, 
format('SKKH nomor %s. Asal: %s. Tujuan: %s', 
add_checkdigit(m.id), 
--nama(u2.firstname, u2.surname),  
get_location(m.origin),
get_location(m.destination) 
      ) 
from users u 
join movement m on m.msgid = sms_msgid 
join users u2 on u2.id = m.userid  
join locations l on m.destination = l.id 
where 
u.groupid @> ARRAY[1] 
--and u.id=251
and u.id in ( 
select distinct uid from ( 
select id as uid, unnest(area) as area from users ) as foo 
where is_parent_area(m.destination, foo.area))

 

Business Rules

Hook: sms_postinsert; Order: 10
select
  case when  
    send_template_report('skkh',u.email, m.id, 
    case when get_param('hostname') = 'sidecar'
      then 'sidecar'
      else 'live'
    end) = 'True'
  then (0,)

  else (1,'Unable to send SKKH by email') end
from movement m
join users u on u.id = m.userid
where m.msgid = $3
and u.email is not null
and trim(u.email) <> 

SKO: Stok Kontainer

Format pesan

SKO ([Jenis Kontainer] [Kondisi Kontainer] [Jumlah]...)

Reply SQL

select 
format(get_string('SKO_reply',sms_userid)
,case when infra is null or trim(infra) =  then get_string('SSB_office',sms_userid) 

else infra 
end
,string_agg(format('%s-%s(%s unit)', jk,kk,total), ', ') 
 )
from
(select i.name as infra,jk.name[1] as jk ,kk.name[1] as kk , cs.total
from stocktake s 
join containershipment cs on cs.stocktakeid = s.id 
join infrastructure i on i.id = s.infrastructureid 
join jeniskontainer jk on jk.id = cs.jeniskontainerid
join kondisikontainer kk on kk.id = cs.kondisikontainerid
where s.msgid = sms_msgid) as aa
group by infra 

SKP: Stok Pakan Konsentrat

Format pesan

SKP ([Jenis Konsentrat] [jumlah stok konsentrat (Kg)] [sumberanggaran]...) [produsen]

Reply SQL

select 
format(get_string('SKP_reply', sms_userid)
,case when infra is null or trim(infra) =  then get_string('SSB_office',sms_userid) 

else infra 
end
,string_agg(format('%s:%s kg', jk,jumlah), ', ') 
 )
from
(
select i.name as infra,jk.name[1] as jk ,jumlah
from konsentrat k 
join infrastructure i on i.id = k.infraid
join jeniskonsentrat jk on jk.id = k.idjeniskonsentrat
where k.msgid = sms_msgid

) as aa
group by infra 

SKSR: SKSR

Format pesan

SKSR [ID Pemilik] [ID Hewan]

Reply SQL

with bcs as (select coalesce(bcs.datakejadian,'tidak dilaporkan') as val 
  from hewan h 
  join pemilik_hewan ph on ph.idhewan=h.id and not ph.del and ph.tanggalakhir is null 
  join users u on u.id=ph.idpemilik and not u.del and local_phone(u.phone) ~ (params[1]||'$') 
  left join kejadian bcs on bcs.idtipekejadian=15 and h.id=bcs.idhewan and not bcs.del 
  where upper(h.identifikasi) = upper(params[2]) and not h.del 
  order by bcs.reportdate desc limit 1)
select 
format(get_string('SKSR_reply', sms_userid)
, add_checkdigit(k.id)
, local_phone(u.phone)
, h.identifikasi
, sr.name[get_lang(sms_userid)]
, bcs.val)
from kejadian k
join statusrepro sr on k.datakejadian::integer=sr.id and not sr.del
join hewan h on h.id = k.idhewan and not h.del
join pemilik_hewan ph on ph.idhewan=h.id and not ph.del
join users u on u.id=ph.idpemilik and not u.del
join bcs on true
where k.msgid = sms_msgid 

Business Rules

Hook: sms_postinsert; Order: 10
select
case when 
send_template_report('SKSR', u.email, add_checkdigit(k.id)::int, 
case when get_param('hostname') = 'dbmaster' 
then 'live' 
else 'sidecar' 
end) = 'True'
then (0,)

else (1,'Maaf, Kartu SKSR tidak dapat dikirimkan') end
from kejadian k
join users u on u.id = k.createdby
where k.msgid = $3
and u.email is not null
and trim(u.email) <> 

and not k.del

SLAB: Surveilans aktif (laboratorium)

Format pesan

SLAB [ID program] ([species] [jumlah hewan]...) [lokasi] {ID laboratorium}

Reply SQL

select 
  format(get_string('SUR_reply', sms_userid),
  p.name,
  l.name,
  string_agg(format(get_string('SUR_totals',sms_userid),
    sp.name[get_lang(sms_userid)],
    s.specimens),'; '),
  coalesce(' ('||i.name||')',))

from surveillance s
join surveillanceprograms p on s.programid = p.id
join species sp on s.speciesid = sp.id
join locations l on s.locationid = l.id
left outer join infrastructure i on i.id = s.labid
where msgid = sms_msgid
group by p.name, l.name, i.name 

Business Rules

Hook: sms_validate; Order: 10
select
  case 
    when $2[3] is not null then
      case 
        when length($2[3]) < 8 then 
          (1,get_string('E_notdesacode',$1))
        else 
          (0,null)
      end
    else
      (0,null)
  end

SLAP: Surveilans (lapangan)

Format pesan

SLAP [ID program] ([spesies] [jumlah positif] [jumlah negatif]...) [lokasi]

Reply SQL

select 
   format(
      get_string('SLAP_reply',sms_userid), 
      foo.gresult, get_location(foo.locationid), 
      p.name) 
from ( 
  select 
    min(locationid) as locationid, 
    min(programid) as programid, 
    string_agg(
      format('%s (%s pos, %s neg)', 
      get_species_name(speciesid, sms_userid), pos, neg),
     ', ') as gresult
from surveillance
where msgid = sms_msgid) as foo
join surveillanceprograms p on p.id = foo.programid 

Business Rules

Hook: sms_validate; Order: 10
select
  case 
    when $2[3] is not null then
      case 
        when length($2[3]) < 8 then 
          (1,get_string('E_notdesacode',$1))
        else 
          (0,null)
      end
    else
      (0,null)
  end

SNC: Stok Nitrogen Cair

Format pesan

SNC [Jumlah liter]

Reply SQL

select format(get_string('SNC_reply',sms_userid), ns.volume, case when i.shortname is null or trim(i.shortname) =  then get_string('SNC_office',sms_userid) else i.shortname end, get_location(i.locationid) ) from stocktake s join nitrogenshipment ns on ns.stocktakeid = s.id join infrastructure i on i.id = s.infrastructureid where s.msgid = sms_msgid 

SP: Sumber penyakit

Format pesan

SP [ID kasus] [kode sumber] {lokasi}

Reply SQL

select 
  format(get_string('SP_reply', sms_userid),
  sum.name[get_lang(sms_userid)],
  coalesce(format(' (dari %s)',get_location(sp.locationid)),),

  get_species_name(coalesce(s.speciesid, sy.speciesid),sms_userid),
  get_location(c.locationid),
  tanggal(c.reportdate))
from sumberpenyakit sp
join cases c on c.id = sp.caseid 
join sumber sum on sum.id = sp.sumberid and not sum.del
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where sp.msgid = sms_msgid 

SPK: Surveilans Pengawas Kesmavet

Format pesan

SPK [tanda,tanda...] [Produk] [uji kit] [jumlah positif] [jumlah negatif] [kode pasar]

Reply SQL

select 'terimakasih' 

SSB: Stok Semen Beku

Format pesan

SSB ([Bangsa] [Jumlah straw]...)

Reply SQL

select format(get_string('SSB_reply',sms_userid), string_agg(format('%s (%s)', sp.name[get_lang(sms_userid)], ns.total), ', '), case when i.shortname is null or trim(i.shortname) =  then get_string('SSB_office',sms_userid) else i.shortname end, get_location(i.locationid) ) from stocktake s join strawshipment ns on ns.stocktakeid = s.id join infrastructure i on i.id = s.infrastructureid join species sp on sp.id = ns.breedid where s.msgid = sms_msgid group by i.shortname, i.locationid 

ST: Pendaftaran Straw

Format pesan

ST [ID Pejantan] [ID Pembuatan] [Spesies] [Kode BIB]

Reply SQL

Select 'Terimakasih' 

TK: Tanda klinis

Format pesan

TK [ID kasus] [tanda,tanda...]

Reply SQL

select 
  format(get_string('TK_reply',sms_userid),
  get_sign_names(t.signsid, sms_userid),
  get_species_name(coalesce(s.speciesid, sy.speciesid),sms_userid),
  get_location(c.locationid),
  tanggal(c.reportdate))
from tandaklinis t
join cases c on c.id = t.caseid
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where t.msgid = sms_msgid 

TL: Tindakan Lain

Format pesan

TL [ID program] ([kode jenis tindakan] [jumlah]...) [lokasi]

Reply SQL

select format(get_string('TL_reply',sms_userid),
  get_location(foo.locationid), foo.result, pk.name, get_disease_names(pk.diseaseid,sms_userid))
from (
select min(locationid) as locationid , min(programtindakanid) as programid, 
   string_agg(format('%s (%s %s)',t.name[get_lang(sms_userid)], tl.jumlah, t.units[get_lang(sms_userid)]), ', ') as result
from tindakanlain tl
join tindakan t on t.id = tl.tindakanid
where msgid = sms_msgid) as foo
join programtindakan pk on pk.id = foo.programid
 

TP: Tindakan Penolakan Pemotongan

Format pesan

TP ([Jenis Hewan] [Alasan Penolakan] [Jumlah ditolak]...) {Kode RP}

Reply SQL

select
      format(get_string('TPP_totalsrep',sms_userid), 
        i.name, to_char(p.reportdate,'dd/mm/YYYY'), 
        string_agg(format('%s %s : %s ekor',
          t.name[get_lang(sms_userid)],ap.name[1],total), '; '))
      from penolakan p
      join animal_types t on t.id = p.animaltypeid and not t.del
      join infrastructure i on p.infrastructureid = i.id and not i.del
      join alasanpenolakan ap on ap.id = p.alasanpenolakanid
      where msgid = sms_msgid
      group by i.name,p.reportdate 

U: Laporan tanda umum

Format pesan

U [tanda,tanda...] [spesies] [jumlah hewan] {lokasi} {diagnosa banding,diagnosa banding...}

Reply SQL

select format(get_string('U_posrep',sms_userid),
  add_checkdigit(c.id), cases,
  get_sign_names(signsid,c.userid),
  get_species_name(speciesid,c.userid),
  get_location(c.locationid)) || coalesce('. Ddx: ' || 
    get_disease_names(r.diagnosisid,sms_userid),)

from cases c
join signreports s on s.caseid = c.id
left outer join response r on r.caseid = c.id
where c.msgid = sms_msgid 

Alert SQL

select u.phone, 
  format(get_string('U_alert',u.id),
    add_checkdigit(s.caseid), nama(u2.firstname, u2.surname), 
    format_phone(u2.phone), 
    s.cases, 
    get_sign_names(s.signsid, u.id),
    get_species_name(s.speciesid,u.id),
    get_location(c.locationid),
    coalesce('. DDx: '||get_disease_names(r.diagnosisid,2),)

    )
from users u 
join cases c on c.msgid = sms_msgid
join signreports s on c.id = s.caseid
join users u2 on u2.id = c.userid
left outer join response r on r.caseid = c.id 
-- join locations l on c.locationid = l.id
where is_permitted('get_pelsa_alert_u',u.id) 
and u.id in (
  select distinct uid from (
    select id as uid, unnest(area) as area from users
  ) as foo
  where is_parent_area(c.locationid, foo.area)
  and u.id <> sms_userid
) 

Business Rules

Hook: sms_preparse; Order: 10
select 
  case 
    when spcode is null then (0,null) 
    else (1,
    case spcode::integer 
      when 1 then format(get_string('U_speccodechange',$1),'AY',spcode)
      when 2 then format(get_string('U_speccodechange',$1),'SP',spcode)
      when 3 then format(get_string('U_speccodechange',$1),'KR',spcode)
      when 4 then format(get_string('U_speccodechange',$1),'AJ',spcode)
      when 5 then format(get_string('U_speccodechange',$1),'KB',spcode)
      when 6 then format(get_string('U_speccodechange',$1),'KL',spcode)
      when 7 then format(get_string('U_speccodechange',$1),'KD',spcode)
      when 9 then format(get_string('U_speccodechange',$1),'DB',spcode)
      when 10 then format(get_string('U_speccodechange',$1),'BB',spcode)
      when 11 then format(get_string('U_speccodechange',$1),'KE',spcode)
      when 12 then format(get_string('U_speccodechange',$1),'IT',spcode)
      when 13 then format(get_string('U_speccodechange',$1),'IK',spcode)
      when 14 then format(get_string('U_speccodechange',$1),'KC',spcode)
      when 16 then format(get_string('U_speccodechange',$1),'UL',spcode)
      else format(get_string('E_invspec',$1),spcode)
    end)
  end
from (
  select (regexp_matches($2[1],
'^U
[;#\s]+
[a-z]+(?:\s*,\s*[a-z]+)*
[;#\s]+
(\d+)
[;#\s]*
\d+
(?:(?:[;#\s]*)\d{2,8}(?:\.\d{1,})?)?
[;#\s]*
(?:(?:[;#\s]*)[a-z]+(?:\s*,\s*[a-z]+)*)?
[;#\s]*
$', 'igx'))[1] as spcode
union
select null order by spcode limit 1  
) as foo

Hook: sms_validate; Order: 10
select
  case 
    -- allowed to make a diagnosis
    when is_permitted('can_send_r',$1) then
      case when $2[5] is null then
        (1,get_string('E_missingdx',$1))
      else
        (0,null)
      end
    -- Pelsa
    else
      case when $2[5] is not null then
        (1,get_string('E_dxnotallowed',$1))
      else
        (0,null)
      end
  end
from users u
where u.id = $1 
Hook: sms_validate; Order: 20
select
  case 
    when $2[4] is not null then
      case 
        when length($2[4]) < 7 then 
          (1,get_string('E_notdesacode',$1))
        else 
          (0,null)
      end
    else
      (0,null)
  end

UC: Uji cepat

Format pesan

UC [ID kasus] [kode uji] ([kode spesies] [jumlah positif] [jumlah negatif]...)

Reply SQL

select format(
  get_string('UC_reply',sms_userid),
  t.name[get_lang(sms_userid)],
  get_location(c.locationid), 
  foo.res)
from (
	select 
	  min(u.caseid) as caseid, 
	  min(testtypeid) as testtypeid, 
	  string_agg(format(get_string('UC_test',sms_userid), get_species_name(u.speciesid, sms_userid), pos, neg), '; ') as res
	from ujicepat u
	where u.msgid = sms_msgid and not u.del
      ) as foo
join cases c on c.id = foo.caseid and not c.del
join testtypes t on t.id = foo.testtypeid
 

UH: Ukuran hewan

Format pesan

UH [ID Pemilik] [ID Hewan] [Lingkar dada sentimeter] [Tinggi gumba sentimeter] [Panjang badan sentimeter]

Reply SQL

select 
format(get_string('UH_reply', sms_userid),
k1.datakejadian,
k2.datakejadian, 
k3.datakejadian,
h.identifikasi,
nama(ph.idpemilik::int),
l.name,
round(((k1.datakejadian::float^2)*k3.datakejadian::float/10838)::numeric,-1))
from kejadian k1
join hewan h on h.id=k1.idhewan
join pemilik_hewan ph on ph.idhewan = h.id
join users u on u.id = ph.idpemilik
join locations l on l.id = u.locationid
join kejadian k2 on k2.idhewan=k1.idhewan and k2.msgid=sms_msgid and k2.idtipekejadian=18
join kejadian k3 on k3.idhewan=k1.idhewan and k3.msgid=sms_msgid and k3.idtipekejadian=19
where k1.msgid = sms_msgid and k1.idtipekejadian=13 

Business Rules

Hook: sms_postinsert; Order: 1
insert into kejadian 
(reportdate,idhewan,idtipekejadian,datakejadian,createdby,msgid) 
select 
now()
, ph.idhewan
, 18
, $2[4]
, $1
, $3
from hewan h
join pemilik_hewan ph on ph.idhewan=h.id and ph.idpemilik = get_farmer_id($2[1],$1) and ph.tanggalakhir is null and not ph.del
where upper(h.identifikasi) = upper($2[2])
and not h.del
Hook: sms_postinsert; Order: 2
insert into kejadian 
(reportdate,idhewan,idtipekejadian,datakejadian,createdby,msgid) 
select 
now()
, ph.idhewan
, 19
, $2[5]
, $1
, $3
from hewan h
join pemilik_hewan ph on ph.idhewan=h.id and ph.idpemilik = get_farmer_id($2[1],$1) and ph.tanggalakhir is null and not ph.del
where upper(h.identifikasi) = upper($2[2])
and not h.del

UI: Laporan tanda umum hewan identifikasi

Format pesan

UI [tanda,tanda...] [ID Pemilik] [ID Hewan] [diagnosa banding,diagnosa banding...]

Reply SQL

select format(get_string('UI_posrep',sms_userid),
  add_checkdigit(c.id),
  get_sign_names(signsid,c.userid),
  get_species_name(speciesid,c.userid),
  h.identifikasi,
  nama(u.id),
  get_location(c.locationid))
coalesce('. Ddx: ' get_disease_names(r.diagnosisid,sms_userid),)
from cases c
join signreports s on s.caseid = c.id
join hewan h on h.id = s.animalid
join pemilik_hewan p on p.idhewan = h.id and p.tanggalakhir is null
join users u on u.id = p.idpemilik
left outer join response r on r.caseid = c.id
where c.msgid = sms_msgid 

Alert SQL

select phone, message from (
select 
  u.phone,
  format(get_string('U_alert',u.id),
    add_checkdigit(c.id), nama(u2.id), 
    format_phone(u2.phone), 
    s.cases, 
    get_sign_names(s.signsid, u.id),
    get_species_name(s.speciesid,u.id),
    get_location(c.locationid),
    coalesce('. DDx: '||get_disease_names(r.diagnosisid,u.id),)

    ) as message,
  coalesce(bool_or(coalesce(up.permission,gp.permission) = 1),false) as permitted
from users u
join cases c on c.msgid = sms_msgid
join signreports s on s.caseid = c.id
left outer join response r on r.caseid = c.id
join users u2 on u2.id = c.createdby
join locations l on l.id = c.locationid
join locations l2 on l2.id = any(u.area) 
  and l.code ~ ('^'||l2.code) 
left outer JOIN group_permissions gp ON gp.permission_typeid = 48 AND gp.groupid = ANY(u.groupid)
LEFT OUTER JOIN user_permissions up ON up.permission_typeid = 48 AND up.userid = u.id
where not u.del
  and u.id <> sms_userid
group by u.id, c.id, u2.id, s.cases, s.signsid, s.speciesid, r.diagnosisid
) foo where permitted

/*
WITH
myusers AS
(
SELECT 
DISTINCT phone, uid
FROM 
(
SELECT 
  id AS uid
  , phone
  , UNNEST(area) as area 
FROM users
where not del
) as foo
WHERE
  IS_PARENT_AREA((SELECT locationid FROM cases WHERE msgid = sms_msgid), foo.area)
  AND IS_PERMITTED('get_pelsa_alert_u',uid)
  AND uid <> sms_userid
)
SELECT
mu.phone,
format(get_string('U_alert',mu.uid),
    add_checkdigit(s.caseid), nama(u2.firstname, u2.surname),
    format_phone(u2.phone), 
    s.cases, 
    get_sign_names(s.signsid, mu.uid),
    get_species_name(s.speciesid,mu.uid),
    get_location(c.locationid),
    coalesce('. DDx: '||get_disease_names(r.diagnosisid,mu.uid),)

    )
FROM myusers mu
join cases c on c.msgid = sms_msgid
JOIN users u2 ON (c.createdby = u2.id)
join signreports s on c.id = s.caseid
left outer join response r on r.caseid = c.id
join locations l on c.locationid = l.id
*/ 

Business Rules

Hook: sms_validate; Order: 10
Select
case when count(id)=0 then (0, null)
else (1,'Maaf, Sudah ada laporan UI pada hewan yang sama hari ini.') end
from (
select c.id
from cases c
join case_animals ca on ca.idcase=c.id and not ca.del
join hewan h on h.id=ca.idhewan and not h.del
join pemilik_hewan ph on ph.idhewan=h.id and not ph.del
join users u on u.id=ph.idpemilik and not u.del
where
u.phone=int_phone($2[2]::text)
and upper(h.identifikasi) =upper($2[3]::text)
and c.createdon::date=now()::date
and c.createdby=$1
and not c.del
)
as z

VAK: Laporan vaksinasi

Format pesan

VAK [ID program] ([spesies] [jumlah divaksinasi pertama] {jumlah booster}...) [lokasi]

Reply SQL

-- new version. Includes special messages for rabies vaccination
/*
select foo.mainreply || ' ' ||
  case when rabies then
    case
      when target is null then get_string('VAK_rep_nopop', sms_userid)
        -- ' There is no previous population or vaccination data available for this village'
        -- ' Cakupan vaksinasi tidak diketahui karena tidak ada data populasi di desa ini'
      when foo.total_this_round >= foo.target then
        get_string('VAK_rep_enough',sms_userid)
        -- ' You have finished vaccination in this village'
        -- ' Cakupan vaksinasi cukup, silahkan ke desa lain'
      else
        get_string('VAK_rep_more',sms_userid)
        -- format(' Your target is %s more dogs in this village', foo.target - foo.total_this_round)
        -- ' Cakupan belum cukup, lakukan vaksinasi ulang'
    end
  else 

  end as rabies_reply
  from (
select
  format (get_string('VAK_reply',sms_userid), 
    p.name, l.name,
    string_agg(
      case when v.booster is null then
        format(get_string('VAK_doses', sms_userid),s.name[get_lang(sms_userid)], v.firstdose)
     else
        format(get_string('VAK_booster', sms_userid),s.name[get_lang(sms_userid)], v.firstdose, v.booster)
      end
      ,'; ')) as mainreply,
  111 = any(p.diseaseid) as rabies, -- is this related to a rabies program
  -- end rabies report
  case
    when coalesce(sum(v3.firstdose),0) > coalesce((get_population(l.id, v.speciesid)).total,0)
      then 1.1 * sum(v3.firstdose) -- 10% more than the last vacc round
    when coalesce(sum(v3.firstdose),0) <= coalesce((get_population(l.id, v.speciesid)).total,0)
      and get_population(l.id, v.speciesid) is not null -- checks for both 0/null
      then (get_population(l.id, v.speciesid)).total -- the most recent population estimate if more than the last vacc round
    else null end
  as target,
  sum(v2.firstdose) as total_this_round
  -- current message data
  -- v.id, p.id, l.id, v.firstdose, v.booster,
  -- same village, all vaccinations this round
  -- count(v2.*),sum(v2.firstdose) as this_round_first, sum(v2.booster) as this_round_booster,
  -- same village, totals for previous round
  -- count(v3.*),sum(v3.firstdose) as last_round_first, sum(v3.booster) as last_round_booster,
  -- same village, latest population figures
  -- (get_population(l.id, v.speciesid)).total as pop_total
from vaccinations v
join vaccinationprograms p on v.programid = p.id
join species s on v.speciesid = s.id
join locations l on v.locationid = l.id
-- join the current vaccination round and population from the same village (there may have been earlier vaccinations in this village)
left join vaccinations v2 on v2.locationid = v.locationid -- same village
  and v2.createdon between (v.createdon-'4 months'::interval) and v.createdon -- between 4 and 10 months previously
  and v2.speciesid = v.speciesid
  and not v2.del
left join vaccinationprograms p2 on p2.id = v2.programid
  and p2.diseaseid && p.diseaseid -- some of the same diseases
  and not p2.del
-- join the previous vaccination round and population from the same village
left join vaccinations v3 on v3.locationid = v.locationid -- same village
  and v3.createdon between (v.createdon-'10 months'::interval) and (v.createdon-'4 months'::interval) -- between 4 and 10 months previously
  and v3.speciesid = v.speciesid
  and not v3.del
left join vaccinationprograms p3 on p3.id = v3.programid
  and p3.diseaseid && p.diseaseid -- some of the same diseases
  and not p3.del
where v.msgid = sms_msgid
group by v.id, p.id, l.id,v.firstdose, v.booster) foo
*/
-- old version

select 
  format (get_string('VAK_reply',sms_userid),
    p.name, l.name, 
    string_agg(
      case when booster is null then
        format(get_string('VAK_doses', sms_userid),s.name[1], firstdose)
     else 
        format(get_string('VAK_booster', sms_userid),s.name[1], firstdose, booster)
      end
      ,'; '))  
from vaccinations v
join vaccinationprograms p on v.programid = p.id
join species s on v.speciesid = s.id
join locations l on v.locationid = l.id
where v.msgid = sms_msgid
group by p.name, l.name
 

Alert SQL

select u.phone, rabies_reply from
(select 
  case when rabies then 
    bar.mainreply || ' ' ||
    format(get_string('VAK_status',sms_userid), 
    pop, bar.target, total_this_round, 
    ((100*total_this_round)/pop::float)::numeric(5,2)
    )
    case
      when target is null then get_string('VAK_rep_nopop', sms_userid)
      when bar.total_this_round >= bar.target then get_string('VAK_achieved',sms_userid)
      else
        format(get_string('VAK_more',sms_userid), target - total_this_round)
    end
  else 

  end
  as rabies_reply,
  locid
from (
select
  mainreply,
  case
    -- population estimation: two options
    --  1) Population recorded in the database (aim for 70% coverage), or if not availalbe
    --  2) Number vaccinated last year (increase by 15%)
    when coalesce(sum(v3.firstdose),0) <= coalesce((get_population(60, locid)).total,0) -- pop data availalbe and larger than vac
      and (get_population(60,locid)).total is not null -- checks for both 0/null
      then ceiling(get_param('rabies_target_coverage')::float *  (get_population(60, locid)).total) 
    when coalesce(sum(v3.firstdose),0) > coalesce((get_population(60,locid)).total,0)
      then ceiling(get_param('rabies_annual_pop_increase')::float * sum(v3.firstdose)) -- 15% more than the last vacc round
    else null end
  as target,
  sum(coalesce(foo.firstdose,0)) as total_this_round, -- only use first dose to calculate coverage (not booster),
  rabies,
  (get_population(60, locid)).total as pop,
  locid
from(
select 
  main.*, 
  v2.*,
  -- change made here in response to Albert's request
  -- special Rabies handling disabled, so that normal reply is supplied
  -- do this by marking the variable rabies as false for all cases
  -- this makes it easy to switch back on if we need to
  --- false as rabies
  111 = any(did) as rabies 
from ( -- foo
select -- main
  v.locationid as locid,
  v.createdon as co,
  v.programid as pid,
  p.diseaseid as did,
  format(get_string('VAK_alert',2),
    nama(u.id), local_phone(u.phone),
    add_checkdigit(p.id), get_location(l.id),
    string_agg(
      case when v.booster is null then
        format(get_string('VAK_doses', sms_userid),s.name[get_lang(sms_userid)], v.firstdose)
     else
        format(get_string('VAK_booster', sms_userid),s.name[get_lang(sms_userid)], v.firstdose, v.booster)
      end
      ,'; ')) as mainreply
from vaccinations v 
join users u on u.id = v.createdby
join vaccinationprograms p on v.programid = p.id
join locations l on l.id = v.locationid
join species s on s.id = v.speciesid
where v.msgid = sms_msgid
group by p.id, u.id, l.id, v.locationid, v.createdon, v.programid,p.diseaseid
) main
-- join the current vaccination round and population from the same village (there may have been earlier vaccinations in this village)
left join vaccinations v2 on v2.locationid = locid -- same village
  and v2.createdon between (co-'3 months'::interval) and co  -- within the last 3 months
  --and v2.speciesid in (60,61,62,215,216,217,218,219,220)
  and not v2.del
join species sp2 on sp2.id = v2.speciesid
  and is_child ('4.1.1',sp2.hiercode)
left join vaccinationprograms p2 on p2.id = pid
  and p2.diseaseid && did -- some of the same diseases
  and not p2.del
) foo
left join vaccinations v3 on v3.locationid = locid --v.locationid -- same village
  and v3.createdon between (co-'15 months'::interval) and (co-'9 months'::interval) -- between 9 and 15 months previously (to catch the last vaccination round
  and not v3.del
left join species sp3 on sp3.id = v3.speciesid
  and is_child ('4.1.1',sp3.hiercode)
left join vaccinationprograms p3 on p3.id = v3.programid
  and p3.diseaseid && did -- some of the same diseases
  and not p3.del
group by locid, mainreply, rabies
) bar
) message
join users u on is_permitted('get_vac_alert', u.id)
  -- array[36,37,38,39, 40] && u.groupid
  and not u.del
  and ischildlocation(u.area, locid)
 

Business Rules

Hook: sms_validate; Order: 20
with newdata as (
select
  remove_checkdigit($2[1]::integer) as programid, 
  s.id as speciesid, 
  number::integer as firstvac, 
  get_location_id(trim($2[3])) as locid 
from (
select r[1] as species,r[2] as number from (
select regexp_matches($2[2] ,'([a-z]+)[;#\s]*(\d+)((?:[;#\s]*)\d+)?', 'igx') as r
) foo
) bar 
join species s on s.code ilike bar.species
)

select result from (
select 
  1 as natorder, 
  case when firstvac >= firstdose then  
  (1,format(get_string('VAK_duplicate',$1), 
    format('%s (%s)',get_species_name(v.speciesid,$1),v.firstdose)))
  else (0,null) end as result 
from (
select v.speciesid, v.firstdose, n.firstvac 
from vaccinations v
join newdata n -- get the matching rows
  on n.speciesid = v.speciesid          -- same species
  and n.programid = v.programid 	-- same programid
  and v.reportdate::date = now()::date  -- same date
  and v.locationid = n.locid 		-- same village
--  and n.firstvac >= v.firstdose		-- same or higher number of animals
  and v.createdby = $1                  -- same user
--join locations l on l.id = v.locationid and left(l.code,2) = '51'             -- only Bali for the moment
order by v.createdon asc limit 1
) v
union
select 2, (0,null)
order by natorder
) fbar
limit 1

VSK: Validasi SKKH

Format pesan

VSK [ID SKKH]

Reply SQL

select 
  format(get_string('VSK_reply',sms_userid),
  add_checkdigit(m.id),
  case when now() - m.reportdate < (get_param('skkh_valid_period'))::interval then 
    get_string('Valid',sms_userid) 
  else 
    get_string('Expired',sms_userid) 
  end,
  ownerid,
  tanggal(m.reportdate),
  string_agg(format('%s %s',a.total,get_species_name(a.speciesid,sms_userid)),', '),
  get_location(origin),
  get_location(destination))
from movement m
left outer join movementanimals a on a.movementid = m.id
where m.id = remove_checkdigit(trim(params[1])::bigint)
group by m.id 

Z: Suspek zoonosis

Format pesan

Z [ID kasus] [jumlah manusia terpapar] [jumlah manusia sakit] [jumlah manusia mati]

Reply SQL

select 
  format(get_string('Z_reply', sms_userid),
  terpapar, sakit, mati,
  get_species_name(coalesce(s.speciesid, sy.speciesid),sms_userid),
  get_location(c.locationid),
  tanggal(c.reportdate))
from zoonoses z
join cases c on c.id = z.caseid
left outer join signreports s on s.caseid = c.id
left outer join syndromereports sy on sy.caseid = c.id
where z.msgid = sms_msgid 

Alert SQL

with lid as (
select 
l.centroid, 
  format(get_string('Z_alert',sms_userid)
, nama (z.createdby)
, format_phone(u2.phone)
, z.terpapar
, z.sakit
, z.mati
, d.name
, get_species_name(s.speciesid,sms_userid)
, get_location(c.locationid))as msg


from zoonoses z
JOIN cases c on c.id = z.caseid
JOIN users u2 ON (c.userid = u2.id)
join syndromereports s on c.id = s.caseid
join syndromes sy on sy.id = s.syndromeid
join response r on r.caseid = c.id
join diseases d on d.id=sy.targetdiseaseid
join locations l on c.locationid = l.id  
where z.msgid = 1988514284778197
and d.priority = true),

gperm as (
  select array_agg(groupid) as p from group_permissions
  where permission_typeid = 73 and permission = 1 
  -- 47 = get_pelsa_alert_p
)
select
  u.phone
  ,lid.msg
from users u
left join gperm on true
left join user_permissions up 
  on up.userid = u.id 
  and up.permission_typeid = 73
  -- 47 = get_pelsa_alert_p
join locations l on array[l.id] && u.area
join lid on true -- reporter location
where (coalesce(up.permission=1,gperm.p && u.groupid))
  and st_contains(l.geom,lid.centroid)