File size: 2,558 Bytes
e14bacb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
const Asset = require('../models/Asset');
// Helper to get today's date string (DDMMYY)
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}`;
};
// Check if a number is available for today
const checkAvailability = async (number) => {
const dateStr = getTodayDateStr();
// Regex to match any tier prefix but specific date and number
// Pattern: [XX][DATE][D][NUMBER]
// We just check if the "number" part (last 6 digits) exists for today
// Actually, simpler: Store 'daily_sequence' in Asset or check KUS suffix
// Let's stick to the requested format: [SYMBOL][DATE][DAY][NUMBER]
// We need to query if any asset ends with this number for TODAY
const startOfDay = new Date();
startOfDay.setHours(0,0,0,0);
const exists = await Asset.findOne({
purchase_date: { $gte: startOfDay },
kus_id: { $regex: `${number}$` } // Ends with the number
});
return !exists;
};
// Generate KUS (Random or Specific)
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) {
// Validate availability
const isAvailable = await checkAvailability(requestedNumber);
if (!isAvailable) throw new Error("Number already taken today");
finalNumber = requestedNumber;
} else {
// Random Shuffle Logic (Try until unique)
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.");
}
// Format: AU171225W000000
// Note: Requested 6 digits (0 to 1 million) -> 000000 to 999999
return `${symbol}${dateStr}${dayInitial}${finalNumber}`;
};
module.exports = { generateKUS, checkAvailability }; |