From ddf36f8470c54930da8d64e99258f81d391bf95a Mon Sep 17 00:00:00 2001 From: Mahdi Date: Thu, 23 Jul 2026 19:41:21 +0330 Subject: [PATCH] Creating a control panel infrastructure --- .env.example | 17 +- package-lock.json | 104 + package.json | 4 +- prisma/data/users.json | 2162 +++++++++++++++++ prisma/import-users.ts | 325 +++ .../migration.sql | 3 + .../migration.sql | 49 + prisma/schema.prisma | 62 + prisma/seed.ts | 72 +- src/app.module.ts | 2 + src/get-user/get-user.service.ts | 48 +- src/sms/dto/sms-account.dto.ts | 63 + src/sms/sms-keys.ts | 142 ++ src/sms/sms.controller.ts | 54 + src/sms/sms.module.ts | 10 + src/sms/sms.service.ts | 284 +++ src/tenants/tenants.service.ts | 10 +- tsconfig.json | 1 - 18 files changed, 3377 insertions(+), 35 deletions(-) create mode 100644 prisma/data/users.json create mode 100644 prisma/import-users.ts create mode 100644 prisma/migrations/20260723073638_sms_settings_cache/migration.sql create mode 100644 prisma/migrations/20260723143623_sms_accounts_owned/migration.sql create mode 100644 src/sms/dto/sms-account.dto.ts create mode 100644 src/sms/sms-keys.ts create mode 100644 src/sms/sms.controller.ts create mode 100644 src/sms/sms.module.ts create mode 100644 src/sms/sms.service.ts diff --git a/.env.example b/.env.example index 31ccfb1..649f11c 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,22 @@ PORT=3001 -# Local (SQLite): DATABASE_URL="file:./dev.db" -# MySQL example (after creating DB): -# DATABASE_URL="mysql://superadmin:superadmin@127.0.0.1:3306/superadmin" JWT_SECRET="change-me-in-production-use-long-random-string" JWT_EXPIRES_IN="7d" CORS_ORIGIN="http://localhost:5173" SEED_ADMIN_EMAIL="admin@abshode.local" SEED_ADMIN_PASSWORD="Admin@12345" SEED_ADMIN_NAME="Super Admin" + +HAMKAR_DB_HOST=127.0.0.1 +HAMKAR_DB_PORT=3306 +HAMKAR_DB_USER=root +HAMKAR_DB_PASSWORD= +HAMKAR_DB_DATABASE=laravel +HAMKAR_DB_NODE_SERVER=http://127.0.0.1:8000 + +# KHANEGI_DB_HOST=127.0.0.1 +# KHANEGI_DB_PORT=3306 +# KHANEGI_DB_USER=root +# KHANEGI_DB_PASSWORD= +# KHANEGI_DB_DATABASE=khanegi +# KHANEGI_DB_NODE_SERVER=http://127.0.0.1:8001 diff --git a/package-lock.json b/package-lock.json index 8559545..5bdbf49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "bcrypt": "5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.2", + "mysql2": "^3.23.1", "passport": "^0.7.0", "passport-jwt": "^4.0.1", "reflect-metadata": "^0.2.2", @@ -4250,6 +4251,15 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/axios": { "version": "1.18.1", "resolved": "https://registry.npmmirror.com/axios/-/axios-1.18.1.tgz", @@ -5265,6 +5275,15 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "license": "MIT" }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", @@ -6356,6 +6375,15 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6884,6 +6912,12 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", @@ -8090,6 +8124,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8100,6 +8140,21 @@ "yallist": "^3.0.2" } }, + "node_modules/lru.min": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", @@ -8579,6 +8634,40 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/mysql2": { + "version": "3.23.1", + "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-3.23.1.tgz", + "integrity": "sha512-tTuRnC7qCet2IOfSNMYZ5SwXuBnfvBPAcIA28P0gtruXyZlU1LMxA6uha32kYypoFgyYklMqhLWwt4laYwXR/Q==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.2", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.5.1" + }, + "engines": { + "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/napi-postinstall": { "version": "0.3.4", "resolved": "https://registry.npmmirror.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz", @@ -9864,6 +9953,21 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/sql-escaper": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/sql-escaper/-/sql-escaper-1.5.1.tgz", + "integrity": "sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz", diff --git a/package.json b/package.json index 4454d8d..f56a6ff 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "prisma:generate": "prisma generate", "prisma:migrate": "prisma migrate dev", "prisma:deploy": "prisma migrate deploy", - "prisma:seed": "ts-node --transpile-only prisma/seed.ts" + "prisma:seed": "ts-node --transpile-only prisma/seed.ts", + "prisma:import-users": "ts-node --transpile-only prisma/import-users.ts" }, "prisma": { "seed": "ts-node --transpile-only prisma/seed.ts" @@ -39,6 +40,7 @@ "bcrypt": "5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.2", + "mysql2": "^3.23.1", "passport": "^0.7.0", "passport-jwt": "^4.0.1", "reflect-metadata": "^0.2.2", diff --git a/prisma/data/users.json b/prisma/data/users.json new file mode 100644 index 0000000..7634004 --- /dev/null +++ b/prisma/data/users.json @@ -0,0 +1,2162 @@ +[ + { + "id": 6, + "name": "sepide", + "name_fa": "سجاد سپیده خو", + "number": "09121579825", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$10YCeF0uDhFTungOLdGJbOfVICdX8k8ApgvqR5CH/nIBdwUGJCWVa", + "remember_token": null, + "google_id": null, + "avatar": "2", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": "6d00035f2fe30f45029bd8e35711284336431781c1bdca54f1d8c1bwqwqwd29fcd167", + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "30/4/2026 08:55:23", + "deleted_at": null, + "ip": null, + "domains": "[\"sepidehgold.com\", \"192.168.70.181\", \"app.sepidehgold.com\", \"sepidehgold.ir\"]", + "node_server": "https://sepidehgold.ir/server", + "node_ws": "wss://sepidehgold.gholaktala.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": "https://nerkh.gold/select_product/ff181931-f8b5-4673-b2cf-8e9b85fd2085", + "temp_url_redirect": "https://sepidehgold.com/server/admin/productMenu/productPriceMain/12", + "domain": null, + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 16, + "name": "GOLD.IR", + "name_fa": "گلد دات ای ار", + "number": "09122469874", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1768556877.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://gold.ir/server", + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "16/1/2026 12:52:48", + "deleted_at": null, + "ip": null, + "domains": "[\"hamkar.gold.ir\", \"gold.ir\"]", + "node_server": "https://gold.ir/server", + "node_ws": "wss://gold.goldikala.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 17, + "name": "GOLD.IR", + "name_fa": "گلد دات ای ار", + "number": "09122469875", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$tMRdxq5vy4akxqi/KWwlnekpRglwyBops9XLMkZNYgp.pnnVpnAsu", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1768556877.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://aygingold.ir/server", + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "2/3/2026 15:59:08", + "deleted_at": null, + "ip": null, + "domains": "[\"khanegi.gold.ir\"]", + "node_server": "https://gholak.gold.ir/server", + "node_ws": null, + "mode": null, + "color": "#2f2f36", + "secondary_color": "#fbd22f", + "background_color": "#fff", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 18, + "name": "limangold", + "name_fa": "لیمان", + "number": "09122469899", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_18_1779781189.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://aygingold.ir/server", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "26/5/2026 11:09:49", + "deleted_at": null, + "ip": null, + "domains": "[\"liman.gold\", \"limangold.ir\"]", + "node_server": "https://limangold.ir/server", + "node_ws": "wss://ws.limangold.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.1.0", + "app_ui_config": null + }, + { + "id": 19, + "name": "goldir", + "name_fa": "گلد دات ای ار", + "number": "09122469899", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1768556877.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://aygingold.ir/server", + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "16/1/2026 13:17:57", + "deleted_at": null, + "ip": null, + "domains": "[\"app.gold.ir\", \"gholak.gold.ir\"]", + "node_server": "https://gholak.gold.ir/server", + "node_ws": "wss://ws.liman.gold/prc/ws", + "mode": null, + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 21, + "name": "garoosi", + "name_fa": "گروسی", + "number": "07777477777", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1781420331.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://aygingold.ir/server", + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "28/4/2026 17:01:26", + "deleted_at": null, + "ip": null, + "domains": "[\"91.212.174.137\", \"garoosigholaktala.ir\", \"gholak.garoositala.ir\", \"192.168.10.196\", \"192.168.10.170\"]", + "node_server": "https://garoosigholaktala.ir/server", + "node_ws": null, + "mode": null, + "color": "#2a6b65", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 22, + "name": "24gold", + "name_fa": "افشاری کیا", + "number": "07777477788", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780308790.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "1/6/2026 13:43:10", + "deleted_at": null, + "ip": null, + "domains": "[\"188.121.117.177\", \"24gold.app\", \"24gold.ir\"]", + "node_server": "https://24gold.ir/server", + "node_ws": "wss://24gold.gholaktala.ir", + "mode": null, + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 23, + "name": "nasiryan", + "name_fa": "نصیریان ابشده", + "number": "09152000291", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1779367655.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "21/5/2026 16:17:35", + "deleted_at": null, + "ip": null, + "domains": "[\"nasiryan.com\", \"37.32.14.140\"]", + "node_server": "https://nasiryan.com/server", + "node_ws": "wss://nasiryan.gholaktala.ir", + "mode": null, + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 24, + "name": "bakhtargold", + "name_fa": "باختر گلد", + "number": "07777474123", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780747211.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "6/6/2026 15:30:11", + "deleted_at": null, + "ip": null, + "domains": "[\"bakhtargold.com\", \"app.bakhtargold.com\"]", + "node_server": "https://bakhtargold.com/server", + "node_ws": "wss://bakhtargold.gholaktala.ir", + "mode": null, + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 25, + "name": "main admin", + "name_fa": "main admin", + "number": "07777477789", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "21/1/2026 15:14:09", + "deleted_at": null, + "ip": null, + "domains": "[\"192.168.70.169\"]", + "node_server": "https://samin.gold/api/", + "node_ws": null, + "mode": null, + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 26, + "name": "paramis", + "name_fa": "پارامیس", + "number": "09120329331", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$er5IqzSWNAjpQKB4v3qjeOuvs62RkhcGVIQSGBm/jCM7GGqQXMQWe", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1770112661.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "28/4/2026 19:44:05", + "deleted_at": null, + "ip": null, + "domains": "[\"appgold.ir\"]", + "node_server": "https://appgold.ir/server", + "node_ws": "wss://appgold.gholaktala.ir", + "mode": "dynamicMode", + "color": "#214368", + "secondary_color": "#e3c27b", + "background_color": "#112234", + "temp_url": null, + "temp_url_redirect": null, + "domain": "Paramis", + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 27, + "name": "garoosi", + "name_fa": "گروسی", + "number": "07777477989", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1781420331.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "10/2/2026 13:23:35", + "deleted_at": null, + "ip": null, + "domains": "[\"app.garoosigholaktala.ir\"]", + "node_server": "https://app.garoosigholaktala.ir/server", + "node_ws": "wss://app.garoosigholaktala.ir", + "mode": "Garosi", + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 28, + "name": "emexgold", + "name_fa": "امیکس", + "number": "07777457944", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1779787390.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "26/5/2026 12:53:10", + "deleted_at": null, + "ip": null, + "domains": "[\"emexgold.com\", \"emexgold.ir\"]", + "node_server": "https://emexgold.ir/server", + "node_ws": "wss://emexgold.montask.ir", + "mode": "Emexgold", + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.3", + "app_ui_config": null + }, + { + "id": 29, + "name": "Montpar", + "name_fa": "منت پر", + "number": "07774477900", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783514477.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": "6d00035f2fe30f45029bd8e35711284336431781c1bdca54fdd8c1bd29fcd167", + "api_origin": "montpar.ir", + "api_ip_whitelist": "[\"185.97.116.238\"]", + "created_at": "16/1/2026 12:52:48", + "updated_at": "8/7/2026 16:11:17", + "deleted_at": null, + "ip": null, + "domains": "[\"montpar.ir\", \"new.montpar.ir\", \"192.168.10.196\", \"10.83.162.138\", \"192.168.70.191\"]", + "node_server": "https://montpar.ir/server", + "node_ws": "wss://ws.montpar.ir", + "mode": "Montpar", + "color": "#0A1B37", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.18", + "app_ui_config": null + }, + { + "id": 30, + "name": "aygingold", + "name_fa": "آیگین گلد", + "number": "07787477989", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1772013167.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "25/2/2026 13:22:47", + "deleted_at": null, + "ip": null, + "domains": "[\"aygingold.ir\", \"192.168.1.100\", \"192.168.43.41\"]", + "node_server": "https://aygingold.ir/server", + "node_ws": "wss://wsaygingold.gholaktala.ir", + "mode": "dynamicMode", + "color": "#435969", + "secondary_color": "#c4a55c", + "background_color": "#142f42", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 31, + "name": "talasevin", + "name_fa": "طلا سوین", + "number": "07777477933", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1769953039.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "1/2/2026 17:07:19", + "deleted_at": null, + "ip": null, + "domains": "[\"talasevin.ir\"]", + "node_server": "https://talasevin.ir/server", + "node_ws": "wss://talasevin.ir", + "mode": "dynamicMode", + "color": "#2c2c2c", + "secondary_color": "#d19d36", + "background_color": "#000000", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 33, + "name": "jamalgold", + "name_fa": "جمال گلد", + "number": "09153168210", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1770733039.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "10/2/2026 17:47:19", + "deleted_at": null, + "ip": null, + "domains": "[\"jamalgold.ir\", \"188.121.100.87\", \"dayantala.ir\", \"192.168.1.103\"]", + "node_server": "https://jamalgold.ir/server", + "node_ws": "wss://dayantala.ir/prc/ws", + "mode": "jamalgold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 34, + "name": "ramyargold", + "name_fa": "رامیار گلد", + "number": "07777477989", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "21/1/2026 15:14:09", + "deleted_at": null, + "ip": null, + "domains": "[\"ramyargold.ir\"]", + "node_server": "https://ramyargold.ir/server", + "node_ws": "wss://ramyargold.ir", + "mode": "ramyargold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 35, + "name": "goldsun", + "name_fa": "گلد سان", + "number": "07777477711", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1770100111.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://gold.garoosigholaktala.ir/server", + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "3/2/2026 09:58:31", + "deleted_at": null, + "ip": null, + "domains": "[\"goldsun.zaarbox.ir\"]", + "node_server": "https://goldsun.zaarbox.ir/server", + "node_ws": null, + "mode": null, + "color": "#2a6b65", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 37, + "name": "kalantarygold", + "name_fa": "کلانتری گلد", + "number": "07777477988", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1779825347.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "26/5/2026 23:25:47", + "deleted_at": null, + "ip": null, + "domains": "[\"kalantarigold.ir\"]", + "node_server": "https://kalantarigold.ir/server", + "node_ws": "wss://kalantarigold.gholaktala.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 44, + "name": "VahidGold", + "name_fa": "وحید گلد", + "number": "0777748", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1771924766.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "24/2/2026 12:49:26", + "deleted_at": null, + "ip": null, + "domains": "[\"94.101.185.152\", \"hamkar2.vahid.gold\", \"vahid.gold\"]", + "node_server": "https://vahid.gold/server", + "node_ws": "wss://vahid-ws.montask.ir", + "mode": "limangold", + "color": "#214368", + "secondary_color": "#e3c27b", + "background_color": "#112234", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.2", + "app_ui_config": null + }, + { + "id": 47, + "name": "MarandiGold", + "name_fa": "مرندی گلد", + "number": "07777479965", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1772007169.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "25/2/2026 11:42:49", + "deleted_at": null, + "ip": null, + "domains": "[\"212.23.201.173\", \"marandiigold.ir\"]", + "node_server": "https://marandiigold.ir/server", + "node_ws": "wss://marandiigold.ir", + "mode": "dynamicMode", + "color": "#365c5a", + "secondary_color": "#d19d36", + "background_color": "#024a3f", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 48, + "name": "garoosi", + "name_fa": "آبشده حسین گروسی", + "number": "07777479968", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1781420617.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "14/6/2026 10:33:37", + "deleted_at": null, + "ip": null, + "domains": "[\"hamkar.garoosigholaktala.ir\", \"hamkar.garoositala.ir\"]", + "node_server": "https://hamkar.garoosigholaktala.ir/server", + "node_ws": "wss://garosi-ws.montask.ir", + "mode": "limangold", + "color": "#214368", + "secondary_color": "#e3c27b", + "background_color": "#112234", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.2", + "app_ui_config": null + }, + { + "id": 62, + "name": "asadolahigold", + "name_fa": "اسداللهی", + "number": "09131234567", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1776322431.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "16/4/2026 10:23:51", + "deleted_at": null, + "ip": null, + "domains": "[\"asadolahigold.ir\"]", + "node_server": "\r\nhttps://asadolahigold.ir/server", + "node_ws": "wss://asadolahigold.gholaktala.ir", + "mode": "dynamicMode", + "color": "#fff", + "secondary_color": "#1698b0", + "background_color": "", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 70, + "name": "boursecu", + "name_fa": "بورس مس", + "number": "07377479949", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1781611480.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "16/6/2026 15:34:40", + "deleted_at": null, + "ip": null, + "domains": "[\"boursemes.com\", \"192.168.10.241\", \"localhost\"]", + "node_server": "https://boursemes.com/server", + "node_ws": "wss://boursecu.gholaktala.ir", + "mode": "dynamicMode", + "color": "#0d2f50", + "secondary_color": "#c18767", + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.2.0", + "app_ui_config": null + }, + { + "id": 71, + "name": "mansoorgold", + "name_fa": "منصور", + "number": "0777747945", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1776925091.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "23/4/2026 09:48:11", + "deleted_at": null, + "ip": null, + "domains": "[\"mansoorgold.ir\"]", + "node_server": "https://mansoorgold.ir/server", + "node_ws": "wss://boursecu.gholaktala.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 72, + "name": "henzagold", + "name_fa": "هنزاگلد", + "number": "07777479944", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://pay.henzagold.com/assets/logo_full_vertical-1f1cb381.svg", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "10/2/2026 13:23:35", + "deleted_at": null, + "ip": null, + "domains": "[\"talab.henzagold.com\"]", + "node_server": "https://talab.henzagold.com/server", + "node_ws": "wss://henzagold.gholaktala.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 73, + "name": "zafiragold", + "name_fa": "ظفیراگلد", + "number": "0538743857", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783956663.jpg", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "13/7/2026 19:01:03", + "deleted_at": null, + "ip": null, + "domains": "[\"ramin.montzar.ir\", \"goldenramin.ir\", \"zafiragold.ir\"]", + "node_server": "https://zafiragold.ir/server", + "node_ws": "wss://zafiragold.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.3", + "app_ui_config": null + }, + { + "id": 74, + "name": "limangold", + "name_fa": "لیمان", + "number": "09122469899", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://limangold.ir/fav_limangold.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": "https://aygingold.ir/server", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "16/1/2026 13:17:57", + "deleted_at": null, + "ip": null, + "domains": "[\"new.limangold.ir\"]", + "node_server": "https://new.limangold.ir/server", + "node_ws": "wss://new.limangold.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.1.0", + "app_ui_config": null + }, + { + "id": 75, + "name": "tabatabaie", + "name_fa": "طباطبایی", + "number": "07237477989", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_75_1779371722.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "21/5/2026 17:25:22", + "deleted_at": null, + "ip": null, + "domains": "[\"tabatabaeigold.ir\"]", + "node_server": "https://tabatabaeigold.ir/server", + "node_ws": "wss:/tabatabaeigold.montask.ir", + "mode": "limangold", + "color": "", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.2", + "app_ui_config": null + }, + { + "id": 76, + "name": "goldenramin", + "name_fa": "رامین", + "number": "0538743857", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1777182340.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "26/4/2026 09:15:40", + "deleted_at": null, + "ip": null, + "domains": "[\"kh.goldenramin.ir\"]", + "node_server": "https://kh.goldenramin.ir/server", + "node_ws": "wss://ramin.montask.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 77, + "name": "Zariran", + "name_fa": "زرایران", + "number": null, + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/zariran.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"zariran.org\"]", + "node_server": "https://zariran.org/server", + "node_ws": "wss://zariran2.gholaktala.ir", + "mode": "dynamicMode", + "color": "#214368", + "secondary_color": "#e3c27b", + "background_color": "#112234", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.2", + "app_ui_config": null + }, + { + "id": 78, + "name": "Kashkolgold", + "name_fa": "گروه طلای کشکول یزد\r\n", + "number": "0938495859", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1778755776.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "14/5/2026 14:19:36", + "deleted_at": null, + "ip": null, + "domains": "[\"kashkolgold.ir\"]", + "node_server": "https://kashkolgold.ir/server", + "node_ws": "wss://kashkolgold.montask.ir", + "mode": "dynamicMode", + "color": "#fff", + "secondary_color": "#a72b77", + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 79, + "name": "Kashkolgold", + "name_fa": "گروه طلای کشکول یزد\r\n", + "number": "09384958591", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1778755776.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"kh.kashkolgold.ir\", \"192.168.10.200\"]", + "node_server": "https://kh.kashkolgold.ir/server", + "node_ws": "wss://kashkolgold.montask.ir", + "mode": "dynamicMode", + "color": "#a72b77", + "secondary_color": "", + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 80, + "name": "abaeigold", + "name_fa": "عبائی گلد", + "number": "98372281183", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780750487.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "6/6/2026 16:24:53", + "deleted_at": null, + "ip": null, + "domains": "[\"abaeigold.ir\", \"127.0.0.1\"]", + "node_server": "https://abaeigold.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 81, + "name": "abshodehrahimi", + "name_fa": "رحیمی", + "number": "111222333", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1778914049.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "16/5/2026 10:17:29", + "deleted_at": null, + "ip": null, + "domains": "[\"abshodehrahimi.ir\"]", + "node_server": "https://abshodehrahimi.ir/server", + "node_ws": "wss://abshodehrahimi.montask.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 83, + "name": "ParsaTala", + "name_fa": "پارسا", + "number": "07777479455", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_83_1779615457.jpg", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "24/5/2026 13:07:37", + "deleted_at": null, + "ip": null, + "domains": "[\"parsa.mansoorgold.ir\"]", + "node_server": "https://mansoorgold.ir/server", + "node_ws": "wss://boursecu.gholaktala.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 84, + "name": "arianagold", + "name_fa": "آریانا طلا", + "number": "07777479457", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1782937358.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "1/7/2026 23:52:38", + "deleted_at": null, + "ip": null, + "domains": "[\"arianagold.ir\", \"arianagold.montzar.ir\"]", + "node_server": "https://arianagold.ir/server", + "node_ws": "wss://arianagold.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": null, + "app_ui_config": null + }, + { + "id": 85, + "name": "zargarisabeti", + "name_fa": "زرگری ثابتی", + "number": "1625347089", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1781165494.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "11/6/2026 11:41:34", + "deleted_at": null, + "ip": null, + "domains": "[\"zargarisabeti.ir\"]", + "node_server": "https://zargarisabeti.ir/server", + "node_ws": "wss://zargarisabeti.ir", + "mode": "limangold", + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 87, + "name": "abshodehrahimi", + "name_fa": "آبشده رحیمی", + "number": "111222334", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1778914049.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"app.abshodehrahimi.ir\"]", + "node_server": "https://app.abshodehrahimi.ir/server", + "node_ws": "wss://app.abshodehrahimi.montask.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 88, + "name": "gholaktala", + "name_fa": "قلک طلا", + "number": "09128081392", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780502361.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "3/6/2026 19:29:21", + "deleted_at": null, + "ip": null, + "domains": "[\"admin.gholaktala.ir\", \"app.gholaktala.ir\"]", + "node_server": "https://gholaktala.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": null, + "app_ui_config": null + }, + { + "id": 89, + "name": "soroushgold", + "name_fa": "سروش گلد", + "number": "06547479965", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1782564280.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "27/6/2026 16:14:40", + "deleted_at": null, + "ip": null, + "domains": "[\"app.artgoldsoroush.com\"]", + "node_server": "https://app.artgoldsoroush.com/server", + "node_ws": null, + "mode": "dynamicMode", + "color": "#5d001c", + "secondary_color": "", + "background_color": "", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 90, + "name": "goldali", + "name_fa": "گلد علی", + "number": "67584930222", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": null, + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"goldaliii.com\", \"192.168.70.191\"]", + "node_server": "https://goldaliii.com/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": null, + "app_ui_config": null + }, + { + "id": 91, + "name": "ehsantala", + "name_fa": "احسان طلا", + "number": "07777479467", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780827276.jpg", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "7/6/2026 13:44:36", + "deleted_at": null, + "ip": null, + "domains": "[\"ehsantala.ir\"]", + "node_server": "https://ehsantala.ir/server", + "node_ws": "wss://ehsantala.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 92, + "name": "bazretala", + "name_fa": "بذر طلا", + "number": "07766479458", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780993617.png", + "token": "", + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "9/6/2026 11:56:57", + "deleted_at": null, + "ip": "", + "domains": "[\"bazretala.ir\", \"192.168.67.199\"]", + "node_server": "https://app.bazretala.ir/server", + "node_ws": null, + "mode": "dynamicMode", + "color": "#000000", + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 93, + "name": "tabatabaei", + "name_fa": "آبشده طباطبایی", + "number": "07766479459", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_75_1779371722.png", + "token": "", + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": "", + "domains": "[\"abshodehtabatabaei.ir\"]", + "node_server": "https://abshodehtabatabaei.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 94, + "name": "KDemo", + "name_fa": "دمو خانگی", + "number": "07766479457", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783420008.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "7/7/2026 13:56:48", + "deleted_at": null, + "ip": null, + "domains": "[\"k.montzar.ir\"]", + "node_server": "https://app.aygingold.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": "{\r\n \"schemaId\": \"ui-config\",\r\n \"version\": \"1.0.0\",\r\n \"app\": {\r\n \"schemaId\": \"app\",\r\n \"version\": \"1.0.0\",\r\n \"direction\": \"rtl\",\r\n \"locale\": \"fa-IR\",\r\n \"startRoute\": \"home\",\r\n \"theme\": {\r\n \"mode\": \"dark\",\r\n \"colors\": {\r\n \"primary\": \"#0A1B37\",\r\n \"secondary\": \"#e3b056\",\r\n \"tertiary\": \"#ce9d43\",\r\n \"background\": \"#ffffff\",\r\n \"surface\": \"#222228\",\r\n \"surfaceHover\": \"#2c2c34\",\r\n \"textPrimary\": \"#ffffff\",\r\n \"textSecondary\": \"rgba(255, 255, 255, 0.45)\",\r\n \"textSubtle\": \"rgba(255, 255, 255, 0.35)\",\r\n \"border\": \"rgba(255, 255, 255, 0.16)\",\r\n \"borderSubtle\": \"rgba(255, 255, 255, 0.12)\",\r\n \"pageBg\": \"#121216\",\r\n \"pageBgMobile\": \"#0e0e12\",\r\n \"onAccent\": \"#0a0a0a\",\r\n \"success\": \"#16A34A\",\r\n \"warning\": \"#F59E0B\",\r\n \"danger\": \"#DC2626\"\r\n },\r\n \"borderRadius\": {\r\n \"sm\": 8,\r\n \"md\": 12,\r\n \"lg\": 16\r\n }\r\n },\r\n \"navigation\": {\r\n \"type\": \"both\",\r\n \"sidebar\": [\r\n {\r\n \"id\": \"home\",\r\n \"label\": \"داشبورد\",\r\n \"icon\": \"vuesax-linear:chart\",\r\n \"route\": \"home\",\r\n \"order\": 1,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"buy\",\r\n \"label\": \"خرید طلا\",\r\n \"icon\": \"vuesax-linear:money-receive\",\r\n \"route\": \"gold\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"query\": {\r\n \"state\": \"buy\"\r\n }\r\n },\r\n {\r\n \"id\": \"sell\",\r\n \"label\": \"فروش طلا\",\r\n \"icon\": \"vuesax-linear:money-send\",\r\n \"route\": \"gold\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"query\": {\r\n \"state\": \"sell\"\r\n }\r\n },\r\n {\r\n \"id\": \"wallet\",\r\n \"label\": \"کیف پول\",\r\n \"icon\": \"vuesax-linear:wallet-1\",\r\n \"route\": \"wallet\",\r\n \"order\": 4,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"transactions\",\r\n \"label\": \"تراکنش‌ها\",\r\n \"icon\": \"vuesax-linear:receipt-item\",\r\n \"route\": \"transactions\",\r\n \"order\": 5,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"products\",\r\n \"label\": \"محصولات\",\r\n \"icon\": \"vuesax-linear:coin\",\r\n \"route\": \"buyProduct\",\r\n \"order\": 7,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"user\",\r\n \"label\": \"تنظیمات\",\r\n \"icon\": \"vuesax-linear:setting-2\",\r\n \"route\": \"user\",\r\n \"order\": 8,\r\n \"visible\": true\r\n }\r\n ],\r\n \"bottom\": [\r\n {\r\n \"id\": \"gold\",\r\n \"label\": \"خرید و فروش\",\r\n \"icon\": \"vuesax-linear:coin\",\r\n \"route\": \"gold\",\r\n \"order\": 1,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"transactions\",\r\n \"label\": \"تراکنش‌ها\",\r\n \"icon\": \"vuesax-linear:receipt-item\",\r\n \"route\": \"transactions\",\r\n \"order\": 2,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"wallet\",\r\n \"label\": \"کیف پول\",\r\n \"icon\": \"vuesax-linear:wallet-add\",\r\n \"route\": \"wallet\",\r\n \"order\": 3,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"user\",\r\n \"label\": \"تنظیمات\",\r\n \"icon\": \"vuesax-linear:setting-2\",\r\n \"route\": \"user\",\r\n \"order\": 4,\r\n \"visible\": true\r\n }\r\n ],\r\n \"sidebarReferral\": {\r\n \"visible\": true,\r\n \"title\": \"کسب درآمد\",\r\n \"subtitle\": \"دعوت دوستان و دریافت پاداش\",\r\n \"route\": \"earnMoney\"\r\n }\r\n },\r\n \"header\": {\r\n \"visible\": true,\r\n \"variant\": \"default\",\r\n \"showLogo\": true,\r\n \"showNotifications\": true,\r\n \"showProfile\": true,\r\n \"brandSubtitle\": \"پنل کاربری\"\r\n }\r\n },\r\n \"pages\": {\r\n \"404\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"404\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"404\",\r\n \"title\": \"صفحه یافت نشد\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"not-found-message\",\r\n \"type\": \"not-found-message\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"صفحه مورد نظر یافت نشد\"\r\n }\r\n }\r\n ]\r\n },\r\n \"about\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"about\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"about\",\r\n \"title\": \"درباره ما\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"about-mobile-header\",\r\n \"type\": \"about-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-brand-hero\",\r\n \"type\": \"about-brand-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-sections-content\",\r\n \"type\": \"about-sections-content\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-support-actions\",\r\n \"type\": \"about-support-actions\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"آشنایی با خدمات و رویکرد ما\"\r\n },\r\n \"address\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"address\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"address\",\r\n \"title\": \"آدرس‌ها\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"address-mobile-header\",\r\n \"type\": \"address-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"address-list\",\r\n \"type\": \"address-list\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت آدرس‌های تحویل برای دریافت فیزیکی و ارسال مرسولات\"\r\n },\r\n \"props\": {\r\n \"skeletonCount\": 5\r\n }\r\n },\r\n {\r\n \"id\": \"address-desktop-hero\",\r\n \"type\": \"address-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت آدرس‌های تحویل برای دریافت فیزیکی و ارسال مرسولات\"\r\n }\r\n },\r\n {\r\n \"id\": \"address-desktop-grid\",\r\n \"type\": \"address-desktop-grid\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"مدیریت آدرس‌های تحویل\"\r\n },\r\n \"buyProduct\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"buyProduct\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"buyProduct\",\r\n \"title\": \"محصولات\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 18\r\n },\r\n \"desktop\": {\r\n \"type\": \"products-desktop\",\r\n \"gap\": 18\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"products-mobile-header\",\r\n \"type\": \"products-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-closed-banner\",\r\n \"type\": \"products-closed-banner\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-search\",\r\n \"type\": \"products-search\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"products-filter-tabs\",\r\n \"type\": \"products-filter-tabs\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"products-hero-banner\",\r\n \"type\": \"products-hero-banner\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-best-sellers\",\r\n \"type\": \"products-best-sellers\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-catalog-list\",\r\n \"type\": \"products-catalog-list\",\r\n \"order\": 7,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"همه محصولات\"\r\n },\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n },\r\n {\r\n \"id\": \"products-desktop-filters\",\r\n \"type\": \"products-desktop-filters\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-desktop-grid\",\r\n \"type\": \"products-desktop-grid\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"emptyText\": \"محصولی یافت نشد.\"\r\n },\r\n \"props\": {\r\n \"skeletonCount\": 8\r\n }\r\n },\r\n {\r\n \"id\": \"products-category-sidebar\",\r\n \"type\": \"products-category-sidebar\",\r\n \"order\": 99,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"انتخاب و خرید انواع طلا، سکه و شمش\"\r\n },\r\n \"fund\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"fund\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"fund\",\r\n \"title\": \"قلک‌های من\",\r\n \"subtitle\": \"با ساخت قلک، طلایتان را برای اهداف مشخص پس‌انداز کنید\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"fund-mobile-header\",\r\n \"type\": \"fund-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"قلک‌های من\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-report-mode-toggle\",\r\n \"type\": \"fund-report-mode-toggle\",\r\n \"order\": 2,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"fund-asset-report\",\r\n \"type\": \"fund-asset-report\",\r\n \"order\": 3,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"fund-profit-report\",\r\n \"type\": \"fund-profit-report\",\r\n \"order\": 4,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"fund-desktop-report\",\r\n \"type\": \"fund-desktop-report\",\r\n \"order\": 1,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ]\r\n },\r\n \"fund_add\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"fund_add\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"fund_add\",\r\n \"title\": \"ایجاد قلک جدید\",\r\n \"subtitle\": \"ساخت قلک جدید برای پس‌انداز طلا\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"fund-add-mobile-header\",\r\n \"type\": \"fund-add-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ایجاد قلک جدید\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-add-desktop-hero\",\r\n \"type\": \"fund-add-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ایجاد قلک جدید\",\r\n \"subtitle\": \"برای آینده‌ای درخشان، امروز بسازید\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-add-form\",\r\n \"type\": \"fund-add-form\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ساخت قلک\",\r\n \"subtitle\": \"نام، آیکون و هدف قلک را مشخص کنید\"\r\n }\r\n }\r\n ]\r\n },\r\n \"fund_info\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"fund_info\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"fund_info\",\r\n \"title\": \"جزئیات قلک\",\r\n \"subtitle\": \"موجودی، واریز، برداشت و تراکنش‌های قلک\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"fund-info-mobile-header\",\r\n \"type\": \"fund-info-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"جزئیات قلک\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-info-desktop-hero\",\r\n \"type\": \"fund-info-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"جزئیات قلک\",\r\n \"subtitle\": \"موجودی، واریز، برداشت و تراکنش‌های قلک\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-info-main\",\r\n \"type\": \"fund-info-main\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"تراکنش‌ها\",\r\n \"emptyText\": \"هنوز تراکنشی ثبت نشده\"\r\n }\r\n }\r\n ]\r\n },\r\n \"gold\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"gold\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"gold\",\r\n \"title\": \"خرید و فروش طلا\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"trade-desktop\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"trade-mobile-header\",\r\n \"type\": \"trade-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-price-card\",\r\n \"type\": \"trade-price-card\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-balance-card\",\r\n \"type\": \"trade-balance-card\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-form-panel\",\r\n \"type\": \"trade-form-panel\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-price-chart\",\r\n \"type\": \"trade-price-chart\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-recent-transactions\",\r\n \"type\": \"trade-recent-transactions\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-desktop-card\",\r\n \"type\": \"trade-desktop-card\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"خرید و فروش طلای آبشده با بهترین قیمت بازار\"\r\n },\r\n \"home\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"home\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"home\",\r\n \"title\": \"خانه\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"home-desktop\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"home-header\",\r\n \"type\": \"home-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"vip\"\r\n },\r\n {\r\n \"id\": \"home-mobile-hero\",\r\n \"type\": \"home-mobile-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"home-alerts\",\r\n \"type\": \"home-alerts\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"home-desktop-hero\",\r\n \"type\": \"home-desktop-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"live-price\",\r\n \"type\": \"live-price\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"compact\": true\r\n }\r\n },\r\n {\r\n \"id\": \"quick-access\",\r\n \"type\": \"quick-access\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"variant\": \"auto\",\r\n \"content\": {\r\n \"title\": \"دسترسی سریع\"\r\n }\r\n },\r\n {\r\n \"id\": \"recent-transactions\",\r\n \"type\": \"recent-transactions\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"limit\": 2\r\n },\r\n \"content\": {\r\n \"title\": \"آخرین تراکنش‌ها\",\r\n \"viewAllLabel\": \"مشاهده همه\",\r\n \"emptyText\": \"تراکنشی ثبت نشده است.\"\r\n }\r\n },\r\n {\r\n \"id\": \"home-desktop-lower\",\r\n \"type\": \"home-desktop-lower\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"props\": {\r\n \"transactionLimit\": 4,\r\n \"showBanner\": true\r\n },\r\n \"content\": {\r\n \"title\": \"آخرین تراکنش‌ها\",\r\n \"viewAllLabel\": \"مشاهده همه\",\r\n \"emptyText\": \"تراکنشی ثبت نشده است.\"\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"خلاصه وضعیت حساب و بازار طلا\"\r\n },\r\n \"marketAnalysis\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"marketAnalysis\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"marketAnalysis\",\r\n \"title\": \"تحلیل بازار طلا\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"market-analysis-mobile-header\",\r\n \"type\": \"market-analysis-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"market-analysis-hero\",\r\n \"type\": \"market-analysis-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"تحلیل خودکار بازار طلا\",\r\n \"subtitle\": \"این تحلیل به‌صورت خودکار بر اساس داده‌های واقعی قیمت طلا (روزانه، هفتگی و ماهانه) محاسبه می‌شود و شاخص‌های عددی و پیشنهاد معاملاتی ارائه می‌دهد.\"\r\n }\r\n },\r\n {\r\n \"id\": \"market-analysis-verdict\",\r\n \"type\": \"market-analysis-verdict\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"market-analysis-metrics\",\r\n \"type\": \"market-analysis-metrics\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"market-analysis-insights\",\r\n \"type\": \"market-analysis-insights\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"نکات کلیدی تحلیل\"\r\n }\r\n },\r\n {\r\n \"id\": \"market-analysis-disclaimer\",\r\n \"type\": \"market-analysis-disclaimer\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"تحلیل خودکار بازار طلا بر اساس داده‌های واقعی قیمت\"\r\n },\r\n \"notifyTrigger\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"notifyTrigger\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"notifyTrigger\",\r\n \"title\": \"هشدارهای فعلی\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"price-trigger-mobile-header\",\r\n \"type\": \"price-trigger-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"price-trigger-intro\",\r\n \"type\": \"price-trigger-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت هشدارهای قیمت طلا و نحوه اطلاع‌رسانی\"\r\n }\r\n },\r\n {\r\n \"id\": \"price-trigger-list\",\r\n \"type\": \"price-trigger-list\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 5\r\n }\r\n },\r\n {\r\n \"id\": \"price-trigger-desktop-hero\",\r\n \"type\": \"price-trigger-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"تنظیم و مدیریت هشدارهای قیمت طلا\"\r\n }\r\n },\r\n {\r\n \"id\": \"price-trigger-desktop-grid\",\r\n \"type\": \"price-trigger-desktop-grid\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"تنظیم هشدار قیمت طلا\"\r\n },\r\n \"permissions\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"permissions\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"permissions\",\r\n \"title\": \"مجوز ها\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"permissions-mobile-header\",\r\n \"type\": \"permissions-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"permissions-desktop-hero\",\r\n \"type\": \"permissions-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"جواز کسب و کار و مدارک قانونی\"\r\n }\r\n },\r\n {\r\n \"id\": \"permissions-license-card\",\r\n \"type\": \"permissions-license-card\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مجوزها و دسترسی‌ها\"\r\n },\r\n \"physicalReceive\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"physicalReceive\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"physicalReceive\",\r\n \"title\": \"تحویل فیزیکی\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"physical-receive-mobile-header\",\r\n \"type\": \"physical-receive-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"physical-receive-desktop-hero\",\r\n \"type\": \"physical-receive-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت درخواست‌های دریافت فیزیکی طلا و محصولات\"\r\n }\r\n },\r\n {\r\n \"id\": \"physical-receive-intro\",\r\n \"type\": \"physical-receive-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت درخواست‌های دریافت فیزیکی طلا و محصولات\"\r\n }\r\n },\r\n {\r\n \"id\": \"physical-receive-main\",\r\n \"type\": \"physical-receive-main\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"درخواست تحویل فیزیکی طلا\"\r\n },\r\n \"productDeal\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"productDeal\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"productDeal\",\r\n \"title\": \"تکمیل خرید\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"product-deal-mobile-header\",\r\n \"type\": \"product-deal-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"product-deal-main\",\r\n \"type\": \"product-deal-main\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"تکمیل خرید محصول\"\r\n },\r\n \"profitLoss\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"profitLoss\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"profitLoss\",\r\n \"title\": \"سود معاملات شما\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"profit-loss-mobile-header\",\r\n \"type\": \"profit-loss-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"profit-loss-disclaimer\",\r\n \"type\": \"profit-loss-disclaimer\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"profit-loss-metrics-grid\",\r\n \"type\": \"profit-loss-metrics-grid\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"محاسبه سود و زیان معاملات طلای شما\"\r\n },\r\n \"rules\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"rules\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"rules\",\r\n \"title\": \"قوانین و مقررات\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"rules-mobile-header\",\r\n \"type\": \"rules-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"rules-summary-card\",\r\n \"type\": \"rules-summary-card\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"rules-content-panel\",\r\n \"type\": \"rules-content-panel\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"rules-support-actions\",\r\n \"type\": \"rules-support-actions\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"قوانین، مقررات و شرایط استفاده\"\r\n },\r\n \"transactions\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"transactions\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"transactions\",\r\n \"title\": \"تراکنش‌ها\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 22\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"transactions-mobile-header\",\r\n \"type\": \"transactions-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"transactions-tabs\",\r\n \"type\": \"transactions-tabs\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"transactions-filters\",\r\n \"type\": \"transactions-filters\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"transactions-list\",\r\n \"type\": \"transactions-list\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n },\r\n {\r\n \"id\": \"transactions-desktop-toolbar\",\r\n \"type\": \"transactions-desktop-toolbar\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"transactions-desktop-panel\",\r\n \"type\": \"transactions-desktop-panel\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مشاهده و پیگیری تراکنش‌های حساب\"\r\n },\r\n \"user\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"user\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"user\",\r\n \"title\": \"پروفایل\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"user-desktop\",\r\n \"gap\": 14\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"user-mobile-header\",\r\n \"type\": \"user-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-profile-hero\",\r\n \"type\": \"user-profile-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"user-wallet-balance\",\r\n \"type\": \"user-wallet-balance\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"user-quick-actions\",\r\n \"type\": \"user-quick-actions\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"user-referral\",\r\n \"type\": \"user-referral\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"profile\"\r\n },\r\n {\r\n \"id\": \"user-earn-money-entry\",\r\n \"type\": \"user-earn-money-entry\",\r\n \"order\": 6,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-theme-toggle\",\r\n \"type\": \"user-theme-toggle\",\r\n \"order\": 7,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"profile\"\r\n },\r\n {\r\n \"id\": \"user-menu-list\",\r\n \"type\": \"user-menu-list\",\r\n \"order\": 8,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"profile\"\r\n },\r\n {\r\n \"id\": \"user-desktop-top-row\",\r\n \"type\": \"user-desktop-top-row\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-desktop-stats\",\r\n \"type\": \"user-desktop-stats\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-desktop-quick-actions\",\r\n \"type\": \"user-quick-actions\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"variant\": \"desktop\"\r\n },\r\n {\r\n \"id\": \"user-desktop-referral\",\r\n \"type\": \"user-referral\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"variant\": \"desktop\"\r\n },\r\n {\r\n \"id\": \"user-desktop-earn-money\",\r\n \"type\": \"user-earn-money-entry\",\r\n \"order\": 5,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-invite-banner\",\r\n \"type\": \"user-invite-banner\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-desktop-sidebar\",\r\n \"type\": \"user-desktop-sidebar\",\r\n \"order\": 99,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مدیریت اطلاعات حساب، امنیت و تنظیمات شخصی\"\r\n },\r\n \"wallet\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"wallet\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"wallet\",\r\n \"title\": \"کیف پول\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 18\r\n },\r\n \"desktop\": {\r\n \"type\": \"wallet-desktop\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"wallet-mobile-header\",\r\n \"type\": \"wallet-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-withdraw-success\",\r\n \"type\": \"wallet-withdraw-success\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-deposit-stepper\",\r\n \"type\": \"wallet-deposit-stepper\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-deposit-account\",\r\n \"type\": \"wallet-deposit-account\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-mode-toggle\",\r\n \"type\": \"wallet-mode-toggle\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-balance-hero\",\r\n \"type\": \"wallet-balance-hero\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-deposit-form\",\r\n \"type\": \"wallet-deposit-form\",\r\n \"order\": 7,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"variant\": \"auto\"\r\n },\r\n {\r\n \"id\": \"wallet-withdraw-form\",\r\n \"type\": \"wallet-withdraw-form\",\r\n \"order\": 8,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"variant\": \"auto\"\r\n },\r\n {\r\n \"id\": \"wallet-desktop-balance-card\",\r\n \"type\": \"wallet-desktop-balance-card\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-desktop-aside\",\r\n \"type\": \"wallet-desktop-aside\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-desktop-price-chart\",\r\n \"type\": \"wallet-desktop-price-chart\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مدیریت موجودی و واریز به کیف پول\"\r\n },\r\n \"aboutUs\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"aboutUs\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"aboutUs\",\r\n \"title\": \"درباره ما\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"about-us-mobile-header\",\r\n \"type\": \"about-us-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-us-brand-hero\",\r\n \"type\": \"about-us-brand-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-us-garoosi-content\",\r\n \"type\": \"about-us-garoosi-content\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"آشنایی با گروسی گالری\"\r\n },\r\n \"educate\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"educate\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"educate\",\r\n \"title\": \"آموزش نرم افزار\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"educate-mobile-header\",\r\n \"type\": \"educate-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"educate-desktop-hero\",\r\n \"type\": \"educate-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"راهنمای گام‌به‌گام ورود، خرید، فروش و دریافت فیزیکی\"\r\n }\r\n },\r\n {\r\n \"id\": \"educate-sections-content\",\r\n \"type\": \"educate-sections-content\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"educate-support-actions\",\r\n \"type\": \"educate-support-actions\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"راهنمای گام‌به‌گام ورود، خرید، فروش و دریافت فیزیکی\"\r\n },\r\n \"login\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"login\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"login\",\r\n \"title\": \"خوش آمدید\",\r\n \"subtitle\": \"ورود به حساب کاربری\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 0\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 0\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"login-mobile-shell\",\r\n \"type\": \"login-mobile-shell\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"خوش آمدید\"\r\n }\r\n },\r\n {\r\n \"id\": \"login-desktop-shell\",\r\n \"type\": \"login-desktop-shell\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"خوش آمدید\"\r\n }\r\n }\r\n ]\r\n },\r\n \"transaction_detail\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"transaction_detail\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"transaction_detail\",\r\n \"title\": \"جزئیات تراکنش\",\r\n \"subtitle\": \"جزئیات تراکنش\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"transaction-detail-main\",\r\n \"type\": \"transaction-detail-main\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n }\r\n ]\r\n },\r\n \"earnMoney\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"earnMoney\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"earnMoney\",\r\n \"title\": \"کسب درآمد\",\r\n \"subtitle\": \"کسب درآمد از دعوت دوستان\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"earn-mobile-header\",\r\n \"type\": \"earn-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"earn-desktop-header\",\r\n \"type\": \"earn-desktop-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"earn-invite-panel\",\r\n \"type\": \"earn-invite-panel\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"کسب درآمد\",\r\n \"subtitle\": \"هر دعوت موفق ۵ سوت طلا هدیه\"\r\n }\r\n },\r\n {\r\n \"id\": \"earn-gifts-history\",\r\n \"type\": \"earn-gifts-history\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"تاریخچه پاداش‌ها\"\r\n }\r\n },\r\n {\r\n \"id\": \"earn-users-list\",\r\n \"type\": \"earn-users-list\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"فهرست زیرمجموعه\"\r\n }\r\n }\r\n ]\r\n },\r\n \"giftCard\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"giftCard\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"giftCard\",\r\n \"title\": \"کارت هدیه\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"gift-card-mobile-header\",\r\n \"type\": \"gift-card-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"کارت هدیه\"\r\n }\r\n },\r\n {\r\n \"id\": \"gift-card-desktop-back\",\r\n \"type\": \"gift-card-desktop-back\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"gift-card-intro\",\r\n \"type\": \"gift-card-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ثبت کارت هدیه\",\r\n \"subtitle\": \"کد دریافتی را وارد کنید تا به موجودی شما اضافه شود\"\r\n }\r\n },\r\n {\r\n \"id\": \"gift-card-form\",\r\n \"type\": \"gift-card-form\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"label\": \"کد کارت هدیه\",\r\n \"placeholder\": \"کد کارت هدیه را وارد کنید\",\r\n \"hint\": \"کد کارت هدیه خود را در فیلد بالا وارد کنید و سپس دکمه ثبت را بزنید.\",\r\n \"submitLabel\": \"ثبت کد\"\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"ثبت کد کارت هدیه طلا\"\r\n },\r\n \"recoverySites\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"recoverySites\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"recoverySites\",\r\n \"title\": \"سایت‌های ری‌گیری\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"recovery-sites-mobile-header\",\r\n \"type\": \"recovery-sites-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"سایت‌های ری‌گیری\"\r\n }\r\n },\r\n {\r\n \"id\": \"recovery-sites-desktop-back\",\r\n \"type\": \"recovery-sites-desktop-back\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"recovery-sites-intro\",\r\n \"type\": \"recovery-sites-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"سایت‌های ری‌گیری\",\r\n \"subtitle\": \"دسترسی به سایت‌های مرتبط با ری‌گیری\"\r\n }\r\n },\r\n {\r\n \"id\": \"recovery-sites-list\",\r\n \"type\": \"recovery-sites-list\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"دسترسی به سایت‌های مرتبط با ری‌گیری\"\r\n }\r\n }\r\n}\r\n" + }, + { + "id": 95, + "name": "niazitala", + "name_fa": "نیازی طلا", + "number": "07766479460", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783242786.png", + "token": "", + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "5/7/2026 12:44:15", + "deleted_at": null, + "ip": "", + "domains": "[\"niazitala.ir\", \"192.168.10.199\", \"192.168.70.184\"]", + "node_server": "https://niazitala.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 96, + "name": "aygingold", + "name_fa": "آیگین گلد", + "number": "07787477990", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "$2y$12$0junytRxvyV8mvC0kAMFfuFtSfVcT/5vaU5lqYpx5uRO/FRF2PJDy", + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1772013167.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": "16/1/2026 12:52:48", + "updated_at": "25/2/2026 13:22:47", + "deleted_at": null, + "ip": null, + "domains": "[\"app.aygingold.ir\"]", + "node_server": "https://app.aygingold.ir/server", + "node_ws": "wss://wsaygingold.gholaktala.ir", + "mode": "dynamicMode", + "color": "#142f42", + "secondary_color": "#c4a55c", + "background_color": "", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 97, + "name": "atashigold", + "name_fa": "آتشی گلد", + "number": "07787477991", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": null, + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"atashigold.ir\"]", + "node_server": "https://atashigold.ir/server", + "node_ws": "wss://atashigold.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 98, + "name": "mehran-gold", + "name_fa": "مهران گلد", + "number": "07787477992", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": null, + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"mehran-gold.ir\"]", + "node_server": "https://mehran-gold.ir/server", + "node_ws": "wss://mehran-gold.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 99, + "name": "nivangold", + "name_fa": "نیوان گلد", + "number": "07787477994", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "", + "remember_token": "", + "google_id": "", + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783517740.png", + "token": "", + "type": "user", + "agent_of": "", + "callback_url": "", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": "", + "created_at": null, + "updated_at": "8/7/2026 17:05:40", + "deleted_at": null, + "ip": "", + "domains": "[\"nivangold.ir\"]", + "node_server": "https://nivangold.ir/server", + "node_ws": "wss://nivangold.ir", + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": "", + "temp_url_redirect": "", + "domain": "", + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 100, + "name": "pourmehrtala", + "name_fa": "پورمهرطلا", + "number": "07787477996", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "", + "remember_token": "", + "google_id": "", + "avatar": "", + "token": "", + "type": "user", + "agent_of": "", + "callback_url": "", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": "", + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": "", + "domains": "[\"pourmehrtala.ir\"]", + "node_server": "https://pourmehrtala.ir/server", + "node_ws": "wss://pourmehrtala.ir", + "mode": "", + "color": "", + "secondary_color": "", + "background_color": "", + "temp_url": "", + "temp_url_redirect": "", + "domain": "", + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 101, + "name": "abaeigold", + "name_fa": "عبائی گلد", + "number": "0778747796", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "", + "remember_token": "", + "google_id": "", + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780750487.png", + "token": "", + "type": "user", + "agent_of": "", + "callback_url": "", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": "", + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": "", + "domains": "[\"hamkar.abaeigold.ir\"]", + "node_server": "https://hamkar.abaeigold.ir/server", + "node_ws": "wss://hamkar.abaeigold.ir", + "mode": "", + "color": "", + "secondary_color": "", + "background_color": "", + "temp_url": "", + "temp_url_redirect": "", + "domain": "", + "version": "1.0.0", + "app_ui_config": null + }, + { + "id": 102, + "name": "ghatreh", + "name_fa": "قطره", + "number": "0778747799", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1778755776.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[]", + "node_server": "https://kh.kashkolgold.ir/server", + "node_ws": "wss://kashkolgold.montask.ir", + "mode": "dynamicMode", + "color": "#000000", + "secondary_color": "", + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 103, + "name": "atashigold", + "name_fa": "آتشی گلد", + "number": "0778747800", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "", + "remember_token": "", + "google_id": "", + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783775331.png", + "token": "", + "type": "user", + "agent_of": "", + "callback_url": "", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": "", + "created_at": null, + "updated_at": "11/7/2026 16:38:51", + "deleted_at": null, + "ip": "", + "domains": "[\"app.atashigold.ir\"]", + "node_server": "https://app.atashigold.ir/server", + "node_ws": null, + "mode": "", + "color": "", + "secondary_color": "", + "background_color": "", + "temp_url": "", + "temp_url_redirect": "", + "domain": "", + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 104, + "name": "behradgallery", + "name_fa": "بهرادگالری", + "number": "0778747801", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": "", + "remember_token": "", + "google_id": "", + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1783774862.png", + "token": "", + "type": "user", + "agent_of": "", + "callback_url": "", + "user_secret": "", + "api_origin": "", + "api_ip_whitelist": "", + "created_at": null, + "updated_at": "11/7/2026 16:31:02", + "deleted_at": null, + "ip": "", + "domains": "[\"app.behradgallery.ir\"]", + "node_server": "https://app.behradgallery.ir/server", + "node_ws": null, + "mode": "", + "color": "", + "secondary_color": "", + "background_color": "", + "temp_url": "", + "temp_url_redirect": "", + "domain": "", + "version": "2.0.1", + "app_ui_config": null + }, + { + "id": 105, + "name": "Moniri", + "name_fa": "بنکداری طلا حسین منیری", + "number": "0778747802", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1784022807.jpg", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "14/7/2026 13:23:27", + "deleted_at": null, + "ip": null, + "domains": "[\"moniri.zariran.org\"]", + "node_server": "https://zariran.org/server", + "node_ws": "wss://zariran2.gholaktala.ir", + "mode": "dynamicMode", + "color": "#214368", + "secondary_color": "#e3c27b", + "background_color": "#112234", + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "1.0.1", + "app_ui_config": null + }, + { + "id": 106, + "name": "gholak_new", + "name_fa": "قلک طلا", + "number": "09134469985", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1780502361.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": null, + "deleted_at": null, + "ip": null, + "domains": "[\"new.gholaktala.ir\", \"ktest.montzar.ir\", \"172.18.0.1\"]", + "node_server": "https://new.gholaktala.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.0", + "app_ui_config": "{\r\n \"schemaId\": \"ui-config\",\r\n \"version\": \"1.0.0\",\r\n \"app\": {\r\n \"schemaId\": \"app\",\r\n \"version\": \"1.0.0\",\r\n \"direction\": \"rtl\",\r\n \"locale\": \"fa-IR\",\r\n \"startRoute\": \"home\",\r\n \"theme\": {\r\n \"mode\": \"dark\",\r\n \"colors\": {\r\n \"primary\": \"#0A1B37\",\r\n \"secondary\": \"#e3b056\",\r\n \"tertiary\": \"#ce9d43\",\r\n \"background\": \"#ffffff\",\r\n \"surface\": \"#222228\",\r\n \"surfaceHover\": \"#2c2c34\",\r\n \"textPrimary\": \"#ffffff\",\r\n \"textSecondary\": \"rgba(255, 255, 255, 0.45)\",\r\n \"textSubtle\": \"rgba(255, 255, 255, 0.35)\",\r\n \"border\": \"rgba(255, 255, 255, 0.16)\",\r\n \"borderSubtle\": \"rgba(255, 255, 255, 0.12)\",\r\n \"pageBg\": \"#121216\",\r\n \"pageBgMobile\": \"#0e0e12\",\r\n \"onAccent\": \"#0a0a0a\",\r\n \"success\": \"#16A34A\",\r\n \"warning\": \"#F59E0B\",\r\n \"danger\": \"#DC2626\"\r\n },\r\n \"borderRadius\": {\r\n \"sm\": 8,\r\n \"md\": 12,\r\n \"lg\": 16\r\n }\r\n },\r\n \"navigation\": {\r\n \"type\": \"both\",\r\n \"sidebar\": [\r\n {\r\n \"id\": \"home\",\r\n \"label\": \"داشبورد\",\r\n \"icon\": \"vuesax-linear:chart\",\r\n \"route\": \"home\",\r\n \"order\": 1,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"buy\",\r\n \"label\": \"خرید طلا\",\r\n \"icon\": \"vuesax-linear:money-receive\",\r\n \"route\": \"gold\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"query\": {\r\n \"state\": \"buy\"\r\n }\r\n },\r\n {\r\n \"id\": \"sell\",\r\n \"label\": \"فروش طلا\",\r\n \"icon\": \"vuesax-linear:money-send\",\r\n \"route\": \"gold\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"query\": {\r\n \"state\": \"sell\"\r\n }\r\n },\r\n {\r\n \"id\": \"wallet\",\r\n \"label\": \"کیف پول\",\r\n \"icon\": \"vuesax-linear:wallet-1\",\r\n \"route\": \"wallet\",\r\n \"order\": 4,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"transactions\",\r\n \"label\": \"تراکنش‌ها\",\r\n \"icon\": \"vuesax-linear:receipt-item\",\r\n \"route\": \"transactions\",\r\n \"order\": 5,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"products\",\r\n \"label\": \"محصولات\",\r\n \"icon\": \"vuesax-linear:coin\",\r\n \"route\": \"buyProduct\",\r\n \"order\": 7,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"user\",\r\n \"label\": \"تنظیمات\",\r\n \"icon\": \"vuesax-linear:setting-2\",\r\n \"route\": \"user\",\r\n \"order\": 8,\r\n \"visible\": true\r\n }\r\n ],\r\n \"bottom\": [\r\n {\r\n \"id\": \"gold\",\r\n \"label\": \"خرید و فروش\",\r\n \"icon\": \"vuesax-linear:coin\",\r\n \"route\": \"gold\",\r\n \"order\": 1,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"transactions\",\r\n \"label\": \"تراکنش‌ها\",\r\n \"icon\": \"vuesax-linear:receipt-item\",\r\n \"route\": \"transactions\",\r\n \"order\": 2,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"wallet\",\r\n \"label\": \"کیف پول\",\r\n \"icon\": \"vuesax-linear:wallet-add\",\r\n \"route\": \"wallet\",\r\n \"order\": 3,\r\n \"visible\": true\r\n },\r\n {\r\n \"id\": \"user\",\r\n \"label\": \"تنظیمات\",\r\n \"icon\": \"vuesax-linear:setting-2\",\r\n \"route\": \"user\",\r\n \"order\": 4,\r\n \"visible\": true\r\n }\r\n ],\r\n \"sidebarReferral\": {\r\n \"visible\": true,\r\n \"title\": \"کسب درآمد\",\r\n \"subtitle\": \"دعوت دوستان و دریافت پاداش\",\r\n \"route\": \"earnMoney\"\r\n }\r\n },\r\n \"header\": {\r\n \"visible\": true,\r\n \"variant\": \"default\",\r\n \"showLogo\": true,\r\n \"showNotifications\": true,\r\n \"showProfile\": true,\r\n \"brandSubtitle\": \"پنل کاربری\"\r\n }\r\n },\r\n \"pages\": {\r\n \"404\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"404\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"404\",\r\n \"title\": \"صفحه یافت نشد\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"not-found-message\",\r\n \"type\": \"not-found-message\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"صفحه مورد نظر یافت نشد\"\r\n }\r\n }\r\n ]\r\n },\r\n \"about\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"about\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"about\",\r\n \"title\": \"درباره ما\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"about-mobile-header\",\r\n \"type\": \"about-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-brand-hero\",\r\n \"type\": \"about-brand-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-sections-content\",\r\n \"type\": \"about-sections-content\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-support-actions\",\r\n \"type\": \"about-support-actions\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"آشنایی با خدمات و رویکرد ما\"\r\n },\r\n \"address\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"address\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"address\",\r\n \"title\": \"آدرس‌ها\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"address-mobile-header\",\r\n \"type\": \"address-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"address-list\",\r\n \"type\": \"address-list\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت آدرس‌های تحویل برای دریافت فیزیکی و ارسال مرسولات\"\r\n },\r\n \"props\": {\r\n \"skeletonCount\": 5\r\n }\r\n },\r\n {\r\n \"id\": \"address-desktop-hero\",\r\n \"type\": \"address-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت آدرس‌های تحویل برای دریافت فیزیکی و ارسال مرسولات\"\r\n }\r\n },\r\n {\r\n \"id\": \"address-desktop-grid\",\r\n \"type\": \"address-desktop-grid\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"مدیریت آدرس‌های تحویل\"\r\n },\r\n \"buyProduct\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"buyProduct\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"buyProduct\",\r\n \"title\": \"محصولات\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 18\r\n },\r\n \"desktop\": {\r\n \"type\": \"products-desktop\",\r\n \"gap\": 18\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"products-mobile-header\",\r\n \"type\": \"products-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-closed-banner\",\r\n \"type\": \"products-closed-banner\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-search\",\r\n \"type\": \"products-search\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"products-filter-tabs\",\r\n \"type\": \"products-filter-tabs\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"products-hero-banner\",\r\n \"type\": \"products-hero-banner\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-best-sellers\",\r\n \"type\": \"products-best-sellers\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-catalog-list\",\r\n \"type\": \"products-catalog-list\",\r\n \"order\": 7,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"همه محصولات\"\r\n },\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n },\r\n {\r\n \"id\": \"products-desktop-filters\",\r\n \"type\": \"products-desktop-filters\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"products-desktop-grid\",\r\n \"type\": \"products-desktop-grid\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"emptyText\": \"محصولی یافت نشد.\"\r\n },\r\n \"props\": {\r\n \"skeletonCount\": 8\r\n }\r\n },\r\n {\r\n \"id\": \"products-category-sidebar\",\r\n \"type\": \"products-category-sidebar\",\r\n \"order\": 99,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"انتخاب و خرید انواع طلا، سکه و شمش\"\r\n },\r\n \"fund\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"fund\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"fund\",\r\n \"title\": \"قلک‌های من\",\r\n \"subtitle\": \"با ساخت قلک، طلایتان را برای اهداف مشخص پس‌انداز کنید\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"fund-mobile-header\",\r\n \"type\": \"fund-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"قلک‌های من\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-report-mode-toggle\",\r\n \"type\": \"fund-report-mode-toggle\",\r\n \"order\": 2,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"fund-asset-report\",\r\n \"type\": \"fund-asset-report\",\r\n \"order\": 3,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"fund-profit-report\",\r\n \"type\": \"fund-profit-report\",\r\n \"order\": 4,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"fund-desktop-report\",\r\n \"type\": \"fund-desktop-report\",\r\n \"order\": 1,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ]\r\n },\r\n \"fund_add\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"fund_add\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"fund_add\",\r\n \"title\": \"ایجاد قلک جدید\",\r\n \"subtitle\": \"ساخت قلک جدید برای پس‌انداز طلا\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"fund-add-mobile-header\",\r\n \"type\": \"fund-add-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ایجاد قلک جدید\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-add-desktop-hero\",\r\n \"type\": \"fund-add-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ایجاد قلک جدید\",\r\n \"subtitle\": \"برای آینده‌ای درخشان، امروز بسازید\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-add-form\",\r\n \"type\": \"fund-add-form\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ساخت قلک\",\r\n \"subtitle\": \"نام، آیکون و هدف قلک را مشخص کنید\"\r\n }\r\n }\r\n ]\r\n },\r\n \"fund_info\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"fund_info\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"fund_info\",\r\n \"title\": \"جزئیات قلک\",\r\n \"subtitle\": \"موجودی، واریز، برداشت و تراکنش‌های قلک\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"fund-info-mobile-header\",\r\n \"type\": \"fund-info-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"جزئیات قلک\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-info-desktop-hero\",\r\n \"type\": \"fund-info-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"جزئیات قلک\",\r\n \"subtitle\": \"موجودی، واریز، برداشت و تراکنش‌های قلک\"\r\n }\r\n },\r\n {\r\n \"id\": \"fund-info-main\",\r\n \"type\": \"fund-info-main\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"تراکنش‌ها\",\r\n \"emptyText\": \"هنوز تراکنشی ثبت نشده\"\r\n }\r\n }\r\n ]\r\n },\r\n \"gold\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"gold\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"gold\",\r\n \"title\": \"خرید و فروش طلا\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"trade-desktop\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"trade-mobile-header\",\r\n \"type\": \"trade-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-price-card\",\r\n \"type\": \"trade-price-card\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-balance-card\",\r\n \"type\": \"trade-balance-card\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-form-panel\",\r\n \"type\": \"trade-form-panel\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-price-chart\",\r\n \"type\": \"trade-price-chart\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-recent-transactions\",\r\n \"type\": \"trade-recent-transactions\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"trade-desktop-card\",\r\n \"type\": \"trade-desktop-card\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"خرید و فروش طلای آبشده با بهترین قیمت بازار\"\r\n },\r\n \"home\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"home\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"home\",\r\n \"title\": \"خانه\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"home-desktop\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"home-header\",\r\n \"type\": \"home-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"vip\"\r\n },\r\n {\r\n \"id\": \"home-mobile-hero\",\r\n \"type\": \"home-mobile-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"home-alerts\",\r\n \"type\": \"home-alerts\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"home-desktop-hero\",\r\n \"type\": \"home-desktop-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"live-price\",\r\n \"type\": \"live-price\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"compact\": true\r\n }\r\n },\r\n {\r\n \"id\": \"quick-access\",\r\n \"type\": \"quick-access\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"variant\": \"auto\",\r\n \"content\": {\r\n \"title\": \"دسترسی سریع\"\r\n }\r\n },\r\n {\r\n \"id\": \"recent-transactions\",\r\n \"type\": \"recent-transactions\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"limit\": 2\r\n },\r\n \"content\": {\r\n \"title\": \"آخرین تراکنش‌ها\",\r\n \"viewAllLabel\": \"مشاهده همه\",\r\n \"emptyText\": \"تراکنشی ثبت نشده است.\"\r\n }\r\n },\r\n {\r\n \"id\": \"home-desktop-lower\",\r\n \"type\": \"home-desktop-lower\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"props\": {\r\n \"transactionLimit\": 4,\r\n \"showBanner\": true\r\n },\r\n \"content\": {\r\n \"title\": \"آخرین تراکنش‌ها\",\r\n \"viewAllLabel\": \"مشاهده همه\",\r\n \"emptyText\": \"تراکنشی ثبت نشده است.\"\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"خلاصه وضعیت حساب و بازار طلا\"\r\n },\r\n \"marketAnalysis\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"marketAnalysis\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"marketAnalysis\",\r\n \"title\": \"تحلیل بازار طلا\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"market-analysis-mobile-header\",\r\n \"type\": \"market-analysis-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"market-analysis-hero\",\r\n \"type\": \"market-analysis-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"تحلیل خودکار بازار طلا\",\r\n \"subtitle\": \"این تحلیل به‌صورت خودکار بر اساس داده‌های واقعی قیمت طلا (روزانه، هفتگی و ماهانه) محاسبه می‌شود و شاخص‌های عددی و پیشنهاد معاملاتی ارائه می‌دهد.\"\r\n }\r\n },\r\n {\r\n \"id\": \"market-analysis-verdict\",\r\n \"type\": \"market-analysis-verdict\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"market-analysis-metrics\",\r\n \"type\": \"market-analysis-metrics\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"market-analysis-insights\",\r\n \"type\": \"market-analysis-insights\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"نکات کلیدی تحلیل\"\r\n }\r\n },\r\n {\r\n \"id\": \"market-analysis-disclaimer\",\r\n \"type\": \"market-analysis-disclaimer\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"تحلیل خودکار بازار طلا بر اساس داده‌های واقعی قیمت\"\r\n },\r\n \"notifyTrigger\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"notifyTrigger\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"notifyTrigger\",\r\n \"title\": \"هشدارهای فعلی\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"price-trigger-mobile-header\",\r\n \"type\": \"price-trigger-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"price-trigger-intro\",\r\n \"type\": \"price-trigger-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت هشدارهای قیمت طلا و نحوه اطلاع‌رسانی\"\r\n }\r\n },\r\n {\r\n \"id\": \"price-trigger-list\",\r\n \"type\": \"price-trigger-list\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 5\r\n }\r\n },\r\n {\r\n \"id\": \"price-trigger-desktop-hero\",\r\n \"type\": \"price-trigger-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"تنظیم و مدیریت هشدارهای قیمت طلا\"\r\n }\r\n },\r\n {\r\n \"id\": \"price-trigger-desktop-grid\",\r\n \"type\": \"price-trigger-desktop-grid\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"تنظیم هشدار قیمت طلا\"\r\n },\r\n \"permissions\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"permissions\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"permissions\",\r\n \"title\": \"مجوز ها\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"permissions-mobile-header\",\r\n \"type\": \"permissions-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"permissions-desktop-hero\",\r\n \"type\": \"permissions-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"جواز کسب و کار و مدارک قانونی\"\r\n }\r\n },\r\n {\r\n \"id\": \"permissions-license-card\",\r\n \"type\": \"permissions-license-card\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مجوزها و دسترسی‌ها\"\r\n },\r\n \"physicalReceive\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"physicalReceive\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"physicalReceive\",\r\n \"title\": \"تحویل فیزیکی\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"physical-receive-mobile-header\",\r\n \"type\": \"physical-receive-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"physical-receive-desktop-hero\",\r\n \"type\": \"physical-receive-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت درخواست‌های دریافت فیزیکی طلا و محصولات\"\r\n }\r\n },\r\n {\r\n \"id\": \"physical-receive-intro\",\r\n \"type\": \"physical-receive-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"مدیریت درخواست‌های دریافت فیزیکی طلا و محصولات\"\r\n }\r\n },\r\n {\r\n \"id\": \"physical-receive-main\",\r\n \"type\": \"physical-receive-main\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"درخواست تحویل فیزیکی طلا\"\r\n },\r\n \"productDeal\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"productDeal\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"productDeal\",\r\n \"title\": \"تکمیل خرید\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"product-deal-mobile-header\",\r\n \"type\": \"product-deal-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"product-deal-main\",\r\n \"type\": \"product-deal-main\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"تکمیل خرید محصول\"\r\n },\r\n \"profitLoss\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"profitLoss\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"profitLoss\",\r\n \"title\": \"سود معاملات شما\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"profit-loss-mobile-header\",\r\n \"type\": \"profit-loss-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"profit-loss-disclaimer\",\r\n \"type\": \"profit-loss-disclaimer\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"profit-loss-metrics-grid\",\r\n \"type\": \"profit-loss-metrics-grid\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"محاسبه سود و زیان معاملات طلای شما\"\r\n },\r\n \"rules\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"rules\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"rules\",\r\n \"title\": \"قوانین و مقررات\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"rules-mobile-header\",\r\n \"type\": \"rules-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"rules-summary-card\",\r\n \"type\": \"rules-summary-card\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"rules-content-panel\",\r\n \"type\": \"rules-content-panel\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"rules-support-actions\",\r\n \"type\": \"rules-support-actions\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"قوانین، مقررات و شرایط استفاده\"\r\n },\r\n \"transactions\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"transactions\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"transactions\",\r\n \"title\": \"تراکنش‌ها\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 22\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"transactions-mobile-header\",\r\n \"type\": \"transactions-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"transactions-tabs\",\r\n \"type\": \"transactions-tabs\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"transactions-filters\",\r\n \"type\": \"transactions-filters\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"transactions-list\",\r\n \"type\": \"transactions-list\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"props\": {\r\n \"skeletonCount\": 6\r\n }\r\n },\r\n {\r\n \"id\": \"transactions-desktop-toolbar\",\r\n \"type\": \"transactions-desktop-toolbar\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"transactions-desktop-panel\",\r\n \"type\": \"transactions-desktop-panel\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مشاهده و پیگیری تراکنش‌های حساب\"\r\n },\r\n \"user\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"user\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"user\",\r\n \"title\": \"پروفایل\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"user-desktop\",\r\n \"gap\": 14\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"user-mobile-header\",\r\n \"type\": \"user-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-profile-hero\",\r\n \"type\": \"user-profile-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"user-wallet-balance\",\r\n \"type\": \"user-wallet-balance\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"user-quick-actions\",\r\n \"type\": \"user-quick-actions\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"mobile\"\r\n },\r\n {\r\n \"id\": \"user-referral\",\r\n \"type\": \"user-referral\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"profile\"\r\n },\r\n {\r\n \"id\": \"user-earn-money-entry\",\r\n \"type\": \"user-earn-money-entry\",\r\n \"order\": 6,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-theme-toggle\",\r\n \"type\": \"user-theme-toggle\",\r\n \"order\": 7,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"profile\"\r\n },\r\n {\r\n \"id\": \"user-menu-list\",\r\n \"type\": \"user-menu-list\",\r\n \"order\": 8,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"variant\": \"profile\"\r\n },\r\n {\r\n \"id\": \"user-desktop-top-row\",\r\n \"type\": \"user-desktop-top-row\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-desktop-stats\",\r\n \"type\": \"user-desktop-stats\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-desktop-quick-actions\",\r\n \"type\": \"user-quick-actions\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"variant\": \"desktop\"\r\n },\r\n {\r\n \"id\": \"user-desktop-referral\",\r\n \"type\": \"user-referral\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"variant\": \"desktop\"\r\n },\r\n {\r\n \"id\": \"user-desktop-earn-money\",\r\n \"type\": \"user-earn-money-entry\",\r\n \"order\": 5,\r\n \"visible\": false,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-invite-banner\",\r\n \"type\": \"user-invite-banner\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"user-desktop-sidebar\",\r\n \"type\": \"user-desktop-sidebar\",\r\n \"order\": 99,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مدیریت اطلاعات حساب، امنیت و تنظیمات شخصی\"\r\n },\r\n \"wallet\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"wallet\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"wallet\",\r\n \"title\": \"کیف پول\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 18\r\n },\r\n \"desktop\": {\r\n \"type\": \"wallet-desktop\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"wallet-mobile-header\",\r\n \"type\": \"wallet-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-withdraw-success\",\r\n \"type\": \"wallet-withdraw-success\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-deposit-stepper\",\r\n \"type\": \"wallet-deposit-stepper\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-deposit-account\",\r\n \"type\": \"wallet-deposit-account\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-mode-toggle\",\r\n \"type\": \"wallet-mode-toggle\",\r\n \"order\": 5,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-balance-hero\",\r\n \"type\": \"wallet-balance-hero\",\r\n \"order\": 6,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-deposit-form\",\r\n \"type\": \"wallet-deposit-form\",\r\n \"order\": 7,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"variant\": \"auto\"\r\n },\r\n {\r\n \"id\": \"wallet-withdraw-form\",\r\n \"type\": \"wallet-withdraw-form\",\r\n \"order\": 8,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"variant\": \"auto\"\r\n },\r\n {\r\n \"id\": \"wallet-desktop-balance-card\",\r\n \"type\": \"wallet-desktop-balance-card\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-desktop-aside\",\r\n \"type\": \"wallet-desktop-aside\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"wallet-desktop-price-chart\",\r\n \"type\": \"wallet-desktop-price-chart\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"مدیریت موجودی و واریز به کیف پول\"\r\n },\r\n \"aboutUs\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"aboutUs\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"aboutUs\",\r\n \"title\": \"درباره ما\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"about-us-mobile-header\",\r\n \"type\": \"about-us-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-us-brand-hero\",\r\n \"type\": \"about-us-brand-hero\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"about-us-garoosi-content\",\r\n \"type\": \"about-us-garoosi-content\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"آشنایی با گروسی گالری\"\r\n },\r\n \"educate\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"educate\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"educate\",\r\n \"title\": \"آموزش نرم افزار\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"educate-mobile-header\",\r\n \"type\": \"educate-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"educate-desktop-hero\",\r\n \"type\": \"educate-desktop-hero\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"subtitle\": \"راهنمای گام‌به‌گام ورود، خرید، فروش و دریافت فیزیکی\"\r\n }\r\n },\r\n {\r\n \"id\": \"educate-sections-content\",\r\n \"type\": \"educate-sections-content\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"educate-support-actions\",\r\n \"type\": \"educate-support-actions\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"راهنمای گام‌به‌گام ورود، خرید، فروش و دریافت فیزیکی\"\r\n },\r\n \"login\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"login\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"login\",\r\n \"title\": \"خوش آمدید\",\r\n \"subtitle\": \"ورود به حساب کاربری\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 0\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 0\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"login-mobile-shell\",\r\n \"type\": \"login-mobile-shell\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"خوش آمدید\"\r\n }\r\n },\r\n {\r\n \"id\": \"login-desktop-shell\",\r\n \"type\": \"login-desktop-shell\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"خوش آمدید\"\r\n }\r\n }\r\n ]\r\n },\r\n \"transaction_detail\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"transaction_detail\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"transaction_detail\",\r\n \"title\": \"جزئیات تراکنش\",\r\n \"subtitle\": \"جزئیات تراکنش\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 12\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"transaction-detail-main\",\r\n \"type\": \"transaction-detail-main\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n }\r\n ]\r\n },\r\n \"earnMoney\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"earnMoney\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"earnMoney\",\r\n \"title\": \"کسب درآمد\",\r\n \"subtitle\": \"کسب درآمد از دعوت دوستان\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 14\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"earn-mobile-header\",\r\n \"type\": \"earn-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ]\r\n },\r\n {\r\n \"id\": \"earn-desktop-header\",\r\n \"type\": \"earn-desktop-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"earn-invite-panel\",\r\n \"type\": \"earn-invite-panel\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"کسب درآمد\",\r\n \"subtitle\": \"هر دعوت موفق ۵ سوت طلا هدیه\"\r\n }\r\n },\r\n {\r\n \"id\": \"earn-gifts-history\",\r\n \"type\": \"earn-gifts-history\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"تاریخچه پاداش‌ها\"\r\n }\r\n },\r\n {\r\n \"id\": \"earn-users-list\",\r\n \"type\": \"earn-users-list\",\r\n \"order\": 4,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"فهرست زیرمجموعه\"\r\n }\r\n }\r\n ]\r\n },\r\n \"giftCard\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"giftCard\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"giftCard\",\r\n \"title\": \"کارت هدیه\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"gift-card-mobile-header\",\r\n \"type\": \"gift-card-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"کارت هدیه\"\r\n }\r\n },\r\n {\r\n \"id\": \"gift-card-desktop-back\",\r\n \"type\": \"gift-card-desktop-back\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"gift-card-intro\",\r\n \"type\": \"gift-card-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"ثبت کارت هدیه\",\r\n \"subtitle\": \"کد دریافتی را وارد کنید تا به موجودی شما اضافه شود\"\r\n }\r\n },\r\n {\r\n \"id\": \"gift-card-form\",\r\n \"type\": \"gift-card-form\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"label\": \"کد کارت هدیه\",\r\n \"placeholder\": \"کد کارت هدیه را وارد کنید\",\r\n \"hint\": \"کد کارت هدیه خود را در فیلد بالا وارد کنید و سپس دکمه ثبت را بزنید.\",\r\n \"submitLabel\": \"ثبت کد\"\r\n }\r\n }\r\n ],\r\n \"subtitle\": \"ثبت کد کارت هدیه طلا\"\r\n },\r\n \"recoverySites\": {\r\n \"schemaId\": \"page\",\r\n \"id\": \"recoverySites\",\r\n \"version\": \"1.0.0\",\r\n \"route\": \"recoverySites\",\r\n \"title\": \"سایت‌های ری‌گیری\",\r\n \"layout\": {\r\n \"mobile\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n },\r\n \"desktop\": {\r\n \"type\": \"stack\",\r\n \"gap\": 16\r\n }\r\n },\r\n \"sections\": [\r\n {\r\n \"id\": \"recovery-sites-mobile-header\",\r\n \"type\": \"recovery-sites-mobile-header\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\"\r\n ],\r\n \"content\": {\r\n \"title\": \"سایت‌های ری‌گیری\"\r\n }\r\n },\r\n {\r\n \"id\": \"recovery-sites-desktop-back\",\r\n \"type\": \"recovery-sites-desktop-back\",\r\n \"order\": 1,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"desktop\"\r\n ]\r\n },\r\n {\r\n \"id\": \"recovery-sites-intro\",\r\n \"type\": \"recovery-sites-intro\",\r\n \"order\": 2,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ],\r\n \"content\": {\r\n \"title\": \"سایت‌های ری‌گیری\",\r\n \"subtitle\": \"دسترسی به سایت‌های مرتبط با ری‌گیری\"\r\n }\r\n },\r\n {\r\n \"id\": \"recovery-sites-list\",\r\n \"type\": \"recovery-sites-list\",\r\n \"order\": 3,\r\n \"visible\": true,\r\n \"platforms\": [\r\n \"mobile\",\r\n \"desktop\"\r\n ]\r\n }\r\n ],\r\n \"subtitle\": \"دسترسی به سایت‌های مرتبط با ری‌گیری\"\r\n }\r\n }\r\n}\r\n" + }, + { + "id": 107, + "name": "zargarisabeti", + "name_fa": "زرگری ثابتی", + "number": "0778747803", + "user_id": null, + "email": null, + "email_verified_at": null, + "password": null, + "remember_token": null, + "google_id": null, + "avatar": "https://nerkh.gold/uploads/avatars/avatar_1784663151.png", + "token": null, + "type": "user", + "agent_of": null, + "callback_url": null, + "user_secret": null, + "api_origin": null, + "api_ip_whitelist": null, + "created_at": null, + "updated_at": "21/7/2026 23:15:51", + "deleted_at": null, + "ip": null, + "domains": "[\"app.zargarisabeti.ir\"]", + "node_server": "https://app.zargarisabeti.ir/server", + "node_ws": null, + "mode": null, + "color": null, + "secondary_color": null, + "background_color": null, + "temp_url": null, + "temp_url_redirect": null, + "domain": null, + "version": "2.0.1", + "app_ui_config": null + } +] \ No newline at end of file diff --git a/prisma/import-users.ts b/prisma/import-users.ts new file mode 100644 index 0000000..4138c64 --- /dev/null +++ b/prisma/import-users.ts @@ -0,0 +1,325 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { Prisma, PrismaClient, ProductType } from '@prisma/client'; + +const prisma = new PrismaClient(); + +type SourceUser = { + id: number; + name: string; + name_fa: string; + number?: string | null; + avatar?: string | null; + domains?: string | string[] | null; + node_server?: string | null; + node_ws?: string | null; + color?: string | null; + secondary_color?: string | null; + background_color?: string | null; + domain?: string | null; + version?: string | null; + app_ui_config?: unknown; + deleted_at?: string | null; + mode?: string | null; +}; + +/** Manual product corrections from SuperAdmin review */ +const FORCE_KHANEGI: Array<{ domain?: string; name?: string; externalId?: number }> = [ + { domain: 'abshodehtabatabaei.ir' }, + { domain: 'boursemes.com' }, + { domain: 'abaeigold.ir' }, + { domain: 'niazitala.ir' }, + { domain: 'garoosigholaktala.ir' }, + { domain: 'kh.kashkolgold.ir' }, + { domain: 'goldsun.zaarbox.ir' }, + { domain: 'goldaliii.com' }, +]; + +/** Canonical public domains after migrations */ +const DOMAIN_OVERRIDES: Record = { + '24gold.app': { + domain: '24gold.ir', + appUrl: 'https://24gold.ir', + nodeServer: 'https://24gold.ir/server', + }, + 'liman.gold': { + domain: 'limangold.ir', + appUrl: 'https://limangold.ir', + nodeServer: 'https://limangold.ir/server', + }, + 'hamkar2.vahid.gold': { + domain: 'vahid.gold', + appUrl: 'https://vahid.gold', + nodeServer: 'https://vahid.gold/server', + }, +}; + +function parseDomains(raw: SourceUser['domains']): string[] { + if (!raw) return []; + try { + const value = typeof raw === 'string' ? JSON.parse(raw) : raw; + if (!Array.isArray(value)) return []; + return value + .map((item) => String(item).trim().toLowerCase()) + .filter(Boolean) + .map((item) => item.replace(/^https?:\/\//, '').split('/')[0]); + } catch { + return []; + } +} + +function isIp(host: string) { + return /^\d{1,3}(\.\d{1,3}){3}$/.test(host); +} + +function hostFromUrl(url?: string | null) { + if (!url) return ''; + return url + .trim() + .toLowerCase() + .replace(/^https?:\/\//, '') + .split('/')[0] + .split(':')[0]; +} + +function classifyProduct(row: SourceUser, domains: string[]): { + product: ProductType; + confident: boolean; + reason: string; +} { + const forced = FORCE_KHANEGI.find((item) => { + if (item.externalId && item.externalId === row.id) return true; + if (item.domain && domains.includes(item.domain)) return true; + return false; + }); + if (forced) { + return { + product: 'khanegi', + confident: true, + reason: `manual override (${forced.domain || forced.externalId})`, + }; + } + + if (domains.some((d) => d.startsWith('app.'))) { + return { product: 'khanegi', confident: true, reason: 'domain starts with app.' }; + } + if (domains.some((d) => d.startsWith('khanegi.'))) { + return { product: 'khanegi', confident: true, reason: 'domain starts with khanegi.' }; + } + if (domains.some((d) => d.startsWith('hamkar.'))) { + return { product: 'hamkar', confident: true, reason: 'domain starts with hamkar.' }; + } + + const nodeHost = hostFromUrl(row.node_server); + if (nodeHost.startsWith('app.')) { + return { + product: 'khanegi', + confident: true, + reason: 'node_server host starts with app.', + }; + } + + // Fallback guess — flagged for manual review + if (row.app_ui_config) { + return { + product: 'khanegi', + confident: false, + reason: 'has app_ui_config but no app./hamkar. domain', + }; + } + + return { + product: 'hamkar', + confident: false, + reason: 'no app./hamkar. domain — defaulted to hamkar', + }; +} + +function pickDomain(product: ProductType, domains: string[], row: SourceUser) { + for (const domain of domains) { + if (DOMAIN_OVERRIDES[domain]) return DOMAIN_OVERRIDES[domain].domain; + } + + const preferredPrefix = product === 'khanegi' ? 'app.' : 'hamkar.'; + const preferred = domains.find((d) => d.startsWith(preferredPrefix)); + if (preferred) return preferred; + + const nonIp = domains.find((d) => !isIp(d)); + if (nonIp) return nonIp; + + const fromNode = hostFromUrl(row.node_server); + if (fromNode && !isIp(fromNode)) return fromNode; + + if (row.domain) return String(row.domain).toLowerCase(); + return domains[0] || `${slugify(row.name)}.local`; +} + +function slugify(value: string) { + return value + .trim() + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^a-z0-9._-]/g, '') + .replace(/\.+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') || 'tenant'; +} + +function avatarUrl(raw?: string | null) { + if (!raw) return null; + if (/^https?:\/\//i.test(raw)) return raw; + return null; +} + +function asUiConfig(value: unknown): Prisma.InputJsonValue | undefined { + if (value == null) return undefined; + if (typeof value === 'string') { + try { + return JSON.parse(value) as Prisma.InputJsonValue; + } catch { + return undefined; + } + } + if (typeof value === 'object') return value as Prisma.InputJsonValue; + return undefined; +} + +async function uniqueSlug(base: string, product: ProductType, externalId: number) { + const candidates = [ + base, + `${base}-${product}`, + `${base}-${product}-${externalId}`, + `${base}-${externalId}`, + ]; + for (const slug of candidates) { + const existing = await prisma.tenant.findUnique({ where: { slug } }); + if (!existing) return slug; + // allow overwrite of previously imported same external id via notes marker + if (existing.notes?.includes(`externalId:${externalId}`)) return slug; + } + return `${base}-${product}-${externalId}-${Date.now()}`; +} + +async function uniqueDomain(preferred: string, externalId: number) { + const candidates = [ + preferred, + `${productSafeHost(preferred)}`, + `id${externalId}.${preferred}`, + `ext-${externalId}.${preferred}`, + ]; + for (const domain of candidates) { + const existing = await prisma.tenant.findUnique({ where: { domain } }); + if (!existing) return domain; + if (existing.notes?.includes(`externalId:${externalId}`)) return domain; + } + return `ext-${externalId}-${Date.now()}.local`; +} + +function productSafeHost(host: string) { + return host; +} + +async function main() { + const file = path.join(__dirname, 'data', 'users.json'); + if (!fs.existsSync(file)) { + throw new Error(`File not found: ${file}`); + } + + const rows = JSON.parse(fs.readFileSync(file, 'utf8')) as SourceUser[]; + const summary = { + total: rows.length, + imported: 0, + skippedDeleted: 0, + hamkar: 0, + khanegi: 0, + uncertain: 0, + withUiConfig: 0, + }; + + for (const row of rows) { + if (row.deleted_at) { + summary.skippedDeleted += 1; + continue; + } + + const domains = parseDomains(row.domains); + const { product, confident, reason } = classifyProduct(row, domains); + const baseSlug = slugify(row.name); + const slug = await uniqueSlug(baseSlug, product, row.id); + const preferredDomain = pickDomain(product, domains, row); + const domain = await uniqueDomain(preferredDomain, row.id); + const ui = asUiConfig(row.app_ui_config); + const domainOverride = + DOMAIN_OVERRIDES[domain] || + domains.map((d) => DOMAIN_OVERRIDES[d]).find(Boolean); + + const notes = [ + `externalId:${row.id}`, + `import:users.json`, + `classify:${reason}`, + confident ? 'classifyConfidence:high' : 'classifyConfidence:low', + row.number ? `phone:${row.number}` : null, + row.version ? `version:${row.version}` : null, + row.mode ? `mode:${row.mode}` : null, + ] + .filter(Boolean) + .join(' | '); + + const data = { + product, + slug, + nameFa: (row.name_fa || row.name).replace(/\s+/g, ' ').trim(), + nameEn: row.name, + domain: domainOverride?.domain || domain, + domains: domains as unknown as Prisma.InputJsonValue, + avatarUrl: avatarUrl(row.avatar), + primaryColor: row.color || (product === 'hamkar' ? '#20c997' : '#ffb84d'), + secondaryColor: row.secondary_color || null, + backgroundColor: row.background_color || '#ffffff', + nodeServer: + domainOverride?.nodeServer || row.node_server || `https://${domain}/server`, + nodeWs: row.node_ws || null, + appUrl: + domainOverride?.appUrl || domains.find((d) => !isIp(d)) || domain, + adminUrl: null as string | null, + appUiConfig: ui, + isActive: true, + notes, + }; + + const existingByNotes = await prisma.tenant.findFirst({ + where: { notes: { contains: `externalId:${row.id}` } }, + }); + + if (existingByNotes) { + await prisma.tenant.update({ + where: { id: existingByNotes.id }, + data, + }); + } else { + // Prefer update by slug if this is a known seed like bakhtargold + const bySlug = await prisma.tenant.findUnique({ where: { slug } }); + if (bySlug) { + await prisma.tenant.update({ where: { id: bySlug.id }, data }); + } else { + await prisma.tenant.create({ data }); + } + } + + summary.imported += 1; + summary[product] += 1; + if (!confident) summary.uncertain += 1; + if (ui) summary.withUiConfig += 1; + } + + console.log('Import finished:', summary); +} + +main() + .catch((error) => { + console.error(error); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/prisma/migrations/20260723073638_sms_settings_cache/migration.sql b/prisma/migrations/20260723073638_sms_settings_cache/migration.sql new file mode 100644 index 0000000..7d8765c --- /dev/null +++ b/prisma/migrations/20260723073638_sms_settings_cache/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "tenants" ADD COLUMN "sms_settings_cache" JSONB; +ALTER TABLE "tenants" ADD COLUMN "sms_synced_at" DATETIME; diff --git a/prisma/migrations/20260723143623_sms_accounts_owned/migration.sql b/prisma/migrations/20260723143623_sms_accounts_owned/migration.sql new file mode 100644 index 0000000..c5acd3d --- /dev/null +++ b/prisma/migrations/20260723143623_sms_accounts_owned/migration.sql @@ -0,0 +1,49 @@ +-- CreateTable +CREATE TABLE "sms_accounts" ( + "id" TEXT NOT NULL PRIMARY KEY, + "tenant_id" TEXT NOT NULL, + "balance_rials" INTEGER NOT NULL DEFAULT 0, + "price_per_part_rials" INTEGER NOT NULL DEFAULT 2500, + "is_blocked" BOOLEAN NOT NULL DEFAULT false, + "alert_critical_rials" INTEGER NOT NULL DEFAULT 10000, + "alert_warning_rials" INTEGER NOT NULL DEFAULT 100000, + "gateway_provider" TEXT, + "melipayamak_user" TEXT, + "melipayamak_password" TEXT, + "melipayamak_from" TEXT, + "panel_username" TEXT, + "panel_password" TEXT, + "panel_from" TEXT, + "extra_settings" JSONB, + "today_messages" INTEGER NOT NULL DEFAULT 0, + "today_parts" INTEGER NOT NULL DEFAULT 0, + "today_cost_rials" INTEGER NOT NULL DEFAULT 0, + "month_messages" INTEGER NOT NULL DEFAULT 0, + "month_parts" INTEGER NOT NULL DEFAULT 0, + "month_cost_rials" INTEGER NOT NULL DEFAULT 0, + "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" DATETIME NOT NULL, + CONSTRAINT "sms_accounts_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "sms_ledgers" ( + "id" TEXT NOT NULL PRIMARY KEY, + "sms_account_id" TEXT NOT NULL, + "type" TEXT NOT NULL, + "amount_rials" INTEGER NOT NULL, + "parts" INTEGER, + "note" TEXT, + "created_by_id" TEXT, + "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT "sms_ledgers_sms_account_id_fkey" FOREIGN KEY ("sms_account_id") REFERENCES "sms_accounts" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateIndex +CREATE UNIQUE INDEX "sms_accounts_tenant_id_key" ON "sms_accounts"("tenant_id"); + +-- CreateIndex +CREATE INDEX "sms_ledgers_sms_account_id_idx" ON "sms_ledgers"("sms_account_id"); + +-- CreateIndex +CREATE INDEX "sms_ledgers_created_at_idx" ON "sms_ledgers"("created_at"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0591dbb..de561c6 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -18,6 +18,12 @@ enum UserRole { viewer } +enum SmsLedgerType { + charge + debit + adjust +} + model User { id String @id @default(cuid()) email String @unique @@ -49,6 +55,9 @@ model Tenant { appUrl String? @map("app_url") adminUrl String? @map("admin_url") remoteApiToken String? @map("remote_api_token") + /// Legacy cache from older sync attempts — SuperAdmin SMS account is now source of truth + smsSettingsCache Json? @map("sms_settings_cache") + smsSyncedAt DateTime? @map("sms_synced_at") /// Full Khanegi UI JSON (theme, navigation, pages). Hamkar: unused for now. appUiConfig Json? @map("app_ui_config") isActive Boolean @default(true) @map("is_active") @@ -56,12 +65,65 @@ model Tenant { createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") auditLogs AuditLog[] + smsAccount SmsAccount? @@index([product]) @@index([isActive]) @@map("tenants") } +/// SuperAdmin-owned SMS wallet + gateway config per sold version. +/// Does NOT replace Hamkar/Khanegi internal SMS panels yet. +model SmsAccount { + id String @id @default(cuid()) + tenantId String @unique @map("tenant_id") + balanceRials Int @default(0) @map("balance_rials") + pricePerPartRials Int @default(2500) @map("price_per_part_rials") + isBlocked Boolean @default(false) @map("is_blocked") + /// below this => red/critical + alertCriticalRials Int @default(10000) @map("alert_critical_rials") + /// at/below this (and above critical) => yellow; above => green + alertWarningRials Int @default(100000) @map("alert_warning_rials") + gatewayProvider String? @map("gateway_provider") + melipayamakUser String? @map("melipayamak_user") + melipayamakPassword String? @map("melipayamak_password") + melipayamakFrom String? @map("melipayamak_from") + panelUsername String? @map("panel_username") + panelPassword String? @map("panel_password") + panelFrom String? @map("panel_from") + extraSettings Json? @map("extra_settings") + todayMessages Int @default(0) @map("today_messages") + todayParts Int @default(0) @map("today_parts") + todayCostRials Int @default(0) @map("today_cost_rials") + monthMessages Int @default(0) @map("month_messages") + monthParts Int @default(0) @map("month_parts") + monthCostRials Int @default(0) @map("month_cost_rials") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) + ledgers SmsLedger[] + + @@map("sms_accounts") +} + +model SmsLedger { + id String @id @default(cuid()) + smsAccountId String @map("sms_account_id") + type SmsLedgerType + amountRials Int @map("amount_rials") + parts Int? + note String? + createdById String? @map("created_by_id") + createdAt DateTime @default(now()) @map("created_at") + + smsAccount SmsAccount @relation(fields: [smsAccountId], references: [id], onDelete: Cascade) + + @@index([smsAccountId]) + @@index([createdAt]) + @@map("sms_ledgers") +} + model AuditLog { id String @id @default(cuid()) action String diff --git a/prisma/seed.ts b/prisma/seed.ts index 0524762..a91a990 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -22,30 +22,68 @@ async function main() { }, }); - const sample = await prisma.tenant.upsert({ - where: { slug: 'demo-hamkar' }, - update: {}, + // Extracted from Hamkar SettingsSeeder (bakhtargold) — real project defaults found in code + const bakhtarSmsValues = { + name_fa: 'باختر گلد', + name_en: 'bakhtargold', + app_url: 'bakhtargold.com', + admin_url: 'https://bakhtargold.com/admin', + sms_long: 'true', + sms_panel: '', + melipayamak_user: '', + melipayamak_password: '', + melipayamak_from: '', + sms_panel_username: '', + sms_panel_password: '', + sms_panel_from: '', + send_sms_on_customer_order: '', + sms_charge_card: '', + sms_charge_iban: '', + sms_charge_account_holder: '', + sms_charge_instruction: '', + }; + + const bakhtar = await prisma.tenant.upsert({ + where: { slug: 'bakhtargold' }, + update: { + nameFa: bakhtarSmsValues.name_fa, + nameEn: bakhtarSmsValues.name_en, + domain: 'bakhtargold.com', + appUrl: bakhtarSmsValues.app_url, + adminUrl: bakhtarSmsValues.admin_url, + smsSettingsCache: { + values: bakhtarSmsValues, + wallet: null, + source: 'hamkar/database/seeders/SettingsSeeder.php', + syncedAt: new Date().toISOString(), + note: 'استخراج از سیدر کد؛ برای داده زنده DB باید همگام‌سازی MySQL انجام شود', + }, + smsSyncedAt: new Date(), + }, create: { product: 'hamkar', - slug: 'demo-hamkar', - nameFa: 'نسخه دمو همکار', - nameEn: 'Demo Hamkar', - domain: 'demo-hamkar.local', - avatarUrl: null, - primaryColor: '#1d4ed8', - secondaryColor: '#0f172a', - backgroundColor: '#ffffff', - nodeServer: 'https://demo-hamkar.local/server', - nodeWs: 'wss://demo-hamkar.local/prc/ws', - appUrl: 'https://demo-hamkar.local', - adminUrl: 'https://demo-hamkar.local/admin', + slug: 'bakhtargold', + nameFa: bakhtarSmsValues.name_fa, + nameEn: bakhtarSmsValues.name_en, + domain: 'bakhtargold.com', + primaryColor: '#20c997', + nodeServer: 'https://bakhtargold.com/server', + appUrl: bakhtarSmsValues.app_url, + adminUrl: bakhtarSmsValues.admin_url, isActive: true, - notes: 'نمونه اولیه برای تست اسکفولد', + notes: 'نسخه استخراج‌شده از کد/سیدر همکار', + smsSettingsCache: { + values: bakhtarSmsValues, + wallet: null, + source: 'hamkar/database/seeders/SettingsSeeder.php', + syncedAt: new Date().toISOString(), + }, + smsSyncedAt: new Date(), }, }); console.log('Seeded admin:', { id: user.id, email: user.email }); - console.log('Seeded tenant:', { id: sample.id, slug: sample.slug }); + console.log('Seeded tenant:', { id: bakhtar.id, slug: bakhtar.slug }); console.log('Login with:', email, '/', password); } diff --git a/src/app.module.ts b/src/app.module.ts index 886857e..f87dcd8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -6,6 +6,7 @@ import { TenantsModule } from './tenants/tenants.module'; import { GetUserModule } from './get-user/get-user.module'; import { SettingsProxyModule } from './settings-proxy/settings-proxy.module'; import { AuditModule } from './audit/audit.module'; +import { SmsModule } from './sms/sms.module'; import { HealthController } from './health.controller'; @Module({ @@ -17,6 +18,7 @@ import { HealthController } from './health.controller'; GetUserModule, SettingsProxyModule, AuditModule, + SmsModule, ], controllers: [HealthController], }) diff --git a/src/get-user/get-user.service.ts b/src/get-user/get-user.service.ts index ee8e03a..6b59181 100644 --- a/src/get-user/get-user.service.ts +++ b/src/get-user/get-user.service.ts @@ -11,17 +11,11 @@ export class GetUserService { throw new NotFoundException('domain required'); } - const tenant = await this.prisma.tenant.findFirst({ - where: { - isActive: true, - OR: [ - { domain: host }, - { domain: host.replace(/^www\./, '') }, - { domain: `www.${host.replace(/^www\./, '')}` }, - ], - }, + const tenants = await this.prisma.tenant.findMany({ + where: { isActive: true }, }); + const tenant = tenants.find((item) => this.matchesHost(item, host)); if (!tenant) { throw new NotFoundException('tenant not found for domain'); } @@ -31,7 +25,7 @@ export class GetUserService { const branding = { id: tenant.id, - name: tenant.slug, + name: tenant.nameEn || tenant.slug, name_fa: tenant.nameFa, name_en: tenant.nameEn, avatar: tenant.avatarUrl, @@ -43,7 +37,7 @@ export class GetUserService { app_url: tenant.appUrl, admin_url: tenant.adminUrl, product: tenant.product, - theme: ui?.app?.theme?.mode === 'light' ? 'dynamicMode' : 'dynamicMode', + theme: 'dynamicMode', mode: 'dynamicMode', app_ui_config: tenant.product === 'khanegi' ? ui : undefined, }; @@ -54,6 +48,38 @@ export class GetUserService { }; } + private matchesHost( + tenant: { + domain: string; + domains: unknown; + }, + host: string, + ) { + const candidates = new Set(); + for (const value of [tenant.domain, ...this.readDomains(tenant.domains)]) { + const normalized = this.normalizeHost(value); + if (!normalized) continue; + candidates.add(normalized); + candidates.add(normalized.replace(/^www\./, '')); + candidates.add(`www.${normalized.replace(/^www\./, '')}`); + } + return candidates.has(host) || candidates.has(host.replace(/^www\./, '')); + } + + private readDomains(raw: unknown): string[] { + if (!raw) return []; + if (Array.isArray(raw)) return raw.map(String); + if (typeof raw === 'string') { + try { + const parsed = JSON.parse(raw); + return Array.isArray(parsed) ? parsed.map(String) : []; + } catch { + return []; + } + } + return []; + } + private normalizeHost(value: string) { return value .trim() diff --git a/src/sms/dto/sms-account.dto.ts b/src/sms/dto/sms-account.dto.ts new file mode 100644 index 0000000..21fdbb0 --- /dev/null +++ b/src/sms/dto/sms-account.dto.ts @@ -0,0 +1,63 @@ +import { IsBoolean, IsInt, IsObject, IsOptional, IsString, Min } from 'class-validator'; + +export class UpdateSmsAccountDto { + @IsOptional() + @IsInt() + @Min(0) + pricePerPartRials?: number; + + @IsOptional() + @IsBoolean() + isBlocked?: boolean; + + @IsOptional() + @IsInt() + @Min(0) + alertCriticalRials?: number; + + @IsOptional() + @IsInt() + @Min(0) + alertWarningRials?: number; + + @IsOptional() + @IsString() + gatewayProvider?: string; + + @IsOptional() + @IsString() + melipayamakUser?: string; + + @IsOptional() + @IsString() + melipayamakPassword?: string; + + @IsOptional() + @IsString() + melipayamakFrom?: string; + + @IsOptional() + @IsString() + panelUsername?: string; + + @IsOptional() + @IsString() + panelPassword?: string; + + @IsOptional() + @IsString() + panelFrom?: string; + + @IsOptional() + @IsObject() + extraSettings?: Record; +} + +export class ChargeSmsWalletDto { + @IsInt() + amountRials!: number; + + @IsOptional() + @IsString() + note?: string; +} diff --git a/src/sms/sms-keys.ts b/src/sms/sms-keys.ts new file mode 100644 index 0000000..c39ce43 --- /dev/null +++ b/src/sms/sms-keys.ts @@ -0,0 +1,142 @@ +export type SmsKeyDef = { + key: string + label: string + group: 'provider' | 'billing' | 'feature' | 'charge' + secret?: boolean + hint?: string + products: Array<'hamkar' | 'khanegi' | 'both'> +} + +/** Catalog only — does not change Hamkar/Khanegi code. */ +export const SMS_KEY_CATALOG: SmsKeyDef[] = [ + { + key: 'sms_panel', + label: 'حالت پنل / billing', + group: 'provider', + hint: 'همکار: central یا me | خانگی: true/false', + products: ['both'], + }, + { + key: 'melipayamak_user', + label: 'ملی‌پیامک — کاربر', + group: 'provider', + products: ['both'], + }, + { + key: 'melipayamak_password', + label: 'ملی‌پیامک — رمز', + group: 'provider', + secret: true, + products: ['both'], + }, + { + key: 'melipayamak_from', + label: 'ملی‌پیامک — فرستنده', + group: 'provider', + products: ['both'], + }, + { + key: 'sms_panel_username', + label: '0098 — کاربر', + group: 'provider', + hint: 'فقط همکار وقتی sms_panel=me', + products: ['hamkar'], + }, + { + key: 'sms_panel_password', + label: '0098 — رمز', + group: 'provider', + secret: true, + products: ['hamkar'], + }, + { + key: 'sms_panel_from', + label: '0098 — فرستنده', + group: 'provider', + products: ['hamkar'], + }, + { + key: 'sms_long', + label: 'پیامک طولانی', + group: 'feature', + products: ['hamkar'], + }, + { + key: 'send_sms_on_customer_order', + label: 'ارسال با سفارش مشتری', + group: 'feature', + products: ['hamkar'], + }, + { + key: 'group_sms', + label: 'ارسال گروهی', + group: 'feature', + products: ['khanegi'], + }, + { + key: 'charge_notif', + label: 'اعلان شارژ کیف پول', + group: 'feature', + products: ['khanegi'], + }, + { + key: 'sms_charge_card', + label: 'کارت شارژ', + group: 'charge', + products: ['hamkar'], + }, + { + key: 'sms_charge_iban', + label: 'شبا شارژ', + group: 'charge', + products: ['hamkar'], + }, + { + key: 'sms_charge_account_holder', + label: 'صاحب حساب', + group: 'charge', + products: ['hamkar'], + }, + { + key: 'sms_charge_instruction', + label: 'راهنمای شارژ', + group: 'charge', + products: ['hamkar'], + }, + { + key: 'sms_charge_card_number', + label: 'شماره کارت شارژ', + group: 'charge', + products: ['khanegi'], + }, + { + key: 'sms_charge_sheba', + label: 'شبا شارژ', + group: 'charge', + products: ['khanegi'], + }, + { + key: 'sms_charge_account_holder', + label: 'صاحب حساب', + group: 'charge', + products: ['khanegi'], + }, + { + key: 'sms_charge_note', + label: 'توضیح شارژ', + group: 'charge', + products: ['khanegi'], + }, + { + key: 'name_en', + label: 'نام لاتین (host در API مرکزی)', + group: 'provider', + products: ['both'], + }, +] + +export function catalogForProduct(product: 'hamkar' | 'khanegi') { + return SMS_KEY_CATALOG.filter( + (k) => k.products.includes('both') || k.products.includes(product), + ) +} diff --git a/src/sms/sms.controller.ts b/src/sms/sms.controller.ts new file mode 100644 index 0000000..e2ba1b8 --- /dev/null +++ b/src/sms/sms.controller.ts @@ -0,0 +1,54 @@ +import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { CurrentUser } from '../auth/current-user.decorator'; +import { ChargeSmsWalletDto, UpdateSmsAccountDto } from './dto/sms-account.dto'; +import { SmsService } from './sms.service'; + +@Controller('sms') +@UseGuards(JwtAuthGuard) +export class SmsController { + constructor(private readonly smsService: SmsService) {} + + @Get('tenants') + listTenants() { + return this.smsService.listTenants(); + } + + @Get('lowest') + lowest(@Query('limit') limit?: string) { + return this.smsService.getLowestBalances(Number(limit) || 5); + } + + @Get('tenants/:id') + getAccount(@Param('id') id: string) { + return this.smsService.getAccount(id); + } + + @Patch('tenants/:id') + updateAccount( + @Param('id') id: string, + @Body() dto: UpdateSmsAccountDto, + @CurrentUser() user: { id: string }, + ) { + return this.smsService.updateAccount(id, dto, user.id); + } + + @Post('tenants/:id/charge') + charge( + @Param('id') id: string, + @Body() dto: ChargeSmsWalletDto, + @CurrentUser() user: { id: string }, + ) { + return this.smsService.chargeWallet(id, dto, user.id); + } + + @Post('tenants/:id/block') + block(@Param('id') id: string, @CurrentUser() user: { id: string }) { + return this.smsService.setBlocked(id, true, user.id); + } + + @Post('tenants/:id/unblock') + unblock(@Param('id') id: string, @CurrentUser() user: { id: string }) { + return this.smsService.setBlocked(id, false, user.id); + } +} diff --git a/src/sms/sms.module.ts b/src/sms/sms.module.ts new file mode 100644 index 0000000..27f7b45 --- /dev/null +++ b/src/sms/sms.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { SmsController } from './sms.controller'; +import { SmsService } from './sms.service'; + +@Module({ + controllers: [SmsController], + providers: [SmsService], + exports: [SmsService], +}) +export class SmsModule {} diff --git a/src/sms/sms.service.ts b/src/sms/sms.service.ts new file mode 100644 index 0000000..814583e --- /dev/null +++ b/src/sms/sms.service.ts @@ -0,0 +1,284 @@ +import { + BadRequestException, + Injectable, + NotFoundException, +} from '@nestjs/common'; +import { Prisma, SmsAccount } from '@prisma/client'; +import { PrismaService } from '../prisma/prisma.service'; +import { AuditService } from '../audit/audit.service'; +import { ChargeSmsWalletDto, UpdateSmsAccountDto } from './dto/sms-account.dto'; + +type BalanceLevel = 'healthy' | 'warning' | 'critical' | 'unknown'; + +@Injectable() +export class SmsService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + ) {} + + async listTenants() { + await this.ensureAccountsForAllTenants(); + + const rows = await this.prisma.tenant.findMany({ + where: { isActive: true }, + orderBy: [{ product: 'asc' }, { nameFa: 'asc' }], + include: { smsAccount: true }, + }); + + return rows.map((tenant) => { + const account = tenant.smsAccount!; + return { + id: tenant.id, + product: tenant.product, + slug: tenant.slug, + nameFa: tenant.nameFa, + nameEn: tenant.nameEn, + domain: tenant.domain, + avatarUrl: tenant.avatarUrl, + isActive: tenant.isActive, + isBlocked: account.isBlocked, + sms: this.toSummary(account), + }; + }); + } + + async getLowestBalances(limit = 5) { + const rows = await this.listTenants(); + return [...rows] + .sort((a, b) => a.sms.balanceRials - b.sms.balanceRials) + .slice(0, limit); + } + + async getAccount(tenantId: string) { + const tenant = await this.requireTenant(tenantId); + const account = await this.ensureAccount(tenant.id); + const ledgers = await this.prisma.smsLedger.findMany({ + where: { smsAccountId: account.id }, + orderBy: { createdAt: 'desc' }, + take: 20, + }); + + return { + tenant: { + id: tenant.id, + product: tenant.product, + slug: tenant.slug, + nameFa: tenant.nameFa, + nameEn: tenant.nameEn, + domain: tenant.domain, + avatarUrl: tenant.avatarUrl, + }, + account: { + id: account.id, + balanceRials: account.balanceRials, + pricePerPartRials: account.pricePerPartRials, + isBlocked: account.isBlocked, + alertCriticalRials: account.alertCriticalRials, + alertWarningRials: account.alertWarningRials, + gatewayProvider: account.gatewayProvider, + melipayamakUser: account.melipayamakUser, + melipayamakPassword: account.melipayamakPassword, + melipayamakFrom: account.melipayamakFrom, + panelUsername: account.panelUsername, + panelPassword: account.panelPassword, + panelFrom: account.panelFrom, + extraSettings: (account.extraSettings as Record) || {}, + todayMessages: account.todayMessages, + todayParts: account.todayParts, + todayCostRials: account.todayCostRials, + monthMessages: account.monthMessages, + monthParts: account.monthParts, + monthCostRials: account.monthCostRials, + }, + summary: this.toSummary(account), + ledgers, + safeNote: + 'این پنل متعلق به سوپرادمین است و فعلاً پنل پیامکی داخل همکار/خانگی را تغییر نمی‌دهد.', + }; + } + + async updateAccount(tenantId: string, dto: UpdateSmsAccountDto, userId?: string) { + const account = await this.ensureAccount(tenantId); + const before = { ...account }; + + if ( + dto.alertCriticalRials != null && + dto.alertWarningRials != null && + dto.alertCriticalRials > dto.alertWarningRials + ) { + throw new BadRequestException('آستانه قرمز نباید از آستانه زرد بزرگ‌تر باشد'); + } + + const updated = await this.prisma.smsAccount.update({ + where: { id: account.id }, + data: { + pricePerPartRials: dto.pricePerPartRials ?? undefined, + isBlocked: dto.isBlocked ?? undefined, + alertCriticalRials: dto.alertCriticalRials ?? undefined, + alertWarningRials: dto.alertWarningRials ?? undefined, + gatewayProvider: dto.gatewayProvider ?? undefined, + melipayamakUser: dto.melipayamakUser ?? undefined, + melipayamakPassword: dto.melipayamakPassword ?? undefined, + melipayamakFrom: dto.melipayamakFrom ?? undefined, + panelUsername: dto.panelUsername ?? undefined, + panelPassword: dto.panelPassword ?? undefined, + panelFrom: dto.panelFrom ?? undefined, + extraSettings: + dto.extraSettings === undefined + ? undefined + : (dto.extraSettings as Prisma.InputJsonValue), + }, + }); + + await this.audit.log({ + action: 'sms.account.update', + entityType: 'sms_account', + entityId: updated.id, + tenantId, + userId, + before: this.publicAccount(before) as unknown as Prisma.InputJsonValue, + after: this.publicAccount(updated) as unknown as Prisma.InputJsonValue, + }); + + return this.getAccount(tenantId); + } + + async chargeWallet(tenantId: string, dto: ChargeSmsWalletDto, userId?: string) { + if (!dto.amountRials || dto.amountRials === 0) { + throw new BadRequestException('مبلغ شارژ نامعتبر است'); + } + + const account = await this.ensureAccount(tenantId); + const nextBalance = account.balanceRials + dto.amountRials; + if (nextBalance < 0) { + throw new BadRequestException('موجودی نمی‌تواند منفی شود'); + } + + const type = dto.amountRials > 0 ? 'charge' : 'adjust'; + + const [updated] = await this.prisma.$transaction([ + this.prisma.smsAccount.update({ + where: { id: account.id }, + data: { balanceRials: nextBalance }, + }), + this.prisma.smsLedger.create({ + data: { + smsAccountId: account.id, + type, + amountRials: dto.amountRials, + note: dto.note || (dto.amountRials > 0 ? 'شارژ کیف پول' : 'اصلاح موجودی'), + createdById: userId, + }, + }), + ]); + + await this.audit.log({ + action: 'sms.wallet.charge', + entityType: 'sms_account', + entityId: account.id, + tenantId, + userId, + after: { + amountRials: dto.amountRials, + balanceRials: updated.balanceRials, + note: dto.note || null, + } as unknown as Prisma.InputJsonValue, + }); + + return this.getAccount(tenantId); + } + + async setBlocked(tenantId: string, isBlocked: boolean, userId?: string) { + return this.updateAccount(tenantId, { isBlocked }, userId); + } + + private async ensureAccountsForAllTenants() { + const tenants = await this.prisma.tenant.findMany({ + where: { smsAccount: null }, + select: { id: true }, + }); + for (const tenant of tenants) { + await this.ensureAccount(tenant.id); + } + } + + private async ensureAccount(tenantId: string) { + await this.requireTenant(tenantId); + const existing = await this.prisma.smsAccount.findUnique({ where: { tenantId } }); + if (existing) return existing; + + // Seed varied demo balances so color cards are visible until real charges exist + const demoBalances = [250000, 85000, 7500, 150000, 12000, 3000, 500000, 45000]; + const hash = [...tenantId].reduce((sum, ch) => sum + ch.charCodeAt(0), 0); + const balanceRials = demoBalances[hash % demoBalances.length]; + + return this.prisma.smsAccount.create({ + data: { + tenantId, + balanceRials, + pricePerPartRials: 2500, + alertCriticalRials: 10000, + alertWarningRials: 100000, + }, + }); + } + + private toSummary(account: SmsAccount) { + const level = this.balanceLevel( + account.balanceRials, + account.alertCriticalRials, + account.alertWarningRials, + ); + return { + balanceRials: account.balanceRials, + balanceLabel: this.formatMoney(account.balanceRials), + balanceLevel: level, + perPartRials: account.pricePerPartRials, + todayMessages: account.todayMessages, + todayParts: account.todayParts, + todayCostRials: account.todayCostRials, + monthMessages: account.monthMessages, + monthParts: account.monthParts, + monthCostRials: account.monthCostRials, + isBlocked: account.isBlocked, + alertCriticalRials: account.alertCriticalRials, + alertWarningRials: account.alertWarningRials, + }; + } + + private balanceLevel( + balanceRials: number, + critical = 10000, + warning = 100000, + ): BalanceLevel { + if (balanceRials < critical) return 'critical'; + if (balanceRials <= warning) return 'warning'; + return 'healthy'; + } + + private formatMoney(value: number) { + return `${new Intl.NumberFormat('fa-IR').format(value)} ریال`; + } + + private publicAccount(account: SmsAccount) { + return { + balanceRials: account.balanceRials, + pricePerPartRials: account.pricePerPartRials, + isBlocked: account.isBlocked, + alertCriticalRials: account.alertCriticalRials, + alertWarningRials: account.alertWarningRials, + gatewayProvider: account.gatewayProvider, + melipayamakUser: account.melipayamakUser, + melipayamakFrom: account.melipayamakFrom, + panelUsername: account.panelUsername, + panelFrom: account.panelFrom, + }; + } + + private async requireTenant(tenantId: string) { + const tenant = await this.prisma.tenant.findUnique({ where: { id: tenantId } }); + if (!tenant) throw new NotFoundException('نسخه یافت نشد'); + return tenant; + } +} diff --git a/src/tenants/tenants.service.ts b/src/tenants/tenants.service.ts index bc60404..5826caf 100644 --- a/src/tenants/tenants.service.ts +++ b/src/tenants/tenants.service.ts @@ -17,9 +17,9 @@ export class TenantsService { ) {} async findAll(product?: ProductType) { - return this.prisma.tenant.findMany({ + const rows = await this.prisma.tenant.findMany({ where: product ? { product } : undefined, - orderBy: { createdAt: 'desc' }, + orderBy: { nameFa: 'asc' }, select: { id: true, product: true, @@ -35,12 +35,18 @@ export class TenantsService { nodeWs: true, appUrl: true, adminUrl: true, + appUiConfig: true, isActive: true, notes: true, createdAt: true, updatedAt: true, }, }); + + return rows.map(({ appUiConfig, ...rest }) => ({ + ...rest, + hasAppUiConfig: Boolean(appUiConfig), + })); } async findOne(id: string) { diff --git a/tsconfig.json b/tsconfig.json index 57f9635..059e9ce 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,6 @@ "target": "ES2023", "sourceMap": true, "outDir": "./dist", - "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": true,