Skip to content

Commit

Permalink
Assembly v 5.6.2 (26.05.24)
Browse files Browse the repository at this point in the history
  • Loading branch information
adslbarxatov committed May 26, 2024
1 parent dfbe908 commit 3b2fbb2
Show file tree
Hide file tree
Showing 14 changed files with 321 additions and 104 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/Release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
# Константы, используемые далее по тексту
env:
PROJ: ${{ github.event.repository.name }}
TAG: '5.6'
TAG: '5.6.2'

steps:
# Проверка состава репозитория (без анализа, как может показаться)
Expand Down
Binary file modified .release/KassArray.apk
Binary file not shown.
Binary file added .release/KassArray.exe
Binary file not shown.
Binary file added .release/KassArrayDB.dll
Binary file not shown.
Binary file added .release/KassArrayFN.exe
Binary file not shown.
Binary file added .release/KassArrayLL.dll
Binary file not shown.
43 changes: 43 additions & 0 deletions .release/KassArray_ru_ru.dph
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
KassArray – инструмент сервис-инженера контрольно-кассовой техники.

Основное приложение позволяет:
- просматривать и сохранять / отправлять на печать инструкции по работе с ККТ;
- просматривать расшифровки кодов ошибок ККТ;
- определять срок жизни ФН в соответствии параметрами пользователя, от которых он зависит;
- определять корректность регистрационного номера ККТ и генерировать его при необходимости;
- определять соответствие моделей ККТ версиям ФФД;
- получать настройки операторов фискальных данных (ОФД) по их ИНН или названиям;
- получать описания и признаки обязательности TLV-тегов для различных ФФД;
- получать описания команд нижнего уровня;
- вручную (без использования внешней клавиатуры) программировать текстовые данные в ККТ, имеющих только цифровую клавиатуру;
- автоматически определять модели ККТ и фискальных накопителей (ФН) по их заводским номерам, а также регионы РФ по кодам ИНН;
- просматривать распиновки кабелей ККТ – ПК, ККТ – ДЯ и ККТ – Принтер;
- определять типы штрих-кодов и разбирать их содержимое (включая DataMatrix маркируемых товаров);
- дополнительно: получать разложения и представления чисел в системах счисления с основаниями 2, 10 и 16;
- дополнительно: преобразовывать коды Unicode в символам и наоборот;
- дополнительно: преобразовывать двоичные данные в текст и обратно.

Модуль чтения и обработки данных ФН для KassArray предназначен для чтения и обработки фискальных данных (ФД) из фискального накопителя (ФН).

Доступные функции:
1. Чтение данных из ФН с помощью физического или виртуального COM-порта и аппаратного адаптера.
2. Формирование выгрузок архивов ФН в формате .fnc в соответствии с Приложением №2 к приказу ФНС России «Форматы фискальных документов, обязательные к использованию» для версий ФФД 1.05 и 1.2.
3. Обработка фискальных данных:
- Получение полного состояния и всех регистрационных данных ФН;
- Получение отдельного документа ФН;
- Получение контрольной ленты за отдельную смену;
- Получение полного фискального (посменного) отчёта;
- Получение посменного отчёта по диапазону дат;
- Прямой запрос счётчиков ФН (для ФФД 1.1 и выше);
- Расчёт гросс-итогов по данным фискальных документов (для файлов и ФФД 1.05);
- Прямое чтение документов за определённую дату и расчёт сменных итогов.
4. Сохранение архива ФН в файл.
5. Выполнение обмена с ОФД с параметрами подключения, получаемыми автоматически по данным последней регистрации / перерегистрации, или с параметрами, соответствующими выбранному ОФД.
6. Выполнение операций записи в ФН:
- Открытие смены;
- Закрытие смены;
- Закрытие архива ФН;
- Сброс МГМ (для технических целей).
7. Чтение и статистическая обработка выгрузок архивов ФН в форматах .fnc и .fsd.
8. Формирование выгрузки уведомлений о реализации маркированного товара (при работе в автономном режиме) в формате .fnm.
9. Кэширование имеющихся файлов .fnc и быстрый доступ к любому из них с помощью поиска по ИНН, заводским номерам, РНМ или наименованиям пользователей.
11 changes: 5 additions & 6 deletions .release/Release.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
_Изменения для v 5.6_:
_Изменения для v 5.6.2_:
- Обновлён интерфейс отображения поддержки ФФД, добавлена статистика по реестру ККТ;
- Добавлены серии ЗН ККТ для `Атол 55 v2 Ф` и `Атол СТБ 6Ф`;
- Обновлены настройки ОФД `Тензор`;
- Упразднена опция отключения хранения настроек приложения;
- `Windows`: приложение перенацелено на `.NET Framework 4.8.1`;
- `Android`: переработан код фоновой службы, исправлен ряд проблем в совместимости с `Android 13`;
- Добавлена серия ЗН для ККТ `Меркурий 105Ф`, `Эвотор СТ52Ф (Эвотор 6)`;
- Добавлено примечание о неточности определения некоторых моделей ККТ;
- Скорректированы некоторые руководства пользователя;
- Добавлена серия ЗН ФН `72814407` для модели `Ин15-3`;
- `ФН`: исправлена проблема, возникавшая при чтении и отправке ОФД документов длиной от 50 позиций или с необычно длинными наименованиями
- Добавлена серия ЗН для ККТ `Меркурий 105Ф`, `Эвотор СТ52Ф (Эвотор 6)`
6 changes: 4 additions & 2 deletions Changes.log
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
KassArray: лог изменений

ToDo:
- У Контур НТТ параметры связи с ОФД и ОИСМ совпадают
Версия 5.6.2:
• Обновлён интерфейс отображения поддержки ФФД, добавлена статистика по реестру ККТ;
• Добавлены серии ЗН ККТ для Атол 55 v2 Ф и Атол СТБ 6Ф;
• Обновлены настройки ОФД Тензор

Версия 5.6:
• Упразднена опция отключения хранения настроек приложения;
Expand Down
174 changes: 142 additions & 32 deletions src/KKTSerial.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,18 @@ public class KKTSerial
private List<uint> serialLengths = new List<uint> ();
private List<string> serialSamples = new List<string> ();
private List<uint> serialOffsets = new List<uint> ();
private List<List<FFDSupportStatuses>> ffdSupport = new List<List<FFDSupportStatuses>> ();
private List<FFDSupportStates> ffdSupport = new List<FFDSupportStates> ();
private List<bool> serialConfirmed = new List<bool> ();

private List<string> regions = new List<string> ();

private uint[] registryStats = new uint[] {
0, // Всего
0, 0, 0, // Поддержка ФФД
0, // Точно известные сигнатуры
3, // Модели с одинаковыми названиями и разными реализациями (в файле помечены буквой Р)
};

/// <summary>
/// Конструктор. Инициализирует таблицу
/// </summary>
Expand All @@ -43,33 +50,55 @@ public KKTSerial ()
{
string[] values = str.Split (splitters, StringSplitOptions.RemoveEmptyEntries);

// Имя протокола
if (values.Length != 6)
// Защита
if (values.Length < 2)
continue;
registryStats[0]++;

FFDSupportStates state = FFDSupportStates.None;
for (int i = 0; i < ffdNames.Length; i++)
{
switch (values[1][i])
{
case '1':
state |= (FFDSupportStates)(1 << i);
registryStats[1 + i]++;
break;

case '0':
state |= (FFDSupportStates)((1 << i) << 4);
break;

case '+':
state |= (FFDSupportStates)((1 << i) << 8);
break;
}
}

// Протокол
if (values.Length < 6)
continue;

// Список команд
names.Add (values[0]);
serialLengths.Add (uint.Parse (values[1]));
serialLengths.Add (uint.Parse (values[3]));
if (maxSNLength < serialLengths[serialLengths.Count - 1])
maxSNLength = serialLengths[serialLengths.Count - 1];

serialSamples.Add (values[2]);
serialOffsets.Add (uint.Parse (values[3]));
ffdSupport.Add (new List<FFDSupportStatuses> ());
serialSamples.Add (values[4]);
serialOffsets.Add (uint.Parse (values[5]));
/*ffdSupport.Add (new List<FFDSupportStatuses> ());*/
ffdSupport.Add (state);

for (int i = 0; i < 3; i++)
if (values[2] == "1")
{
if (values[4][i] == '1')
ffdSupport[ffdSupport.Count - 1].Add (FFDSupportStatuses.Supported);
else if (values[4][i] == '0')
ffdSupport[ffdSupport.Count - 1].Add (FFDSupportStatuses.Unsupported);
else if (values[4][i] == '+')
ffdSupport[ffdSupport.Count - 1].Add (FFDSupportStatuses.Planned);
else
ffdSupport[ffdSupport.Count - 1].Add (FFDSupportStatuses.Unknown);
serialConfirmed.Add (true);
registryStats[1 + ffdNames.Length]++;
}
else
{
serialConfirmed.Add (false);
}

serialConfirmed.Add (values[5] == "1");
}
}
catch
Expand Down Expand Up @@ -161,48 +190,99 @@ private int FindKKT (string KKTSerialNumber)
/// <summary>
/// Доступные статусы поддержки ФФД
/// </summary>
public enum FFDSupportStatuses
public enum FFDSupportStates
{
/// <summary>
/// Поддерживается
/// Статус не задан
/// </summary>
None = 0x0000,

/// <summary>
/// ФФД 1.05 поддерживается
/// </summary>
Supported105 = 0x0001,

/// <summary>
/// ФФД 1.1 поддерживается
/// </summary>
Supported11 = 0x0002,

/// <summary>
/// ФФД 1.2 поддерживается
/// </summary>
Supported12 = 0x0004,

/// <summary>
/// ФФД 1.05 не поддерживается
/// </summary>
Unsupported105 = 0x0010,

/// <summary>
/// ФФД 1.1 не поддерживается
/// </summary>
Supported,
Unsupported11 = 0x0020,

/// <summary>
/// Не поддерживается
/// ФФД 1.2 не поддерживается
/// </summary>
Unsupported,
Unsupported12 = 0x0040,

/// <summary>
/// На данный момент не определён
/// ФФД 1.05 планируется
/// </summary>
Unknown,
Planned105 = 0x0100,

/// <summary>
/// Запланирован
/// ФФД 1.1 планируется
/// </summary>
Planned
Planned11 = 0x0200,

/// <summary>
/// ФФД 1.2 планируется
/// </summary>
Planned12 = 0x0400,
}
private FFDSupportStatuses[] emptyStatus = new FFDSupportStatuses[]
/*private FFDSupportStatuses[] emptyStatus = new FFDSupportStatuses[]
{
FFDSupportStatuses.Unknown, // 1.05
FFDSupportStatuses.Unknown, // 1.1
FFDSupportStatuses.Unknown // 1.2
};
};*/

/// <summary>
/// Метод возвращает статус поддержки ФФД для ККТ по её заводскому номеру
/// </summary>
/// <param name="KKTSerialNumber">Заводской номер ККТ</param>
/// <returns>Возвращает вектор из трёх состояний для ФФД 1.05, 1.1 и 1.2</returns>
public FFDSupportStatuses[] GetFFDSupportStatus (string KKTSerialNumber)
public string GetFFDSupportStatus (string KKTSerialNumber)
{
int i = FindKKT (KKTSerialNumber);
if (i < 0)
return emptyStatus;
return "";

string s = "";
string us = "";
FFDSupportStates state = ffdSupport[i];

return ffdSupport[i].ToArray ();
for (int j = 0; j < ffdNames.Length; j++)
{
if (state.HasFlag ((FFDSupportStates)(1 << j)))
s += (ffdNames[j] + " ");
else if (state.HasFlag ((FFDSupportStates)((1 << j) << 4)))
us += (ffdNames[j] + " ");
else if (state.HasFlag ((FFDSupportStates)((1 << j) << 8)))
s += (ffdNames[j] + "&(план) ");
}

if (string.IsNullOrEmpty (s))
s = "только&1.0";
if (string.IsNullOrEmpty (us))
us = "нет";

return "Подд. ФФД: " + s.Trim ().Replace (" ", ", ").Replace ("&", " ") + RDLocale.RN +
"Неподд. ФФД: " + us.Trim ().Replace (" ", ", ");
}
private static string[] ffdNames = new string[] { "1.05", "1.1", "1.2" };

/// <summary>
/// Метод выполняет поиск по известным моделям ККТ и возвращает сигнатуру ЗН в случае успеха
Expand Down Expand Up @@ -248,5 +328,35 @@ public uint MaxSerialNumberLength
}
}
private uint maxSNLength = 0;

/// <summary>
/// Возвращает статистику по базе ЗН ККТ
/// </summary>
public string RegistryStats
{
get
{
#if ANDROID
string t = "";
#else
string t = RDLocale.T;
#endif

string res = t + "Моделей ККТ в реестре" + RDLocale.RN + t +
"(на " + ProgramDescription.AssemblyLastUpdate + "):" + RDLocale.T +
(registryStats[0] - registryStats[ffdNames.Length + 2]).ToString () + RDLocale.RNRN;
res += t + "Из них поддерживают:" + RDLocale.RN;

for (int i = 0; i < ffdNames.Length; i++)
res += t + " ФФД " + ffdNames[i] + ": " + RDLocale.TT +
registryStats[1 + i].ToString () + RDLocale.RN;

res += RDLocale.RN + t + "Известно сигнатур ЗН:" + RDLocale.T +
names.Count.ToString () + RDLocale.RN;
res += t + " из них – точно:" + RDLocale.TT + registryStats[ffdNames.Length + 1];

return res;
}
}
}
}
Loading

0 comments on commit 3b2fbb2

Please sign in to comment.