Der ursprüngliche 3-Schritt-Workflow (Farmer → Farm → Felder) im Registrierungs-Stepper war problematisch:
- Gekoppelte Farm- und Feldregistrierung
- Nicht flexibel genug für getrennte Arbeitsabläufe
- Registrar konnte nicht erst mehrere Farmen registrieren und später alle Felder aufzeichnen
Workflow-Trennung in 2 unabhängige Prozesse:
Widget: lib/widgets/stepper_registrar_registration.dart
- Schritt 1: Farmer-Daten (Vorname, Nachname, National-ID, Telefon)
- Schritt 2: Farm-Daten (Farm-Name, Stadt, Region)
- Erstellt Farmer (human) und Farm (farm) mit
objectState: "qcPending" - Verknüpft Farm mit Farmer via
linkedObjectRef - Speichert in Hive, signiert mit Ed25519, sync-fähig
Widget: lib/widgets/field_boundary_recorder.dart
✅ Farm-Auswahl aus Liste (Dropdown mit allen Farmen aus localStorage) ✅ "Farm erstellen" Button (öffnet StepperRegistrarRegistration in Dialog-Modus) ✅ GPS-Polygon-Aufzeichnung (via PolygonRecorderWidget) ✅ Feld-Name Eingabe (TextField mit validation) ✅ PFLICHT-Verknüpfung Farm↔Field:
field.currentGeolocation.container.UID = farmUIDfield.linkedObjectRefenthält Farm-Referenzfarm.linkedObjectRefwird mit Field-Referenz aktualisiertfarm.totalAreaHawird mit neuer Feldfläche addiert
- Registrar wählt Farm aus Dropdown (PFLICHT - kann nicht übersprungen werden)
- Optional: Neue Farm über Button erstellen (öffnet 2-Schritt-Stepper)
- Feld-Name eingeben
- GPS-Polygon aufzeichnen (Start → Punkte → Stop)
- Speichern erstellt:
- Field-Objekt mit
qcPendingStatus - Verknüpfung zur ausgewählten Farm
generateDigitalSiblingMethode mit Farm als Input, Field als Output- Farm-Update mit neuer totalAreaHa
- Field-Objekt mit
lib/widgets/field_boundary_recorder.dart(~380 Zeilen)- Farm-Dropdown mit Reload nach Erstellung
- PolygonRecorderWidget-Integration
- Pflicht-Validierung (Farm + Feld-Name)
- openRAL-konforme Field-Erstellung mit Verknüpfungen
-
lib/widgets/stepper_registrar_registration.dart- Von 3 auf 2 Schritte reduziert (Feld-Aufzeichnung entfernt)
- ~200 Zeilen Code entfernt (_buildFieldsForm, FieldData class, field creation logic)
- Fokus nur auf Farmer + Farm Registrierung
-
lib/screens/registrar_screen.dart- Neuer Quick Action Button: "Record Field Boundary" (grün, Icon: terrain)
- Methode
_openFieldBoundaryRecorder()mit GPS-Check - Import von
field_boundary_recorder.dart
// 1. Container-Relationship
field['currentGeolocation']['container']['UID'] = farmUID;
// 2. Field → Farm LinkedObject
field['linkedObjectRef'].add({
'UID': farmUID,
'RALType': 'farm',
'role': 'location',
});
// 3. Farm → Field LinkedObject (in updatedFarm)
farm['linkedObjectRef'].add({
'UID': fieldUID,
'RALType': 'field',
'role': 'parcel',
});final currentArea = getSpecificPropertyfromJSON(updatedFarm, 'totalAreaHa') ?? 0.0;
updatedFarm = setSpecificPropertyJSON(
updatedFarm,
'totalAreaHa',
currentArea + area, // area = Shoelace-Formel aus Polygon
'double'
);✅ Flexibilität: Registrar kann mehrere Farmen schnell registrieren, später alle Felder aufzeichnen
✅ Datenintegrität: Farm-Field-Verknüpfung KANN NICHT übersprungen werden (UI erzwingt Auswahl)
✅ Offline-First: Beide Workflows funktionieren ohne Internet, sync bei Verbindung
✅ QC-Workflow: Alle Objekte mit qcPending Status für spätere Validierung in registrar_qc_screen.dart
✅ GPS-Sicherheit: Beide Workflows prüfen GPS-Verfügbarkeit vor Start
- Asset Registry Integration für GeoID-Zuweisung zu Feldern
- WHISP API Integration für Deforestation Risk Scoring nach Field-Erstellung
- Batch-Import von Farmen via CSV/Excel
- Offline-Maps für Registrar-Arbeit in abgelegenen Gebieten
- Field-Edit-Funktion für Korrektur von Polygon-Grenzen
- Statistiken-Dashboard (heute registrierte Farmen/Felder)
- Compile-Fehler geprüft (keine Fehler)
- Localization-Keys validiert (alle existieren)
- Farm-Dropdown lädt Farmen aus localStorage
- GPS-Check funktioniert vor Field-Recording
- Farm-Field-Verknüpfung wird korrekt gespeichert
- Integration-Test: Farm registrieren → Field aufzeichnen → QC approven
- Test: Neue Farm während Field-Recording erstellen
- Test: Mehrere Felder für dieselbe Farm aufzeichnen (totalAreaHa addiert sich)
- Test: Offline-Sync nach Internet-Verbindung
- Öffnet App, Login als Registrar
- Quick Action: "Register Farm/Farmer" → 2-Schritt-Formular ausfüllen → Speichern
- Wiederholt Schritt 2 für mehrere Farmen (schneller Durchlauf)
- Quick Action: "Record Field Boundary" → Farm aus Liste wählen
- Feld-Name eingeben → GPS-Aufzeichnung starten
- Um Feld herumlaufen (Auto-Punkte alle 5m + manuell bei Ecken)
- Zurück zum Startpunkt → Polygon schließt automatisch → Fläche anzeigen → Speichern
- Nächstes Feld für dieselbe oder andere Farm aufzeichnen
- Bei Internet-Verbindung: Automatischer Sync zu Firebase/Cloud
- Login als Registrar (oder dedizierte QC-Rolle)
- Quick Action: "Review Pending Registrations"
- Filter: "Fields only" oder "All"
- Aufklappbare Karten mit Details (Name, Farm, Fläche, Recorder, Timestamp)
- Approve: Notizen eingeben → Status → qcApproved
- Reject: Ablehnungsgrund → Status → qcRejected
- Alle Änderungen digitally signed, synced to cloud