Created
October 2, 2024 06:00
-
-
Save barrybtw/6da4a5dd25522e9aa43d1b02ab13aff9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Text.Json; | |
namespace Budgetering; | |
public class Income | |
{ | |
public required string Name { get; set; } | |
public required decimal Amount { get; set; } | |
} | |
public class Expense | |
{ | |
public required string Name { get; set; } | |
public required decimal Amount { get; set; } | |
} | |
public abstract class Program | |
{ | |
private const string IncomesFilePath = "incomes.json"; | |
private const string ExpensesFilePath = "expenses.json"; | |
static async Task Main(string[] args) | |
{ | |
List<Income> incomes = await LoadIncomes(); | |
List<Expense> expenses = await LoadExpenses(); | |
var exitApp = false; | |
while (!exitApp) | |
{ | |
var selectedIndex = DisplayMenu(new string[] | |
{ | |
"Tilføj Indkomst", "Se Indkomster", "Fjern Indkomst", "Tilføj Udgift", "Se Udgifter", "Fjern Udgift", | |
"Statistik", "Exit" | |
}); | |
switch (selectedIndex) | |
{ | |
case 0: | |
var newIncome = IncomeQuestionnaire(); | |
incomes.Add(newIncome); | |
await SaveIncomes(incomes); | |
Console.WriteLine("\nIndkomst tilføjet!"); | |
break; | |
case 1: | |
Console.Clear(); | |
decimal totalIncome = 0; | |
Console.WriteLine("Indkomster:"); | |
foreach (var income in incomes) | |
{ | |
Console.WriteLine($"Indkomsten: {income.Name}, indtjener: {income.Amount}kr."); | |
totalIncome += income.Amount; | |
} | |
Console.WriteLine($"\nTotal Indkomst: {totalIncome}kr."); | |
Console.WriteLine("\nTryk på enhver knap for at vende tilbage..."); | |
Console.ReadKey(); | |
break; | |
case 2: | |
RemoveIncome(incomes); | |
await SaveIncomes(incomes); | |
break; | |
case 3: | |
var newExpense = ExpenseQuestionnaire(); | |
expenses.Add(newExpense); | |
await SaveExpenses(expenses); | |
Console.WriteLine("\nUdgift tilføjet!"); | |
break; | |
case 4: | |
Console.Clear(); | |
decimal totalExpense = 0; | |
Console.WriteLine("Udgift gemt:"); | |
foreach (var expense in expenses) | |
{ | |
Console.WriteLine($"Udgiften: {expense.Name}, koster dig: {expense.Amount}kr."); | |
totalExpense += expense.Amount; | |
} | |
Console.WriteLine($"\nTotal Udgift: {totalExpense}kr."); | |
Console.WriteLine("\nTryk på enhver knap for at vende tilbage..."); | |
Console.ReadKey(); | |
break; | |
case 5: | |
RemoveExpense(expenses); | |
await SaveExpenses(expenses); | |
break; | |
case 6: | |
ShowStatistics(incomes, expenses); | |
break; | |
case 7: | |
exitApp = true; | |
break; | |
} | |
} | |
Console.WriteLine("Vi ses!"); | |
} | |
private static async Task SaveIncomes(List<Income> incomes) | |
{ | |
string jsonString = JsonSerializer.Serialize(incomes, new JsonSerializerOptions { WriteIndented = true }); | |
await File.WriteAllTextAsync(IncomesFilePath, jsonString); | |
} | |
private static async Task<List<Income>> LoadIncomes() | |
{ | |
if (!File.Exists(IncomesFilePath)) return new List<Income>(); | |
var jsonString = await File.ReadAllTextAsync(IncomesFilePath); | |
return JsonSerializer.Deserialize<List<Income>>(jsonString) ?? new List<Income>(); | |
} | |
private static async Task SaveExpenses(List<Expense> expenses) | |
{ | |
var jsonString = JsonSerializer.Serialize(expenses, new JsonSerializerOptions { WriteIndented = true }); | |
await File.WriteAllTextAsync(ExpensesFilePath, jsonString); | |
} | |
private static async Task<List<Expense>> LoadExpenses() | |
{ | |
if (!File.Exists(ExpensesFilePath)) return new List<Expense>(); | |
var jsonString = await File.ReadAllTextAsync(ExpensesFilePath); | |
return JsonSerializer.Deserialize<List<Expense>>(jsonString) ?? new List<Expense>(); | |
} | |
private static Income IncomeQuestionnaire() | |
{ | |
Console.Clear(); | |
Console.WriteLine("Indtast navn på nye indkomst:"); | |
var incomeName = Console.ReadLine(); | |
Console.WriteLine($"Hvor meget tjener {incomeName} per måned?"); | |
var userInputAmount = Console.ReadLine() ?? throw new ArgumentNullException($"Console.ReadLine()"); | |
decimal.TryParse(userInputAmount, out var incomeAmount); | |
Console.WriteLine($"Indkomsten {incomeName} tjener {incomeAmount}kr. per måned."); | |
return new Income | |
{ | |
Amount = incomeAmount, | |
Name = incomeName ?? string.Empty | |
}; | |
} | |
private static Expense ExpenseQuestionnaire() | |
{ | |
Console.Clear(); | |
Console.WriteLine("Indtast navn på nye udgift:"); | |
var expenseName = Console.ReadLine(); | |
Console.WriteLine($"Hvor meget koster {expenseName} per måned?"); | |
var userInputAmount = Console.ReadLine() ?? throw new ArgumentNullException($"Console.ReadLine()"); | |
decimal.TryParse(userInputAmount, out var expenseAmount); | |
Console.WriteLine($"Udgiften {expenseName} koster {expenseAmount} per måned."); | |
return new Expense | |
{ | |
Amount = expenseAmount, | |
Name = expenseName ?? string.Empty | |
}; | |
} | |
private static void RemoveIncome(List<Income> incomes) | |
{ | |
if (incomes.Count == 0) | |
{ | |
Console.WriteLine("Ingen indkomst at fjerne."); | |
Console.ReadKey(); | |
return; | |
} | |
Console.Clear(); | |
Console.WriteLine("Vælg en indkomst at fjerne (tryk 0 for at gå tilbage):"); | |
for (var i = 0; i < incomes.Count; i++) | |
{ | |
Console.WriteLine($"{i + 1}. {incomes[i].Name} - {incomes[i].Amount}kr."); | |
} | |
var choice = GetUserSelection(incomes.Count); | |
if (choice == 0) | |
{ | |
Console.WriteLine("Ingen indkomst blev fjernet."); | |
} | |
else | |
{ | |
incomes.RemoveAt(choice - 1); | |
Console.WriteLine("Indkomst fjernet!"); | |
} | |
Console.ReadKey(); | |
} | |
private static void RemoveExpense(List<Expense> expenses) | |
{ | |
if (expenses.Count == 0) | |
{ | |
Console.WriteLine("Ingen udgift at fjerne."); | |
Console.ReadKey(); | |
return; | |
} | |
Console.Clear(); | |
Console.WriteLine("Vælg en udgift at fjerne (tryk 0 for at gå tilbage):"); | |
for (var i = 0; i < expenses.Count; i++) | |
{ | |
Console.WriteLine($"{i + 1}. {expenses[i].Name} - {expenses[i].Amount}kr."); | |
} | |
var choice = GetUserSelection(expenses.Count); | |
if (choice == 0) | |
{ | |
Console.WriteLine("Ingen udgift blev fjernet."); | |
} | |
else | |
{ | |
expenses.RemoveAt(choice - 1); | |
Console.WriteLine("Udgift fjernet!"); | |
} | |
Console.ReadKey(); | |
} | |
private static int GetUserSelection(int max) | |
{ | |
int choice; | |
while (true) | |
{ | |
Console.WriteLine($"Vælg et nummer mellem 0 og {max} (tryk 0 for at gå tilbage):"); | |
var input = Console.ReadLine(); | |
if (int.TryParse(input, out choice) && choice >= 0 && choice <= max) | |
break; | |
Console.WriteLine("Fejl, prøv igen."); | |
} | |
return choice; | |
} | |
private static void ShowStatistics(List<Income> incomes, List<Expense> expenses) | |
{ | |
var totalIncome = incomes.Sum(income => income.Amount); | |
var totalExpenses = expenses.Sum(expense => expense.Amount); | |
var leftover = totalIncome - totalExpenses; | |
Console.Clear(); | |
Console.WriteLine($"Total Indkomst: {totalIncome}kr."); | |
Console.WriteLine($"Total Udgifter: {totalExpenses}kr."); | |
Console.WriteLine($"Tilovers: {leftover}kr."); | |
Console.WriteLine("\nTryk på enhver knap for at vende tilbage..."); | |
Console.ReadKey(); | |
} | |
// Tryk på op og ned pilene for at bevæge sig i menuen | |
private static int DisplayMenu(string[] options) | |
{ | |
var selectedIndex = 0; | |
ConsoleKey key; | |
do | |
{ | |
Console.Clear(); | |
Console.WriteLine("Brug piletasterne for at navigere, og Enter for at vælge:"); | |
for (var i = 0; i < options.Length; i++) | |
{ | |
if (i == selectedIndex) | |
{ | |
Console.ForegroundColor = ConsoleColor.Green; | |
Console.WriteLine($"> {options[i]}"); | |
Console.ResetColor(); | |
} | |
else | |
{ | |
Console.WriteLine($" {options[i]}"); | |
} | |
} | |
key = Console.ReadKey(true).Key; | |
selectedIndex = key switch | |
{ | |
ConsoleKey.UpArrow => (selectedIndex - 1 + options.Length) % options.Length, | |
ConsoleKey.DownArrow => (selectedIndex + 1) % options.Length, | |
_ => selectedIndex | |
}; | |
} while (key != ConsoleKey.Enter); | |
return selectedIndex; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment