From 20d6c5b29449b2d065d7acd59973765a5c707ba7 Mon Sep 17 00:00:00 2001 From: Matin Date: Sun, 16 Feb 2025 16:30:17 +0330 Subject: [PATCH] chore: discount module --- database/data/json/ostan.json | 33 + database/data/json/shahr.json | 1326 +++++++++++++++++ src/common/enums/message.enum.ts | 14 +- src/modules/address/address.controller.ts | 0 src/modules/address/address.module.ts | 0 .../address/entities/address.entity.ts | 0 src/modules/address/entities/city.entity.ts | 0 .../discounts/DTO/create-discount.dto.ts | 11 +- src/modules/discounts/discounts.controller.ts | 9 + src/modules/discounts/discounts.module.ts | 5 +- .../discounts/entities/discount.entity.ts | 12 +- .../discounts/providers/discounts.service.ts | 73 +- .../DTO/apply-discount-invoice.dto.ts | 13 + .../invoices/entities/invoice.entity.ts | 6 + src/modules/invoices/invoices.module.ts | 6 +- .../invoices/providers/invoices.service.ts | 63 + .../entities/subscription.entity.ts | 6 +- .../subscriptions/subscriptions.module.ts | 2 +- .../users/DTO/create-legal-user.dto.ts | 32 + ...nancial.dto.ts => create-real-user.dto.ts} | 11 +- .../users/entities/legal-user.entity.ts | 24 + .../users/entities/real-user.entity.ts | 26 + .../users/entities/user-financial.entity.ts | 31 - src/modules/users/entities/user.entity.ts | 14 +- src/modules/users/enums/gender-type.enum.ts | 4 + src/modules/users/providers/users.service.ts | 91 +- .../repositories/legal-user.repository.ts | 12 + .../repositories/real-user.repository.ts | 12 + .../repositories/user-financial.repository.ts | 12 - src/modules/users/users.controller.ts | 32 +- src/modules/users/users.module.ts | 13 +- 31 files changed, 1752 insertions(+), 141 deletions(-) create mode 100644 database/data/json/ostan.json create mode 100644 database/data/json/shahr.json create mode 100644 src/modules/address/address.controller.ts create mode 100644 src/modules/address/address.module.ts create mode 100644 src/modules/address/entities/address.entity.ts create mode 100644 src/modules/address/entities/city.entity.ts create mode 100644 src/modules/invoices/DTO/apply-discount-invoice.dto.ts create mode 100644 src/modules/users/DTO/create-legal-user.dto.ts rename src/modules/users/DTO/{create-user-financial.dto.ts => create-real-user.dto.ts} (76%) create mode 100644 src/modules/users/entities/legal-user.entity.ts create mode 100644 src/modules/users/entities/real-user.entity.ts delete mode 100644 src/modules/users/entities/user-financial.entity.ts create mode 100644 src/modules/users/enums/gender-type.enum.ts create mode 100644 src/modules/users/repositories/legal-user.repository.ts create mode 100644 src/modules/users/repositories/real-user.repository.ts delete mode 100644 src/modules/users/repositories/user-financial.repository.ts diff --git a/database/data/json/ostan.json b/database/data/json/ostan.json new file mode 100644 index 0000000..9151c82 --- /dev/null +++ b/database/data/json/ostan.json @@ -0,0 +1,33 @@ +[ + { "id": 1, "name": "آذربایجان شرقی" }, + { "id": 2, "name": "آذربایجان غربی" }, + { "id": 3, "name": "اردبیل" }, + { "id": 4, "name": "اصفهان" }, + { "id": 5, "name": "البرز" }, + { "id": 6, "name": "ایلام" }, + { "id": 7, "name": "بوشهر" }, + { "id": 8, "name": "تهران" }, + { "id": 9, "name": "چهارمحال وبختیاری" }, + { "id": 10, "name": "خراسان جنوبی" }, + { "id": 11, "name": "خراسان رضوی" }, + { "id": 12, "name": "خراسان شمالی" }, + { "id": 13, "name": "خوزستان" }, + { "id": 14, "name": "زنجان" }, + { "id": 15, "name": "سمنان" }, + { "id": 16, "name": "سیستان وبلوچستان" }, + { "id": 17, "name": "فارس" }, + { "id": 18, "name": "قزوین" }, + { "id": 19, "name": "قم" }, + { "id": 20, "name": "کردستان" }, + { "id": 21, "name": "کرمان" }, + { "id": 22, "name": "کرمانشاه" }, + { "id": 23, "name": "کهگیلویه وبویراحمد" }, + { "id": 24, "name": "گلستان" }, + { "id": 25, "name": "گیلان" }, + { "id": 26, "name": "لرستان" }, + { "id": 27, "name": "مازندران" }, + { "id": 28, "name": "مرکزی" }, + { "id": 29, "name": "هرمزگان" }, + { "id": 30, "name": "همدان" }, + { "id": 31, "name": "یزد" } +] diff --git a/database/data/json/shahr.json b/database/data/json/shahr.json new file mode 100644 index 0000000..3820e44 --- /dev/null +++ b/database/data/json/shahr.json @@ -0,0 +1,1326 @@ +[ + { "id": 1, "name": "آب بر", "ostan": 14 }, + { "id": 2, "name": "آب پخش", "ostan": 7 }, + { "id": 3, "name": "آباد", "ostan": 7 }, + { "id": 4, "name": "آبادان", "ostan": 13 }, + { "id": 8, "name": "آباده", "ostan": 17 }, + { "id": 9, "name": "آباده طشک", "ostan": 17 }, + { "id": 10, "name": "آبدان", "ostan": 7 }, + { "id": 11, "name": "آبدانان", "ostan": 6 }, + { "id": 12, "name": "آبژدان", "ostan": 13 }, + { "id": 13, "name": "آبسرد", "ostan": 8 }, + { "id": 14, "name": "آبش احمد", "ostan": 1 }, + { "id": 15, "name": "آبعلی", "ostan": 8 }, + { "id": 16, "name": "آبگرم", "ostan": 18 }, + { "id": 17, "name": "آبی بیگلو", "ostan": 3 }, + { "id": 18, "name": "آبیز", "ostan": 10 }, + { "id": 19, "name": "آبیک", "ostan": 18 }, + { "id": 20, "name": "آجین", "ostan": 30 }, + { "id": 21, "name": "آذرشهر", "ostan": 1 }, + { "id": 22, "name": "آرادان", "ostan": 15 }, + { "id": 23, "name": "آران وبیدگل", "ostan": 4 }, + { "id": 24, "name": "آرمرده", "ostan": 20 }, + { "id": 25, "name": "آرین شهر", "ostan": 10 }, + { "id": 26, "name": "آزادشهر", "ostan": 24 }, + { "id": 27, "name": "آزادی", "ostan": 13 }, + { "id": 28, "name": "آسارا", "ostan": 5 }, + { "id": 29, "name": "آستارا", "ostan": 25 }, + { "id": 30, "name": "آستانه", "ostan": 28 }, + { "id": 31, "name": "آستانه اشرفیه", "ostan": 25 }, + { "id": 32, "name": "آسمان آباد", "ostan": 6 }, + { "id": 33, "name": "آشار", "ostan": 16 }, + { "id": 34, "name": "آشتیان", "ostan": 28 }, + { "id": 35, "name": "آشخانه", "ostan": 12 }, + { "id": 36, "name": "آغاجاری", "ostan": 13 }, + { "id": 37, "name": "آق قلا", "ostan": 24 }, + { "id": 38, "name": "آقکند", "ostan": 1 }, + { "id": 39, "name": "آلاشت", "ostan": 27 }, + { "id": 40, "name": "آلونی", "ostan": 9 }, + { "id": 41, "name": "آمل", "ostan": 27 }, + { "id": 42, "name": "آوا", "ostan": 12 }, + { "id": 43, "name": "آواجیق", "ostan": 2 }, + { "id": 44, "name": "آوج", "ostan": 18 }, + { "id": 45, "name": "آوه", "ostan": 28 }, + { "id": 46, "name": "آیسک", "ostan": 10 }, + { "id": 47, "name": "ابرکوه", "ostan": 31 }, + { "id": 48, "name": "ابریشم", "ostan": 4 }, + { "id": 49, "name": "ابوحمیظه", "ostan": 13 }, + { "id": 50, "name": "ابوزیدآباد", "ostan": 4 }, + { "id": 51, "name": "ابوموسی", "ostan": 29 }, + { "id": 52, "name": "ابهر", "ostan": 14 }, + { "id": 53, "name": "اچاچی", "ostan": 1 }, + { "id": 54, "name": "احمد آباد مستوفی", "ostan": 8 }, + { "id": 55, "name": "احمدآباد", "ostan": 31 }, + { "id": 56, "name": "احمدابادصولت", "ostan": 11 }, + { "id": 57, "name": "احمدسرگوراب", "ostan": 25 }, + { "id": 58, "name": "اختیارآباد", "ostan": 21 }, + { "id": 59, "name": "ادیمی", "ostan": 16 }, + { "id": 60, "name": "اراک", "ostan": 28 }, + { "id": 66, "name": "اربطان", "ostan": 1 }, + { "id": 67, "name": "ارجمند", "ostan": 8 }, + { "id": 68, "name": "ارد", "ostan": 17 }, + { "id": 69, "name": "ارداق", "ostan": 18 }, + { "id": 70, "name": "اردبیل", "ostan": 3 }, + { "id": 76, "name": "اردستان", "ostan": 4 }, + { "id": 77, "name": "اردکان", "ostan": 17 }, + { "id": 78, "name": "اردکان", "ostan": 31 }, + { "id": 79, "name": "اردل", "ostan": 9 }, + { "id": 80, "name": "اردیموسی", "ostan": 3 }, + { "id": 81, "name": "ارزوییه", "ostan": 21 }, + { "id": 82, "name": "ارسک", "ostan": 10 }, + { "id": 83, "name": "ارسنجان", "ostan": 17 }, + { "id": 84, "name": "ارطه", "ostan": 27 }, + { "id": 85, "name": "ارکواز", "ostan": 6 }, + { "id": 86, "name": "ارمغانخانه", "ostan": 14 }, + { "id": 87, "name": "ارومیه", "ostan": 2 }, + { "id": 93, "name": "اروندکنار", "ostan": 13 }, + { "id": 94, "name": "ازگله", "ostan": 22 }, + { "id": 95, "name": "ازنا", "ostan": 26 }, + { "id": 96, "name": "ازندریان", "ostan": 30 }, + { "id": 97, "name": "اژیه", "ostan": 4 }, + { "id": 98, "name": "اسالم", "ostan": 25 }, + { "id": 99, "name": "اسپکه", "ostan": 16 }, + { "id": 100, "name": "استهبان", "ostan": 17 }, + { "id": 101, "name": "اسدآباد", "ostan": 30 }, + { "id": 102, "name": "اسدیه", "ostan": 10 }, + { "id": 103, "name": "اسفدن", "ostan": 10 }, + { "id": 104, "name": "اسفراین", "ostan": 12 }, + { "id": 105, "name": "اسفرورین", "ostan": 18 }, + { "id": 106, "name": "اسکو", "ostan": 1 }, + { "id": 107, "name": "اسلام آبادغرب", "ostan": 22 }, + { "id": 108, "name": "اسلام اباد", "ostan": 3 }, + { "id": 109, "name": "اسلام شهر آق گل", "ostan": 30 }, + { "id": 113, "name": "اسلامشهر", "ostan": 8 }, + { "id": 114, "name": "اسلامیه", "ostan": 10 }, + { "id": 115, "name": "اسیر", "ostan": 17 }, + { "id": 116, "name": "اشترینان", "ostan": 26 }, + { "id": 117, "name": "اشتهارد", "ostan": 5 }, + { "id": 118, "name": "اشکذر", "ostan": 31 }, + { "id": 119, "name": "اشکنان", "ostan": 17 }, + { "id": 120, "name": "اشنویه", "ostan": 2 }, + { "id": 121, "name": "اصغرآباد", "ostan": 4 }, + { "id": 122, "name": "اصفهان", "ostan": 4 }, + { "id": 138, "name": "اصلاندوز", "ostan": 3 }, + { "id": 139, "name": "اطاقور", "ostan": 25 }, + { "id": 140, "name": "افزر", "ostan": 17 }, + { "id": 141, "name": "افوس", "ostan": 4 }, + { "id": 142, "name": "اقبالیه", "ostan": 18 }, + { "id": 143, "name": "اقلید", "ostan": 17 }, + { "id": 144, "name": "الشتر", "ostan": 26 }, + { "id": 145, "name": "الوان", "ostan": 13 }, + { "id": 146, "name": "الوند", "ostan": 18 }, + { "id": 147, "name": "الهایی", "ostan": 13 }, + { "id": 148, "name": "الیگودرز", "ostan": 26 }, + { "id": 149, "name": "امام حسن", "ostan": 7 }, + { "id": 150, "name": "امام شهر", "ostan": 17 }, + { "id": 151, "name": "امامزاده عبدالله", "ostan": 27 }, + { "id": 152, "name": "املش", "ostan": 25 }, + { "id": 153, "name": "امیدیه", "ostan": 13 }, + { "id": 154, "name": "امیرکلا", "ostan": 27 }, + { "id": 155, "name": "امیریه", "ostan": 15 }, + { "id": 156, "name": "امین شهر", "ostan": 21 }, + { "id": 157, "name": "انابد", "ostan": 11 }, + { "id": 158, "name": "انار", "ostan": 21 }, + { "id": 159, "name": "انارستان", "ostan": 7 }, + { "id": 160, "name": "انارک", "ostan": 4 }, + { "id": 161, "name": "انبارآلوم", "ostan": 24 }, + { "id": 162, "name": "اندوهجرد", "ostan": 21 }, + { "id": 163, "name": "اندیشه", "ostan": 8 }, + { "id": 164, "name": "اندیمشک", "ostan": 13 }, + { "id": 165, "name": "اورامان تخت", "ostan": 20 }, + { "id": 166, "name": "اوز", "ostan": 17 }, + { "id": 167, "name": "اهر", "ostan": 1 }, + { "id": 168, "name": "اهرم", "ostan": 7 }, + { "id": 169, "name": "اهل", "ostan": 17 }, + { "id": 170, "name": "اهواز", "ostan": 13 }, + { "id": 179, "name": "ایج", "ostan": 17 }, + { "id": 180, "name": "ایذه", "ostan": 13 }, + { "id": 181, "name": "ایرانشهر", "ostan": 16 }, + { "id": 182, "name": "ایزدخواست", "ostan": 17 }, + { "id": 183, "name": "ایزدشهر", "ostan": 27 }, + { "id": 184, "name": "ایلام", "ostan": 6 }, + { "id": 185, "name": "ایلخچی", "ostan": 1 }, + { "id": 186, "name": "ایمانشهر", "ostan": 4 }, + { "id": 187, "name": "اینچه برون", "ostan": 24 }, + { "id": 188, "name": "ایوان", "ostan": 6 }, + { "id": 189, "name": "ایوانکی", "ostan": 15 }, + { "id": 190, "name": "ایواوغلی", "ostan": 2 }, + { "id": 191, "name": "ایور", "ostan": 12 }, + { "id": 192, "name": "باب انار", "ostan": 17 }, + { "id": 193, "name": "باباحیدر", "ostan": 9 }, + { "id": 194, "name": "بابارشانی", "ostan": 20 }, + { "id": 195, "name": "بابامنیر", "ostan": 17 }, + { "id": 196, "name": "بابکان", "ostan": 27 }, + { "id": 197, "name": "بابل", "ostan": 27 }, + { "id": 200, "name": "بابلسر", "ostan": 27 }, + { "id": 201, "name": "باجگیران", "ostan": 11 }, + { "id": 202, "name": "باخرز", "ostan": 11 }, + { "id": 203, "name": "بادرود", "ostan": 4 }, + { "id": 204, "name": "بادوله", "ostan": 7 }, + { "id": 205, "name": "بار", "ostan": 11 }, + { "id": 206, "name": "باروق", "ostan": 2 }, + { "id": 207, "name": "بازار جمعه", "ostan": 25 }, + { "id": 208, "name": "بازرگان", "ostan": 2 }, + { "id": 209, "name": "بازفت", "ostan": 9 }, + { "id": 210, "name": "باسمنج", "ostan": 1 }, + { "id": 211, "name": "باشت", "ostan": 23 }, + { "id": 212, "name": "باغ بهادران", "ostan": 4 }, + { "id": 213, "name": "باغ ملک", "ostan": 13 }, + { "id": 214, "name": "باغستان", "ostan": 8 }, + { "id": 215, "name": "باغشاد", "ostan": 4 }, + { "id": 216, "name": "باغین", "ostan": 21 }, + { "id": 217, "name": "بافت", "ostan": 21 }, + { "id": 218, "name": "بافران", "ostan": 4 }, + { "id": 219, "name": "بافق", "ostan": 31 }, + { "id": 220, "name": "باقرشهر", "ostan": 8 }, + { "id": 221, "name": "بالاده", "ostan": 17 }, + { "id": 222, "name": "بالاشهر", "ostan": 29 }, + { "id": 223, "name": "بانوره", "ostan": 22 }, + { "id": 224, "name": "بانه", "ostan": 20 }, + { "id": 225, "name": "بایک", "ostan": 11 }, + { "id": 226, "name": "باینگان", "ostan": 22 }, + { "id": 227, "name": "بجستان", "ostan": 11 }, + { "id": 228, "name": "بجنورد", "ostan": 12 }, + { "id": 231, "name": "بخشایش", "ostan": 1 }, + { "id": 232, "name": "بدره", "ostan": 6 }, + { "id": 233, "name": "برازجان", "ostan": 7 }, + { "id": 234, "name": "بردخون", "ostan": 7 }, + { "id": 235, "name": "بردستان", "ostan": 7 }, + { "id": 236, "name": "بردسکن", "ostan": 11 }, + { "id": 237, "name": "بردسیر", "ostan": 21 }, + { "id": 238, "name": "برده رشه", "ostan": 20 }, + { "id": 239, "name": "برزک", "ostan": 4 }, + { "id": 240, "name": "برزول", "ostan": 30 }, + { "id": 241, "name": "برف انبار", "ostan": 4 }, + { "id": 242, "name": "بروات", "ostan": 21 }, + { "id": 243, "name": "بروجرد", "ostan": 26 }, + { "id": 246, "name": "بروجن", "ostan": 9 }, + { "id": 247, "name": "بره سر", "ostan": 25 }, + { "id": 248, "name": "بزمان", "ostan": 16 }, + { "id": 249, "name": "بزنجان", "ostan": 21 }, + { "id": 250, "name": "بستان", "ostan": 13 }, + { "id": 251, "name": "بستان آباد", "ostan": 1 }, + { "id": 252, "name": "بستک", "ostan": 29 }, + { "id": 253, "name": "بسطام", "ostan": 15 }, + { "id": 254, "name": "بشرویه", "ostan": 10 }, + { "id": 255, "name": "بفروییه", "ostan": 31 }, + { "id": 256, "name": "بلاوه", "ostan": 6 }, + { "id": 257, "name": "بلبان آباد", "ostan": 20 }, + { "id": 258, "name": "بلداجی", "ostan": 9 }, + { "id": 259, "name": "بلده", "ostan": 27 }, + { "id": 260, "name": "بلورد", "ostan": 21 }, + { "id": 261, "name": "بلوک", "ostan": 21 }, + { "id": 262, "name": "بم", "ostan": 21 }, + { "id": 263, "name": "بمپور", "ostan": 16 }, + { "id": 264, "name": "بن", "ostan": 9 }, + { "id": 265, "name": "بناب", "ostan": 1 }, + { "id": 266, "name": "بناب مرند", "ostan": 1 }, + { "id": 267, "name": "بنارویه", "ostan": 17 }, + { "id": 268, "name": "بنت", "ostan": 16 }, + { "id": 269, "name": "بنجار", "ostan": 16 }, + { "id": 270, "name": "بندرامام خمینی", "ostan": 13 }, + { "id": 271, "name": "بندرانزلی", "ostan": 25 }, + { "id": 274, "name": "بندرترکمن", "ostan": 24 }, + { "id": 275, "name": "بندرجاسک", "ostan": 29 }, + { "id": 276, "name": "بندردیر", "ostan": 7 }, + { "id": 277, "name": "بندردیلم", "ostan": 7 }, + { "id": 278, "name": "بندرریگ", "ostan": 7 }, + { "id": 279, "name": "بندرعباس", "ostan": 29 }, + { "id": 283, "name": "بندرکنگان", "ostan": 7 }, + { "id": 284, "name": "بندرگز", "ostan": 24 }, + { "id": 285, "name": "بندرگناوه", "ostan": 7 }, + { "id": 286, "name": "بندرلنگه", "ostan": 29 }, + { "id": 287, "name": "بندرماهشهر", "ostan": 13 }, + { "id": 288, "name": "بندزرک", "ostan": 29 }, + { "id": 289, "name": "بنک", "ostan": 7 }, + { "id": 290, "name": "بوانات", "ostan": 17 }, + { "id": 291, "name": "بویین زهرا", "ostan": 18 }, + { "id": 292, "name": "بویین سفلی", "ostan": 20 }, + { "id": 293, "name": "بوستان", "ostan": 23 }, + { "id": 294, "name": "بوشکان", "ostan": 7 }, + { "id": 295, "name": "بوشهر", "ostan": 7 }, + { "id": 298, "name": "بوکان", "ostan": 2 }, + { "id": 299, "name": "بومهن", "ostan": 8 }, + { "id": 300, "name": "بویین ومیاندشت", "ostan": 4 }, + { "id": 301, "name": "بهاباد", "ostan": 31 }, + { "id": 302, "name": "بهار", "ostan": 30 }, + { "id": 303, "name": "بهاران شهر", "ostan": 4 }, + { "id": 304, "name": "بهارستان", "ostan": 4 }, + { "id": 305, "name": "بهارستان", "ostan": 7 }, + { "id": 306, "name": "بهبهان", "ostan": 13 }, + { "id": 307, "name": "بهرمان", "ostan": 21 }, + { "id": 308, "name": "بهشهر", "ostan": 27 }, + { "id": 309, "name": "بهمن", "ostan": 17 }, + { "id": 310, "name": "بهنمیر", "ostan": 27 }, + { "id": 311, "name": "بیارجمند", "ostan": 15 }, + { "id": 312, "name": "بیجار", "ostan": 20 }, + { "id": 313, "name": "بیدخت", "ostan": 11 }, + { "id": 314, "name": "بیدخون", "ostan": 7 }, + { "id": 315, "name": "بیدروبه", "ostan": 13 }, + { "id": 316, "name": "بیدستان", "ostan": 18 }, + { "id": 317, "name": "بیده", "ostan": 4 }, + { "id": 318, "name": "بیران شهر", "ostan": 26 }, + { "id": 319, "name": "بیرجند", "ostan": 10 }, + { "id": 322, "name": "بیرم", "ostan": 17 }, + { "id": 323, "name": "بیستون", "ostan": 22 }, + { "id": 324, "name": "بیضا", "ostan": 17 }, + { "id": 325, "name": "بیکاء", "ostan": 29 }, + { "id": 326, "name": "بیله سوار", "ostan": 3 }, + { "id": 327, "name": "پاتاوه", "ostan": 23 }, + { "id": 328, "name": "پارس آباد", "ostan": 3 }, + { "id": 329, "name": "پارسیان", "ostan": 29 }, + { "id": 330, "name": "پارود", "ostan": 16 }, + { "id": 331, "name": "پاریز", "ostan": 21 }, + { "id": 332, "name": "پاکدشت", "ostan": 8 }, + { "id": 333, "name": "پاوه", "ostan": 22 }, + { "id": 334, "name": "پایین هولار", "ostan": 27 }, + { "id": 335, "name": "پردنجان", "ostan": 9 }, + { "id": 336, "name": "پردیس", "ostan": 8 }, + { "id": 337, "name": "پرند", "ostan": 8 }, + { "id": 338, "name": "پرندک", "ostan": 28 }, + { "id": 339, "name": "پره سر", "ostan": 25 }, + { "id": 340, "name": "پل", "ostan": 29 }, + { "id": 341, "name": "پل سفید", "ostan": 27 }, + { "id": 342, "name": "پلان", "ostan": 16 }, + { "id": 343, "name": "پلدختر", "ostan": 26 }, + { "id": 344, "name": "پلدشت", "ostan": 2 }, + { "id": 345, "name": "پول", "ostan": 27 }, + { "id": 346, "name": "پهله", "ostan": 6 }, + { "id": 347, "name": "پیرانشهر", "ostan": 2 }, + { "id": 348, "name": "پیربکران", "ostan": 4 }, + { "id": 349, "name": "پیرتاج", "ostan": 20 }, + { "id": 350, "name": "پیش قلعه", "ostan": 12 }, + { "id": 351, "name": "پیشوا", "ostan": 8 }, + { "id": 352, "name": "پیشین", "ostan": 16 }, + { "id": 353, "name": "تاتارعلیا", "ostan": 24 }, + { "id": 354, "name": "تازه آباد", "ostan": 22 }, + { "id": 355, "name": "تازه شهر", "ostan": 2 }, + { "id": 356, "name": "تازه کندانگوت", "ostan": 3 }, + { "id": 357, "name": "تازه کندنصرت آباد", "ostan": 2 }, + { "id": 358, "name": "تازیان پایین", "ostan": 29 }, + { "id": 359, "name": "تاکستان", "ostan": 18 }, + { "id": 360, "name": "تایباد", "ostan": 11 }, + { "id": 361, "name": "تبریز", "ostan": 1 }, + { "id": 364, "name": "تبریز1-", "ostan": 1 }, + { "id": 365, "name": "تبریز2-", "ostan": 1 }, + { "id": 366, "name": "تبریز3-", "ostan": 1 }, + { "id": 367, "name": "تبریز4-", "ostan": 1 }, + { "id": 372, "name": "تجریش", "ostan": 8 }, + { "id": 373, "name": "تخت", "ostan": 29 }, + { "id": 374, "name": "تربت جام", "ostan": 11 }, + { "id": 375, "name": "تربت حیدریه", "ostan": 11 }, + { "id": 376, "name": "ترک", "ostan": 1 }, + { "id": 377, "name": "ترکالکی", "ostan": 13 }, + { "id": 378, "name": "ترکمانچای", "ostan": 1 }, + { "id": 379, "name": "تسوج", "ostan": 1 }, + { "id": 380, "name": "تشان", "ostan": 13 }, + { "id": 381, "name": "تفت", "ostan": 31 }, + { "id": 382, "name": "تفرش", "ostan": 28 }, + { "id": 383, "name": "تکاب", "ostan": 2 }, + { "id": 384, "name": "تلخاب", "ostan": 28 }, + { "id": 385, "name": "تنکابن", "ostan": 27 }, + { "id": 386, "name": "تنکمان", "ostan": 5 }, + { "id": 387, "name": "تنگ ارم", "ostan": 7 }, + { "id": 388, "name": "توپ آغاج", "ostan": 20 }, + { "id": 389, "name": "توتکابن", "ostan": 25 }, + { "id": 390, "name": "توحید", "ostan": 6 }, + { "id": 391, "name": "تودشک", "ostan": 4 }, + { "id": 392, "name": "توره", "ostan": 28 }, + { "id": 393, "name": "تویسرکان", "ostan": 30 }, + { "id": 394, "name": "تهران", "ostan": 8 }, + { "id": 417, "name": "تیتکانلو", "ostan": 12 }, + { "id": 418, "name": "تیران", "ostan": 4 }, + { "id": 419, "name": "تیرور", "ostan": 29 }, + { "id": 420, "name": "تیکمه داش", "ostan": 1 }, + { "id": 421, "name": "تیمورلو", "ostan": 1 }, + { "id": 422, "name": "ثمرین", "ostan": 3 }, + { "id": 423, "name": "جاجرم", "ostan": 12 }, + { "id": 424, "name": "جالق", "ostan": 16 }, + { "id": 425, "name": "جاورسیان", "ostan": 28 }, + { "id": 426, "name": "جایزان", "ostan": 13 }, + { "id": 427, "name": "جبالبارز", "ostan": 21 }, + { "id": 428, "name": "جعفرآباد", "ostan": 3 }, + { "id": 429, "name": "جعفریه", "ostan": 19 }, + { "id": 430, "name": "جغتای", "ostan": 11 }, + { "id": 431, "name": "جلفا", "ostan": 1 }, + { "id": 432, "name": "جلین", "ostan": 24 }, + { "id": 433, "name": "جم", "ostan": 7 }, + { "id": 434, "name": "جناح", "ostan": 29 }, + { "id": 435, "name": "جنت شهر", "ostan": 17 }, + { "id": 436, "name": "جنت مکان", "ostan": 13 }, + { "id": 437, "name": "جندق", "ostan": 4 }, + { "id": 438, "name": "جنگل", "ostan": 11 }, + { "id": 439, "name": "جوادآباد", "ostan": 8 }, + { "id": 440, "name": "جوان قلعه", "ostan": 1 }, + { "id": 441, "name": "جوانرود", "ostan": 22 }, + { "id": 442, "name": "جوپار", "ostan": 21 }, + { "id": 443, "name": "جورقان", "ostan": 30 }, + { "id": 444, "name": "جوزدان", "ostan": 4 }, + { "id": 445, "name": "جوزم", "ostan": 21 }, + { "id": 446, "name": "جوشقان قالی", "ostan": 4 }, + { "id": 447, "name": "جوکار", "ostan": 30 }, + { "id": 448, "name": "جولکی", "ostan": 13 }, + { "id": 449, "name": "جونقان", "ostan": 9 }, + { "id": 450, "name": "جویبار", "ostan": 27 }, + { "id": 451, "name": "جویم", "ostan": 17 }, + { "id": 452, "name": "جهرم", "ostan": 17 }, + { "id": 453, "name": "جیرفت", "ostan": 21 }, + { "id": 454, "name": "جیرنده", "ostan": 25 }, + { "id": 455, "name": "چابکسر", "ostan": 25 }, + { "id": 456, "name": "چابهار", "ostan": 16 }, + { "id": 457, "name": "چاپشلو", "ostan": 11 }, + { "id": 458, "name": "چادگان", "ostan": 4 }, + { "id": 459, "name": "چارک", "ostan": 29 }, + { "id": 460, "name": "چاف و چمخاله", "ostan": 25 }, + { "id": 461, "name": "چالانچولان", "ostan": 26 }, + { "id": 462, "name": "چالوس", "ostan": 27 }, + { "id": 463, "name": "چاه دادخدا", "ostan": 21 }, + { "id": 464, "name": "چاه مبارک", "ostan": 7 }, + { "id": 465, "name": "چاه ورز", "ostan": 17 }, + { "id": 466, "name": "چترود", "ostan": 21 }, + { "id": 467, "name": "چرام", "ostan": 23 }, + { "id": 468, "name": "چرمهین", "ostan": 4 }, + { "id": 469, "name": "چشمه شیرین", "ostan": 6 }, + { "id": 470, "name": "چغادک", "ostan": 7 }, + { "id": 471, "name": "چغامیش", "ostan": 13 }, + { "id": 472, "name": "چقابل", "ostan": 26 }, + { "id": 473, "name": "چکنه", "ostan": 11 }, + { "id": 474, "name": "چگرد", "ostan": 16 }, + { "id": 475, "name": "چلگرد", "ostan": 9 }, + { "id": 476, "name": "چلیچه", "ostan": 9 }, + { "id": 477, "name": "چم گلک", "ostan": 13 }, + { "id": 478, "name": "چمران", "ostan": 13 }, + { "id": 479, "name": "چمستان", "ostan": 27 }, + { "id": 480, "name": "چمگردان", "ostan": 4 }, + { "id": 481, "name": "چمن سلطان", "ostan": 26 }, + { "id": 482, "name": "چناران", "ostan": 11 }, + { "id": 483, "name": "چناران شهر", "ostan": 12 }, + { "id": 484, "name": "چناره", "ostan": 20 }, + { "id": 485, "name": "چوار", "ostan": 6 }, + { "id": 486, "name": "چوبر", "ostan": 25 }, + { "id": 487, "name": "چورزق", "ostan": 14 }, + { "id": 488, "name": "چویبده", "ostan": 13 }, + { "id": 489, "name": "چهارباغ", "ostan": 5 }, + { "id": 490, "name": "چهاربرج", "ostan": 2 }, + { "id": 491, "name": "چهاردانگه", "ostan": 8 }, + { "id": 492, "name": "چیتاب", "ostan": 23 }, + { "id": 493, "name": "حاجی آباد", "ostan": 17 }, + { "id": 494, "name": "حاجی آباد", "ostan": 10 }, + { "id": 495, "name": "حاجی اباد", "ostan": 29 }, + { "id": 496, "name": "حاجیلار", "ostan": 2 }, + { "id": 497, "name": "حبیب آباد", "ostan": 4 }, + { "id": 498, "name": "حر", "ostan": 13 }, + { "id": 499, "name": "حسامی", "ostan": 17 }, + { "id": 500, "name": "حسن آباد", "ostan": 8 }, + { "id": 501, "name": "حسن اباد", "ostan": 17 }, + { "id": 502, "name": "حسن اباد", "ostan": 4 }, + { "id": 503, "name": "حسین آباد", "ostan": 20 }, + { "id": 504, "name": "حسینیه", "ostan": 13 }, + { "id": 505, "name": "حصارگرمخان", "ostan": 12 }, + { "id": 506, "name": "حکم اباد", "ostan": 11 }, + { "id": 507, "name": "حلب", "ostan": 14 }, + { "id": 508, "name": "حمزه", "ostan": 13 }, + { "id": 509, "name": "حمیدیا", "ostan": 31 }, + { "id": 510, "name": "حمیدیه", "ostan": 13 }, + { "id": 511, "name": "حمیل", "ostan": 22 }, + { "id": 512, "name": "حنا", "ostan": 4 }, + { "id": 513, "name": "حویق", "ostan": 25 }, + { "id": 514, "name": "خاتون اباد", "ostan": 21 }, + { "id": 515, "name": "خارک", "ostan": 7 }, + { "id": 516, "name": "خاروانا", "ostan": 1 }, + { "id": 517, "name": "خاش", "ostan": 16 }, + { "id": 518, "name": "خاکعلی", "ostan": 18 }, + { "id": 519, "name": "خالدآباد", "ostan": 4 }, + { "id": 520, "name": "خامنه", "ostan": 1 }, + { "id": 521, "name": "خان ببین", "ostan": 24 }, + { "id": 522, "name": "خانوک", "ostan": 21 }, + { "id": 523, "name": "خانه زنیان", "ostan": 17 }, + { "id": 524, "name": "خانیمن", "ostan": 17 }, + { "id": 525, "name": "خاوران", "ostan": 17 }, + { "id": 526, "name": "خداجو(خراجو)", "ostan": 1 }, + { "id": 527, "name": "خرامه", "ostan": 17 }, + { "id": 528, "name": "خرم آباد", "ostan": 27 }, + { "id": 529, "name": "خرم آباد", "ostan": 26 }, + { "id": 533, "name": "خرمدره", "ostan": 14 }, + { "id": 534, "name": "خرمدشت", "ostan": 18 }, + { "id": 535, "name": "خرمشهر", "ostan": 13 }, + { "id": 536, "name": "خرو", "ostan": 11 }, + { "id": 537, "name": "خسروشاه", "ostan": 1 }, + { "id": 538, "name": "خشت", "ostan": 17 }, + { "id": 539, "name": "خشکبیجار", "ostan": 25 }, + { "id": 540, "name": "خشکرود", "ostan": 28 }, + { "id": 541, "name": "خضرآباد", "ostan": 31 }, + { "id": 542, "name": "خضری دشت بیاض", "ostan": 10 }, + { "id": 543, "name": "خلخال", "ostan": 3 }, + { "id": 544, "name": "خلیفان", "ostan": 2 }, + { "id": 545, "name": "خلیل آباد", "ostan": 11 }, + { "id": 546, "name": "خلیل شهر", "ostan": 27 }, + { "id": 547, "name": "خمارلو", "ostan": 1 }, + { "id": 548, "name": "خمام", "ostan": 25 }, + { "id": 549, "name": "خمیر", "ostan": 29 }, + { "id": 550, "name": "خمین", "ostan": 28 }, + { "id": 551, "name": "خمینی شهر", "ostan": 4 }, + { "id": 552, "name": "خنافره", "ostan": 13 }, + { "id": 553, "name": "خنج", "ostan": 17 }, + { "id": 554, "name": "خنجین", "ostan": 28 }, + { "id": 555, "name": "خنداب", "ostan": 28 }, + { "id": 556, "name": "خواجو شهر", "ostan": 21 }, + { "id": 557, "name": "خواجه", "ostan": 1 }, + { "id": 558, "name": "خواف", "ostan": 11 }, + { "id": 559, "name": "خوانسار", "ostan": 4 }, + { "id": 560, "name": "خوی", "ostan": 2 }, + { "id": 561, "name": "خور", "ostan": 17 }, + { "id": 562, "name": "خور", "ostan": 4 }, + { "id": 563, "name": "خورزوق", "ostan": 4 }, + { "id": 564, "name": "خورسند", "ostan": 21 }, + { "id": 565, "name": "خورموج", "ostan": 7 }, + { "id": 566, "name": "خوزی", "ostan": 17 }, + { "id": 567, "name": "خوسف", "ostan": 10 }, + { "id": 568, "name": "خوش رودپی", "ostan": 27 }, + { "id": 569, "name": "خوشه مهر", "ostan": 1 }, + { "id": 570, "name": "خومه زار", "ostan": 17 }, + { "id": 571, "name": "دابودشت", "ostan": 27 }, + { "id": 572, "name": "داراب", "ostan": 17 }, + { "id": 573, "name": "داران", "ostan": 4 }, + { "id": 574, "name": "دارخوین", "ostan": 13 }, + { "id": 575, "name": "داریان", "ostan": 17 }, + { "id": 576, "name": "دالکی", "ostan": 7 }, + { "id": 577, "name": "دامغان", "ostan": 15 }, + { "id": 578, "name": "دامنه", "ostan": 4 }, + { "id": 579, "name": "دانسفهان", "ostan": 18 }, + { "id": 580, "name": "داودآباد", "ostan": 28 }, + { "id": 581, "name": "داورزن", "ostan": 11 }, + { "id": 582, "name": "دبیران", "ostan": 17 }, + { "id": 583, "name": "درب بهشت", "ostan": 21 }, + { "id": 584, "name": "درب گنبد", "ostan": 26 }, + { "id": 585, "name": "درجزین", "ostan": 15 }, + { "id": 586, "name": "درچه", "ostan": 4 }, + { "id": 587, "name": "درح", "ostan": 10 }, + { "id": 588, "name": "درق", "ostan": 12 }, + { "id": 589, "name": "درگز", "ostan": 11 }, + { "id": 590, "name": "درگهان", "ostan": 29 }, + { "id": 591, "name": "درود", "ostan": 11 }, + { "id": 592, "name": "دره شهر", "ostan": 6 }, + { "id": 593, "name": "دزج", "ostan": 20 }, + { "id": 594, "name": "دزفول", "ostan": 13 }, + { "id": 598, "name": "دژکرد", "ostan": 17 }, + { "id": 599, "name": "دستجرد", "ostan": 19 }, + { "id": 600, "name": "دستگرد", "ostan": 4 }, + { "id": 601, "name": "دستنا", "ostan": 9 }, + { "id": 602, "name": "دشتک", "ostan": 9 }, + { "id": 603, "name": "دشتکار", "ostan": 21 }, + { "id": 604, "name": "دشتی", "ostan": 29 }, + { "id": 605, "name": "دلبران", "ostan": 20 }, + { "id": 606, "name": "دلگشا", "ostan": 6 }, + { "id": 607, "name": "دلند", "ostan": 24 }, + { "id": 608, "name": "دلوار", "ostan": 7 }, + { "id": 609, "name": "دلیجان", "ostan": 28 }, + { "id": 610, "name": "دماوند", "ostan": 8 }, + { "id": 611, "name": "دمق", "ostan": 30 }, + { "id": 612, "name": "دندی", "ostan": 14 }, + { "id": 613, "name": "دوبرجی", "ostan": 17 }, + { "id": 614, "name": "دوراهک", "ostan": 7 }, + { "id": 615, "name": "دورود", "ostan": 26 }, + { "id": 616, "name": "دوزدوزان", "ostan": 1 }, + { "id": 617, "name": "دوزه", "ostan": 17 }, + { "id": 618, "name": "دوزین", "ostan": 24 }, + { "id": 619, "name": "دوساری", "ostan": 21 }, + { "id": 620, "name": "دوست محمد", "ostan": 16 }, + { "id": 621, "name": "دوگنبدان", "ostan": 23 }, + { "id": 622, "name": "دولت آباد", "ostan": 11 }, + { "id": 623, "name": "دولت آباد", "ostan": 4 }, + { "id": 624, "name": "ده رییس", "ostan": 16 }, + { "id": 625, "name": "ده سرخ", "ostan": 4 }, + { "id": 626, "name": "دهاقان", "ostan": 4 }, + { "id": 627, "name": "دهبارز", "ostan": 29 }, + { "id": 628, "name": "دهج", "ostan": 21 }, + { "id": 629, "name": "دهدز", "ostan": 13 }, + { "id": 630, "name": "دهدشت", "ostan": 23 }, + { "id": 631, "name": "دهرم", "ostan": 17 }, + { "id": 632, "name": "دهق", "ostan": 4 }, + { "id": 633, "name": "دهگلان", "ostan": 20 }, + { "id": 634, "name": "دهلران", "ostan": 6 }, + { "id": 635, "name": "دیباج", "ostan": 15 }, + { "id": 636, "name": "دیزج دیز", "ostan": 2 }, + { "id": 637, "name": "دیزیچه", "ostan": 4 }, + { "id": 638, "name": "دیشموک", "ostan": 23 }, + { "id": 639, "name": "دیلمان", "ostan": 25 }, + { "id": 640, "name": "دیواندره", "ostan": 20 }, + { "id": 641, "name": "دیهوک", "ostan": 10 }, + { "id": 642, "name": "رابر", "ostan": 21 }, + { "id": 643, "name": "راز", "ostan": 12 }, + { "id": 644, "name": "رازقان", "ostan": 28 }, + { "id": 645, "name": "رازمیان", "ostan": 18 }, + { "id": 646, "name": "راسک", "ostan": 16 }, + { "id": 647, "name": "رامجرد", "ostan": 17 }, + { "id": 648, "name": "رامسر", "ostan": 27 }, + { "id": 649, "name": "رامشیر", "ostan": 13 }, + { "id": 650, "name": "رامهرمز", "ostan": 13 }, + { "id": 651, "name": "رامیان", "ostan": 24 }, + { "id": 652, "name": "رانکوه", "ostan": 25 }, + { "id": 653, "name": "راور", "ostan": 21 }, + { "id": 654, "name": "راین", "ostan": 21 }, + { "id": 655, "name": "ری", "ostan": 8 }, + { "id": 656, "name": "رباط", "ostan": 22 }, + { "id": 657, "name": "رباط سنگ", "ostan": 11 }, + { "id": 658, "name": "رباطکریم", "ostan": 8 }, + { "id": 659, "name": "ربط", "ostan": 2 }, + { "id": 660, "name": "رحیم آباد", "ostan": 25 }, + { "id": 661, "name": "رزن", "ostan": 30 }, + { "id": 662, "name": "رزوه", "ostan": 4 }, + { "id": 663, "name": "رستاق", "ostan": 17 }, + { "id": 664, "name": "رستم آباد", "ostan": 25 }, + { "id": 665, "name": "رستمکلا", "ostan": 27 }, + { "id": 666, "name": "رشت", "ostan": 25 }, + { "id": 672, "name": "رشتخوار", "ostan": 11 }, + { "id": 673, "name": "رضوانشهر", "ostan": 25 }, + { "id": 674, "name": "رضوانشهر", "ostan": 4 }, + { "id": 675, "name": "رضویه", "ostan": 11 }, + { "id": 676, "name": "رضی", "ostan": 3 }, + { "id": 677, "name": "رفسنجان", "ostan": 21 }, + { "id": 678, "name": "رفیع", "ostan": 13 }, + { "id": 679, "name": "روانسر", "ostan": 22 }, + { "id": 680, "name": "رود زرد ماشین", "ostan": 13 }, + { "id": 681, "name": "روداب", "ostan": 11 }, + { "id": 682, "name": "رودبار", "ostan": 25 }, + { "id": 683, "name": "رودبار", "ostan": 21 }, + { "id": 684, "name": "رودبنه", "ostan": 25 }, + { "id": 685, "name": "رودسر", "ostan": 25 }, + { "id": 686, "name": "رودهن", "ostan": 8 }, + { "id": 687, "name": "رودیان", "ostan": 15 }, + { "id": 688, "name": "رونیز", "ostan": 17 }, + { "id": 689, "name": "رویان", "ostan": 27 }, + { "id": 690, "name": "رویدر", "ostan": 29 }, + { "id": 691, "name": "ریجاب", "ostan": 22 }, + { "id": 692, "name": "ریحان", "ostan": 21 }, + { "id": 693, "name": "ریز", "ostan": 7 }, + { "id": 694, "name": "ریگ ملک", "ostan": 16 }, + { "id": 695, "name": "رینه", "ostan": 27 }, + { "id": 696, "name": "ریواده", "ostan": 11 }, + { "id": 697, "name": "ریوش", "ostan": 11 }, + { "id": 698, "name": "زابل", "ostan": 16 }, + { "id": 699, "name": "زارچ", "ostan": 31 }, + { "id": 700, "name": "زازران", "ostan": 4 }, + { "id": 701, "name": "زاغه", "ostan": 26 }, + { "id": 702, "name": "زاووت", "ostan": 13 }, + { "id": 703, "name": "زاویه", "ostan": 28 }, + { "id": 704, "name": "زاهدان", "ostan": 16 }, + { "id": 710, "name": "زاهدشهر", "ostan": 17 }, + { "id": 711, "name": "زاینده رود", "ostan": 4 }, + { "id": 712, "name": "زرآباد", "ostan": 2 }, + { "id": 713, "name": "زرآباد", "ostan": 16 }, + { "id": 714, "name": "زرقان", "ostan": 17 }, + { "id": 715, "name": "زرگرمحله", "ostan": 27 }, + { "id": 716, "name": "زرند", "ostan": 21 }, + { "id": 717, "name": "زرنق", "ostan": 1 }, + { "id": 718, "name": "زرنه", "ostan": 6 }, + { "id": 719, "name": "زرین آباد", "ostan": 14 }, + { "id": 720, "name": "زرین رود", "ostan": 14 }, + { "id": 721, "name": "زرین شهر", "ostan": 4 }, + { "id": 722, "name": "زرینه", "ostan": 20 }, + { "id": 723, "name": "زنجان", "ostan": 14 }, + { "id": 727, "name": "زنگنه", "ostan": 30 }, + { "id": 728, "name": "زنگی آباد", "ostan": 21 }, + { "id": 729, "name": "زنوز", "ostan": 1 }, + { "id": 730, "name": "زواره", "ostan": 4 }, + { "id": 731, "name": "زهان", "ostan": 10 }, + { "id": 732, "name": "زهرا", "ostan": 3 }, + { "id": 733, "name": "زهره", "ostan": 13 }, + { "id": 734, "name": "زهک", "ostan": 16 }, + { "id": 735, "name": "زهکلوت", "ostan": 21 }, + { "id": 736, "name": "زیار", "ostan": 4 }, + { "id": 737, "name": "زیارت", "ostan": 12 }, + { "id": 738, "name": "زیارتعلی", "ostan": 29 }, + { "id": 739, "name": "زیباشهر", "ostan": 4 }, + { "id": 740, "name": "زیدآباد", "ostan": 21 }, + { "id": 741, "name": "زیرآب", "ostan": 27 }, + { "id": 742, "name": "ساری", "ostan": 27 }, + { "id": 743, "name": "ساربوک", "ostan": 16 }, + { "id": 744, "name": "ساروق", "ostan": 28 }, + { "id": 748, "name": "سالند", "ostan": 13 }, + { "id": 749, "name": "سامان", "ostan": 9 }, + { "id": 750, "name": "سامن", "ostan": 30 }, + { "id": 751, "name": "ساوه", "ostan": 28 }, + { "id": 754, "name": "سبزوار", "ostan": 11 }, + { "id": 757, "name": "سپیددشت", "ostan": 26 }, + { "id": 758, "name": "سجاس", "ostan": 14 }, + { "id": 759, "name": "سجزی", "ostan": 4 }, + { "id": 760, "name": "سده", "ostan": 17 }, + { "id": 761, "name": "سده لنجان", "ostan": 4 }, + { "id": 762, "name": "سراب", "ostan": 1 }, + { "id": 763, "name": "سراب باغ", "ostan": 6 }, + { "id": 764, "name": "سراب دوره", "ostan": 26 }, + { "id": 765, "name": "سرابله", "ostan": 6 }, + { "id": 766, "name": "سراوان", "ostan": 16 }, + { "id": 767, "name": "سرایان", "ostan": 10 }, + { "id": 768, "name": "سرباز", "ostan": 16 }, + { "id": 769, "name": "سربیشه", "ostan": 10 }, + { "id": 770, "name": "سرپل ذهاب", "ostan": 22 }, + { "id": 771, "name": "سرخرود", "ostan": 27 }, + { "id": 772, "name": "سرخس", "ostan": 11 }, + { "id": 773, "name": "سرخنکلاته", "ostan": 24 }, + { "id": 774, "name": "سرخون", "ostan": 9 }, + { "id": 775, "name": "سرخه", "ostan": 15 }, + { "id": 776, "name": "سرداران", "ostan": 13 }, + { "id": 777, "name": "سردرود", "ostan": 1 }, + { "id": 778, "name": "سردشت", "ostan": 2 }, + { "id": 779, "name": "سردشت", "ostan": 13 }, + { "id": 780, "name": "سردشت", "ostan": 9 }, + { "id": 781, "name": "سردشت", "ostan": 29 }, + { "id": 782, "name": "سرعین", "ostan": 3 }, + { "id": 783, "name": "سرفاریاب", "ostan": 23 }, + { "id": 784, "name": "سرکان", "ostan": 30 }, + { "id": 785, "name": "سرگز", "ostan": 29 }, + { "id": 786, "name": "سرمست", "ostan": 22 }, + { "id": 787, "name": "سرو", "ostan": 2 }, + { "id": 788, "name": "سروآباد", "ostan": 20 }, + { "id": 789, "name": "سروستان", "ostan": 17 }, + { "id": 790, "name": "سریش آباد", "ostan": 20 }, + { "id": 791, "name": "سطر", "ostan": 22 }, + { "id": 792, "name": "سعادت شهر", "ostan": 17 }, + { "id": 793, "name": "سعد آباد", "ostan": 7 }, + { "id": 794, "name": "سفیددشت", "ostan": 9 }, + { "id": 795, "name": "سفیدسنگ", "ostan": 11 }, + { "id": 796, "name": "سفیدشهر", "ostan": 4 }, + { "id": 797, "name": "سقز", "ostan": 20 }, + { "id": 798, "name": "سگزآباد", "ostan": 18 }, + { "id": 799, "name": "سلامی", "ostan": 11 }, + { "id": 800, "name": "سلطان آباد", "ostan": 13 }, + { "id": 801, "name": "سلطان آباد", "ostan": 11 }, + { "id": 802, "name": "سلطان شهر", "ostan": 17 }, + { "id": 803, "name": "سلطانیه", "ostan": 14 }, + { "id": 804, "name": "سلفچگان", "ostan": 19 }, + { "id": 805, "name": "سلماس", "ostan": 2 }, + { "id": 806, "name": "سلمان شهر", "ostan": 27 }, + { "id": 807, "name": "سماله", "ostan": 13 }, + { "id": 808, "name": "سمنان", "ostan": 15 }, + { "id": 809, "name": "سمیرم", "ostan": 4 }, + { "id": 810, "name": "سمیع آباد", "ostan": 11 }, + { "id": 811, "name": "سنته", "ostan": 20 }, + { "id": 812, "name": "سنخواست", "ostan": 12 }, + { "id": 813, "name": "سندرک", "ostan": 29 }, + { "id": 814, "name": "سنقر", "ostan": 22 }, + { "id": 815, "name": "سنگان", "ostan": 11 }, + { "id": 816, "name": "سنگدوین", "ostan": 24 }, + { "id": 817, "name": "سنگر", "ostan": 25 }, + { "id": 818, "name": "سنندج", "ostan": 20 }, + { "id": 822, "name": "سودجان", "ostan": 9 }, + { "id": 823, "name": "سوران", "ostan": 16 }, + { "id": 824, "name": "سورشجان", "ostan": 9 }, + { "id": 825, "name": "سورک", "ostan": 27 }, + { "id": 826, "name": "سورمق", "ostan": 17 }, + { "id": 827, "name": "سوزا", "ostan": 29 }, + { "id": 828, "name": "سوسنگرد", "ostan": 13 }, + { "id": 829, "name": "سوق", "ostan": 23 }, + { "id": 830, "name": "سومار", "ostan": 22 }, + { "id": 831, "name": "سه قلعه", "ostan": 10 }, + { "id": 832, "name": "سهرورد", "ostan": 14 }, + { "id": 833, "name": "سهند", "ostan": 1 }, + { "id": 834, "name": "سی سخت", "ostan": 23 }, + { "id": 835, "name": "سیاه منصور", "ostan": 13 }, + { "id": 836, "name": "سیاهکل", "ostan": 25 }, + { "id": 837, "name": "سیدان", "ostan": 17 }, + { "id": 838, "name": "سیراف", "ostan": 7 }, + { "id": 839, "name": "سیرجان", "ostan": 21 }, + { "id": 842, "name": "سیردان", "ostan": 18 }, + { "id": 843, "name": "سیرکان", "ostan": 16 }, + { "id": 844, "name": "سیریک", "ostan": 29 }, + { "id": 845, "name": "سیس", "ostan": 1 }, + { "id": 846, "name": "سیلوانه", "ostan": 2 }, + { "id": 847, "name": "سیمین شهر", "ostan": 24 }, + { "id": 848, "name": "سیمینه", "ostan": 2 }, + { "id": 849, "name": "سین", "ostan": 4 }, + { "id": 850, "name": "سیه چشمه", "ostan": 2 }, + { "id": 851, "name": "سیه رود", "ostan": 1 }, + { "id": 852, "name": "شاپورآباد", "ostan": 4 }, + { "id": 853, "name": "شادگان", "ostan": 13 }, + { "id": 854, "name": "شادمهر", "ostan": 11 }, + { "id": 855, "name": "شازند", "ostan": 28 }, + { "id": 856, "name": "شال", "ostan": 18 }, + { "id": 857, "name": "شاندیز", "ostan": 11 }, + { "id": 858, "name": "شاوور", "ostan": 13 }, + { "id": 859, "name": "شاهپوراباد", "ostan": 26 }, + { "id": 860, "name": "شاهدشهر", "ostan": 8 }, + { "id": 861, "name": "شاهدیه", "ostan": 31 }, + { "id": 862, "name": "شاهرود", "ostan": 15 }, + { "id": 863, "name": "شاهو", "ostan": 22 }, + { "id": 864, "name": "شاهین دژ", "ostan": 2 }, + { "id": 865, "name": "شاهین شهر", "ostan": 4 }, + { "id": 866, "name": "شباب", "ostan": 6 }, + { "id": 867, "name": "شبانکاره", "ostan": 7 }, + { "id": 868, "name": "شبستر", "ostan": 1 }, + { "id": 869, "name": "شرافت", "ostan": 13 }, + { "id": 870, "name": "شربیان", "ostan": 1 }, + { "id": 871, "name": "شرفخانه", "ostan": 1 }, + { "id": 872, "name": "شروینه", "ostan": 22 }, + { "id": 873, "name": "شریف آباد", "ostan": 8 }, + { "id": 874, "name": "شریفیه", "ostan": 18 }, + { "id": 875, "name": "ششتمد", "ostan": 11 }, + { "id": 876, "name": "ششده", "ostan": 17 }, + { "id": 877, "name": "شفت", "ostan": 25 }, + { "id": 878, "name": "شلمان", "ostan": 25 }, + { "id": 879, "name": "شلمزار", "ostan": 9 }, + { "id": 880, "name": "شمس آباد", "ostan": 13 }, + { "id": 881, "name": "شمشک", "ostan": 8 }, + { "id": 882, "name": "شنبه", "ostan": 7 }, + { "id": 883, "name": "شندآباد", "ostan": 1 }, + { "id": 884, "name": "شوسف", "ostan": 10 }, + { "id": 885, "name": "شوش", "ostan": 13 }, + { "id": 886, "name": "شوشتر", "ostan": 13 }, + { "id": 887, "name": "شوط", "ostan": 2 }, + { "id": 888, "name": "شوقان", "ostan": 12 }, + { "id": 889, "name": "شول آباد", "ostan": 26 }, + { "id": 890, "name": "شویشه", "ostan": 20 }, + { "id": 891, "name": "شهباز", "ostan": 28 }, + { "id": 892, "name": "شهداد", "ostan": 21 }, + { "id": 893, "name": "شهر امام", "ostan": 13 }, + { "id": 894, "name": "شهراباد", "ostan": 11 }, + { "id": 895, "name": "شهربابک", "ostan": 21 }, + { "id": 896, "name": "شهرپیر", "ostan": 17 }, + { "id": 897, "name": "شهرجدیدهشتگرد", "ostan": 5 }, + { "id": 898, "name": "شهرزو", "ostan": 11 }, + { "id": 899, "name": "شهرصدرا", "ostan": 17 }, + { "id": 900, "name": "شهرضا", "ostan": 4 }, + { "id": 901, "name": "شهرک سرجنگل", "ostan": 16 }, + { "id": 902, "name": "شهرک علی اکبر", "ostan": 16 }, + { "id": 903, "name": "شهرکرد", "ostan": 9 }, + { "id": 904, "name": "شهریار", "ostan": 8 }, + { "id": 908, "name": "شهمیرزاد", "ostan": 15 }, + { "id": 909, "name": "شهیون", "ostan": 13 }, + { "id": 910, "name": "شیبان", "ostan": 13 }, + { "id": 911, "name": "شیراز", "ostan": 17 }, + { "id": 922, "name": "شیرگاه", "ostan": 27 }, + { "id": 923, "name": "شیروان", "ostan": 12 }, + { "id": 924, "name": "شیرود", "ostan": 27 }, + { "id": 925, "name": "شیرین سو", "ostan": 30 }, + { "id": 926, "name": "صاحب", "ostan": 20 }, + { "id": 927, "name": "صادق اباد", "ostan": 24 }, + { "id": 928, "name": "صالح آباد", "ostan": 11 }, + { "id": 929, "name": "صالح آباد", "ostan": 30 }, + { "id": 930, "name": "صالح آباد", "ostan": 6 }, + { "id": 931, "name": "صالح شهر", "ostan": 13 }, + { "id": 932, "name": "صالحیه", "ostan": 8 }, + { "id": 933, "name": "صایین قلعه", "ostan": 14 }, + { "id": 934, "name": "صباشهر", "ostan": 8 }, + { "id": 935, "name": "صحنه", "ostan": 22 }, + { "id": 936, "name": "صغاد", "ostan": 17 }, + { "id": 937, "name": "صفاییه", "ostan": 21 }, + { "id": 938, "name": "صفادشت", "ostan": 8 }, + { "id": 939, "name": "صفاشهر", "ostan": 17 }, + { "id": 940, "name": "صفی آباد", "ostan": 13 }, + { "id": 941, "name": "صفی آباد", "ostan": 12 }, + { "id": 942, "name": "صمصامی", "ostan": 9 }, + { "id": 943, "name": "صوفیان", "ostan": 1 }, + { "id": 944, "name": "صومعه سرا", "ostan": 25 }, + { "id": 945, "name": "صیدون", "ostan": 13 }, + { "id": 946, "name": "ضیاآباد", "ostan": 18 }, + { "id": 947, "name": "طاقانک", "ostan": 9 }, + { "id": 948, "name": "طالخونچه", "ostan": 4 }, + { "id": 949, "name": "طالقان", "ostan": 5 }, + { "id": 950, "name": "طبس", "ostan": 10 }, + { "id": 951, "name": "طبس مسینا", "ostan": 10 }, + { "id": 952, "name": "طبقده", "ostan": 27 }, + { "id": 953, "name": "طرق رود", "ostan": 4 }, + { "id": 954, "name": "طرقبه", "ostan": 11 }, + { "id": 955, "name": "طسوج", "ostan": 17 }, + { "id": 956, "name": "عالی شهر", "ostan": 7 }, + { "id": 957, "name": "عباس اباد", "ostan": 27 }, + { "id": 958, "name": "عجب شیر", "ostan": 1 }, + { "id": 959, "name": "عسگران", "ostan": 4 }, + { "id": 960, "name": "عسلویه", "ostan": 7 }, + { "id": 961, "name": "عشق آباد", "ostan": 11 }, + { "id": 962, "name": "عشق آباد", "ostan": 10 }, + { "id": 963, "name": "عقدا", "ostan": 31 }, + { "id": 964, "name": "علامرودشت", "ostan": 17 }, + { "id": 965, "name": "علویجه", "ostan": 4 }, + { "id": 966, "name": "علی اباد", "ostan": 24 }, + { "id": 967, "name": "عماد شهر", "ostan": 17 }, + { "id": 968, "name": "عنبر", "ostan": 13 }, + { "id": 969, "name": "عنبرآباد", "ostan": 21 }, + { "id": 970, "name": "عنبران", "ostan": 3 }, + { "id": 971, "name": "غرق آباد", "ostan": 28 }, + { "id": 972, "name": "غلامان", "ostan": 12 }, + { "id": 973, "name": "فارسان", "ostan": 9 }, + { "id": 974, "name": "فارغان", "ostan": 29 }, + { "id": 975, "name": "فاروج", "ostan": 12 }, + { "id": 976, "name": "فاریاب", "ostan": 21 }, + { "id": 977, "name": "فاضل آباد", "ostan": 24 }, + { "id": 978, "name": "فامنین", "ostan": 30 }, + { "id": 979, "name": "فتح آباد", "ostan": 4 }, + { "id": 980, "name": "فتح المبین", "ostan": 13 }, + { "id": 981, "name": "فخراباد", "ostan": 3 }, + { "id": 982, "name": "فدامی", "ostan": 17 }, + { "id": 983, "name": "فرادبنه", "ostan": 9 }, + { "id": 984, "name": "فراشبند", "ostan": 17 }, + { "id": 985, "name": "فراغی", "ostan": 24 }, + { "id": 986, "name": "فرح آباد", "ostan": 27 }, + { "id": 987, "name": "فرخ شهر", "ostan": 9 }, + { "id": 988, "name": "فرخی", "ostan": 4 }, + { "id": 989, "name": "فردوس", "ostan": 10 }, + { "id": 990, "name": "فردوسیه", "ostan": 8 }, + { "id": 991, "name": "فردیس", "ostan": 5 }, + { "id": 992, "name": "فرسفج", "ostan": 30 }, + { "id": 993, "name": "فرمهین", "ostan": 28 }, + { "id": 994, "name": "فرون اباد", "ostan": 8 }, + { "id": 995, "name": "فرهادگرد", "ostan": 11 }, + { "id": 996, "name": "فریدونشهر", "ostan": 4 }, + { "id": 997, "name": "فریدونکنار", "ostan": 27 }, + { "id": 998, "name": "فریم", "ostan": 27 }, + { "id": 999, "name": "فریمان", "ostan": 11 }, + { "id": 1000, "name": "فسا", "ostan": 17 }, + { "id": 1001, "name": "فشم", "ostan": 8 }, + { "id": 1002, "name": "فلاورجان", "ostan": 4 }, + { "id": 1003, "name": "فنوج", "ostan": 16 }, + { "id": 1004, "name": "فولادشهر", "ostan": 4 }, + { "id": 1005, "name": "فومن", "ostan": 25 }, + { "id": 1006, "name": "فهرج", "ostan": 21 }, + { "id": 1007, "name": "فیرورق", "ostan": 2 }, + { "id": 1008, "name": "فیروزآباد", "ostan": 17 }, + { "id": 1009, "name": "فیروزآباد", "ostan": 26 }, + { "id": 1010, "name": "فیروزان", "ostan": 30 }, + { "id": 1011, "name": "فیروزکوه", "ostan": 8 }, + { "id": 1012, "name": "فیروزه", "ostan": 11 }, + { "id": 1013, "name": "فیض آباد", "ostan": 11 }, + { "id": 1014, "name": "فیل اباد", "ostan": 9 }, + { "id": 1015, "name": "فین", "ostan": 29 }, + { "id": 1016, "name": "قایم شهر", "ostan": 27 }, + { "id": 1017, "name": "قاین", "ostan": 10 }, + { "id": 1018, "name": "قادراباد", "ostan": 17 }, + { "id": 1019, "name": "قاسم آباد", "ostan": 11 }, + { "id": 1020, "name": "قاضی", "ostan": 12 }, + { "id": 1021, "name": "قایمیه", "ostan": 17 }, + { "id": 1022, "name": "قدس", "ostan": 8 }, + { "id": 1023, "name": "قدمگاه", "ostan": 11 }, + { "id": 1024, "name": "قرچک", "ostan": 8 }, + { "id": 1025, "name": "قرق", "ostan": 24 }, + { "id": 1026, "name": "قرقری", "ostan": 16 }, + { "id": 1027, "name": "قروه", "ostan": 20 }, + { "id": 1028, "name": "قروه درجزین", "ostan": 30 }, + { "id": 1029, "name": "قره آغاج", "ostan": 1 }, + { "id": 1030, "name": "قره بلاغ", "ostan": 17 }, + { "id": 1031, "name": "قره ضیاءالدین", "ostan": 2 }, + { "id": 1032, "name": "قزوین", "ostan": 18 }, + { "id": 1037, "name": "قشم", "ostan": 29 }, + { "id": 1038, "name": "قصابه", "ostan": 3 }, + { "id": 1039, "name": "قصرشیرین", "ostan": 22 }, + { "id": 1040, "name": "قصرقند", "ostan": 16 }, + { "id": 1041, "name": "قطب آباد", "ostan": 17 }, + { "id": 1042, "name": "قطرویه", "ostan": 17 }, + { "id": 1043, "name": "قطور", "ostan": 2 }, + { "id": 1044, "name": "قلعه", "ostan": 22 }, + { "id": 1045, "name": "قلعه تل", "ostan": 13 }, + { "id": 1046, "name": "قلعه خواجه", "ostan": 13 }, + { "id": 1047, "name": "قلعه رییسی", "ostan": 23 }, + { "id": 1048, "name": "قلعه قاضی", "ostan": 29 }, + { "id": 1049, "name": "قلعه گنج", "ostan": 21 }, + { "id": 1050, "name": "قلعه نو", "ostan": 8 }, + { "id": 1051, "name": "قلندرآباد", "ostan": 11 }, + { "id": 1052, "name": "قم", "ostan": 19 }, + { "id": 1061, "name": "قمصر", "ostan": 4 }, + { "id": 1062, "name": "قنوات", "ostan": 19 }, + { "id": 1063, "name": "قوچان", "ostan": 11 }, + { "id": 1064, "name": "قورچی باشی", "ostan": 28 }, + { "id": 1065, "name": "قوشچی", "ostan": 2 }, + { "id": 1066, "name": "قوشخانه", "ostan": 12 }, + { "id": 1067, "name": "قهاوند", "ostan": 30 }, + { "id": 1068, "name": "قهجاورستان", "ostan": 4 }, + { "id": 1069, "name": "قهدریجان", "ostan": 4 }, + { "id": 1070, "name": "قهستان", "ostan": 10 }, + { "id": 1071, "name": "قیام دشت", "ostan": 8 }, + { "id": 1072, "name": "قیدار", "ostan": 14 }, + { "id": 1073, "name": "قیر", "ostan": 17 }, + { "id": 1074, "name": "کاج", "ostan": 9 }, + { "id": 1075, "name": "کاخک", "ostan": 11 }, + { "id": 1076, "name": "کارچان", "ostan": 28 }, + { "id": 1077, "name": "کارزین (فتح آباد)", "ostan": 17 }, + { "id": 1078, "name": "کاریز", "ostan": 11 }, + { "id": 1079, "name": "کازرون", "ostan": 17 }, + { "id": 1080, "name": "کاشان", "ostan": 4 }, + { "id": 1081, "name": "کاشمر", "ostan": 11 }, + { "id": 1082, "name": "کاظم آباد", "ostan": 21 }, + { "id": 1083, "name": "کاکی", "ostan": 7 }, + { "id": 1084, "name": "کامفیروز", "ostan": 17 }, + { "id": 1085, "name": "کامو و چوگان", "ostan": 4 }, + { "id": 1086, "name": "کامیاران", "ostan": 20 }, + { "id": 1087, "name": "کانی دینار", "ostan": 20 }, + { "id": 1088, "name": "کانی سور", "ostan": 20 }, + { "id": 1089, "name": "کبودرآهنگ", "ostan": 30 }, + { "id": 1090, "name": "کتالم وسادات شهر", "ostan": 27 }, + { "id": 1091, "name": "کتیج", "ostan": 16 }, + { "id": 1092, "name": "کجور", "ostan": 27 }, + { "id": 1093, "name": "کدکن", "ostan": 11 }, + { "id": 1094, "name": "کرج", "ostan": 5 }, + { "id": 1106, "name": "کردکوی", "ostan": 24 }, + { "id": 1107, "name": "کرسف", "ostan": 14 }, + { "id": 1108, "name": "کرفس", "ostan": 30 }, + { "id": 1109, "name": "کرکوند", "ostan": 4 }, + { "id": 1110, "name": "کرمان", "ostan": 21 }, + { "id": 1115, "name": "کرمانشاه", "ostan": 22 }, + { "id": 1124, "name": "کرند", "ostan": 22 }, + { "id": 1125, "name": "کره ای", "ostan": 17 }, + { "id": 1126, "name": "کشاورز", "ostan": 2 }, + { "id": 1127, "name": "کشکسرای", "ostan": 1 }, + { "id": 1128, "name": "کشکوییه", "ostan": 21 }, + { "id": 1129, "name": "کلات", "ostan": 11 }, + { "id": 1130, "name": "کلاته", "ostan": 15 }, + { "id": 1131, "name": "کلاته خیج", "ostan": 15 }, + { "id": 1132, "name": "کلاچای", "ostan": 25 }, + { "id": 1133, "name": "کلارآباد", "ostan": 27 }, + { "id": 1134, "name": "کلاردشت", "ostan": 27 }, + { "id": 1135, "name": "کلاله", "ostan": 24 }, + { "id": 1136, "name": "کلمه", "ostan": 7 }, + { "id": 1137, "name": "کلوانق", "ostan": 1 }, + { "id": 1138, "name": "کلور", "ostan": 3 }, + { "id": 1139, "name": "کلیبر", "ostan": 1 }, + { "id": 1140, "name": "کلیشادوسودرجان", "ostan": 4 }, + { "id": 1141, "name": "کمال شهر", "ostan": 5 }, + { "id": 1142, "name": "کمشچه", "ostan": 4 }, + { "id": 1143, "name": "کمه", "ostan": 4 }, + { "id": 1144, "name": "کمیجان", "ostan": 28 }, + { "id": 1145, "name": "کنارتخته", "ostan": 17 }, + { "id": 1146, "name": "کنارک", "ostan": 16 }, + { "id": 1147, "name": "کندر", "ostan": 11 }, + { "id": 1148, "name": "کنگ", "ostan": 29 }, + { "id": 1149, "name": "کنگاور", "ostan": 22 }, + { "id": 1150, "name": "کوار", "ostan": 17 }, + { "id": 1151, "name": "کوپن", "ostan": 17 }, + { "id": 1152, "name": "کوت سیدنعیم", "ostan": 13 }, + { "id": 1153, "name": "کوت عبداله", "ostan": 13 }, + { "id": 1154, "name": "کوچصفهان", "ostan": 25 }, + { "id": 1155, "name": "کوراییم", "ostan": 3 }, + { "id": 1156, "name": "کوزران", "ostan": 22 }, + { "id": 1157, "name": "کوزه کنان", "ostan": 1 }, + { "id": 1158, "name": "کوشک", "ostan": 4 }, + { "id": 1159, "name": "کوشکنار", "ostan": 29 }, + { "id": 1160, "name": "کومله", "ostan": 25 }, + { "id": 1161, "name": "کوهبنان", "ostan": 21 }, + { "id": 1162, "name": "کوهپایه", "ostan": 4 }, + { "id": 1163, "name": "کوهدشت", "ostan": 26 }, + { "id": 1164, "name": "کوهسار", "ostan": 5 }, + { "id": 1165, "name": "کوهستک", "ostan": 29 }, + { "id": 1166, "name": "کوهنانی", "ostan": 26 }, + { "id": 1167, "name": "کوهنجان", "ostan": 17 }, + { "id": 1168, "name": "کوهی خیل", "ostan": 27 }, + { "id": 1169, "name": "کوهین", "ostan": 18 }, + { "id": 1170, "name": "کهریزسنگ", "ostan": 4 }, + { "id": 1171, "name": "کهریزک", "ostan": 8 }, + { "id": 1172, "name": "کهک", "ostan": 19 }, + { "id": 1173, "name": "کهن آباد", "ostan": 15 }, + { "id": 1174, "name": "کهنوج", "ostan": 21 }, + { "id": 1175, "name": "کیاسر", "ostan": 27 }, + { "id": 1176, "name": "کیاشهر", "ostan": 25 }, + { "id": 1177, "name": "کیاکلا", "ostan": 27 }, + { "id": 1178, "name": "کیان", "ostan": 9 }, + { "id": 1179, "name": "کیانشهر", "ostan": 21 }, + { "id": 1180, "name": "کیش", "ostan": 29 }, + { "id": 1181, "name": "کیلان", "ostan": 8 }, + { "id": 1182, "name": "گالیکش", "ostan": 24 }, + { "id": 1183, "name": "گتاب", "ostan": 27 }, + { "id": 1184, "name": "گتوند", "ostan": 13 }, + { "id": 1185, "name": "گراب", "ostan": 26 }, + { "id": 1186, "name": "گراب سفلی", "ostan": 23 }, + { "id": 1187, "name": "گراش", "ostan": 17 }, + { "id": 1188, "name": "گرگاب", "ostan": 4 }, + { "id": 1189, "name": "گرگان", "ostan": 24 }, + { "id": 1193, "name": "گرماب", "ostan": 14 }, + { "id": 1194, "name": "گرمدره", "ostan": 5 }, + { "id": 1195, "name": "گرمسار", "ostan": 15 }, + { "id": 1196, "name": "گرمه", "ostan": 12 }, + { "id": 1197, "name": "گرمی", "ostan": 3 }, + { "id": 1198, "name": "گروک", "ostan": 29 }, + { "id": 1199, "name": "گزبرخوار", "ostan": 4 }, + { "id": 1200, "name": "گزنک", "ostan": 27 }, + { "id": 1201, "name": "گزیک", "ostan": 10 }, + { "id": 1202, "name": "گشت", "ostan": 16 }, + { "id": 1203, "name": "گل تپه", "ostan": 30 }, + { "id": 1204, "name": "گلباف", "ostan": 21 }, + { "id": 1205, "name": "گلبهار", "ostan": 11 }, + { "id": 1206, "name": "گلپایگان", "ostan": 4 }, + { "id": 1207, "name": "گلدشت", "ostan": 4 }, + { "id": 1208, "name": "گلزار", "ostan": 21 }, + { "id": 1209, "name": "گلسار", "ostan": 5 }, + { "id": 1210, "name": "گلستان", "ostan": 8 }, + { "id": 1211, "name": "گلشن", "ostan": 4 }, + { "id": 1212, "name": "گلشهر", "ostan": 4 }, + { "id": 1213, "name": "گلگیر", "ostan": 13 }, + { "id": 1214, "name": "گلمکان", "ostan": 11 }, + { "id": 1215, "name": "گلمورتی", "ostan": 16 }, + { "id": 1216, "name": "گلوگاه", "ostan": 27 }, + { "id": 1217, "name": "گلوگاه", "ostan": 27 }, + { "id": 1218, "name": "گله دار", "ostan": 17 }, + { "id": 1219, "name": "گلیداغ", "ostan": 24 }, + { "id": 1220, "name": "گمیش تپه", "ostan": 24 }, + { "id": 1221, "name": "گناباد", "ostan": 11 }, + { "id": 1222, "name": "گنبدکاووس", "ostan": 24 }, + { "id": 1223, "name": "گنبکی", "ostan": 21 }, + { "id": 1224, "name": "گندمان", "ostan": 9 }, + { "id": 1225, "name": "گوجان", "ostan": 9 }, + { "id": 1226, "name": "گودین", "ostan": 22 }, + { "id": 1227, "name": "گوراب زرمیخ", "ostan": 25 }, + { "id": 1228, "name": "گوریه", "ostan": 13 }, + { "id": 1229, "name": "گوگ تپه", "ostan": 2 }, + { "id": 1230, "name": "گوگان", "ostan": 1 }, + { "id": 1231, "name": "گوگد", "ostan": 4 }, + { "id": 1232, "name": "گوهران", "ostan": 29 }, + { "id": 1233, "name": "گهرو", "ostan": 9 }, + { "id": 1234, "name": "گهواره", "ostan": 22 }, + { "id": 1235, "name": "گیان", "ostan": 30 }, + { "id": 1236, "name": "گیلانغرب", "ostan": 22 }, + { "id": 1237, "name": "گیوی", "ostan": 3 }, + { "id": 1238, "name": "لاجان", "ostan": 2 }, + { "id": 1239, "name": "لار", "ostan": 17 }, + { "id": 1240, "name": "لالجین", "ostan": 30 }, + { "id": 1241, "name": "لاله زار", "ostan": 21 }, + { "id": 1242, "name": "لالی", "ostan": 13 }, + { "id": 1243, "name": "لامرد", "ostan": 17 }, + { "id": 1244, "name": "لاهرود", "ostan": 3 }, + { "id": 1245, "name": "لاهیجان", "ostan": 25 }, + { "id": 1246, "name": "لای بید", "ostan": 4 }, + { "id": 1247, "name": "لپویی", "ostan": 17 }, + { "id": 1248, "name": "لردگان", "ostan": 9 }, + { "id": 1249, "name": "لشت نشاء", "ostan": 25 }, + { "id": 1250, "name": "لطف آباد", "ostan": 11 }, + { "id": 1251, "name": "لطیفی", "ostan": 17 }, + { "id": 1252, "name": "لمزان", "ostan": 29 }, + { "id": 1253, "name": "لنده", "ostan": 23 }, + { "id": 1254, "name": "لنگرود", "ostan": 25 }, + { "id": 1255, "name": "لواسان", "ostan": 8 }, + { "id": 1256, "name": "لوجلی", "ostan": 12 }, + { "id": 1257, "name": "لوشان", "ostan": 25 }, + { "id": 1258, "name": "لولمان", "ostan": 25 }, + { "id": 1259, "name": "لومار", "ostan": 6 }, + { "id": 1260, "name": "لوندویل", "ostan": 25 }, + { "id": 1261, "name": "لیردف", "ostan": 29 }, + { "id": 1262, "name": "لیسار", "ostan": 25 }, + { "id": 1263, "name": "لیکک", "ostan": 23 }, + { "id": 1264, "name": "لیلان", "ostan": 1 }, + { "id": 1265, "name": "مادرسلیمان", "ostan": 17 }, + { "id": 1266, "name": "مادوان", "ostan": 23 }, + { "id": 1267, "name": "مارگون", "ostan": 23 }, + { "id": 1268, "name": "ماژین", "ostan": 6 }, + { "id": 1269, "name": "ماسال", "ostan": 25 }, + { "id": 1270, "name": "ماسوله", "ostan": 25 }, + { "id": 1271, "name": "ماکلوان", "ostan": 25 }, + { "id": 1272, "name": "ماکو", "ostan": 2 }, + { "id": 1273, "name": "مال خلیفه", "ostan": 9 }, + { "id": 1274, "name": "مامونیه", "ostan": 28 }, + { "id": 1275, "name": "ماه نشان", "ostan": 14 }, + { "id": 1276, "name": "ماهان", "ostan": 21 }, + { "id": 1277, "name": "ماهدشت", "ostan": 5 }, + { "id": 1278, "name": "مبارک آباددیز", "ostan": 17 }, + { "id": 1279, "name": "مبارک شهر", "ostan": 1 }, + { "id": 1280, "name": "مبارکه", "ostan": 4 }, + { "id": 1281, "name": "مجلسی", "ostan": 4 }, + { "id": 1282, "name": "مجن", "ostan": 15 }, + { "id": 1283, "name": "محلات", "ostan": 28 }, + { "id": 1284, "name": "محمدآباد", "ostan": 21 }, + { "id": 1285, "name": "محمدآباد", "ostan": 4 }, + { "id": 1286, "name": "محمدآباد", "ostan": 16 }, + { "id": 1287, "name": "محمدان", "ostan": 16 }, + { "id": 1288, "name": "محمدشهر", "ostan": 10 }, + { "id": 1289, "name": "محمدشهر", "ostan": 5 }, + { "id": 1290, "name": "محمدی", "ostan": 16 }, + { "id": 1291, "name": "محمدیار", "ostan": 2 }, + { "id": 1292, "name": "محمدیه", "ostan": 18 }, + { "id": 1293, "name": "محمله", "ostan": 17 }, + { "id": 1294, "name": "محمودآباد", "ostan": 27 }, + { "id": 1295, "name": "محمودآباد", "ostan": 2 }, + { "id": 1296, "name": "محمودآبادنمونه", "ostan": 18 }, + { "id": 1297, "name": "محی آباد", "ostan": 21 }, + { "id": 1298, "name": "مرادلو", "ostan": 3 }, + { "id": 1299, "name": "مراغه", "ostan": 1 }, + { "id": 1302, "name": "مراوه", "ostan": 24 }, + { "id": 1303, "name": "مرجقل", "ostan": 25 }, + { "id": 1304, "name": "مردهک", "ostan": 21 }, + { "id": 1305, "name": "مرزن آباد", "ostan": 27 }, + { "id": 1306, "name": "مرزیکلا", "ostan": 27 }, + { "id": 1307, "name": "مرگنلر", "ostan": 2 }, + { "id": 1308, "name": "مرند", "ostan": 1 }, + { "id": 1309, "name": "مرودشت", "ostan": 17 }, + { "id": 1310, "name": "مروست", "ostan": 31 }, + { "id": 1311, "name": "مریانج", "ostan": 30 }, + { "id": 1312, "name": "مریوان", "ostan": 20 }, + { "id": 1313, "name": "مزایجان", "ostan": 17 }, + { "id": 1314, "name": "مزدآوند", "ostan": 11 }, + { "id": 1315, "name": "مزرعه", "ostan": 24 }, + { "id": 1316, "name": "مس سرچشمه", "ostan": 21 }, + { "id": 1317, "name": "مسجدسلیمان", "ostan": 13 }, + { "id": 1320, "name": "مشراگه", "ostan": 13 }, + { "id": 1321, "name": "مشکات", "ostan": 4 }, + { "id": 1322, "name": "مشکان", "ostan": 17 }, + { "id": 1323, "name": "مشکان", "ostan": 11 }, + { "id": 1324, "name": "مشکین دشت", "ostan": 5 }, + { "id": 1325, "name": "مشگین شهر", "ostan": 3 }, + { "id": 1326, "name": "مشهد", "ostan": 11 }, + { "id": 1328, "name": "مشهد ثامن", "ostan": 11 }, + { "id": 1340, "name": "مشهدریزه", "ostan": 11 }, + { "id": 1341, "name": "مصیری", "ostan": 17 }, + { "id": 1342, "name": "معلم کلایه", "ostan": 18 }, + { "id": 1343, "name": "معمولان", "ostan": 26 }, + { "id": 1344, "name": "مغان سر", "ostan": 3 }, + { "id": 1345, "name": "مقاومت", "ostan": 13 }, + { "id": 1346, "name": "ملاثانی", "ostan": 13 }, + { "id": 1347, "name": "ملارد", "ostan": 8 }, + { "id": 1348, "name": "ملایر", "ostan": 30 }, + { "id": 1349, "name": "ملک آباد", "ostan": 11 }, + { "id": 1350, "name": "ملکان", "ostan": 1 }, + { "id": 1351, "name": "ممقان", "ostan": 1 }, + { "id": 1352, "name": "منج", "ostan": 9 }, + { "id": 1353, "name": "منجیل", "ostan": 25 }, + { "id": 1354, "name": "منصوریه", "ostan": 13 }, + { "id": 1355, "name": "منظریه", "ostan": 4 }, + { "id": 1356, "name": "منوجان", "ostan": 21 }, + { "id": 1357, "name": "موچش", "ostan": 20 }, + { "id": 1358, "name": "مود", "ostan": 10 }, + { "id": 1359, "name": "مورموری", "ostan": 6 }, + { "id": 1360, "name": "موسیان", "ostan": 6 }, + { "id": 1361, "name": "مومن آباد", "ostan": 26 }, + { "id": 1362, "name": "مهاباد", "ostan": 2 }, + { "id": 1363, "name": "مهاباد", "ostan": 4 }, + { "id": 1364, "name": "مهاجران", "ostan": 28 }, + { "id": 1365, "name": "مهاجران", "ostan": 30 }, + { "id": 1366, "name": "مهدی شهر", "ostan": 15 }, + { "id": 1367, "name": "مهر", "ostan": 17 }, + { "id": 1368, "name": "مهر", "ostan": 6 }, + { "id": 1369, "name": "مهران", "ostan": 6 }, + { "id": 1370, "name": "مهربان", "ostan": 1 }, + { "id": 1371, "name": "مهردشت", "ostan": 31 }, + { "id": 1372, "name": "مهرستان", "ostan": 16 }, + { "id": 1373, "name": "مهریز", "ostan": 31 }, + { "id": 1374, "name": "میامی", "ostan": 15 }, + { "id": 1375, "name": "میان راهان", "ostan": 22 }, + { "id": 1376, "name": "میاندوآب", "ostan": 2 }, + { "id": 1377, "name": "میانرود", "ostan": 13 }, + { "id": 1378, "name": "میانشهر", "ostan": 17 }, + { "id": 1379, "name": "میانه", "ostan": 1 }, + { "id": 1380, "name": "میبد", "ostan": 31 }, + { "id": 1381, "name": "میداود", "ostan": 13 }, + { "id": 1382, "name": "میرآباد", "ostan": 2 }, + { "id": 1383, "name": "میرجاوه", "ostan": 16 }, + { "id": 1384, "name": "میلاجرد", "ostan": 28 }, + { "id": 1385, "name": "میمند", "ostan": 17 }, + { "id": 1386, "name": "میمه", "ostan": 4 }, + { "id": 1387, "name": "میمه", "ostan": 6 }, + { "id": 1388, "name": "میناب", "ostan": 29 }, + { "id": 1389, "name": "مینودشت", "ostan": 24 }, + { "id": 1390, "name": "مینوشهر", "ostan": 13 }, + { "id": 1391, "name": "نازک علیا", "ostan": 2 }, + { "id": 1392, "name": "ناغان", "ostan": 9 }, + { "id": 1393, "name": "نافچ", "ostan": 9 }, + { "id": 1394, "name": "نالوس", "ostan": 2 }, + { "id": 1395, "name": "نایین", "ostan": 4 }, + { "id": 1396, "name": "نجف آباد", "ostan": 4 }, + { "id": 1397, "name": "نجف شهر", "ostan": 21 }, + { "id": 1398, "name": "نخل تقی", "ostan": 7 }, + { "id": 1399, "name": "ندوشن", "ostan": 31 }, + { "id": 1400, "name": "نراق", "ostan": 28 }, + { "id": 1401, "name": "نرجه", "ostan": 18 }, + { "id": 1402, "name": "نرماشیر", "ostan": 21 }, + { "id": 1403, "name": "نسیم شهر", "ostan": 8 }, + { "id": 1404, "name": "نشتارود", "ostan": 27 }, + { "id": 1405, "name": "نشتیفان", "ostan": 11 }, + { "id": 1406, "name": "نصرآباد", "ostan": 11 }, + { "id": 1407, "name": "نصرآباد", "ostan": 4 }, + { "id": 1408, "name": "نصرت آباد", "ostan": 16 }, + { "id": 1409, "name": "نصیرشهر", "ostan": 8 }, + { "id": 1410, "name": "نطنز", "ostan": 4 }, + { "id": 1411, "name": "نظام شهر", "ostan": 21 }, + { "id": 1412, "name": "نظرآباد", "ostan": 5 }, + { "id": 1413, "name": "نظرکهریزی", "ostan": 1 }, + { "id": 1414, "name": "نقاب", "ostan": 11 }, + { "id": 1415, "name": "نقده", "ostan": 2 }, + { "id": 1416, "name": "نقنه", "ostan": 9 }, + { "id": 1417, "name": "نکا", "ostan": 27 }, + { "id": 1418, "name": "نگار", "ostan": 21 }, + { "id": 1419, "name": "نگور", "ostan": 16 }, + { "id": 1420, "name": "نگین شهر", "ostan": 24 }, + { "id": 1421, "name": "نلاس", "ostan": 2 }, + { "id": 1422, "name": "نمین", "ostan": 3 }, + { "id": 1423, "name": "نوبران", "ostan": 28 }, + { "id": 1424, "name": "نوبندگان", "ostan": 17 }, + { "id": 1425, "name": "نوجین", "ostan": 17 }, + { "id": 1426, "name": "نوخندان", "ostan": 11 }, + { "id": 1427, "name": "نودان", "ostan": 17 }, + { "id": 1428, "name": "نودژ", "ostan": 21 }, + { "id": 1429, "name": "نودشه", "ostan": 22 }, + { "id": 1430, "name": "نوده خاندوز", "ostan": 24 }, + { "id": 1431, "name": "نور", "ostan": 27 }, + { "id": 1432, "name": "نورآباد", "ostan": 17 }, + { "id": 1433, "name": "نورآباد", "ostan": 26 }, + { "id": 1434, "name": "نوربهار", "ostan": 14 }, + { "id": 1435, "name": "نوسود", "ostan": 22 }, + { "id": 1436, "name": "نوش آباد", "ostan": 4 }, + { "id": 1437, "name": "نوشهر", "ostan": 27 }, + { "id": 1438, "name": "نوشین", "ostan": 2 }, + { "id": 1439, "name": "نوک آباد", "ostan": 16 }, + { "id": 1440, "name": "نوکنده", "ostan": 24 }, + { "id": 1441, "name": "نهاوند", "ostan": 30 }, + { "id": 1442, "name": "نهبندان", "ostan": 10 }, + { "id": 1443, "name": "نی ریز", "ostan": 17 }, + { "id": 1444, "name": "نیاسر", "ostan": 4 }, + { "id": 1445, "name": "نیر", "ostan": 31 }, + { "id": 1446, "name": "نیر", "ostan": 3 }, + { "id": 1447, "name": "نیشابور", "ostan": 11 }, + { "id": 1450, "name": "نیک آباد", "ostan": 4 }, + { "id": 1451, "name": "نیک پی", "ostan": 14 }, + { "id": 1452, "name": "نیک شهر", "ostan": 16 }, + { "id": 1453, "name": "نیل شهر", "ostan": 11 }, + { "id": 1454, "name": "نیمبلوک", "ostan": 10 }, + { "id": 1455, "name": "نیمور", "ostan": 28 }, + { "id": 1456, "name": "واجارگاه", "ostan": 25 }, + { "id": 1457, "name": "وایقان", "ostan": 1 }, + { "id": 1458, "name": "وحدتیه", "ostan": 7 }, + { "id": 1459, "name": "وحیدیه", "ostan": 8 }, + { "id": 1460, "name": "ورامین", "ostan": 8 }, + { "id": 1461, "name": "وراوی", "ostan": 17 }, + { "id": 1462, "name": "وردنجان", "ostan": 9 }, + { "id": 1463, "name": "ورزقان", "ostan": 1 }, + { "id": 1464, "name": "ورزنه", "ostan": 4 }, + { "id": 1465, "name": "ورنامخواست", "ostan": 4 }, + { "id": 1466, "name": "وزوان", "ostan": 4 }, + { "id": 1467, "name": "ونک", "ostan": 4 }, + { "id": 1468, "name": "ویس", "ostan": 13 }, + { "id": 1469, "name": "ویسیان", "ostan": 26 }, + { "id": 1470, "name": "هادی شهر", "ostan": 27 }, + { "id": 1471, "name": "هادیشهر", "ostan": 1 }, + { "id": 1472, "name": "هارونی", "ostan": 9 }, + { "id": 1473, "name": "هجدک", "ostan": 21 }, + { "id": 1474, "name": "هچیرود", "ostan": 27 }, + { "id": 1475, "name": "هرات", "ostan": 31 }, + { "id": 1476, "name": "هرسین", "ostan": 22 }, + { "id": 1477, "name": "هرمز", "ostan": 29 }, + { "id": 1478, "name": "هرند", "ostan": 4 }, + { "id": 1479, "name": "هریس", "ostan": 1 }, + { "id": 1480, "name": "هزارکانیان", "ostan": 20 }, + { "id": 1481, "name": "هشتبندی", "ostan": 29 }, + { "id": 1482, "name": "هشتپر (تالش)", "ostan": 25 }, + { "id": 1483, "name": "هشتجین", "ostan": 3 }, + { "id": 1484, "name": "هشترود", "ostan": 1 }, + { "id": 1485, "name": "هشتگرد", "ostan": 5 }, + { "id": 1486, "name": "هفت چشمه", "ostan": 26 }, + { "id": 1487, "name": "هفتگل", "ostan": 13 }, + { "id": 1488, "name": "هفشجان", "ostan": 9 }, + { "id": 1489, "name": "هلشی", "ostan": 22 }, + { "id": 1490, "name": "هماشهر", "ostan": 17 }, + { "id": 1491, "name": "هماشهر", "ostan": 21 }, + { "id": 1492, "name": "همت آباد", "ostan": 11 }, + { "id": 1493, "name": "همدان", "ostan": 30 }, + { "id": 1498, "name": "هندودر", "ostan": 28 }, + { "id": 1499, "name": "هندیجان", "ostan": 13 }, + { "id": 1500, "name": "هنزا", "ostan": 21 }, + { "id": 1501, "name": "هوراند", "ostan": 1 }, + { "id": 1502, "name": "هوره", "ostan": 9 }, + { "id": 1503, "name": "هویزه", "ostan": 13 }, + { "id": 1504, "name": "هیدج", "ostan": 14 }, + { "id": 1505, "name": "هیدوچ", "ostan": 16 }, + { "id": 1506, "name": "هیر", "ostan": 3 }, + { "id": 1507, "name": "یاسوج", "ostan": 23 }, + { "id": 1508, "name": "یاسوکند", "ostan": 20 }, + { "id": 1509, "name": "یامچی", "ostan": 1 }, + { "id": 1510, "name": "یان چشمه", "ostan": 9 }, + { "id": 1511, "name": "یزد", "ostan": 31 }, + { "id": 1515, "name": "یزدان شهر", "ostan": 21 }, + { "id": 1516, "name": "یکه سعود", "ostan": 12 }, + { "id": 1517, "name": "یولاگلدی", "ostan": 2 }, + { "id": 1518, "name": "یونسی", "ostan": 11 } +] diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index 876fa66..339a183 100644 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -352,18 +352,28 @@ export const enum DiscountMessage { START_DATE_INVALID = "تاریخ شروع نامعتبر است", END_DATE_REQUIRED = "وارد کردن تاریخ پایان الزامی است", END_DATE_INVALID = "تاریخ پایان نامعتبر است", - SERVICES_INVALID = "لیست خدمات باید آرایه‌ای از اعداد باشد", + SERVICES_INVALID = "لیست خدمات باید آرایه‌ای از ایدی باشد", SERVICES_DUPLICATE = "خدمات نباید تکراری باشند", SERVICES_UUID_INVALID = "ایدی سرویس معتبرنیست", + USER_UUID_INVALID = "ایدی کاربر معتبرنیست", + USER_DUPLICATE = "کاربر نباید تکراری باشند", + USER_INVALID = "لیست کاربرا باید آرایه‌ای از ایدی باشد", NOT_FOUND = "کد تخفیف با این مشخصات یافت نشد", CODE_EXIST = "کد تخفیف قبلا ایجاد شده است", + INVOICE_ID_REQUIRED = "شناسه فاکتور نمی‌تواند خالی باشد", + INVOICE_ID_STRING = "شناسه فاکتور باید یک رشته باشد", + DISCOUNT_CODE_REQUIRED = "کد تخفیف نمی‌تواند خالی باشد", + DISCOUNT_CODE_STRING = "کد تخفیف باید یک رشته باشد", + DISCOUNT_NOT_FOUND = "کد تخفیف یافت نشد یا غیرفعال است", + DISCOUNT_NOT_APPLICABLE = "این کد تخفیف برای هیچ یک از پلن‌های اشتراک در فاکتور قابل اعمال نیست", } + export const enum EmailMessage { EMAIL_VERIFICATION = "تایید ایمیل", } export const enum FinancialMessage { - FINANCIAL_TYPE_INVALID = "نوع اطلاعات باید یکی از مقادیر REAL یا LEGAL باشد", + GENDER_TYPE_INVALID = "نوع جنسیت باید یکی از مقادیر FEMALE یا MALE باشد", ECONOMIC_CODE_INVALID = "کد اقتصادی باید یک رشته باشد", REGISTRATION_ID_INVALID = "شناسه ثبت باید یک رشته باشد", NATIONAL_ID_INVALID = "شناسه ملی باید یک رشته باشد", diff --git a/src/modules/address/address.controller.ts b/src/modules/address/address.controller.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/address/address.module.ts b/src/modules/address/address.module.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/address/entities/address.entity.ts b/src/modules/address/entities/address.entity.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/address/entities/city.entity.ts b/src/modules/address/entities/city.entity.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/discounts/DTO/create-discount.dto.ts b/src/modules/discounts/DTO/create-discount.dto.ts index a75bf68..da11c54 100644 --- a/src/modules/discounts/DTO/create-discount.dto.ts +++ b/src/modules/discounts/DTO/create-discount.dto.ts @@ -37,8 +37,15 @@ export class CreateDiscountDto { @ApiPropertyOptional({ description: "لیست آیدی‌های خدمات", type: [String], example: ["f47ac10b-58cc-4372-a567-0e02b2c3d479"] }) @IsOptional() - @IsArray({ message: DiscountMessage.SERVICES_INVALID }) @ArrayUnique({ message: DiscountMessage.SERVICES_DUPLICATE }) + @IsArray({ message: DiscountMessage.SERVICES_INVALID }) @IsUUID("4", { each: true, message: DiscountMessage.SERVICES_UUID_INVALID }) - services?: string[]; + subscriptionPlanIds?: string[]; + + @ApiPropertyOptional({ description: "لیست آیدی‌های کاربران", type: [String], example: ["f47ac10b-58cc-4372-a567-0e02b2c3d479"] }) + @IsOptional() + @ArrayUnique({ message: DiscountMessage.USER_DUPLICATE }) + @IsArray({ message: DiscountMessage.USER_INVALID }) + @IsUUID("4", { each: true, message: DiscountMessage.USER_UUID_INVALID }) + userIds?: string[]; } diff --git a/src/modules/discounts/discounts.controller.ts b/src/modules/discounts/discounts.controller.ts index c19ee09..d6ceca0 100644 --- a/src/modules/discounts/discounts.controller.ts +++ b/src/modules/discounts/discounts.controller.ts @@ -5,6 +5,7 @@ import { CreateDiscountDto } from "./DTO/create-discount.dto"; import { DiscountService } from "./providers/discounts.service"; import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; import { Roles } from "../../common/decorators/roles.decorator"; +import { UserDec } from "../../common/decorators/user.decorator"; import { ParamDto } from "../../common/DTO/param.dto"; import { RoleEnum } from "../users/enums/role.enum"; @@ -43,6 +44,14 @@ export class DiscountController { //************************************ */ + @ApiOperation({ summary: "Retrieve a discounts by userID" }) + @Get("/user-discounts") + async findDiscountsByUsers(@UserDec("id") userId: string) { + return this.discountService.findDiscountsByUser(userId); + } + + //************************************ */ + @ApiOperation({ summary: "Toggle active/deactive discount" }) @Roles(RoleEnum.ADMIN) @Patch(":id/toggle") diff --git a/src/modules/discounts/discounts.module.ts b/src/modules/discounts/discounts.module.ts index 07fc487..b688121 100644 --- a/src/modules/discounts/discounts.module.ts +++ b/src/modules/discounts/discounts.module.ts @@ -5,10 +5,11 @@ import { DiscountController } from "./discounts.controller"; import { Discount } from "./entities/discount.entity"; import { DiscountService } from "./providers/discounts.service"; import { DiscountRepository } from "./repositories/discount.repository"; -import { DanakServicesModule } from "../danak-services/danak-services.module"; +import { SubscriptionsModule } from "../subscriptions/subscriptions.module"; +import { UsersModule } from "../users/users.module"; @Module({ - imports: [TypeOrmModule.forFeature([Discount]), DanakServicesModule], + imports: [TypeOrmModule.forFeature([Discount]), SubscriptionsModule, UsersModule], providers: [DiscountService, DiscountRepository], controllers: [DiscountController], }) diff --git a/src/modules/discounts/entities/discount.entity.ts b/src/modules/discounts/entities/discount.entity.ts index 78c6e65..19f38d0 100644 --- a/src/modules/discounts/entities/discount.entity.ts +++ b/src/modules/discounts/entities/discount.entity.ts @@ -1,10 +1,11 @@ // eslint-disable-next-line import/no-named-as-default import Decimal from "decimal.js"; -import { Column, Entity, ManyToOne } from "typeorm"; +import { Column, Entity, JoinTable, ManyToMany } from "typeorm"; import { BaseEntity } from "../../../common/entities/base.entity"; import { DecimalTransformer } from "../../../common/transformers/decimal.transformer"; import { SubscriptionPlan } from "../../subscriptions/entities/subscription.entity"; +import { User } from "../../users/entities/user.entity"; import { DiscountCalculationType, DiscountType } from "../enums/discount-type.enum"; @Entity() @@ -33,6 +34,11 @@ export class Discount extends BaseEntity { @Column({ type: "timestamptz" }) endDate: Date; - @ManyToOne(() => SubscriptionPlan, { nullable: true, onDelete: "SET NULL" }) - subscriptionPlan: SubscriptionPlan; + @ManyToMany(() => SubscriptionPlan, (subscriptionPlan) => subscriptionPlan.discounts, { nullable: true }) + @JoinTable() + subscriptionPlans: SubscriptionPlan[]; + + @ManyToMany(() => User, (user) => user.discounts, { nullable: true }) + @JoinTable() + users: User[]; } diff --git a/src/modules/discounts/providers/discounts.service.ts b/src/modules/discounts/providers/discounts.service.ts index 7d98e78..e3cbda0 100644 --- a/src/modules/discounts/providers/discounts.service.ts +++ b/src/modules/discounts/providers/discounts.service.ts @@ -1,9 +1,11 @@ import { randomBytes } from "node:crypto"; -import { BadRequestException, Injectable } from "@nestjs/common"; +import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; +import { In } from "typeorm"; -import { CommonMessage, DiscountMessage } from "../../../common/enums/message.enum"; -// import { DanakServicesService } from "../../danak-services/providers/danak-services.service"; +import { CommonMessage, DiscountMessage, SubscriptionMessage, UserMessage } from "../../../common/enums/message.enum"; +import { SubscriptionsPlanRepository } from "../../subscriptions/repositories/subscriptions.repository"; +import { UserRepository } from "../../users/repositories/users.repository"; import { CreateDiscountDto } from "../DTO/create-discount.dto"; import { DiscountRepository } from "../repositories/discount.repository"; @@ -11,13 +13,14 @@ import { DiscountRepository } from "../repositories/discount.repository"; export class DiscountService { constructor( private readonly discountRepository: DiscountRepository, - // private readonly danakServicesService: DanakServicesService, + private readonly subscriptionPlanRepository: SubscriptionsPlanRepository, + private readonly userRepository: UserRepository, ) {} /******************************************** */ async create(createDiscountDto: CreateDiscountDto) { - const { services, ...discountData } = createDiscountDto; + const { subscriptionPlanIds, ...discountData } = createDiscountDto; const code = await this.generateUniqueCouponCode(); @@ -26,10 +29,28 @@ export class DiscountService { code, }); - if (services && services.length) { - // const foundServices = await this.danakServicesService.findServicesByIds(services); - // discount.services = foundServices; + if (createDiscountDto.subscriptionPlanIds && createDiscountDto.subscriptionPlanIds.length) { + const subscriptionPlans = await this.subscriptionPlanRepository.find({ + where: { id: In(createDiscountDto.subscriptionPlanIds) }, + }); + + if (subscriptionPlans.length !== createDiscountDto.subscriptionPlanIds.length) { + throw new NotFoundException(SubscriptionMessage.NOT_FOUND); + } + + discount.subscriptionPlans = subscriptionPlans; } + + if (createDiscountDto.userIds) { + const users = await this.userRepository.find({ where: { id: In(createDiscountDto.userIds) } }); + + if (users.length !== createDiscountDto.userIds.length) { + throw new NotFoundException(UserMessage.USER_NOT_FOUND); + } + + discount.users = users; + } + await this.discountRepository.save(discount); return { @@ -40,9 +61,39 @@ export class DiscountService { /******************************************** */ + async findByCode(code: string) { + const discount = await this.discountRepository.findOne({ + where: { code, isActive: true }, + relations: ["subscriptionPlans"], + }); + if (!discount) { + throw new NotFoundException(DiscountMessage.NOT_FOUND); + } + return { discount }; + } + + /******************************************** */ + + async findDiscountsByUser(userId: string) { + const user = await this.userRepository.findOneBy({ + id: userId, + }); + if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND); + + const discounts = await this.discountRepository.find({ + where: { + users: { id: user.id }, + }, + }); + + return { discounts }; + } + + /******************************************** */ + async findAll() { - const services = await this.discountRepository.find({ relations: ["services"] }); - return { services }; + const discounts = await this.discountRepository.find({ relations: ["subscriptionPlans"] }); + return { discounts }; } /******************************************** */ @@ -50,7 +101,7 @@ export class DiscountService { async findOne(id: string) { const discount = await this.discountRepository.findOne({ where: { id }, - relations: ["services"], + relations: ["subscriptionPlans"], }); if (!discount) throw new BadRequestException(DiscountMessage.NOT_FOUND); return { discount }; diff --git a/src/modules/invoices/DTO/apply-discount-invoice.dto.ts b/src/modules/invoices/DTO/apply-discount-invoice.dto.ts new file mode 100644 index 0000000..e279eda --- /dev/null +++ b/src/modules/invoices/DTO/apply-discount-invoice.dto.ts @@ -0,0 +1,13 @@ +import { IsNotEmpty, IsString } from "class-validator"; + +import { DiscountMessage } from "../../../common/enums/message.enum"; + +export class ApplyDiscountDto { + @IsString({ message: DiscountMessage.INVOICE_ID_STRING }) + @IsNotEmpty({ message: DiscountMessage.INVOICE_ID_REQUIRED }) + invoiceId: string; + + @IsString({ message: DiscountMessage.DISCOUNT_CODE_STRING }) + @IsNotEmpty({ message: DiscountMessage.DISCOUNT_CODE_REQUIRED }) + discountCode: string; +} diff --git a/src/modules/invoices/entities/invoice.entity.ts b/src/modules/invoices/entities/invoice.entity.ts index 0e0864f..7db1666 100644 --- a/src/modules/invoices/entities/invoice.entity.ts +++ b/src/modules/invoices/entities/invoice.entity.ts @@ -5,6 +5,7 @@ import { Column, Entity, ManyToOne, OneToMany } from "typeorm"; import { InvoiceItem } from "./invoice-item.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; import { DecimalTransformer } from "../../../common/transformers/decimal.transformer"; +import { Discount } from "../../discounts/entities/discount.entity"; import { User } from "../../users/entities/user.entity"; import { InvoiceStatus } from "../enums/invoice-status.enum"; @@ -28,9 +29,14 @@ export class Invoice extends BaseEntity { @Column({ type: "int", default: 0 }) tax: number; + //--------------------------------------------- + @OneToMany(() => InvoiceItem, (invoiceItem) => invoiceItem.invoice, { cascade: true }) items: InvoiceItem[]; + @ManyToOne(() => Discount, { nullable: true, onDelete: "SET NULL" }) + discount: Discount; + get isOverdue(): boolean { return this.status === InvoiceStatus.PENDING && new Date() > this.dueDate; } diff --git a/src/modules/invoices/invoices.module.ts b/src/modules/invoices/invoices.module.ts index d0ba06f..d7c7bef 100644 --- a/src/modules/invoices/invoices.module.ts +++ b/src/modules/invoices/invoices.module.ts @@ -6,10 +6,12 @@ import { Invoice } from "./entities/invoice.entity"; import { InvoicesController } from "./invoices.controller"; import { InvoicesService } from "./providers/invoices.service"; import { InvoicesRepository } from "./repositories/invoices.repository"; +import { Discount } from "../discounts/entities/discount.entity"; +import { DiscountRepository } from "../discounts/repositories/discount.repository"; @Module({ - imports: [TypeOrmModule.forFeature([Invoice, InvoiceItem])], - providers: [InvoicesService, InvoicesRepository], + imports: [TypeOrmModule.forFeature([Invoice, InvoiceItem, Discount])], + providers: [InvoicesService, InvoicesRepository, DiscountRepository], controllers: [InvoicesController], exports: [InvoicesService], }) diff --git a/src/modules/invoices/providers/invoices.service.ts b/src/modules/invoices/providers/invoices.service.ts index dcf9321..1d87675 100644 --- a/src/modules/invoices/providers/invoices.service.ts +++ b/src/modules/invoices/providers/invoices.service.ts @@ -4,9 +4,11 @@ import Decimal from "decimal.js"; import { QueryRunner } from "typeorm"; import { InvoiceMessage } from "../../../common/enums/message.enum"; +import { DiscountRepository } from "../../discounts/repositories/discount.repository"; import { SubscriptionPlan } from "../../subscriptions/entities/subscription.entity"; import { RoleEnum } from "../../users/enums/role.enum"; import { PaginationUtils } from "../../utils/providers/pagination.utils"; +import { ApplyDiscountDto } from "../DTO/apply-discount-invoice.dto"; import { CreateInvoiceDto } from "../DTO/create-invoice.dto"; import { InvoicesSearchQueryDto, UserInvoicesSearchQueryDto } from "../DTO/invoices-search-query.dto"; import { Invoice } from "../entities/invoice.entity"; @@ -18,9 +20,12 @@ import { InvoicesRepository } from "../repositories/invoices.repository"; export class InvoicesService { constructor( private readonly invoiceRepository: InvoicesRepository, + private readonly discountRepository: DiscountRepository, // private readonly invoiceItemsRepository: InvoiceItemsRepository, ) {} + ///********************************** */ + async createInvoiceAdmin(createDto: CreateInvoiceDto) { // const invoiceItems = createDto.items.map((item) => { @@ -55,7 +60,9 @@ export class InvoicesService { invoice, }; } + ///********************************** */ + async createInvoiceForSubscription(userId: string, plan: SubscriptionPlan, dueDate: Date, queryRunner: QueryRunner) { const invoiceItems = [ { name: plan.service.name, count: 1, unitPrice: plan.price, discount: 0, subscriptionPlan: plan, totalPrice: plan.price }, @@ -117,7 +124,9 @@ export class InvoicesService { paginate: true, }; } + //*********************************** */ + async getInvoiceById(invoiceId: string, role: RoleEnum, userId: string) { let invoice: Invoice | null; @@ -139,7 +148,9 @@ export class InvoicesService { invoice, }; } + //*********************************** */ + async getUserInvoices(queryDto: UserInvoicesSearchQueryDto, userId: string) { const { limit, skip } = PaginationUtils(queryDto); @@ -165,4 +176,56 @@ export class InvoicesService { paginate: true, }; } + + //*********************************** */ + + async applyDiscount(invoiceId: string, applyDiscountDto: ApplyDiscountDto) { + const invoice = await this.invoiceRepository.findOneBy({ id: invoiceId }); + if (!invoice) throw new BadRequestException(InvoiceMessage.NOT_FOUND_BY_ID); + + const discount = await this.discountRepository.findOne({ + where: { code: applyDiscountDto.discountCode, isActive: true }, + relations: ["subscriptionPlans", "users"], + }); + if (!discount) { + throw new BadRequestException(`Discount with code ${applyDiscountDto.discountCode} not found or inactive`); + } + + if (discount.subscriptionPlans && discount.subscriptionPlans.length > 0) { + const isApplicable = invoice.items.some((item) => { + const subscriptionPlan = item.subscriptionPlan; + if (!subscriptionPlan) return false; + return discount.subscriptionPlans.some((plan) => plan.id === subscriptionPlan.id); + }); + if (!isApplicable) { + throw new BadRequestException("This discount is not applicable to any subscription plan in the invoice."); + } + } + + if (discount.users && discount.users.length > 0) { + if (!invoice.user || !discount.users.some((user) => user.id === invoice.user.id)) { + throw new BadRequestException("This discount is not applicable for this user."); + } + } + + invoice.discount = discount; + await this.invoiceRepository.save(invoice); + + return { invoice }; + } + + async calculateFinalPrice(invoiceId: string): Promise { + const invoice = await this.invoiceRepository.findOneBy({ id: invoiceId }); + if (!invoice) throw new BadRequestException(InvoiceMessage.NOT_FOUND_BY_ID); + + let discountValue = new Decimal(0); + if (invoice.discount) { + if (invoice.discount.calculationType === "PERCENTAGE") { + discountValue = invoice.totalPrice.mul(invoice.discount.amount).div(100); + } else if (invoice.discount.calculationType === "FIXED") { + discountValue = new Decimal(invoice.discount.amount); + } + } + return invoice.totalPrice.minus(discountValue); + } } diff --git a/src/modules/subscriptions/entities/subscription.entity.ts b/src/modules/subscriptions/entities/subscription.entity.ts index 5f51966..428b066 100644 --- a/src/modules/subscriptions/entities/subscription.entity.ts +++ b/src/modules/subscriptions/entities/subscription.entity.ts @@ -1,10 +1,11 @@ // eslint-disable-next-line import/no-named-as-default import Decimal from "decimal.js"; -import { Column, Entity, Index, ManyToOne } from "typeorm"; +import { Column, Entity, Index, ManyToMany, ManyToOne } from "typeorm"; import { BaseEntity } from "../../../common/entities/base.entity"; import { DecimalTransformer } from "../../../common/transformers/decimal.transformer"; import { DanakService } from "../../danak-services/entities/danak-service.entity"; +import { Discount } from "../../discounts/entities/discount.entity"; @Entity() @Index(["service", "name"], { unique: true }) @@ -23,4 +24,7 @@ export class SubscriptionPlan extends BaseEntity { @ManyToOne(() => DanakService, (danakService) => danakService.subscriptionPlans, { nullable: false, onDelete: "CASCADE" }) service: DanakService; + + @ManyToMany(() => Discount, (discount) => discount.subscriptionPlans) + discounts: Discount[]; } diff --git a/src/modules/subscriptions/subscriptions.module.ts b/src/modules/subscriptions/subscriptions.module.ts index 4c59ba6..7db7169 100644 --- a/src/modules/subscriptions/subscriptions.module.ts +++ b/src/modules/subscriptions/subscriptions.module.ts @@ -22,6 +22,6 @@ import { WalletsModule } from "../wallets/wallets.module"; ], providers: [SubscriptionsService, SubscriptionsPlanRepository, UserSubscriptionsRepository], controllers: [SubscriptionsController], - exports: [SubscriptionsService], + exports: [SubscriptionsService, TypeOrmModule, SubscriptionsPlanRepository], }) export class SubscriptionsModule {} diff --git a/src/modules/users/DTO/create-legal-user.dto.ts b/src/modules/users/DTO/create-legal-user.dto.ts new file mode 100644 index 0000000..7170a1a --- /dev/null +++ b/src/modules/users/DTO/create-legal-user.dto.ts @@ -0,0 +1,32 @@ +import { ApiPropertyOptional } from "@nestjs/swagger"; +import { IsNotEmpty, IsOptional, IsString, IsUUID } from "class-validator"; + +import { FinancialMessage } from "../../../common/enums/message.enum"; + +export class CreateFinancialDto { + @ApiPropertyOptional({ description: "Economic code" }) + @IsOptional() + @IsString({ message: FinancialMessage.ECONOMIC_CODE_INVALID }) + economicCode?: string; + + @ApiPropertyOptional({ description: "Registration ID" }) + @IsOptional() + @IsString({ message: FinancialMessage.REGISTRATION_ID_INVALID }) + registrationId?: string; + + @ApiPropertyOptional({ description: "number" }) + @IsOptional() + @IsString({ message: FinancialMessage.FIXED_PHONE_INVALID }) + number?: string; + + @ApiPropertyOptional({ description: "number" }) + @IsOptional() + @IsString({ message: FinancialMessage.NATIONAL_ID_INVALID }) + nationalId?: string; + + @ApiPropertyOptional({ description: "User id", example: "123e4567-e89b-12d3-a456-426614174000" }) + @IsOptional() + @IsNotEmpty({ message: FinancialMessage.USER_ID_REQUIRED }) + @IsUUID("4", { message: FinancialMessage.USER_ID_SHOULD_BE_A_UUID }) + userId: string; +} diff --git a/src/modules/users/DTO/create-user-financial.dto.ts b/src/modules/users/DTO/create-real-user.dto.ts similarity index 76% rename from src/modules/users/DTO/create-user-financial.dto.ts rename to src/modules/users/DTO/create-real-user.dto.ts index a06de20..aa157b0 100644 --- a/src/modules/users/DTO/create-user-financial.dto.ts +++ b/src/modules/users/DTO/create-real-user.dto.ts @@ -1,13 +1,14 @@ -import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { ApiPropertyOptional } from "@nestjs/swagger"; import { IsEnum, IsNotEmpty, IsOptional, IsString, IsUUID } from "class-validator"; import { FinancialMessage } from "../../../common/enums/message.enum"; -import { FinancialType } from "../enums/financial-type.enum"; +import { GenderType } from "../enums/gender-type.enum"; export class CreateFinancialDto { - @ApiProperty({ enum: FinancialType, description: "Financial information type: REAL or LEGAL" }) - @IsEnum(FinancialType, { message: FinancialMessage.FINANCIAL_TYPE_INVALID }) - type: FinancialType; + @ApiPropertyOptional({ enum: GenderType, description: "Gender type" }) + @IsOptional() + @IsEnum(GenderType, { message: FinancialMessage.GENDER_TYPE_INVALID }) + gender?: GenderType; @ApiPropertyOptional({ description: "Economic code" }) @IsOptional() diff --git a/src/modules/users/entities/legal-user.entity.ts b/src/modules/users/entities/legal-user.entity.ts new file mode 100644 index 0000000..88d02b2 --- /dev/null +++ b/src/modules/users/entities/legal-user.entity.ts @@ -0,0 +1,24 @@ +import { Column, Entity, JoinColumn, OneToOne, Unique } from "typeorm"; + +import { User } from "./user.entity"; +import { BaseEntity } from "../../../common/entities/base.entity"; + +@Unique(["user"]) +@Entity() +export class LegalUser extends BaseEntity { + @Column({ nullable: true }) + economicCode: string; + + @Column({ nullable: true }) + registrationId: string; + + @Column({ nullable: true }) + nationalId: string; + + @Column({ nullable: true }) + number: string; + + @OneToOne(() => User, (user) => user.legalUser, { onDelete: "CASCADE" }) + @JoinColumn() + user: User; +} diff --git a/src/modules/users/entities/real-user.entity.ts b/src/modules/users/entities/real-user.entity.ts new file mode 100644 index 0000000..6c0355f --- /dev/null +++ b/src/modules/users/entities/real-user.entity.ts @@ -0,0 +1,26 @@ +import { Column, Entity, JoinColumn, OneToOne, Unique } from "typeorm"; + +import { User } from "./user.entity"; +import { BaseEntity } from "../../../common/entities/base.entity"; +import { GenderType } from "../enums/gender-type.enum"; + +@Unique(["user"]) +@Entity() +export class RealUser extends BaseEntity { + @Column({ + type: "enum", + enum: GenderType, + nullable: true, + }) + gender: GenderType; + + @Column({ nullable: true }) + fatherName: string; + + @Column({ nullable: true }) + nationality: string; + + @OneToOne(() => User, (user) => user.realUser, { onDelete: "CASCADE" }) + @JoinColumn() + user: User; +} diff --git a/src/modules/users/entities/user-financial.entity.ts b/src/modules/users/entities/user-financial.entity.ts deleted file mode 100644 index e1c9909..0000000 --- a/src/modules/users/entities/user-financial.entity.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Column, Entity, ManyToOne, Unique } from "typeorm"; - -import { User } from "./user.entity"; -import { BaseEntity } from "../../../common/entities/base.entity"; -import { FinancialType } from "../enums/financial-type.enum"; - -@Unique(["user", "type"]) -@Entity() -export class UserFinancial extends BaseEntity { - @Column({ - type: "enum", - enum: FinancialType, - default: FinancialType.REAL, - }) - type: FinancialType; - - @Column({ nullable: true }) - economicCode: string; - - @Column({ nullable: true }) - registrationId: string; - - @Column({ nullable: true }) - nationalId: string; - - @Column({ nullable: true }) - number: string; - - @ManyToOne(() => User, (user) => user.userFinancials) - user: User; -} diff --git a/src/modules/users/entities/user.entity.ts b/src/modules/users/entities/user.entity.ts index 3e872ff..0465b7a 100644 --- a/src/modules/users/entities/user.entity.ts +++ b/src/modules/users/entities/user.entity.ts @@ -1,12 +1,14 @@ import { Exclude } from "class-transformer"; import { Column, Entity, ManyToMany, ManyToOne, OneToMany, OneToOne } from "typeorm"; +import { LegalUser } from "./legal-user.entity"; +import { RealUser } from "./real-user.entity"; import { Role } from "./role.entity"; -import { UserFinancial } from "./user-financial.entity"; import { UserGroup } from "./user-group.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; import { UserAnnouncement } from "../../announcements/entities/user-announcement.entity"; import { Criticism } from "../../criticisms/entities/criticism.entity"; +import { Discount } from "../../discounts/entities/discount.entity"; import { Invoice } from "../../invoices/entities/invoice.entity"; import { LearningProgress } from "../../learnings/entities/learning-progress.entity"; import { Notification } from "../../notifications/entities/notification.entity"; @@ -84,8 +86,14 @@ export class User extends BaseEntity { @OneToMany(() => LearningProgress, (learningProgress) => learningProgress.learning) learningProgress: LearningProgress[]; - @OneToMany(() => UserFinancial, (userFinancial) => userFinancial.user) - userFinancials: UserFinancial[]; + @ManyToMany(() => Discount, (discount) => discount.subscriptionPlans) + discounts: Discount[]; + + @OneToOne(() => RealUser, (realUser) => realUser.user, { cascade: true, nullable: true }) + realUser: RealUser; + + @OneToOne(() => LegalUser, (legalUser) => legalUser.user, { cascade: true, nullable: true }) + legalUser: LegalUser; } // @ManyToMany(() => DanakService, (danakService) => danakService.users) diff --git a/src/modules/users/enums/gender-type.enum.ts b/src/modules/users/enums/gender-type.enum.ts new file mode 100644 index 0000000..4c4f4ee --- /dev/null +++ b/src/modules/users/enums/gender-type.enum.ts @@ -0,0 +1,4 @@ +export enum GenderType { + MALE = "male", + FEMALE = "female", +} diff --git a/src/modules/users/providers/users.service.ts b/src/modules/users/providers/users.service.ts index 9807aa9..5b426e7 100644 --- a/src/modules/users/providers/users.service.ts +++ b/src/modules/users/providers/users.service.ts @@ -2,13 +2,13 @@ import { BadRequestException, Injectable } from "@nestjs/common"; import slugify from "slugify"; import { In, Not, QueryRunner } from "typeorm"; -import { CommonMessage, FinancialMessage, UserMessage } from "../../../common/enums/message.enum"; +import { CommonMessage, UserMessage } from "../../../common/enums/message.enum"; import { CompleteRegistrationDto } from "../../auth/DTO/complete-register.dto"; import { UserSettingsService } from "../../settings/providers/user-settings.service"; import { PaginationUtils } from "../../utils/providers/pagination.utils"; import { WalletsService } from "../../wallets/providers/wallets.service"; import { CheckValidityDTO } from "../DTO/check-validity.dto"; -import { CreateFinancialDto } from "../DTO/create-user-financial.dto"; +// import { CreateFinancialDto } from "../DTO/create-legal-user.dto"; import { SearchAdminsDto } from "../DTO/search-admins.dto"; import { SearchCustomersDto } from "../DTO/search-customers.dto"; import { UpdateProfileDto } from "../DTO/update-profile.dto"; @@ -17,7 +17,8 @@ import { Role } from "../entities/role.entity"; import { User } from "../entities/user.entity"; import { RoleEnum } from "../enums/role.enum"; import { ValidityType } from "../enums/validity-type.enum"; -import { UserFinancialRepository } from "../repositories/user-financial.repository"; +// import { LegalUserRepository } from "../repositories/legal-user.repository"; +// import { RealUserRepository } from "../repositories/real-user.repository"; import { UserGroupRepository } from "../repositories/user-group.repository"; import { UserRepository } from "../repositories/users.repository"; @@ -41,8 +42,9 @@ export class UsersService { private readonly userRepository: UserRepository, private readonly userGroupRepository: UserGroupRepository, private readonly userSettingsService: UserSettingsService, - private readonly userFinancialRepository: UserFinancialRepository, private readonly walletsService: WalletsService, + // private readonly realUserRepository: RealUserRepository, + // private readonly legalUserRepository: LegalUserRepository, ) {} /************************************************************ */ @@ -247,7 +249,8 @@ export class UsersService { if (queryDto.q) { queryBuilder .orWhere("user.firstName ILIKE :search", { search: `%${queryDto.q}%` }) - .orWhere("user.lastName ILIKE :search", { search: `%${queryDto.q}%` }); + .orWhere("user.lastName ILIKE :search", { search: `%${queryDto.q}%` }) + .orWhere("user.userName ILIKE :search", { search: `%${queryDto.q}%` }); } const [customers, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount(); @@ -273,58 +276,58 @@ export class UsersService { /************************************************************ */ - async createUserFinancial(createDto: CreateFinancialDto, user: User) { - const userExist = await this.userRepository.findOneBy({ - id: user.role.name === RoleEnum.USER ? user.id : createDto.userId, - }); + // async createRealUserData(createDto: CreateFinancialDto, user: User) { + // const userExist = await this.userRepository.findOneBy({ + // id: user.role.name === RoleEnum.USER ? user.id : createDto.userId, + // }); - if (!userExist) throw new BadRequestException(UserMessage.USER_NOT_FOUND); + // if (!userExist) throw new BadRequestException(UserMessage.USER_NOT_FOUND); - const existingFinancial = await this.userFinancialRepository.findOne({ - where: { user: { id: userExist.id }, type: createDto.type }, - }); - console.log(existingFinancial); + // const existingFinancial = await this.userFinancialRepository.findOne({ + // where: { user: { id: userExist.id }, type: createDto.type }, + // }); + // console.log(existingFinancial); - if (existingFinancial) throw new BadRequestException(FinancialMessage.FINANCIAL_INFO_ALREADY_EXISTS); + // if (existingFinancial) throw new BadRequestException(FinancialMessage.FINANCIAL_INFO_ALREADY_EXISTS); - const userFinancial = this.userFinancialRepository.create({ - ...createDto, - user: userExist, - }); + // const userFinancial = this.userFinancialRepository.create({ + // ...createDto, + // user: userExist, + // }); - await this.userFinancialRepository.save(userFinancial); + // await this.userFinancialRepository.save(userFinancial); - return { - message: CommonMessage.CREATED, - userFinancial, - }; - } + // return { + // message: CommonMessage.CREATED, + // userFinancial, + // }; + // } - /************************************************************ */ + // /************************************************************ */ - async updateUserFinancial(updateDto: CreateFinancialDto, user: User, userFinancialId: string) { - const userExist = await this.userRepository.findOneBy({ - id: user.role.name === RoleEnum.USER ? user.id : updateDto.userId, - }); + // async updateUserFinancial(updateDto: CreateFinancialDto, user: User, userFinancialId: string) { + // const userExist = await this.userRepository.findOneBy({ + // id: user.role.name === RoleEnum.USER ? user.id : updateDto.userId, + // }); - if (!userExist) throw new BadRequestException(UserMessage.USER_NOT_FOUND); + // if (!userExist) throw new BadRequestException(UserMessage.USER_NOT_FOUND); - const existingFinancial = await this.userFinancialRepository.findOne({ - where: { id: userFinancialId, user: { id: userExist.id }, type: updateDto.type }, - }); + // const existingFinancial = await this.userFinancialRepository.findOne({ + // where: { id: userFinancialId, user: { id: userExist.id }, type: updateDto.type }, + // }); - if (!existingFinancial) throw new BadRequestException(FinancialMessage.FINANCIAL_INFO_NOT_FOUND); + // if (!existingFinancial) throw new BadRequestException(FinancialMessage.FINANCIAL_INFO_NOT_FOUND); - await this.userFinancialRepository.save({ - ...existingFinancial, - updateDto, - }); + // await this.userFinancialRepository.save({ + // ...existingFinancial, + // updateDto, + // }); - return { - message: CommonMessage.UPDATE_SUCCESS, - userFinancial: existingFinancial, - }; - } + // return { + // message: CommonMessage.UPDATE_SUCCESS, + // userFinancial: existingFinancial, + // }; + // } /************************************************************ */ diff --git a/src/modules/users/repositories/legal-user.repository.ts b/src/modules/users/repositories/legal-user.repository.ts new file mode 100644 index 0000000..f328515 --- /dev/null +++ b/src/modules/users/repositories/legal-user.repository.ts @@ -0,0 +1,12 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; + +import { LegalUser } from "../entities/legal-user.entity"; + +@Injectable() +export class LegalUserRepository extends Repository { + constructor(@InjectRepository(LegalUser) LegalUserRepository: Repository) { + super(LegalUserRepository.target, LegalUserRepository.manager, LegalUserRepository.queryRunner); + } +} diff --git a/src/modules/users/repositories/real-user.repository.ts b/src/modules/users/repositories/real-user.repository.ts new file mode 100644 index 0000000..bb523c9 --- /dev/null +++ b/src/modules/users/repositories/real-user.repository.ts @@ -0,0 +1,12 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; + +import { RealUser } from "../entities/real-user.entity"; + +@Injectable() +export class RealUserRepository extends Repository { + constructor(@InjectRepository(RealUser) realUserRepository: Repository) { + super(realUserRepository.target, realUserRepository.manager, realUserRepository.queryRunner); + } +} diff --git a/src/modules/users/repositories/user-financial.repository.ts b/src/modules/users/repositories/user-financial.repository.ts deleted file mode 100644 index 004ca93..0000000 --- a/src/modules/users/repositories/user-financial.repository.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import { InjectRepository } from "@nestjs/typeorm"; -import { Repository } from "typeorm"; - -import { UserFinancial } from "../entities/user-financial.entity"; - -@Injectable() -export class UserFinancialRepository extends Repository { - constructor(@InjectRepository(UserFinancial) userFinancialRepository: Repository) { - super(userFinancialRepository.target, userFinancialRepository.manager, userFinancialRepository.queryRunner); - } -} diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index a76c2b4..0bb6fae 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -1,8 +1,7 @@ -import { Body, Controller, Get, HttpCode, HttpStatus, Param, Patch, Post, Query } from "@nestjs/common"; +import { Body, Controller, Get, HttpCode, HttpStatus, Patch, Post, Query } from "@nestjs/common"; import { ApiOperation, ApiTags } from "@nestjs/swagger"; import { CheckValidityDTO } from "./DTO/check-validity.dto"; -import { CreateFinancialDto } from "./DTO/create-user-financial.dto"; import { SearchAdminsDto } from "./DTO/search-admins.dto"; import { SearchCustomersDto } from "./DTO/search-customers.dto"; import { UpdateProfileDto } from "./DTO/update-profile.dto"; @@ -13,7 +12,6 @@ import { UsersService } from "./providers/users.service"; import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; import { Roles } from "../../common/decorators/roles.decorator"; import { UserDec } from "../../common/decorators/user.decorator"; -import { ParamDto } from "../../common/DTO/param.dto"; @Controller("users") @ApiTags("users") @@ -91,23 +89,23 @@ export class UsersController { /************************************************************ */ - @AuthGuards() - @ApiOperation({ summary: "Create user financial" }) - @HttpCode(HttpStatus.CREATED) - @Post("user-financial") - createUserFinancial(@Body() createDto: CreateFinancialDto, @UserDec() user: User) { - return this.usersService.createUserFinancial(createDto, user); - } + // @AuthGuards() + // @ApiOperation({ summary: "Create user financial" }) + // @HttpCode(HttpStatus.CREATED) + // @Post("user-financial") + // createUserFinancial(@Body() createDto: CreateFinancialDto, @UserDec() user: User) { + // return this.usersService.createUserFinancial(createDto, user); + // } /************************************************************ */ - @AuthGuards() - @ApiOperation({ summary: "update user financial" }) - @HttpCode(HttpStatus.CREATED) - @Patch("user-financial/:id/update") - updateUserFinancial(@Body() updateDto: CreateFinancialDto, @UserDec() user: User, @Param() paramDto: ParamDto) { - return this.usersService.updateUserFinancial(updateDto, user, paramDto.id); - } + // @AuthGuards() + // @ApiOperation({ summary: "update user financial" }) + // @HttpCode(HttpStatus.CREATED) + // @Patch("user-financial/:id/update") + // updateUserFinancial(@Body() updateDto: CreateFinancialDto, @UserDec() user: User, @Param() paramDto: ParamDto) { + // return this.usersService.updateUserFinancial(updateDto, user, paramDto.id); + // } /************************************************************ */ diff --git a/src/modules/users/users.module.ts b/src/modules/users/users.module.ts index 934712f..7ccd3a1 100644 --- a/src/modules/users/users.module.ts +++ b/src/modules/users/users.module.ts @@ -1,10 +1,12 @@ import { Module } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; +import { LegalUser } from "./entities/legal-user.entity"; import { Role } from "./entities/role.entity"; import { UserGroup } from "./entities/user-group.entity"; import { User } from "./entities/user.entity"; import { UsersService } from "./providers/users.service"; +import { LegalUserRepository } from "./repositories/legal-user.repository"; import { RoleRepository } from "./repositories/roles.repository"; import { UserGroupRepository } from "./repositories/user-group.repository"; import { UserRepository } from "./repositories/users.repository"; @@ -13,21 +15,22 @@ import { UserSetting } from "../settings/entities/user-setting.entity"; import { UserSettingsService } from "../settings/providers/user-settings.service"; import { UserSettingsRepository } from "../settings/repositories/user-settings.repository"; import { WalletsModule } from "../wallets/wallets.module"; -import { UserFinancial } from "./entities/user-financial.entity"; -import { UserFinancialRepository } from "./repositories/user-financial.repository"; +import { RealUser } from "./entities/real-user.entity"; +import { RealUserRepository } from "./repositories/real-user.repository"; @Module({ - imports: [TypeOrmModule.forFeature([User, Role, UserGroup, UserSetting, UserFinancial]), WalletsModule], + imports: [TypeOrmModule.forFeature([User, Role, UserGroup, UserSetting, RealUser, LegalUser]), WalletsModule], providers: [ UsersService, UserRepository, RoleRepository, UserGroupRepository, UserSettingsRepository, - UserFinancialRepository, UserSettingsService, + RealUserRepository, + LegalUserRepository, ], controllers: [UsersController], - exports: [UsersService], + exports: [UsersService, TypeOrmModule, UserRepository], }) export class UsersModule {}