Объемно-сортовой учет

Объемно-сортовой учет (ОСУ) является упрощением поэкземплярного учета, при котором в УПД перечисляются все коды маркировки. В ОСУ не указываются коды маркировки, а указываются только GTIN продукции и ее количество. Это позволяет оптовикам и предприятиям общественного питания работать с маркированными товарами как с немаркированными, указывая в УПД только наименование, штрихкод и количество (без сканирования и перечисления кодов маркировки).

Как работать по объемно-сортовому учету для каждой маркированной товарной группы, можно ознакомиться на сайте «Честного знака» (пример для воды).

Какие дополнительные поля в позиции требуется заполнять и для чего, можно уточнить в методических рекомендациях по заполнению тегов для разработчиков кассового ПО.

Какие версии ПО должны быть на смарт-терминале

Регистрация кассы для работы по ОСУ

Для продажи товаров по ОСУ требуется выполнить регистрацию или перерегистрацию кассы с указанием новых признаков торговли по ОСУ. Для этого на этапе выбора вида деятельности потребуется указать один из (или оба) признаков:

Проверка признаков регистрации через FsApi

Ваше приложение может проверить, выбрал ли пользователь эти признаки при регистрации, для этого потребуется вызвать метод:

FsApi.getLastFsFiscalizationDocument()

В полученном объекте FsFiscalizationDocument есть поле workModeFlags, которое можно сравнить с таблицей 103 ФФД и выяснить, какие признаки условий применения ККТ выбраны в последнем отчёте о регистрации.

Изменения в интеграционной библиотеке

Чтобы ваше приложение заполнило признаки ОСУ в позиции, нужно будет обновить версию интеграционной библиотеки до 0.6.33 или выше. Дополнительно потребуется указать в манифесте приложения новое разрешение:

<uses-permission android:name="ru.evotor.permission.receipt.volumeSortAccounting.SET " />

В объект Position добавляется новое поле volumeSortAccountingRealization. Поле заполняется новым объектом VolumeSortAccountingRealization:

data class VolumeSortAccounting(
    /**
     * Идентификатор продукта GTIN
     */
    val gtin: String,
    /**
     * Количество товара по ОСУ
     */
    val quantity: BigDecimal? = null,
    /**
     * Тип выбытия по ОСУ
     */
    val type: RealizationType = RealizationType.HORECA
) 

На данный момент существует два типа выбытия по ОСУ:

Объемно-сортовой учет поддерживается не для всех видов товара, на данный момент выбытие по ОСУ доступно для товаров:

Пример формирования позиции:

Position.Builder.newInstance(
   UUID.randomUUID().toString(),
   null,
   "Маркированная вода",
   Measure("шт", 1, 0),
   BigDecimal(1000),
   BigDecimal(5000)
).toWaterMarked(
   Mark.RawMark("04650057074361")
).setVolumeSortAccounting(
   "04650057074361",
   BigDecimal(5000),
   RealizationType.HORECA
).build()

Обязательно требуется заполнить mark в позиции, так как добавить маркированную позицию без кода маркировки нельзя, поле mark нужно заполнить значением GTIN из кода маркировки.

Возврат по чеку

В возврате «На основании чека» EvotorPOS восстанавливает из чека продажи и данные по ОСУ. При этом считывание марки для таких позиций не запрашивается. Через интерфейс есть возможность изменить только количество товара в позиции, количества товара по ОСУ (в интерфейсе EvotorPOS) изменить нельзя, поэтому приложение может подписаться на событие изменения позиции в чеках возврата и предлагать кассиру изменить количество товара по ОСУ в отредактированной позиции.

Важно

Проверьте, что код версии EvotorPOS не ниже 8210100, если код версии EvotorPOS ниже 8210100, то данные по ОСУ не применятся. Пример проверки кода версии приложения с помощью PackageManager:

val evotorPosVersionCode = packageManager.getPackageInfo("ru.atol.tabletpos", 0)
   .versionCode

Обязательно используйте deprecated поле versionCode, а не новое поле longVersionCode (которое появилось в Android API 34) для совместимости со всеми версиями ОС Эвотор.