Загрузка данных


-- 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$
;