Получение статуса ГТД
Версия от 16:49, 21 января 2013; Admin (обсуждение | вклад)
Для получения статуса необходимо получить для данной ГТД из базы 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.