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

Założenia


1. Cel aplikacji

Napisz aplikację WPF „SerwisIphoneWpf”, która pozwala:

2. Wymagania funkcjonalne

Formularz „Nowe zlecenie”:

Lista (DataGrid) kolumny:

Filtry:

Akcje:

Walidacja „na żywo” (czerwone obramowanie WPF):

3. Struktura projektu i nazewnictwo

SerwisIphoneWpf
├─ MainWindow.xaml
├─ MainWindow.xaml.cs
├─ Modele
│  └─ dane.cs                 // ZlecenieSerwisowe + walidacja (IDataErrorInfo)
├─ Walidacja
│  └─ WalidacjaSerwis.cs      // RelayCommand + helper walidacji
└─ Logika
   └─ LogikaSerwis.cs         // kolekcje/binding/filtrowanie/suma/zapis-odczyt

Nowe elementy:

4. Interfejs – rozmieszczenie

Interfejs – opis rozmieszczenia

Główna siatka
4 wiersze: Auto, Auto, *, Auto i 2 kolumny: *, *.
Sekcje: GroupBox „Nowe zlecenie”, pasek filtrów i sumy, DataGrid, pasek akcji.

Sekcja „Nowe zlecenie” (GroupBox)
Grid wewnętrzny 3 wiersze (Auto) × 4 kolumny (2*, 2*, *, *). Pola:

  1. Klient
    TextBlock "Klient"
    TextBox x:Name="tbKlient"Text="{Binding Nowe.Klient, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
    ToolTip: pierwszy komunikat z (Validation.Errors)[0].ErrorContent
  2. Model
    TextBlock "Model"
    ComboBox x:Name="cbModel"
    ItemsSource="{Binding Modele}"
    SelectedItem="{Binding Nowe.Model, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
  3. IMEI / SN
    TextBlock "IMEI / SN"
    TextBox x:Name="tbImei" → binding jak wyżej
  4. Koszt (PLN)
    TextBlock "Koszt (PLN)"
    TextBox x:Name="tbKoszt"Text="{Binding Nowe.Koszt, ...}"
  5. Opis usterki
    TextBlock "Opis usterki"
    TextBox x:Name="tbOpis" AcceptsReturn="True" Height="80"Text="{Binding Nowe.OpisUsterki, ...}"
  6. Status
    TextBlock "Status"
    ComboBox x:Name="cbStatus"
    ItemsSource="{Binding Statusy}"
    SelectedItem="{Binding Nowe.Status, ...}"
  7. Opłacone
    CheckBox x:Name="chkOplacone"IsChecked="{Binding Nowe.CzyOplacone}"
  8. Daty
    DatePicker x:Name="dpPrzyjecie"SelectedDate="{Binding Nowe.DataPrzyjecia, ...}"
    DatePicker x:Name="dpTermin"SelectedDate="{Binding Nowe.TerminDo, ...}"
    DatePicker x:Name="dpZakonczenie"SelectedDate="{Binding Nowe.DataZakonczenia}" (opcjonalnie)

Przycisk
Button x:Name="btnDodaj" Content="Dodaj"
Command="{Binding DodajCmd}"
Aktywność przez RelayCommand.CanExecute (uaktualniane na Nowe.PropertyChanged)

Pasek filtrów i sumy
StackPanel (poziomy):

Lista zleceń
DataGrid x:Name="dgZlecenia"
ItemsSource="{Binding WidokZlecen}"
SelectedItem="{Binding Zaznaczone}"
Kolumny:

Pasek akcji (dół)
Po prawej:
btnUsunCommand="{Binding UsunCmd}"
btnGotoweCommand="{Binding OznaczGotoweCmd}"
btnOplaconeCommand="{Binding OznaczOplaconeCmd}"

Dodatkowe elementy „niewizualne”

MessageBox do komunikatów zapisu/odczytu Globalny styl walidacji dla TextBox, ComboBox, DatePicker (czerwony obrys i tooltip)

ICollectionView.Filter w LogikaSerwis steruje widokiem listy

5. Logika filtrowania i sumy (pseudokod)

Filtr(z):
  okRokMies = (Rok==0 || Miesiac==0) ? true
              : (z.DataPrzyjecia.Year==Rok || z.DataZakonczenia?.Year==Rok)
                && (z.DataPrzyjecia.Month==Miesiac || z.DataZakonczenia?.Month==Miesiac)
  okStatus = (WybranyStatus==Wszystkie) || (z.Status==WybranyStatus)
  return okRokMies && okStatus

PrzeliczSume():
  suma = 0
  dla z w Zlecenia:
    jeśli z.DataZakonczenia ma wartość
       i z.DataZakonczenia.Year == Rok
       i z.DataZakonczenia.Month == Miesiac:
         suma += z.Koszt
  zwróć suma

6. Kroki wykonania (dla ucznia)

  1. Utwórz projekt „SerwisIphoneWpf” (.NET 6/8, WPF App).
  2. Dodaj foldery i pliki jak w pkt 3.
  3. W MainWindow.xaml zbuduj layout z bindingami jak niżej.
  4. W Models/dane.cs zdefiniuj ZlecenieSerwisowe + IDataErrorInfo.
  5. W Walidacja/WalidacjaSerwis.cs dodaj RelayCommand.
  6. W Logika/LogikaSerwis.cs zaimplementuj kolekcję, widok, filtry, sumę i komendy.
  7. W MainWindow.xaml.cs ustaw DataContext = new LogikaSerwis();
  8. Uruchom i sprawdź: dodawanie, filtry, suma, zapis/odczyt, akcje.

7. Testy (co sprawdzi egzaminator)

8. Kryteria oceniania (30 pkt)