{
  "Helper_SendTXTEmail": "select txt_title,txt_body,txt_bcc,txt_type from {schema}.txt__tbl where txt_process='EMAIL' and txt_attrib=@txt_attrib",
  "HelperRender_getTXT": "select txt_body from {schema}.txt__tbl where txt_process=@txt_process and txt_attrib=@txt_attrib",
  "get_tstmp": "{schema}.my_now()",
  "context_user": "{schema}.my_db_user()",
  "sms_send_txt": "select txt_title,txt_body,txt_bcc from {schema}.txt__tbl where txt_process='SMS' and txt_attrib=@txt_attrib",
  "str_concat":"||",
  "func_prefix":"",
  "$iif":{ "params": ["cond","vtrue","vfalse"], "sql": "(case when %%%cond%%% then %%%vtrue%%% else %%%vfalse%%% end)" },
  "$ifnull":{ "params": ["a","b"], "sql": "coalesce(%%%a%%%,%%%b%%%)" },
  "$addDays":{ "params": ["date",{ "name": "cnt", "options": { "trim": true } }], "sql": "(%%%date%%% + interval '%%%cnt%%%' day)" },
  "$addBusinessDays":{ "params": ["date","cnt"], "sql": [
    "(%%%date%%% + interval '1' day * (",
    "  select",
    "    case",
    "      when %%%cnt%%% = 0 then 0",
    "      when %%%cnt%%% > 0 then",
    "        t.partial_days + 7 * t.weeks +",
    "        $iif(t.wd + t.partial_days >= 6, 2, 0) +",
    "        $iif(t.wd = 6, -1, 0) +",
    "        $iif(t.partial_days = 0 AND t.wd % 6 = 0, -2, 0)",
    "      when %%%cnt%%% < 0 then",
    "        t.partial_days + 7 * t.weeks +",
    "        $iif(t.wd + t.partial_days <= 0, -2, 0) +",
    "        $iif(t.wd = 0, 1, 0) +",
    "        $iif(t.partial_days = 0 AND t.wd % 6 = 0, 2, 0)",
    "    end",
    "  from (select %%%cnt%%%%5 as partial_days,%%%cnt%%%/5 as weeks,((extract(dow from %%%date%%%) - 1) + 1)::int %  7 wd) t",
    "))",
  ] },
  "$addHours":{ "params": ["date",{ "name": "cnt", "options": { "trim": true } }], "sql": "(%%%date%%% + interval '%%%cnt%%%' hour)" },
  "$addMinutes":{ "params": ["date",{ "name": "cnt", "options": { "trim": true } }], "sql": "(%%%date%%% + interval '%%%cnt%%%' minute)" },
  "$toDate":{ "params": ["date"], "sql": "(%%%date%%%)::date" },
  "$topn": { "params": ["CNT","..."], "sql": "%%%...%%% limit %%%CNT%%%" },
  "$getInsertCount": { "params": ["..."], "sql": "$getUpdateCount(%%%...%%%)" },
  "$getUpdateCount": {
    "params": [],
    "exec": "return 'with xrslt as ('+[].slice.call(arguments).join(',')+' returning 1) select count(*) xrowcount from xrslt;';"
  },
  "$errorif": {
    "params": ["COND","MSG"],
    "exec": [
      "var errmsg_var = 'jsherrmsg'+Math.round(Math.random()*10000).toString();  while(errmsg_var in this.vars) errmsg_var += '_'; this.vars[errmsg_var] = true;",
      "var rslt = 'do $$ declare '+errmsg_var+' text; begin ';",
      "rslt += 'if ('+COND.trim()+') then \\n';",
      "MSG = MSG.trim();",
      "if(MSG && (MSG[0]=='\\'')) MSG = '\\'Application Error - '+MSG.substr(1);",
      "rslt += 'select '+MSG+' into '+errmsg_var+';\\n';",
      "rslt += '  raise exception \\'%\\','+errmsg_var+'; \\n';",
      "rslt += 'end if; ';",
      "rslt += 'END $$';",
      "return rslt;"
    ]
  },
  "$ceiling": { "params": ["VAL"], "sql": "ceiling(%%%VAL%%%)" },
  "$floor": { "params": ["VAL"], "sql": "floor(%%%VAL%%%)" },
  "$binary":{ "params": ["a"], "sql": "x'%%%a%%%'" },
  "$greatest": {
    "params": [],
    "exec": "return 'greatest('+[].slice.call(arguments).join(',')+')';"
  },
  "$getInsertKey": { "params": ["TBL","KEY","..."], "sql": "with xrslt as (%%%...%%%) returning %%%KEY%%%) select %%%KEY%%% from xrslt" },
  "proc_run":"select ",
  "par_list_beg":"(",
  "par_list_end":")",
  "menu_editor_top":"select @cur_menu_id_auto as cur_menu_id_auto, case when @cur_menu_id_auto <> 0 then @cur_menu_id_auto else (select menu_id_auto from {schema}.menu__tbl where 1=1 order by menu_group desc,coalesce(menu__tbl.menu_seq,menu__tbl.menu_id),menu_name,menu__tbl.menu_id limit 1) end menu_id_auto from {schema}.single",
  "menu_editor_insert":["update {schema}.menu__tbl menu__tbl set menu_seq=coalesce(menu_seq,menu_id)+1",
                  "  where coalesce(menu_seq,menu_id) > (select coalesce(menu_seq,menu_id) from {schema}.menu__tbl where menu_id=@menu_id_parent) ",
                  "    and menu_group = (select menu_group from {schema}.menu__tbl where menu_id=@menu_id_parent)",
                  "    and (coalesce(menu_seq,menu_id)-(select coalesce(menu_seq,menu_id) from {schema}.menu__tbl where menu_id=@menu_id_parent))::decimal/(select count(*) from {schema}.menu__tbl sm2 where coalesce(sm2.menu_seq,sm2.menu_id) > (select coalesce(menu_seq,menu_id) from {schema}.menu__tbl where menu_id=@menu_id_parent) and coalesce(sm2.menu_seq,sm2.menu_id) <= coalesce(menu__tbl.menu_seq,menu__tbl.menu_id))<=1.0;",
                  "with xrslt as (",
                  "  insert into {schema}.menu__tbl (menu_id,menu_id_parent,menu_group,menu_seq,menu_name,menu_desc,menu_sts)",
                  "  select (select max(menu_id)+1 from {schema}.menu__tbl),menu_id,menu_group,coalesce(menu_seq,menu_id)+1,@menu_name,@menu_desc,'ACTIVE' from {schema}.menu__tbl where menu_id=@menu_id_parent",
                  "  returning menu_id_auto",
                  ") select menu_id_auto from xrslt;"],
  "menu_editor_lov":"select menu_id as code_id,menu_id_parent as code_parent_id,menu_id_auto as code_val,menu_desc as code_txt,'folder' as code_icon from {schema}.menu__tbl where 1=1 %%%DATALOCKS%%% order by menu_group desc,coalesce(menu__tbl.menu_seq,menu__tbl.menu_id),menu_name,menu__tbl.menu_id",
  "menu_group_lov":"select * from (values('S','Main'),('C','Client')) as code(code_val,code_txt)",
  "JSHARMONY_FACTORY_INSTALLED":"select case when coalesce((select count(*) from INFORMATION_SCHEMA.COLUMNS where table_name = 'single' and table_schema='{schema}'),0) > 0 then 1 else 0 end JSHARMONY_FACTORY_INSTALLED",
  "{{concat}}":{
    "params": [],
    "exec": [
      "if(arguments.length<1) return 'null';",
      "var rslt = '(' + arguments[0];",
      "for(var i=1;i<arguments.length;i++){",
      "  rslt += ' || ' + arguments[i];",
      "}",
      "rslt += ')';",
      "return rslt;"
    ]
  },
  "decode": {
    "params": [],
    "exec": [
      "if(arguments.length<2) return 'null';",
      "var rslt = '(case ('+arguments[0]+')';",
      "for(var i=0;i<arguments.length-2;i+=2){",
      "  rslt += ' when ('+arguments[i+1]+') then ('+arguments[i+2]+')'",
      "}",
      "if((arguments.length%2)==0) rslt += ' else ('+arguments[arguments.length-1]+')';",
      "else rslt += ' else null';",
      "rslt += ' end)';",
      "return rslt;"
    ]
  },
  "trigger_errorif": {
    "params": ["COND","MSG"],
    "exec": [
      "var rslt = 'if ('+COND.trim()+') then \\n';",
      "MSG = MSG.trim();",
      "if(MSG && (MSG[0]=='\\'')) MSG = '\\'Application Error - '+MSG.substr(1);",
      "rslt += '  raise exception '+MSG+'; \\n';",
      "rslt += 'end if;\\n';",
      "return rslt;"
    ]
  },
  "trigger_defaultvars": {
    "params": [],
    "sql": [
      "curdttm    timestamp default {schema}.my_now();",
      "myuser     text default {schema}.my_db_user();",
      "audit_seq    bigint default NULL;",
      "my_toa     {schema}.toaudit;"
    ]
  },
  "with_insert_trigger_identity": {
    "params": ["KEY","INSERT_STATEMENT"],
    "sql": [
      "%%%INSERT_STATEMENT%%% RETURNING %%%KEY%%%;"
    ]
  },
  "init_audit" : {
    "params": ["audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id"],
    "sql": [
      "my_toa.op := TG_OP;",
      "my_toa.audit_table_name := lower(TG_TABLE_NAME::text);",
      "my_toa.audit_ref_name := %%%audit_ref_name%%%;",
      "my_toa.audit_ref_id := %%%audit_ref_id%%%;",
      "my_toa.audit_subject := %%%audit_subject%%%;",
      "my_toa.cust_id := %%%cust_id%%%;",
      "my_toa.item_id := %%%item_id%%%;"
    ]
  },
  "{schema}.log_audit_done" : {
    "params": [],
    "sql": "",
  },
  "log_audit_insert" : {
    "params": ["ID","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id"],
    "sql": [
      "init_audit(%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%)",
      "select par_audit_seq into audit_seq from {schema}.audit(my_toa, audit_seq, %%%ID%%%);"
    ]
  },
  "log_audit_update_mult" : {
    "params": ["ID","COL_ARRAY","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id"],
    "exec": [
      "var rslt = '';",
      "rslt += 'init_audit('+audit_ref_name+','+audit_ref_id+','+audit_subject+','+cust_id+','+item_id+')\\r\\n';",
      "var col_array = JSON.parse(COL_ARRAY);",
      "for(var i=0;i<col_array.length;i++){",
      "  rslt += 'log_audit_update_col('+ID+','+col_array[i]+')\\r\\n';",
      "}",
      "return rslt;"
    ]
  },
  "log_audit_update" : {
    "params": ["ID","COL_NAME","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id"],
    "sql": [
      "init_audit(%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%)",
      "log_audit_update_col(%%%ID%%%,%%%COL_NAME%%%)"
    ]
  },
  "log_audit_update_col" : {
    "params": ["ID","COL_NAME"],
    "sql": [
      "if ({schema}.nequal(new.%%%COL_NAME%%%, old.%%%COL_NAME%%%)) then\n",
      "    select par_audit_seq INTO audit_seq FROM {schema}.audit(my_toa, audit_seq, %%%ID%%%, '%%%COL_NAME%%%', old.%%%COL_NAME%%%::text);",
      "end if;\n"
    ]
  },
  "log_audit_delete_mult" : {
    "params": ["ID","COL_ARRAY","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id"],
    "exec": [
      "var rslt = '';",
      "rslt += 'init_audit('+audit_ref_name+','+audit_ref_id+','+audit_subject+','+cust_id+','+item_id+')\\r\\n';",
      "var col_array = JSON.parse(COL_ARRAY);",
      "for(var i=0;i<col_array.length;i++){",
      "  rslt += 'log_audit_delete_col('+ID+','+col_array[i]+')\\r\\n';",
      "}",
      "return rslt;"
    ]
  },
  "log_audit_delete" : {
    "params": ["ID","COL_NAME","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id"],
    "sql": [
      "init_audit(%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%)",
      "log_audit_delete_col(%%%ID%%%,%%%COL_NAME%%%)"
    ]
  },
  "log_audit_delete_col" : {
    "params": ["ID","COL_NAME"],
    "sql": [
      "select par_audit_seq INTO audit_seq FROM {schema}.audit(my_toa, audit_seq, %%%ID%%%, '%%%COL_NAME%%%', old.%%%COL_NAME%%%::text);",
    ]
  },
  "{schema}.get_cust_name":{
    "params": ["col"],
    "sql": [
      "(select null)"
    ]
  },
  "{schema}.get_cust_name_ext":{
    "params": ["col"],
    "sql": [
      "(select null)"
    ]
  },
  "{schema}.get_item_name":{
    "params": ["col"],
    "sql": [
      "(select null)"
    ]
  },
  "{schema}.log_audit_insert" : {
    "params": ["TABLE","ID","COL_NAME","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "insert into %%%SCHEMA%%%.audit__tbl(audit_table_name,audit_table_id,audit_op,audit_tstmp,audit_ref_name,audit_ref_id,audit_subject,cust_id,item_id,audit_user) values (%%%TABLE%%%,%%%ID%%%,'I',{schema}.my_now(),%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%,{schema}.my_db_user())"
    ]
  },
  "{schema}.log_audit_update_mult" : {
    "params": ["TABLE","ID","COL_ARRAY","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "rslt += '{schema}.log_audit_update_base('+TABLE+','+ID+','+audit_ref_name+','+audit_ref_id+','+audit_subject+','+cust_id+','+item_id+','+SCHEMA+');\\r\\n';",
      "var col_array = JSON.parse(COL_ARRAY);",
      "for(var i=0;i<col_array.length;i++){",
      "  rslt += '{schema}.log_audit_update_col('+ID+','+col_array[i]+','+SCHEMA+');\\r\\n';",
      "}",
      "return rslt;"
    ]
  },
  "{schema}.log_audit_update" : {
    "params": ["TABLE","ID","COL_NAME","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "rslt += '{schema}.log_audit_update_base('+TABLE+','+ID+','+audit_ref_name+','+audit_ref_id+','+audit_subject+','+cust_id+','+item_id+','+SCHEMA+');\\r\\n';",
      "rslt += '{schema}.log_audit_update_col('+ID+','+COL_NAME+','+SCHEMA+');\\r\\n';",
      "return rslt;"
    ]
  },
  "{schema}.log_audit_update_base" : {
    "params": ["TABLE","ID","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "insert into %%%SCHEMA%%%.audit__tbl(audit_table_name,audit_table_id,audit_op,audit_tstmp,audit_ref_name,audit_ref_id,audit_subject,cust_id,item_id,audit_user) values (%%%TABLE%%%,%%%ID%%%,'U',{schema}.my_now(),%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%,{schema}.my_db_user())"
    ]
  },
  "{schema}.log_audit_update_col" : {
    "params": ["ID","COL_NAME",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "if {schema}.nequal(OLD.%%%COL_NAME%%%, NEW.%%%COL_NAME%%%) then",
      "  insert into %%%SCHEMA%%%.audit_detail(audit_seq,audit_column_name,audit_column_val)",
      "  select currval('%%%SCHEMA%%%.audit__tbl_audit_seq_seq'),lower('%%%COL_NAME%%%'),OLD.%%%COL_NAME%%%;",
      "end if"
    ]
  },
  "{schema}.log_audit_update_custom" : {
    "params": ["TABLE","ID","CONDITION","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "rslt += '{schema}.log_audit_update_custom_base('+TABLE+','+ID+','+CONDITION+','+audit_ref_name+','+audit_ref_id+','+audit_subject+','+cust_id+','+item_id+','+SCHEMA+');\\r\\n';",
      "return rslt;"
    ]
  },
  "{schema}.log_audit_update_custom_base" : {
    "params": ["TABLE","ID","CONDITION","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "if %%%CONDITION%%% then",
      "  insert into %%%SCHEMA%%%.audit__tbl(audit_table_name,audit_table_id,audit_op,audit_tstmp,audit_ref_name,audit_ref_id,audit_subject,cust_id,item_id,audit_user) values (%%%TABLE%%%,%%%ID%%%,'U',{schema}.my_now(),%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%,{schema}.my_db_user());",
      "end if"
    ]
  },
  "{schema}.log_audit_delete_mult" : {
    "params": ["TABLE","ID","COL_ARRAY",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "rslt += '{schema}.log_audit_delete_base('+TABLE+','+ID+','+SCHEMA+');\\r\\n';",
      "var col_array = JSON.parse(COL_ARRAY);",
      "for(var i=0;i<col_array.length;i++){",
      "  rslt += '{schema}.log_audit_delete_col('+ID+','+col_array[i]+','+SCHEMA+');\\r\\n';",
      "}",
      "return rslt;"
    ]
  },
  "{schema}.log_audit_delete" : {
    "params": ["TABLE","ID","COL_NAME",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "rslt += '{schema}.log_audit_delete_base('+TABLE+','+ID+','+SCHEMA+');\\r\\n';",
      "rslt += '{schema}.log_audit_delete_col('+ID+','+COL_NAME+','+SCHEMA+');\\r\\n';",
      "return rslt;"
    ]
  },
  "{schema}.log_audit_delete_base" : {
    "params": ["TABLE","ID",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "insert into %%%SCHEMA%%%.audit__tbl(audit_table_name,audit_table_id,audit_op,audit_tstmp,audit_ref_name,audit_ref_id,audit_subject,cust_id,item_id,audit_user)",
      "  select %%%TABLE%%%,%%%ID%%%,'D',{schema}.my_now(),",
      "    (select audit_ref_name from %%%SCHEMA%%%.audit__tbl where audit_table_name=%%%TABLE%%% and audit_table_id=%%%ID%%% and audit_op='I' order by audit_seq desc limit 1),",
      "    (select audit_ref_id from %%%SCHEMA%%%.audit__tbl where audit_table_name=%%%TABLE%%% and audit_table_id=%%%ID%%% and audit_op='I' order by audit_seq desc limit 1),",
      "    (select audit_subject from %%%SCHEMA%%%.audit__tbl where audit_table_name=%%%TABLE%%% and audit_table_id=%%%ID%%% and audit_op='I' order by audit_seq desc limit 1),",
      "    (select cust_id from %%%SCHEMA%%%.audit__tbl where audit_table_name=%%%TABLE%%% and audit_table_id=%%%ID%%% and audit_op='I' order by audit_seq desc limit 1),",
      "    (select item_id from %%%SCHEMA%%%.audit__tbl where audit_table_name=%%%TABLE%%% and audit_table_id=%%%ID%%% and audit_op='I' order by audit_seq desc limit 1),",
      "    {schema}.my_db_user()"
    ]
  },
  "{schema}.log_audit_delete_col" : {
    "params": ["ID","COL_NAME",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "insert into %%%SCHEMA%%%.audit_detail(audit_seq,audit_column_name,audit_column_val)",
      "  select currval('%%%SCHEMA%%%.audit__tbl_audit_seq_seq'),lower('%%%COL_NAME%%%'),OLD.%%%COL_NAME%%%",
    ]
  },
  "{schema}.log_audit_other" : {
    "params": ["TABLE","ID","CONDITION","COL_NAME","VALUE","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "rslt += '{schema}.log_audit_other_base('+TABLE+','+ID+','+CONDITION+','+audit_ref_name+','+audit_ref_id+','+audit_subject+','+cust_id+','+item_id+','+SCHEMA+');\\r\\n';",
      "rslt += '{schema}.log_audit_other_col('+ID+','+CONDITION+','+COL_NAME+','+VALUE+','+SCHEMA+');\\r\\n';",
      "return rslt;"
    ]
  },
  "{schema}.log_audit_other_base" : {
    "params": ["TABLE","ID","CONDITION","audit_ref_name","audit_ref_id","audit_subject","cust_id","item_id",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "insert into %%%SCHEMA%%%.audit__tbl(audit_table_name,audit_table_id,audit_op,audit_tstmp,audit_ref_name,audit_ref_id,audit_subject,cust_id,item_id,audit_user) select %%%TABLE%%%,%%%ID%%%,'O',{schema}.my_now(),%%%audit_ref_name%%%,%%%audit_ref_id%%%,%%%audit_subject%%%,%%%cust_id%%%,%%%item_id%%%,{schema}.my_db_user() where %%%CONDITION%%%"
    ]
  },
  "{schema}.log_audit_other_col" : {
    "params": ["ID","CONDITION","COL_NAME","VALUE",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "sql": [
      "insert into %%%SCHEMA%%%.audit_detail(audit_seq,audit_column_name,audit_column_val)",
      "  select currval('%%%SCHEMA%%%.audit__tbl_audit_seq_seq'),lower(%%%COL_NAME%%%),%%%VALUE%%% where %%%CONDITION%%%;"
    ]
  },
  "{schema}.audit_history" : {
    "params": ["TABLE","AUDIT_TABLE_NAME","ID","COL_ARRAY",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "if ((typeof COL_ARRAY === 'string' || COL_ARRAY instanceof String) && COL_ARRAY.length && COL_ARRAY.trim()[0]=='[') COL_ARRAY = JSON.parse(COL_ARRAY.trim());",
      "function sqlescape(txt){ if(txt===null) return 'null'; return txt; };",
      "var rslt = 'select audit_seq, audit_op, audit_tstmp, audit_user, '+ID;",
      "for(var i=0;i<COL_ARRAY.length;i++){",
      "  rslt += ',$ifnull((select $topn(1, $ifnull(audit_column_val,\\'\\') from '+SCHEMA+'.audit_detail inner join '+SCHEMA+'.audit__tbl audit2 on audit2.audit_seq = audit_detail.audit_seq and audit2.audit_table_name=audit__tbl.audit_table_name and audit2.audit_table_id=audit__tbl.audit_table_id where audit_detail.audit_seq > audit__tbl.audit_seq and audit_column_name=\\''+COL_ARRAY[i]+'\\' order by audit_detail.audit_seq)), '+COL_ARRAY[i]+'::text) '+COL_ARRAY[i];",
      "}",
      "rslt += ' from '+TABLE;",
      "rslt += ' inner join '+SCHEMA+'.audit__tbl on audit__tbl.audit_table_name = '+AUDIT_TABLE_NAME+' and audit__tbl.audit_table_id = '+ID;",
      "return rslt;"
    ]
  },
  "{schema}.audit_listing" : {
    "params": ["TABLE","AUDIT_TABLE_NAME","ID","COL_ARRAY",{"name":"SCHEMA","options":{"default":"{schema}"}}],
    "exec": [
      "var rslt = '';",
      "if ((typeof COL_ARRAY === 'string' || COL_ARRAY instanceof String) && COL_ARRAY.length && COL_ARRAY.trim()[0]=='[') COL_ARRAY = JSON.parse(COL_ARRAY.trim());",
      "function sqlescape(txt){ if(txt===null) return 'null'; return txt; };",
      "var rslt = 'select audit_seq, audit_op, audit_tstmp, audit_user, audit_ref_name, audit_ref_id, audit_subject, cust_id, item_id, audit_table_id '+ID;",
      "for(var i=0;i<COL_ARRAY.length;i++){",
      "  rslt += ',$ifnull((select $topn(1, $ifnull(audit_column_val,\\'\\') from '+SCHEMA+'.audit_detail inner join '+SCHEMA+'.audit__tbl audit2 on audit2.audit_seq = audit_detail.audit_seq and audit2.audit_table_name=audit__tbl.audit_table_name and audit2.audit_table_id=audit__tbl.audit_table_id where audit_detail.audit_seq > audit__tbl.audit_seq and audit_column_name=\\''+COL_ARRAY[i]+'\\' order by audit_detail.audit_seq)), '+COL_ARRAY[i]+') '+COL_ARRAY[i];",
      "}",
      "rslt += ' from '+SCHEMA+'.audit__tbl';",
      "rslt += ' left outer join '+TABLE+' on '+TABLE+'.'+ID+'=audit__tbl.audit_table_id';",
      "rslt += ' where audit__tbl.audit_table_name = '+AUDIT_TABLE_NAME;",
      "return rslt;"
    ]
  },
}