Получение статуса ГТД

Материал из Alta-Soft Wikipedia
Перейти к навигации Перейти к поиску

Для получения статуса необходимо получить для данной ГТД из базы SQL значение поля [EDSTAT], которое содержится в таблице [Docs]. Для конвертации полученного кода в текстовое сообщение можно использовать нижеприведенный код программы на паскале (функция EDDocStatusStr). Данный код можно портировать на любую другую платформу, но надо учитывать, что данный код (как и коды статусов) постоянно меняются, что требует их пополнения и обновления.

unit EdConsts;

interface
Uses Windows, Graphics, DB;

const
  //Статусы ГТД при ЭД
  esReqProcess   = 1; //Поставили в очередь и ждем ProcessId
  esRegistered   = 2; //Присвоен номер
  esChecking     = 3; //Идет проверка (основное состояние)
  esInspecting   = 4; //Идет досмотр
  esCheckDone    = 5; //Проверка закончена
  esDone         = 7; //Выпуск разрешен
  esArrived      = 11; //Груз прибыл (ПРД)

  esPiSend       = 8; //ПИ отослано
  esPiRegistered = 9; //ПИ зарегистрированно
  esConditionalPayment = 12; // Выпуск при условии обеспечения уплаты таможенных платежей
  esDiffResultOnGoods  = 17; // Решение различно по товарам

  //Архивные док-ты
  esArchWaiting  = $20; //Отправлена в архив, ждем
  esArchSent     = $21; //Лежит в архиве

  //"Плохие" варианты
  esError        = $1000; //Системная Ашипка
  esDecline      = $2000; //Декларация не принята
  esToPaper      = $4000; //Переход на обычный порядок оформления
  esRecalled     = $8000; //Декларация отозвана декларантом

  EDDocStArch:array[$20..$21] of string = ( 'Отправлен в архив...',
                                            'В архиве');
  EDDocStExt:array[1..16] of string = ( 'Запрошены док-ты!',
                                        'Уведомление о досмотре!',
                                         'Получен протокол ошибок!',
                                         '?',
                                         'Системная ошибка!',
                                         'Отказано в приеме ГТД',
                                         'Переход на "бумагу"',
                                         'Декларация отозвана',
                                         'ГТД отправлена',
                                         'ГТД получена',
                                         'Требуется КТС',
                                         'Проверка стоимости',
                                         'Проверка ТНВЭД',
                                         'Проверка страны',
                                         'Приостановка проверки',
                                         'Отмена приостановки');

  EDDocStStr:array[1..17] of String = ( 'Открытие процедуры',
                                        'ГТД присвоен номер',
                                        'Идет проверка',
                                        'Идет досмотр',
                                        'Проверка закончена',
                                        'Условно выпущена',
                                        'Выпуск разрешен',
                                        'ПИ отослана',
                                        'ПИ зарегистрирована',
                                        'ГТД не подана',
                                        'Товар прибыл (ПРД)',
                                        'Выпуск с обеспечением уплаты',
                                        'ГТД отозвана',
                                        'Считается не поданной',
                                        'Выпуск приостановлен',
                                        'Неизвестное решение?',
                                        'Частично выпущена');

function  EDDocStatusStr(N:integer):string;
function  EDDocColor(K:integer):integer;
function  EDMsgColor(DataSet:TDataSet):integer;

const CMNMsgs='''CMN.00001'',''CMN.00002'',''CMN.00003'',''CMN.00004'''; //Не отвечаем
      //Статусы сообщений при обмене по ЭД
      emsOutNew         = 0;
      emsOutSent        = 1;
      emsOutDelivered   = 2;
      emsOutComplete    = 3;
      emsOutDelayed     = 9;
      emsOutBuffered    = $10;
      emsOutBad         = $FF;
      emsOutTest        = $200;
      emsOutDeclined    = $1000;
      //
      emsInNew          = $100;
      emsInProcessed    = $101;
      emsInRequest      = $109;
      emsInUnknown      = $1FE;
      emsInBad          = $1FF;
      emsInErrMsg       = $300;


implementation

function  EDDocColor(K:integer):integer;
begin
  Result := clWhite;
  if K and (esDecline+esToPaper+esRecalled)>0 then
    Result := $EEEEEE 
  else if K and esError>0 then
    Result := $00FFFF 
  else if K and $F700>0 then
    Result := $88DDFF 
  else if K and $F0=$20 then Case K of
    esArchWaiting: Result := $FFFFDD;
    esArchSent   : Result := $DDFFFF;
  end else Case K and $FF of
    esReqProcess,esPISend:  Result := $FFFFDD;
    esRegistered,esPiRegistered:  Result := $DDFFFF;
    esChecking:    Result := $FFDDFF;
    esInspecting:  Result := $FFCCDD;
    esCheckDone:   Result := $DDFFEE;
    esArrived:     Result := $FFDDCC;
    esDone:        ;//Result := clWhite;
    esConditionalPayment: ;
    esDiffResultOnGoods: Result := $DDCCFF;
    else           Result := $EEEEEE;
  end;

end;

function EDDocSt(N:integer; Ext:boolean):string;
begin
  if Ext then
    if N=0 then Result:='' else
    if (N<1) or (N>High(EDDocStExt)) then Result:='???'
    else Result:=EDDocStExt[N]
  else
    if (N<1) or (N>High(EDDocStStr)) then Result:='???'
    else Result:=EDDocStStr[N];
end;

function  EDDocStatusStr(N:integer):string;
var k:integer;
begin
  try
    if N and $F0=$20 then begin
      if (N>=$20) and (N<=$21) then Result:=EDDocStArch[N]
      else Result:='???';
      Exit;
    end else
      Result:=EDDocSt(N and $1F,false);
    if N>$FF then begin
      k:=1; N:=N shr 8;
      If N>=$400 then begin
        N := N shr 4;
        K := 11+N-$40;
        N := 1;
      end;
      while N>0 do begin
        if (N and 1>0) then Case k of
          4:; //не показываем
          6,7,8: Result:=EDDocSt(k,true);
          else Result:=Result+'; '+ EDDocSt(k,true);
        end;
        N:=N shr 1; inc(k);
      end;
    end;
  except
    Result:='!!!'
  end
end;

function EDMsgColor(DataSet:TDataSet):integer;
begin
  with DataSet do begin
    Result:=0;
    case FieldByName('Status').AsInteger of
      emsOutNew         : Result:=$DDFFDD;
      emsOutSent        : Result:=$FFFFDD;
      emsOutDelivered   : Result:=$DDFFFF;
      emsOutComplete    : If FieldByName('Incoming').AsBoolean then Result := $88ddFF;
      emsOutDelayed     : Result:=$DDDDDD;
      emsOutBad         : Result:=$88FFFF;
      emsOutBuffered    : Result:=$FFCCDD;
      emsInNew          : Result:=$DDDDFF;
      emsInProcessed    : If not FieldByName('Incoming').AsBoolean and (FieldByName('MessageType').AsString<>'ED.11001') then Result := $88ddFF;
      emsInRequest      : Result:=$8888FF;
      emsInUnknown      : Result:=$88FFFF;
      emsInBad          : Result:=$88FFFF;
    else                Result:=$88FFFF;
    end;
    if Result=0 then
      if Pos(''''+FieldByName('MessageType').AsString+'''',CMNMsgs)>0 then
        Result:=$EEEEEE
      else
        Result:=clWindow
  end
end;


end.