# Herkunft und Freigabe

> Jeder Wert behält Quelle, Urheber, Zeitpunkt und Nachweise und wird abgelöst statt überschrieben; deklarierte Daten werden geprüft, bevor sie in einen Pass gelangen, von einer zweiten Person, wenn die Organisation das Vier-Augen-Prinzip nutzt.

Ein Pass ist nur so vertrauenswürdig wie seine Werte. BatteryPass hält deshalb fest, woher jeder Wert stammt, wer
ihn erfasst und freigegeben hat und welche Dokumente ihn belegen, und es bewahrt jeden früheren Stand auf.

## Ein Wert ist eine Revision

Jeder Wert wird als Revision gespeichert (`FieldValue`). Die API liefert diese Felder:

| Feld                                                         | Bedeutung                                                                               |
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
| `value`, `unit`                                              | Der Wert als JSON und seine Maßeinheit; `value` ist `null`, wenn das Feld geleert wurde |
| `revision`                                                   | 1, 2, 3 … je Feld und Ziel (Modellversion oder Einheit)                                 |
| `source`                                                     | Woher der Wert stammt, siehe unten                                                      |
| `recorded_by`, `recorded_at`                                 | Wer diese Revision erfasst hat und wann                                                 |
| `responsible`                                                | Das für den Wert verantwortliche Mitglied                                               |
| `review_status`, `reviewed_by`, `reviewed_at`, `review_note` | Die Prüfentscheidung                                                                    |
| `evidence[]`                                                 | Die Dokumente, auf denen diese Revision beruht (Art, Titel, Zugriffsstufe, Revision)    |
| `checks[]`                                                   | Ergebnisse der automatischen Prüfungen: `pass`, `warn` oder `fail` mit einer Meldung    |
| `measured_at`                                                | Bei Zustandsdaten: wann der Wert gemessen wurde                                         |
| `superseded_at`                                              | Wann eine neuere Revision diese abgelöst hat                                            |
| `registry_version`                                           | Die Registerversion, unter der der Wert erfasst wurde                                   |

| `source`   | Bedeutung                                                                                       |
| ---------- | ----------------------------------------------------------------------------------------------- |
| `manual`   | Ein Mitglied hat ihn im Portal eingegeben                                                       |
| `import`   | Er stammt aus einem Tabellenimport                                                              |
| `supplier` | Ein Lieferant hat ihn über einen Anfragelink gesendet, oder ein Servicepartner hat ihn gemeldet |
| `api`      | Ein API-Schlüssel hat ihn gemeldet (nur Zustandsdaten)                                          |
| `system`   | BatteryPass hat ihn geschrieben                                                                 |

## Werte werden abgelöst, nie überschrieben

Eine Änderung bearbeitet nie einen gespeicherten Wert. Sie fügt eine neue Revision ein und markiert die
vorherige als abgelöst; so bleibt die ganze Historie erhalten, einschließlich wer was wann geändert hat. Auch eine
Prüfentscheidung ist eine Revision: Die Freigabe fügt eine Revision mit demselben Wert und dem Prüfer ein.

| Operation                                                                                                                                                                                                                                                                                | Liefert                                                                  |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [`listModelVersionValues`](https://passport.kabin.sh/docs/de/api-reference/values/list-model-version-values), [`listBatteryValues`](https://passport.kabin.sh/docs/de/api-reference/values/list-battery-values)                                                                      | Die aktuelle Revision jedes Felds einer Modellversion oder Einheit       |
| [`listModelVersionValueHistory`](https://passport.kabin.sh/docs/de/api-reference/values/list-model-version-value-history), [`listBatteryValueHistory`](https://passport.kabin.sh/docs/de/api-reference/values/list-battery-value-history)                                            | Alle Revisionen eines Felds, die neueste zuerst                          |
| [`listEvidence`](https://passport.kabin.sh/docs/de/api-reference/evidence/list-evidence), [`getEvidence`](https://passport.kabin.sh/docs/de/api-reference/evidence/get-evidence), [`downloadEvidence`](https://passport.kabin.sh/docs/de/api-reference/evidence/download-evidence) | Die Dokumente, ihre Revisionen, wo sie verwendet werden, und die Dateien |

```bash title="cURL"
curl -s "$BATTERYPASS_URL/api/v1/model-versions/$VERSION_ID/values/performance.nominal_voltage/history" \
  -H "Authorization: Bearer $BATTERYPASS_API_KEY" \
  | jq '.items[] | {revision, value, source, review_status, reviewed_at}'
```

Dokumente sind auf dieselbe Weise versioniert: Eine neue Revision eines Dokuments löst die alte ab, und ein Wert,
der auf einem abgelösten Dokument beruht, wird durch eine fehlgeschlagene Prüfung markiert.

## Prüfstatus

| `review_status` | Bedeutung                                                                               |
| --------------- | --------------------------------------------------------------------------------------- |
| `captured`      | Erfasst; eine automatische Prüfung ist fehlgeschlagen oder noch nicht bestanden         |
| `auto_checked`  | Die automatischen Prüfungen sind bestanden; wartet auf einen Prüfer                     |
| `approved`      | Von einem Prüfer freigegeben; nur freigegebene Werte gelangen in eine Passversion       |
| `rejected`      | Von einem Prüfer mit einer Notiz abgelehnt; das verantwortliche Mitglied korrigiert ihn |

Die Freigabe erteilt ein Prüfer (Rolle `reviewer`, `admin` oder `owner`) im Portal. Sie wird verweigert, solange

- eine Prüfung des Werts fehlschlägt,
- das Register für das Feld einen Nachweis verlangt und kein aktuelles Dokument den Wert belegt, oder
- der Prüfer den Wert selbst erfasst hat und in der Organisation das Vier-Augen-Prinzip gilt (Standard).

Die Werte eines Tabellenimports lassen sich in einem Schritt je Import freigeben, für jeden Wert nach denselben
Regeln. Werte, die eine dieser Regeln zurückhält, bleiben für die Einzelprüfung offen.

> [!NOTE]
> Zustandsdaten sind die Ausnahme: Als Messwerte gemeldete Werte werden ohne Prüfer angenommen und als `approved`
> mit ihrem `measured_at` gespeichert. Siehe [Zustandsdaten und Lebenszyklus](https://passport.kabin.sh/docs/de/concepts/condition-and-lifecycle).

## Warum API-Schlüssel nicht freigeben oder veröffentlichen

Ein API-Schlüssel gehört der Organisation, nicht einer Person. Das Vier-Augen-Prinzip vergleicht den Urheber
eines Werts mit seinem Prüfer, und eine Veröffentlichung braucht einen Prüfer, der dafür einsteht. Ein Schlüssel,
hinter dem niemand steht, könnte an beidem nicht teilnehmen, ohne es zu schwächen. Deshalb schreiben Schlüssel nie
deklarierte Daten, geben keine Werte frei und veröffentlichen oder ziehen keine Pässe zurück. Sie lesen, und mit
dem Scope `condition` melden sie Messwerte und Lebenszyklus-Ereignisse, die `source` `api` tragen; das
Lebenszyklus-Ereignis jeder Meldung nennt den Schlüssel in `api_key`.

Deklarierte Daten kommen über das Portal, Lieferantenanfragen oder den Tabellenimport zu BatteryPass und werden
von Mitgliedern freigegeben.

Mit dem Scope `import` stellt ein Schlüssel einen Tabellenimport bereit: hochladen, zuordnen, prüfen. Übernehmen
und die importierten Werte freigeben können nur Mitglieder im Portal, sodass auch Daten aus einem ERP erst durch
die Entscheidung eines Mitglieds zu deklarierten Daten werden (ADR-026). Siehe
[Einheiten aus der Fertigung](https://passport.kabin.sh/docs/de/integrations/workflows/units-from-production).

## Vollständigkeit

[`getModelVersionCompleteness`](https://passport.kabin.sh/docs/de/api-reference/values/get-model-version-completeness) und
[`getBatteryCompleteness`](https://passport.kabin.sh/docs/de/api-reference/values/get-battery-completeness) werten das Register für eine
Modellversion oder Einheit aus und geben jedem Feld einen Status `display`:

| `display`                 | Bedeutung                                                                        |
| ------------------------- | -------------------------------------------------------------------------------- |
| `required_missing`        | Jetzt Pflicht, kein aktueller freigegebener Wert; blockiert die Veröffentlichung |
| `required_pending_review` | Ein Wert existiert, ist aber nicht freigegeben; blockiert die Veröffentlichung   |
| `ok`                      | Ein freigegebener Wert liegt vor                                                 |
| `not_applicable`          | Als nicht zutreffend markiert, mit gespeicherter Begründung                      |
| `later_required`          | Die Pflicht beginnt später oder ist noch nicht ausgelöst                         |
| `optional_missing`        | Optional und leer                                                                |

Einen Prozentwert gibt es bewusst nicht. `summary` zählt die Status, und `summary.blocking` ist die Zahl der
Felder, die die Veröffentlichung noch blockieren.
