Алгоритм разноски

Разноска платежей работает по такому алгоритму.

Процедура import_payments.process_file перебирает все строки (из таблицы payment_file_lines) по file_id указанного файла. Для каждой строки вызывается import_payments.process_file_line.

Процедуры import_payments.process_file и import_payments.process_file_line могут быть вызваны из приложения plPos (там это называется "принудительная обработка").

Т.е. на самом верхнем уровне логики разноски платежей над каждой строкой из payment_file_lines работает процедура import_payments.process_file_line.

Эта процедура работает следующим образом.

Смотрится payment_files.payment_code, по этому коду определяется какой процедурой разносить платежи.

payment_code - это код из справочника "Коды платёжных систем" (из таблицы payment_codes).

Важно, чтобы поле payment_codes.p_method содержало либо DEFAULT, либо имя другой процедуры, если дефолтовая не подходит.

 

Дефолтовая работает так.

а). Из payment_file_lines берутся поля: payment_file_lines.INN и payment_file_lines.RS. По ним определяется клиент (client_id).

б). По клиенту смотрится его тип (физическое/юридическое лицо)

г). для юридических лиц:

 - определяется балансовый счёт документа (далее - БСД) - account_id. Если у клиента БСД ещё нет, то БСД будет создан. Если у клиента несколько БСД, то на этом разноска строки файла прекращается, у файла прописывается соответствующий флаг, дальнейшая разноска этой строки предлагается пользователю.

 - ищется подходящий счёт (по клиенту, БСД, дате и сумме). Если счетов несколько, или подходящих нет - то разноска для данной строки прекращается.

 - происходит оплата на счёт вызовом процедуры reg_payment (при этом будет создан платёж и сразу связан со счётом)

 - reg_payment сохраняет payment_doc_id (здесь: plx_params.l_last_payment_doc_id), этот payment_doc_id прописывается в payment_file_lines для текущей строки и строка считается успешно разнесённой.

д). для физических лиц:

 - разноска прекращается и предлагатся всё сделать пользователю.

 

Если дефолтовая не подходит, можно написать свою на PL/SQL, у неё должен быть такой формат:

procedure XXXXX(
            rowid_ in varchar,
            payment_code_ in varchar2,
            client_id_ in out integer,
            account_id_ in out integer,
            payment_doc_id_ in out integer,
            process_type_ in out varchar2,
            err_msg_ in out varchar2)

где:

XXXXX - название процедуры, именно это название указывается в поле payment_codes.p_method.
  rowid_ - входной параметр, указатель на строку из таблицы payment_file_lines.
  payment_code_ - код платёжной системы, его нужно указывать при регистрации платежа в биллинговой системе.

следующие поля могут быть уже определены (это если процедура для данной строки payment_file_lines запускается повторно), однако если они не определены, то их необходимо определить (для ручного управления в будущем):

  client_id_ - ссылка на клиента (clients.client_id)
  account_id_ - ссылка на балансовы счёт (accounts.account_id)
  payment_doc_id_ - ссылка на зарегестрированный платёж
  process_type_ - результат выполнения процедуры (см. ниже)
  err_msg_ - текстовое описание результата выполнения (для пользователя)

Зачтёнными или обработанными считаются те записи, у которых поле payment_doc_id is not null. Если запись зачтена, то import_payments.process_file_line пропускает строку.

  Описание поля process_type:
     ' ' - начальное состояние
     'U' - Процедура разноски платежа не определена
     'C' - Клиент не найден
     'A' - Необходимо выбрать БСД для Юр. лица
     'a' - Необходимо выбрать БС для Физ. лица
     'B' - Платежный документ клиента не найден
     'E' - ошибка при регистрации платежа
     'x' - обработано автоматически (payment_doc_id определён)
     'X' - обработано вручную (payment_doc_id определён)
     '.' - помечене как не относящийся к разноске (пропускаем такие)

 

=====================================================================================================

В приложении plPos  доступен справочник:

Главное меню:

Справочники \ Справочники -> Платежи \ Коды платёжных систем.

В этом справочнике можете заводить любые платёжные системы.

Поля для платёжной системы:

 

*Код - задаётся один раз, потом менять нельзя.

   Рекомендация: в качестве когда используйте маельнкую латинскую букву.

*Название - то, что будет видеть пользователь в интерфейсах приложения.

+Примечание - доп. текстовое поле для Вас. Не обязательное.

+Процедура разноски платежей - ЭТО САМОЕ ВАЖНОЕ поле, чтобы разноска работала.

Можно ввести DEFAULT - это обыная процедура разноски.

Так же можно в БД на PL/SQL написать любую другую процедуру, которая будет заниматься разноской, тогда в этом поле надо указать именно имя этой процедуры.

+Скрывать из списка при импорте - если флаг установлен, то эта платёжная система не будет "маячить" перед глазами (пока работет только в форме "Импорт платежей")

+Проверять уникальность (два флага) - отслеживать ли дублирование платежей. Замедляет разноску, поэтому лучше их (пока) не выставлять, механизм проверки будем дорабатывать.