feat: enhance point calculation logic to update weekly and monthly points dynamically
This commit is contained in:
@@ -76,7 +76,7 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info(`🔍 Stats actuales - Total: ${stats.totalPoints}`);
|
logger.info(`🔍 Stats actuales - Total: ${stats.totalPoints}, Semanal: ${stats.weeklyPoints}, Mensual: ${stats.monthlyPoints}`);
|
||||||
|
|
||||||
// Función para parsear el input y calcular el nuevo valor
|
// Función para parsear el input y calcular el nuevo valor
|
||||||
const calculateNewValue = (input: string, currentValue: number): number => {
|
const calculateNewValue = (input: string, currentValue: number): number => {
|
||||||
@@ -103,9 +103,50 @@ export default {
|
|||||||
|
|
||||||
// Calcular nuevo valor de puntos totales
|
// Calcular nuevo valor de puntos totales
|
||||||
const newTotalPoints = calculateNewValue(totalInput, stats.totalPoints);
|
const newTotalPoints = calculateNewValue(totalInput, stats.totalPoints);
|
||||||
logger.info(`🔍 Nuevo total calculado: ${newTotalPoints}`);
|
const totalDifference = newTotalPoints - stats.totalPoints;
|
||||||
|
|
||||||
// Actualizar en base de datos (solo puntos totales)
|
logger.info(`🔍 Nuevo total calculado: ${newTotalPoints} (diferencia: ${totalDifference})`);
|
||||||
|
|
||||||
|
// Calcular nuevos puntos semanales y mensuales
|
||||||
|
let newWeeklyPoints = stats.weeklyPoints;
|
||||||
|
let newMonthlyPoints = stats.monthlyPoints;
|
||||||
|
|
||||||
|
if (totalInput[0] === '+') {
|
||||||
|
// Si añadimos puntos, sumar a semanal y mensual también
|
||||||
|
const pointsToAdd = parseInt(totalInput.substring(1)) || 0;
|
||||||
|
newWeeklyPoints = stats.weeklyPoints + pointsToAdd;
|
||||||
|
newMonthlyPoints = stats.monthlyPoints + pointsToAdd;
|
||||||
|
logger.info(`➕ Añadiendo ${pointsToAdd} puntos a todas las categorías`);
|
||||||
|
} else if (totalInput[0] === '-') {
|
||||||
|
// Si quitamos puntos, restar proporcionalmente de semanal y mensual
|
||||||
|
const pointsToRemove = parseInt(totalInput.substring(1)) || 0;
|
||||||
|
newWeeklyPoints = Math.max(0, stats.weeklyPoints - pointsToRemove);
|
||||||
|
newMonthlyPoints = Math.max(0, stats.monthlyPoints - pointsToRemove);
|
||||||
|
logger.info(`➖ Quitando ${pointsToRemove} puntos de todas las categorías`);
|
||||||
|
} else if (totalInput[0] === '=') {
|
||||||
|
// Si establecemos un valor absoluto, ajustar semanal y mensual proporcionalmente
|
||||||
|
const targetTotal = parseInt(totalInput.substring(1)) || 0;
|
||||||
|
|
||||||
|
if (stats.totalPoints > 0) {
|
||||||
|
// Calcular el ratio y aplicarlo
|
||||||
|
const ratio = targetTotal / stats.totalPoints;
|
||||||
|
newWeeklyPoints = Math.round(stats.weeklyPoints * ratio);
|
||||||
|
newMonthlyPoints = Math.round(stats.monthlyPoints * ratio);
|
||||||
|
} else {
|
||||||
|
// Si no había puntos antes, establecer todo a 0
|
||||||
|
newWeeklyPoints = 0;
|
||||||
|
newMonthlyPoints = 0;
|
||||||
|
}
|
||||||
|
logger.info(`🎯 Estableciendo total a ${targetTotal} y ajustando proporcionalmente`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asegurar que semanal no exceda mensual, y mensual no exceda total
|
||||||
|
newWeeklyPoints = Math.min(newWeeklyPoints, newMonthlyPoints, newTotalPoints);
|
||||||
|
newMonthlyPoints = Math.min(newMonthlyPoints, newTotalPoints);
|
||||||
|
|
||||||
|
logger.info(`🔍 Nuevos valores calculados - Total: ${newTotalPoints}, Semanal: ${newWeeklyPoints}, Mensual: ${newMonthlyPoints}`);
|
||||||
|
|
||||||
|
// Actualizar en base de datos (todos los puntos)
|
||||||
await prisma.partnershipStats.update({
|
await prisma.partnershipStats.update({
|
||||||
where: {
|
where: {
|
||||||
userId_guildId: {
|
userId_guildId: {
|
||||||
@@ -114,7 +155,9 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
totalPoints: newTotalPoints
|
totalPoints: newTotalPoints,
|
||||||
|
weeklyPoints: newWeeklyPoints,
|
||||||
|
monthlyPoints: newMonthlyPoints
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -134,20 +177,35 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calcular la diferencia
|
// Calcular las diferencias
|
||||||
const difference = newTotalPoints - stats.totalPoints;
|
const totalDiff = newTotalPoints - stats.totalPoints;
|
||||||
const diffText = difference > 0 ? `+${difference}` : `${difference}`;
|
const weeklyDiff = newWeeklyPoints - stats.weeklyPoints;
|
||||||
|
const monthlyDiff = newMonthlyPoints - stats.monthlyPoints;
|
||||||
|
|
||||||
|
const totalDiffText = totalDiff > 0 ? `+${totalDiff}` : `${totalDiff}`;
|
||||||
|
const weeklyDiffText = weeklyDiff > 0 ? `+${weeklyDiff}` : `${weeklyDiff}`;
|
||||||
|
const monthlyDiffText = monthlyDiff > 0 ? `+${monthlyDiff}` : `${monthlyDiff}`;
|
||||||
|
|
||||||
// Crear embed de confirmación
|
// Crear embed de confirmación
|
||||||
const embed = new EmbedBuilder()
|
const embed = new EmbedBuilder()
|
||||||
.setColor(difference >= 0 ? 0x00ff00 : 0xff9900)
|
.setColor(totalDiff >= 0 ? 0x00ff00 : 0xff9900)
|
||||||
.setTitle('✅ Puntos Actualizados')
|
.setTitle('✅ Puntos Actualizados')
|
||||||
.setDescription(`Se han actualizado los puntos de **${userName}**`)
|
.setDescription(`Se han actualizado los puntos de **${userName}**`)
|
||||||
.addFields(
|
.addFields(
|
||||||
{
|
{
|
||||||
name: '📊 Puntos Totales',
|
name: '📊 Puntos Totales',
|
||||||
value: `${stats.totalPoints} → **${newTotalPoints}** (${diffText})`,
|
value: `${stats.totalPoints} → **${newTotalPoints}** (${totalDiffText})`,
|
||||||
inline: false
|
inline: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '🗓️ Puntos Mensuales',
|
||||||
|
value: `${stats.monthlyPoints} → **${newMonthlyPoints}** (${monthlyDiffText})`,
|
||||||
|
inline: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '📅 Puntos Semanales',
|
||||||
|
value: `${stats.weeklyPoints} → **${newWeeklyPoints}** (${weeklyDiffText})`,
|
||||||
|
inline: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '📝 Operación',
|
name: '📝 Operación',
|
||||||
|
|||||||
Reference in New Issue
Block a user