diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.properties b/frontend/android/gradle/wrapper/gradle-wrapper.properties index 76edbaab..5e022813 100644 --- a/frontend/android/gradle/wrapper/gradle-wrapper.properties +++ b/frontend/android/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index 31b076f3..9db99f65 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -228,26 +228,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -537,10 +537,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" typed_data: dependency: transitive description: @@ -577,10 +577,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -614,5 +614,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.8.0-0 <4.0.0" flutter: ">=3.27.0" diff --git a/server/modules/mess_change/messChangeModel.js b/server/modules/mess_change/messChangeModel.js index 8c061abb..d0d50d17 100644 --- a/server/modules/mess_change/messChangeModel.js +++ b/server/modules/mess_change/messChangeModel.js @@ -14,7 +14,15 @@ const messChangeSchema = new mongoose.Schema({ type: String, required: true, }, - toHostel: { + toHostel1: { + type: String, + required: true, + }, + toHostel2: { + type: String, + required: true, + }, + toHostel3: { type: String, required: true, }, diff --git a/server/modules/mess_change/messchangeController.js b/server/modules/mess_change/messchangeController.js index a7d93fb8..f76f1c7c 100644 --- a/server/modules/mess_change/messchangeController.js +++ b/server/modules/mess_change/messchangeController.js @@ -58,36 +58,35 @@ const processUsersInIterations = (users, capacityTracker) => { const sortedUsers = sortUsersByPriority(users); for (const user of sortedUsers) { - const targetHostelId = user.next_mess?.toString(); - console.log("targetHostelId", targetHostelId); - if (!targetHostelId || !capacityTracker[targetHostelId]) { - // Skip invalid requests - they remain unprocessed - remainingUsers.push(user); - continue; + const preferences = [ + user.next_mess1?.toString(), + user.next_mess2?.toString(), + user.next_mess3?.toString(), + ] // remove nulls + + let assigned = false; + for (const messId of preferences) { + if (capacityTracker[messId]?.available > 0) { + acceptedUsers.push({ + id: user._id, + name: user.name, + rollNumber: user.rollNumber, + fromHostelId: user.hostel, + toHostelId: messId, + }); + capacityTracker[messId].available--; + assigned = true; + processedInThisIteration++; + break; + } } - console.log( - "capacityTracker[targetHostelId].available", - capacityTracker[targetHostelId].available - ); - if (capacityTracker[targetHostelId].available > 0) { - console.log("accepted"); - acceptedUsers.push({ - id: user._id, - name: user.name, - rollNumber: user.rollNumber, - fromHostelId: user.hostel, // Use user's actual hostel for HAB processed requests - toHostelId: user.next_mess, - }); - capacityTracker[targetHostelId].available--; - processedInThisIteration++; - } else { - // Keep for next iteration - don't mark as waitlisted during processing + + if (!assigned) { remainingUsers.push(user); } } users = remainingUsers; - console.log("users", users); if (processedInThisIteration === 0) break; } @@ -95,13 +94,39 @@ const processUsersInIterations = (users, capacityTracker) => { id: user._id, name: user.name, rollNumber: user.rollNumber, - fromHostelId: user.hostel, // Use user's actual hostel for HAB processed requests - toHostelId: user.next_mess, + fromHostelId: user.hostel, + toHostelId: null, })); return { acceptedUsers, rejectedUsers }; }; +const reallocateImprovedMessChoices = async (acceptedUsers, capacityTracker) => { + for (const userData of acceptedUsers) { + const user = await User.findById(userData.id); + const preferences = [ + user.next_mess1?.toString(), + user.next_mess2?.toString(), + user.next_mess3?.toString(), + ].filter(Boolean); + + const currentMess = user.curr_subscribed_mess?.toString(); + + for (const preferredMess of preferences) { + if (preferredMess === currentMess) break; // already best option + if (capacityTracker[preferredMess]?.available > 0) { + // Reassign to better mess + user.curr_subscribed_mess = preferredMess; + capacityTracker[preferredMess].available--; + capacityTracker[currentMess].available++; + await user.save(); + break; + } + } + } +}; + + // Database update function for accepted users const updateAcceptedUsers = async (acceptedUsers) => { for (const acceptedUser of acceptedUsers) { @@ -112,7 +137,9 @@ const updateAcceptedUsers = async (acceptedUsers) => { user.applied_for_mess_changed = false; user.got_mess_changed = true; user.applied_hostel_string = ""; - user.next_mess = null; + user.next_mess1 = null; + user.next_mess2=null; + user.next_mess3 = null; user.applied_hostel_timestamp = null; console.log("user", user); await user.save(); @@ -218,6 +245,7 @@ const processAllMessChangeRequests = async (req, res) => { // Update database for all user categories await updateAcceptedUsers(acceptedUsers); + await reallocateImprovedMessChoices(acceptedUsers, capacityTracker); await updateRejectedUsers(rejectedUsers); // Automatically disable mess change after processing and update timestamp diff --git a/server/modules/user/userModel.js b/server/modules/user/userModel.js index 53e3e678..01b6a258 100644 --- a/server/modules/user/userModel.js +++ b/server/modules/user/userModel.js @@ -125,10 +125,18 @@ const userSchema = new mongoose.Schema({ return this.hostel; }, }, - next_mess: { + next_mess1: { type: mongoose.Schema.Types.ObjectId, ref: "Hostel", }, + next_mess2: { + type: mongoose.Schema.Types.ObjectId, + ref: "Hostel", +}, +next_mess3: { + type: mongoose.Schema.Types.ObjectId, + ref: "Hostel", +}, applied_hostel_timestamp: { type: Date, },