Przejdź do treści

Modele danych

Aplikacja używa kilku klas danych Dart do reprezentowania obiektów z Part-DB i lokalnej konfiguracji.


Part

Główna klasa reprezentująca komponent elektroniczny.

class Part {
  final int id;
  final String name;
  final String partNumber;   // IPN (7-cyfrowy identyfikator)
  final String unit;         // jednostka miary (np. "pcs", "m")
  final double minAmount;    // minimalny wymagany stan
  final String description;
  final String comment;
  String category;           // nazwa kategorii (uzupełniana osobno)
  String manufacturer;       // nazwa producenta (uzupełniana osobno)
  final String tags;
  List<PartLot> partLots;    // lokalizacje magazynowe
  List<PartParameter> parameters;

  // Pola obliczane
  double get totalStock;     // suma amount z partii o znanej ilości
  bool get hasUnknownStock;  // któraś partia ma instock_unknown
  bool get isLowStock;       // minAmount > 0 && !hasUnknownStock && totalStock < minAmount
}
Pole Typ Opis
id int Identyfikator w Part-DB
name String Pełna nazwa części
partNumber String IPN (może być pusty)
unit String Jednostka miary
minAmount double Minimalny wymagany stan
description String Opis tekstowy
comment String Komentarz wewnętrzny
category String Nazwa kategorii (mutowalny, wypełniany po pobraniu)
manufacturer String Nazwa producenta (mutowalny)
tags String Tagi rozdzielone przecinkami
partLots List<PartLot> Lokalizacje z ilościami
parameters List<PartParameter> Parametry techniczne
totalStock double Obliczony: suma ilości z partLots (bez partii z instock_unknown)
hasUnknownStock bool Obliczony: co najmniej jedna partia ma nieznaną ilość
isLowStock bool Obliczony: minAmount > 0 && !hasUnknownStock && totalStock < minAmount

Note

minAmount odczytywane jest z pola API minamount. Ilości są liczbami zmiennoprzecinkowymi i nigdy nie są zaokrąglane; interfejs formatuje je funkcją formatAmount() (12, 2.5).


PartLot

Reprezentuje partię magazynową – ilość w konkretnej lokalizacji.

class PartLot {
  final int id;
  final String locationName;
  final String locationIri;
  final String description;
  String comment;
  final bool instockUnknown;
  double amount;
}
Pole Typ Opis
id int Identyfikator partii w Part-DB
locationName String Nazwa lokalizacji (szuflada, regał...)
amount double Ilość w tej lokalizacji
description String Opis partii (aplikacja go nie modyfikuje)
comment String Komentarz partii; notatki do zmian stanu dopisywane są na początku jako datowane linie
instockUnknown bool Ilość w tej lokalizacji jest nieznana

PartParameter

Pojedynczy parametr techniczny części.

class PartParameter {
  final int id;
  final String name;
  String value;               // wartość do wyświetlenia
  final String unit;
  final String? editableField; // 'value_text', 'value_typical' lub null (zakres)
  final String editableValue;  // surowa wartość pola editableField
}
Pole Typ Opis
id int Identyfikator parametru w Part-DB
name String Nazwa parametru (np. „Wartość", „Obudowa")
value String Wartość tekstowa (parsowana z kilku możliwych pól API)
unit String Jednostka (np. „Ω", „F", „V")
editableField String? Pole API, do którego aplikacja zapisuje zmianę; null dla zakresów min/max (tylko odczyt)

Parsowanie wartości

Wartość do wyświetlenia pochodzi kolejno z formatted, value_text, value_typical, a na końcu value_min … value_max. Lista części zwraca tylko nazwy parametrów; wartości pochodzą z GET /api/parts/{id}.


ApiException

Wyjątek rzucany przez ApiService przy błędzie HTTP lub parsowania.

class ApiException implements Exception {
  final int statusCode;
  final String message;
}

Używany do wyświetlania szczegółowych komunikatów błędów w UI (SnackBar).


LabelConfig

Konfiguracja parametrów etykiety Niimbot, persystowana przez SharedPreferences.

class LabelConfig {
  List<LabelParamEntry> entries;

  // Serializacja do/z JSON
  // Zapis: SharedPreferences klucz 'niimbot_label_params'
}

class LabelParamEntry {
  final String name;   // nazwa parametru
  bool enabled;        // czy drukować ten parametr
  bool bold;           // czy pogrubiony
}
Pole Typ Opis
name String Nazwa parametru (musi pasować do PartParameter.name)
enabled bool Czy parametr jest włączony na etykiecie
bold bool Czy parametr drukowany jest pogrubioną czcionką

LabelConfig implementuje logikę scalania: przy każdym otwarciu ekranu drukowania aktualna lista parametrów części jest łączona z zapisaną konfiguracją. Nowe parametry dodawane są na koniec jako włączone i niepogrubione; usunięte parametry są pomijane.


HistoryEntry

Wpis historii ostatnio oglądanych części. Przechowywany jako JSON w SharedPreferences.

class HistoryEntry {
  final int id;
  final String name;
  final String ipn;
}

Historia ograniczona jest do 20 ostatnich wpisów. Duplikaty (ten sam id) są usuwane przy dodawaniu nowego wpisu.