Платежи из файла: відмінності між версіями
Sv (обговорення | внесок) Немає опису редагування |
Sv (обговорення | внесок) м (→Пример 1) |
||
(Не показано 20 проміжних версій цього користувача) | |||
Рядок 1: | Рядок 1: | ||
Модуль позволяет загрузить в NoDeny платежи из файла, распределив их по абонентам по определенному признаку: | ==Описание== | ||
Модуль позволяет загрузить в NoDeny платежи из файла, распределив их по абонентам по определенному признаку:<br> | |||
[[Файл:Pays from file 1.png|800px]] | [[Файл:Pays from file 1.png|800px]] | ||
<br><br> | |||
При повторной загрузке файла, дубликаты не будут созданы: | При повторной загрузке файла, дубликаты не будут созданы: | ||
<br> | |||
[[Файл:Pays from file 2.png|800px]] | [[Файл:Pays from file 2.png|800px]] | ||
<br><br> | |||
В разделе «Документы» создайте папку с именем, например, «Импорт платежей». В этой папке создайте документ с любым именем, например, по имени банка, чью выписку вы хотите регулярно импортировать. В данном | ==Настройка== | ||
В разделе «Документы» создайте папку с именем, например, «Импорт платежей». В этой папке создайте документ с любым именем, например, по имени банка, чью выписку вы хотите регулярно импортировать. В данном документе необходимо в каждой строке указать имя параметра = значение. Пример: | |||
<pre> | <pre> | ||
Рядок 30: | Рядок 34: | ||
* user_column_number: номер колонки, в которой содержится идентификатор абонента | * user_column_number: номер колонки, в которой содержится идентификатор абонента | ||
* user_field_in_db: имя поля в базе данных, в котором хранится идентификатор абонента | * user_field_in_db: имя поля в базе данных, в котором хранится идентификатор абонента | ||
* user_db: имя таблицы, в | * user_db: имя таблицы, в которой хранится идентификатор абонента (по умолчанию data0) | ||
* user_id_in_db: имя поля в базе данных, в котором хранится номер абонента (по умолчанию uid) | * user_id_in_db: имя поля в базе данных, в котором хранится номер абонента (по умолчанию uid) | ||
* amount_column_number: номер колонки, в которой содержится сумма пополнения | * amount_column_number: номер колонки, в которой содержится сумма пополнения | ||
* only_positive_amount: 1 - разрешается только положительная сумма, 0 - любая | * only_positive_amount: 1 - разрешается только положительная сумма, 0 - любая | ||
* div100_amount: 1 - необходимо разделить сумму на 100 (в csv хранится в копейках) | * div100_amount: 1 - необходимо разделить сумму на 100 (когда в csv хранится в копейках) | ||
* comment_column_number: номер колонки, в которой содержится комментарий к платежу | * comment_column_number: номер колонки, в которой содержится комментарий к платежу | ||
* date_column_number: номер колонки, в которой содержится дата платежа | * date_column_number: номер колонки, в которой содержится дата платежа | ||
Рядок 42: | Рядок 46: | ||
Все колонки нумеруются с единицы. | Все колонки нумеруются с единицы. | ||
==Установка модуля== | |||
<pre> | |||
cd /usr/ports/textproc/p5-Text-CSV && make install clean | |||
</pre> | |||
или на Linux: | |||
<pre> | |||
apt-get install libtext-csv-perl | |||
</pre> | |||
==Импорт платежей== | ==Импорт платежей== | ||
В разделе «Платежи» нажмите на кнопку «Загрузить из файла». В появившемся окне выберите документ с настройками, по которым | В разделе «Платежи» нажмите на кнопку «Загрузить из файла». В появившемся окне выберите документ с настройками, по которым вы хотите распарсить файл с платежами. Затем выберите сам файл. | ||
== | ==Ошибки в данных== | ||
Вполне вероятно, что в данных могут быть ошибки в идентификаторах, например, лишние пробелы или иные символы, либо же вместо определенного разделителя использован пробел, точка, тире и т.д. В таком случае можно попытаться подогнать идентификатор под нужный формат. К примеру, в качестве идентификатора выступает договор такого формата: | |||
<pre> | |||
Xчисло-число-число | |||
</pre> | |||
===Пример 1=== | |||
Допустим в файле у нас указано X.10.12.14, а в биллинге содержится значение X10-12-14. Видно, что нужно сделать некоторые преобразования. Кое-что удалить, кое-что заменить. Это делается двумя переменными: | |||
<pre> | |||
user_regexp_in = ^X?[ \-]?(\d+)[ \-]*(\d+)[ \-]*(\d+)$ | |||
user_regexp_out = X$1-$2-$3 | |||
</pre> | |||
Это регулярные выражение - довольно стандартный способ преобразования информации. В интернете громадное количество [https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F информации по ним]. | |||
<pre> | |||
user_regexp_in - что меняем | |||
user_regexp_out - на что меняем | |||
</pre> | |||
То, что в регулярных выражениях внутри скобок, преобразуется в переменную "$ и дальше номер по порядку". В квадратных скобках варианты символа в данной позиции. | |||
Рассмотрим несколько примеров: | |||
<pre> | |||
1-2 3 | |||
</pre> | |||
Преобразуется в | |||
<pre> | |||
X1-2-3 | |||
</pre> | |||
по таким правилам: | |||
* X? - в исходном идентификаторе вначале может стоять буква X, а может нет. На это указывает знак вопроса | |||
* [ \-]? - далее может идти или пробел или тире (минус). А может не идти (на это указывает знак вопроса). Минус экранируется обратным слешем. | |||
* (\d+) - далее обязательно идет какое-то число (\d в регулярных выражениях означает "любая цифра", а плюс - одна или больше цифр подряд). Это число запишется в переменную $1 | |||
в консоли вы можете легко проверить преобразования: | |||
<pre> | |||
perl -e'$a = "некорректные_данные"; $a =~ s/как_преобразовуем/во_что_преобразовуем/; print $a'; | |||
</pre> | |||
Например: | |||
<pre> | <pre> | ||
perl -e'$a = "11 - 22 - 33"; $a =~ s/^X?[ \-]?(\d+)[ \-]*(\d+)[ \-]*(\d+)$/X$1-$2-$3/; print $a'; | |||
</pre> | </pre> | ||
===Пример 2=== | |||
<pre> | <pre> | ||
user_regexp_in = .*?(\d{3,10}).* | |||
user_regexp_out = $1 | |||
</pre> | </pre> | ||
этот шаблон выудит первое число длинной от 3 до 10 цифр |
Поточна версія на 07:53, 6 вересня 2021
Описание
Модуль позволяет загрузить в 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 цифр