Все SQL-запросы
CREATE DATABASE support; -- ВНИМАНИЕ! первым выполняется отдельно запрос на создание базы, затем необходимо подключиться к созданной базе данных support и выполнить все остальные запросы ниже.
CREATE TABLE t_users
(
user_id serial NOT NULL, -- ID записи
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
user_name text, -- Имя пользователя
user_surname text, -- Фамилия пользователя
user_login text, -- Имя учетной записи
user_password text, -- Имя учетной записи
user_signature text, -- Подпись пользователя
CONSTRAINT pk_t_users_user_id PRIMARY KEY (user_id)
);
COMMENT ON TABLE t_users
IS 'Таблица для хранения информации о пользователях';
COMMENT ON COLUMN t_users.user_id IS 'ID записи';
COMMENT ON COLUMN t_users.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_users.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_users.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_users.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_users.user_name IS 'Имя пользователя';
COMMENT ON COLUMN t_users.user_surname IS 'Фамилия пользователя';
COMMENT ON COLUMN t_users.user_login IS 'Имя учетной записи';
COMMENT ON COLUMN t_users.user_password IS 'Имя учетной записи';
COMMENT ON COLUMN t_users.user_signature IS 'Подпись пользователя';
CREATE OR REPLACE VIEW vw_users AS
SELECT t_users.user_id,
t_users.dttmcr,
t_users.dttmup,
t_users.dttmcl,
t_users.userid,
t_users.user_name,
t_users.user_surname,
(COALESCE(t_users.user_name, ''::text) || ' '::text) || COALESCE(t_users.user_surname, ''::text) AS user_fullname,
t_users.user_login,
t_users.user_password,
t_users.user_signature
FROM t_users;
CREATE TABLE t_clients
(
client_id serial NOT NULL, -- ID записи
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
client_name text, -- Имя клиента
client_surname text, -- Фамилия клиента
CONSTRAINT pk_t_clients_client_id PRIMARY KEY (client_id)
);
COMMENT ON TABLE t_clients
IS 'Таблица для хранения информации о клиентах';
COMMENT ON COLUMN t_clients.client_id IS 'ID записи';
COMMENT ON COLUMN t_clients.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_clients.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_clients.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_clients.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_clients.client_name IS 'Имя клиента';
COMMENT ON COLUMN t_clients.client_surname IS 'Фамилия клиента';
CREATE OR REPLACE VIEW vw_clients AS
SELECT t_clients.client_id,
t_clients.dttmcr,
t_clients.dttmup,
t_clients.dttmcl,
t_clients.userid,
t_clients.client_name,
t_clients.client_surname,
(COALESCE(t_clients.client_name, ''::text) || ' '::text) || COALESCE(t_clients.client_surname, ''::text) AS client_fullname
FROM t_clients;
CREATE TABLE t_status_types
(
status_type_id serial NOT NULL, -- ID записи
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
status_type_name text, -- Наименование типа статуса
CONSTRAINT pk_t_status_types_status_type_id PRIMARY KEY (status_type_id)
);
COMMENT ON TABLE t_status_types
IS 'Таблица для хранения типов статусов';
COMMENT ON COLUMN t_status_types.status_type_id IS 'ID записи';
COMMENT ON COLUMN t_status_types.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_status_types.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_status_types.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_status_types.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_status_types.status_type_name IS 'Наименование типа статуса';
CREATE TABLE t_comment_types
(
comment_type_id serial NOT NULL, -- ID записи
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
comment_type_name text, -- Наименование типа комментария
CONSTRAINT pk_t_comment_types_comment_type_id PRIMARY KEY (comment_type_id)
);
COMMENT ON TABLE t_comment_types
IS 'Таблица для хранения типа комментариев';
COMMENT ON COLUMN t_comment_types.comment_type_id IS 'ID записи';
COMMENT ON COLUMN t_comment_types.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_comment_types.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_comment_types.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_comment_types.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_comment_types.comment_type_name IS 'Наименование типа комментария';
INSERT INTO t_status_types (dttmcr, dttmup, userid, status_type_name) VALUES
(now(), now(), 1, 'Заявлено'),
(now(), now(), 1, 'В обработке'),
(now(), now(), 1, 'Ответ'),
(now(), now(), 1, 'Закрыто');
INSERT INTO t_comment_types (dttmcr, dttmup, userid, comment_type_name) VALUES
(now(), now(), 1, 'Входящее письмо'),
(now(), now(), 1, 'Исходящее письмо'),
(now(), now(), 1, 'Комментарий');
CREATE SEQUENCE t_objects_object_ref_nr_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 300001
CACHE 1;
CREATE TABLE t_objects
(
object_id serial NOT NULL, -- ID записи
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
object_ref_nr integer DEFAULT nextval('t_objects_object_ref_nr_seq'::regclass), -- Реферативный номер обращения
object_cur_status_id integer, -- ID текущего статуса - регулируется триггером при добавлении нового статуса в таблицу t_statuses.
client_id integer, -- ID клиента - FK t_clients.client_id
object_to_id integer, -- ID ответственного сотрудника - FK t_users.user_id
object_remark text, -- Примечание к обращению
CONSTRAINT pk_t_objects_object_id PRIMARY KEY (object_id)
);
COMMENT ON TABLE t_objects
IS 'Таблица для хранения обращений';
COMMENT ON COLUMN t_objects.object_id IS 'ID записи';
COMMENT ON COLUMN t_objects.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_objects.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_objects.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_objects.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_objects.object_ref_nr IS 'Реферативный номер обращения';
COMMENT ON COLUMN t_objects.object_cur_status_id IS 'ID текущего статуса - регулируется триггером при добавлении нового статуса в таблицу t_statuses.';
COMMENT ON COLUMN t_objects.client_id IS 'ID клиента - FK t_clients.client_id';
COMMENT ON COLUMN t_objects.object_to_id IS 'ID ответственного сотрудника - FK t_users.user_id';
COMMENT ON COLUMN t_objects.object_remark IS 'Примечание к обращению';
CREATE OR REPLACE VIEW vw_objects AS
SELECT o.object_id,
o.dttmcr,
o.dttmup,
o.dttmcl,
o.userid,
o.object_ref_nr,
o.object_cur_status_id,
o.object_remark,
st.status_type_name,
(COALESCE(c.client_name, ''::text) || ' '::text) || COALESCE(c.client_surname, ''::text) AS client_fullname,
(COALESCE(u.user_name, ''::text) || ' '::text) || COALESCE(u.user_surname, ''::text) AS user_fullname
FROM t_objects o
LEFT JOIN t_status_types st ON o.object_cur_status_id = st.status_type_id
LEFT JOIN t_clients c USING (client_id)
LEFT JOIN t_users u ON o.object_to_id = u.user_id;
CREATE TABLE t_statuses
(
status_id serial NOT NULL,
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
object_id integer NOT NULL, -- ID обращения - FK t_objects.object_id
status_type_id integer NOT NULL, -- ID типа статуса
CONSTRAINT pk_t_statuses_status_id PRIMARY KEY (status_id)
);
COMMENT ON TABLE t_statuses
IS 'Таблица для хранения статусов';
COMMENT ON COLUMN t_statuses.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_statuses.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_statuses.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_statuses.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_statuses.object_id IS 'ID обращения - FK t_objects.object_id';
COMMENT ON COLUMN t_statuses.status_type_id IS 'ID типа статуса';
CREATE OR REPLACE VIEW vw_statuses AS
SELECT s.status_id,
s.dttmcr,
s.dttmup,
s.dttmcl,
s.userid,
s.object_id,
st.status_type_name
FROM t_statuses s
LEFT JOIN t_status_types st USING (status_type_id);
CREATE TABLE t_comments
(
comment_id serial NOT NULL,
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
object_id integer, -- ID обращения - FK t_objects.object_id
comment_type_id integer NOT NULL, -- ID типа комментария - FK t_comment_type.comment_type_id
comment_from text, -- Отправитель
comment_to text, -- Получатель
comment_cc text, -- Копия
comment_bcc text, -- Скрытая копия
comment_subject text, -- Тема
comment_text text, -- Тело
comment_diag_mes text, -- Диагностическое сообщение, формируемое при анализе темы письма
CONSTRAINT pk_t_comments_comment_id PRIMARY KEY (comment_id)
);
COMMENT ON TABLE t_comments
IS 'Таблица для хранения комментариев';
COMMENT ON COLUMN t_comments.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_comments.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_comments.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_comments.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_comments.object_id IS 'ID обращения - FK t_objects.object_id';
COMMENT ON COLUMN t_comments.comment_type_id IS 'ID типа комментария - FK t_comment_type.comment_type_id';
COMMENT ON COLUMN t_comments.comment_from IS 'Отправитель';
COMMENT ON COLUMN t_comments.comment_to IS 'Получатель';
COMMENT ON COLUMN t_comments.comment_cc IS 'Копия';
COMMENT ON COLUMN t_comments.comment_bcc IS 'Скрытая копия';
COMMENT ON COLUMN t_comments.comment_subject IS 'Тема';
COMMENT ON COLUMN t_comments.comment_text IS 'Тело';
COMMENT ON COLUMN t_comments.comment_diag_mes IS 'Диагностическое сообщение, формируемое при анализе темы письма';
CREATE TABLE t_files
(
file_id serial NOT NULL, -- ID записи
dttmcr timestamp with time zone NOT NULL DEFAULT now(), -- Дата и время создания записи
dttmup timestamp with time zone, -- Дата и время изменения записи
dttmcl timestamp with time zone, -- Дата и время закрытия записи
userid integer, -- ID пользователя, создавшего запись
comment_id integer, -- ID комментария - FK t_comments.comment_id
comment_file bytea, -- Файл
CONSTRAINT pk_t_files_file_id PRIMARY KEY (file_id)
);
COMMENT ON TABLE t_files
IS 'Таблица для хранения файлов';
COMMENT ON COLUMN t_files.file_id IS 'ID записи';
COMMENT ON COLUMN t_files.dttmcr IS 'Дата и время создания записи';
COMMENT ON COLUMN t_files.dttmup IS 'Дата и время изменения записи';
COMMENT ON COLUMN t_files.dttmcl IS 'Дата и время закрытия записи';
COMMENT ON COLUMN t_files.userid IS 'ID пользователя, создавшего запись';
COMMENT ON COLUMN t_files.comment_id IS 'ID комментария - FK t_comments.comment_id';
COMMENT ON COLUMN t_files.comment_file IS 'Файл';
CREATE OR REPLACE VIEW vw_comments AS
SELECT c.comment_id,
c.dttmcr,
c.dttmup,
c.dttmcl,
c.userid,
c.object_id,
c.comment_type_id,
c.comment_from,
c.comment_to,
c.comment_cc,
c.comment_bcc,
c.comment_subject,
c.comment_diag_mes,
c.comment_text,
ct.comment_type_name,
CASE
WHEN (( SELECT DISTINCT t_files.comment_id
FROM t_files
WHERE t_files.comment_id = c.comment_id AND t_files.dttmcl IS NULL)) IS NULL THEN '-'::text
ELSE 'Да'::text
END AS comment_file_present
FROM t_comments c
LEFT JOIN t_comment_types ct USING (comment_type_id);
CREATE OR REPLACE FUNCTION trig_t_objects_i_new_status()
RETURNS trigger AS
$BODY$
DECLARE
var_status_id integer := 1; -- ID статуса Заявлено;
BEGIN
INSERT INTO t_statuses (userid, object_id, status_type_id)
VALUES (NEW.userid, NEW.object_id, var_status_id);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION trig_t_statuses_iu_status()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE t_objects
SET object_cur_status_id = NEW.status_type_id
WHERE t_objects.object_id = NEW.object_id;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE TRIGGER trig_t_objects_i_new_status
AFTER INSERT
ON t_objects
FOR EACH ROW
EXECUTE PROCEDURE trig_t_objects_i_new_status();
CREATE TRIGGER trig_t_statuses_iu_status
AFTER INSERT
ON t_statuses
FOR EACH ROW
EXECUTE PROCEDURE trig_t_statuses_iu_status();
CREATE OR REPLACE VIEW vw_latest_comments AS
SELECT c.comment_id,
c.dttmcr,
c.dttmup,
c.dttmcl,
c.userid,
o.object_ref_nr,
st.status_type_name,
ct.comment_type_name,
c.comment_from,
c.comment_text,
CASE
WHEN (( SELECT DISTINCT t_files.comment_id
FROM t_files
WHERE t_files.comment_id = c.comment_id AND t_files.dttmcl IS NULL)) IS NULL THEN '-'::text
ELSE 'Да'::text
END AS comment_file_present
FROM t_comments c
LEFT JOIN t_comment_types ct USING (comment_type_id)
LEFT JOIN t_objects o USING (object_id)
LEFT JOIN t_status_types st ON o.object_cur_status_id = st.status_type_id
WHERE o.object_id IS NOT NULL AND o.dttmcl IS NULL AND c.dttmcl IS NULL
ORDER BY c.dttmcr DESC;
CREATE FUNCTION f_start_processing(
pdb_userid integer,
"1002.object_id" integer,
"1002.object_cur_status_id" integer,
var_timestamp timestamp with time zone)
RETURNS integer AS
$BODY$
DECLARE
var_status_id integer;
var_status_type_id integer:= 2; -- ID статуса "В обработке" из таблицы t_status_types
BEGIN
/* Указываем ответственное лицо */
UPDATE t_objects
SET object_to_id = pdb_userid
WHERE object_id = "1002.object_id";
/* Вводим статус В обработке (2) по обращению, если текущий статус Заявлено (1) */
IF "1002.object_cur_status_id" = 1 THEN
/* Если в функцию передается время, вставить значения + время */
IF var_timestamp IS NOT NULL THEN
INSERT INTO t_statuses (dttmcr, userid, object_id, status_type_id)
VALUES (var_timestamp, pdb_userid, "1002.object_id", var_status_type_id)
RETURNING status_id INTO var_status_id;
ELSE
/* Если в функцию время не передается, вставить просто значения */
INSERT INTO t_statuses (userid, object_id, status_type_id)
VALUES (pdb_userid, "1002.object_id", var_status_type_id)
RETURNING status_id INTO var_status_id;
END IF;
END IF;
/* Возвращаем ID записи из таблицы support.objects */
RETURN var_status_id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_get_filename(_filename bytea)
RETURNS text AS
$BODY$
declare
len integer;
begin
len := "position"(_filename, E'\\000'::bytea)-1;
if len > 0 then
return convert_from("substring"(_filename, 1, len ), 'WIN1251');
end if;
return NULL::text;
end;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE VIEW vw_files AS
SELECT t_files.file_id,
t_files.dttmcr,
t_files.dttmup,
t_files.dttmcl,
t_files.userid,
t_files.comment_id,
f_get_filename(t_files.comment_file) AS filename
FROM t_files;
CREATE OR REPLACE FUNCTION f_get_file("1210.file_id" integer)
RETURNS SETOF bytea AS
$BODY$
BEGIN
RETURN QUERY
SELECT comment_file
FROM t_files
WHERE file_id = $1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_upload_file(
pdb_userid integer,
"1202.comment_id" integer,
pdb_file_data bytea)
RETURNS boolean AS
$BODY$
BEGIN
INSERT INTO t_files (userid, comment_id, comment_file)
VALUES (pdb_userid, "1202.comment_id", pdb_file_data);
RETURN true;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_close_file("1210.file_id" integer)
RETURNS boolean AS
$BODY$
BEGIN
UPDATE t_files
SET dttmcl = now() WHERE t_files.file_id = "1210.file_id";
RETURN true;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE TYPE parsed_email_subject AS
(subject_type_code integer,
object_id integer,
rest_email_subject text,
diag_mes text);
CREATE OR REPLACE FUNCTION f_parse_subject(email_subject text)
RETURNS parsed_email_subject AS
$BODY$
DECLARE
left_bracket text:= '[';
right_bracket text:= ']';
number_sign text:= '#';
subject_type_code int; -- Код типа субъекта
subject_type_for_check text; -- Код типа субъекта для проверки, является ли он числовым значением
subject_code_is_present boolean; -- Наличие кода типа субъекта в таблице subject_types;
object_id integer; -- Номер объекта
object_ref_for_check text; -- Номер объекта для проверки, является ли он числовым значением
object_ref_is_present boolean; -- Наличие номера объекта в таблице objects;
rest_email_subject text; -- Остальная часть темы письма
pos_left_bracket int; -- Позиция левой скобки
pos_right_bracket int; -- Позиция правой скобки
pos_number_sign int; -- Позиция знакая номера
email_subject_length int; -- Длина темы письма
parsed_email_subject parsed_email_subject; -- Разбитая тема письма
diag_mes text; -- Диагностическое сообщение
BEGIN
/* Определяем позиции необходимых знаков */
pos_left_bracket := position(left_bracket in email_subject); -- Определение позиции левой скобки
pos_number_sign := position(number_sign in email_subject); -- Определение позиции знака номера
pos_right_bracket := position(right_bracket in email_subject); -- Определение позиции правой скобки
email_subject_length := char_length(email_subject); -- Определение длины темы
/* Эта часть кода выполняется, если в теме присутствуют все три знака */
IF pos_left_bracket <> 0 -- Если присутствуют левая скобка
AND pos_right_bracket <> 0 -- и правая скобка
AND pos_number_sign <> 0 -- а также знак номера
AND pos_number_sign BETWEEN pos_left_bracket AND pos_right_bracket -- Последовательность: левая скобка, знак номера, правая скобка
THEN
/* Номер объекта для проверки */
object_ref_for_check:=
trim(substring(email_subject from (pos_number_sign + 1 ) for (pos_right_bracket - pos_number_sign - 1)));
/* Определяем, присутствует ли номер объекта в таблице objects */
IF f_is_integer(object_ref_for_check) THEN
object_ref_is_present:= (SELECT COUNT(*) FROM t_objects WHERE t_objects.object_ref_nr = object_ref_for_check::integer) != 0;
END IF;
/* Номер объекта является целым числовым значением и присутствует в таблице objects */
IF object_ref_for_check IS NOT NULL AND f_is_integer(object_ref_for_check) AND object_ref_is_present THEN
object_id:= (SELECT t_objects.object_id FROM t_objects WHERE t_objects.object_ref_nr = object_ref_for_check::integer);
rest_email_subject:=trim(substring(email_subject from (pos_right_bracket + 1) for (email_subject_length + 1 - pos_right_bracket)));
diag_mes:= '0 - Номер объекта определен';
/* Номер объекта не определен */
ELSE rest_email_subject:= email_subject;
diag_mes:= '1 - Номер объекта не определен';
END IF;
/* Тему письма невозможно разобрать согласно правилам */
ELSE rest_email_subject:= email_subject;
diag_mes:= '2 - Тему письма невозможно разобрать согласно правилам';
END IF;
SELECT subject_type_code, object_id, rest_email_subject, diag_mes
INTO parsed_email_subject.subject_type_code, parsed_email_subject.object_id, parsed_email_subject.rest_email_subject, parsed_email_subject.diag_mes;
RETURN parsed_email_subject;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_is_integer(text)
RETURNS boolean AS
$BODY$
SELECT $1 ~ '^[0-9]+$'
$BODY$
LANGUAGE sql VOLATILE;
CREATE OR REPLACE FUNCTION f_update_status(
pdb_userid integer,
"1001.object_id" integer,
"1001.object_cur_status_id" integer,
"1202.comment_id" integer,
comment_type_id integer)
RETURNS boolean AS
$BODY$
DECLARE
var_timestamp timestamp with time zone := (SELECT now() - interval '1 second'); -- Передается в функцию f_start_processing для создания разницы в 1 секунду между статусом В обработке и Ответ;
BEGIN
/* Если тип комментария - Исходящее письмо (2),
а также текущий статус - В обработке (2), выставить статус Ответ (3) */
IF comment_type_id IN (2) AND "1001.object_cur_status_id" IN (2) THEN
INSERT INTO t_statuses (userid, object_id, status_type_id)
VALUES (pdb_userid, "1001.object_id", 3);
/* Если тип комментария - Исходящее письмо (2), а также текущий статус - Принято (1),
выставить cначала статус В обработке (2) и указать ответственное лицо, затем выставить статус Ответ (3) */
ELSIF comment_type_id IN (2) AND "1001.object_cur_status_id" IN (1) THEN
PERFORM f_start_processing (pdb_userid, "1001.object_id", "1001.object_cur_status_id", var_timestamp);
INSERT INTO t_statuses (userid, object_id, status_type_id)
VALUES (pdb_userid, "1001.object_id", 3);
/* Если тип комментария - Входящее письмо (1) и
текущий статус - Ответ (3), выставить статус В обработке (2) */
ELSIF comment_type_id IN (1) AND "1001.object_cur_status_id" IN (3) THEN
INSERT INTO t_statuses (userid, object_id, status_type_id)
VALUES (pdb_userid, "1001.object_id", 2);
END IF;
RETURN true;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_email_in_to_comments(
pdb_userid integer,
pdb_email_uid integer,
pdb_email_date timestamp with time zone,
pdb_email_from text,
pdb_email_to text,
pdb_email_cc text,
pdb_email_subject text,
pdb_email_mime text,
pdb_email_body text)
RETURNS integer AS
$BODY$
DECLARE
entry_id integer; -- ID новой записи в таблицу comments
var_comment_type_id integer:= 1; -- Входящее письмо
var_comment_remark text; -- Примечание к комментарию
var_object_id integer; -- ID объекта
parsed_email_subject parsed_email_subject; -- Разобранная тема письма
var_comment_diag_mes text; -- Диагностическое сообщение, формируемое при анализе темы письма
var_object_cur_status_id integer; -- ID текущего статуса дела
temp_id integer;
BEGIN
/* Разбирает тему письма */
parsed_email_subject:= f_parse_subject(pdb_email_subject);
/* Формирует примечание к комментарию */
var_comment_remark:= COALESCE(pdb_email_body,'Тело письма не содержит текст.');
/* Присваевает номер объекта */
var_object_id:= parsed_email_subject.object_id;
/* Определяет диагностическое сообщение после разбора темы */
var_comment_diag_mes:= parsed_email_subject.diag_mes;
/* Номер объекта определен и объект с указанным в теме письма номером не закрыт */
IF var_object_id IS NOT NULL AND (SELECT dttmcl FROM t_objects WHERE object_id = var_object_id) IS NULL THEN
INSERT INTO t_comments(dttmcr, userid, object_id, comment_type_id, comment_text, comment_from, comment_to, comment_cc, comment_subject, comment_diag_mes)
VALUES(pdb_email_date, pdb_userid, var_object_id, var_comment_type_id, var_comment_remark, pdb_email_from, pdb_email_to, pdb_email_cc, pdb_email_subject, var_comment_diag_mes)
RETURNING comment_id INTO entry_id;
SELECT object_cur_status_id FROM t_objects WHERE object_id = var_object_id INTO var_object_cur_status_id;
PERFORM f_update_status (pdb_userid, var_object_id, var_object_cur_status_id, entry_id, var_comment_type_id);
/* Номер объекта не определен или объект с указанным в теме письма номером закрыт */
ELSE
INSERT INTO t_comments(dttmcr, userid, comment_type_id, comment_text, comment_from, comment_to, comment_cc, comment_subject, comment_diag_mes)
VALUES(pdb_email_date, pdb_userid, var_comment_type_id, var_comment_remark, pdb_email_from, pdb_email_to, pdb_email_cc, pdb_email_subject, var_comment_diag_mes)
RETURNING comment_id INTO entry_id;
END IF;
RETURN entry_id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_save_files(
pdb_userid integer,
pdb_email_file bytea,
pdb_docum_file bytea,
f_email_in_to_comments integer,
r_comment_id integer)
RETURNS boolean AS
$BODY$
DECLARE
BEGIN
IF f_email_in_to_comments IS NOT NULL THEN
INSERT INTO t_files(userid, comment_id, comment_file)
VALUES (pdb_userid, f_email_in_to_comments, pdb_email_file);
ELSE
INSERT INTO t_files(userid, comment_id, comment_file)
VALUES (pdb_userid, r_comment_id, pdb_docum_file);
END IF;
RETURN true;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_register_object(
pdb_userid integer,
"1005.comment_id" integer,
"1005.client_id" integer,
"1005.object_to_id" integer,
"1005.object_remark" text)
RETURNS SETOF integer AS
$BODY$
DECLARE
r_object_id integer; -- ID объекта после добавления;
BEGIN
/* Выполняется при регистрации обращения на основании входящего электронного письма */
IF "1005.comment_id" IS NOT NULL THEN
/* Создает обращение */
INSERT INTO t_objects (userid, client_id, object_to_id, object_remark)
VALUES (pdb_userid, "1005.client_id", "1005.object_to_id", "1005.object_remark")
RETURNING object_id INTO r_object_id;
/* Прикрепляет письмо к созданному обращению */
UPDATE t_comments
SET object_id = r_object_id
WHERE comment_id = "1005.comment_id";
END IF;
/* Возвращает ID нового обращения */
RETURN QUERY
SELECT r_object_id;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_email_out_to_comments(
IN pdb_userid integer,
IN pdb_email_uid integer,
IN pdb_email_date timestamp with time zone,
IN pdb_email_from text,
IN pdb_email_to text,
IN pdb_email_cc text,
IN pdb_email_bcc text,
IN pdb_email_subject text,
IN pdb_email_body text,
IN object_id integer,
IN f_register_object integer,
IN "1001.object_id" integer)
RETURNS TABLE(r_object_id integer, r_comment_id integer, r_comment_type_id integer) AS
$BODY$
DECLARE
var_comment_type_id integer:= 2; -- Исходящее письмо;
var_comment_remark text; -- Текст к комментарию;
var_object_id integer; -- ID обращения;
BEGIN
var_object_id := COALESCE(object_id, f_register_object, "1001.object_id");
/* Формирует текст комментария */
var_comment_remark:= COALESCE(pdb_email_body,'Тело письма не содержит текст.');
INSERT INTO t_comments(dttmcr, userid, object_id, comment_type_id, comment_text, comment_from, comment_to, comment_cc, comment_subject, comment_bcc)
VALUES(pdb_email_date, pdb_userid, var_object_id, var_comment_type_id, var_comment_remark, pdb_email_from, pdb_email_to, pdb_email_cc, pdb_email_subject, pdb_email_bcc)
RETURNING comment_id INTO r_comment_id;
/* Формирует ID типа комментария для возврата */
r_comment_type_id := var_comment_type_id;
/* Формиурет ID обращения для возврата */
r_object_id := var_object_id;
RETURN QUERY
SELECT
r_object_id,
r_comment_id,
r_comment_type_id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_increase_quote(orig_text text)
RETURNS text AS
$BODY$
DECLARE
result text;
BEGIN
SELECT '> '||replace(orig_text, chr(10), chr(10)||'> ')
INTO result;
RETURN result;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_body_forward(
var_text text,
pdb_userid integer,
var_comment_id integer)
RETURNS text AS
$BODY$
DECLARE
var_date timestamp; -- Дата оригинального сообщения
var_time time; -- Время
var_from text; -- Отправитель оригинального сообщения
var_theme text; -- Оригинальная тема сообщения
var_to text; -- Получатель сообщения
var_orig_text text; -- Текст оригинального сообщения
var_signature text; -- Подпись
var_new_text text; -- Новый текст
var_result text; -- Результат
BEGIN
/* Формирует дату оригинального сообщения */
var_date := (SELECT dttmcr FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует время оригинального сообщения */
var_time := (SELECT dttmcr::time FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует отправителя оригинального сообщения */
var_from := (SELECT comment_from FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует тему оригинального сообщения */
var_theme := (SELECT comment_subject FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует получателя оригинального сообщения */
var_to := (SELECT comment_to FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует текст оригинального сообщения */
var_orig_text := (SELECT comment_text FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует подпись */
var_signature := (SELECT user_signature FROM t_users WHERE user_id = pdb_userid);
SELECT
'Начало переадресованного сообщения:'||
chr(10)||chr(10)||
'От: '||COALESCE(var_from, 'неизвестный отправитель')||chr(10)||
'Тема: '||COALESCE(var_theme, '-')||chr(10)||
'Дата и время: '||COALESCE(var_date::text, 'неизвестная дата и время')||chr(10)||
'Кому: '||COALESCE(var_to, '-')||
chr(10)||chr(10)||
COALESCE(var_orig_text, 'Оригинальное письмо не содержит текст.')
INTO var_new_text;
SELECT
COALESCE(var_text, '')||
chr(10)||chr(10)||chr(10)||
COALESCE(var_signature, '')||
chr(10)||chr(10)||chr(10)||
f_increase_quote(var_new_text)
INTO var_result;
RETURN var_result;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION f_body_reply(
var_text text,
pdb_userid integer,
var_comment_id integer)
RETURNS text AS
$BODY$
DECLARE
var_date date; -- Дата оригинального сообщения
var_time time; -- Время
var_from text; -- Отправитель оригинального сообщения
var_orig_text text; -- Текст оригинального сообщения
var_signature text; -- Подпись
var_new_text text; -- Новый текст
var_result text; -- Результат
BEGIN
/* Формирует дату оригинального сообщения */
var_date := (SELECT dttmcr::date FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует время оригинального сообщения */
var_time := (SELECT dttmcr::time FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует отправителя оригинального сообщения */
var_from := (SELECT comment_from FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует текст оригинального сообщения */
var_orig_text := (SELECT comment_text FROM t_comments WHERE comment_id = var_comment_id);
/* Формирует подпись */
var_signature := (SELECT user_signature FROM t_users WHERE user_id = pdb_userid);
/* Формирует результат */
SELECT
COALESCE(var_date::text, 'Неизвестная дата')||', в '||COALESCE(var_time::text, 'неизвестное время')||', '||COALESCE(var_from, 'неизвестный отправитель')||' написал(а):'||
chr(10)||chr(10)||
COALESCE(var_orig_text, 'Оригинальное письмо не содержит текст.')
INTO var_new_text;
SELECT
COALESCE(var_text, '')||
chr(10)||chr(10)||chr(10)||
COALESCE(var_signature, '')||
chr(10)||chr(10)||chr(10)||
f_increase_quote(var_new_text)
INTO var_result;
RETURN var_result;
END
$BODY$
LANGUAGE plpgsql VOLATILE;