diff --git a/commands/receipts/receiptCommands.js b/commands/receipts/receiptCommands.js index 5e2a588..e745c6b 100644 --- a/commands/receipts/receiptCommands.js +++ b/commands/receipts/receiptCommands.js @@ -14,21 +14,21 @@ module.exports = { option.setName('amount') .setRequired(true) .setDescription('Amount as int')) - .addBooleanOption(option => + .addBooleanOption(option => option.setName('override') .setRequired(false) .setDescription('Override budget of current period')) ) .addSubcommand(subcommand => subcommand - .setName('spendings') + .setName('view') .setDescription('View your grocery spendings for the current or previous week') .addBooleanOption(option => option .setName('lastweek') .setDescription('Show spendings from the previous budget cycle instead of the current one') .setRequired(false) - ) + ) ), async execute(interaction) { console.log('budget command entrypoint'); @@ -46,13 +46,59 @@ module.exports = { switch (interaction.options.getSubcommand()) { case 'set': console.log('budget command set'); - let budget = interaction.options.get('amount').value + let override = interaction.options.getBoolean('override') ?? false; + let budget = interaction.options.getB('amount').value; db.prepare(`INSERT OR REPLACE INTO bot_config (id, weekly_budget) VALUES (1, ?)`).run(budget); - await interaction.reply(`Budget set to ${budget}`); + if (override) { + db.prepare(` + UPDATE weekly_budgets + SET budget_amount = ? + WHERE id = ( + SELECT id FROM weekly_budgets + WHERE date('now', 'localtime') BETWEEN start_date AND end_date + ORDER BY id DESC + LIMIT 1 + )`).run(budget); + + } + await interaction.reply(`Budget set to ${budget}.`); break; - case 'spendings': - console.log('budget command show'); - await interaction.reply('Not implemented'); + case 'view': + const currentBudget = db.prepare(` + SELECT id, budget_amount, exchange_rate, start_date, end_date + FROM weekly_budgets + WHERE date('now', 'localtime') BETWEEN start_date AND end_date + LIMIT 1 + `).get(); + + const userSpendings = db.prepare(` + SELECT amount, message_raw + FROM grocery_spendings + WHERE budget_id = ? AND discord_id = ? + `).all(currentBudget.id, interaction.member.id); + + const totalSpentEur = userSpendings.reduce((acc, s) => { + return acc + s.amount; + }, 0); + + const remainingEur = currentBudget.budget_amount - totalSpentEur; + const remainingSek = remainingEur * currentBudget.exchange_rate; + + const todayTimestamp = Math.floor(Date.now() / 1000); + const endTimestamp = Math.floor(new Date(`${currentBudget.end_date}T23:59:59`).getTime() / 1000); + + const budgetEmbed = new EmbedBuilder() + .setColor(remainingEur > 0 ? 0x00ff00 : 0xff0000) + .setTitle(`${interaction.member.displayName} Budget as of `) + .setDescription(`Period: \`${currentBudget.start_date}\` to \`${currentBudget.end_date}\`\nReset `) + .addFields( + { name: 'Spent', value: `${totalSpentEur.toFixed(2)} €\n${(totalSpentEur * currentBudget.exchange_rate).toFixed(2)} kr`, inline: true }, + { name: 'Remaining', value: `${remainingEur.toFixed(2)} €\n${remainingSek.toFixed(2)} kr`, inline: true }, + ) + .setFooter({ text: `Exchange rate this week: 1 € = ${currentBudget.exchange_rate} kr` }) + .setTimestamp(); + + await interaction.reply({ embeds: [budgetEmbed], ephemeral: true }); break default: await interaction.reply(`Sub mismatch. Switching on ${interaction.options.getSubcommand()}`); diff --git a/timers/receiptTimer.js b/timers/receiptTimer.js index 63e7931..96be3ef 100644 --- a/timers/receiptTimer.js +++ b/timers/receiptTimer.js @@ -34,7 +34,7 @@ module.exports = { if (!response.ok) await channel.send(`Failed to fetch exchange rate:\n${response.statusText}`); const data = await response.json(); //await channel.send(`Fetched new exchange rate:\n${JSON.stringify(data)}`); - await channel.send(`Reset weekly budget to ${config.weekly_budget}EUR / ${config.weekly_budget*data.rates.SEK}SEK`); + await channel.send(`Reset weekly budget to ${config.weekly_budget}€ / ${config.weekly_budget*data.rates.SEK} kr`); db.prepare(`