Загрузка данных
-- DROP FUNCTION mtrustgate.send_tax_refund_register(int4, int4, bool);
CREATE OR REPLACE FUNCTION mtrustgate.send_tax_refund_register(p_record_id integer, p_user_id integer, blog boolean)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
/* Функция оправляет документ в ФНС для налогового вычета:
* p_record_id (int) - идентификатор записи в таблице
* p_user_id - идентификатор пользователя, кто вызвал запрос
* blog - логирование работы {true;false}
* Результат работы = 1, обновление mtrustgate.moutlist.record_status = 1
* Запись в mtrustgate.fns_tax_refund_register ответ - requestId
* Все остальное - ошибочное
*/
moutlist_rec record;
documentType text;
result integer;
msession uuid;
basePath text;
endPath text;
body_content text;
content_text text;
authPath text;
-- responce:
respCode int4;
resp_b bytea;
resp_text text;
resp_v jsonb;
resp_message text;
upd_code int4;
-- Try catch variables:
err_code text;
msg_text text;
exc_context text;
begin
begin
msession:= null;
result:= 0;
perform mtrustgate.log_message(msession::character varying, 'Отправка документа в ФНС', 'Начало');
moutlist_rec:= null;
--report details:
select m.mtype_doc, m.filename, m.file_id, m.record_status, mftv.register_id, mftv.service_name
into moutlist_rec
from mtrustgate.moutlist m
join dev.model_file_to_verification mftv
on m.mftv_id = mftv.id
where m.id = p_record_id
and m.mtype_doc = 'ФНС-ВЧТ';
if moutlist_rec is null then
if blog then
perform mtrustgate.log_message(msession::character varying,
concat('Неподходящий тип документа или запись в moutlist с id=', p_record_id::text, ' не найдена'), 'Ошибка');
end if;
return -10;
elseif (moutlist_rec.record_status <> 0) then
if blog then
perform mtrustgate.log_message(msession::character varying,
concat('Отправка уже производилась или ошибка в moutlist с id = ', p_record_id::text), 'Ошибка');
end if;
return -10;
end if;
-- end-point:
select m.value
into endPath
from mtrustgate.misc m
where m.code = 'F00S02';
-- bath path:
select m.value
into basePath
from mtrustgate.misc m
where m.code = 'N00B01';
content_text:= encode(utils.compress_data_gzip(lo_get(moutlist_rec.file_id)), 'base64');
documentType:= '005';
body_content:= concat('{
"contentBase64":"', content_text, '",
"documentType":"', documentType, '"
}');
perform curl.curl_easy_reset();
authPath:= concat(basePath, endPath);
perform curl.curl_easy_setopt_url(authPath);
perform curl.curl_header_append('Content-Type', 'application/json; charset=utf-8');
perform curl.curl_header_append('Connection', 'close');
perform curl.curl_easy_setopt_postfields(body_content::bytea);
perform curl.curl_easy_setopt_ssl_verifypeer(0);
perform curl.curl_easy_setopt_ssl_verifyhost(0);
perform curl.curl_easy_setopt_ssl_verifystatus(0);
perform curl.curl_easy_perform();
respCode := curl.curl_easy_getinfo_response_code();
resp_b:= curl.curl_easy_getinfo_data_in();
resp_text:= convert_from(resp_b,'UTF8');
if (respCode = 200) then
-- Ok
resp_v := resp_b::jsonb;
if (resp_v->>'requestId' is not null ) then
resp_message:= concat('Ответ 200, requestId: ', (resp_v->>'requestId')::text );
--записать requestId в табличку
INSERT INTO mtrustgate.fns_tax_refund_register(
moutlist_id, register_id, requestId, userid, "version")
VALUES(p_record_id,
moutlist_rec.register_id,
cast((resp_v->>'requestId')as text),
p_user_id, now());
-- update status on mtrustgate.moutlist:
update mtrustgate.moutlist
set record_status = 1
where id = record_id;
end if;
if blog then
perform mtrustgate.log_message(msession::character varying, resp_message, 'Результат');
end if;
result:= 1;
elsif(respCode = 422) then
resp_message:= concat('Отправка документа в ФНС:', resp_text);
if blog then
perform mtrustgate.log_message(msession::character varying, resp_message, 'Ошибка');
end if;
result:= -1;
else
-- Unexpected error(s)
resp_message:= concat('Неожиданная ошибка: ', respCode, ' ', resp_text);
if blog then
perform mtrustgate.log_message(msession::character varying, resp_message, 'Ошибка');
end if;
result:= -1;
end if;
-- Final message log:
perform mtrustgate.log_message(msession::character varying, 'Отправка документа в ФНС', 'Конец');
exception when others
then
perform mtrustgate.log_message(msession::character varying, 'Отправка документа в ФНС', 'Авария');
GET STACKED DIAGNOSTICS
err_code = RETURNED_SQLSTATE,
msg_text = MESSAGE_TEXT,
exc_context = PG_CONTEXT;
RAISE NOTICE 'ERROR CODE: % MESSAGE TEXT: % CONTEXT: %',
err_code, msg_text, exc_context;
result:=-1;
end;
--
return result;
END;
$function$
;