diff --git a/pages/admin/agents/index.vue b/pages/admin/agents/index.vue index 2d6c554..aa41f87 100644 --- a/pages/admin/agents/index.vue +++ b/pages/admin/agents/index.vue @@ -77,19 +77,165 @@ - - - -
-
- - افزودن - + + +

اضافه کردن نماینده با اکانت قبلی

+ + + +
+
+ + افزودن + +
+ + +

اضافه کردن نماینده با اکانت جدید

+ + + + + + + + +
+ + + + + +
+

{{ validation.province_id.msg }}

+
+ + + + + +
+

{{ validation.city_id.msg }}

+ + + + + +
+ + افزودن + +
+
@@ -121,7 +267,29 @@ export default { users: [], filterText: '', addAgentModal: false, - selectedUserForNewAgent: null + selectedUserForNewAgent: null, + registerData: { + userID: '', + first_name: '', + last_name: '', + national_code: '', + province_id: '', + province_name: '', + city_id: '', + city_name: '', + address: '', + postal_code: '', + tel_number: '', + mobile_number: '', + email: '', + store_name: '', + password: '', + password_confirmation: '' + }, + iranCities: [], + iranProvinces: [], + provinceCities: null, + validation: {} } }, head() { @@ -130,6 +298,12 @@ export default { } }, computed: { + selectedProvince() { + return this.registerData.province_id + }, + selectedCity() { + return this.registerData.city_id + }, revokedAgentsList() { return this.$route.query?.revoked }, @@ -158,14 +332,106 @@ export default { }, addAgentModal(newVal, oldVal) { this.selectedUserForNewAgent = null + }, + selectedProvince(newVal, oldVal) { + // step 1 + this.registerData.city_id = '' + // step 2 + if (newVal) + this.registerData.province_name = this.iranProvinces.filter(item => item.ProvinceID === newVal)[0].ProvinceName + else this.registerData.province_name = '' + // step 3 + if (newVal) this.provinceCities = this.iranCities.filter(item => item.ProvinceID === newVal) + else this.provinceCities = null + }, + selectedCity(newVal, oldVal) { + if (newVal) this.registerData.city_name = this.iranCities.filter(item => item.CityID === newVal)[0].CityName + else this.registerData.city_name = '' } }, mounted() { this.$axios.$get('/api/admin/users').then(res => { this.users = res }) + this.$axios + .post('/api/cross/getRouteManager', { + url: '/api/GetProvince', + db: 'verity' + }) + .then(res => { + this.iranProvinces = res.data.data + }) + .catch(err => { + this.$arpaError() + console.log('provinces list fetch error -- ', err) + }) + + this.$axios + .post('/api/cross/getRouteManager', { + url: '/api/GetCity', + db: 'verity' + }) + .then(res => { + this.iranCities = res.data.data + }) + .catch(err => { + this.$arpaError() + console.log('cities list fetch error -- ', err) + }) }, methods: { + addUserAndAgent() { + this.validation = {} + + this.$axios + .post('/api/admin/user', this.registerData) + .then(response => { + this.registerData = { + userID: response.data.user._id, + first_name: '', + last_name: '', + national_code: '', + province_id: '', + province_name: '', + city_id: '', + city_name: '', + address: '', + postal_code: '', + tel_number: '', + mobile_number: '', + email: '', + store_name: '', + password: '', + password_confirmation: '' + } + console.log(this.registerData) + + this.$axios + .$post('/api/admin/addAgentByAdmin', { user: response.data.user._id }) + .then(res => { + this.$router.push({ + name: 'admin-agents-agent', + params: { agent: res.representationId }, + query: { ...this.$route.query } + }) + }) + .catch(err => { + this.$message({ + type: 'error', + message: err.response.data.message + }) + }) + }) + .catch(error => { + if (error.response.status === 422) { + this.validation = error.response.data.validation + } else + this.$message({ + type: 'error', + message: error.response.data.message + }) + }) + }, addAgent() { if (!this.selectedUserForNewAgent) { return this.$message({ diff --git a/server/controllers/userController.js b/server/controllers/userController.js index 58951f1..7a5c6fa 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -205,9 +205,9 @@ module.exports.update_admin = [ ], checkValidations(validationResult), (req, res) => { - const { username, first_name, last_name, permissions,personalCode } = req.body + const { username, first_name, last_name, permissions, personalCode } = req.body - const data = { username, first_name, last_name, permissions,personalCode } + const data = { username, first_name, last_name, permissions, personalCode } data._creator = req.user_id User.findByIdAndUpdate(req.params.id, data, (err, oldData) => { @@ -597,7 +597,7 @@ module.exports.update_user = [ if (newEmail) await sendConfirmationEmail(user_id) if (newMobile) await sendConfirmationSMS(user_id) - return res.json({ message: _faSr.response.success_save , data:user }) + return res.json({ message: _faSr.response.success_save, data: user }) } catch (e) { console.log('Arpa Error during update user --', e) return res500(res, _faSr.response.problem) @@ -947,8 +947,194 @@ module.exports.confirmMobile = [ ] /// //////////////////////////////////////////////////////////////////// user managemnet by admin + +module.exports.add_user = [ + [ + body('first_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + + body('last_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + + body('national_code') + .notEmpty() + .withMessage(_faSr.required.national_code) + .bail() + .custom((value, { req }) => { + if (checkNationalCode(value)) return true + else return Promise.reject(_faSr.format.national_code) + }) + .bail() + .custom((value, { req }) => { + const nationalCode = value.trim() + return User.findOne({ national_code: nationalCode }).then(user => { + if (user && user.national_code === nationalCode) + return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) + else return true + }) + }), + + body('province_id').notEmpty().withMessage(_faSr.required.province), + + body('city_id').notEmpty().withMessage(_faSr.required.city), + + body('address') + .notEmpty() + .withMessage(_faSr.required.address) + .bail() + .custom((value, { req }) => { + if (!isPersianWithDigits(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + + body('postal_code') + .notEmpty() + .withMessage(_faSr.required.postal_code) + .bail() + .isNumeric() + .withMessage(_faSr.format.number), + + body('email') + .notEmpty() + .withMessage(_faSr.required.email) + .bail() + .isEmail() + .withMessage(_faSr.format.email) + .bail() + .custom((value, { req }) => { + const email = value.trim().toLowerCase() + return User.findOne({ email }).then(user => { + if (user && user.email === email) return Promise.reject(_faSr.duplicated.email) + else return true + }) + }), + + body('tel_number') + .notEmpty() + .withMessage(_faSr.required.phone_number) + .bail() + .isNumeric() + .withMessage(_faSr.format.phone_number), + + body('mobile_number') + .notEmpty() + .withMessage(_faSr.required.phone_number) + .bail() + .custom((value, { req }) => { + const mobileNStatus = checkMobileNumber(value) + if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) + else return Promise.resolve() + }) + .bail() + .custom((value, { req }) => { + const mobileNumber = value.trim() + return User.findOne({ mobile_number: mobileNumber }).then(user => { + if (user && user.mobile_number === mobileNumber) + return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) + else return true + }) + }), + + body('password') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .custom((value, { req }) => { + if (value === req.body.password_confirmation) return true + else return Promise.reject(_faSr.response.passwords_not_match) + }) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { + first_name, + last_name, + national_code, + province_id, + province_name, + city_id, + city_name, + address, + postal_code, + tel_number, + mobile_number, + email, + store_name, + password + } = req.body + + const data = { + last_name, + province_id, + province_name, + city_id, + city_name, + address, + postal_code, + tel_number, + store_name + } + data.first_name = nameOptimizer(first_name) + data.national_code = national_code.trim() + data.mobile_number = normalizeMobileNumber(mobile_number) + data.email = email.trim().toLowerCase() + data.email_confirmed = true + data.mobile_confirmed = true + data.confirmed = true + + // hash user password and done + const salt = await bcrypt.genSalt(10) + const hash = await bcrypt.hash(password, salt) + data.password = hash + + const user = new User(data) + await user.save() + + const verityID = await saveUserToArpa(user, 'verity') + const panatechID = await saveUserToArpa(user, 'panatech') + + user.verity_businessID = verityID.businessID + user.verity_businessCode = verityID.businessCode + + user.panatech_businessID = panatechID.businessID + user.panatech_businessCode = panatechID.businessCode + + + // save new info to arpa + await updateUserOnArpa(user, user.verity_businessID, 'verity') + await updateUserOnArpa(user, user.panatech_businessID, 'panatech') + await user.save() + + return res.status(200).json({ message: _faSr.response.success_save, user }) + } catch (err) { + const registerFailurMsg = 'مشکلی در ثبت نام پیش آمده، لطفا مجددا تلاش کنید' + res500(res, registerFailurMsg) + } + } +] + module.exports.get_all_users_for_admin = [ - (req, res) => { + (req, res) => { User.find( { scope: ['user'], @@ -1175,9 +1361,9 @@ module.exports.update_user_by_admin = [ MongoData.email = email.trim().toLowerCase() try { - const user_id = req.params.id + const user_id = req.params.id const user = await User.findById(user_id) - if (!user) { + if (!user) { return res404(res, _faSr.not_found.user_id) } @@ -1207,7 +1393,7 @@ module.exports.update_user_by_admin = [ user.mobile_number = MongoData.mobile_number user.email = MongoData.email - + await user.save() @@ -1365,7 +1551,7 @@ module.exports.updateUserByAdmin = [ MongoData.email = email.trim().toLowerCase() try { - const user_id = req.params.id + const user_id = req.params.id const user = await User.findById(user_id) if (!user) return res404(res, _faSr.not_found.user_id) @@ -1579,5 +1765,5 @@ module.exports.getUser = [ } ] -/// ////////////////////////////////////////////////////////////////////////// GPS Section + diff --git a/server/routes/admin.js b/server/routes/admin.js index 3e87017..d6842be 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -157,6 +157,7 @@ router.put('/user/:id', hasPermission('customers'), userController.updateUserByA router.put('/user/changeVerityInfo/:id', hasPermission('customers'), userController.change_verity_info_by_admin) router.put('/user/changePanatechInfo/:id', hasPermission('customers'), userController.change_panatech_info_by_admin) router.put('/user/update/:id', hasPermission('customers'), userController.update_user_by_admin) +router.post('/user', hasPermission('customers'), userController.add_user) /// ///////////// serials exel file