@opengis/pay 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/config.js +7 -0
  2. package/module/pay/pt/marketplace-service-payment-client-template.html +7 -20
  3. package/package.json +15 -31
  4. package/plugin.js +14 -7
  5. package/server/plugins/crud/dataDelete.js +82 -0
  6. package/server/plugins/crud/dataInsert.js +76 -0
  7. package/server/plugins/crud/dataUpdate.js +112 -0
  8. package/server/plugins/{cron.js → hook.js} +24 -22
  9. package/server/plugins/pg/funcs/autoIndex.js +102 -0
  10. package/server/plugins/pg/funcs/getDBParams.js +15 -0
  11. package/server/plugins/pg/funcs/getMeta.js +48 -0
  12. package/server/plugins/pg/funcs/getPG.js +39 -0
  13. package/server/plugins/pg/funcs/getPGAsync.js +40 -0
  14. package/server/plugins/pg/funcs/init.js +113 -0
  15. package/server/plugins/pg/index.js +24 -0
  16. package/server/plugins/pg/pgClients.js +22 -0
  17. package/server/plugins/redis/client.js +8 -0
  18. package/server/plugins/redis/funcs/getRedis.js +24 -0
  19. package/server/plugins/redis/funcs/redisClients.js +3 -0
  20. package/server/plugins/redis/index.js +11 -0
  21. package/server/routes/liqpay/controllers/liqpay.redirect.js +7 -11
  22. package/server/routes/liqpay/controllers/liqpay.status.js +26 -15
  23. package/server/routes/liqpay/utils/check.status.js +1 -1
  24. package/server/routes/monopay/controllers/monopay.redirect.js +141 -0
  25. package/server/routes/monopay/controllers/monopay.status.js +70 -0
  26. package/server/routes/monopay/index.mjs +32 -0
  27. package/server/routes/portmone/controllers/payment.info.js +9 -9
  28. package/server/routes/portmone/controllers/portmone.redirect.js +23 -17
  29. package/server/routes/portmone/controllers/portmone.status.js +49 -38
  30. package/server/routes/portmone/utils/portmone.check.status.js +34 -33
  31. package/server/utils/cron/addCron.js +48 -0
  32. package/server/utils/cron/cronList.js +1 -0
  33. package/server/utils/cron/interval2ms.js +40 -0
  34. package/server/utils/cron/runCron.js +24 -0
  35. package/server/utils/cron/verifyUnique.js +23 -0
  36. package/server/utils/getFolder.js +11 -0
  37. package/server/utils/getInsertQuery.js +44 -0
  38. package/server/utils/migration/exec.migrations.js +38 -0
  39. package/server/utils/migration/exec.sql.js +48 -0
  40. package/server/utils/sendNotification.js +69 -0
  41. package/module/pay1/card/billing.accounts.table/general_info.hbs +0 -11
  42. package/module/pay1/card/billing.accounts.table/index.yml +0 -15
  43. package/module/pay1/card/billing.accounts.table/users.hbs +0 -12
  44. package/module/pay1/card/billing.payments.table/general_info.hbs +0 -13
  45. package/module/pay1/card/billing.payments.table/index.yml +0 -10
  46. package/module/pay1/card/billing.users.table/general_info.hbs +0 -11
  47. package/module/pay1/card/billing.users.table/index.yml +0 -10
  48. package/module/pay1/cls/billing.payment_status.json +0 -22
  49. package/module/pay1/form/billing.account_user.form.json +0 -15
  50. package/module/pay1/form/billing.accounts.form.json +0 -31
  51. package/module/pay1/form/billing.payment.form.json +0 -23
  52. package/module/pay1/form/billing.users.form.json +0 -39
  53. package/module/pay1/menu.json +0 -24
  54. package/module/pay1/pt/marketplace-service-payment-client-template.html +0 -147
  55. package/module/pay1/select/billing.account_id.sql +0 -1
  56. package/module/pay1/select/billing.service_id.sql +0 -1
  57. package/module/pay1/select/billing.subscription_id.sql +0 -1
  58. package/module/pay1/select/billing.user_id.sql +0 -1
  59. package/module/pay1/table/billing.accounts.table.json +0 -61
  60. package/module/pay1/table/billing.payments.table.json +0 -68
  61. package/module/pay1/table/billing.users.table.json +0 -71
@@ -0,0 +1,48 @@
1
+ import path from 'node:path';
2
+ import { createHash } from 'node:crypto';
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+
5
+ import config from '../../../config.js';
6
+
7
+ import pgClients from '../../plugins/pg/pgClients.js';
8
+ import getRedis from '../../plugins/redis/funcs/getRedis.js';
9
+
10
+ const rclient = getRedis();
11
+
12
+ export default async function execSql(filepath, pg = pgClients.client) {
13
+ const start = Date.now();
14
+
15
+ if (!pg || !filepath) {
16
+ console.warn('skip migration execution: pg / redis connection / filepath not provided');
17
+ return null;
18
+ }
19
+
20
+ const filename = path.basename(filepath);
21
+
22
+ if (!existsSync(filepath)) {
23
+ console.warn('migration not found', filepath, Date.now() - start);
24
+ return null;
25
+ }
26
+
27
+ const sql = readFileSync(filepath, 'utf-8');
28
+
29
+ const hash = createHash('md5').update(sql).digest('hex');
30
+ const hashes = config.redis ? await rclient.hgetall(`${pg.options?.database}:migration-hashes`).then(obj => Object.keys(obj)) : [];
31
+
32
+ if (hashes.includes(hash) && !config.disableCache) {
33
+ console.log(filename, 'skip equal hash', Date.now() - start);
34
+ return null;
35
+ }
36
+
37
+ try {
38
+ console.log(filename, 'start', Date.now() - start);
39
+ await pg.query(sql);
40
+ if (!config.disableCache && config.redis) await rclient.hset(`${pg.options?.database}:migration-hashes`, hash, 1);
41
+ console.log('migration success', filepath, Date.now() - start);
42
+ return 'ok';
43
+ }
44
+ catch (err) {
45
+ console.log('migration error', filepath, err.toString(), Date.now() - start);
46
+ return err.toString();
47
+ }
48
+ }
@@ -0,0 +1,69 @@
1
+ import nodemailer from 'nodemailer';
2
+
3
+ import config from '../../config.js';
4
+ import getRedis from '../plugins/redis/funcs/getRedis.js';
5
+
6
+ const rclient = getRedis();
7
+ const { mailSetting = {} } = config;
8
+ mailSetting.rejectUnauthorized = false;
9
+
10
+ if (mailSetting.port === 465) {
11
+ mailSetting.secure = true;
12
+ }
13
+
14
+ const transport = nodemailer.createTransport(mailSetting);
15
+
16
+ // eslint-disable-next-line max-len, no-control-regex
17
+ const emailReg = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/g;
18
+
19
+ export default async function notification({
20
+ from,
21
+ to = [],
22
+ pt,
23
+ message,
24
+ title,
25
+ nocache,
26
+ }, unittest) {
27
+ if (!mailSetting.service) {
28
+ console.warn('notification/skip', to, from, 'mail service is not defined in config');
29
+ return null;
30
+ }
31
+
32
+ if (!to?.length) {
33
+ console.warn('notification/skip', 'no recipients', to, from, pt, message, title);
34
+ return null;
35
+ }
36
+
37
+ if (!message && !pt) {
38
+ console.warn('notification/skip', 'empty message / pt', to, from, pt, message, title);
39
+ return null;
40
+ }
41
+
42
+ const keyTo = `pay:mail:email:${to || ''}${message || pt || ''}${title || ''}`;
43
+ const uniqueTo = config.redis ? await rclient.setnx(keyTo, 1) : true;
44
+
45
+ if (!uniqueTo && !nocache) {
46
+ console.warn('notification/skip', 'already sent', keyTo, uniqueTo);
47
+ return { message: `already sent: ${keyTo}`, status: 400 };
48
+ }
49
+
50
+ if (config.redis) {
51
+ await rclient.expire(keyTo, 1000 * 600);
52
+ }
53
+
54
+ const toEmail = Array.isArray(to) ? to.map((emails) => emails.match(emailReg)?.join(',')) : to;
55
+
56
+ const result = await transport.sendMail({
57
+ from,
58
+ to: unittest && config.mailSetting?.to ? config.mailSetting?.to : toEmail,
59
+ subject: title,
60
+ html: pt || message || '',
61
+ attachments: [],
62
+ });
63
+
64
+ if (config.trace) {
65
+ console.log('sendMail result', result);
66
+ }
67
+
68
+ return result;
69
+ }
@@ -1,11 +0,0 @@
1
- {{{descriptionList this columns="Назва,account_name,ЄДРПОУ,account_edrpou,Email,account_email,On/Off,enabled"}}}
2
-
3
- <style>
4
- .label {
5
- display: inline-block;
6
- padding: 4px 8px;
7
- border-radius: 5px;
8
- font-size: 12px;
9
- font-weight: bold;
10
- }
11
- </style>
@@ -1,15 +0,0 @@
1
- component: default
2
- # title: Мій підпис
3
- tokens:
4
- id: { id: "{{id}}" }
5
- panels:
6
- - type: container
7
- col: 4
8
- items:
9
- - name: general_info
10
- title: Загальна інформація
11
- - type: container
12
- col: 8
13
- items:
14
- - name: users
15
- title: Користувачі
@@ -1,12 +0,0 @@
1
-
2
- {{#contentList table="(select users.user_id, user_name || coalesce(login,'') as name, au_id, account_id from billing.users left join ( SELECT user_id, au_id, account_id FROM billing.account_user )r on users.user_id=r.user_id)q" query="account_id='{{id}}'" limit="50" sql1=1}}
3
- {{{button this token=(token table="billing.account_user" obj=(concat 'account_id=' @root.id) form="billing.account_user.form") title="Додати"}}}
4
-
5
- {{{tableList rows table='billing.account_user' id='au_id' form="billing.account_user.form" uid=../user.uid
6
- nodata='<div class="bg-gray-200 text-center p-6 rounded-xl"><h3 class="text-lg font-semibold">Інформація відсутня</h3></div>'
7
- comma=";"
8
- columns="Користувач,<a href='/card/billing.users.table/{{user_id}}'>{{name}}</a>"
9
- }}}
10
-
11
-
12
- {{/contentList}}
@@ -1,13 +0,0 @@
1
-
2
-
3
- {{{descriptionList this columns="Організація,account_id,Сума,payment_amount,Статус,payment_status,Дії,<a class=\"inline-flex items-center px-3 py-2 text-sm font-medium text-white duration-300 bg-blue-600 border border-transparent rounded-lg gap-x-2 hover:bg-blue-700 hover:text-white\" href=\"/api/portmone-redirect?id={{id}}\">Оплатити</a>"}}}
4
-
5
- <style>
6
- .label {
7
- display: inline-block;
8
- padding: 4px 8px;
9
- border-radius: 5px;
10
- font-size: 12px;
11
- font-weight: bold;
12
- }
13
- </style>
@@ -1,10 +0,0 @@
1
- component: default
2
- # title: Мій підпис
3
- tokens:
4
- id: { id: "{{id}}" }
5
- panels:
6
- - type: container
7
- col: 12
8
- items:
9
- - name: general_info
10
- title: Загальна інформація
@@ -1,11 +0,0 @@
1
- {{{descriptionList this columns="Прізвище,sur_name,Ім'я,user_name,Email,email,On/Off,enabled"}}}
2
-
3
- <style>
4
- .label {
5
- display: inline-block;
6
- padding: 4px 8px;
7
- border-radius: 5px;
8
- font-size: 12px;
9
- font-weight: bold;
10
- }
11
- </style>
@@ -1,10 +0,0 @@
1
- component: default
2
- # title: Мій підпис
3
- tokens:
4
- id: { id: "{{id}}" }
5
- panels:
6
- - type: container
7
- col: 12
8
- items:
9
- - name: general_info
10
- title: Загальна інформація
@@ -1,22 +0,0 @@
1
- [
2
- {
3
- "id": "inprogress",
4
- "text": "В процесі",
5
- "color": "blue"
6
- },
7
- {
8
- "id": "success",
9
- "text": "Оплачено",
10
- "color": "green"
11
- },
12
- {
13
- "id": "unpaid",
14
- "text": "Не оплачено",
15
- "color": "gray"
16
- },
17
- {
18
- "id": "error",
19
- "text": "Помилка оплати",
20
- "color": "red"
21
- }
22
- ]
@@ -1,15 +0,0 @@
1
- {
2
- "schema": {
3
- "user_id": {
4
- "type": "Autocomplete",
5
- "data": "billing.user_id",
6
- "ua": "Користувач",
7
- "validators": [
8
- "required"
9
- ]
10
- }
11
- },
12
- "style": {
13
- "label": "vertical"
14
- }
15
- }
@@ -1,31 +0,0 @@
1
- {
2
- "schema": {
3
- "account_name": {
4
- "type": "Text",
5
- "ua": "Назва організації",
6
- "validators": [
7
- "required"
8
- ]
9
- },
10
- "account_edrpou": {
11
- "type": "Text",
12
- "ua": "ЄДРПОУ"
13
- },
14
- "account_email": {
15
- "type": "Text",
16
- "ua": "Пошта організації",
17
- "i": "Повідомлення про статус платежів будуть надіслані на дану ел. адресу",
18
- "validators": [
19
- "required"
20
- ]
21
- },
22
- "enabled": {
23
- "type": "Switcher",
24
- "default": true,
25
- "ua": "On / Off"
26
- }
27
- },
28
- "style": {
29
- "label": "vertical"
30
- }
31
- }
@@ -1,23 +0,0 @@
1
- {
2
- "schema": {
3
- "payment_amount": {
4
- "type": "Number",
5
- "min": 0,
6
- "ua": "Сума платежу",
7
- "validators": [
8
- "required"
9
- ]
10
- },
11
- "account_id": {
12
- "type": "Autocomplete",
13
- "data": "billing.account_id",
14
- "ua": "Назва організації",
15
- "validators": [
16
- "required"
17
- ]
18
- }
19
- },
20
- "style": {
21
- "label": "vertical"
22
- }
23
- }
@@ -1,39 +0,0 @@
1
- {
2
- "schema": {
3
- "sur_name": {
4
- "type": "Text",
5
- "ua": "Прізвище",
6
- "validators": [
7
- "required"
8
- ]
9
- },
10
- "user_name": {
11
- "type": "Text",
12
- "ua": "Ім'я",
13
- "validators": [
14
- "required"
15
- ]
16
- },
17
- "father_name": {
18
- "type": "Text",
19
- "ua": "По-батькові"
20
- },
21
- "email": {
22
- "type": "Text",
23
- "ua": "Email"
24
- },
25
- "phone": {
26
- "type": "MarkedText",
27
- "mask": "+389999999999",
28
- "ua": "Номер телефону"
29
- },
30
- "enabled": {
31
- "type": "Switcher",
32
- "default": true,
33
- "ua": "On / Off"
34
- }
35
- },
36
- "style": {
37
- "label": "vertical"
38
- }
39
- }
@@ -1,24 +0,0 @@
1
- [
2
- {
3
- "ua": "Платежі / Payments",
4
- "menu": [
5
- {
6
- "ua": "Реєстр платежів",
7
- "table": "billing.payments.table",
8
- "path": "billing.payments"
9
- },
10
- {
11
- "ua": "Реєстр організацій",
12
- "table": "billing.accounts.table",
13
- "path": "billing.accounts"
14
- },
15
- {
16
- "ua": "Реєстр користувачів",
17
- "table": "billing.users.table",
18
- "path": "billing.users"
19
- }
20
- ]
21
- }
22
- ]
23
-
24
-
@@ -1,147 +0,0 @@
1
- <div>
2
- <br>
3
- </div>
4
- <div>
5
- <table style="width:100%;">
6
- <tbody>
7
- <tr>
8
- <td style="width:20px;">&nbsp;</td>
9
- <td align="center">
10
- <table style="width:100%" bgcolor="#ffffff">
11
- <tbody>
12
- <tr>
13
- <td align="center"><a href="//{{domain}}" class="logo"><img src="https://softpro.ua/tpl/img/logo.svg"/></a>
14
- </td>
15
- </tr>
16
-
17
- <tr>
18
- <td style="padding:7px 0" align="center"><span style="color:#555454;font-family:'Open-sans',sans-serif;font-size:small">
19
- <span style="font-weight:500;font-size:16px;text-transform:uppercase;line-height:25px">{{select account_id data="billing.account_id"}}, дякуємо за здійснення замовлення на порталі <a href="//{{domain}}">{{domain}}</a></span> </span>
20
- </td>
21
- </tr>
22
- <tr>
23
- <td style="padding:0">&nbsp;</td>
24
- </tr>
25
- <tr>
26
- <td style="box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);padding:7px 0;border-radius:30px">
27
- <table style="width:100%">
28
- <tbody>
29
- <tr >
30
- <td style="padding:7px 0" width="10">&nbsp;</td>
31
- <td style="padding:7px 0">
32
- <span style="color:#555454;font-family:'Open-sans',sans-serif;font-size:small"> </span>
33
- {{#if service_id}}
34
- <p style="color:#61677b;border-bottom:1px solid #61677b;margin:3px 0 7px;text-transform:uppercase;font-weight:500;font-size:18px;padding-bottom:10px">Послуга: {{service_id_text}}</p>
35
- {{/if}}
36
- <br>
37
- <span style="color:#61677b"><strong>Дата замовлення:</strong> {{formatDate cdate format='dd.mm.yy hh:mi'}}</span>
38
- <br>
39
- <span style="color:#61677b"><strong>Статус замовлення:</strong> {{select payment_status data="billing.payment_status"}}</span>
40
- {{#if withdrawal_sum}}
41
- <br>
42
- <span style="color:#61677b"><strong>Вартість послуги:</strong> {{num_format withdrawal_sum dec="2"}}</span>
43
- {{/if}}
44
- {{#if payment_amount}}
45
- <br>
46
- <span style="color:#61677b"><strong>Поповнення рахунку:</strong> {{num_format payment_amount dec="2"}}</span>
47
- {{/if}}
48
- {{#if total_balance}}
49
- <br>
50
- <span style="color:#61677b"><strong>Поточний баланс:</strong> {{num_format total_balance dec="2"}}</span>
51
- {{/if}}
52
- </td>
53
- <td style="padding:7px 0" width="10">&nbsp;</td>
54
- </tr>
55
- </tbody>
56
- </table>
57
- </td>
58
- </tr>
59
-
60
- <tr>
61
- <td style="padding:7px 0">
62
- <span style="color:#555454;font-family:'Open-sans',sans-serif;font-size:small"> </span>
63
- <table style="width:100%;border-collapse:collapse" bgcolor="#ffffff">
64
- <tbody>
65
- <tr>
66
- <th style="border:1px solid #d6d4d4;background-color:#fbfbfb;color:#61677b;font-family:Arial;font-size:13px;padding:10px" bgcolor="#f8f8f8">Назва послуги</th>
67
- <th style="border:1px solid #d6d4d4;background-color:#fbfbfb;color:#61677b;font-family:Arial;font-size:13px;padding:10px" bgcolor="#f8f8f8" width="17%">Ціна послуги</th>
68
- </tr>
69
- <tr>
70
- <td style="border:1px solid #d6d4d4">
71
- <table>
72
- <tbody>
73
- <tr>
74
- <td style="padding: 0 10px">
75
- <font size="2" face="Open-sans, sans-serif" color="#555454">
76
- <strong>
77
- {{#if service_id}}
78
- {{service_id_text}}
79
- {{^}}
80
- Поповнення рахунку
81
- {{/if}}
82
- </strong>
83
- </font>
84
- </td>
85
- </tr>
86
- </tbody>
87
- </table>
88
- </td>
89
- <td style="border:1px solid #d6d4d4">
90
- <table>
91
- <tbody>
92
- <tr>
93
- <td width="10">&nbsp;</td>
94
- <td align="right">
95
- <font size="2" face="Open-sans, sans-serif" color="#555454"> {{num_format (coalesce withdrawal_sum payment_amount)}} грн.</font>
96
- </td>
97
- <td width="10">&nbsp;</td>
98
- </tr>
99
- </tbody>
100
- </table>
101
- </td>
102
- </tr>
103
-
104
- <tr>
105
- <td colspan="2" style="border:1px solid #d6d4d4;text-align:center;color:#777;padding:7px 0">&nbsp;&nbsp;</td>
106
- </tr>
107
-
108
- <tr>
109
- <td colspan="1" style="border:1px solid #d6d4d4;color:#61677b;padding:7px 0" bgcolor="#f8f8f8">
110
- <table style="width:100%;border-collapse:collapse">
111
- <tbody>
112
- <tr>
113
- <td style="color:#61677b;padding:0" width="10">&nbsp;</td>
114
- <td style="color:#61677b;padding:0" align="right"><span style="color:#555454;font-family:'Open-sans',sans-serif;font-size:small"> <strong>Поточний баланс</strong> </span></td>
115
- <td style="color:#61677b;padding:0" width="10">&nbsp;</td>
116
- </tr>
117
- </tbody>
118
- </table>
119
- </td>
120
- <td colspan="1" style="border:1px solid #d6d4d4;color:#61677b;padding:7px 0" bgcolor="#f8f8f8">
121
- <table style="width:100%;border-collapse:collapse">
122
- <tbody>
123
- <tr>
124
- <td style="color:#61677b;padding:0" width="10">&nbsp;</td>
125
- <td style="color:#61677b;padding:0" align="right"><span style="color:#555454;font-family:'Open-sans',sans-serif;font-size:large">{{total_balance}} грн. </span></td>
126
- <td style="color:#61677b;padding:0" width="10">&nbsp;</td>
127
- </tr>
128
- </tbody>
129
- </table>
130
- </td>
131
- </tr>
132
- </tbody>
133
- </table>
134
- </td>
135
- </tr>
136
-
137
- <tr>
138
- <td style="border-top:4px solid #61677b;padding:7px 0"><span><a href="//{{domain}}"><img src="https://softpro.ua/tpl/img/logo.svg"/></a></span></td>
139
- </tr>
140
- </tbody>
141
- </table>
142
- </td>
143
- <td style="width:20px;">&nbsp;</td>
144
- </tr>
145
- </tbody>
146
- </table>
147
- </div>
@@ -1 +0,0 @@
1
- select account_id, account_name from billing.accounts order by account_name
@@ -1 +0,0 @@
1
- select service_id, service_name from billing.service order by service_name
@@ -1 +0,0 @@
1
- select subscription_id,coalesce((select name from billing.products where product_id=a.product_id),'')||' '||coalesce(product_plan_type,'') from billing.subscriptions a
@@ -1 +0,0 @@
1
- select user_id, user_name || coalesce(login,'') as name from billing.users order by user_name
@@ -1,61 +0,0 @@
1
- {
2
- "key": "account_id",
3
- "table": "billing.accounts",
4
- "order": "cdate desc",
5
- "form": "billing.accounts.form",
6
- "title_column": "account_name",
7
- "title_full": {
8
- "ua": "Реєстр організацій"
9
- },
10
- "actions": [
11
- "add",
12
- "edit",
13
- "del"
14
- ],
15
- "columns": [
16
- {
17
- "name": "account_name",
18
- "format": "text",
19
- "title": "Назва організації"
20
- },
21
- {
22
- "name": "account_edrpou",
23
- "format": "text",
24
- "title": "ЄДРПОУ"
25
- },
26
- {
27
- "name": "account_email",
28
- "format": "text",
29
- "title": "Email"
30
- },
31
- {
32
- "name": "enabled",
33
- "hidden": true,
34
- "format": "yes/no",
35
- "title": "On / off"
36
- }
37
- ],
38
- "filter_list": [
39
- {
40
- "name": "account_name",
41
- "type": "Text",
42
- "ua": "Назва організації"
43
- },
44
- {
45
- "name": "account_edrpou",
46
- "type": "Text",
47
- "ua": "ЄДРПОУ"
48
- },
49
- {
50
- "name": "account_email",
51
- "type": "Text",
52
- "ua": "Email"
53
- },
54
- {
55
- "name": "enabled",
56
- "type": "Check",
57
- "data": "yes_no",
58
- "ua": "On / off"
59
- }
60
- ]
61
- }