diff --git a/pages/admin/gps/fee/index.vue b/pages/admin/gps/fee/index.vue
index ef2695c..8f9fd16 100644
--- a/pages/admin/gps/fee/index.vue
+++ b/pages/admin/gps/fee/index.vue
@@ -25,7 +25,7 @@
-
+
{{ formatCurrency(form.amount) }}
@@ -35,6 +35,20 @@
+
+
+
+
+
+
+
+ {{ scoreForm.score }} امتیاز
+
+
+ ثبت
+
+
+
@@ -57,16 +71,23 @@ export default {
},
rules: {
amount: [{ required: true, message: 'لطفا مبلغ را وارد کنید', trigger: 'blur' }]
+ },
+ scoreForm: {
+ score: 0
+ },
+ scoreRules: {
+ score: [{ required: true, message: 'لطفا امتیاز را وارد کنید', trigger: 'blur' }]
}
-
}
},
-
-
+ mounted() {
+ this.getFee()
+ this.getScore()
+ },
methods: {
async setFee() {
try {
- await this.$axios.post('/api/admin/gps/install-fee', this.form)
+ await this.$axios.post('/api/admin/gps/settings/install-fee', this.form)
.then(res => {
this.$message({
type: 'success',
@@ -80,7 +101,7 @@ export default {
},
async getFee() {
try {
- await this.$axios.get('/api/admin/gps/install-fee')
+ await this.$axios.get('/api/admin/gps/settings/install-fee')
.then(res => {
this.form.amount = res.data.amount
})
@@ -91,10 +112,33 @@ export default {
formatCurrency(amount) {
const formatted= new Intl.NumberFormat('fa-IR').format(amount);
return `${formatted} تومان`;
+ },
+ async setScore() {
+ try {
+ await this.$axios.post('/api/admin/gps/settings/install-score', this.scoreForm)
+ .then(res => {
+ this.$message({
+ type: 'success',
+ message: 'امتیاز نصب با موفقیت ثبت شد'
+ })
+ this.$nuxt.refresh()
+ })
+ } catch (error) {
+ console.log(error)
+ }
+ },
+ async getScore() {
+ try {
+ await this.$axios.get('/api/admin/gps/settings/install-score')
+ .then(res => {
+ if (res.data && res.data.amount) {
+ this.scoreForm.score = res.data.amount
+ }
+ })
+ } catch (error) {
+ console.log(error)
+ }
}
- },
- mounted() {
- this.getFee()
}
}
diff --git a/server/controllers/GPS.Fee.js b/server/controllers/GPS.Fee.js
deleted file mode 100644
index 3a3fc75..0000000
--- a/server/controllers/GPS.Fee.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const { body, validationResult } = require('express-validator')
-const Fee = require('../models/GPS.Fee')
-const titleKey = 'install_fee'
-const { checkValidations } = require('../plugins/controllersHelperFunctions')
-
-module.exports.setFee = [
- [body('amount').notEmpty().isInt().withMessage('مقدار هزینه را وارد کنید')],
- checkValidations(validationResult),
- async (req, res) => {
- const { amount } = req.body
- const fee = await Fee.findOne({ title: titleKey })
- if (fee) {
- fee.amount = amount
- await fee.save()
- return res.status(200).json(fee)
- }
- const newFee = await Fee.create({ title: titleKey, amount })
- res.status(201).json(newFee)
- }
-]
-
-module.exports.getFee = async (req, res) => {
- const fee = await Fee.findOne({ title: titleKey })
- res.status(200).json(fee)
-}
\ No newline at end of file
diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js
index cb62e3f..e087f3a 100644
--- a/server/controllers/GPS.InstalledDevice.js
+++ b/server/controllers/GPS.InstalledDevice.js
@@ -4,7 +4,7 @@ const User = require('../models/GPS.User')
const InstalledDevice = require('../models/GPS.InstalledDevice')
const Device = require('../models/GPS.Device')
const userGPS = require('../models/GPS.User')
-const Fee = require('../models/GPS.Fee')
+const Settings = require('../models/GPS.Settings')
const Score = require('../models/GPS.Score')
const { _sr } = require('../plugins/serverResponses')
const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController')
@@ -16,60 +16,108 @@ module.exports.deviceRegistration = [
async (req, res) => {
const IMEI = req.body.IMEI
console.log('IMEI ******************', IMEI)
- try {
- const installedDevice = await InstalledDevice.findOne({ IMEI })
- // // const installedDevice = false
- if (installedDevice) {
- return res.status(400).json({ msg: 'این IMEI قبلا ثبت شده ' })
- }
- // const isRegisteredOnKoja = true
- const RegisteredDevice = await findDeviceByImeiOnKoja(IMEI)
- if (!RegisteredDevice) {
- return res.status(400).json({ msg: 'هنوز در سامانه ردیاب ثبت نشده است.' })
- }
- let installedDeviceId = null
- try {
- const fee = await Fee.findOne({ title: 'install_fee' })
- if (!fee) {
- return res.status(400).json({ msg: 'هزینه نصب یافت نشد' })
- }
- const data = {
- // deviceId: RegisteredDevice.deviceId,
- deviceType: RegisteredDevice.device_type.name,
- status: 1,
- registerDate: new Date(),
- userId: req.user_id,
- IMEI: req.body.IMEI
- }
- // 1.add to installed device
- const installedDevice = await InstalledDevice.create(data)
- installedDeviceId = installedDevice._id
- // 2. add to wallet
- await userGPS.findByIdAndUpdate(req.user_id, { $inc: { walletBalance:fee.amount } })
-
- notifyAdmin('newInstallDeviceRequest')
- res.status(201).json({ msg: 'مبلغ صد هزار تومان به کیف پول شما اضافه شد' })
- } catch (err) {
- console.log('Error in Db Transactions', err?.message)
- if (installedDeviceId) {
- try {
- await InstalledDevice.deleteOne({ _id: installedDeviceId })
- console.log('Rollback: InstalledDevice deleted.')
- } catch (error) {
- console.error('CRITICAL: Rollback failed for some changes. MANUAL INTERVENTION REQUIRED.', error)
- }
- }
- return res.status(err?.status || 500).json({ msg: err?.msg || 'خطا در تراکنش های دیتابیس ' })
- }
- } catch (err) {
- console.log('deviceRegistration Error: ', err?.message)
- if (err.response) {
- const { status } = err.response
- return res.status(status || 500).json({ msg: err.message || 'خطا!' })
- }
- return res.status(err.status || 500).json({ msg: err.msg || 'خطا در ثبت دستگاه' })
+ const existingInstalledDevice = await InstalledDevice.findOne({ IMEI }).catch(err => {
+ console.log('err in findOne InstalledDevice', err?.message)
+ return res.status(500).json({ msg: 'خطا در دریافت اطلاعات از دیتابیس ثبت دستگاه' })
+ })
+ if (existingInstalledDevice) {
+ return res.status(400).json({ msg: 'این IMEI قبلا ثبت شده ' })
}
+ // const isRegisteredOnKoja = true
+ let registeredDevice
+ try {
+ registeredDevice = await findDeviceByImeiOnKoja(IMEI)
+ } catch (err) {
+ return res.status(err.status || 500).json({ msg: err.message })
+ }
+ if (!registeredDevice) {
+ return res.status(400).json({ msg: 'هنوز در سامانه ردیاب ثبت نشده است.' })
+ }
+ if (!registeredDevice.device_type || !registeredDevice.device_type.name) {
+ return res.status(400).json({ msg: 'اطلاعات دستگاه ناقص است' })
+ }
+ let installedDeviceId = null
+ let scoreData = null
+ let walletUpdated = false
+ try {
+ const fee = await Settings.findOne({ title: 'install_fee' })
+ if (!fee) {
+ return res.status(400).json({ msg: 'هزینه نصب یافت نشد' })
+ }
+ const score = await Settings.findOne({ title: 'install_score' })
+ if (!score) {
+ return res.status(400).json({ msg: 'امتیاز نصب یافت نشد' })
+ }
+ const data = {
+ // deviceId: RegisteredDevice.deviceId,
+ installationDate: new Date(registeredDevice.activated_at),
+ deviceType: registeredDevice.device_type.name,
+ status: 1,
+ registerDate: new Date(),
+ userId: req.user_id,
+ IMEI: req.body.IMEI
+ }
+ // 1.add to installed device
+ const installedDevice = await InstalledDevice.create(data)
+ installedDeviceId = installedDevice._id
+ // 2. add to score
+ scoreData = await Score.create({
+ title: 'ثبت دستگاه',
+ deviceId: installedDevice.id,
+ score: score.amount,
+ userId: req.user_id
+ })
+
+ // 3. add to wallet
+ await userGPS.findByIdAndUpdate(req.user_id, {
+ $inc: { walletBalance: fee.amount, score: score.amount, totalScore: score.amount }
+ })
+ walletUpdated = true
+
+ notifyAdmin('newInstallDeviceRequest')
+ res.status(201).json({
+ msg:
+ 'مبلغ ' + fee.amount + ' تومان به کیف پول شما اضافه شد و ' + score.amount + ' امتیاز به امتیاز شما اضافه شد'
+ })
+ } catch (err) {
+ console.log('Error in Db Transactions', err?.message)
+ if (installedDeviceId) {
+ try {
+ await InstalledDevice.deleteOne({ _id: installedDeviceId })
+ console.log('Rollback: InstalledDevice deleted.')
+ } catch (error) {
+ console.error('CRITICAL: Rollback failed for some changes. MANUAL INTERVENTION REQUIRED.', error)
+ }
+ }
+ if (scoreData) {
+ try {
+ await Score.deleteOne({ _id: scoreData._id })
+ console.log('Rollback: Score deleted.')
+ } catch (error) {
+ console.error('CRITICAL: Rollback failed for some changes. MANUAL INTERVENTION REQUIRED.', error)
+ }
+ }
+ if (walletUpdated) {
+ try {
+ const fee = await Settings.findOne({ title: 'install_fee' })
+ const score = await Settings.findOne({ title: 'install_score' })
+ if (fee && score) {
+ await userGPS.findByIdAndUpdate(req.user_id, { $inc: { walletBalance: -fee.amount, score: -score.amount } })
+ console.log('Rollback: Wallet balance and score reverted.')
+ }
+ } catch (error) {
+ console.error('CRITICAL: Rollback failed for wallet update. MANUAL INTERVENTION REQUIRED.', error)
+ }
+ }
+ return res.status(err?.status || 500).json({ msg: err?.msg || 'خطا در تراکنش های دیتابیس ' })
+ }
+
+ // console.log('deviceRegistration Error: ', err?.message)
+ // if (err.response) {
+ // const { status } = err.response
+ // return res.status(status || 500).json({ msg: err.message || 'خطا!' })
+ // }
}
]
@@ -146,7 +194,7 @@ module.exports.getAllForAdmin = async (req, res) => {
// }
const data = await InstalledDevice.find()
- .sort({ created_at: -1 })
+ .sort({ created_at: -1 })
.populate('deviceId')
.populate('userId', 'shopName national_code first_name last_name mobile_number city_name province_name')
// .skip(skip)
diff --git a/server/controllers/GPS.Settings.js b/server/controllers/GPS.Settings.js
new file mode 100644
index 0000000..18334e8
--- /dev/null
+++ b/server/controllers/GPS.Settings.js
@@ -0,0 +1,46 @@
+const { body, validationResult } = require('express-validator')
+const Settings = require('../models/GPS.Settings')
+const { checkValidations } = require('../plugins/controllersHelperFunctions')
+const titleKey = 'install_fee'
+const titleKeyScore = 'install_score'
+
+module.exports.setFee = [
+ [body('amount').notEmpty().isInt().withMessage('مقدار هزینه را وارد کنید')],
+ checkValidations(validationResult),
+ async (req, res) => {
+ const { amount } = req.body
+ const fee = await Settings.findOne({ title: titleKey })
+ if (fee) {
+ Settings.amount = amount
+ await Settings.save()
+ return res.status(200).json(fee)
+ }
+ const newFee = await Settings.create({ title: titleKey, amount })
+ res.status(201).json(newFee)
+ }
+]
+
+module.exports.setScore = [
+ [body('score').notEmpty().isInt().withMessage('مقدار امتیاز را وارد کنید')],
+ checkValidations(validationResult),
+ async (req, res) => {
+ const { score } = req.body
+ const record = await Settings.findOne({ title: titleKeyScore })
+ if (record) {
+ record.amount = score
+ await record.save()
+ return res.status(200).json(record)
+ }
+ const newScore = await Settings.create({ title: titleKeyScore, amount: score })
+ res.status(201).json(newScore)
+ }
+]
+
+module.exports.getFee = async (req, res) => {
+ const fee = await Settings.findOne({ title: titleKey })
+ res.status(200).json(fee)
+}
+module.exports.getScore = async (req, res) => {
+ const score = await Settings.findOne({ title: titleKeyScore })
+ res.status(200).json(score)
+}
\ No newline at end of file
diff --git a/server/kojaWebService.js b/server/kojaWebService.js
index af13a9f..6193008 100644
--- a/server/kojaWebService.js
+++ b/server/kojaWebService.js
@@ -1,7 +1,7 @@
const axios = require('axios')
const { kojaBaseUrl, kojaAccount } = require('./_env')
-export async function findDeviceByImeiOnKoja(imei) {
+async function findDeviceByImeiOnKoja(imei) {
try {
const result = await axios.get(`/devices/imei/${imei}`, {
baseURL: kojaBaseUrl,
@@ -13,18 +13,31 @@ export async function findDeviceByImeiOnKoja(imei) {
} catch (error) {
if (error.response) {
const { status } = error.response
+ let err
if (status === 401) {
- throw new Error('خطا در اتصال به سامانه ردیاب')
+ err = new Error('خطا در اتصال به سامانه ردیاب')
+ err.status = 401
+ throw err
}
- // if (status === 404) {
- // return false
- // }
- // if (status === 403) {
- // return true
- // }
- throw error
+ if (status === 404) {
+ err = new Error('دستگاه در سامانه ردیاب یافت نشد')
+ err.status = 404
+ throw err
+ }
+ if (status === 403) {
+ err = new Error('دسترسی غیرمجاز به سامانه ردیاب')
+ err.status = 403
+ throw err
+ }
+ err = new Error(error.message || 'خطا در دریافت اطلاعات از سامانه ردیاب')
+ err.status = status || 500
+ throw err
} else {
- throw error
+ const err = new Error('خطا در دریافت اطلاعات از سامانه ردیاب')
+ err.status = 500
+ throw err
}
}
}
+
+module.exports = { findDeviceByImeiOnKoja }
diff --git a/server/models/GPS.Fee.js b/server/models/GPS.Settings.js
similarity index 55%
rename from server/models/GPS.Fee.js
rename to server/models/GPS.Settings.js
index cab6f05..554b1bb 100644
--- a/server/models/GPS.Fee.js
+++ b/server/models/GPS.Settings.js
@@ -1,10 +1,10 @@
const mongoose = require('mongoose')
-const FeeSchema = mongoose.Schema({
+const SettingsSchema = mongoose.Schema({
title: String,
amount: Number,
createdAt: { type: Date, default: Date.now },
})
-module.exports = mongoose.model('Fee', FeeSchema)
+module.exports = mongoose.model('Settings', SettingsSchema)
diff --git a/server/routes/admin.js b/server/routes/admin.js
index 6abaea7..6f2340b 100644
--- a/server/routes/admin.js
+++ b/server/routes/admin.js
@@ -33,7 +33,7 @@ const award = require('../controllers/GPS.Award')
const awardRequest = require('../controllers/GPS.AwardRequest')
const userGPS = require('../controllers/GPS.User')
const renewal = require('../controllers/GPS.Renewal')
-const fee = require('../controllers/GPS.Fee')
+const settings = require('../controllers/GPS.Settings')
/// //////////////////////////////////////////////////////// routes
/// ///////////////////////////// GPS
@@ -81,9 +81,13 @@ router.get('/gps/device/imei/:imei', hasPermission('gps'), device.getOneByIMEI)
router.get('/gps/device/id/:id', hasPermission('gps'), device.getOne)
router.put('/gps/device/:id', hasPermission('gps'), device.updateDevice)
-/// ////////////// Fee
-router.post('/gps/install-fee', hasPermission('gps'), fee.setFee)
-router.get('/gps/install-fee', hasPermission('gps'), fee.getFee)
+/// ////////////// Settings - fee
+router.post('/gps/settings/install-fee', hasPermission('gps'), settings.setFee)
+router.get('/gps/settings/install-fee', hasPermission('gps'), settings.getFee)
+/// /////////////////////////////////////////////////////////
+ /// ////////////// Fee - score
+router.post('/gps/settings/install-score', hasPermission('gps'), settings.setScore)
+router.get('/gps/settings/install-score', hasPermission('gps'), settings.getScore)
/// /////////////////////////////////////////////////////////
/// ///////////// survey
router.get('/surveys', hasPermission('surveys'), surveyController.getAllForAdmin)