# Модуль уведомлений
В первую очередь, необходимо добавить шаблон уведомления на странице /admin/notification/notificationtemplate/
Например:
Код: close
Имя: State is closed
Текст: "%s" is closed
Далее, необходимо в нужной процедуре, добавить уведомление.
-- нотификация для статуса close
IF (SELECT model_notification(document_id::int, 'close')) IS NOT TRUE THEN
RAISE NOTICE '%', 'Не удалось разослать нотификации!';
END IF;
Пример реализации функций:
CREATE OR REPLACE FUNCTION public.get_notification_field(user_lang character, noty_code character, field text)
RETURNS text
LANGUAGE plpgsql
AS $function$
DECLARE
select_sql TEXT;
target TEXT;
BEGIN
select_sql := format('SELECT %s_%s FROM notification_templates WHERE code = ''%s''', field, user_lang, noty_code);
EXECUTE select_sql INTO target;
IF target IS NULL OR target = '' THEN
select_sql := format('SELECT %s FROM notification_templates WHERE code = ''%s''', field, noty_code);
EXECUTE select_sql INTO target;
END IF;
RETURN target;
END;
$function$
CREATE OR REPLACE FUNCTION public.model_notification(in_obj_id integer, in_tpl_code character)
RETURNS boolean
LANGUAGE plpgsql
AS $function$
DECLARE
--
-- Уведомления
--
row record;
data_obj record;
user_lang TEXT;
name text;
body text;
title text;
BEGIN
-- обьект рейтинга
FOR data_obj IN (SELECT * FROM db_table WHERE id = in_obj_id) LOOP
-- В статусе закрыто
IF in_tpl_code = 'close' THEN
-- Эксперты и Участники рейтинга
FOR row IN (SELECT DISTINCT id FROM (SELECT id FROM authentication_user WHERE organization_id IN (SELECT organization_id FROM db_table_members WHERE data_id = in_obj_id) UNION SELECT id FROM authentication_user WHERE organization_id IN (SELECT expert_organization_id FROM rating_sub_indexes WHERE data_id = in_obj_id)) AS t) LOOP
user_lang := (SELECT language FROM authentication_user WHERE id = row.id LIMIT 1);
-- данные шаблона
body := (SELECT get_notification_field(user_lang, in_tpl_code, 'body'));
-- уведомление
INSERT INTO notifications (type, level, verb_id, object_id, created_at, recipient_id, is_read, body)
VALUES ('rating', 'info', 1, in_obj_id, NOW(), row.id, FALSE,
FORMAT(body,
title,
to_char(data_obj.publish_date, 'YYYY-MM-DD'),
to_char(data_obj.open_date, 'YYYY-MM-DD'),
to_char(data_obj.close_date, 'YYYY-MM-DD'),
to_char(data_obj.result_publish_date, 'YYYY-MM-DD')
)
);
END LOOP;
END IF;
-- В статусе открыто
IF in_tpl_code = 'open' THEN
-- Участники рейтинга
FOR row IN (SELECT DISTINCT id FROM (SELECT id FROM authentication_user WHERE organization_id IN (SELECT organization_id FROM db_table_members WHERE rating_id = in_obj_id)) AS t) LOOP
user_lang := (SELECT language FROM authentication_user WHERE id = row.id LIMIT 1);
-- данные шаблона
name := (SELECT get_notification_field(user_lang, in_tpl_code, 'name'));
body := (SELECT get_notification_field(user_lang, in_tpl_code, 'body'));
-- данные обьекта
title := (SELECT get_rating_field(user_lang, in_obj_id, 'name'));
-- уведомление
INSERT INTO notifications (type, level, verb_id, object_id, created_at, recipient_id, is_read, body)
VALUES ('rating', 'info', 1, in_obj_id, NOW(), row.id, FALSE,
FORMAT(body,
title,
to_char(data_obj.publish_date, 'YYYY-MM-DD'),
to_char(data_obj.open_date, 'YYYY-MM-DD')
)
);
END LOOP;
END IF;
END LOOP;
RETURN TRUE;
END;
$function$