Skip to content

Instantly share code, notes, and snippets.

@barrybtw
Created October 2, 2024 06:00
Show Gist options
  • Save barrybtw/6da4a5dd25522e9aa43d1b02ab13aff9 to your computer and use it in GitHub Desktop.
Save barrybtw/6da4a5dd25522e9aa43d1b02ab13aff9 to your computer and use it in GitHub Desktop.
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