Платежи из файла
Описание
Модуль позволяет загрузить в NoDeny платежи из файла, распределив их по абонентам по определенному признаку:
При повторной загрузке файла, дубликаты не будут созданы:
Настройка
В разделе «Документы» создайте папку с именем, например, «Импорт платежей». В этой папке создайте документ с любым именем, например, по имени банка, чью выписку вы хотите регулярно импортировать. В данном документе необходимо в каждой строке указать имя параметра = значение. Пример:
file_format = csv file_encoding = cp1251 csv_delimiter = ; skip_first_line = 1 user_column_number = 10 user_field_in_db = _erdpo action_when_many_users = ignore amount_column_number = 15 only_positive_amount = 1 div100_amount = 0 comment_column_number = 16 date_column_number = 5 date_column_format = %d.%m.%Y %H:%M unique_columns = 5,12
- file_format: формат файла
- file_encoding: кодировка файла (cp1251/utf8)
- csv_delimiter: разделитель столбцов в csv-файле
- skip_first_line: 1 - не обрабатывать первую строку (обычно она содержит заголовок), 0 - обрабатывать
- user_column_number: номер колонки, в которой содержится идентификатор абонента
- user_field_in_db: имя поля в базе данных, в котором хранится идентификатор абонента
- user_db: имя таблицы, в которой хранится идентификатор абонента (по умолчанию data0)
- user_id_in_db: имя поля в базе данных, в котором хранится номер абонента (по умолчанию uid)
- amount_column_number: номер колонки, в которой содержится сумма пополнения
- only_positive_amount: 1 - разрешается только положительная сумма, 0 - любая
- div100_amount: 1 - необходимо разделить сумму на 100 (когда в csv хранится в копейках)
- comment_column_number: номер колонки, в которой содержится комментарий к платежу
- date_column_number: номер колонки, в которой содержится дата платежа
- date_column_format: формат даты (https://www.unix.com/man-page/FreeBSD/3/strftime/)
- unique_columns: какие колонки определяют уникальность платежа - защита от дубликатов. Колонки "время" и "клиент" можно не указывать - проверяются автоматически
- pay_category: категория платежа, по умолчанию 4 (банк)
Все колонки нумеруются с единицы.
Установка модуля
cd /usr/ports/textproc/p5-Text-CSV && make install clean
или на Linux:
apt-get install libtext-csv-perl
Импорт платежей
В разделе «Платежи» нажмите на кнопку «Загрузить из файла». В появившемся окне выберите документ с настройками, по которым вы хотите распарсить файл с платежами. Затем выберите сам файл.
Ошибки в данных
Вполне вероятно, что в данных могут быть ошибки в идентификаторах, например, лишние пробелы или иные символы, либо же вместо определенного разделителя использован пробел, точка, тире и т.д. В таком случае можно попытаться подогнать идентификатор под нужный формат. К примеру, в качестве идентификатора выступает договор такого формата:
Xчисло-число-число
Пример 1
Допустим в файле у нас указано X.10.12.14, а в биллинге содержится значение X10-12-14. Видно, что нужно сделать некоторые преобразования. Кое-что удалить, кое-что заменить. Это делается двумя переменными:
user_regexp_in = ^X?[ \-]?(\d+)[ \-]*(\d+)[ \-]*(\d+)$ user_regexp_out = X$1-$2-$3
Это регулярные выражение - довольно стандартный способ преобразования информации. В интернете громадное количество информации по ним. user_regexp_in - что меняем. user_regexp_out - на что меняем. То, что в регулярных выражениях внутри скобок, преобразуется в переменную "$ и дальше номер по порядку". В квадратных скобках варианты символа в данной позиции.
Рассмотрим несколько примеров:
1-2 3
Преобразуется в
X1-2-3
по таким правилам:
- X? - в исходном идентификаторе вначале может стоять буква X, а может нет. На это указывает знак вопроса
- [ \-]? - далее может идти или пробел или тире (минус). А может не идти (на это указывает знак вопроса). Минус экранируется обратным слешем.
- (\d+) - далее обязательно идет какое-то число (\d в регулярных выражениях означает "любая цифра", а плюс - одна или больше цифр подряд). Это число запишется в переменную $1
в консоли вы можете легко проверить преобразования:
perl -e'$a = "некоррекные_данные"; $a =~ s/как_преобразуем/во_что_преобразуем/; print $a';
Например:
perl -e'$a = "11 - 22 - 33"; $a =~ s/^X?[ \-]?(\d+)[ \-]*(\d+)[ \-]*(\d+)$/X$1-$2-$3/; print $a';
Пример 2
user_regexp_in = .*?(\d{3,10}).* user_regexp_out = $1
этот шаблон выудит первое число длинной от 3 до 10 цифр