DATA
CZAS
IMIENINY
FAZA KSIĘŻYCA
STAFLOTA ⊕ SEKTOR ALFA · BITEDU STATION


1. Cel aplikacji

Napisz aplikację WPF, która pozwala dodawać wydatki (nazwa, kategoria, kwota, data), wyświetlać je na liście, filtrować po roku i miesiącu oraz obliczać sumę wydatków dla wybranego miesiąca. Dane zapisz/odczytuj z pliku JSON w katalogu danych użytkownika.

2. Wymagania funkcjonalne

  1. Formularz „Nowy wydatek”:
    Nazwa (tekst), Kategoria (lista: Jedzenie, Transport, Rachunki, Rozrywka, Zdrowie, Inne), Kwota (liczba > 0), Data (DatePicker), przycisk Dodaj.
  2. Lista (DataGrid) z kolumnami: Nazwa, Kategoria, Kwota, Data.
  3. Filtry: pola Rok i Miesiąc (1–12). Zmiana filtrów natychmiast odświeża widok listy i Sumę miesiąca.
  4. Suma miesiąca wyświetlana obok filtrów w formacie 0.00 PLN.
  5. Akcje: Zapisz (utrwal dane do JSON), Wczytaj (odczytaj JSON), Usuń zaznaczony.
  6. Walidacja pól formularza „na żywo” (czerwone obramowanie w WPF):
    Nazwa – wymagana, max 50 znaków; Kategoria – wymagana; Kwota – > 0; Data – wymagana.
    Dodaj aktywne tylko, gdy wszystkie pola są poprawne.

3. Wymagania techniczne i nazewnictwo (trzymaj się tej struktury)

DomowyBudzetWpf
├─ MainWindow.xaml
├─ MainWindow.xaml.cs
├─ Models
│  └─ dane.cs              // model danych Wydatek (+ walidacja)
├─ Walidacja
│  └─ WalidacjaBudzet.cs   // helper walidacji + RelayCommand (komendy)
└─ Logika
   └─ LogikaBudzet.cs      // logika/binding/filtr/suma/zapis-odczyt

Nowe elementy i co robią:

4. Interfejs – opis rozmieszczenia

Spis kontrolek i paneli (UI)

Okno i siatka główna

Sekcja „Nowy wydatek”

Pasek filtrów i sumy

Lista wydatków

Pasek akcji dolny

Dodatkowe elementy „niewizualne”, ale istotne dla UI

5. Algorytmy (pseudokod)

5.1. Dodawanie wydatku

CanDodaj():
  zwróć TRUE tylko, jeśli:
    Nazwa != "" i długość <= 50
    Kategoria wybrana
    Kwota > 0
    Data ustawiona

Dodaj():
  jeśli CanDodaj():
    kopia = Wydatek(Nazwa, Kategoria, Kwota, Data)
    Wydatki.Add(kopia)
    Nowy = Wydatek(Kategoria = kopia.Kategoria, Data = dzisiaj)   // reset formularza
    WidokWydatkow.Refresh()
    SumaMiesiaca = przelicz()

5.2. Filtrowanie i suma

FiltrMiesiaca(wydatek):
  zwróć (wydatek.Data.Year == Rok) i (wydatek.Data.Month == Miesiac)

przelicz():
  suma = 0
  dla każdego w w Wydatki:
    jeśli w.Data.Year == Rok i w.Data.Month == Miesiac:
      suma += w.Kwota
  zwróć suma

5.3. Usuwanie i zapis/odczyt

Usuń():
  jeśli Zaznaczony != null:
    Wydatki.Remove(Zaznaczony)
    WidokWydatkow.Refresh()
    SumaMiesiaca = przelicz()

Zapisz():
  ścieżka = AppData\DomowyBudzetWpf\wydatki.json
  utwórz katalog jeśli nie istnieje
  json = serializuj(Wydatki)
  zapisz json do pliku

Wczytaj():
  jeśli plik istnieje:
    lista = deserializuj(json)
    Wydatki.Clear(); Wydatki.AddRange(lista)
    WidokWydatkow.Refresh()
    SumaMiesiaca = przelicz()

6. Kroki wykonania (skrót dla ucznia)

  1. Utwórz WPF App „DomowyBudzetWpf” (.NET 6/8).
  2. Dodaj foldery i pliki zgodnie z pkt 3.
  3. W MainWindow.xaml zbuduj układ.
  4. W dane.cs zdefiniuj model Wydatek z atrybutami walidacyjnymi i IDataErrorInfo.
  5. W WalidacjaBudzet.cs dodaj helper walidacji i RelayCommand.
  6. W LogikaBudzet.cs zaimplementuj: ObservableCollection<Wydatek>, formularz Nowy, filtry Rok, Miesiac, SumaMiesiaca, ICollectionView.Filter, komendy Dodaj/Usuń/Zapisz/Wczytaj, zapis/odczyt JSON, oraz subskrypcję Nowy.PropertyChanged (żeby Dodaj się uaktywniał).
  7. W MainWindow.xaml.cs ustaw DataContext = new LogikaBudzet();
  8. Uruchom i przetestuj.

7. Testy (co sprawdza egzaminator)

8. Kryteria oceniania (30 pkt)

9. Co oddać