diff --git a/package-lock.json b/package-lock.json index 5470ae5..43f8d65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "jsonwebtoken": "^9.0.2", "mongodb": "^6.12.0", "mongoose": "^8.9.2", + "mongoose-sequence": "^6.0.1", "morgan": "^1.10.0", "pbkdf2-password": "^1.2.1", "rotating-file-stream": "^3.2.5", @@ -2133,6 +2134,12 @@ "dev": true, "license": "MIT" }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5642,6 +5649,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -6041,6 +6054,19 @@ } } }, + "node_modules/mongoose-sequence": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-6.0.1.tgz", + "integrity": "sha512-uXnLCW9pu2V49Xw8BmdXdeRugd2mv+ntu3nT2Bbm33pNRmmvHE2GKA+8BASKoQt960McLX4VL78wkb492f6MoQ==", + "license": "GPL-2.0", + "dependencies": { + "async": "^3.2.5", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "mongoose": ">=5" + } + }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8160,4 +8186,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index e77732d..8ef622c 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "jsonwebtoken": "^9.0.2", "mongodb": "^6.12.0", "mongoose": "^8.9.2", + "mongoose-sequence": "^6.0.1", "morgan": "^1.10.0", "pbkdf2-password": "^1.2.1", "rotating-file-stream": "^3.2.5", diff --git a/server/routers/dry-wash/model/order.js b/server/routers/dry-wash/model/order.js index 8ee924f..2939822 100644 --- a/server/routers/dry-wash/model/order.js +++ b/server/routers/dry-wash/model/order.js @@ -1,5 +1,6 @@ const { Schema, model } = require('mongoose') const { orderStatus } = require('./const') +const { OrderNumberModel } = require('./order.number') const schema = new Schema({ phone: { @@ -28,9 +29,6 @@ const schema = new Schema({ required: true }, orderNumber: { - type: String, - required: true, - unique: true }, status: { type: String, @@ -52,6 +50,18 @@ const schema = new Schema({ }, }) +schema.pre('save', async function (next) { + if (this.isNew) { + const counter = await OrderNumberModel.findOneAndUpdate( + { _id: 'orderNumber' }, + { $inc: { sequenceValue: 1 } }, + { new: true, upsert: true } + ) + this.orderNumber = counter.sequenceValue.toString() + } + next() +}) + schema.set('toJSON', { virtuals: true, versionKey: false, diff --git a/server/routers/dry-wash/model/order.number.js b/server/routers/dry-wash/model/order.number.js new file mode 100644 index 0000000..195d617 --- /dev/null +++ b/server/routers/dry-wash/model/order.number.js @@ -0,0 +1,14 @@ +const { Schema, model } = require('mongoose') + +const schema = new Schema({ + _id: { + type: String, + required: true, + }, + sequenceValue: { + type: Number, + default: 0 + } +}) + +exports.OrderNumberModel = model('dry-wash-order-number', schema) \ No newline at end of file diff --git a/server/routers/dry-wash/order.js b/server/routers/dry-wash/order.js index 0c15b33..d258fa0 100644 --- a/server/routers/dry-wash/order.js +++ b/server/routers/dry-wash/order.js @@ -74,21 +74,6 @@ const VALIDATION_MESSAGES = { }, } -/** - * Generates the next order number incrementing the last order number - * @returns {Promise} - */ -const generateOrderNumber = async () => { - const lastOrder = await OrderModel.findOne().sort({ created: -1 }) - if (lastOrder) { - const lastOrderNumber = parseInt(lastOrder.orderNumber ?? '0') - const nextOrderNumber = lastOrderNumber + 1 - return String(nextOrderNumber) - } - - return '1' // number of the very first order -} - router.post('/create', async (req, res, next) => { const bodyErrors = [] @@ -144,9 +129,7 @@ router.post('/create', async (req, res, next) => { startWashTime: washing.begin, endWashTime: washing.end, location: washing.location, - orderNumber: await generateOrderNumber(), status: orderStatus.PROGRESS, - master: '', notes: '', created: new Date().toISOString(), })