{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://partuvo.example/schemas/partuvo-import/v1.schema.json",
  "title": "Partuvo-Importformat Version 1",
  "description": "Gemeinsames normalisiertes Modell für JSON-Dateien und CSV-Bündel. Der Betrieb ergibt sich serverseitig aus der Sitzung; Quellkennungen sind keine Berechtigungen. Referenzen zwischen Datensätzen verwenden externalId derselben Quelle oder partuvo:<id>.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "format",
    "version",
    "batch",
    "entities"
  ],
  "properties": {
    "format": {
      "const": "partuvo-import"
    },
    "version": {
      "const": 1,
      "description": "Gepinnte Formatversion; unbekannte Versionen werden abgewiesen."
    },
    "batch": {
      "type": "object",
      "description": "Stapelmetadaten: Quellsystem, Quellkonto, Modus, Zeitzone, Währung und Preisbasis.",
      "additionalProperties": false,
      "required": [
        "id",
        "createdAt",
        "mode",
        "sourceSystem",
        "timezone",
        "currency",
        "priceBasis"
      ],
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "pattern": "^[A-Za-z0-9._:-]{1,100}$",
          "description": "Eindeutige Batchkennung (UUID empfohlen); wiederholte Übergabe derselben Kennung ist eine Wiederholung."
        },
        "createdAt": {
          "type": "string",
          "format": "date-time",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
          "description": "Erstellzeitpunkt der Datei."
        },
        "mode": {
          "type": "string",
          "enum": [
            "master_data",
            "opening_balance",
            "historical",
            "operative"
          ],
          "description": "Importmodus."
        },
        "sourceSystem": {
          "type": "string",
          "maxLength": 300,
          "minLength": 1,
          "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$",
          "description": "Quellsystem als Kurzname, z. B. opisto, 3xkern, manual."
        },
        "sourceAccount": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 80,
              "description": "Quellkonto/Mandant/Filiale im Quellsystem; leer entspricht bei Verkäufen dem Konto default."
            },
            {
              "type": "null"
            }
          ]
        },
        "timezone": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1,
          "pattern": "\\S",
          "description": "IANA-Zeitzone der Quelldaten für Betriebstage; Zeitstempel selbst sind UTC."
        },
        "currency": {
          "type": "string",
          "maxLength": 300,
          "minLength": 1,
          "pattern": "^[A-Z]{3}$",
          "enum": [
            "EUR"
          ],
          "description": "ISO-4217-Währung aller Cent-Beträge; derzeit nur EUR."
        },
        "priceBasis": {
          "type": "string",
          "enum": [
            "net"
          ],
          "description": "Bedeutung der Preise; derzeit nur net (Netto ohne Steuer)."
        },
        "description": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 1000,
              "description": "Freie Beschreibung des Stapels."
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "entities": {
      "type": "object",
      "additionalProperties": false,
      "description": "Entitätslisten in Abhängigkeitsreihenfolge partners → vehicles → locations → storage_rules → parts → stocks → sales → sale_lines. Welche Listen erlaubt sind, bestimmt batch.mode.",
      "properties": {
        "partners": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/partners"
          },
          "description": "Kunden und Lieferanten"
        },
        "vehicles": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/vehicles"
          },
          "description": "Fahrzeuge"
        },
        "locations": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/locations"
          },
          "description": "Lager, Bereiche, Plätze und Behälter"
        },
        "storage_rules": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/storage_rules"
          },
          "description": "Platzregeln"
        },
        "parts": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/parts"
          },
          "description": "Teile und Fahrzeugzuordnung"
        },
        "stocks": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/stocks"
          },
          "description": "Anfangsbestände und Platzierungen"
        },
        "sales": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/sales"
          },
          "description": "Verkäufe"
        },
        "sale_lines": {
          "type": "array",
          "maxItems": 100000,
          "items": {
            "$ref": "#/$defs/sale_lines"
          },
          "description": "Verkaufspositionen"
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "required": [
          "batch"
        ],
        "properties": {
          "batch": {
            "required": [
              "mode"
            ],
            "properties": {
              "mode": {
                "const": "master_data"
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "entities": {
            "properties": {
              "stocks": {
                "maxItems": 0
              },
              "sales": {
                "maxItems": 0
              },
              "sale_lines": {
                "maxItems": 0
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "batch"
        ],
        "properties": {
          "batch": {
            "required": [
              "mode"
            ],
            "properties": {
              "mode": {
                "const": "opening_balance"
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "entities": {
            "properties": {
              "sales": {
                "maxItems": 0
              },
              "sale_lines": {
                "maxItems": 0
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "batch"
        ],
        "properties": {
          "batch": {
            "required": [
              "mode"
            ],
            "properties": {
              "mode": {
                "const": "historical"
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "entities": {
            "properties": {}
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "batch"
        ],
        "properties": {
          "batch": {
            "required": [
              "mode"
            ],
            "properties": {
              "mode": {
                "const": "operative"
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "entities": {
            "properties": {
              "partners": {
                "maxItems": 0
              },
              "vehicles": {
                "maxItems": 0
              },
              "locations": {
                "maxItems": 0
              },
              "storage_rules": {
                "maxItems": 0
              },
              "parts": {
                "maxItems": 0
              },
              "stocks": {
                "maxItems": 0
              },
              "sales": {
                "items": {
                  "properties": {
                    "status": {
                      "enum": [
                        "draft",
                        "confirmed"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  ],
  "$defs": {
    "partners": {
      "type": "object",
      "description": "Kunden und Lieferanten → records.partners (partners.create)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "name",
        "roles"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Name oder Firma."
        },
        "roles": {
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "enum": [
              "customer",
              "supplier"
            ]
          },
          "description": "Rollen customer und/oder supplier."
        },
        "email": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 254,
              "description": "E-Mail; dient niemals allein zur Zusammenführung von Kontakten."
            },
            {
              "type": "null"
            }
          ]
        },
        "phone": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 80,
              "description": "Telefon."
            },
            {
              "type": "null"
            }
          ]
        },
        "address": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 1000,
              "description": "Postanschrift, mehrzeilig erlaubt."
            },
            {
              "type": "null"
            }
          ]
        },
        "vatId": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 80,
              "description": "USt-IdNr."
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 2000,
              "description": "Interne Notizen; erscheinen nie auf Belegen."
            },
            {
              "type": "null"
            }
          ]
        },
        "active": {
          "oneOf": [
            {
              "type": "boolean",
              "default": true,
              "description": "false archiviert den Kontakt nach der Anlage."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "vehicles": {
      "type": "object",
      "description": "Fahrzeuge → records.vehicles (vehicles.create, Status direkt)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "reference",
        "make",
        "model"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "reference": {
          "type": "string",
          "maxLength": 80,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Betriebsinterne Fahrzeugreferenz; eindeutig im Betrieb (ohne Groß-/Kleinschreibung)."
        },
        "vin": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 17,
              "pattern": "^[A-HJ-NPR-Za-hj-npr-z0-9]{17}$",
              "description": "17-stellige FIN ohne I, O, Q; eindeutig im Betrieb."
            },
            {
              "type": "null"
            }
          ]
        },
        "historicalChassisNumber": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Historische Fahrgestellnummer, falls keine FIN vorliegt."
            },
            {
              "type": "null"
            }
          ]
        },
        "make": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Hersteller."
        },
        "model": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Modell."
        },
        "modelCode": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Typcode."
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "received",
                "dismantling",
                "closed"
              ],
              "default": "received",
              "description": "Fahrzeugstatus received, dismantling oder closed."
            },
            {
              "type": "null"
            }
          ]
        },
        "supplierRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "partners",
              "description": "externalId eines Kontakts mit Rolle supplier. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "registration": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 80,
              "description": "Kennzeichen."
            },
            {
              "type": "null"
            }
          ]
        },
        "year": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1886,
              "maximum": 9999,
              "description": "Baujahr."
            },
            {
              "type": "null"
            }
          ]
        },
        "firstRegistration": {
          "oneOf": [
            {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "Erstzulassung."
            },
            {
              "type": "null"
            }
          ]
        },
        "productionDate": {
          "oneOf": [
            {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "Produktionsdatum."
            },
            {
              "type": "null"
            }
          ]
        },
        "modelYear": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1886,
              "maximum": 9999,
              "description": "Modelljahr."
            },
            {
              "type": "null"
            }
          ]
        },
        "hsn": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 300,
              "pattern": "^\\d{4}$",
              "description": "Herstellerschlüsselnummer, vier Ziffern als Text."
            },
            {
              "type": "null"
            }
          ]
        },
        "tsn": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 300,
              "pattern": "^[A-Z0-9]{3,10}$",
              "description": "Typschlüsselnummer, 3–10 Großbuchstaben/Ziffern."
            },
            {
              "type": "null"
            }
          ]
        },
        "fuel": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Kraftstoff."
            },
            {
              "type": "null"
            }
          ]
        },
        "powerKw": {
          "oneOf": [
            {
              "type": [
                "string",
                "number"
              ],
              "pattern": "^\\d{1,6}(?:\\.\\d{1,3})?$",
              "x-unit": "kW",
              "description": "Leistung in kW; Dezimaltext mit Punkt, bis drei Nachkommastellen."
            },
            {
              "type": "null"
            }
          ]
        },
        "displacementCc": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "x-unit": "cm3",
              "description": "Hubraum in cm³."
            },
            {
              "type": "null"
            }
          ]
        },
        "mileage": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "x-unit": "km",
              "description": "Kilometerstand in km."
            },
            {
              "type": "null"
            }
          ]
        },
        "purchasePriceCents": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "x-unit": "cent",
              "description": "Einkaufspreis in Cent (Batchwährung)."
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 2000,
              "description": "Notizen."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "locations": {
      "type": "object",
      "description": "Lager, Bereiche, Plätze und Behälter → locations (locations.create)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "label",
        "kind"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "label": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Bezeichnung des Lagerorts."
        },
        "kind": {
          "type": "string",
          "enum": [
            "site",
            "warehouse",
            "zone",
            "bin",
            "vehicle",
            "vehicle_area",
            "container"
          ],
          "description": "site (Standort), warehouse (Lager), zone (Bereich/Regal), bin (Fach/Platz), vehicle (Fahrzeugstellplatz, eingebaut möglich), vehicle_area (Bereich ausgebauter Fahrzeugteile), container (Kiste)."
        },
        "parentRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "locations",
              "description": "externalId des übergeordneten Lagerorts; leer für Wurzeln. Kisten sind nie Eltern. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "vehicleRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "vehicles",
              "description": "externalId des Fahrzeugs; Pflicht für vehicle, vehicle_area und Fahrzeugkisten, sonst verboten. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "level": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "area",
                "shelf",
                "parking"
              ],
              "description": "Optionale Ebene: area (Bereich), shelf (Regal), parking (Stellplatz)."
            },
            {
              "type": "null"
            }
          ]
        },
        "external": {
          "oneOf": [
            {
              "type": "boolean",
              "default": false,
              "description": "true kennzeichnet ein Außenlager; gilt für alle Unterorte."
            },
            {
              "type": "null"
            }
          ]
        },
        "containerMode": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "vehicle",
                "mixed"
              ],
              "description": "Nur für Kisten: vehicle (fahrzeuggebunden) oder mixed (gemischt, ohne Fahrzeugbezug)."
            },
            {
              "type": "null"
            }
          ]
        },
        "active": {
          "oneOf": [
            {
              "type": "boolean",
              "default": true,
              "description": "false sperrt den Ort für neue Einlagerungen."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "storage_rules": {
      "type": "object",
      "description": "Platzregeln → storage_rules (locations.saveRule, admin:manage)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "label",
        "strategy",
        "reason"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "label": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Regelbezeichnung."
        },
        "strategy": {
          "type": "string",
          "enum": [
            "part_category",
            "vehicle_area",
            "dynamic_slot",
            "hybrid_vehicle_container"
          ],
          "description": "part_category, vehicle_area, dynamic_slot oder hybrid_vehicle_container."
        },
        "scopeLocationRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "locations",
              "description": "Geltungsbereich; leer bedeutet gesamter Betrieb. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "category": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Teilegruppe; leer bedeutet alle Gruppen."
            },
            {
              "type": "null"
            }
          ]
        },
        "allowedLocationRefs": {
          "oneOf": [
            {
              "type": "array",
              "maxItems": 100,
              "uniqueItems": true,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300
              },
              "description": "Erlaubte Zielorte einschließlich Unterorte; leer bedeutet keine Einschränkung."
            },
            {
              "type": "null"
            }
          ]
        },
        "active": {
          "oneOf": [
            {
              "type": "boolean",
              "default": true,
              "description": "Regel aktiv."
            },
            {
              "type": "null"
            }
          ]
        },
        "reason": {
          "type": "string",
          "maxLength": 500,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Begründung der Vorgabe (wird im Nachweis gespeichert)."
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "parts": {
      "type": "object",
      "description": "Teile und Fahrzeugzuordnung → records.parts (inventory.create mit initialStock aus stocks)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "sku",
        "name",
        "condition"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "sku": {
          "type": "string",
          "maxLength": 80,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Artikelnummer; eindeutig im Betrieb (ohne Groß-/Kleinschreibung)."
        },
        "name": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "pattern": "\\S",
          "description": "Bezeichnung."
        },
        "vehicleRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "vehicles",
              "description": "externalId des Herkunftsfahrzeugs; leer für Handelsware. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "condition": {
          "type": "string",
          "enum": [
            "used",
            "new",
            "refurbished"
          ],
          "description": "used, new oder refurbished."
        },
        "locationText": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 120,
              "description": "Freitext-Lagerort (V2-Feld). Pflicht, wenn keine Platzierung in stocks vorliegt."
            },
            {
              "type": "null"
            }
          ]
        },
        "oemNumbers": {
          "oneOf": [
            {
              "type": "array",
              "maxItems": 20,
              "uniqueItems": true,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "description": "OE-Nummern, höchstens 20."
            },
            {
              "type": "null"
            }
          ]
        },
        "category": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Teilegruppe für Platzregeln, z. B. Sensoren oder Motoren."
            },
            {
              "type": "null"
            }
          ]
        },
        "brand": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Marke."
            },
            {
              "type": "null"
            }
          ]
        },
        "salePriceCents": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "x-unit": "cent",
              "description": "Nettoverkaufspreis in Cent."
            },
            {
              "type": "null"
            }
          ]
        },
        "costPriceCents": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "x-unit": "cent",
              "description": "Einstandspreis in Cent."
            },
            {
              "type": "null"
            }
          ]
        },
        "minimumStock": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "description": "Mindestbestand."
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 2000,
              "description": "Notizen."
            },
            {
              "type": "null"
            }
          ]
        },
        "active": {
          "oneOf": [
            {
              "type": "boolean",
              "default": true,
              "description": "false archiviert das Teil nach der Anlage."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "stocks": {
      "type": "object",
      "description": "Anfangsbestände und Platzierungen → parts.stock (initialStock) und part_placements (locations.move)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "partRef",
        "quantity"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "partRef": {
          "type": "string",
          "minLength": 1,
          "maxLength": 300,
          "pattern": "^(?!partuvo:$).*\\S.*$",
          "x-references": "parts",
          "description": "externalId des Teils. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
        },
        "quantity": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1000000,
          "x-unit": "piece",
          "description": "Gezählte Menge dieses Loses (ganze Stückzahl)."
        },
        "locationRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "locations",
              "description": "Lagerort oder Kiste des Loses; leer bedeutet nicht zugeordnete Menge. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "physicalState": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "installed",
                "removed",
                "quarantine"
              ],
              "default": "removed",
              "description": "installed (noch im Fahrzeug, nur an Orten der Art vehicle), removed (ausgebaut, Standard) oder quarantine."
            },
            {
              "type": "null"
            }
          ]
        },
        "countedAt": {
          "oneOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
              "description": "Zeitpunkt der Zählung."
            },
            {
              "type": "null"
            }
          ]
        },
        "overrideReason": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Begründung, wenn der Platz einer aktiven Platzregel widerspricht; ohne Begründung wird das Los abgewiesen."
            },
            {
              "type": "null"
            }
          ]
        },
        "note": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 500,
              "description": "Hinweis zur Zählung."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "sales": {
      "type": "object",
      "description": "Verkäufe → records.sales (historisch: Übernahmeadapter ohne Abgang; operativ: sales.create/confirm)",
      "additionalProperties": false,
      "required": [
        "externalId",
        "status",
        "createdAt"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "customerRef": {
          "oneOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "^(?!partuvo:$).*\\S.*$",
              "x-references": "partners",
              "description": "externalId eines Kontakts mit Rolle customer; leer für Barverkauf mit customerName. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
            },
            {
              "type": "null"
            }
          ]
        },
        "customerName": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 160,
              "description": "Kundenname auf dem Beleg; Pflicht ohne customerRef."
            },
            {
              "type": "null"
            }
          ]
        },
        "shippingAddress": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 1000,
              "description": "Lieferadresse."
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "type": "string",
          "enum": [
            "draft",
            "confirmed",
            "shipped",
            "cancelled"
          ],
          "description": "draft, confirmed, shipped oder cancelled (operativ nur draft/confirmed)."
        },
        "createdAt": {
          "type": "string",
          "format": "date-time",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
          "description": "Anlagezeitpunkt des Auftrags."
        },
        "confirmedAt": {
          "oneOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
              "description": "Bestätigung; Pflicht bei confirmed und shipped."
            },
            {
              "type": "null"
            }
          ]
        },
        "shippedAt": {
          "oneOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
              "description": "Versand; Pflicht bei shipped."
            },
            {
              "type": "null"
            }
          ]
        },
        "carrier": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 120,
              "description": "Versanddienstleister; Pflicht bei shipped."
            },
            {
              "type": "null"
            }
          ]
        },
        "trackingNumber": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 200,
              "description": "Sendungsnummer."
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelledAt": {
          "oneOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
              "description": "Storno; Pflicht bei cancelled."
            },
            {
              "type": "null"
            }
          ]
        },
        "cancelReason": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 200,
              "description": "Stornogrund; Pflicht bei cancelled."
            },
            {
              "type": "null"
            }
          ]
        },
        "totalCents": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "x-unit": "cent",
              "description": "Nettosumme in Cent; muss der Positionssumme entsprechen."
            },
            {
              "type": "null"
            }
          ]
        },
        "currency": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 300,
              "pattern": "^[A-Z]{3}$",
              "enum": [
                "EUR"
              ],
              "description": "ISO-4217-Code; muss der Batchwährung entsprechen."
            },
            {
              "type": "null"
            }
          ]
        },
        "channelProvider": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 300,
              "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$",
              "description": "Marktplatz-/Kanaladapter, z. B. gobecom; verlangt channelAccount und channelOrderId."
            },
            {
              "type": "null"
            }
          ]
        },
        "channelAccount": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 80,
              "description": "Verkäufername im Kanal (bei gobecom der eBay-Verkäufername, nicht die interne Konto-ID)."
            },
            {
              "type": "null"
            }
          ]
        },
        "channelOrderId": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Bestellnummer im Kanal; Registry-Schlüssel gemeinsam mit gobecomAPI."
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 2000,
              "description": "Notizen."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        },
        {
          "anyOf": [
            {
              "required": [
                "customerRef"
              ],
              "properties": {
                "customerRef": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300,
                  "pattern": "^(?!partuvo:$).*\\S.*$",
                  "x-references": "partners",
                  "description": "externalId eines Kontakts mit Rolle customer; leer für Barverkauf mit customerName. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
                }
              }
            },
            {
              "required": [
                "customerName"
              ],
              "properties": {
                "customerName": {
                  "type": "string",
                  "maxLength": 160,
                  "minLength": 1,
                  "pattern": "\\S",
                  "description": "Kundenname auf dem Beleg; Pflicht ohne customerRef."
                }
              }
            }
          ]
        },
        {
          "if": {
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "enum": [
                  "confirmed",
                  "shipped"
                ]
              }
            }
          },
          "then": {
            "required": [
              "confirmedAt"
            ],
            "properties": {
              "confirmedAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
                "description": "Bestätigung; Pflicht bei confirmed und shipped."
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "enum": [
                  "shipped"
                ]
              }
            }
          },
          "then": {
            "required": [
              "shippedAt",
              "carrier"
            ],
            "properties": {
              "shippedAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
                "description": "Versand; Pflicht bei shipped."
              },
              "carrier": {
                "type": "string",
                "maxLength": 120,
                "minLength": 1,
                "pattern": "\\S",
                "description": "Versanddienstleister; Pflicht bei shipped."
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "enum": [
                  "cancelled"
                ]
              }
            }
          },
          "then": {
            "required": [
              "cancelledAt",
              "cancelReason"
            ],
            "properties": {
              "cancelledAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$",
                "description": "Storno; Pflicht bei cancelled."
              },
              "cancelReason": {
                "type": "string",
                "maxLength": 200,
                "minLength": 1,
                "pattern": "\\S",
                "description": "Stornogrund; Pflicht bei cancelled."
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "enum": [
                  "draft"
                ]
              }
            }
          },
          "then": {
            "properties": {
              "confirmedAt": {
                "type": "null"
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "enum": [
                  "draft",
                  "confirmed",
                  "cancelled"
                ]
              }
            }
          },
          "then": {
            "properties": {
              "shippedAt": {
                "type": "null"
              }
            }
          }
        },
        {
          "if": {
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "enum": [
                  "draft",
                  "confirmed",
                  "shipped"
                ]
              }
            }
          },
          "then": {
            "properties": {
              "cancelledAt": {
                "type": "null"
              },
              "cancelReason": {
                "type": "null"
              }
            }
          }
        },
        {
          "if": {
            "anyOf": [
              {
                "required": [
                  "channelProvider"
                ],
                "properties": {
                  "channelProvider": {
                    "type": "string",
                    "maxLength": 300,
                    "minLength": 1,
                    "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$",
                    "description": "Marktplatz-/Kanaladapter, z. B. gobecom; verlangt channelAccount und channelOrderId."
                  }
                }
              },
              {
                "required": [
                  "channelAccount"
                ],
                "properties": {
                  "channelAccount": {
                    "type": "string",
                    "maxLength": 80,
                    "minLength": 1,
                    "pattern": "\\S",
                    "description": "Verkäufername im Kanal (bei gobecom der eBay-Verkäufername, nicht die interne Konto-ID)."
                  }
                }
              },
              {
                "required": [
                  "channelOrderId"
                ],
                "properties": {
                  "channelOrderId": {
                    "type": "string",
                    "maxLength": 100,
                    "minLength": 1,
                    "pattern": "\\S",
                    "description": "Bestellnummer im Kanal; Registry-Schlüssel gemeinsam mit gobecomAPI."
                  }
                }
              }
            ]
          },
          "then": {
            "required": [
              "channelProvider",
              "channelAccount",
              "channelOrderId"
            ],
            "properties": {
              "channelProvider": {
                "type": "string",
                "maxLength": 300,
                "minLength": 1,
                "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$",
                "description": "Marktplatz-/Kanaladapter, z. B. gobecom; verlangt channelAccount und channelOrderId."
              },
              "channelAccount": {
                "type": "string",
                "maxLength": 80,
                "minLength": 1,
                "pattern": "\\S",
                "description": "Verkäufername im Kanal (bei gobecom der eBay-Verkäufername, nicht die interne Konto-ID)."
              },
              "channelOrderId": {
                "type": "string",
                "maxLength": 100,
                "minLength": 1,
                "pattern": "\\S",
                "description": "Bestellnummer im Kanal; Registry-Schlüssel gemeinsam mit gobecomAPI."
              }
            }
          }
        }
      ]
    },
    "sale_lines": {
      "type": "object",
      "description": "Verkaufspositionen → sales[].lines",
      "additionalProperties": false,
      "required": [
        "externalId",
        "saleRef",
        "partRef",
        "quantity",
        "unitPriceCents"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "maxLength": 100,
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "description": "Dauerhafte Kennung im Quellsystem; eindeutig je Entität, Quellsystem und Quellkonto."
        },
        "operation": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "create",
                "update"
              ],
              "default": "create",
              "description": "create legt neu an (Standard); update ändert einen bereits zugeordneten Datensatz und verlangt expectedVersion."
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedVersion": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
            },
            {
              "type": "null"
            }
          ]
        },
        "saleRef": {
          "type": "string",
          "minLength": 1,
          "maxLength": 300,
          "pattern": "^(?!partuvo:$).*\\S.*$",
          "x-references": "sales",
          "description": "externalId des Verkaufs. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
        },
        "partRef": {
          "type": "string",
          "minLength": 1,
          "maxLength": 300,
          "pattern": "^(?!partuvo:$).*\\S.*$",
          "x-references": "parts",
          "description": "externalId des Teils; je Verkauf nur einmal. Entweder externalId derselben Quelle oder partuvo:<Partuvo-ID>."
        },
        "quantity": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000000,
          "x-unit": "piece",
          "description": "Menge."
        },
        "unitPriceCents": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1000000000,
          "x-unit": "cent",
          "description": "Nettostückpreis in Cent."
        },
        "totalCents": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "x-unit": "cent",
              "description": "Positionsnetto; muss Menge × Stückpreis entsprechen."
            },
            {
              "type": "null"
            }
          ]
        },
        "channelLineItemId": {
          "oneOf": [
            {
              "type": "string",
              "maxLength": 100,
              "description": "Positionskennung im Kanal; Pflicht, wenn der Verkauf einen Kanal nennt."
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "operation"
            ],
            "properties": {
              "operation": {
                "const": "update"
              }
            }
          },
          "then": {
            "required": [
              "expectedVersion"
            ],
            "properties": {
              "expectedVersion": {
                "type": "integer",
                "minimum": 1,
                "maximum": 9007199254740991,
                "description": "Aktuelle Partuvo-Version des Zieldatensatzes; Pflicht bei operation=update."
              }
            }
          },
          "else": {
            "properties": {
              "expectedVersion": {
                "type": "null"
              }
            }
          }
        }
      ]
    },
    "modes": {
      "type": "string",
      "enum": [
        "master_data",
        "opening_balance",
        "historical",
        "operative"
      ],
      "description": "master_data: Kontakte, Fahrzeuge, Lagerstruktur, Platzregeln und Teile ohne Mengen und ohne Belege. Erlaubte Listen: partners, vehicles, locations, storage_rules, parts. opening_balance: Stammdaten plus gezählte Eröffnungsmengen und Platzierungen; erzeugt keine Bewegungshistorie. Erlaubte Listen: partners, vehicles, locations, storage_rules, parts, stocks. historical: Vollständige Altdatenübernahme. Historische Verkäufe werden als Belege übernommen und buchen keinen Bestand ab; die Eröffnungsmengen müssen den gezählten Bestand nach diesen Verkäufen enthalten. Erlaubte Listen: partners, vehicles, locations, storage_rules, parts, stocks, sales, sale_lines. operative: Neue Verkaufsvorgänge aus Dateien oder Marktplatzkanälen. Die Bestätigung bucht wie im Verkaufsmodul genau einmal Bestand ab. Erlaubte Listen: sales, sale_lines."
    }
  },
  "x-limits": {
    "fileBytes": 20971520,
    "rowsPerEntity": 100000,
    "fieldChars": 10000,
    "columns": 64,
    "findings": 1000,
    "linesPerSale": 100,
    "quantity": 1000000,
    "cents": 1000000000,
    "totalCents": 9007199254740991,
    "oemNumbers": 20,
    "allowedLocations": 100,
    "listItems": 100
  }
}
