|
|
const Asset = require('../models/Asset'); |
|
|
|
|
|
|
|
|
const getTodayDateStr = () => { |
|
|
const now = new Date(); |
|
|
const istOffset = 5.5 * 60 * 60 * 1000; |
|
|
const istDate = new Date(now.getTime() + istOffset); |
|
|
const dd = String(istDate.getUTCDate()).padStart(2, '0'); |
|
|
const mm = String(istDate.getUTCMonth() + 1).padStart(2, '0'); |
|
|
const yy = String(istDate.getUTCFullYear()).slice(-2); |
|
|
return `${dd}${mm}${yy}`; |
|
|
}; |
|
|
|
|
|
|
|
|
const checkAvailability = async (number) => { |
|
|
const dateStr = getTodayDateStr(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const startOfDay = new Date(); |
|
|
startOfDay.setHours(0,0,0,0); |
|
|
|
|
|
const exists = await Asset.findOne({ |
|
|
purchase_date: { $gte: startOfDay }, |
|
|
kus_id: { $regex: `${number}$` } |
|
|
}); |
|
|
|
|
|
return !exists; |
|
|
}; |
|
|
|
|
|
|
|
|
const generateKUS = async (tier, requestedNumber = null) => { |
|
|
const symbols = { Silver: "AG", Gold: "AU", Platinum: "PT" }; |
|
|
const symbol = symbols[tier]; |
|
|
const dateStr = getTodayDateStr(); |
|
|
|
|
|
const days = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; |
|
|
const istDate = new Date(new Date().getTime() + (5.5 * 60 * 60 * 1000)); |
|
|
const dayInitial = days[istDate.getUTCDay()]; |
|
|
|
|
|
let finalNumber; |
|
|
|
|
|
if (requestedNumber) { |
|
|
|
|
|
const isAvailable = await checkAvailability(requestedNumber); |
|
|
if (!isAvailable) throw new Error("Number already taken today"); |
|
|
finalNumber = requestedNumber; |
|
|
} else { |
|
|
|
|
|
let attempts = 0; |
|
|
while (attempts < 50) { |
|
|
const random = Math.floor(Math.random() * 1000000).toString().padStart(6, '0'); |
|
|
if (await checkAvailability(random)) { |
|
|
finalNumber = random; |
|
|
break; |
|
|
} |
|
|
attempts++; |
|
|
} |
|
|
if (!finalNumber) throw new Error("High traffic. Try again."); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return `${symbol}${dateStr}${dayInitial}${finalNumber}`; |
|
|
}; |
|
|
|
|
|
module.exports = { generateKUS, checkAvailability }; |