Заявки на процессинг по дополнительной карте
Описание
Система предоставляет возможность двойного начисления по одному фискальному чеку: один раз по карте участника программы лояльности и один раз по карте менеджера (дополнительной карте). Данная функциональность называется MultipleProcessing. Это позволяет партнёрам внедрить прозрачную, привязанную к выручке систему мотивации сотрудников без ручного учёта продаж.
Принцип работы
- В мобильном приложении программы лояльности участник сканирует QR-код с кассового чека.
- Приложение передаёт в систему ML посредством запроса OData POST Receipt/BindContact реквизиты отсканированного чека (сумма, дата, ФН, ФД, ФПД) и, при наличии, номер дополнительной карты в параметре AdditionalCardNumber.
- Если у партнёра включена настройка Loyalty.Processing.MultipleProcessing.TurnOn и у контакта определена карта с типом менеджера (согласно настройке Loyalty.Processing.MultipleProcessing.ManagerCardType), система определяет порядок сканирования и действует по одному из двух путей:
- Путь А — менеджер сканировал первым: создаётся запись ожидания в очереди (state=0). Когда позднее поступает чек участника с совпадающими реквизитами (T/S/Fn/Fp/Fd), система обрабатывает его по карте менеджера напрямую через Receipt_UpdateStatus. Запись в очереди переводится в технический статус -1.
- Путь Б — участник сканировал первым: система обрабатывает чек участника стандартным образом. Когда позднее поступает скан менеджера с совпадающими реквизитами, система находит чек участника в loyalty.fns_cheque, добавляет событие в loyalty.reprocessing_events и создаёт запись в очереди со статусом «Успешно» (1). Задание SQL Agent «MultipleProcessing» обрабатывает событие и выполняет начисление по карте менеджера.
- Если в течение установленного периода ожидания (настройка Loyalty.Processing.MultipleProcessing.ManagerCheque.WaitingDay) чек участника так и не поступил, задание SQL Agent «Finish Multiprocessing Queue» переводит запись в статус «Просрочено».
Записи очереди мультипроцессинга доступны в интерфейсе MLO в разделе «Заявки на загрузку чеков» → представление «Заявки на процессинг по дополнительной карте». Представление доступно только для чтения: создание и редактирование записей вручную не предусмотрено.

- Поля представления
| Поле | Описание | Обязательное | Редактирование |
| Идентификатор записи | Уникальный идентификатор записи очереди (автоинкремент) | Да | Недоступно |
| Системное наименование | Системное поле наименования записи (значение совпадает с идентификатором) | Нет | Недоступно |
| Номер дополнительной карты | Номер карты менеджера (дополнительной карты), по которой выполняется начисление | Да | Недоступно |
| Дата создания | Дата и время поступления запроса в очередь мультипроцессинга | Нет | Недоступно |
| Номер фискального накопителя | Номер фискального накопителя из реквизитов чека (ФН) | Нет | Недоступно |
| Номер фискального документа | Номер фискального документа из реквизитов чека (ФД) | Нет | Недоступно |
| Фискальный признак документа | Фискальный признак документа из реквизитов чека (ФПД) | Нет | Недоступно |
| Дата и время чека | Дата и время совершения покупки по данным чека | Нет | Недоступно |
| Сумма чека | Итоговая сумма чека | Нет | Недоступно |
| Дата и время обработки | Дата и время обработки записи очереди | Нет | Недоступно |
| Статус | Текущий статус обработки записи (OptionSet: 1 — Успешно, 2 — Уже привязан, 3 — Просрочено, 4 — Ошибка) | Нет | Недоступно |
| Описание | Вычисляемое поле: T = <дата> S = <сумма> Fn = <ФН> Fp = <ФПД> Fd = <ФД> | Нет | Недоступно |
| Сообщение | Текстовое сообщение о результате обработки или причине ошибки. Максимальная длина — 300 символов | Нет | Недоступно |
| Ссылка на чек ФНС | Ссылка на связанный чек в таблице loyalty.fns_cheque | Нет | Недоступно |
| Ссылка на чек лояльности | Ссылка на связанный чек в таблице loyalty.cheque | Нет | Недоступно |
| Партнёр | Организация (партнёр), к которой относится запись | Да | Недоступно |
- Статусы обработки
Поле «Статус» отражает текущее состояние записи в очереди мультипроцессинга:
| Значение | Наименование | Описание |
| 0 | — | Запись создана, ожидается поступление чека от участника программы лояльности. Значение state=0 существует в базе данных, однако не входит в состав OptionSet C#-метаданных (OptionSet начинается с 1). В MLO поле «Статус» у таких записей отображается как пустое. |
| 1 | Успешно | Карта менеджера зарегистрирована для повторного процессинга. Устанавливается при Пути Б: когда менеджер сканирует чек позднее участника, а чек участника уже есть в системе. Начисление будет выполнено заданием «MultipleProcessing». |
| 2 | Уже привязан | Чек с данными реквизитами уже был ранее обработан по данной карте менеджера. |
| 3 | Просрочено | Чек участника не поступил в течение установленного периода ожидания. Запись помечается заданием «Finish Multiprocessing Queue». |
| 4 | Ошибка | Зарезервированный статус. В текущей реализации не устанавливается ни одной хранимой процедурой. |
| -1 | — | Технический статус. Устанавливается при Пути А (менеджер первым): означает, что запись уже обработана напрямую через Receipt_UpdateStatus. В MLO не отображается (OptionSet начинается с 1). |
- Сценарии обработки
- Сценарий 1. Карта менеджера загружает чек первой
- Контакт с картой менеджера сканирует чек в мобильном приложении.
- Система определяет, что контакт является менеджером, и создаёт запись в очереди со state=0 (в MLO поле «Статус» отображается пустым).
- Участник ПЛ сканирует тот же чек позднее.
- Система находит совпадающую запись в очереди по реквизитам (T/S/Fn/Fp/Fd) со state=0 и переводит её в технический статус -1. Номер карты менеджера из этой записи передаётся в Receipt_UpdateStatus.
- Receipt_UpdateStatus выполняет обработку чека напрямую по карте менеджера. Запись в очереди остаётся со статусом -1 — в MLO это значение не отображается (OptionSet начинается с 1).
- Сценарий 2. Карта участника загружает чек первой
- Участник ПЛ сканирует чек в мобильном приложении. Чек обрабатывается стандартным образом и привязывается к карте участника.
- Контакт с картой менеджера сканирует тот же чек позднее.
- Система находит уже привязанный чек с совпадающими реквизитами, добавляет событие в loyalty.reprocessing_events и создаёт запись в очереди со статусом «Успешно» (1).
- Задание «MultipleProcessing» обрабатывает событие из reprocessing_events и выполняет начисление по карте менеджера.
- Сценарий 3. Только карта менеджера (без карты участника)
- Контакт с картой менеджера сканирует чек. Система создаёт запись в очереди со state=0 (в MLO поле «Статус» отображается пустым).
- Чек от участника ПЛ не поступает в течение периода, заданного настройкой Loyalty.Processing.MultipleProcessing.ManagerCheque.WaitingDay.
- Задание «Finish Multiprocessing Queue» переводит запись в статус «Просрочено» (3) с сообщением «Не загружен. Превышено время ожидания чека участника ПЛ».
- Системные настройки
Для работы функциональности мультипроцессинга необходимо настроить следующие параметры:
| Настройка | Уровень | Описание | Значение по умолчанию |
| Loyalty.Processing.MultipleProcessing.TurnOn | Партнёрская / Системная | Включение функциональности мультипроцессинга. Возможные значения: 1 / y / Y (включено). При отсутствии настройки или значении NULL функциональность отключена. | NULL |
| Loyalty.Processing.MultipleProcessing.ManagerCheque.WaitingDay | Партнёрская / Системная | Количество дней ожидания чека от участника ПЛ до перевода записи в статус «Просрочено». | 3 |
| Loyalty.Processing.MultipleProcessing.ManagerCardType | Партнёрская / Системная | Тип карты, идентифицирующий карту менеджера. Используется для определения, является ли контакт менеджером. Настройка обязательна — без неё функциональность не работает. | — |
| Loyalty.Processing.MultipleProcessing.AdditionalCardNumber.EAKey | Партнёрская / Системная | Ключ расширенного атрибута для хранения номера дополнительной (менеджерской) карты в чеке. | Additional_Card_Number |
| Loyalty.Processing.MultipleProcessing.FilteringParameter.EAKey | Партнёрская / Системная | Ключ расширенного атрибута для хранения параметра фильтрации чека. | MultipleProcessing_FilteringParameter |
- Задания SQL Agent
Обработка очереди мультипроцессинга выполняется двумя заданиями SQL Agent:
| Задание | Хранимая процедура | Расписание | Описание |
| MultipleProcessing | loyalty.p_multipleprocessing | Ежедневно в 23:05:00 | Обрабатывает события из loyalty.reprocessing_events, выполняя начисление по карте менеджера. |
| Finish Multiprocessing Queue | loyalty.p_finish_multiprocessing_queue | Ежедневно в 00:40:00 | Переводит в статус «Просрочено» записи, для которых превышен период ожидания. |
- Коды системных сообщений
| Код | Описание |
| 105018 | Чек уже привязан к карте менеджера. |
| 105019 | Покупатель не отсканировал чек. Операция внесена в лист ожидания. |
| 105020 | Карта успешно привязана к чеку. |
| 105021 | Настройка Loyalty.Processing.MultipleProcessing.ManagerCardType отсутствует. |
- Связанные объекты
| Объект | Путь |
| Таблица очереди | loyalty.fns_cheque_multiprocessing_queue |
| Представление UI | uiro.fns_cheque_multiprocessing_queue |
| Хранимая процедура (основная) | out.p_multipleprocessing_fns |
| Хранимая процедура (повторная обработка) | loyalty.p_multipleprocessing |
| Хранимая процедура (просрочка) | loyalty.p_finish_multiprocessing_queue |
| Регистрация сущности | UIBackend/DAL.Repositories.Mock/MetadataRepositoryMockEntities.cs |
| Атрибуты сущности | UIBackend/DAL.Repositories.Mock/MetadataRepositoryMockAttributes.cs |
| Параметры API | PrivateOfficeNG/API.Contracts/Parameters/BindReceiptContactInputParameter.cs |