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 };