unit UtilUnit;

interface

uses
  Variants, SysUtils;

function IntToStrWithZeros(Value: Int64; W: Byte): string;

function BinToInt(Value: string): Int64;

function IntToBin(Value: Int64; Digits: integer): string;

function Base64Decode(Value: WideString): WideString;

function Base64Encode(Value: AnsiString): WideString;

function Rounding(Value: Currency): Currency;

function TruncRounding(Value: Currency): Currency;

function GetStatusTextById(id: byte): string;

function GetInvoiceTypeById(id: byte): string;

function GetDocumentTypeByCode(code: SmallInt): string;

implementation

function Rounding(Value: Currency): Currency;
begin
  if Value < 0 then
    Result := Trunc(Value * 100 - 0.5) / 100
  else
    Result := Trunc(Value * 100 + 0.5) / 100;
end;

function TruncRounding(Value: Currency): Currency;
begin
  Result := Trunc(Value * 100) / 100
end;

function IntToStrWithZeros(Value: Int64; W: Byte): string;
var
  i, c: Smallint;
begin
  Result := IntToStr(Value);
  c := W - (Length(Result));
  for i := 1 to c do
  begin
    Result := '0' + Result;
  end;
end;

function BinToInt(Value: string): Int64;
var
  i: Integer;
begin
  Result := 0;

 // Удаляем ведущие нули
  while Copy(Value, 1, 1) = '0' do
    Value := Copy(Value, 2, Length(Value) - 1);
 // преобразовываем
  for i := Length(Value) downto 1 do
    if Copy(Value, i, 1) = '1' then
      Result := Result + (1 shl (Length(Value) - i));
end;

function IntToBin(Value: Int64; Digits: integer): string;
begin
  result := StringOfChar('0', Digits);
  while Value > 0 do
  begin
    if (Value and 1) = 1 then
      result[Digits] := '1';
    dec(Digits);
    Value := Value shr 1;
  end;
end;

function Base64Encode(Value: AnsiString): WideString;
var
  binStr: WideString;
  char: AnsiChar;
  i: Integer;
  base: string;
begin
  base := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  binStr := NullAsStringValue;
  for i := 1 to Length(Value) do
  begin
    char := Value[i];
    binStr := binStr + IntToBin(Ord(char), 8);
  end;

  Result := NullAsStringValue;
  i := 1;
  while i <= Length(binStr) do
  begin
    Result := Result + base[BinToInt(Copy(binStr, i, 6)) + 1];
    i := i + 6;
  end;
end;

function Base64Decode(Value: WideString): WideString;
var
  i: Integer;
  base: string;
  binStr: WideString;
begin
  base := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  binStr := NullAsStringValue;

  for i := 1 to Length(Value) do
  begin
    binStr := binStr + IntToBin(ANSIPos(Value[i], base) - 1, 6);
  end;

  Result := NullAsStringValue;
  i := 1;
  while i <= Length(binStr) do
  begin
    Result := Result + chr(BinToInt(Copy(binStr, i, 8)));
    i := i + 8;
  end;
end;

function GetStatusTextById(id: byte): string;
begin
  case id of
    0:
      Result := 'Нет данных';
    1:
      Result := 'В разработке';
    2:
      Result := 'В разработке.Ошибка';
    3:
      Result := 'Выставлен';
    4:
      Result := 'На согласовании';
    5:
      Result := 'Выставлен.Подписан';
    6:
      Result := 'Аннулирован';
    7:
      Result := 'Выставлен.Аннулирован';
    8:
      Result := 'Не найдено';
    9:
      Result := 'Ошибка';
  else
    Result := 'Неизвестный статус';
  end;
end;

function GetInvoiceTypeById(id: byte): string;
begin
  case id of
    1:
      Result := 'Исходный';
    2:
      Result := 'Дополнительный';
    3:
      Result := 'Исправленный';
    4:
      Result := 'Доп. без ссылки';
  else
    Result := 'Неизвестный тип ЭСЧФ';
  end;
end;

function GetDocumentTypeByCode(code: SmallInt): string;
begin
  case code of
    600:
      Result := 'Без документа';
    601:
      Result := 'Другое';
    602:
      Result := 'ТН-2';
    603:
      Result := 'ТТН-1';
    604:
      Result := 'Договор';
    605:
      Result := 'Контракт';
    606:
      Result := 'Акт';
    607:
      Result := 'CMR-накладная';
    608:
      Result := 'Счет-фактура';
    609:
      Result := 'Invoice (счет)';
    610:
      Result := 'Авизо';
    611:
      Result := 'Бухгалтерская справка';
    612:
      Result := 'Акт выполненных работ';
    613:
      Result := 'Коносамент';
    614:
      Result := 'Электронная ТТН-1';
    615:
      Result := 'Электронная ТН-2';
  else
    Result := 'Неизвестный тип документа';
  end;
end;

end.

