diff --git a/gaehsnitz/admin.py b/gaehsnitz/admin.py
index da8eb38..e7a84dd 100644
--- a/gaehsnitz/admin.py
+++ b/gaehsnitz/admin.py
@@ -1,8 +1,202 @@
+from decimal import Decimal
+from typing import Union
+
from django.contrib import admin
+from django.contrib.auth import get_user_model
+from django.contrib.auth.admin import UserAdmin
+from django.utils.safestring import mark_safe
-from gaehsnitz.models import Payment
+from gaehsnitz.models import Donation, Payment, Drink, Consumption, Payback
+
+User = get_user_model()
-@admin.register(Payment, site=admin.site)
+def euro(value: Union[int, float, Decimal]) -> str:
+ return f"{value:.2f} €"
+
+
+class DonationInline(admin.TabularInline):
+ model = Donation
+ extra = 0
+
+
+class ConsumptionInline(admin.TabularInline):
+ model = Consumption
+ extra = 0
+
+
+class PaymentInline(admin.TabularInline):
+ model = Payment
+ extra = 0
+
+
+class PaybackInline(admin.TabularInline):
+ model = Payback
+ extra = 0
+
+
+@admin.register(User)
+class CustomUserAdmin(UserAdmin):
+ list_display = ("username", "balance")
+ ordering = ("username",)
+ list_filter = []
+ fieldsets = (
+ (None, {"fields": (
+ "username",
+ "password",
+ )}),
+ ("BALANCE", {"fields": (
+ "donations_made",
+ "consumed_drinks_price",
+ "other_payments_made",
+ "paybacks_received",
+ "balance",
+ )}),
+ )
+ readonly_fields = (
+ "donations_made",
+ "consumed_drinks_price",
+ "other_payments_made",
+ "paybacks_received",
+ "balance",
+ )
+ inlines = (DonationInline, ConsumptionInline, PaymentInline, PaybackInline)
+
+ def donations_made(self, user: User):
+ return euro(user.donations_made)
+
+ def consumed_drinks_price(self, user: User):
+ return euro(user.consumed_drinks_price)
+
+ def other_payments_made(self, user: User):
+ return euro(user.other_payments_made)
+
+ def paybacks_received(self, user: User):
+ return euro(user.paybacks_received)
+
+ def balance(self, user: User):
+ val = user.balance
+ if val < 0:
+ color = "#FF8844"
+ elif val < 20:
+ color = "#EEEE33"
+ elif val < 40:
+ color = "#66FF33"
+ else:
+ color = "#5599FF"
+ return mark_safe(
+ f''
+ f'{euro(val)}'
+ f''
+ )
+
+
+@admin.register(Donation)
+class DonationAdmin(admin.ModelAdmin):
+ list_display = ("date", "from_user", "amount", "note")
+ ordering = ("-date",)
+
+ @admin.display(ordering="amount")
+ def amount(self, donation: Donation):
+ return euro(donation.amount)
+
+
+@admin.register(Payment)
class PaymentAdmin(admin.ModelAdmin):
- list_display = ("topic", "amount", "date", "other_party",)
+ list_display = ("date", "purpose", "amount", "from_user")
+ ordering = ("-date",)
+
+ @admin.display(ordering="amount")
+ def amount(self, payment: Payment):
+ return euro(payment.amount)
+
+
+@admin.register(Payback)
+class PaybackAdmin(admin.ModelAdmin):
+ list_display = ("date", "to_user", "amount", "note")
+ ordering = ("-date",)
+
+ @admin.display(ordering="amount")
+ def amount(self, payback: Payback):
+ return euro(payback.amount)
+
+
+@admin.register(Drink)
+class DrinkAdmin(admin.ModelAdmin):
+ list_display = ("name", "purchase_price_per_crate", "crates_purchased", "purchase_price_total")
+ fieldsets = (
+ (None, {"fields": (
+ "name",
+ )}),
+ ("crates", {"fields": (
+ "crates_ordered",
+ "crates_purchased",
+ "crates_returned",
+ )}),
+ ("bottles", {"fields": (
+ "bottles_per_crate",
+ "bottles_total",
+ "bottles_returned",
+ )}),
+ ("amount", {"fields": (
+ "bottle_size",
+ "amount_per_crate",
+ "amount_total",
+ )}),
+ ("purchase", {"fields": (
+ "purchase_price_per_crate",
+ "purchase_price_per_bottle",
+ "purchase_price_total",
+ )}),
+ ("deposit", {"fields": (
+ "deposit_per_crate",
+ "deposit_total",
+ "deposit_refund",
+ "deposit_kept",
+ )}),
+ ("sales", {"fields": (
+ "sale_price_per_bottle",
+ "bottles_sold",
+ "sales_purchase_value",
+ "sale_price_total",
+ "bottles_given_away",
+ "giveaway_purchase_value",
+ "balance",
+ )}),
+ )
+ readonly_fields = (
+ "bottles_total", "bottles_returned",
+ "amount_per_crate", "amount_total",
+ "purchase_price_per_bottle", "purchase_price_total",
+ "deposit_total", "deposit_refund", "deposit_kept",
+ "bottles_sold", "sales_purchase_value", "sale_price_total",
+ "bottles_given_away", "giveaway_purchase_value",
+ "balance",
+ )
+
+ def purchase_price_per_bottle(self, drink: Drink):
+ return euro(drink.purchase_price_per_bottle)
+
+ def purchase_price_total(self, drink: Drink):
+ return euro(drink.purchase_price_total)
+
+ def deposit_total(self, drink: Drink):
+ return euro(drink.deposit_total)
+
+ def deposit_refund(self, drink: Drink):
+ return euro(drink.deposit_refund)
+
+ def deposit_kept(self, drink: Drink):
+ return euro(drink.deposit_kept)
+
+ def sales_purchase_value(self, drink: Drink):
+ return euro(drink.sales_purchase_value)
+
+ def sale_price_total(self, drink: Drink):
+ return euro(drink.sale_price_total)
+
+ def giveaway_purchase_value(self, drink: Drink):
+ return euro(drink.giveaway_purchase_value)
+
+ def balance(self, drink: Drink):
+ return mark_safe(f"{euro(drink.balance)}")