diff --git a/.gitignore b/.gitignore index 79c113f..4585a6b 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,12 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release + +# OpenAPI-Generator +# - JAR wird per tool/fetch_openapi_generator.sh nachgeladen (nicht im Repo) +# - Generierter Code in packages/holzleitner_api/ wird commited, +# nur Build-Outputs werden ignoriert +tool/openapi-generator-cli.jar +packages/holzleitner_api/.dart_tool/ +packages/holzleitner_api/build/ +packages/holzleitner_api/pubspec.lock diff --git a/lib/data/mapper/.gitkeep b/lib/data/mapper/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/network/auth_token_provider.dart b/lib/data/network/auth_token_provider.dart new file mode 100644 index 0000000..3f500f4 --- /dev/null +++ b/lib/data/network/auth_token_provider.dart @@ -0,0 +1,9 @@ +/// Schnittstelle, über die HTTP-Interceptors einen aktuellen +/// Access-Token beziehen. Phase A liefert das eine simple +/// Password-Grant-Implementation; Phase B (Keycloak OIDC mit +/// flutter_appauth) ersetzt sie durch eine echte PKCE-/Refresh-fähige. +abstract interface class AuthTokenProvider { + /// Liefert einen aktuell gültigen Access-Token oder `null`, wenn + /// keine Session aktiv ist. Darf bei Bedarf einen Refresh anstoßen. + Future currentAccessToken(); +} diff --git a/lib/data/network/backend_config.dart b/lib/data/network/backend_config.dart new file mode 100644 index 0000000..b43990a --- /dev/null +++ b/lib/data/network/backend_config.dart @@ -0,0 +1,48 @@ +/// Endpoint-Konfiguration für das Rust-Backend. +/// +/// Dies ist eine Übergangs-Konfiguration für Phase A der +/// Backend-Migration. Sie wird in Phase D durch eine umfassendere +/// `LocalDocuFrameConfiguration`-Ablösung ersetzt (oder die bestehende +/// Konfiguration wird erweitert). +/// +/// **Werte für lokale Entwicklung:** +/// * iOS-Simulator + macOS-Host: `http://127.0.0.1:3000` +/// * Android-Emulator: `http://10.0.2.2:3000` +/// * Echtes Gerät im LAN: `http://:3000` +/// +/// Default ist iOS-Simulator-tauglich. Für Android-Build vor dem +/// Compile umstellen — eine Auto-Erkennung pro Platform kommt mit der +/// Phase-D-Config. +class BackendConfig { + const BackendConfig({ + required this.apiBaseUrl, + required this.keycloakTokenEndpoint, + required this.keycloakClientId, + }); + + /// Basis-URL der Rust-API (kein abschließender Slash). + final String apiBaseUrl; + + /// Vollständiger Token-Endpoint des Keycloak-Realms — Format: + /// `{issuer}/protocol/openid-connect/token`. + final String keycloakTokenEndpoint; + + /// Public-Client-Id, die das Backend als `audience` erwartet + /// (aktuell `holzleitner-app`). + final String keycloakClientId; + + /// Default-Konfiguration für lokale Entwicklung gegen das + /// Docker-Compose-Setup (Postgres + Keycloak + Backend). + /// + /// **Achtung Hostname:** Keycloak prägt das `iss`-Claim des Tokens + /// aus dem Hostnamen der Token-Endpoint-URL. Das Backend erwartet + /// `iss = http://localhost:8080/realms/holzleitner`, deshalb hier + /// `localhost` statt `127.0.0.1`. Auf Android-Emulator entsprechend + /// `10.0.2.2` setzen. + static const BackendConfig localDev = BackendConfig( + apiBaseUrl: 'http://localhost:3000', + keycloakTokenEndpoint: + 'http://localhost:8080/realms/holzleitner/protocol/openid-connect/token', + keycloakClientId: 'holzleitner-app', + ); +} diff --git a/lib/data/network/dev_password_grant_token_provider.dart b/lib/data/network/dev_password_grant_token_provider.dart new file mode 100644 index 0000000..e42a6ef --- /dev/null +++ b/lib/data/network/dev_password_grant_token_provider.dart @@ -0,0 +1,73 @@ +import 'package:dio/dio.dart'; + +import 'auth_token_provider.dart'; + +/// **Nur für Phase A / Smoke-Tests.** Spricht direkt den Keycloak- +/// Token-Endpoint mit `grant_type=password` an — bequem für +/// Dev-Setups, in Produktion komplett ungeeignet (kein PKCE, keine +/// Userinteraktion, Credentials in der App). +/// +/// In Phase B ersetzt diese Klasse die KeycloakOidcTokenProvider- +/// Implementierung, die auf flutter_appauth basiert. +/// +/// Cached den Token im Speicher und erneuert ihn, sobald die +/// Restlaufzeit unter 30 s fällt — kein eingebauter Refresh-Token- +/// Flow, dafür einfach. +class DevPasswordGrantTokenProvider implements AuthTokenProvider { + DevPasswordGrantTokenProvider({ + required this.tokenEndpoint, + required this.clientId, + required this.username, + required this.password, + Dio? dio, + }) : _dio = dio ?? Dio(); + + final Dio _dio; + final String tokenEndpoint; + final String clientId; + final String username; + final String password; + + String? _cachedToken; + DateTime? _expiresAt; + + @override + Future currentAccessToken() async { + final now = DateTime.now(); + final cached = _cachedToken; + final expiresAt = _expiresAt; + if (cached != null && + expiresAt != null && + expiresAt.isAfter(now.add(const Duration(seconds: 30)))) { + return cached; + } + + final response = await _dio.post>( + tokenEndpoint, + data: { + 'grant_type': 'password', + 'client_id': clientId, + 'username': username, + 'password': password, + 'scope': 'openid', + }, + options: Options(contentType: Headers.formUrlEncodedContentType), + ); + + final data = response.data; + if (data == null) { + throw StateError('Keycloak token endpoint lieferte leeren Body'); + } + final token = data['access_token'] as String?; + final expiresIn = data['expires_in'] as int?; + if (token == null || expiresIn == null) { + throw StateError( + 'Keycloak token endpoint lieferte unerwartete Antwort: $data', + ); + } + + _cachedToken = token; + _expiresAt = now.add(Duration(seconds: expiresIn)); + return token; + } +} diff --git a/lib/data/network/holzleitner_api_factory.dart b/lib/data/network/holzleitner_api_factory.dart new file mode 100644 index 0000000..3ca1258 --- /dev/null +++ b/lib/data/network/holzleitner_api_factory.dart @@ -0,0 +1,35 @@ +import 'package:dio/dio.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +import 'auth_token_provider.dart'; +import 'backend_config.dart'; +import 'holzleitner_auth_interceptor.dart'; + +/// Baut den generierten `HolzleitnerApi`-Client mit: +/// * eigener `Dio`-Instanz (Base-URL + Timeouts aus [BackendConfig]), +/// * **ohne** die vier Default-Auth-Interceptors des Generators — +/// stattdessen wird unser [HolzleitnerAuthInterceptor] gehängt. +/// +/// Auf diese Weise bleibt die Token-Quelle pluggable +/// ([AuthTokenProvider]), und Phase B (Keycloak OIDC) kann die +/// Provider-Implementierung austauschen, ohne den Rest des Codes +/// anzufassen. +HolzleitnerApi buildHolzleitnerApi({ + required BackendConfig config, + required AuthTokenProvider tokenProvider, +}) { + final dio = Dio( + BaseOptions( + baseUrl: config.apiBaseUrl, + connectTimeout: const Duration(seconds: 10), + receiveTimeout: const Duration(seconds: 30), + sendTimeout: const Duration(seconds: 30), + headers: const {'Accept': 'application/json'}, + ), + ); + + return HolzleitnerApi( + dio: dio, + interceptors: [HolzleitnerAuthInterceptor(tokenProvider)], + ); +} diff --git a/lib/data/network/holzleitner_auth_interceptor.dart b/lib/data/network/holzleitner_auth_interceptor.dart new file mode 100644 index 0000000..818bdbc --- /dev/null +++ b/lib/data/network/holzleitner_auth_interceptor.dart @@ -0,0 +1,33 @@ +import 'package:dio/dio.dart'; + +import 'auth_token_provider.dart'; + +/// Dio-Interceptor, der pro Request den aktuellen Access-Token vom +/// `AuthTokenProvider` zieht und als `Authorization: Bearer …`-Header +/// anhängt. Provider-Fehler werden geloggt, der Request läuft trotzdem +/// weiter — das Backend antwortet dann mit 401, was der reguläre +/// Error-Handling-Pfad behandelt. +class HolzleitnerAuthInterceptor extends Interceptor { + HolzleitnerAuthInterceptor(this._tokenProvider); + + final AuthTokenProvider _tokenProvider; + + @override + Future onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) async { + try { + final token = await _tokenProvider.currentAccessToken(); + if (token != null) { + options.headers['Authorization'] = 'Bearer $token'; + } + } catch (e, stack) { + // TODO Phase B: hier ein strukturiertes Logging-Framework + // einhängen statt print. + // ignore: avoid_print + print('[HolzleitnerAuthInterceptor] Token-Provider hat geworfen: $e\n$stack'); + } + handler.next(options); + } +} diff --git a/lib/data/network/network_locator.dart b/lib/data/network/network_locator.dart new file mode 100644 index 0000000..ca2e6ed --- /dev/null +++ b/lib/data/network/network_locator.dart @@ -0,0 +1,41 @@ +import 'package:get_it/get_it.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +import 'auth_token_provider.dart'; +import 'backend_config.dart'; +import 'dev_password_grant_token_provider.dart'; +import 'holzleitner_api_factory.dart'; + +/// Registriert das HTTP-/API-Subsystem im globalen GetIt-Locator. +/// +/// Aufruf bewusst nicht im AppBloc-Lifecycle, sondern in `main()` vor +/// dem `runApp` — die API-Klassen sind über die gesamte App-Lebensdauer +/// stabil und brauchen keine Reaktion auf App-Events. +/// +/// Phase A nutzt die `DevPasswordGrantTokenProvider`-Implementation. +/// Phase B wird hier den OIDC-PKCE-Provider einhängen und die +/// Dev-Implementation komplett entfernen. +void registerNetworking({ + required GetIt locator, + BackendConfig config = BackendConfig.localDev, + String testfahrerUsername = 'testfahrer', + String testfahrerPassword = 'test', +}) { + locator.registerSingleton(config); + + locator.registerSingleton( + DevPasswordGrantTokenProvider( + tokenEndpoint: config.keycloakTokenEndpoint, + clientId: config.keycloakClientId, + username: testfahrerUsername, + password: testfahrerPassword, + ), + ); + + locator.registerSingleton( + buildHolzleitnerApi( + config: config, + tokenProvider: locator(), + ), + ); +} diff --git a/lib/data/repository/.gitkeep b/lib/data/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/domain/entity/.gitkeep b/lib/domain/entity/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/domain/repository/.gitkeep b/lib/domain/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/main.dart b/lib/main.dart index ecba437..2c745c0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:hl_lieferservice/bloc/app_bloc.dart'; import 'package:hl_lieferservice/bloc/app_events.dart'; +import 'package:hl_lieferservice/data/network/network_locator.dart'; import 'package:hl_lieferservice/feature/settings/bloc/settings_bloc.dart'; import 'package:hl_lieferservice/feature/settings/bloc/settings_event.dart'; import 'package:hl_lieferservice/widget/app.dart'; @@ -10,6 +11,12 @@ import 'package:hl_lieferservice/widget/app.dart'; final locator = GetIt.instance; void main() { + // Backend-Migration Phase A: HTTP-Stack + Token-Provider registrieren, + // bevor irgendein Bloc starten kann. Wirft eine Compile-Sicherheit + // hin, dass `HolzleitnerApi` ab hier per `locator()` + // verfügbar ist. + registerNetworking(locator: locator); + runApp(MultiBlocProvider(providers: [ BlocProvider(create: (context) => AppBloc(),), BlocProvider(create: (context) => SettingsBloc()) diff --git a/openapi/holzleitner.json b/openapi/holzleitner.json new file mode 100644 index 0000000..0adf843 --- /dev/null +++ b/openapi/holzleitner.json @@ -0,0 +1,1827 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Holzleitner Backend API", + "description": "Backend f\u00fcr die Holzleitner-Lieferservice-App \u2014 Tour, Beladung, Ausf\u00fchrung.", + "contact": { + "name": "Holzleitner GmbH" + }, + "license": { + "name": "Proprietary", + "identifier": "Proprietary" + }, + "version": "0.1.0" + }, + "paths": { + "/accounts/{personalnummer}": { + "get": { + "tags": [ + "accounts" + ], + "summary": "Liest den Account zu einer Personalnummer.", + "operationId": "get_account", + "parameters": [ + { + "name": "personalnummer", + "in": "path", + "description": "Personalnummer des Accounts", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Account gefunden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Account" + } + } + } + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Kein Account zu dieser Personalnummer" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/deliveries/{delivery_id}/assigned-car": { + "put": { + "tags": [ + "deliveries" + ], + "summary": "Setzt das `assigned_car_id` einer Lieferung. `carId: null` l\u00f6st\ndie Zuordnung wieder. Der Use Case stellt sicher, dass das Fahrzeug\nzum angemeldeten Account geh\u00f6rt.", + "operationId": "assign_car", + "parameters": [ + { + "name": "delivery_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssignCarRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Fahrzeug zugewiesen / entfernt", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeliveryResponse" + } + } + } + }, + "400": { + "description": "Fahrzeug geh\u00f6rt nicht zum Account" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Lieferung nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/deliveries/{delivery_id}/cancel": { + "post": { + "tags": [ + "deliveries" + ], + "summary": "Setzt die Lieferung auf `canceled` \u2014 endg\u00fcltig. Erlaubt aus\n`active` und `held`.", + "operationId": "cancel", + "parameters": [ + { + "name": "delivery_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CancelDeliveryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Lieferung storniert", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeliveryResponse" + } + } + } + }, + "400": { + "description": "Invalider Status\u00fcbergang oder leerer Reason" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Lieferung nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/deliveries/{delivery_id}/complete": { + "post": { + "tags": [ + "deliveries" + ], + "summary": "Schlie\u00dft die Lieferung ab \u2014 `state = completed`. Nur aus `active`.", + "operationId": "complete", + "parameters": [ + { + "name": "delivery_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Lieferung abgeschlossen", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeliveryResponse" + } + } + } + }, + "400": { + "description": "Invalider Status\u00fcbergang" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Lieferung nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/deliveries/{delivery_id}/hold": { + "post": { + "tags": [ + "deliveries" + ], + "summary": "Setzt die Lieferung auf `held`. Nur aus `active` zul\u00e4ssig.", + "operationId": "hold", + "parameters": [ + { + "name": "delivery_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HoldDeliveryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Lieferung geholdet", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeliveryResponse" + } + } + } + }, + "400": { + "description": "Invalider Status\u00fcbergang oder leerer Reason" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Lieferung nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/deliveries/{delivery_id}/notes": { + "post": { + "tags": [ + "deliveries" + ], + "summary": "Legt eine neue Notiz an einer Lieferung an. Mindestens eines von\n`text` und `imageAttachment` muss inhaltlich gef\u00fcllt sein\n(Leerstrings werden serverseitig getrimmt und als leer behandelt).", + "operationId": "create_note", + "parameters": [ + { + "name": "delivery_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDeliveryNoteRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Notiz angelegt", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeliveryNoteResponse" + } + } + } + }, + "400": { + "description": "Notiz ohne Inhalt" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Lieferung nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/deliveries/{delivery_id}/resume": { + "post": { + "tags": [ + "deliveries" + ], + "summary": "Setzt die Lieferung zur\u00fcck auf `active`. Nur aus `held` zul\u00e4ssig.", + "operationId": "resume", + "parameters": [ + { + "name": "delivery_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Lieferung wieder aktiv", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeliveryResponse" + } + } + } + }, + "400": { + "description": "Invalider Status\u00fcbergang" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Lieferung nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/health": { + "get": { + "tags": [ + "health" + ], + "summary": "Health-Endpoint f\u00fcr Load-Balancer und Container-Probes. Bewusst\nkein Auth \u2014 eine `200 ok`-Antwort darf nicht von der Auth abh\u00e4ngen.", + "operationId": "health", + "responses": { + "200": { + "description": "Service ist erreichbar", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + }, + "security": [] + } + }, + "/me/cars": { + "get": { + "tags": [ + "cars" + ], + "summary": "Listet die Fahrzeuge des angemeldeten Fahrers.", + "operationId": "list_my_cars", + "parameters": [ + { + "name": "includeInactive", + "in": "query", + "description": "Wenn true, werden inaktive Fahrzeuge mitgeliefert (default: false)", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Fahrzeuge des Fahrers", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CarsList" + } + } + } + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + }, + "post": { + "tags": [ + "cars" + ], + "summary": "Legt ein neues Fahrzeug f\u00fcr den angemeldeten Fahrer an.", + "operationId": "create_my_car", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateCarRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Fahrzeug angelegt", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CarResponse" + } + } + } + }, + "400": { + "description": "Validierungsfehler (z. B. doppeltes Kennzeichen)" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/me/cars/{car_id}": { + "patch": { + "tags": [ + "cars" + ], + "summary": "Aktualisiert ein Fahrzeug (Kennzeichen \u00e4ndern / deaktivieren).", + "operationId": "update_my_car", + "parameters": [ + { + "name": "car_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCarRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Fahrzeug aktualisiert", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CarResponse" + } + } + } + }, + "400": { + "description": "Validierungsfehler" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Fahrzeug nicht gefunden oder geh\u00f6rt nicht zu diesem Account" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/me/tours/today": { + "get": { + "tags": [ + "tours" + ], + "summary": "Listet heutige Touren des angemeldeten Fahrers (Filter aus dem JWT).", + "operationId": "list_my_tours_today", + "responses": { + "200": { + "description": "Liste der heutigen Touren", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TourSummaryList" + } + } + } + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/scans": { + "post": { + "tags": [ + "scans" + ], + "summary": "Wendet eine Liste von Scan-Events idempotent an.", + "description": "Pro Event ein eigenes Resultat. Status `applied` schreibt einen\nfrischen Audit-Eintrag, `duplicate` liefert den aktuellen Stand am\nServer, `rejected` enth\u00e4lt die Begr\u00fcndung. Reihenfolge der `results`\nentspricht der Reihenfolge der `scans` im Request.", + "operationId": "apply_scans", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplyScansRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Bulk-Ergebnis pro Event", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplyScansResponse" + } + } + } + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/sync/tour": { + "post": { + "tags": [ + "sync" + ], + "summary": "Sync-Endpoint f\u00fcr das ERP: legt eine Tagestour samt Lieferungen und\nPositionen idempotent an. Identit\u00e4t pro Tour\n`(driver_personalnummer, tour_date)`, pro Lieferung\n`(belegart_id, belegnummer)`.", + "operationId": "sync_tour", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SyncTourRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Tour gespeichert", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SyncTourResponse" + } + } + } + }, + "400": { + "description": "Validierungsfehler im Sync-Payload" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/tours/{tour_id}": { + "get": { + "tags": [ + "tours" + ], + "summary": "L\u00e4dt eine Tour mit allen Lieferungen, Positionen und referenzierten\nStammdaten \u2014 die App nutzt das als einzigen gro\u00dfen Read.", + "operationId": "get_tour", + "parameters": [ + { + "name": "tour_id", + "in": "path", + "description": "Eindeutige Tour-Id (UUID)", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Tour-Aggregat gefunden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TourDetails" + } + } + } + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Keine Tour mit dieser Id" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + }, + "/tours/{tour_id}/delivery-order": { + "put": { + "tags": [ + "tours" + ], + "summary": "Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu.\nDer Client schickt die **vollst\u00e4ndige** neue Reihenfolge; fehlende\noder fremde Lieferungs-Ids werden mit `400 validation` abgelehnt.", + "operationId": "set_delivery_order", + "parameters": [ + { + "name": "tour_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetDeliveryOrderRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Neue Reihenfolge gespeichert", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetDeliveryOrderResponse" + } + } + } + }, + "400": { + "description": "Mengen-Mismatch oder Duplikate" + }, + "401": { + "description": "Authentifizierung fehlgeschlagen" + }, + "404": { + "description": "Tour nicht gefunden" + } + }, + "security": [ + { + "bearer_auth": [] + } + ] + } + } + }, + "components": { + "schemas": { + "Account": { + "type": "object", + "description": "Account eines Liefer-Unternehmens oder Einzel-Lieferfahrers.\n\nDie Personalnummer ist sowohl Prim\u00e4rschl\u00fcssel als auch Login-ID. Sie\nstammt aus dem ERP-Stamm \u2014 entweder ein Unternehmen (juristische\nPerson, eigener Personalnummern-Kreis) oder eine nat\u00fcrliche Person.\n\nMehrere physische Fahrer k\u00f6nnen denselben Account benutzen; das Modell\nunterscheidet sie nicht, sondern loggt die Aktivit\u00e4t auf [`crate::domain::Car`]-\nEbene (siehe Audit-Log).", + "required": [ + "personalnummer", + "name", + "active" + ], + "properties": { + "active": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "personalnummer": { + "type": "integer", + "format": "int64" + } + } + }, + "Address": { + "type": "object", + "description": "Postanschrift \u2014 wird sowohl als aktuelle Kundenanschrift in [`Customer`]\nals auch als unver\u00e4nderlicher Snapshot in [`crate::domain::Delivery`]\nverwendet (`delivery_address_snapshot`).\n\nBewusst als Value Object modelliert: gleiche Adresse = gleicher Wert.\nStrikte Equality erleichtert Sync-Diffs zwischen ERP und Backend.\n\n[`Customer`]: crate::domain::Customer", + "required": [ + "street", + "houseNumber", + "postalCode", + "city", + "country" + ], + "properties": { + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "houseNumber": { + "type": "string" + }, + "postalCode": { + "type": "string" + }, + "street": { + "type": "string" + } + } + }, + "ApplyScansRequest": { + "type": "object", + "required": [ + "scans" + ], + "properties": { + "scans": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ScanEvent" + } + } + } + }, + "ApplyScansResponse": { + "type": "object", + "required": [ + "results" + ], + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ScanResult" + } + } + } + }, + "Article": { + "type": "object", + "description": "Artikel. ERP-Mirror; die `article_number` ist die business-stabile\nArtikelnummer aus dem ERP-Stamm und dient gleichzeitig als Br\u00fccke.\n\n`scannable = false` markiert nicht-physische Positionen wie\nDienstleistungen, Versandpauschalen o.\u00e4. \u2014 sie tauchen zwar als\n`DeliveryItem` auf, blockieren aber den Beladen-Fortschritt nicht.", + "required": [ + "id", + "articleNumber", + "name", + "scannable" + ], + "properties": { + "articleNumber": { + "type": "string" + }, + "defaultWarehouseId": { + "type": [ + "string", + "null" + ], + "format": "uuid" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "scannable": { + "type": "boolean" + } + } + }, + "AssignCarRequest": { + "type": "object", + "description": "Setzt das `assigned_car_id` einer Lieferung. `None` (`carId: null`)\nentfernt die Zuordnung.", + "properties": { + "carId": { + "type": [ + "string", + "null" + ], + "format": "uuid" + } + } + }, + "AuditAction": { + "type": "string", + "description": "Aktion-Typen im Scan-Audit-Log.\n\n* `Scan` / `Unscan` ver\u00e4ndern die `scanned_quantity` (+1 / -1).\n* `Hold` / `Unhold` \u00e4ndern nur den Status, keine Menge.\n* `Remove` markiert die Position als entfernt (Status `Removed`,\n z. B. weil der Kunde sie nicht annimmt).", + "enum": [ + "scan", + "unscan", + "hold", + "unhold", + "remove" + ] + }, + "CancelDeliveryRequest": { + "type": "object", + "required": [ + "reason" + ], + "properties": { + "reason": { + "type": "string" + } + } + }, + "Car": { + "type": "object", + "description": "Fahrzeug eines [`crate::domain::Account`]. Wird in der App selbst\ngepflegt \u2014 kein ERP-Spiegel. Eindeutig per UUID.\n\nIm Audit-Log ist der `Car` der \u201eAkteur\": die Personalnummer-Ebene\n(Account) ist gr\u00f6ber und unterscheidet nicht zwischen mehreren\ngleichzeitig aktiven Fahrern desselben Subunternehmens.", + "required": [ + "id", + "accountId", + "plate", + "active" + ], + "properties": { + "accountId": { + "type": "integer", + "format": "int64", + "description": "Verweis auf [`crate::domain::Account::personalnummer`]." + }, + "active": { + "type": "boolean" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "plate": { + "type": "string" + } + } + }, + "CarResponse": { + "type": "object", + "required": [ + "car" + ], + "properties": { + "car": { + "$ref": "#/components/schemas/Car" + } + } + }, + "CarsList": { + "type": "object", + "required": [ + "cars" + ], + "properties": { + "cars": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Car" + } + } + } + }, + "CreateCarRequest": { + "type": "object", + "required": [ + "plate" + ], + "properties": { + "plate": { + "type": "string" + } + } + }, + "CreateDeliveryNoteRequest": { + "type": "object", + "properties": { + "authorCarId": { + "type": [ + "string", + "null" + ], + "format": "uuid", + "description": "Fahrzeug, das die Notiz erzeugt hat. Muss zum angemeldeten\nAccount geh\u00f6ren. `None` ist erlaubt." + }, + "imageAttachment": { + "type": [ + "string", + "null" + ], + "description": "Object-Storage-Key oder URL eines vorab hochgeladenen Bildes." + }, + "text": { + "type": [ + "string", + "null" + ] + } + } + }, + "Customer": { + "type": "object", + "description": "Kunde. ERP-Mirror: die Stammdaten geh\u00f6ren dem ERP, wir spiegeln sie\nf\u00fcr die App. Die `erp_customer_id` ist die Br\u00fccke zur\u00fcck (in der\nRegel die `Kunde.row_id` aus ERPframe).\n\nDie `Customer.address` ist die *aktuelle* Anschrift. F\u00fcr historische\nStabilit\u00e4t f\u00fchrt [`crate::domain::Delivery`] zus\u00e4tzlich einen\n`delivery_address_snapshot` \u2014 Adress-\u00c4nderungen wirken nicht\nr\u00fcckwirkend auf bereits zugestellte oder geplante Lieferungen.", + "required": [ + "id", + "erpCustomerId", + "name", + "address" + ], + "properties": { + "address": { + "$ref": "#/components/schemas/Address" + }, + "erpCustomerId": { + "type": "integer", + "format": "int64" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + } + } + }, + "CustomerContact": { + "type": "object", + "description": "Ansprechpartner eines Kunden. Ein Kunde kann mehrere Kontaktpersonen\nhaben (z. B. Empfang vor Ort + Gesch\u00e4ftsf\u00fchrung). Eine Lieferung w\u00e4hlt\n0..N davon als aktive Kontakte aus (siehe\n`Delivery::contact_person_ids`).", + "required": [ + "id", + "customerId", + "name" + ], + "properties": { + "customerId": { + "type": "string", + "format": "uuid" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "phone": { + "type": [ + "string", + "null" + ] + } + } + }, + "Delivery": { + "type": "object", + "description": "Eine einzelne Lieferung an einen Kunden. Aggregat-Wurzel f\u00fcr die\nLiefer-Items, Notizen und das ggf. zugeordnete Fahrzeug.", + "required": [ + "id", + "tourId", + "erpBelegartId", + "erpBelegnummer", + "customerId", + "deliveryAddressSnapshot", + "contactPersonIds", + "state" + ], + "properties": { + "assignedCarId": { + "type": [ + "string", + "null" + ], + "format": "uuid", + "description": "Fahrzeug-Zuordnung, gesetzt in der Ausw\u00e4hlen-Phase.\nBei Ein-Auto-Teams beim Sync automatisch gef\u00fcllt." + }, + "contactPersonIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "Ausgew\u00e4hlte Ansprechpartner f\u00fcr genau diese Lieferung (Auswahl\naus `Customer.contacts`). Kann leer sein." + }, + "customerId": { + "type": "string", + "format": "uuid" + }, + "deliveryAddressSnapshot": { + "$ref": "#/components/schemas/Address", + "description": "Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs.\nSch\u00fctzt vor r\u00fcckwirkenden Kunden-Adress\u00e4nderungen." + }, + "desiredTime": { + "type": [ + "string", + "null" + ], + "description": "Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\")." + }, + "erpBelegartId": { + "type": "integer", + "format": "int64", + "description": "ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`.\n\u00dcberlebt den Belegkopf-Archiv\u00fcbergang." + }, + "erpBelegnummer": { + "type": "string" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "specialAgreements": { + "type": [ + "string", + "null" + ], + "description": "Sondervereinbarungen (z. B. \u201eT\u00fcrklingel defekt, hintenrum klopfen\")." + }, + "state": { + "$ref": "#/components/schemas/DeliveryState" + }, + "stateReason": { + "type": [ + "string", + "null" + ], + "description": "Begr\u00fcndung bei `state == Held` oder `state == Canceled`. Beim\nResume / Complete wieder `None`." + }, + "tourId": { + "type": "string", + "format": "uuid" + } + } + }, + "DeliveryItem": { + "type": "object", + "description": "Einzelposition einer Lieferung. Vereint regul\u00e4re Belegzeilen und\nSt\u00fccklisten-Komponenten zu einer flachen Liste \u2014 die St\u00fccklisten-\nHierarchie ist ein ERP-Konstrukt und wird beim Sync aufgel\u00f6st.\n\n\u00dcber die Felder `belegzeilen_nr` und `komponenten_artikel_nr` bleibt\ndie ERP-Herkunft aufl\u00f6sbar.", + "required": [ + "id", + "deliveryId", + "articleId", + "requiredQuantity", + "warehouseId", + "belegzeilenNr", + "scanState" + ], + "properties": { + "articleId": { + "type": "string", + "format": "uuid" + }, + "belegzeilenNr": { + "type": "integer", + "format": "int32", + "description": "ERP-Belegzeilen-Nr (Position innerhalb des Belegs)." + }, + "deliveryId": { + "type": "string", + "format": "uuid" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "komponentenArtikelNr": { + "type": [ + "string", + "null" + ], + "description": "Bei Items aus einer St\u00fcckliste: Artikelnummer der Komponente.\nBei regul\u00e4ren Belegzeilen: `None`." + }, + "requiredQuantity": { + "type": "integer", + "format": "int32" + }, + "scanState": { + "$ref": "#/components/schemas/ScanState" + }, + "warehouseId": { + "type": "string", + "format": "uuid" + } + } + }, + "DeliveryNote": { + "type": "object", + "description": "Notiz an einer Lieferung \u2014 frei eingegeben durch den Fahrer.\n\nMindestens eines von `text` oder `image_attachment` muss gesetzt\nsein. Die Constraint sitzt sowohl im DB-Schema (CHECK) als auch\nin der Application-Schicht.", + "required": [ + "id", + "deliveryId", + "authorPersonalnummer", + "createdAt" + ], + "properties": { + "authorCarId": { + "type": [ + "string", + "null" + ], + "format": "uuid", + "description": "Fahrzeug, falls bekannt \u2014 nullable bis das Backend Cars verwaltet." + }, + "authorPersonalnummer": { + "type": "integer", + "format": "int64", + "description": "Personalnummer des Akteurs (aus dem JWT). Pflicht." + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "deliveryId": { + "type": "string", + "format": "uuid" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "imageAttachment": { + "type": [ + "string", + "null" + ], + "description": "Referenz auf einen Bild-Anhang (z. B. Object-Storage-Key/URL)." + }, + "text": { + "type": [ + "string", + "null" + ] + } + } + }, + "DeliveryNoteResponse": { + "type": "object", + "required": [ + "note" + ], + "properties": { + "note": { + "$ref": "#/components/schemas/DeliveryNote" + } + } + }, + "DeliveryOrderEntry": { + "type": "object", + "required": [ + "deliveryId", + "sortOrder" + ], + "properties": { + "deliveryId": { + "type": "string", + "format": "uuid" + }, + "sortOrder": { + "type": "integer", + "format": "int32" + } + } + }, + "DeliveryResponse": { + "type": "object", + "required": [ + "delivery" + ], + "properties": { + "delivery": { + "$ref": "#/components/schemas/Delivery" + } + } + }, + "DeliveryState": { + "type": "string", + "description": "Lebenszyklus einer Lieferung.\n\n`Held` ist f\u00fcr \u201eheute nicht zustellbar, aber nicht endg\u00fcltig abgesagt\"\nreserviert; `Canceled` ist endg\u00fcltig. `Completed` setzt der\nAbschluss-Flow am Ende der Auslieferung.", + "enum": [ + "active", + "held", + "canceled", + "completed" + ] + }, + "DeliveryWithItems": { + "allOf": [ + { + "$ref": "#/components/schemas/Delivery" + }, + { + "type": "object", + "required": [ + "sortOrder", + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeliveryItem" + } + }, + "sortOrder": { + "type": "integer", + "format": "int32", + "description": "Sortier-Reihenfolge innerhalb der Tour (1-basiert)." + } + } + } + ] + }, + "HoldDeliveryRequest": { + "type": "object", + "required": [ + "reason" + ], + "properties": { + "reason": { + "type": "string" + } + } + }, + "ScanEvent": { + "type": "object", + "required": [ + "clientScanId", + "deliveryItemId", + "action", + "clientScannedAt" + ], + "properties": { + "action": { + "$ref": "#/components/schemas/AuditAction" + }, + "actorCarId": { + "type": [ + "string", + "null" + ], + "format": "uuid", + "description": "Fahrzeug, in dem der Scan gemacht wurde. Muss zum\nangemeldeten Account geh\u00f6ren. `None` ist erlaubt, schw\u00e4cht\naber den Audit-Trail." + }, + "clientScanId": { + "type": "string", + "format": "uuid" + }, + "clientScannedAt": { + "type": "string", + "format": "date-time" + }, + "deliveryItemId": { + "type": "string", + "format": "uuid" + }, + "reason": { + "type": [ + "string", + "null" + ], + "description": "Pflicht bei `Hold` und `Remove`. Sonst ignoriert." + } + } + }, + "ScanResult": { + "type": "object", + "required": [ + "clientScanId", + "status" + ], + "properties": { + "clientScanId": { + "type": "string", + "format": "uuid" + }, + "deliveryItemId": { + "type": [ + "string", + "null" + ], + "format": "uuid", + "description": "Aktueller `scan_state` der Position nach der Verarbeitung \u2014\ngenau dann gesetzt, wenn der Server den Stand kennen konnte\n(`Applied` oder `Duplicate`). Erlaubt der App, die UI ohne\nRe-Fetch zu aktualisieren." + }, + "newScanState": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/ScanState" + } + ] + }, + "reason": { + "type": [ + "string", + "null" + ], + "description": "Bei `Rejected`: Begr\u00fcndung. Bei `Applied`/`Duplicate`: `None`." + }, + "status": { + "$ref": "#/components/schemas/ScanResultStatus" + } + } + }, + "ScanResultStatus": { + "type": "string", + "enum": [ + "applied", + "duplicate", + "rejected" + ] + }, + "ScanState": { + "type": "object", + "description": "Eingebetteter Scan-Zustand pro [`DeliveryItem`]. Wird durch\n`ScanAuditEntry`-Events fortgeschrieben \u2014 das Audit-Log ist die\nWahrheit \u00fcber das WIE und WANN, dieses Embedded-VO ist die schnelle\nWahrheit \u00fcber das WIEVIEL.", + "required": [ + "scannedQuantity", + "status", + "lastUpdatedAt" + ], + "properties": { + "heldReason": { + "type": [ + "string", + "null" + ], + "description": "Grund bei `status == Held` oder `status == Removed`." + }, + "lastUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "scannedQuantity": { + "type": "integer", + "format": "int32" + }, + "status": { + "$ref": "#/components/schemas/ScanStatus" + } + } + }, + "ScanStatus": { + "type": "string", + "description": "Status einer einzelnen Scan-Position innerhalb eines Items.", + "enum": [ + "in_progress", + "done", + "held", + "removed" + ] + }, + "SetDeliveryOrderRequest": { + "type": "object", + "required": [ + "deliveryIds" + ], + "properties": { + "deliveryIds": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "description": "Reihenfolge: Position im Array (0-basiert) wird zu `sort_order`\n(1-basiert) gemappt." + } + } + }, + "SetDeliveryOrderResponse": { + "type": "object", + "required": [ + "tourId", + "order" + ], + "properties": { + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeliveryOrderEntry" + } + }, + "tourId": { + "type": "string", + "format": "uuid" + } + } + }, + "SyncDelivery": { + "type": "object", + "required": [ + "belegartId", + "belegnummer", + "erpCustomerId", + "customerName", + "customerAddress", + "deliveryAddress", + "sortOrder", + "items" + ], + "properties": { + "belegartId": { + "type": "integer", + "format": "int64" + }, + "belegnummer": { + "type": "string" + }, + "customerAddress": { + "$ref": "#/components/schemas/Address" + }, + "customerName": { + "type": "string" + }, + "deliveryAddress": { + "$ref": "#/components/schemas/Address", + "description": "Snapshot der Lieferadresse (kann von der Stammadresse abweichen)." + }, + "desiredTime": { + "type": [ + "string", + "null" + ] + }, + "erpCustomerId": { + "type": "integer", + "format": "int64" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SyncDeliveryItem" + } + }, + "sortOrder": { + "type": "integer", + "format": "int32", + "description": "1-basiert, definiert die initiale Reihenfolge in der App." + }, + "specialAgreements": { + "type": [ + "string", + "null" + ] + } + } + }, + "SyncDeliveryItem": { + "type": "object", + "required": [ + "belegzeilenNr", + "articleNumber", + "articleName", + "articleScannable", + "warehouseCode", + "warehouseName", + "requiredQuantity" + ], + "properties": { + "articleDefaultWarehouseCode": { + "type": [ + "string", + "null" + ], + "description": "Default-Lager-Code f\u00fcr den Artikel (Anlage neuer Artikel)." + }, + "articleName": { + "type": "string" + }, + "articleNumber": { + "type": "string" + }, + "articleScannable": { + "type": "boolean" + }, + "belegzeilenNr": { + "type": "integer", + "format": "int32" + }, + "komponentenArtikelNr": { + "type": [ + "string", + "null" + ], + "description": "Komponenten-Artikelnummer bei aufgel\u00f6sten St\u00fccklisten, sonst leer." + }, + "requiredQuantity": { + "type": "integer", + "format": "int32" + }, + "warehouseCode": { + "type": "string" + }, + "warehouseName": { + "type": "string" + } + } + }, + "SyncTourRequest": { + "type": "object", + "required": [ + "driverPersonalnummer", + "tourDate", + "deliveries" + ], + "properties": { + "deliveries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SyncDelivery" + } + }, + "driverPersonalnummer": { + "type": "integer", + "format": "int64" + }, + "tourDate": { + "type": "string", + "format": "date" + } + } + }, + "SyncTourResponse": { + "type": "object", + "description": "Antwort-H\u00fclle f\u00fcr `POST /sync/tour`.", + "required": [ + "tourId" + ], + "properties": { + "tourId": { + "type": "string", + "format": "uuid" + } + } + }, + "Tour": { + "type": "object", + "description": "Tour eines Tages, pro [`crate::domain::Account`]. Aggregat-Wurzel\nf\u00fcr die Lieferungen dieses Tages \u2014 die einzelnen [`crate::domain::Delivery`]\nreferenzieren ihre Tour per FK.\n\nDer Sync vom ERP l\u00e4uft in der Regel einmal am Vortag und f\u00fcllt eine\nneue Tour-Zeile inklusive Delivery- und DeliveryItem-Strukturen.", + "required": [ + "id", + "accountId", + "date", + "syncedAt" + ], + "properties": { + "accountId": { + "type": "integer", + "format": "int64" + }, + "date": { + "type": "string", + "format": "date" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "syncedAt": { + "type": "string", + "format": "date-time", + "description": "Zeitpunkt des letzten ERP-Sync \u2014 f\u00fcr Drift-Erkennung." + } + } + }, + "TourDetails": { + "type": "object", + "required": [ + "tour", + "deliveries", + "customers", + "customerContacts", + "articles", + "warehouses", + "notes" + ], + "properties": { + "articles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Article" + } + }, + "customerContacts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomerContact" + } + }, + "customers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Customer" + } + }, + "deliveries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeliveryWithItems" + } + }, + "notes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeliveryNote" + }, + "description": "Alle Notizen aller Lieferungen dieser Tour, in einer Liste.\nDie App joint clientseitig per `delivery_id`. Reihenfolge:\npro Lieferung aufsteigend nach `created_at`." + }, + "tour": { + "$ref": "#/components/schemas/Tour" + }, + "warehouses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Warehouse" + } + } + } + }, + "TourSummary": { + "type": "object", + "required": [ + "tourId", + "tourDate", + "deliveryCount" + ], + "properties": { + "deliveryCount": { + "type": "integer", + "format": "int64" + }, + "tourDate": { + "type": "string", + "format": "date" + }, + "tourId": { + "type": "string", + "format": "uuid" + } + } + }, + "TourSummaryList": { + "type": "object", + "description": "Antwort-H\u00fclle f\u00fcr `GET /me/tours/today`. Eigenes Struct, weil\nutoipa f\u00fcr `Vec` als Top-Level-Response keinen sauberen\nSchemanamen vergibt \u2014 und ein Wrapper macht die Erweiterbarkeit\n(z. B. Paginierung in Zukunft) zur Nicht-Breaking-Change.", + "required": [ + "tours" + ], + "properties": { + "tours": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TourSummary" + } + } + } + }, + "UpdateCarRequest": { + "type": "object", + "properties": { + "active": { + "type": [ + "boolean", + "null" + ], + "description": "Wenn gesetzt: aktiv/inaktiv. Inaktive Fahrzeuge tauchen in\n`GET /me/cars?activeOnly=true` (default) nicht auf." + }, + "plate": { + "type": [ + "string", + "null" + ], + "description": "Wenn gesetzt: neues Kennzeichen." + } + } + }, + "Warehouse": { + "type": "object", + "description": "Lager. ERP-Mirror; `code` ist die ERP-Lager-Nr (z. B. `\"0\"` f\u00fcr das\nStandardlager). Das `is_standard`-Flag ist der schnelle Filter f\u00fcr\ndie Beladen-Logik (\u201enur Standardlager-Artikel z\u00e4hlen f\u00fcr Fertig\").", + "required": [ + "id", + "code", + "name", + "isStandard" + ], + "properties": { + "code": { + "type": "string" + }, + "id": { + "type": "string", + "format": "uuid" + }, + "isStandard": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + } + }, + "securitySchemes": { + "bearer_auth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + }, + "security": [ + { + "bearer_auth": [] + } + ], + "tags": [ + { + "name": "health", + "description": "Health- und Status-Endpoints" + }, + { + "name": "accounts", + "description": "Account-Stammdaten" + }, + { + "name": "tours", + "description": "Touren der Fahrer" + }, + { + "name": "sync", + "description": "ERP-Sync-Endpunkte" + }, + { + "name": "scans", + "description": "Scan-Events (Beladung & Auslieferung)" + }, + { + "name": "deliveries", + "description": "Delivery-Lifecycle (hold / resume / cancel / complete)" + }, + { + "name": "cars", + "description": "Fahrzeug-Stammdaten pro Fahrer" + } + ] +} diff --git a/packages/holzleitner_api/.gitignore b/packages/holzleitner_api/.gitignore new file mode 100644 index 0000000..4298cdc --- /dev/null +++ b/packages/holzleitner_api/.gitignore @@ -0,0 +1,41 @@ +# See https://dart.dev/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.buildlog +.packages +.project +.pub/ +build/ +**/packages/ + +# Files created by dart2js +# (Most Dart developers will use pub build to compile Dart, use/modify these +# rules if you intend to use dart2js directly +# Convention is to use extension '.dart.js' for Dart compiled to Javascript to +# differentiate from explicit Javascript files) +*.dart.js +*.part.js +*.js.deps +*.js.map +*.info.json + +# Directory created by dartdoc +doc/api/ + +# Don't commit pubspec lock file +# (Library packages only! Remove pattern if developing an application package) +pubspec.lock + +# Don’t commit files and directories created by other development environments. +# For example, if your development environment creates any of the following files, +# consider putting them in a global ignore file: + +# IntelliJ +*.iml +*.ipr +*.iws +.idea/ + +# Mac +.DS_Store diff --git a/packages/holzleitner_api/.openapi-generator-ignore b/packages/holzleitner_api/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/packages/holzleitner_api/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/packages/holzleitner_api/.openapi-generator/FILES b/packages/holzleitner_api/.openapi-generator/FILES new file mode 100644 index 0000000..c111d9d --- /dev/null +++ b/packages/holzleitner_api/.openapi-generator/FILES @@ -0,0 +1,160 @@ +.gitignore +.openapi-generator-ignore +README.md +analysis_options.yaml +doc/Account.md +doc/AccountsApi.md +doc/Address.md +doc/ApplyScansRequest.md +doc/ApplyScansResponse.md +doc/Article.md +doc/AssignCarRequest.md +doc/AuditAction.md +doc/CancelDeliveryRequest.md +doc/Car.md +doc/CarResponse.md +doc/CarsApi.md +doc/CarsList.md +doc/CreateCarRequest.md +doc/CreateDeliveryNoteRequest.md +doc/Customer.md +doc/CustomerContact.md +doc/DeliveriesApi.md +doc/Delivery.md +doc/DeliveryItem.md +doc/DeliveryNote.md +doc/DeliveryNoteResponse.md +doc/DeliveryOrderEntry.md +doc/DeliveryResponse.md +doc/DeliveryState.md +doc/DeliveryWithItems.md +doc/HealthApi.md +doc/HoldDeliveryRequest.md +doc/ScanEvent.md +doc/ScanResult.md +doc/ScanResultStatus.md +doc/ScanState.md +doc/ScanStatus.md +doc/ScansApi.md +doc/SetDeliveryOrderRequest.md +doc/SetDeliveryOrderResponse.md +doc/SyncApi.md +doc/SyncDelivery.md +doc/SyncDeliveryItem.md +doc/SyncTourRequest.md +doc/SyncTourResponse.md +doc/Tour.md +doc/TourDetails.md +doc/TourSummary.md +doc/TourSummaryList.md +doc/ToursApi.md +doc/UpdateCarRequest.md +doc/Warehouse.md +lib/holzleitner_api.dart +lib/src/api.dart +lib/src/api/accounts_api.dart +lib/src/api/cars_api.dart +lib/src/api/deliveries_api.dart +lib/src/api/health_api.dart +lib/src/api/scans_api.dart +lib/src/api/sync_api.dart +lib/src/api/tours_api.dart +lib/src/api_util.dart +lib/src/auth/api_key_auth.dart +lib/src/auth/auth.dart +lib/src/auth/basic_auth.dart +lib/src/auth/bearer_auth.dart +lib/src/auth/oauth.dart +lib/src/date_serializer.dart +lib/src/model/account.dart +lib/src/model/address.dart +lib/src/model/apply_scans_request.dart +lib/src/model/apply_scans_response.dart +lib/src/model/article.dart +lib/src/model/assign_car_request.dart +lib/src/model/audit_action.dart +lib/src/model/cancel_delivery_request.dart +lib/src/model/car.dart +lib/src/model/car_response.dart +lib/src/model/cars_list.dart +lib/src/model/create_car_request.dart +lib/src/model/create_delivery_note_request.dart +lib/src/model/customer.dart +lib/src/model/customer_contact.dart +lib/src/model/date.dart +lib/src/model/delivery.dart +lib/src/model/delivery_item.dart +lib/src/model/delivery_note.dart +lib/src/model/delivery_note_response.dart +lib/src/model/delivery_order_entry.dart +lib/src/model/delivery_response.dart +lib/src/model/delivery_state.dart +lib/src/model/delivery_with_items.dart +lib/src/model/hold_delivery_request.dart +lib/src/model/scan_event.dart +lib/src/model/scan_result.dart +lib/src/model/scan_result_status.dart +lib/src/model/scan_state.dart +lib/src/model/scan_status.dart +lib/src/model/set_delivery_order_request.dart +lib/src/model/set_delivery_order_response.dart +lib/src/model/sync_delivery.dart +lib/src/model/sync_delivery_item.dart +lib/src/model/sync_tour_request.dart +lib/src/model/sync_tour_response.dart +lib/src/model/tour.dart +lib/src/model/tour_details.dart +lib/src/model/tour_summary.dart +lib/src/model/tour_summary_list.dart +lib/src/model/update_car_request.dart +lib/src/model/warehouse.dart +lib/src/serializers.dart +pubspec.yaml +test/account_test.dart +test/accounts_api_test.dart +test/address_test.dart +test/apply_scans_request_test.dart +test/apply_scans_response_test.dart +test/article_test.dart +test/assign_car_request_test.dart +test/audit_action_test.dart +test/cancel_delivery_request_test.dart +test/car_response_test.dart +test/car_test.dart +test/cars_api_test.dart +test/cars_list_test.dart +test/create_car_request_test.dart +test/create_delivery_note_request_test.dart +test/customer_contact_test.dart +test/customer_test.dart +test/deliveries_api_test.dart +test/delivery_item_test.dart +test/delivery_note_response_test.dart +test/delivery_note_test.dart +test/delivery_order_entry_test.dart +test/delivery_response_test.dart +test/delivery_state_test.dart +test/delivery_test.dart +test/delivery_with_items_test.dart +test/health_api_test.dart +test/hold_delivery_request_test.dart +test/scan_event_test.dart +test/scan_result_status_test.dart +test/scan_result_test.dart +test/scan_state_test.dart +test/scan_status_test.dart +test/scans_api_test.dart +test/set_delivery_order_request_test.dart +test/set_delivery_order_response_test.dart +test/sync_api_test.dart +test/sync_delivery_item_test.dart +test/sync_delivery_test.dart +test/sync_tour_request_test.dart +test/sync_tour_response_test.dart +test/tour_details_test.dart +test/tour_summary_list_test.dart +test/tour_summary_test.dart +test/tour_test.dart +test/tours_api_test.dart +test/update_car_request_test.dart +test/warehouse_test.dart diff --git a/packages/holzleitner_api/.openapi-generator/VERSION b/packages/holzleitner_api/.openapi-generator/VERSION new file mode 100644 index 0000000..758bb9c --- /dev/null +++ b/packages/holzleitner_api/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.10.0 diff --git a/packages/holzleitner_api/README.md b/packages/holzleitner_api/README.md new file mode 100644 index 0000000..76707f0 --- /dev/null +++ b/packages/holzleitner_api/README.md @@ -0,0 +1,143 @@ +# holzleitner_api (EXPERIMENTAL) +Backend für die Holzleitner-Lieferservice-App — Tour, Beladung, Ausführung. + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 0.1.0 +- Generator version: 7.10.0 +- Build package: org.openapitools.codegen.languages.DartDioClientCodegen + +## Requirements + +* Dart 2.15.0+ or Flutter 2.8.0+ +* Dio 5.0.0+ (https://pub.dev/packages/dio) + +## Installation & Usage + +### pub.dev +To use the package from [pub.dev](https://pub.dev), please include the following in pubspec.yaml +```yaml +dependencies: + holzleitner_api: 1.0.0 +``` + +### Github +If this Dart package is published to Github, please include the following in pubspec.yaml +```yaml +dependencies: + holzleitner_api: + git: + url: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + #ref: main +``` + +### Local development +To use the package from your local drive, please include the following in pubspec.yaml +```yaml +dependencies: + holzleitner_api: + path: /path/to/holzleitner_api +``` + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:holzleitner_api/holzleitner_api.dart'; + + +final api = HolzleitnerApi().getAccountsApi(); +final int personalnummer = 789; // int | Personalnummer des Accounts + +try { + final response = await api.getAccount(personalnummer); + print(response); +} catch on DioException (e) { + print("Exception when calling AccountsApi->getAccount: $e\n"); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://localhost* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +[*AccountsApi*](doc/AccountsApi.md) | [**getAccount**](doc/AccountsApi.md#getaccount) | **GET** /accounts/{personalnummer} | Liest den Account zu einer Personalnummer. +[*CarsApi*](doc/CarsApi.md) | [**createMyCar**](doc/CarsApi.md#createmycar) | **POST** /me/cars | Legt ein neues Fahrzeug für den angemeldeten Fahrer an. +[*CarsApi*](doc/CarsApi.md) | [**listMyCars**](doc/CarsApi.md#listmycars) | **GET** /me/cars | Listet die Fahrzeuge des angemeldeten Fahrers. +[*CarsApi*](doc/CarsApi.md) | [**updateMyCar**](doc/CarsApi.md#updatemycar) | **PATCH** /me/cars/{car_id} | Aktualisiert ein Fahrzeug (Kennzeichen ändern / deaktivieren). +[*DeliveriesApi*](doc/DeliveriesApi.md) | [**assignCar**](doc/DeliveriesApi.md#assigncar) | **PUT** /deliveries/{delivery_id}/assigned-car | Setzt das `assigned_car_id` einer Lieferung. `carId: null` löst die Zuordnung wieder. Der Use Case stellt sicher, dass das Fahrzeug zum angemeldeten Account gehört. +[*DeliveriesApi*](doc/DeliveriesApi.md) | [**cancel**](doc/DeliveriesApi.md#cancel) | **POST** /deliveries/{delivery_id}/cancel | Setzt die Lieferung auf `canceled` — endgültig. Erlaubt aus `active` und `held`. +[*DeliveriesApi*](doc/DeliveriesApi.md) | [**complete**](doc/DeliveriesApi.md#complete) | **POST** /deliveries/{delivery_id}/complete | Schließt die Lieferung ab — `state = completed`. Nur aus `active`. +[*DeliveriesApi*](doc/DeliveriesApi.md) | [**createNote**](doc/DeliveriesApi.md#createnote) | **POST** /deliveries/{delivery_id}/notes | Legt eine neue Notiz an einer Lieferung an. Mindestens eines von `text` und `imageAttachment` muss inhaltlich gefüllt sein (Leerstrings werden serverseitig getrimmt und als leer behandelt). +[*DeliveriesApi*](doc/DeliveriesApi.md) | [**hold**](doc/DeliveriesApi.md#hold) | **POST** /deliveries/{delivery_id}/hold | Setzt die Lieferung auf `held`. Nur aus `active` zulässig. +[*DeliveriesApi*](doc/DeliveriesApi.md) | [**resume**](doc/DeliveriesApi.md#resume) | **POST** /deliveries/{delivery_id}/resume | Setzt die Lieferung zurück auf `active`. Nur aus `held` zulässig. +[*HealthApi*](doc/HealthApi.md) | [**health**](doc/HealthApi.md#health) | **GET** /health | Health-Endpoint für Load-Balancer und Container-Probes. Bewusst kein Auth — eine `200 ok`-Antwort darf nicht von der Auth abhängen. +[*ScansApi*](doc/ScansApi.md) | [**applyScans**](doc/ScansApi.md#applyscans) | **POST** /scans | Wendet eine Liste von Scan-Events idempotent an. +[*SyncApi*](doc/SyncApi.md) | [**syncTour**](doc/SyncApi.md#synctour) | **POST** /sync/tour | Sync-Endpoint für das ERP: legt eine Tagestour samt Lieferungen und Positionen idempotent an. Identität pro Tour `(driver_personalnummer, tour_date)`, pro Lieferung `(belegart_id, belegnummer)`. +[*ToursApi*](doc/ToursApi.md) | [**getTour**](doc/ToursApi.md#gettour) | **GET** /tours/{tour_id} | Lädt eine Tour mit allen Lieferungen, Positionen und referenzierten Stammdaten — die App nutzt das als einzigen großen Read. +[*ToursApi*](doc/ToursApi.md) | [**listMyToursToday**](doc/ToursApi.md#listmytourstoday) | **GET** /me/tours/today | Listet heutige Touren des angemeldeten Fahrers (Filter aus dem JWT). +[*ToursApi*](doc/ToursApi.md) | [**setDeliveryOrder**](doc/ToursApi.md#setdeliveryorder) | **PUT** /tours/{tour_id}/delivery-order | Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu. Der Client schickt die **vollständige** neue Reihenfolge; fehlende oder fremde Lieferungs-Ids werden mit `400 validation` abgelehnt. + + +## Documentation For Models + + - [Account](doc/Account.md) + - [Address](doc/Address.md) + - [ApplyScansRequest](doc/ApplyScansRequest.md) + - [ApplyScansResponse](doc/ApplyScansResponse.md) + - [Article](doc/Article.md) + - [AssignCarRequest](doc/AssignCarRequest.md) + - [AuditAction](doc/AuditAction.md) + - [CancelDeliveryRequest](doc/CancelDeliveryRequest.md) + - [Car](doc/Car.md) + - [CarResponse](doc/CarResponse.md) + - [CarsList](doc/CarsList.md) + - [CreateCarRequest](doc/CreateCarRequest.md) + - [CreateDeliveryNoteRequest](doc/CreateDeliveryNoteRequest.md) + - [Customer](doc/Customer.md) + - [CustomerContact](doc/CustomerContact.md) + - [Delivery](doc/Delivery.md) + - [DeliveryItem](doc/DeliveryItem.md) + - [DeliveryNote](doc/DeliveryNote.md) + - [DeliveryNoteResponse](doc/DeliveryNoteResponse.md) + - [DeliveryOrderEntry](doc/DeliveryOrderEntry.md) + - [DeliveryResponse](doc/DeliveryResponse.md) + - [DeliveryState](doc/DeliveryState.md) + - [DeliveryWithItems](doc/DeliveryWithItems.md) + - [HoldDeliveryRequest](doc/HoldDeliveryRequest.md) + - [ScanEvent](doc/ScanEvent.md) + - [ScanResult](doc/ScanResult.md) + - [ScanResultStatus](doc/ScanResultStatus.md) + - [ScanState](doc/ScanState.md) + - [ScanStatus](doc/ScanStatus.md) + - [SetDeliveryOrderRequest](doc/SetDeliveryOrderRequest.md) + - [SetDeliveryOrderResponse](doc/SetDeliveryOrderResponse.md) + - [SyncDelivery](doc/SyncDelivery.md) + - [SyncDeliveryItem](doc/SyncDeliveryItem.md) + - [SyncTourRequest](doc/SyncTourRequest.md) + - [SyncTourResponse](doc/SyncTourResponse.md) + - [Tour](doc/Tour.md) + - [TourDetails](doc/TourDetails.md) + - [TourSummary](doc/TourSummary.md) + - [TourSummaryList](doc/TourSummaryList.md) + - [UpdateCarRequest](doc/UpdateCarRequest.md) + - [Warehouse](doc/Warehouse.md) + + +## Documentation For Authorization + + +Authentication schemes defined for the API: +### bearer_auth + +- **Type**: HTTP Bearer Token authentication (JWT) + + +## Author + + + diff --git a/packages/holzleitner_api/analysis_options.yaml b/packages/holzleitner_api/analysis_options.yaml new file mode 100644 index 0000000..16a9585 --- /dev/null +++ b/packages/holzleitner_api/analysis_options.yaml @@ -0,0 +1,9 @@ +analyzer: + language: + strict-inference: true + strict-raw-types: true + strict-casts: false + exclude: + - test/*.dart + errors: + deprecated_member_use_from_same_package: ignore diff --git a/packages/holzleitner_api/doc/Account.md b/packages/holzleitner_api/doc/Account.md new file mode 100644 index 0000000..e3674cc --- /dev/null +++ b/packages/holzleitner_api/doc/Account.md @@ -0,0 +1,17 @@ +# holzleitner_api.model.Account + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active** | **bool** | | +**name** | **String** | | +**personalnummer** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/AccountsApi.md b/packages/holzleitner_api/doc/AccountsApi.md new file mode 100644 index 0000000..980d843 --- /dev/null +++ b/packages/holzleitner_api/doc/AccountsApi.md @@ -0,0 +1,55 @@ +# holzleitner_api.api.AccountsApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**getAccount**](AccountsApi.md#getaccount) | **GET** /accounts/{personalnummer} | Liest den Account zu einer Personalnummer. + + +# **getAccount** +> Account getAccount(personalnummer) + +Liest den Account zu einer Personalnummer. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getAccountsApi(); +final int personalnummer = 789; // int | Personalnummer des Accounts + +try { + final response = api.getAccount(personalnummer); + print(response); +} catch on DioException (e) { + print('Exception when calling AccountsApi->getAccount: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **personalnummer** | **int**| Personalnummer des Accounts | + +### Return type + +[**Account**](Account.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/Address.md b/packages/holzleitner_api/doc/Address.md new file mode 100644 index 0000000..a8ef211 --- /dev/null +++ b/packages/holzleitner_api/doc/Address.md @@ -0,0 +1,19 @@ +# holzleitner_api.model.Address + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**city** | **String** | | +**country** | **String** | | +**houseNumber** | **String** | | +**postalCode** | **String** | | +**street** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ApplyScansRequest.md b/packages/holzleitner_api/doc/ApplyScansRequest.md new file mode 100644 index 0000000..b1384bf --- /dev/null +++ b/packages/holzleitner_api/doc/ApplyScansRequest.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.ApplyScansRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**scans** | [**BuiltList<ScanEvent>**](ScanEvent.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ApplyScansResponse.md b/packages/holzleitner_api/doc/ApplyScansResponse.md new file mode 100644 index 0000000..a00c9e9 --- /dev/null +++ b/packages/holzleitner_api/doc/ApplyScansResponse.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.ApplyScansResponse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**results** | [**BuiltList<ScanResult>**](ScanResult.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/Article.md b/packages/holzleitner_api/doc/Article.md new file mode 100644 index 0000000..d432fed --- /dev/null +++ b/packages/holzleitner_api/doc/Article.md @@ -0,0 +1,19 @@ +# holzleitner_api.model.Article + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**articleNumber** | **String** | | +**defaultWarehouseId** | **String** | | [optional] +**id** | **String** | | +**name** | **String** | | +**scannable** | **bool** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/AssignCarRequest.md b/packages/holzleitner_api/doc/AssignCarRequest.md new file mode 100644 index 0000000..a9d829f --- /dev/null +++ b/packages/holzleitner_api/doc/AssignCarRequest.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.AssignCarRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**carId** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/AuditAction.md b/packages/holzleitner_api/doc/AuditAction.md new file mode 100644 index 0000000..074f4ce --- /dev/null +++ b/packages/holzleitner_api/doc/AuditAction.md @@ -0,0 +1,14 @@ +# holzleitner_api.model.AuditAction + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/CancelDeliveryRequest.md b/packages/holzleitner_api/doc/CancelDeliveryRequest.md new file mode 100644 index 0000000..b691ba1 --- /dev/null +++ b/packages/holzleitner_api/doc/CancelDeliveryRequest.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.CancelDeliveryRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**reason** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/Car.md b/packages/holzleitner_api/doc/Car.md new file mode 100644 index 0000000..483af75 --- /dev/null +++ b/packages/holzleitner_api/doc/Car.md @@ -0,0 +1,18 @@ +# holzleitner_api.model.Car + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**accountId** | **int** | Verweis auf [`crate::domain::Account::personalnummer`]. | +**active** | **bool** | | +**id** | **String** | | +**plate** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/CarResponse.md b/packages/holzleitner_api/doc/CarResponse.md new file mode 100644 index 0000000..9a9270d --- /dev/null +++ b/packages/holzleitner_api/doc/CarResponse.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.CarResponse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**car** | [**Car**](Car.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/CarsApi.md b/packages/holzleitner_api/doc/CarsApi.md new file mode 100644 index 0000000..1bce527 --- /dev/null +++ b/packages/holzleitner_api/doc/CarsApi.md @@ -0,0 +1,141 @@ +# holzleitner_api.api.CarsApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**createMyCar**](CarsApi.md#createmycar) | **POST** /me/cars | Legt ein neues Fahrzeug für den angemeldeten Fahrer an. +[**listMyCars**](CarsApi.md#listmycars) | **GET** /me/cars | Listet die Fahrzeuge des angemeldeten Fahrers. +[**updateMyCar**](CarsApi.md#updatemycar) | **PATCH** /me/cars/{car_id} | Aktualisiert ein Fahrzeug (Kennzeichen ändern / deaktivieren). + + +# **createMyCar** +> CarResponse createMyCar(createCarRequest) + +Legt ein neues Fahrzeug für den angemeldeten Fahrer an. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getCarsApi(); +final CreateCarRequest createCarRequest = ; // CreateCarRequest | + +try { + final response = api.createMyCar(createCarRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling CarsApi->createMyCar: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **createCarRequest** | [**CreateCarRequest**](CreateCarRequest.md)| | + +### Return type + +[**CarResponse**](CarResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **listMyCars** +> CarsList listMyCars(includeInactive) + +Listet die Fahrzeuge des angemeldeten Fahrers. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getCarsApi(); +final bool includeInactive = true; // bool | Wenn true, werden inaktive Fahrzeuge mitgeliefert (default: false) + +try { + final response = api.listMyCars(includeInactive); + print(response); +} catch on DioException (e) { + print('Exception when calling CarsApi->listMyCars: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **includeInactive** | **bool**| Wenn true, werden inaktive Fahrzeuge mitgeliefert (default: false) | [optional] + +### Return type + +[**CarsList**](CarsList.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **updateMyCar** +> CarResponse updateMyCar(carId, updateCarRequest) + +Aktualisiert ein Fahrzeug (Kennzeichen ändern / deaktivieren). + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getCarsApi(); +final String carId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | +final UpdateCarRequest updateCarRequest = ; // UpdateCarRequest | + +try { + final response = api.updateMyCar(carId, updateCarRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling CarsApi->updateMyCar: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **carId** | **String**| | + **updateCarRequest** | [**UpdateCarRequest**](UpdateCarRequest.md)| | + +### Return type + +[**CarResponse**](CarResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/CarsList.md b/packages/holzleitner_api/doc/CarsList.md new file mode 100644 index 0000000..972156f --- /dev/null +++ b/packages/holzleitner_api/doc/CarsList.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.CarsList + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**cars** | [**BuiltList<Car>**](Car.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/CreateCarRequest.md b/packages/holzleitner_api/doc/CreateCarRequest.md new file mode 100644 index 0000000..a908f53 --- /dev/null +++ b/packages/holzleitner_api/doc/CreateCarRequest.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.CreateCarRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**plate** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/CreateDeliveryNoteRequest.md b/packages/holzleitner_api/doc/CreateDeliveryNoteRequest.md new file mode 100644 index 0000000..013dfbd --- /dev/null +++ b/packages/holzleitner_api/doc/CreateDeliveryNoteRequest.md @@ -0,0 +1,17 @@ +# holzleitner_api.model.CreateDeliveryNoteRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**authorCarId** | **String** | Fahrzeug, das die Notiz erzeugt hat. Muss zum angemeldeten Account gehören. `None` ist erlaubt. | [optional] +**imageAttachment** | **String** | Object-Storage-Key oder URL eines vorab hochgeladenen Bildes. | [optional] +**text** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/Customer.md b/packages/holzleitner_api/doc/Customer.md new file mode 100644 index 0000000..013c8e2 --- /dev/null +++ b/packages/holzleitner_api/doc/Customer.md @@ -0,0 +1,18 @@ +# holzleitner_api.model.Customer + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**address** | [**Address**](Address.md) | | +**erpCustomerId** | **int** | | +**id** | **String** | | +**name** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/CustomerContact.md b/packages/holzleitner_api/doc/CustomerContact.md new file mode 100644 index 0000000..78e2359 --- /dev/null +++ b/packages/holzleitner_api/doc/CustomerContact.md @@ -0,0 +1,19 @@ +# holzleitner_api.model.CustomerContact + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**customerId** | **String** | | +**email** | **String** | | [optional] +**id** | **String** | | +**name** | **String** | | +**phone** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveriesApi.md b/packages/holzleitner_api/doc/DeliveriesApi.md new file mode 100644 index 0000000..50fcd12 --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveriesApi.md @@ -0,0 +1,273 @@ +# holzleitner_api.api.DeliveriesApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**assignCar**](DeliveriesApi.md#assigncar) | **PUT** /deliveries/{delivery_id}/assigned-car | Setzt das `assigned_car_id` einer Lieferung. `carId: null` löst die Zuordnung wieder. Der Use Case stellt sicher, dass das Fahrzeug zum angemeldeten Account gehört. +[**cancel**](DeliveriesApi.md#cancel) | **POST** /deliveries/{delivery_id}/cancel | Setzt die Lieferung auf `canceled` — endgültig. Erlaubt aus `active` und `held`. +[**complete**](DeliveriesApi.md#complete) | **POST** /deliveries/{delivery_id}/complete | Schließt die Lieferung ab — `state = completed`. Nur aus `active`. +[**createNote**](DeliveriesApi.md#createnote) | **POST** /deliveries/{delivery_id}/notes | Legt eine neue Notiz an einer Lieferung an. Mindestens eines von `text` und `imageAttachment` muss inhaltlich gefüllt sein (Leerstrings werden serverseitig getrimmt und als leer behandelt). +[**hold**](DeliveriesApi.md#hold) | **POST** /deliveries/{delivery_id}/hold | Setzt die Lieferung auf `held`. Nur aus `active` zulässig. +[**resume**](DeliveriesApi.md#resume) | **POST** /deliveries/{delivery_id}/resume | Setzt die Lieferung zurück auf `active`. Nur aus `held` zulässig. + + +# **assignCar** +> DeliveryResponse assignCar(deliveryId, assignCarRequest) + +Setzt das `assigned_car_id` einer Lieferung. `carId: null` löst die Zuordnung wieder. Der Use Case stellt sicher, dass das Fahrzeug zum angemeldeten Account gehört. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getDeliveriesApi(); +final String deliveryId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | +final AssignCarRequest assignCarRequest = ; // AssignCarRequest | + +try { + final response = api.assignCar(deliveryId, assignCarRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling DeliveriesApi->assignCar: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **deliveryId** | **String**| | + **assignCarRequest** | [**AssignCarRequest**](AssignCarRequest.md)| | + +### Return type + +[**DeliveryResponse**](DeliveryResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **cancel** +> DeliveryResponse cancel(deliveryId, cancelDeliveryRequest) + +Setzt die Lieferung auf `canceled` — endgültig. Erlaubt aus `active` und `held`. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getDeliveriesApi(); +final String deliveryId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | +final CancelDeliveryRequest cancelDeliveryRequest = ; // CancelDeliveryRequest | + +try { + final response = api.cancel(deliveryId, cancelDeliveryRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling DeliveriesApi->cancel: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **deliveryId** | **String**| | + **cancelDeliveryRequest** | [**CancelDeliveryRequest**](CancelDeliveryRequest.md)| | + +### Return type + +[**DeliveryResponse**](DeliveryResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **complete** +> DeliveryResponse complete(deliveryId) + +Schließt die Lieferung ab — `state = completed`. Nur aus `active`. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getDeliveriesApi(); +final String deliveryId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | + +try { + final response = api.complete(deliveryId); + print(response); +} catch on DioException (e) { + print('Exception when calling DeliveriesApi->complete: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **deliveryId** | **String**| | + +### Return type + +[**DeliveryResponse**](DeliveryResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **createNote** +> DeliveryNoteResponse createNote(deliveryId, createDeliveryNoteRequest) + +Legt eine neue Notiz an einer Lieferung an. Mindestens eines von `text` und `imageAttachment` muss inhaltlich gefüllt sein (Leerstrings werden serverseitig getrimmt und als leer behandelt). + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getDeliveriesApi(); +final String deliveryId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | +final CreateDeliveryNoteRequest createDeliveryNoteRequest = ; // CreateDeliveryNoteRequest | + +try { + final response = api.createNote(deliveryId, createDeliveryNoteRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling DeliveriesApi->createNote: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **deliveryId** | **String**| | + **createDeliveryNoteRequest** | [**CreateDeliveryNoteRequest**](CreateDeliveryNoteRequest.md)| | + +### Return type + +[**DeliveryNoteResponse**](DeliveryNoteResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **hold** +> DeliveryResponse hold(deliveryId, holdDeliveryRequest) + +Setzt die Lieferung auf `held`. Nur aus `active` zulässig. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getDeliveriesApi(); +final String deliveryId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | +final HoldDeliveryRequest holdDeliveryRequest = ; // HoldDeliveryRequest | + +try { + final response = api.hold(deliveryId, holdDeliveryRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling DeliveriesApi->hold: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **deliveryId** | **String**| | + **holdDeliveryRequest** | [**HoldDeliveryRequest**](HoldDeliveryRequest.md)| | + +### Return type + +[**DeliveryResponse**](DeliveryResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **resume** +> DeliveryResponse resume(deliveryId) + +Setzt die Lieferung zurück auf `active`. Nur aus `held` zulässig. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getDeliveriesApi(); +final String deliveryId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | + +try { + final response = api.resume(deliveryId); + print(response); +} catch on DioException (e) { + print('Exception when calling DeliveriesApi->resume: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **deliveryId** | **String**| | + +### Return type + +[**DeliveryResponse**](DeliveryResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/Delivery.md b/packages/holzleitner_api/doc/Delivery.md new file mode 100644 index 0000000..1e72b26 --- /dev/null +++ b/packages/holzleitner_api/doc/Delivery.md @@ -0,0 +1,26 @@ +# holzleitner_api.model.Delivery + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**assignedCarId** | **String** | Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. | [optional] +**contactPersonIds** | **BuiltList<String>** | Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. | +**customerId** | **String** | | +**deliveryAddressSnapshot** | [**Address**](Address.md) | Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. | +**desiredTime** | **String** | Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). | [optional] +**erpBelegartId** | **int** | ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. | +**erpBelegnummer** | **String** | | +**id** | **String** | | +**specialAgreements** | **String** | Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). | [optional] +**state** | [**DeliveryState**](DeliveryState.md) | | +**stateReason** | **String** | Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. | [optional] +**tourId** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryItem.md b/packages/holzleitner_api/doc/DeliveryItem.md new file mode 100644 index 0000000..47d138d --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryItem.md @@ -0,0 +1,22 @@ +# holzleitner_api.model.DeliveryItem + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**articleId** | **String** | | +**belegzeilenNr** | **int** | ERP-Belegzeilen-Nr (Position innerhalb des Belegs). | +**deliveryId** | **String** | | +**id** | **String** | | +**komponentenArtikelNr** | **String** | Bei Items aus einer Stückliste: Artikelnummer der Komponente. Bei regulären Belegzeilen: `None`. | [optional] +**requiredQuantity** | **int** | | +**scanState** | [**ScanState**](ScanState.md) | | +**warehouseId** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryNote.md b/packages/holzleitner_api/doc/DeliveryNote.md new file mode 100644 index 0000000..9e09d20 --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryNote.md @@ -0,0 +1,21 @@ +# holzleitner_api.model.DeliveryNote + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**authorCarId** | **String** | Fahrzeug, falls bekannt — nullable bis das Backend Cars verwaltet. | [optional] +**authorPersonalnummer** | **int** | Personalnummer des Akteurs (aus dem JWT). Pflicht. | +**createdAt** | [**DateTime**](DateTime.md) | | +**deliveryId** | **String** | | +**id** | **String** | | +**imageAttachment** | **String** | Referenz auf einen Bild-Anhang (z. B. Object-Storage-Key/URL). | [optional] +**text** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryNoteResponse.md b/packages/holzleitner_api/doc/DeliveryNoteResponse.md new file mode 100644 index 0000000..61184c2 --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryNoteResponse.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.DeliveryNoteResponse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**note** | [**DeliveryNote**](DeliveryNote.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryOrderEntry.md b/packages/holzleitner_api/doc/DeliveryOrderEntry.md new file mode 100644 index 0000000..8eb455e --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryOrderEntry.md @@ -0,0 +1,16 @@ +# holzleitner_api.model.DeliveryOrderEntry + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**deliveryId** | **String** | | +**sortOrder** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryResponse.md b/packages/holzleitner_api/doc/DeliveryResponse.md new file mode 100644 index 0000000..10b7733 --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryResponse.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.DeliveryResponse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**delivery** | [**Delivery**](Delivery.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryState.md b/packages/holzleitner_api/doc/DeliveryState.md new file mode 100644 index 0000000..f0666be --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryState.md @@ -0,0 +1,14 @@ +# holzleitner_api.model.DeliveryState + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/DeliveryWithItems.md b/packages/holzleitner_api/doc/DeliveryWithItems.md new file mode 100644 index 0000000..7dd5351 --- /dev/null +++ b/packages/holzleitner_api/doc/DeliveryWithItems.md @@ -0,0 +1,28 @@ +# holzleitner_api.model.DeliveryWithItems + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**assignedCarId** | **String** | Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. | [optional] +**contactPersonIds** | **BuiltList<String>** | Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. | +**customerId** | **String** | | +**deliveryAddressSnapshot** | [**Address**](Address.md) | Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. | +**desiredTime** | **String** | Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). | [optional] +**erpBelegartId** | **int** | ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. | +**erpBelegnummer** | **String** | | +**id** | **String** | | +**specialAgreements** | **String** | Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). | [optional] +**state** | [**DeliveryState**](DeliveryState.md) | | +**stateReason** | **String** | Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. | [optional] +**tourId** | **String** | | +**items** | [**BuiltList<DeliveryItem>**](DeliveryItem.md) | | +**sortOrder** | **int** | Sortier-Reihenfolge innerhalb der Tour (1-basiert). | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/HealthApi.md b/packages/holzleitner_api/doc/HealthApi.md new file mode 100644 index 0000000..92c1d16 --- /dev/null +++ b/packages/holzleitner_api/doc/HealthApi.md @@ -0,0 +1,51 @@ +# holzleitner_api.api.HealthApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**health**](HealthApi.md#health) | **GET** /health | Health-Endpoint für Load-Balancer und Container-Probes. Bewusst kein Auth — eine `200 ok`-Antwort darf nicht von der Auth abhängen. + + +# **health** +> String health() + +Health-Endpoint für Load-Balancer und Container-Probes. Bewusst kein Auth — eine `200 ok`-Antwort darf nicht von der Auth abhängen. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getHealthApi(); + +try { + final response = api.health(); + print(response); +} catch on DioException (e) { + print('Exception when calling HealthApi->health: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/HoldDeliveryRequest.md b/packages/holzleitner_api/doc/HoldDeliveryRequest.md new file mode 100644 index 0000000..70e4896 --- /dev/null +++ b/packages/holzleitner_api/doc/HoldDeliveryRequest.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.HoldDeliveryRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**reason** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ScanEvent.md b/packages/holzleitner_api/doc/ScanEvent.md new file mode 100644 index 0000000..71f05cc --- /dev/null +++ b/packages/holzleitner_api/doc/ScanEvent.md @@ -0,0 +1,20 @@ +# holzleitner_api.model.ScanEvent + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**action** | [**AuditAction**](AuditAction.md) | | +**actorCarId** | **String** | Fahrzeug, in dem der Scan gemacht wurde. Muss zum angemeldeten Account gehören. `None` ist erlaubt, schwächt aber den Audit-Trail. | [optional] +**clientScanId** | **String** | | +**clientScannedAt** | [**DateTime**](DateTime.md) | | +**deliveryItemId** | **String** | | +**reason** | **String** | Pflicht bei `Hold` und `Remove`. Sonst ignoriert. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ScanResult.md b/packages/holzleitner_api/doc/ScanResult.md new file mode 100644 index 0000000..e112091 --- /dev/null +++ b/packages/holzleitner_api/doc/ScanResult.md @@ -0,0 +1,19 @@ +# holzleitner_api.model.ScanResult + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**clientScanId** | **String** | | +**deliveryItemId** | **String** | Aktueller `scan_state` der Position nach der Verarbeitung — genau dann gesetzt, wenn der Server den Stand kennen konnte (`Applied` oder `Duplicate`). Erlaubt der App, die UI ohne Re-Fetch zu aktualisieren. | [optional] +**newScanState** | [**ScanState**](ScanState.md) | | [optional] +**reason** | **String** | Bei `Rejected`: Begründung. Bei `Applied`/`Duplicate`: `None`. | [optional] +**status** | [**ScanResultStatus**](ScanResultStatus.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ScanResultStatus.md b/packages/holzleitner_api/doc/ScanResultStatus.md new file mode 100644 index 0000000..509e499 --- /dev/null +++ b/packages/holzleitner_api/doc/ScanResultStatus.md @@ -0,0 +1,14 @@ +# holzleitner_api.model.ScanResultStatus + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ScanState.md b/packages/holzleitner_api/doc/ScanState.md new file mode 100644 index 0000000..8b8d454 --- /dev/null +++ b/packages/holzleitner_api/doc/ScanState.md @@ -0,0 +1,18 @@ +# holzleitner_api.model.ScanState + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**heldReason** | **String** | Grund bei `status == Held` oder `status == Removed`. | [optional] +**lastUpdatedAt** | [**DateTime**](DateTime.md) | | +**scannedQuantity** | **int** | | +**status** | [**ScanStatus**](ScanStatus.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ScanStatus.md b/packages/holzleitner_api/doc/ScanStatus.md new file mode 100644 index 0000000..6104d36 --- /dev/null +++ b/packages/holzleitner_api/doc/ScanStatus.md @@ -0,0 +1,14 @@ +# holzleitner_api.model.ScanStatus + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ScansApi.md b/packages/holzleitner_api/doc/ScansApi.md new file mode 100644 index 0000000..bfe2483 --- /dev/null +++ b/packages/holzleitner_api/doc/ScansApi.md @@ -0,0 +1,57 @@ +# holzleitner_api.api.ScansApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**applyScans**](ScansApi.md#applyscans) | **POST** /scans | Wendet eine Liste von Scan-Events idempotent an. + + +# **applyScans** +> ApplyScansResponse applyScans(applyScansRequest) + +Wendet eine Liste von Scan-Events idempotent an. + +Pro Event ein eigenes Resultat. Status `applied` schreibt einen frischen Audit-Eintrag, `duplicate` liefert den aktuellen Stand am Server, `rejected` enthält die Begründung. Reihenfolge der `results` entspricht der Reihenfolge der `scans` im Request. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getScansApi(); +final ApplyScansRequest applyScansRequest = ; // ApplyScansRequest | + +try { + final response = api.applyScans(applyScansRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling ScansApi->applyScans: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **applyScansRequest** | [**ApplyScansRequest**](ApplyScansRequest.md)| | + +### Return type + +[**ApplyScansResponse**](ApplyScansResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/SetDeliveryOrderRequest.md b/packages/holzleitner_api/doc/SetDeliveryOrderRequest.md new file mode 100644 index 0000000..dcbdd54 --- /dev/null +++ b/packages/holzleitner_api/doc/SetDeliveryOrderRequest.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.SetDeliveryOrderRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**deliveryIds** | **BuiltList<String>** | Reihenfolge: Position im Array (0-basiert) wird zu `sort_order` (1-basiert) gemappt. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/SetDeliveryOrderResponse.md b/packages/holzleitner_api/doc/SetDeliveryOrderResponse.md new file mode 100644 index 0000000..a7760b5 --- /dev/null +++ b/packages/holzleitner_api/doc/SetDeliveryOrderResponse.md @@ -0,0 +1,16 @@ +# holzleitner_api.model.SetDeliveryOrderResponse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**order** | [**BuiltList<DeliveryOrderEntry>**](DeliveryOrderEntry.md) | | +**tourId** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/SyncApi.md b/packages/holzleitner_api/doc/SyncApi.md new file mode 100644 index 0000000..25c2fec --- /dev/null +++ b/packages/holzleitner_api/doc/SyncApi.md @@ -0,0 +1,55 @@ +# holzleitner_api.api.SyncApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**syncTour**](SyncApi.md#synctour) | **POST** /sync/tour | Sync-Endpoint für das ERP: legt eine Tagestour samt Lieferungen und Positionen idempotent an. Identität pro Tour `(driver_personalnummer, tour_date)`, pro Lieferung `(belegart_id, belegnummer)`. + + +# **syncTour** +> SyncTourResponse syncTour(syncTourRequest) + +Sync-Endpoint für das ERP: legt eine Tagestour samt Lieferungen und Positionen idempotent an. Identität pro Tour `(driver_personalnummer, tour_date)`, pro Lieferung `(belegart_id, belegnummer)`. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getSyncApi(); +final SyncTourRequest syncTourRequest = ; // SyncTourRequest | + +try { + final response = api.syncTour(syncTourRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling SyncApi->syncTour: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **syncTourRequest** | [**SyncTourRequest**](SyncTourRequest.md)| | + +### Return type + +[**SyncTourResponse**](SyncTourResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/SyncDelivery.md b/packages/holzleitner_api/doc/SyncDelivery.md new file mode 100644 index 0000000..8bb4759 --- /dev/null +++ b/packages/holzleitner_api/doc/SyncDelivery.md @@ -0,0 +1,24 @@ +# holzleitner_api.model.SyncDelivery + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**belegartId** | **int** | | +**belegnummer** | **String** | | +**customerAddress** | [**Address**](Address.md) | | +**customerName** | **String** | | +**deliveryAddress** | [**Address**](Address.md) | Snapshot der Lieferadresse (kann von der Stammadresse abweichen). | +**desiredTime** | **String** | | [optional] +**erpCustomerId** | **int** | | +**items** | [**BuiltList<SyncDeliveryItem>**](SyncDeliveryItem.md) | | +**sortOrder** | **int** | 1-basiert, definiert die initiale Reihenfolge in der App. | +**specialAgreements** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/SyncDeliveryItem.md b/packages/holzleitner_api/doc/SyncDeliveryItem.md new file mode 100644 index 0000000..b510520 --- /dev/null +++ b/packages/holzleitner_api/doc/SyncDeliveryItem.md @@ -0,0 +1,23 @@ +# holzleitner_api.model.SyncDeliveryItem + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**articleDefaultWarehouseCode** | **String** | Default-Lager-Code für den Artikel (Anlage neuer Artikel). | [optional] +**articleName** | **String** | | +**articleNumber** | **String** | | +**articleScannable** | **bool** | | +**belegzeilenNr** | **int** | | +**komponentenArtikelNr** | **String** | Komponenten-Artikelnummer bei aufgelösten Stücklisten, sonst leer. | [optional] +**requiredQuantity** | **int** | | +**warehouseCode** | **String** | | +**warehouseName** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/SyncTourRequest.md b/packages/holzleitner_api/doc/SyncTourRequest.md new file mode 100644 index 0000000..c59a598 --- /dev/null +++ b/packages/holzleitner_api/doc/SyncTourRequest.md @@ -0,0 +1,17 @@ +# holzleitner_api.model.SyncTourRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**deliveries** | [**BuiltList<SyncDelivery>**](SyncDelivery.md) | | +**driverPersonalnummer** | **int** | | +**tourDate** | [**Date**](Date.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/SyncTourResponse.md b/packages/holzleitner_api/doc/SyncTourResponse.md new file mode 100644 index 0000000..4ccafa5 --- /dev/null +++ b/packages/holzleitner_api/doc/SyncTourResponse.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.SyncTourResponse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**tourId** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/Tour.md b/packages/holzleitner_api/doc/Tour.md new file mode 100644 index 0000000..f68710d --- /dev/null +++ b/packages/holzleitner_api/doc/Tour.md @@ -0,0 +1,18 @@ +# holzleitner_api.model.Tour + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**accountId** | **int** | | +**date** | [**Date**](Date.md) | | +**id** | **String** | | +**syncedAt** | [**DateTime**](DateTime.md) | Zeitpunkt des letzten ERP-Sync — für Drift-Erkennung. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/TourDetails.md b/packages/holzleitner_api/doc/TourDetails.md new file mode 100644 index 0000000..9024861 --- /dev/null +++ b/packages/holzleitner_api/doc/TourDetails.md @@ -0,0 +1,21 @@ +# holzleitner_api.model.TourDetails + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**articles** | [**BuiltList<Article>**](Article.md) | | +**customerContacts** | [**BuiltList<CustomerContact>**](CustomerContact.md) | | +**customers** | [**BuiltList<Customer>**](Customer.md) | | +**deliveries** | [**BuiltList<DeliveryWithItems>**](DeliveryWithItems.md) | | +**notes** | [**BuiltList<DeliveryNote>**](DeliveryNote.md) | Alle Notizen aller Lieferungen dieser Tour, in einer Liste. Die App joint clientseitig per `delivery_id`. Reihenfolge: pro Lieferung aufsteigend nach `created_at`. | +**tour** | [**Tour**](Tour.md) | | +**warehouses** | [**BuiltList<Warehouse>**](Warehouse.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/TourSummary.md b/packages/holzleitner_api/doc/TourSummary.md new file mode 100644 index 0000000..1d80a91 --- /dev/null +++ b/packages/holzleitner_api/doc/TourSummary.md @@ -0,0 +1,17 @@ +# holzleitner_api.model.TourSummary + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**deliveryCount** | **int** | | +**tourDate** | [**Date**](Date.md) | | +**tourId** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/TourSummaryList.md b/packages/holzleitner_api/doc/TourSummaryList.md new file mode 100644 index 0000000..5e39544 --- /dev/null +++ b/packages/holzleitner_api/doc/TourSummaryList.md @@ -0,0 +1,15 @@ +# holzleitner_api.model.TourSummaryList + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**tours** | [**BuiltList<TourSummary>**](TourSummary.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/ToursApi.md b/packages/holzleitner_api/doc/ToursApi.md new file mode 100644 index 0000000..bf5ddf4 --- /dev/null +++ b/packages/holzleitner_api/doc/ToursApi.md @@ -0,0 +1,137 @@ +# holzleitner_api.api.ToursApi + +## Load the API package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**getTour**](ToursApi.md#gettour) | **GET** /tours/{tour_id} | Lädt eine Tour mit allen Lieferungen, Positionen und referenzierten Stammdaten — die App nutzt das als einzigen großen Read. +[**listMyToursToday**](ToursApi.md#listmytourstoday) | **GET** /me/tours/today | Listet heutige Touren des angemeldeten Fahrers (Filter aus dem JWT). +[**setDeliveryOrder**](ToursApi.md#setdeliveryorder) | **PUT** /tours/{tour_id}/delivery-order | Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu. Der Client schickt die **vollständige** neue Reihenfolge; fehlende oder fremde Lieferungs-Ids werden mit `400 validation` abgelehnt. + + +# **getTour** +> TourDetails getTour(tourId) + +Lädt eine Tour mit allen Lieferungen, Positionen und referenzierten Stammdaten — die App nutzt das als einzigen großen Read. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getToursApi(); +final String tourId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | Eindeutige Tour-Id (UUID) + +try { + final response = api.getTour(tourId); + print(response); +} catch on DioException (e) { + print('Exception when calling ToursApi->getTour: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tourId** | **String**| Eindeutige Tour-Id (UUID) | + +### Return type + +[**TourDetails**](TourDetails.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **listMyToursToday** +> TourSummaryList listMyToursToday() + +Listet heutige Touren des angemeldeten Fahrers (Filter aus dem JWT). + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getToursApi(); + +try { + final response = api.listMyToursToday(); + print(response); +} catch on DioException (e) { + print('Exception when calling ToursApi->listMyToursToday: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**TourSummaryList**](TourSummaryList.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **setDeliveryOrder** +> SetDeliveryOrderResponse setDeliveryOrder(tourId, setDeliveryOrderRequest) + +Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu. Der Client schickt die **vollständige** neue Reihenfolge; fehlende oder fremde Lieferungs-Ids werden mit `400 validation` abgelehnt. + +### Example +```dart +import 'package:holzleitner_api/api.dart'; + +final api = HolzleitnerApi().getToursApi(); +final String tourId = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | +final SetDeliveryOrderRequest setDeliveryOrderRequest = ; // SetDeliveryOrderRequest | + +try { + final response = api.setDeliveryOrder(tourId, setDeliveryOrderRequest); + print(response); +} catch on DioException (e) { + print('Exception when calling ToursApi->setDeliveryOrder: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tourId** | **String**| | + **setDeliveryOrderRequest** | [**SetDeliveryOrderRequest**](SetDeliveryOrderRequest.md)| | + +### Return type + +[**SetDeliveryOrderResponse**](SetDeliveryOrderResponse.md) + +### Authorization + +[bearer_auth](../README.md#bearer_auth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/packages/holzleitner_api/doc/UpdateCarRequest.md b/packages/holzleitner_api/doc/UpdateCarRequest.md new file mode 100644 index 0000000..1ec5be9 --- /dev/null +++ b/packages/holzleitner_api/doc/UpdateCarRequest.md @@ -0,0 +1,16 @@ +# holzleitner_api.model.UpdateCarRequest + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active** | **bool** | Wenn gesetzt: aktiv/inaktiv. Inaktive Fahrzeuge tauchen in `GET /me/cars?activeOnly=true` (default) nicht auf. | [optional] +**plate** | **String** | Wenn gesetzt: neues Kennzeichen. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/doc/Warehouse.md b/packages/holzleitner_api/doc/Warehouse.md new file mode 100644 index 0000000..6c1a50d --- /dev/null +++ b/packages/holzleitner_api/doc/Warehouse.md @@ -0,0 +1,18 @@ +# holzleitner_api.model.Warehouse + +## Load the model package +```dart +import 'package:holzleitner_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | **String** | | +**id** | **String** | | +**isStandard** | **bool** | | +**name** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/packages/holzleitner_api/lib/holzleitner_api.dart b/packages/holzleitner_api/lib/holzleitner_api.dart new file mode 100644 index 0000000..f040a6d --- /dev/null +++ b/packages/holzleitner_api/lib/holzleitner_api.dart @@ -0,0 +1,62 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +export 'package:holzleitner_api/src/api.dart'; +export 'package:holzleitner_api/src/auth/api_key_auth.dart'; +export 'package:holzleitner_api/src/auth/basic_auth.dart'; +export 'package:holzleitner_api/src/auth/bearer_auth.dart'; +export 'package:holzleitner_api/src/auth/oauth.dart'; +export 'package:holzleitner_api/src/serializers.dart'; +export 'package:holzleitner_api/src/model/date.dart'; + +export 'package:holzleitner_api/src/api/accounts_api.dart'; +export 'package:holzleitner_api/src/api/cars_api.dart'; +export 'package:holzleitner_api/src/api/deliveries_api.dart'; +export 'package:holzleitner_api/src/api/health_api.dart'; +export 'package:holzleitner_api/src/api/scans_api.dart'; +export 'package:holzleitner_api/src/api/sync_api.dart'; +export 'package:holzleitner_api/src/api/tours_api.dart'; + +export 'package:holzleitner_api/src/model/account.dart'; +export 'package:holzleitner_api/src/model/address.dart'; +export 'package:holzleitner_api/src/model/apply_scans_request.dart'; +export 'package:holzleitner_api/src/model/apply_scans_response.dart'; +export 'package:holzleitner_api/src/model/article.dart'; +export 'package:holzleitner_api/src/model/assign_car_request.dart'; +export 'package:holzleitner_api/src/model/audit_action.dart'; +export 'package:holzleitner_api/src/model/cancel_delivery_request.dart'; +export 'package:holzleitner_api/src/model/car.dart'; +export 'package:holzleitner_api/src/model/car_response.dart'; +export 'package:holzleitner_api/src/model/cars_list.dart'; +export 'package:holzleitner_api/src/model/create_car_request.dart'; +export 'package:holzleitner_api/src/model/create_delivery_note_request.dart'; +export 'package:holzleitner_api/src/model/customer.dart'; +export 'package:holzleitner_api/src/model/customer_contact.dart'; +export 'package:holzleitner_api/src/model/delivery.dart'; +export 'package:holzleitner_api/src/model/delivery_item.dart'; +export 'package:holzleitner_api/src/model/delivery_note.dart'; +export 'package:holzleitner_api/src/model/delivery_note_response.dart'; +export 'package:holzleitner_api/src/model/delivery_order_entry.dart'; +export 'package:holzleitner_api/src/model/delivery_response.dart'; +export 'package:holzleitner_api/src/model/delivery_state.dart'; +export 'package:holzleitner_api/src/model/delivery_with_items.dart'; +export 'package:holzleitner_api/src/model/hold_delivery_request.dart'; +export 'package:holzleitner_api/src/model/scan_event.dart'; +export 'package:holzleitner_api/src/model/scan_result.dart'; +export 'package:holzleitner_api/src/model/scan_result_status.dart'; +export 'package:holzleitner_api/src/model/scan_state.dart'; +export 'package:holzleitner_api/src/model/scan_status.dart'; +export 'package:holzleitner_api/src/model/set_delivery_order_request.dart'; +export 'package:holzleitner_api/src/model/set_delivery_order_response.dart'; +export 'package:holzleitner_api/src/model/sync_delivery.dart'; +export 'package:holzleitner_api/src/model/sync_delivery_item.dart'; +export 'package:holzleitner_api/src/model/sync_tour_request.dart'; +export 'package:holzleitner_api/src/model/sync_tour_response.dart'; +export 'package:holzleitner_api/src/model/tour.dart'; +export 'package:holzleitner_api/src/model/tour_details.dart'; +export 'package:holzleitner_api/src/model/tour_summary.dart'; +export 'package:holzleitner_api/src/model/tour_summary_list.dart'; +export 'package:holzleitner_api/src/model/update_car_request.dart'; +export 'package:holzleitner_api/src/model/warehouse.dart'; + diff --git a/packages/holzleitner_api/lib/src/api.dart b/packages/holzleitner_api/lib/src/api.dart new file mode 100644 index 0000000..312e738 --- /dev/null +++ b/packages/holzleitner_api/lib/src/api.dart @@ -0,0 +1,115 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:built_value/serializer.dart'; +import 'package:holzleitner_api/src/serializers.dart'; +import 'package:holzleitner_api/src/auth/api_key_auth.dart'; +import 'package:holzleitner_api/src/auth/basic_auth.dart'; +import 'package:holzleitner_api/src/auth/bearer_auth.dart'; +import 'package:holzleitner_api/src/auth/oauth.dart'; +import 'package:holzleitner_api/src/api/accounts_api.dart'; +import 'package:holzleitner_api/src/api/cars_api.dart'; +import 'package:holzleitner_api/src/api/deliveries_api.dart'; +import 'package:holzleitner_api/src/api/health_api.dart'; +import 'package:holzleitner_api/src/api/scans_api.dart'; +import 'package:holzleitner_api/src/api/sync_api.dart'; +import 'package:holzleitner_api/src/api/tours_api.dart'; + +class HolzleitnerApi { + static const String basePath = r'http://localhost'; + + final Dio dio; + final Serializers serializers; + + HolzleitnerApi({ + Dio? dio, + Serializers? serializers, + String? basePathOverride, + List? interceptors, + }) : this.serializers = serializers ?? standardSerializers, + this.dio = dio ?? + Dio(BaseOptions( + baseUrl: basePathOverride ?? basePath, + connectTimeout: const Duration(milliseconds: 5000), + receiveTimeout: const Duration(milliseconds: 3000), + )) { + if (interceptors == null) { + this.dio.interceptors.addAll([ + OAuthInterceptor(), + BasicAuthInterceptor(), + BearerAuthInterceptor(), + ApiKeyAuthInterceptor(), + ]); + } else { + this.dio.interceptors.addAll(interceptors); + } + } + + void setOAuthToken(String name, String token) { + if (this.dio.interceptors.any((i) => i is OAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is OAuthInterceptor) as OAuthInterceptor).tokens[name] = token; + } + } + + void setBearerAuth(String name, String token) { + if (this.dio.interceptors.any((i) => i is BearerAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is BearerAuthInterceptor) as BearerAuthInterceptor).tokens[name] = token; + } + } + + void setBasicAuth(String name, String username, String password) { + if (this.dio.interceptors.any((i) => i is BasicAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is BasicAuthInterceptor) as BasicAuthInterceptor).authInfo[name] = BasicAuthInfo(username, password); + } + } + + void setApiKey(String name, String apiKey) { + if (this.dio.interceptors.any((i) => i is ApiKeyAuthInterceptor)) { + (this.dio.interceptors.firstWhere((element) => element is ApiKeyAuthInterceptor) as ApiKeyAuthInterceptor).apiKeys[name] = apiKey; + } + } + + /// Get AccountsApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + AccountsApi getAccountsApi() { + return AccountsApi(dio, serializers); + } + + /// Get CarsApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + CarsApi getCarsApi() { + return CarsApi(dio, serializers); + } + + /// Get DeliveriesApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + DeliveriesApi getDeliveriesApi() { + return DeliveriesApi(dio, serializers); + } + + /// Get HealthApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + HealthApi getHealthApi() { + return HealthApi(dio, serializers); + } + + /// Get ScansApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + ScansApi getScansApi() { + return ScansApi(dio, serializers); + } + + /// Get SyncApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + SyncApi getSyncApi() { + return SyncApi(dio, serializers); + } + + /// Get ToursApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + ToursApi getToursApi() { + return ToursApi(dio, serializers); + } +} diff --git a/packages/holzleitner_api/lib/src/api/accounts_api.dart b/packages/holzleitner_api/lib/src/api/accounts_api.dart new file mode 100644 index 0000000..89453df --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/accounts_api.dart @@ -0,0 +1,103 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:holzleitner_api/src/api_util.dart'; +import 'package:holzleitner_api/src/model/account.dart'; + +class AccountsApi { + + final Dio _dio; + + final Serializers _serializers; + + const AccountsApi(this._dio, this._serializers); + + /// Liest den Account zu einer Personalnummer. + /// + /// + /// Parameters: + /// * [personalnummer] - Personalnummer des Accounts + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [Account] as data + /// Throws [DioException] if API call or serialization fails + Future> getAccount({ + required int personalnummer, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/accounts/{personalnummer}'.replaceAll('{' r'personalnummer' '}', encodeQueryParameter(_serializers, personalnummer, const FullType(int)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + Account? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(Account), + ) as Account; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api/cars_api.dart b/packages/holzleitner_api/lib/src/api/cars_api.dart new file mode 100644 index 0000000..efdce21 --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/cars_api.dart @@ -0,0 +1,315 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:holzleitner_api/src/api_util.dart'; +import 'package:holzleitner_api/src/model/car_response.dart'; +import 'package:holzleitner_api/src/model/cars_list.dart'; +import 'package:holzleitner_api/src/model/create_car_request.dart'; +import 'package:holzleitner_api/src/model/update_car_request.dart'; + +class CarsApi { + + final Dio _dio; + + final Serializers _serializers; + + const CarsApi(this._dio, this._serializers); + + /// Legt ein neues Fahrzeug für den angemeldeten Fahrer an. + /// + /// + /// Parameters: + /// * [createCarRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [CarResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> createMyCar({ + required CreateCarRequest createCarRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/me/cars'; + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(CreateCarRequest); + _bodyData = _serializers.serialize(createCarRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + CarResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(CarResponse), + ) as CarResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Listet die Fahrzeuge des angemeldeten Fahrers. + /// + /// + /// Parameters: + /// * [includeInactive] - Wenn true, werden inaktive Fahrzeuge mitgeliefert (default: false) + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [CarsList] as data + /// Throws [DioException] if API call or serialization fails + Future> listMyCars({ + bool? includeInactive, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/me/cars'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _queryParameters = { + if (includeInactive != null) r'includeInactive': encodeQueryParameter(_serializers, includeInactive, const FullType(bool)), + }; + + final _response = await _dio.request( + _path, + options: _options, + queryParameters: _queryParameters, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + CarsList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(CarsList), + ) as CarsList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Aktualisiert ein Fahrzeug (Kennzeichen ändern / deaktivieren). + /// + /// + /// Parameters: + /// * [carId] + /// * [updateCarRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [CarResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> updateMyCar({ + required String carId, + required UpdateCarRequest updateCarRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/me/cars/{car_id}'.replaceAll('{' r'car_id' '}', encodeQueryParameter(_serializers, carId, const FullType(String)).toString()); + final _options = Options( + method: r'PATCH', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(UpdateCarRequest); + _bodyData = _serializers.serialize(updateCarRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + CarResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(CarResponse), + ) as CarResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api/deliveries_api.dart b/packages/holzleitner_api/lib/src/api/deliveries_api.dart new file mode 100644 index 0000000..157dc93 --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/deliveries_api.dart @@ -0,0 +1,601 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:holzleitner_api/src/api_util.dart'; +import 'package:holzleitner_api/src/model/assign_car_request.dart'; +import 'package:holzleitner_api/src/model/cancel_delivery_request.dart'; +import 'package:holzleitner_api/src/model/create_delivery_note_request.dart'; +import 'package:holzleitner_api/src/model/delivery_note_response.dart'; +import 'package:holzleitner_api/src/model/delivery_response.dart'; +import 'package:holzleitner_api/src/model/hold_delivery_request.dart'; + +class DeliveriesApi { + + final Dio _dio; + + final Serializers _serializers; + + const DeliveriesApi(this._dio, this._serializers); + + /// Setzt das `assigned_car_id` einer Lieferung. `carId: null` löst die Zuordnung wieder. Der Use Case stellt sicher, dass das Fahrzeug zum angemeldeten Account gehört. + /// + /// + /// Parameters: + /// * [deliveryId] + /// * [assignCarRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [DeliveryResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> assignCar({ + required String deliveryId, + required AssignCarRequest assignCarRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/deliveries/{delivery_id}/assigned-car'.replaceAll('{' r'delivery_id' '}', encodeQueryParameter(_serializers, deliveryId, const FullType(String)).toString()); + final _options = Options( + method: r'PUT', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(AssignCarRequest); + _bodyData = _serializers.serialize(assignCarRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + DeliveryResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(DeliveryResponse), + ) as DeliveryResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Setzt die Lieferung auf `canceled` — endgültig. Erlaubt aus `active` und `held`. + /// + /// + /// Parameters: + /// * [deliveryId] + /// * [cancelDeliveryRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [DeliveryResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> cancel({ + required String deliveryId, + required CancelDeliveryRequest cancelDeliveryRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/deliveries/{delivery_id}/cancel'.replaceAll('{' r'delivery_id' '}', encodeQueryParameter(_serializers, deliveryId, const FullType(String)).toString()); + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(CancelDeliveryRequest); + _bodyData = _serializers.serialize(cancelDeliveryRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + DeliveryResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(DeliveryResponse), + ) as DeliveryResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Schließt die Lieferung ab — `state = completed`. Nur aus `active`. + /// + /// + /// Parameters: + /// * [deliveryId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [DeliveryResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> complete({ + required String deliveryId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/deliveries/{delivery_id}/complete'.replaceAll('{' r'delivery_id' '}', encodeQueryParameter(_serializers, deliveryId, const FullType(String)).toString()); + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + DeliveryResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(DeliveryResponse), + ) as DeliveryResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Legt eine neue Notiz an einer Lieferung an. Mindestens eines von `text` und `imageAttachment` muss inhaltlich gefüllt sein (Leerstrings werden serverseitig getrimmt und als leer behandelt). + /// + /// + /// Parameters: + /// * [deliveryId] + /// * [createDeliveryNoteRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [DeliveryNoteResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> createNote({ + required String deliveryId, + required CreateDeliveryNoteRequest createDeliveryNoteRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/deliveries/{delivery_id}/notes'.replaceAll('{' r'delivery_id' '}', encodeQueryParameter(_serializers, deliveryId, const FullType(String)).toString()); + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(CreateDeliveryNoteRequest); + _bodyData = _serializers.serialize(createDeliveryNoteRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + DeliveryNoteResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(DeliveryNoteResponse), + ) as DeliveryNoteResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Setzt die Lieferung auf `held`. Nur aus `active` zulässig. + /// + /// + /// Parameters: + /// * [deliveryId] + /// * [holdDeliveryRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [DeliveryResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> hold({ + required String deliveryId, + required HoldDeliveryRequest holdDeliveryRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/deliveries/{delivery_id}/hold'.replaceAll('{' r'delivery_id' '}', encodeQueryParameter(_serializers, deliveryId, const FullType(String)).toString()); + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(HoldDeliveryRequest); + _bodyData = _serializers.serialize(holdDeliveryRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + DeliveryResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(DeliveryResponse), + ) as DeliveryResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Setzt die Lieferung zurück auf `active`. Nur aus `held` zulässig. + /// + /// + /// Parameters: + /// * [deliveryId] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [DeliveryResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> resume({ + required String deliveryId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/deliveries/{delivery_id}/resume'.replaceAll('{' r'delivery_id' '}', encodeQueryParameter(_serializers, deliveryId, const FullType(String)).toString()); + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + DeliveryResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(DeliveryResponse), + ) as DeliveryResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api/health_api.dart b/packages/holzleitner_api/lib/src/api/health_api.dart new file mode 100644 index 0000000..d1be1fc --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/health_api.dart @@ -0,0 +1,90 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + + +class HealthApi { + + final Dio _dio; + + final Serializers _serializers; + + const HealthApi(this._dio, this._serializers); + + /// Health-Endpoint für Load-Balancer und Container-Probes. Bewusst kein Auth — eine `200 ok`-Antwort darf nicht von der Auth abhängen. + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [String] as data + /// Throws [DioException] if API call or serialization fails + Future> health({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/health'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + String? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : rawResponse as String; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api/scans_api.dart b/packages/holzleitner_api/lib/src/api/scans_api.dart new file mode 100644 index 0000000..4a67cfb --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/scans_api.dart @@ -0,0 +1,123 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:holzleitner_api/src/model/apply_scans_request.dart'; +import 'package:holzleitner_api/src/model/apply_scans_response.dart'; + +class ScansApi { + + final Dio _dio; + + final Serializers _serializers; + + const ScansApi(this._dio, this._serializers); + + /// Wendet eine Liste von Scan-Events idempotent an. + /// Pro Event ein eigenes Resultat. Status `applied` schreibt einen frischen Audit-Eintrag, `duplicate` liefert den aktuellen Stand am Server, `rejected` enthält die Begründung. Reihenfolge der `results` entspricht der Reihenfolge der `scans` im Request. + /// + /// Parameters: + /// * [applyScansRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [ApplyScansResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> applyScans({ + required ApplyScansRequest applyScansRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/scans'; + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(ApplyScansRequest); + _bodyData = _serializers.serialize(applyScansRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + ApplyScansResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(ApplyScansResponse), + ) as ApplyScansResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api/sync_api.dart b/packages/holzleitner_api/lib/src/api/sync_api.dart new file mode 100644 index 0000000..df4b8fc --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/sync_api.dart @@ -0,0 +1,123 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:holzleitner_api/src/model/sync_tour_request.dart'; +import 'package:holzleitner_api/src/model/sync_tour_response.dart'; + +class SyncApi { + + final Dio _dio; + + final Serializers _serializers; + + const SyncApi(this._dio, this._serializers); + + /// Sync-Endpoint für das ERP: legt eine Tagestour samt Lieferungen und Positionen idempotent an. Identität pro Tour `(driver_personalnummer, tour_date)`, pro Lieferung `(belegart_id, belegnummer)`. + /// + /// + /// Parameters: + /// * [syncTourRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [SyncTourResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> syncTour({ + required SyncTourRequest syncTourRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/sync/tour'; + final _options = Options( + method: r'POST', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(SyncTourRequest); + _bodyData = _serializers.serialize(syncTourRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + SyncTourResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(SyncTourResponse), + ) as SyncTourResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api/tours_api.dart b/packages/holzleitner_api/lib/src/api/tours_api.dart new file mode 100644 index 0000000..e1958cf --- /dev/null +++ b/packages/holzleitner_api/lib/src/api/tours_api.dart @@ -0,0 +1,288 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:holzleitner_api/src/api_util.dart'; +import 'package:holzleitner_api/src/model/set_delivery_order_request.dart'; +import 'package:holzleitner_api/src/model/set_delivery_order_response.dart'; +import 'package:holzleitner_api/src/model/tour_details.dart'; +import 'package:holzleitner_api/src/model/tour_summary_list.dart'; + +class ToursApi { + + final Dio _dio; + + final Serializers _serializers; + + const ToursApi(this._dio, this._serializers); + + /// Lädt eine Tour mit allen Lieferungen, Positionen und referenzierten Stammdaten — die App nutzt das als einzigen großen Read. + /// + /// + /// Parameters: + /// * [tourId] - Eindeutige Tour-Id (UUID) + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [TourDetails] as data + /// Throws [DioException] if API call or serialization fails + Future> getTour({ + required String tourId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/tours/{tour_id}'.replaceAll('{' r'tour_id' '}', encodeQueryParameter(_serializers, tourId, const FullType(String)).toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + TourDetails? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(TourDetails), + ) as TourDetails; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Listet heutige Touren des angemeldeten Fahrers (Filter aus dem JWT). + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [TourSummaryList] as data + /// Throws [DioException] if API call or serialization fails + Future> listMyToursToday({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/me/tours/today'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + TourSummaryList? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(TourSummaryList), + ) as TourSummaryList; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu. Der Client schickt die **vollständige** neue Reihenfolge; fehlende oder fremde Lieferungs-Ids werden mit `400 validation` abgelehnt. + /// + /// + /// Parameters: + /// * [tourId] + /// * [setDeliveryOrderRequest] + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [SetDeliveryOrderResponse] as data + /// Throws [DioException] if API call or serialization fails + Future> setDeliveryOrder({ + required String tourId, + required SetDeliveryOrderRequest setDeliveryOrderRequest, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/tours/{tour_id}/delivery-order'.replaceAll('{' r'tour_id' '}', encodeQueryParameter(_serializers, tourId, const FullType(String)).toString()); + final _options = Options( + method: r'PUT', + headers: { + ...?headers, + }, + extra: { + 'secure': >[ + { + 'type': 'http', + 'scheme': 'bearer', + 'name': 'bearer_auth', + }, + ], + ...?extra, + }, + contentType: 'application/json', + validateStatus: validateStatus, + ); + + dynamic _bodyData; + + try { + const _type = FullType(SetDeliveryOrderRequest); + _bodyData = _serializers.serialize(setDeliveryOrderRequest, specifiedType: _type); + + } catch(error, stackTrace) { + throw DioException( + requestOptions: _options.compose( + _dio.options, + _path, + ), + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + final _response = await _dio.request( + _path, + data: _bodyData, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + SetDeliveryOrderResponse? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(SetDeliveryOrderResponse), + ) as SetDeliveryOrderResponse; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/packages/holzleitner_api/lib/src/api_util.dart b/packages/holzleitner_api/lib/src/api_util.dart new file mode 100644 index 0000000..ed3bb12 --- /dev/null +++ b/packages/holzleitner_api/lib/src/api_util.dart @@ -0,0 +1,77 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +/// Format the given form parameter object into something that Dio can handle. +/// Returns primitive or String. +/// Returns List/Map if the value is BuildList/BuiltMap. +dynamic encodeFormParameter(Serializers serializers, dynamic value, FullType type) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (serialized is String) { + return serialized; + } + if (value is BuiltList || value is BuiltSet || value is BuiltMap) { + return serialized; + } + return json.encode(serialized); +} + +dynamic encodeQueryParameter( + Serializers serializers, + dynamic value, + FullType type, +) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + if (value is Uint8List) { + // Currently not sure how to serialize this + return value; + } + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (serialized == null) { + return ''; + } + if (serialized is String) { + return serialized; + } + return serialized; +} + +ListParam encodeCollectionQueryParameter( + Serializers serializers, + dynamic value, + FullType type, { + ListFormat format = ListFormat.multi, +}) { + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (value is BuiltList || value is BuiltSet) { + return ListParam(List.of((serialized as Iterable).cast()), format); + } + throw ArgumentError('Invalid value passed to encodeCollectionQueryParameter'); +} diff --git a/packages/holzleitner_api/lib/src/auth/api_key_auth.dart b/packages/holzleitner_api/lib/src/auth/api_key_auth.dart new file mode 100644 index 0000000..978c4d2 --- /dev/null +++ b/packages/holzleitner_api/lib/src/auth/api_key_auth.dart @@ -0,0 +1,30 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + + +import 'package:dio/dio.dart'; +import 'package:holzleitner_api/src/auth/auth.dart'; + +class ApiKeyAuthInterceptor extends AuthInterceptor { + final Map apiKeys = {}; + + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'apiKey'); + for (final info in authInfo) { + final authName = info['name'] as String; + final authKeyName = info['keyName'] as String; + final authWhere = info['where'] as String; + final apiKey = apiKeys[authName]; + if (apiKey != null) { + if (authWhere == 'query') { + options.queryParameters[authKeyName] = apiKey; + } else { + options.headers[authKeyName] = apiKey; + } + } + } + super.onRequest(options, handler); + } +} diff --git a/packages/holzleitner_api/lib/src/auth/auth.dart b/packages/holzleitner_api/lib/src/auth/auth.dart new file mode 100644 index 0000000..f7ae9bf --- /dev/null +++ b/packages/holzleitner_api/lib/src/auth/auth.dart @@ -0,0 +1,18 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; + +abstract class AuthInterceptor extends Interceptor { + /// Get auth information on given route for the given type. + /// Can return an empty list if type is not present on auth data or + /// if route doesn't need authentication. + List> getAuthInfo(RequestOptions route, bool Function(Map secure) handles) { + if (route.extra.containsKey('secure')) { + final auth = route.extra['secure'] as List>; + return auth.where((secure) => handles(secure)).toList(); + } + return []; + } +} diff --git a/packages/holzleitner_api/lib/src/auth/basic_auth.dart b/packages/holzleitner_api/lib/src/auth/basic_auth.dart new file mode 100644 index 0000000..0264711 --- /dev/null +++ b/packages/holzleitner_api/lib/src/auth/basic_auth.dart @@ -0,0 +1,37 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:holzleitner_api/src/auth/auth.dart'; + +class BasicAuthInfo { + final String username; + final String password; + + const BasicAuthInfo(this.username, this.password); +} + +class BasicAuthInterceptor extends AuthInterceptor { + final Map authInfo = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final metadataAuthInfo = getAuthInfo(options, (secure) => (secure['type'] == 'http' && secure['scheme']?.toLowerCase() == 'basic') || secure['type'] == 'basic'); + for (final info in metadataAuthInfo) { + final authName = info['name'] as String; + final basicAuthInfo = authInfo[authName]; + if (basicAuthInfo != null) { + final basicAuth = 'Basic ${base64Encode(utf8.encode('${basicAuthInfo.username}:${basicAuthInfo.password}'))}'; + options.headers['Authorization'] = basicAuth; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/packages/holzleitner_api/lib/src/auth/bearer_auth.dart b/packages/holzleitner_api/lib/src/auth/bearer_auth.dart new file mode 100644 index 0000000..b904410 --- /dev/null +++ b/packages/holzleitner_api/lib/src/auth/bearer_auth.dart @@ -0,0 +1,26 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:holzleitner_api/src/auth/auth.dart'; + +class BearerAuthInterceptor extends AuthInterceptor { + final Map tokens = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'http' && secure['scheme']?.toLowerCase() == 'bearer'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/packages/holzleitner_api/lib/src/auth/oauth.dart b/packages/holzleitner_api/lib/src/auth/oauth.dart new file mode 100644 index 0000000..7615866 --- /dev/null +++ b/packages/holzleitner_api/lib/src/auth/oauth.dart @@ -0,0 +1,26 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:holzleitner_api/src/auth/auth.dart'; + +class OAuthInterceptor extends AuthInterceptor { + final Map tokens = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'oauth' || secure['type'] == 'oauth2'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/packages/holzleitner_api/lib/src/date_serializer.dart b/packages/holzleitner_api/lib/src/date_serializer.dart new file mode 100644 index 0000000..023f333 --- /dev/null +++ b/packages/holzleitner_api/lib/src/date_serializer.dart @@ -0,0 +1,31 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; +import 'package:holzleitner_api/src/model/date.dart'; + +class DateSerializer implements PrimitiveSerializer { + + const DateSerializer(); + + @override + Iterable get types => BuiltList.of([Date]); + + @override + String get wireName => 'Date'; + + @override + Date deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) { + final parsed = DateTime.parse(serialized as String); + return Date(parsed.year, parsed.month, parsed.day); + } + + @override + Object serialize(Serializers serializers, Date date, + {FullType specifiedType = FullType.unspecified}) { + return date.toString(); + } +} diff --git a/packages/holzleitner_api/lib/src/model/account.dart b/packages/holzleitner_api/lib/src/model/account.dart new file mode 100644 index 0000000..e18852c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/account.dart @@ -0,0 +1,138 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'account.g.dart'; + +/// Account eines Liefer-Unternehmens oder Einzel-Lieferfahrers. Die Personalnummer ist sowohl Primärschlüssel als auch Login-ID. Sie stammt aus dem ERP-Stamm — entweder ein Unternehmen (juristische Person, eigener Personalnummern-Kreis) oder eine natürliche Person. Mehrere physische Fahrer können denselben Account benutzen; das Modell unterscheidet sie nicht, sondern loggt die Aktivität auf [`crate::domain::Car`]- Ebene (siehe Audit-Log). +/// +/// Properties: +/// * [active] +/// * [name] +/// * [personalnummer] +@BuiltValue() +abstract class Account implements Built { + @BuiltValueField(wireName: r'active') + bool get active; + + @BuiltValueField(wireName: r'name') + String get name; + + @BuiltValueField(wireName: r'personalnummer') + int get personalnummer; + + Account._(); + + factory Account([void updates(AccountBuilder b)]) = _$Account; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(AccountBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$AccountSerializer(); +} + +class _$AccountSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Account, _$Account]; + + @override + final String wireName = r'Account'; + + Iterable _serializeProperties( + Serializers serializers, + Account object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'active'; + yield serializers.serialize( + object.active, + specifiedType: const FullType(bool), + ); + yield r'name'; + yield serializers.serialize( + object.name, + specifiedType: const FullType(String), + ); + yield r'personalnummer'; + yield serializers.serialize( + object.personalnummer, + specifiedType: const FullType(int), + ); + } + + @override + Object serialize( + Serializers serializers, + Account object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required AccountBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'active': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.active = valueDes; + break; + case r'name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.name = valueDes; + break; + case r'personalnummer': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.personalnummer = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Account deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = AccountBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/account.g.dart b/packages/holzleitner_api/lib/src/model/account.g.dart new file mode 100644 index 0000000..41bd03c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/account.g.dart @@ -0,0 +1,117 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'account.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Account extends Account { + @override + final bool active; + @override + final String name; + @override + final int personalnummer; + + factory _$Account([void Function(AccountBuilder)? updates]) => + (AccountBuilder()..update(updates))._build(); + + _$Account._( + {required this.active, required this.name, required this.personalnummer}) + : super._(); + @override + Account rebuild(void Function(AccountBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + AccountBuilder toBuilder() => AccountBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Account && + active == other.active && + name == other.name && + personalnummer == other.personalnummer; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, active.hashCode); + _$hash = $jc(_$hash, name.hashCode); + _$hash = $jc(_$hash, personalnummer.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Account') + ..add('active', active) + ..add('name', name) + ..add('personalnummer', personalnummer)) + .toString(); + } +} + +class AccountBuilder implements Builder { + _$Account? _$v; + + bool? _active; + bool? get active => _$this._active; + set active(bool? active) => _$this._active = active; + + String? _name; + String? get name => _$this._name; + set name(String? name) => _$this._name = name; + + int? _personalnummer; + int? get personalnummer => _$this._personalnummer; + set personalnummer(int? personalnummer) => + _$this._personalnummer = personalnummer; + + AccountBuilder() { + Account._defaults(this); + } + + AccountBuilder get _$this { + final $v = _$v; + if ($v != null) { + _active = $v.active; + _name = $v.name; + _personalnummer = $v.personalnummer; + _$v = null; + } + return this; + } + + @override + void replace(Account other) { + _$v = other as _$Account; + } + + @override + void update(void Function(AccountBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Account build() => _build(); + + _$Account _build() { + final _$result = _$v ?? + _$Account._( + active: BuiltValueNullFieldError.checkNotNull( + active, r'Account', 'active'), + name: BuiltValueNullFieldError.checkNotNull(name, r'Account', 'name'), + personalnummer: BuiltValueNullFieldError.checkNotNull( + personalnummer, r'Account', 'personalnummer'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/address.dart b/packages/holzleitner_api/lib/src/model/address.dart new file mode 100644 index 0000000..e179316 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/address.dart @@ -0,0 +1,170 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'address.g.dart'; + +/// Postanschrift — wird sowohl als aktuelle Kundenanschrift in [`Customer`] als auch als unveränderlicher Snapshot in [`crate::domain::Delivery`] verwendet (`delivery_address_snapshot`). Bewusst als Value Object modelliert: gleiche Adresse = gleicher Wert. Strikte Equality erleichtert Sync-Diffs zwischen ERP und Backend. [`Customer`]: crate::domain::Customer +/// +/// Properties: +/// * [city] +/// * [country] +/// * [houseNumber] +/// * [postalCode] +/// * [street] +@BuiltValue() +abstract class Address implements Built { + @BuiltValueField(wireName: r'city') + String get city; + + @BuiltValueField(wireName: r'country') + String get country; + + @BuiltValueField(wireName: r'houseNumber') + String get houseNumber; + + @BuiltValueField(wireName: r'postalCode') + String get postalCode; + + @BuiltValueField(wireName: r'street') + String get street; + + Address._(); + + factory Address([void updates(AddressBuilder b)]) = _$Address; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(AddressBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer
get serializer => _$AddressSerializer(); +} + +class _$AddressSerializer implements PrimitiveSerializer
{ + @override + final Iterable types = const [Address, _$Address]; + + @override + final String wireName = r'Address'; + + Iterable _serializeProperties( + Serializers serializers, + Address object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'city'; + yield serializers.serialize( + object.city, + specifiedType: const FullType(String), + ); + yield r'country'; + yield serializers.serialize( + object.country, + specifiedType: const FullType(String), + ); + yield r'houseNumber'; + yield serializers.serialize( + object.houseNumber, + specifiedType: const FullType(String), + ); + yield r'postalCode'; + yield serializers.serialize( + object.postalCode, + specifiedType: const FullType(String), + ); + yield r'street'; + yield serializers.serialize( + object.street, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + Address object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required AddressBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'city': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.city = valueDes; + break; + case r'country': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.country = valueDes; + break; + case r'houseNumber': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.houseNumber = valueDes; + break; + case r'postalCode': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.postalCode = valueDes; + break; + case r'street': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.street = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Address deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = AddressBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/address.g.dart b/packages/holzleitner_api/lib/src/model/address.g.dart new file mode 100644 index 0000000..c3c79e2 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/address.g.dart @@ -0,0 +1,144 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'address.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Address extends Address { + @override + final String city; + @override + final String country; + @override + final String houseNumber; + @override + final String postalCode; + @override + final String street; + + factory _$Address([void Function(AddressBuilder)? updates]) => + (AddressBuilder()..update(updates))._build(); + + _$Address._( + {required this.city, + required this.country, + required this.houseNumber, + required this.postalCode, + required this.street}) + : super._(); + @override + Address rebuild(void Function(AddressBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + AddressBuilder toBuilder() => AddressBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Address && + city == other.city && + country == other.country && + houseNumber == other.houseNumber && + postalCode == other.postalCode && + street == other.street; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, city.hashCode); + _$hash = $jc(_$hash, country.hashCode); + _$hash = $jc(_$hash, houseNumber.hashCode); + _$hash = $jc(_$hash, postalCode.hashCode); + _$hash = $jc(_$hash, street.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Address') + ..add('city', city) + ..add('country', country) + ..add('houseNumber', houseNumber) + ..add('postalCode', postalCode) + ..add('street', street)) + .toString(); + } +} + +class AddressBuilder implements Builder { + _$Address? _$v; + + String? _city; + String? get city => _$this._city; + set city(String? city) => _$this._city = city; + + String? _country; + String? get country => _$this._country; + set country(String? country) => _$this._country = country; + + String? _houseNumber; + String? get houseNumber => _$this._houseNumber; + set houseNumber(String? houseNumber) => _$this._houseNumber = houseNumber; + + String? _postalCode; + String? get postalCode => _$this._postalCode; + set postalCode(String? postalCode) => _$this._postalCode = postalCode; + + String? _street; + String? get street => _$this._street; + set street(String? street) => _$this._street = street; + + AddressBuilder() { + Address._defaults(this); + } + + AddressBuilder get _$this { + final $v = _$v; + if ($v != null) { + _city = $v.city; + _country = $v.country; + _houseNumber = $v.houseNumber; + _postalCode = $v.postalCode; + _street = $v.street; + _$v = null; + } + return this; + } + + @override + void replace(Address other) { + _$v = other as _$Address; + } + + @override + void update(void Function(AddressBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Address build() => _build(); + + _$Address _build() { + final _$result = _$v ?? + _$Address._( + city: BuiltValueNullFieldError.checkNotNull(city, r'Address', 'city'), + country: BuiltValueNullFieldError.checkNotNull( + country, r'Address', 'country'), + houseNumber: BuiltValueNullFieldError.checkNotNull( + houseNumber, r'Address', 'houseNumber'), + postalCode: BuiltValueNullFieldError.checkNotNull( + postalCode, r'Address', 'postalCode'), + street: BuiltValueNullFieldError.checkNotNull( + street, r'Address', 'street'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/apply_scans_request.dart b/packages/holzleitner_api/lib/src/model/apply_scans_request.dart new file mode 100644 index 0000000..3bfc8b9 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/apply_scans_request.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:holzleitner_api/src/model/scan_event.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'apply_scans_request.g.dart'; + +/// ApplyScansRequest +/// +/// Properties: +/// * [scans] +@BuiltValue() +abstract class ApplyScansRequest implements Built { + @BuiltValueField(wireName: r'scans') + BuiltList get scans; + + ApplyScansRequest._(); + + factory ApplyScansRequest([void updates(ApplyScansRequestBuilder b)]) = _$ApplyScansRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ApplyScansRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ApplyScansRequestSerializer(); +} + +class _$ApplyScansRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [ApplyScansRequest, _$ApplyScansRequest]; + + @override + final String wireName = r'ApplyScansRequest'; + + Iterable _serializeProperties( + Serializers serializers, + ApplyScansRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'scans'; + yield serializers.serialize( + object.scans, + specifiedType: const FullType(BuiltList, [FullType(ScanEvent)]), + ); + } + + @override + Object serialize( + Serializers serializers, + ApplyScansRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required ApplyScansRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'scans': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(ScanEvent)]), + ) as BuiltList; + result.scans.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + ApplyScansRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = ApplyScansRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/apply_scans_request.g.dart b/packages/holzleitner_api/lib/src/model/apply_scans_request.g.dart new file mode 100644 index 0000000..72ba93c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/apply_scans_request.g.dart @@ -0,0 +1,106 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'apply_scans_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$ApplyScansRequest extends ApplyScansRequest { + @override + final BuiltList scans; + + factory _$ApplyScansRequest( + [void Function(ApplyScansRequestBuilder)? updates]) => + (ApplyScansRequestBuilder()..update(updates))._build(); + + _$ApplyScansRequest._({required this.scans}) : super._(); + @override + ApplyScansRequest rebuild(void Function(ApplyScansRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + ApplyScansRequestBuilder toBuilder() => + ApplyScansRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ApplyScansRequest && scans == other.scans; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, scans.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ApplyScansRequest') + ..add('scans', scans)) + .toString(); + } +} + +class ApplyScansRequestBuilder + implements Builder { + _$ApplyScansRequest? _$v; + + ListBuilder? _scans; + ListBuilder get scans => + _$this._scans ??= ListBuilder(); + set scans(ListBuilder? scans) => _$this._scans = scans; + + ApplyScansRequestBuilder() { + ApplyScansRequest._defaults(this); + } + + ApplyScansRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _scans = $v.scans.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(ApplyScansRequest other) { + _$v = other as _$ApplyScansRequest; + } + + @override + void update(void Function(ApplyScansRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ApplyScansRequest build() => _build(); + + _$ApplyScansRequest _build() { + _$ApplyScansRequest _$result; + try { + _$result = _$v ?? + _$ApplyScansRequest._( + scans: scans.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'scans'; + scans.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'ApplyScansRequest', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/apply_scans_response.dart b/packages/holzleitner_api/lib/src/model/apply_scans_response.dart new file mode 100644 index 0000000..ae7262b --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/apply_scans_response.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/scan_result.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'apply_scans_response.g.dart'; + +/// ApplyScansResponse +/// +/// Properties: +/// * [results] +@BuiltValue() +abstract class ApplyScansResponse implements Built { + @BuiltValueField(wireName: r'results') + BuiltList get results; + + ApplyScansResponse._(); + + factory ApplyScansResponse([void updates(ApplyScansResponseBuilder b)]) = _$ApplyScansResponse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ApplyScansResponseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ApplyScansResponseSerializer(); +} + +class _$ApplyScansResponseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [ApplyScansResponse, _$ApplyScansResponse]; + + @override + final String wireName = r'ApplyScansResponse'; + + Iterable _serializeProperties( + Serializers serializers, + ApplyScansResponse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'results'; + yield serializers.serialize( + object.results, + specifiedType: const FullType(BuiltList, [FullType(ScanResult)]), + ); + } + + @override + Object serialize( + Serializers serializers, + ApplyScansResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required ApplyScansResponseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'results': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(ScanResult)]), + ) as BuiltList; + result.results.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + ApplyScansResponse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = ApplyScansResponseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/apply_scans_response.g.dart b/packages/holzleitner_api/lib/src/model/apply_scans_response.g.dart new file mode 100644 index 0000000..f99c79f --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/apply_scans_response.g.dart @@ -0,0 +1,107 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'apply_scans_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$ApplyScansResponse extends ApplyScansResponse { + @override + final BuiltList results; + + factory _$ApplyScansResponse( + [void Function(ApplyScansResponseBuilder)? updates]) => + (ApplyScansResponseBuilder()..update(updates))._build(); + + _$ApplyScansResponse._({required this.results}) : super._(); + @override + ApplyScansResponse rebuild( + void Function(ApplyScansResponseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + ApplyScansResponseBuilder toBuilder() => + ApplyScansResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ApplyScansResponse && results == other.results; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, results.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ApplyScansResponse') + ..add('results', results)) + .toString(); + } +} + +class ApplyScansResponseBuilder + implements Builder { + _$ApplyScansResponse? _$v; + + ListBuilder? _results; + ListBuilder get results => + _$this._results ??= ListBuilder(); + set results(ListBuilder? results) => _$this._results = results; + + ApplyScansResponseBuilder() { + ApplyScansResponse._defaults(this); + } + + ApplyScansResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _results = $v.results.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(ApplyScansResponse other) { + _$v = other as _$ApplyScansResponse; + } + + @override + void update(void Function(ApplyScansResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ApplyScansResponse build() => _build(); + + _$ApplyScansResponse _build() { + _$ApplyScansResponse _$result; + try { + _$result = _$v ?? + _$ApplyScansResponse._( + results: results.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'results'; + results.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'ApplyScansResponse', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/article.dart b/packages/holzleitner_api/lib/src/model/article.dart new file mode 100644 index 0000000..edaa027 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/article.dart @@ -0,0 +1,173 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'article.g.dart'; + +/// Artikel. ERP-Mirror; die `article_number` ist die business-stabile Artikelnummer aus dem ERP-Stamm und dient gleichzeitig als Brücke. `scannable = false` markiert nicht-physische Positionen wie Dienstleistungen, Versandpauschalen o.ä. — sie tauchen zwar als `DeliveryItem` auf, blockieren aber den Beladen-Fortschritt nicht. +/// +/// Properties: +/// * [articleNumber] +/// * [defaultWarehouseId] +/// * [id] +/// * [name] +/// * [scannable] +@BuiltValue() +abstract class Article implements Built { + @BuiltValueField(wireName: r'articleNumber') + String get articleNumber; + + @BuiltValueField(wireName: r'defaultWarehouseId') + String? get defaultWarehouseId; + + @BuiltValueField(wireName: r'id') + String get id; + + @BuiltValueField(wireName: r'name') + String get name; + + @BuiltValueField(wireName: r'scannable') + bool get scannable; + + Article._(); + + factory Article([void updates(ArticleBuilder b)]) = _$Article; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ArticleBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer
get serializer => _$ArticleSerializer(); +} + +class _$ArticleSerializer implements PrimitiveSerializer
{ + @override + final Iterable types = const [Article, _$Article]; + + @override + final String wireName = r'Article'; + + Iterable _serializeProperties( + Serializers serializers, + Article object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'articleNumber'; + yield serializers.serialize( + object.articleNumber, + specifiedType: const FullType(String), + ); + if (object.defaultWarehouseId != null) { + yield r'defaultWarehouseId'; + yield serializers.serialize( + object.defaultWarehouseId, + specifiedType: const FullType.nullable(String), + ); + } + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'name'; + yield serializers.serialize( + object.name, + specifiedType: const FullType(String), + ); + yield r'scannable'; + yield serializers.serialize( + object.scannable, + specifiedType: const FullType(bool), + ); + } + + @override + Object serialize( + Serializers serializers, + Article object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required ArticleBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'articleNumber': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.articleNumber = valueDes; + break; + case r'defaultWarehouseId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.defaultWarehouseId = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.name = valueDes; + break; + case r'scannable': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.scannable = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Article deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = ArticleBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/article.g.dart b/packages/holzleitner_api/lib/src/model/article.g.dart new file mode 100644 index 0000000..7b469a2 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/article.g.dart @@ -0,0 +1,144 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'article.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Article extends Article { + @override + final String articleNumber; + @override + final String? defaultWarehouseId; + @override + final String id; + @override + final String name; + @override + final bool scannable; + + factory _$Article([void Function(ArticleBuilder)? updates]) => + (ArticleBuilder()..update(updates))._build(); + + _$Article._( + {required this.articleNumber, + this.defaultWarehouseId, + required this.id, + required this.name, + required this.scannable}) + : super._(); + @override + Article rebuild(void Function(ArticleBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + ArticleBuilder toBuilder() => ArticleBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Article && + articleNumber == other.articleNumber && + defaultWarehouseId == other.defaultWarehouseId && + id == other.id && + name == other.name && + scannable == other.scannable; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, articleNumber.hashCode); + _$hash = $jc(_$hash, defaultWarehouseId.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, name.hashCode); + _$hash = $jc(_$hash, scannable.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Article') + ..add('articleNumber', articleNumber) + ..add('defaultWarehouseId', defaultWarehouseId) + ..add('id', id) + ..add('name', name) + ..add('scannable', scannable)) + .toString(); + } +} + +class ArticleBuilder implements Builder { + _$Article? _$v; + + String? _articleNumber; + String? get articleNumber => _$this._articleNumber; + set articleNumber(String? articleNumber) => + _$this._articleNumber = articleNumber; + + String? _defaultWarehouseId; + String? get defaultWarehouseId => _$this._defaultWarehouseId; + set defaultWarehouseId(String? defaultWarehouseId) => + _$this._defaultWarehouseId = defaultWarehouseId; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _name; + String? get name => _$this._name; + set name(String? name) => _$this._name = name; + + bool? _scannable; + bool? get scannable => _$this._scannable; + set scannable(bool? scannable) => _$this._scannable = scannable; + + ArticleBuilder() { + Article._defaults(this); + } + + ArticleBuilder get _$this { + final $v = _$v; + if ($v != null) { + _articleNumber = $v.articleNumber; + _defaultWarehouseId = $v.defaultWarehouseId; + _id = $v.id; + _name = $v.name; + _scannable = $v.scannable; + _$v = null; + } + return this; + } + + @override + void replace(Article other) { + _$v = other as _$Article; + } + + @override + void update(void Function(ArticleBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Article build() => _build(); + + _$Article _build() { + final _$result = _$v ?? + _$Article._( + articleNumber: BuiltValueNullFieldError.checkNotNull( + articleNumber, r'Article', 'articleNumber'), + defaultWarehouseId: defaultWarehouseId, + id: BuiltValueNullFieldError.checkNotNull(id, r'Article', 'id'), + name: BuiltValueNullFieldError.checkNotNull(name, r'Article', 'name'), + scannable: BuiltValueNullFieldError.checkNotNull( + scannable, r'Article', 'scannable'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/assign_car_request.dart b/packages/holzleitner_api/lib/src/model/assign_car_request.dart new file mode 100644 index 0000000..f1e63c6 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/assign_car_request.dart @@ -0,0 +1,109 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'assign_car_request.g.dart'; + +/// Setzt das `assigned_car_id` einer Lieferung. `None` (`carId: null`) entfernt die Zuordnung. +/// +/// Properties: +/// * [carId] +@BuiltValue() +abstract class AssignCarRequest implements Built { + @BuiltValueField(wireName: r'carId') + String? get carId; + + AssignCarRequest._(); + + factory AssignCarRequest([void updates(AssignCarRequestBuilder b)]) = _$AssignCarRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(AssignCarRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$AssignCarRequestSerializer(); +} + +class _$AssignCarRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [AssignCarRequest, _$AssignCarRequest]; + + @override + final String wireName = r'AssignCarRequest'; + + Iterable _serializeProperties( + Serializers serializers, + AssignCarRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.carId != null) { + yield r'carId'; + yield serializers.serialize( + object.carId, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + AssignCarRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required AssignCarRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'carId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.carId = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + AssignCarRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = AssignCarRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/assign_car_request.g.dart b/packages/holzleitner_api/lib/src/model/assign_car_request.g.dart new file mode 100644 index 0000000..aec089b --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/assign_car_request.g.dart @@ -0,0 +1,92 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'assign_car_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$AssignCarRequest extends AssignCarRequest { + @override + final String? carId; + + factory _$AssignCarRequest( + [void Function(AssignCarRequestBuilder)? updates]) => + (AssignCarRequestBuilder()..update(updates))._build(); + + _$AssignCarRequest._({this.carId}) : super._(); + @override + AssignCarRequest rebuild(void Function(AssignCarRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + AssignCarRequestBuilder toBuilder() => + AssignCarRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is AssignCarRequest && carId == other.carId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, carId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'AssignCarRequest') + ..add('carId', carId)) + .toString(); + } +} + +class AssignCarRequestBuilder + implements Builder { + _$AssignCarRequest? _$v; + + String? _carId; + String? get carId => _$this._carId; + set carId(String? carId) => _$this._carId = carId; + + AssignCarRequestBuilder() { + AssignCarRequest._defaults(this); + } + + AssignCarRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _carId = $v.carId; + _$v = null; + } + return this; + } + + @override + void replace(AssignCarRequest other) { + _$v = other as _$AssignCarRequest; + } + + @override + void update(void Function(AssignCarRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + AssignCarRequest build() => _build(); + + _$AssignCarRequest _build() { + final _$result = _$v ?? + _$AssignCarRequest._( + carId: carId, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/audit_action.dart b/packages/holzleitner_api/lib/src/model/audit_action.dart new file mode 100644 index 0000000..2469092 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/audit_action.dart @@ -0,0 +1,45 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'audit_action.g.dart'; + +class AuditAction extends EnumClass { + + /// Aktion-Typen im Scan-Audit-Log. * `Scan` / `Unscan` verändern die `scanned_quantity` (+1 / -1). * `Hold` / `Unhold` ändern nur den Status, keine Menge. * `Remove` markiert die Position als entfernt (Status `Removed`, z. B. weil der Kunde sie nicht annimmt). + @BuiltValueEnumConst(wireName: r'scan') + static const AuditAction scan = _$scan; + /// Aktion-Typen im Scan-Audit-Log. * `Scan` / `Unscan` verändern die `scanned_quantity` (+1 / -1). * `Hold` / `Unhold` ändern nur den Status, keine Menge. * `Remove` markiert die Position als entfernt (Status `Removed`, z. B. weil der Kunde sie nicht annimmt). + @BuiltValueEnumConst(wireName: r'unscan') + static const AuditAction unscan = _$unscan; + /// Aktion-Typen im Scan-Audit-Log. * `Scan` / `Unscan` verändern die `scanned_quantity` (+1 / -1). * `Hold` / `Unhold` ändern nur den Status, keine Menge. * `Remove` markiert die Position als entfernt (Status `Removed`, z. B. weil der Kunde sie nicht annimmt). + @BuiltValueEnumConst(wireName: r'hold') + static const AuditAction hold = _$hold; + /// Aktion-Typen im Scan-Audit-Log. * `Scan` / `Unscan` verändern die `scanned_quantity` (+1 / -1). * `Hold` / `Unhold` ändern nur den Status, keine Menge. * `Remove` markiert die Position als entfernt (Status `Removed`, z. B. weil der Kunde sie nicht annimmt). + @BuiltValueEnumConst(wireName: r'unhold') + static const AuditAction unhold = _$unhold; + /// Aktion-Typen im Scan-Audit-Log. * `Scan` / `Unscan` verändern die `scanned_quantity` (+1 / -1). * `Hold` / `Unhold` ändern nur den Status, keine Menge. * `Remove` markiert die Position als entfernt (Status `Removed`, z. B. weil der Kunde sie nicht annimmt). + @BuiltValueEnumConst(wireName: r'remove') + static const AuditAction remove = _$remove; + + static Serializer get serializer => _$auditActionSerializer; + + const AuditAction._(String name): super(name); + + static BuiltSet get values => _$values; + static AuditAction valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class AuditActionMixin = Object with _$AuditActionMixin; + diff --git a/packages/holzleitner_api/lib/src/model/audit_action.g.dart b/packages/holzleitner_api/lib/src/model/audit_action.g.dart new file mode 100644 index 0000000..5c3075c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/audit_action.g.dart @@ -0,0 +1,92 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'audit_action.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +const AuditAction _$scan = const AuditAction._('scan'); +const AuditAction _$unscan = const AuditAction._('unscan'); +const AuditAction _$hold = const AuditAction._('hold'); +const AuditAction _$unhold = const AuditAction._('unhold'); +const AuditAction _$remove = const AuditAction._('remove'); + +AuditAction _$valueOf(String name) { + switch (name) { + case 'scan': + return _$scan; + case 'unscan': + return _$unscan; + case 'hold': + return _$hold; + case 'unhold': + return _$unhold; + case 'remove': + return _$remove; + default: + throw ArgumentError(name); + } +} + +final BuiltSet _$values = + BuiltSet(const [ + _$scan, + _$unscan, + _$hold, + _$unhold, + _$remove, +]); + +class _$AuditActionMeta { + const _$AuditActionMeta(); + AuditAction get scan => _$scan; + AuditAction get unscan => _$unscan; + AuditAction get hold => _$hold; + AuditAction get unhold => _$unhold; + AuditAction get remove => _$remove; + AuditAction valueOf(String name) => _$valueOf(name); + BuiltSet get values => _$values; +} + +abstract class _$AuditActionMixin { + // ignore: non_constant_identifier_names + _$AuditActionMeta get AuditAction => const _$AuditActionMeta(); +} + +Serializer _$auditActionSerializer = _$AuditActionSerializer(); + +class _$AuditActionSerializer implements PrimitiveSerializer { + static const Map _toWire = const { + 'scan': 'scan', + 'unscan': 'unscan', + 'hold': 'hold', + 'unhold': 'unhold', + 'remove': 'remove', + }; + static const Map _fromWire = const { + 'scan': 'scan', + 'unscan': 'unscan', + 'hold': 'hold', + 'unhold': 'unhold', + 'remove': 'remove', + }; + + @override + final Iterable types = const [AuditAction]; + @override + final String wireName = 'AuditAction'; + + @override + Object serialize(Serializers serializers, AuditAction object, + {FullType specifiedType = FullType.unspecified}) => + _toWire[object.name] ?? object.name; + + @override + AuditAction deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) => + AuditAction.valueOf( + _fromWire[serialized] ?? (serialized is String ? serialized : '')); +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/cancel_delivery_request.dart b/packages/holzleitner_api/lib/src/model/cancel_delivery_request.dart new file mode 100644 index 0000000..2b86160 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/cancel_delivery_request.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'cancel_delivery_request.g.dart'; + +/// CancelDeliveryRequest +/// +/// Properties: +/// * [reason] +@BuiltValue() +abstract class CancelDeliveryRequest implements Built { + @BuiltValueField(wireName: r'reason') + String get reason; + + CancelDeliveryRequest._(); + + factory CancelDeliveryRequest([void updates(CancelDeliveryRequestBuilder b)]) = _$CancelDeliveryRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CancelDeliveryRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CancelDeliveryRequestSerializer(); +} + +class _$CancelDeliveryRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [CancelDeliveryRequest, _$CancelDeliveryRequest]; + + @override + final String wireName = r'CancelDeliveryRequest'; + + Iterable _serializeProperties( + Serializers serializers, + CancelDeliveryRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'reason'; + yield serializers.serialize( + object.reason, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + CancelDeliveryRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CancelDeliveryRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'reason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.reason = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + CancelDeliveryRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CancelDeliveryRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/cancel_delivery_request.g.dart b/packages/holzleitner_api/lib/src/model/cancel_delivery_request.g.dart new file mode 100644 index 0000000..8c3577c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/cancel_delivery_request.g.dart @@ -0,0 +1,94 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'cancel_delivery_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$CancelDeliveryRequest extends CancelDeliveryRequest { + @override + final String reason; + + factory _$CancelDeliveryRequest( + [void Function(CancelDeliveryRequestBuilder)? updates]) => + (CancelDeliveryRequestBuilder()..update(updates))._build(); + + _$CancelDeliveryRequest._({required this.reason}) : super._(); + @override + CancelDeliveryRequest rebuild( + void Function(CancelDeliveryRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CancelDeliveryRequestBuilder toBuilder() => + CancelDeliveryRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is CancelDeliveryRequest && reason == other.reason; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, reason.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'CancelDeliveryRequest') + ..add('reason', reason)) + .toString(); + } +} + +class CancelDeliveryRequestBuilder + implements Builder { + _$CancelDeliveryRequest? _$v; + + String? _reason; + String? get reason => _$this._reason; + set reason(String? reason) => _$this._reason = reason; + + CancelDeliveryRequestBuilder() { + CancelDeliveryRequest._defaults(this); + } + + CancelDeliveryRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _reason = $v.reason; + _$v = null; + } + return this; + } + + @override + void replace(CancelDeliveryRequest other) { + _$v = other as _$CancelDeliveryRequest; + } + + @override + void update(void Function(CancelDeliveryRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + CancelDeliveryRequest build() => _build(); + + _$CancelDeliveryRequest _build() { + final _$result = _$v ?? + _$CancelDeliveryRequest._( + reason: BuiltValueNullFieldError.checkNotNull( + reason, r'CancelDeliveryRequest', 'reason'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/car.dart b/packages/holzleitner_api/lib/src/model/car.dart new file mode 100644 index 0000000..4a393a5 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/car.dart @@ -0,0 +1,155 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'car.g.dart'; + +/// Fahrzeug eines [`crate::domain::Account`]. Wird in der App selbst gepflegt — kein ERP-Spiegel. Eindeutig per UUID. Im Audit-Log ist der `Car` der „Akteur\": die Personalnummer-Ebene (Account) ist gröber und unterscheidet nicht zwischen mehreren gleichzeitig aktiven Fahrern desselben Subunternehmens. +/// +/// Properties: +/// * [accountId] - Verweis auf [`crate::domain::Account::personalnummer`]. +/// * [active] +/// * [id] +/// * [plate] +@BuiltValue() +abstract class Car implements Built { + /// Verweis auf [`crate::domain::Account::personalnummer`]. + @BuiltValueField(wireName: r'accountId') + int get accountId; + + @BuiltValueField(wireName: r'active') + bool get active; + + @BuiltValueField(wireName: r'id') + String get id; + + @BuiltValueField(wireName: r'plate') + String get plate; + + Car._(); + + factory Car([void updates(CarBuilder b)]) = _$Car; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CarBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CarSerializer(); +} + +class _$CarSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Car, _$Car]; + + @override + final String wireName = r'Car'; + + Iterable _serializeProperties( + Serializers serializers, + Car object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'accountId'; + yield serializers.serialize( + object.accountId, + specifiedType: const FullType(int), + ); + yield r'active'; + yield serializers.serialize( + object.active, + specifiedType: const FullType(bool), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'plate'; + yield serializers.serialize( + object.plate, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + Car object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CarBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'accountId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.accountId = valueDes; + break; + case r'active': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.active = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'plate': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.plate = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Car deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CarBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/car.g.dart b/packages/holzleitner_api/lib/src/model/car.g.dart new file mode 100644 index 0000000..a709750 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/car.g.dart @@ -0,0 +1,130 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'car.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Car extends Car { + @override + final int accountId; + @override + final bool active; + @override + final String id; + @override + final String plate; + + factory _$Car([void Function(CarBuilder)? updates]) => + (CarBuilder()..update(updates))._build(); + + _$Car._( + {required this.accountId, + required this.active, + required this.id, + required this.plate}) + : super._(); + @override + Car rebuild(void Function(CarBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CarBuilder toBuilder() => CarBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Car && + accountId == other.accountId && + active == other.active && + id == other.id && + plate == other.plate; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, accountId.hashCode); + _$hash = $jc(_$hash, active.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, plate.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Car') + ..add('accountId', accountId) + ..add('active', active) + ..add('id', id) + ..add('plate', plate)) + .toString(); + } +} + +class CarBuilder implements Builder { + _$Car? _$v; + + int? _accountId; + int? get accountId => _$this._accountId; + set accountId(int? accountId) => _$this._accountId = accountId; + + bool? _active; + bool? get active => _$this._active; + set active(bool? active) => _$this._active = active; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _plate; + String? get plate => _$this._plate; + set plate(String? plate) => _$this._plate = plate; + + CarBuilder() { + Car._defaults(this); + } + + CarBuilder get _$this { + final $v = _$v; + if ($v != null) { + _accountId = $v.accountId; + _active = $v.active; + _id = $v.id; + _plate = $v.plate; + _$v = null; + } + return this; + } + + @override + void replace(Car other) { + _$v = other as _$Car; + } + + @override + void update(void Function(CarBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Car build() => _build(); + + _$Car _build() { + final _$result = _$v ?? + _$Car._( + accountId: BuiltValueNullFieldError.checkNotNull( + accountId, r'Car', 'accountId'), + active: + BuiltValueNullFieldError.checkNotNull(active, r'Car', 'active'), + id: BuiltValueNullFieldError.checkNotNull(id, r'Car', 'id'), + plate: BuiltValueNullFieldError.checkNotNull(plate, r'Car', 'plate'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/car_response.dart b/packages/holzleitner_api/lib/src/model/car_response.dart new file mode 100644 index 0000000..39a51ca --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/car_response.dart @@ -0,0 +1,107 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/car.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'car_response.g.dart'; + +/// CarResponse +/// +/// Properties: +/// * [car] +@BuiltValue() +abstract class CarResponse implements Built { + @BuiltValueField(wireName: r'car') + Car get car; + + CarResponse._(); + + factory CarResponse([void updates(CarResponseBuilder b)]) = _$CarResponse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CarResponseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CarResponseSerializer(); +} + +class _$CarResponseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [CarResponse, _$CarResponse]; + + @override + final String wireName = r'CarResponse'; + + Iterable _serializeProperties( + Serializers serializers, + CarResponse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'car'; + yield serializers.serialize( + object.car, + specifiedType: const FullType(Car), + ); + } + + @override + Object serialize( + Serializers serializers, + CarResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CarResponseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'car': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Car), + ) as Car; + result.car.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + CarResponse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CarResponseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/car_response.g.dart b/packages/holzleitner_api/lib/src/model/car_response.g.dart new file mode 100644 index 0000000..2b55f2e --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/car_response.g.dart @@ -0,0 +1,101 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'car_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$CarResponse extends CarResponse { + @override + final Car car; + + factory _$CarResponse([void Function(CarResponseBuilder)? updates]) => + (CarResponseBuilder()..update(updates))._build(); + + _$CarResponse._({required this.car}) : super._(); + @override + CarResponse rebuild(void Function(CarResponseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CarResponseBuilder toBuilder() => CarResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is CarResponse && car == other.car; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, car.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'CarResponse')..add('car', car)) + .toString(); + } +} + +class CarResponseBuilder implements Builder { + _$CarResponse? _$v; + + CarBuilder? _car; + CarBuilder get car => _$this._car ??= CarBuilder(); + set car(CarBuilder? car) => _$this._car = car; + + CarResponseBuilder() { + CarResponse._defaults(this); + } + + CarResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _car = $v.car.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(CarResponse other) { + _$v = other as _$CarResponse; + } + + @override + void update(void Function(CarResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + CarResponse build() => _build(); + + _$CarResponse _build() { + _$CarResponse _$result; + try { + _$result = _$v ?? + _$CarResponse._( + car: car.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'car'; + car.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'CarResponse', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/cars_list.dart b/packages/holzleitner_api/lib/src/model/cars_list.dart new file mode 100644 index 0000000..ca07222 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/cars_list.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:holzleitner_api/src/model/car.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'cars_list.g.dart'; + +/// CarsList +/// +/// Properties: +/// * [cars] +@BuiltValue() +abstract class CarsList implements Built { + @BuiltValueField(wireName: r'cars') + BuiltList get cars; + + CarsList._(); + + factory CarsList([void updates(CarsListBuilder b)]) = _$CarsList; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CarsListBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CarsListSerializer(); +} + +class _$CarsListSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [CarsList, _$CarsList]; + + @override + final String wireName = r'CarsList'; + + Iterable _serializeProperties( + Serializers serializers, + CarsList object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'cars'; + yield serializers.serialize( + object.cars, + specifiedType: const FullType(BuiltList, [FullType(Car)]), + ); + } + + @override + Object serialize( + Serializers serializers, + CarsList object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CarsListBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'cars': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(Car)]), + ) as BuiltList; + result.cars.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + CarsList deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CarsListBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/cars_list.g.dart b/packages/holzleitner_api/lib/src/model/cars_list.g.dart new file mode 100644 index 0000000..a4b4209 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/cars_list.g.dart @@ -0,0 +1,101 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'cars_list.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$CarsList extends CarsList { + @override + final BuiltList cars; + + factory _$CarsList([void Function(CarsListBuilder)? updates]) => + (CarsListBuilder()..update(updates))._build(); + + _$CarsList._({required this.cars}) : super._(); + @override + CarsList rebuild(void Function(CarsListBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CarsListBuilder toBuilder() => CarsListBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is CarsList && cars == other.cars; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, cars.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'CarsList')..add('cars', cars)) + .toString(); + } +} + +class CarsListBuilder implements Builder { + _$CarsList? _$v; + + ListBuilder? _cars; + ListBuilder get cars => _$this._cars ??= ListBuilder(); + set cars(ListBuilder? cars) => _$this._cars = cars; + + CarsListBuilder() { + CarsList._defaults(this); + } + + CarsListBuilder get _$this { + final $v = _$v; + if ($v != null) { + _cars = $v.cars.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(CarsList other) { + _$v = other as _$CarsList; + } + + @override + void update(void Function(CarsListBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + CarsList build() => _build(); + + _$CarsList _build() { + _$CarsList _$result; + try { + _$result = _$v ?? + _$CarsList._( + cars: cars.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'cars'; + cars.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'CarsList', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/create_car_request.dart b/packages/holzleitner_api/lib/src/model/create_car_request.dart new file mode 100644 index 0000000..6dc610f --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/create_car_request.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'create_car_request.g.dart'; + +/// CreateCarRequest +/// +/// Properties: +/// * [plate] +@BuiltValue() +abstract class CreateCarRequest implements Built { + @BuiltValueField(wireName: r'plate') + String get plate; + + CreateCarRequest._(); + + factory CreateCarRequest([void updates(CreateCarRequestBuilder b)]) = _$CreateCarRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CreateCarRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CreateCarRequestSerializer(); +} + +class _$CreateCarRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [CreateCarRequest, _$CreateCarRequest]; + + @override + final String wireName = r'CreateCarRequest'; + + Iterable _serializeProperties( + Serializers serializers, + CreateCarRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'plate'; + yield serializers.serialize( + object.plate, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + CreateCarRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CreateCarRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'plate': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.plate = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + CreateCarRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CreateCarRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/create_car_request.g.dart b/packages/holzleitner_api/lib/src/model/create_car_request.g.dart new file mode 100644 index 0000000..a9a86bb --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/create_car_request.g.dart @@ -0,0 +1,93 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'create_car_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$CreateCarRequest extends CreateCarRequest { + @override + final String plate; + + factory _$CreateCarRequest( + [void Function(CreateCarRequestBuilder)? updates]) => + (CreateCarRequestBuilder()..update(updates))._build(); + + _$CreateCarRequest._({required this.plate}) : super._(); + @override + CreateCarRequest rebuild(void Function(CreateCarRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CreateCarRequestBuilder toBuilder() => + CreateCarRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is CreateCarRequest && plate == other.plate; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, plate.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'CreateCarRequest') + ..add('plate', plate)) + .toString(); + } +} + +class CreateCarRequestBuilder + implements Builder { + _$CreateCarRequest? _$v; + + String? _plate; + String? get plate => _$this._plate; + set plate(String? plate) => _$this._plate = plate; + + CreateCarRequestBuilder() { + CreateCarRequest._defaults(this); + } + + CreateCarRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _plate = $v.plate; + _$v = null; + } + return this; + } + + @override + void replace(CreateCarRequest other) { + _$v = other as _$CreateCarRequest; + } + + @override + void update(void Function(CreateCarRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + CreateCarRequest build() => _build(); + + _$CreateCarRequest _build() { + final _$result = _$v ?? + _$CreateCarRequest._( + plate: BuiltValueNullFieldError.checkNotNull( + plate, r'CreateCarRequest', 'plate'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/create_delivery_note_request.dart b/packages/holzleitner_api/lib/src/model/create_delivery_note_request.dart new file mode 100644 index 0000000..9088300 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/create_delivery_note_request.dart @@ -0,0 +1,149 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'create_delivery_note_request.g.dart'; + +/// CreateDeliveryNoteRequest +/// +/// Properties: +/// * [authorCarId] - Fahrzeug, das die Notiz erzeugt hat. Muss zum angemeldeten Account gehören. `None` ist erlaubt. +/// * [imageAttachment] - Object-Storage-Key oder URL eines vorab hochgeladenen Bildes. +/// * [text] +@BuiltValue() +abstract class CreateDeliveryNoteRequest implements Built { + /// Fahrzeug, das die Notiz erzeugt hat. Muss zum angemeldeten Account gehören. `None` ist erlaubt. + @BuiltValueField(wireName: r'authorCarId') + String? get authorCarId; + + /// Object-Storage-Key oder URL eines vorab hochgeladenen Bildes. + @BuiltValueField(wireName: r'imageAttachment') + String? get imageAttachment; + + @BuiltValueField(wireName: r'text') + String? get text; + + CreateDeliveryNoteRequest._(); + + factory CreateDeliveryNoteRequest([void updates(CreateDeliveryNoteRequestBuilder b)]) = _$CreateDeliveryNoteRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CreateDeliveryNoteRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CreateDeliveryNoteRequestSerializer(); +} + +class _$CreateDeliveryNoteRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [CreateDeliveryNoteRequest, _$CreateDeliveryNoteRequest]; + + @override + final String wireName = r'CreateDeliveryNoteRequest'; + + Iterable _serializeProperties( + Serializers serializers, + CreateDeliveryNoteRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.authorCarId != null) { + yield r'authorCarId'; + yield serializers.serialize( + object.authorCarId, + specifiedType: const FullType.nullable(String), + ); + } + if (object.imageAttachment != null) { + yield r'imageAttachment'; + yield serializers.serialize( + object.imageAttachment, + specifiedType: const FullType.nullable(String), + ); + } + if (object.text != null) { + yield r'text'; + yield serializers.serialize( + object.text, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + CreateDeliveryNoteRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CreateDeliveryNoteRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'authorCarId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.authorCarId = valueDes; + break; + case r'imageAttachment': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.imageAttachment = valueDes; + break; + case r'text': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.text = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + CreateDeliveryNoteRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CreateDeliveryNoteRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/create_delivery_note_request.g.dart b/packages/holzleitner_api/lib/src/model/create_delivery_note_request.g.dart new file mode 100644 index 0000000..cc82504 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/create_delivery_note_request.g.dart @@ -0,0 +1,120 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'create_delivery_note_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$CreateDeliveryNoteRequest extends CreateDeliveryNoteRequest { + @override + final String? authorCarId; + @override + final String? imageAttachment; + @override + final String? text; + + factory _$CreateDeliveryNoteRequest( + [void Function(CreateDeliveryNoteRequestBuilder)? updates]) => + (CreateDeliveryNoteRequestBuilder()..update(updates))._build(); + + _$CreateDeliveryNoteRequest._( + {this.authorCarId, this.imageAttachment, this.text}) + : super._(); + @override + CreateDeliveryNoteRequest rebuild( + void Function(CreateDeliveryNoteRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CreateDeliveryNoteRequestBuilder toBuilder() => + CreateDeliveryNoteRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is CreateDeliveryNoteRequest && + authorCarId == other.authorCarId && + imageAttachment == other.imageAttachment && + text == other.text; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, authorCarId.hashCode); + _$hash = $jc(_$hash, imageAttachment.hashCode); + _$hash = $jc(_$hash, text.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'CreateDeliveryNoteRequest') + ..add('authorCarId', authorCarId) + ..add('imageAttachment', imageAttachment) + ..add('text', text)) + .toString(); + } +} + +class CreateDeliveryNoteRequestBuilder + implements + Builder { + _$CreateDeliveryNoteRequest? _$v; + + String? _authorCarId; + String? get authorCarId => _$this._authorCarId; + set authorCarId(String? authorCarId) => _$this._authorCarId = authorCarId; + + String? _imageAttachment; + String? get imageAttachment => _$this._imageAttachment; + set imageAttachment(String? imageAttachment) => + _$this._imageAttachment = imageAttachment; + + String? _text; + String? get text => _$this._text; + set text(String? text) => _$this._text = text; + + CreateDeliveryNoteRequestBuilder() { + CreateDeliveryNoteRequest._defaults(this); + } + + CreateDeliveryNoteRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _authorCarId = $v.authorCarId; + _imageAttachment = $v.imageAttachment; + _text = $v.text; + _$v = null; + } + return this; + } + + @override + void replace(CreateDeliveryNoteRequest other) { + _$v = other as _$CreateDeliveryNoteRequest; + } + + @override + void update(void Function(CreateDeliveryNoteRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + CreateDeliveryNoteRequest build() => _build(); + + _$CreateDeliveryNoteRequest _build() { + final _$result = _$v ?? + _$CreateDeliveryNoteRequest._( + authorCarId: authorCarId, + imageAttachment: imageAttachment, + text: text, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/customer.dart b/packages/holzleitner_api/lib/src/model/customer.dart new file mode 100644 index 0000000..61f2e5c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/customer.dart @@ -0,0 +1,155 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/address.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'customer.g.dart'; + +/// Kunde. ERP-Mirror: die Stammdaten gehören dem ERP, wir spiegeln sie für die App. Die `erp_customer_id` ist die Brücke zurück (in der Regel die `Kunde.row_id` aus ERPframe). Die `Customer.address` ist die *aktuelle* Anschrift. Für historische Stabilität führt [`crate::domain::Delivery`] zusätzlich einen `delivery_address_snapshot` — Adress-Änderungen wirken nicht rückwirkend auf bereits zugestellte oder geplante Lieferungen. +/// +/// Properties: +/// * [address] +/// * [erpCustomerId] +/// * [id] +/// * [name] +@BuiltValue() +abstract class Customer implements Built { + @BuiltValueField(wireName: r'address') + Address get address; + + @BuiltValueField(wireName: r'erpCustomerId') + int get erpCustomerId; + + @BuiltValueField(wireName: r'id') + String get id; + + @BuiltValueField(wireName: r'name') + String get name; + + Customer._(); + + factory Customer([void updates(CustomerBuilder b)]) = _$Customer; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CustomerBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CustomerSerializer(); +} + +class _$CustomerSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Customer, _$Customer]; + + @override + final String wireName = r'Customer'; + + Iterable _serializeProperties( + Serializers serializers, + Customer object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'address'; + yield serializers.serialize( + object.address, + specifiedType: const FullType(Address), + ); + yield r'erpCustomerId'; + yield serializers.serialize( + object.erpCustomerId, + specifiedType: const FullType(int), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'name'; + yield serializers.serialize( + object.name, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + Customer object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CustomerBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'address': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Address), + ) as Address; + result.address.replace(valueDes); + break; + case r'erpCustomerId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.erpCustomerId = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.name = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Customer deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CustomerBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/customer.g.dart b/packages/holzleitner_api/lib/src/model/customer.g.dart new file mode 100644 index 0000000..474fc9c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/customer.g.dart @@ -0,0 +1,144 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'customer.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Customer extends Customer { + @override + final Address address; + @override + final int erpCustomerId; + @override + final String id; + @override + final String name; + + factory _$Customer([void Function(CustomerBuilder)? updates]) => + (CustomerBuilder()..update(updates))._build(); + + _$Customer._( + {required this.address, + required this.erpCustomerId, + required this.id, + required this.name}) + : super._(); + @override + Customer rebuild(void Function(CustomerBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CustomerBuilder toBuilder() => CustomerBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Customer && + address == other.address && + erpCustomerId == other.erpCustomerId && + id == other.id && + name == other.name; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, address.hashCode); + _$hash = $jc(_$hash, erpCustomerId.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, name.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Customer') + ..add('address', address) + ..add('erpCustomerId', erpCustomerId) + ..add('id', id) + ..add('name', name)) + .toString(); + } +} + +class CustomerBuilder implements Builder { + _$Customer? _$v; + + AddressBuilder? _address; + AddressBuilder get address => _$this._address ??= AddressBuilder(); + set address(AddressBuilder? address) => _$this._address = address; + + int? _erpCustomerId; + int? get erpCustomerId => _$this._erpCustomerId; + set erpCustomerId(int? erpCustomerId) => + _$this._erpCustomerId = erpCustomerId; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _name; + String? get name => _$this._name; + set name(String? name) => _$this._name = name; + + CustomerBuilder() { + Customer._defaults(this); + } + + CustomerBuilder get _$this { + final $v = _$v; + if ($v != null) { + _address = $v.address.toBuilder(); + _erpCustomerId = $v.erpCustomerId; + _id = $v.id; + _name = $v.name; + _$v = null; + } + return this; + } + + @override + void replace(Customer other) { + _$v = other as _$Customer; + } + + @override + void update(void Function(CustomerBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Customer build() => _build(); + + _$Customer _build() { + _$Customer _$result; + try { + _$result = _$v ?? + _$Customer._( + address: address.build(), + erpCustomerId: BuiltValueNullFieldError.checkNotNull( + erpCustomerId, r'Customer', 'erpCustomerId'), + id: BuiltValueNullFieldError.checkNotNull(id, r'Customer', 'id'), + name: BuiltValueNullFieldError.checkNotNull( + name, r'Customer', 'name'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'address'; + address.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'Customer', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/customer_contact.dart b/packages/holzleitner_api/lib/src/model/customer_contact.dart new file mode 100644 index 0000000..0a61115 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/customer_contact.dart @@ -0,0 +1,176 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'customer_contact.g.dart'; + +/// Ansprechpartner eines Kunden. Ein Kunde kann mehrere Kontaktpersonen haben (z. B. Empfang vor Ort + Geschäftsführung). Eine Lieferung wählt 0..N davon als aktive Kontakte aus (siehe `Delivery::contact_person_ids`). +/// +/// Properties: +/// * [customerId] +/// * [email] +/// * [id] +/// * [name] +/// * [phone] +@BuiltValue() +abstract class CustomerContact implements Built { + @BuiltValueField(wireName: r'customerId') + String get customerId; + + @BuiltValueField(wireName: r'email') + String? get email; + + @BuiltValueField(wireName: r'id') + String get id; + + @BuiltValueField(wireName: r'name') + String get name; + + @BuiltValueField(wireName: r'phone') + String? get phone; + + CustomerContact._(); + + factory CustomerContact([void updates(CustomerContactBuilder b)]) = _$CustomerContact; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(CustomerContactBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$CustomerContactSerializer(); +} + +class _$CustomerContactSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [CustomerContact, _$CustomerContact]; + + @override + final String wireName = r'CustomerContact'; + + Iterable _serializeProperties( + Serializers serializers, + CustomerContact object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'customerId'; + yield serializers.serialize( + object.customerId, + specifiedType: const FullType(String), + ); + if (object.email != null) { + yield r'email'; + yield serializers.serialize( + object.email, + specifiedType: const FullType.nullable(String), + ); + } + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'name'; + yield serializers.serialize( + object.name, + specifiedType: const FullType(String), + ); + if (object.phone != null) { + yield r'phone'; + yield serializers.serialize( + object.phone, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + CustomerContact object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required CustomerContactBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'customerId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.customerId = valueDes; + break; + case r'email': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.email = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.name = valueDes; + break; + case r'phone': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.phone = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + CustomerContact deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = CustomerContactBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/customer_contact.g.dart b/packages/holzleitner_api/lib/src/model/customer_contact.g.dart new file mode 100644 index 0000000..32db705 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/customer_contact.g.dart @@ -0,0 +1,144 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'customer_contact.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$CustomerContact extends CustomerContact { + @override + final String customerId; + @override + final String? email; + @override + final String id; + @override + final String name; + @override + final String? phone; + + factory _$CustomerContact([void Function(CustomerContactBuilder)? updates]) => + (CustomerContactBuilder()..update(updates))._build(); + + _$CustomerContact._( + {required this.customerId, + this.email, + required this.id, + required this.name, + this.phone}) + : super._(); + @override + CustomerContact rebuild(void Function(CustomerContactBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + CustomerContactBuilder toBuilder() => CustomerContactBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is CustomerContact && + customerId == other.customerId && + email == other.email && + id == other.id && + name == other.name && + phone == other.phone; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, customerId.hashCode); + _$hash = $jc(_$hash, email.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, name.hashCode); + _$hash = $jc(_$hash, phone.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'CustomerContact') + ..add('customerId', customerId) + ..add('email', email) + ..add('id', id) + ..add('name', name) + ..add('phone', phone)) + .toString(); + } +} + +class CustomerContactBuilder + implements Builder { + _$CustomerContact? _$v; + + String? _customerId; + String? get customerId => _$this._customerId; + set customerId(String? customerId) => _$this._customerId = customerId; + + String? _email; + String? get email => _$this._email; + set email(String? email) => _$this._email = email; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _name; + String? get name => _$this._name; + set name(String? name) => _$this._name = name; + + String? _phone; + String? get phone => _$this._phone; + set phone(String? phone) => _$this._phone = phone; + + CustomerContactBuilder() { + CustomerContact._defaults(this); + } + + CustomerContactBuilder get _$this { + final $v = _$v; + if ($v != null) { + _customerId = $v.customerId; + _email = $v.email; + _id = $v.id; + _name = $v.name; + _phone = $v.phone; + _$v = null; + } + return this; + } + + @override + void replace(CustomerContact other) { + _$v = other as _$CustomerContact; + } + + @override + void update(void Function(CustomerContactBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + CustomerContact build() => _build(); + + _$CustomerContact _build() { + final _$result = _$v ?? + _$CustomerContact._( + customerId: BuiltValueNullFieldError.checkNotNull( + customerId, r'CustomerContact', 'customerId'), + email: email, + id: BuiltValueNullFieldError.checkNotNull( + id, r'CustomerContact', 'id'), + name: BuiltValueNullFieldError.checkNotNull( + name, r'CustomerContact', 'name'), + phone: phone, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/date.dart b/packages/holzleitner_api/lib/src/model/date.dart new file mode 100644 index 0000000..b21c7f5 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/date.dart @@ -0,0 +1,70 @@ +/// A gregorian calendar date generated by +/// OpenAPI generator to differentiate +/// between [DateTime] and [Date] formats. +class Date implements Comparable { + final int year; + + /// January is 1. + final int month; + + /// First day is 1. + final int day; + + Date(this.year, this.month, this.day); + + /// The current date + static Date now({bool utc = false}) { + var now = DateTime.now(); + if (utc) { + now = now.toUtc(); + } + return now.toDate(); + } + + /// Convert to a [DateTime]. + DateTime toDateTime({bool utc = false}) { + if (utc) { + return DateTime.utc(year, month, day); + } else { + return DateTime(year, month, day); + } + } + + @override + int compareTo(Date other) { + int d = year.compareTo(other.year); + if (d != 0) { + return d; + } + d = month.compareTo(other.month); + if (d != 0) { + return d; + } + return day.compareTo(other.day); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is Date && + runtimeType == other.runtimeType && + year == other.year && + month == other.month && + day == other.day; + + @override + int get hashCode => year.hashCode ^ month.hashCode ^ day.hashCode; + + @override + String toString() { + final yyyy = year.toString(); + final mm = month.toString().padLeft(2, '0'); + final dd = day.toString().padLeft(2, '0'); + + return '$yyyy-$mm-$dd'; + } +} + +extension DateTimeToDate on DateTime { + Date toDate() => Date(year, month, day); +} diff --git a/packages/holzleitner_api/lib/src/model/delivery.dart b/packages/holzleitner_api/lib/src/model/delivery.dart new file mode 100644 index 0000000..412b53a --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery.dart @@ -0,0 +1,338 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/delivery_state.dart'; +import 'package:holzleitner_api/src/model/address.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery.g.dart'; + +/// Eine einzelne Lieferung an einen Kunden. Aggregat-Wurzel für die Liefer-Items, Notizen und das ggf. zugeordnete Fahrzeug. +/// +/// Properties: +/// * [assignedCarId] - Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. +/// * [contactPersonIds] - Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. +/// * [customerId] +/// * [deliveryAddressSnapshot] - Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. +/// * [desiredTime] - Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). +/// * [erpBelegartId] - ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. +/// * [erpBelegnummer] +/// * [id] +/// * [specialAgreements] - Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). +/// * [state] +/// * [stateReason] - Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. +/// * [tourId] +@BuiltValue(instantiable: false) +abstract class Delivery { + /// Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. + @BuiltValueField(wireName: r'assignedCarId') + String? get assignedCarId; + + /// Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. + @BuiltValueField(wireName: r'contactPersonIds') + BuiltList get contactPersonIds; + + @BuiltValueField(wireName: r'customerId') + String get customerId; + + /// Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. + @BuiltValueField(wireName: r'deliveryAddressSnapshot') + Address get deliveryAddressSnapshot; + + /// Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). + @BuiltValueField(wireName: r'desiredTime') + String? get desiredTime; + + /// ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. + @BuiltValueField(wireName: r'erpBelegartId') + int get erpBelegartId; + + @BuiltValueField(wireName: r'erpBelegnummer') + String get erpBelegnummer; + + @BuiltValueField(wireName: r'id') + String get id; + + /// Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). + @BuiltValueField(wireName: r'specialAgreements') + String? get specialAgreements; + + @BuiltValueField(wireName: r'state') + DeliveryState get state; + // enum stateEnum { active, held, canceled, completed, }; + + /// Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. + @BuiltValueField(wireName: r'stateReason') + String? get stateReason; + + @BuiltValueField(wireName: r'tourId') + String get tourId; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliverySerializer(); +} + +class _$DeliverySerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Delivery]; + + @override + final String wireName = r'Delivery'; + + Iterable _serializeProperties( + Serializers serializers, + Delivery object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.assignedCarId != null) { + yield r'assignedCarId'; + yield serializers.serialize( + object.assignedCarId, + specifiedType: const FullType.nullable(String), + ); + } + yield r'contactPersonIds'; + yield serializers.serialize( + object.contactPersonIds, + specifiedType: const FullType(BuiltList, [FullType(String)]), + ); + yield r'customerId'; + yield serializers.serialize( + object.customerId, + specifiedType: const FullType(String), + ); + yield r'deliveryAddressSnapshot'; + yield serializers.serialize( + object.deliveryAddressSnapshot, + specifiedType: const FullType(Address), + ); + if (object.desiredTime != null) { + yield r'desiredTime'; + yield serializers.serialize( + object.desiredTime, + specifiedType: const FullType.nullable(String), + ); + } + yield r'erpBelegartId'; + yield serializers.serialize( + object.erpBelegartId, + specifiedType: const FullType(int), + ); + yield r'erpBelegnummer'; + yield serializers.serialize( + object.erpBelegnummer, + specifiedType: const FullType(String), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + if (object.specialAgreements != null) { + yield r'specialAgreements'; + yield serializers.serialize( + object.specialAgreements, + specifiedType: const FullType.nullable(String), + ); + } + yield r'state'; + yield serializers.serialize( + object.state, + specifiedType: const FullType(DeliveryState), + ); + if (object.stateReason != null) { + yield r'stateReason'; + yield serializers.serialize( + object.stateReason, + specifiedType: const FullType.nullable(String), + ); + } + yield r'tourId'; + yield serializers.serialize( + object.tourId, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + Delivery object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + @override + Delivery deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + return serializers.deserialize(serialized, specifiedType: FullType($Delivery)) as $Delivery; + } +} + +/// a concrete implementation of [Delivery], since [Delivery] is not instantiable +@BuiltValue(instantiable: true) +abstract class $Delivery implements Delivery, Built<$Delivery, $DeliveryBuilder> { + $Delivery._(); + + factory $Delivery([void Function($DeliveryBuilder)? updates]) = _$$Delivery; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults($DeliveryBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer<$Delivery> get serializer => _$$DeliverySerializer(); +} + +class _$$DeliverySerializer implements PrimitiveSerializer<$Delivery> { + @override + final Iterable types = const [$Delivery, _$$Delivery]; + + @override + final String wireName = r'$Delivery'; + + @override + Object serialize( + Serializers serializers, + $Delivery object, { + FullType specifiedType = FullType.unspecified, + }) { + return serializers.serialize(object, specifiedType: FullType(Delivery))!; + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'assignedCarId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.assignedCarId = valueDes; + break; + case r'contactPersonIds': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(String)]), + ) as BuiltList; + result.contactPersonIds.replace(valueDes); + break; + case r'customerId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.customerId = valueDes; + break; + case r'deliveryAddressSnapshot': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Address), + ) as Address; + result.deliveryAddressSnapshot.replace(valueDes); + break; + case r'desiredTime': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.desiredTime = valueDes; + break; + case r'erpBelegartId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.erpBelegartId = valueDes; + break; + case r'erpBelegnummer': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.erpBelegnummer = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'specialAgreements': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.specialAgreements = valueDes; + break; + case r'state': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DeliveryState), + ) as DeliveryState; + result.state = valueDes; + break; + case r'stateReason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stateReason = valueDes; + break; + case r'tourId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.tourId = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + $Delivery deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = $DeliveryBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery.g.dart b/packages/holzleitner_api/lib/src/model/delivery.g.dart new file mode 100644 index 0000000..2a8cb16 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery.g.dart @@ -0,0 +1,298 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +abstract class DeliveryBuilder { + void replace(Delivery other); + void update(void Function(DeliveryBuilder) updates); + String? get assignedCarId; + set assignedCarId(String? assignedCarId); + + ListBuilder get contactPersonIds; + set contactPersonIds(ListBuilder? contactPersonIds); + + String? get customerId; + set customerId(String? customerId); + + AddressBuilder get deliveryAddressSnapshot; + set deliveryAddressSnapshot(AddressBuilder? deliveryAddressSnapshot); + + String? get desiredTime; + set desiredTime(String? desiredTime); + + int? get erpBelegartId; + set erpBelegartId(int? erpBelegartId); + + String? get erpBelegnummer; + set erpBelegnummer(String? erpBelegnummer); + + String? get id; + set id(String? id); + + String? get specialAgreements; + set specialAgreements(String? specialAgreements); + + DeliveryState? get state; + set state(DeliveryState? state); + + String? get stateReason; + set stateReason(String? stateReason); + + String? get tourId; + set tourId(String? tourId); +} + +class _$$Delivery extends $Delivery { + @override + final String? assignedCarId; + @override + final BuiltList contactPersonIds; + @override + final String customerId; + @override + final Address deliveryAddressSnapshot; + @override + final String? desiredTime; + @override + final int erpBelegartId; + @override + final String erpBelegnummer; + @override + final String id; + @override + final String? specialAgreements; + @override + final DeliveryState state; + @override + final String? stateReason; + @override + final String tourId; + + factory _$$Delivery([void Function($DeliveryBuilder)? updates]) => + ($DeliveryBuilder()..update(updates))._build(); + + _$$Delivery._( + {this.assignedCarId, + required this.contactPersonIds, + required this.customerId, + required this.deliveryAddressSnapshot, + this.desiredTime, + required this.erpBelegartId, + required this.erpBelegnummer, + required this.id, + this.specialAgreements, + required this.state, + this.stateReason, + required this.tourId}) + : super._(); + @override + $Delivery rebuild(void Function($DeliveryBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + $DeliveryBuilder toBuilder() => $DeliveryBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is $Delivery && + assignedCarId == other.assignedCarId && + contactPersonIds == other.contactPersonIds && + customerId == other.customerId && + deliveryAddressSnapshot == other.deliveryAddressSnapshot && + desiredTime == other.desiredTime && + erpBelegartId == other.erpBelegartId && + erpBelegnummer == other.erpBelegnummer && + id == other.id && + specialAgreements == other.specialAgreements && + state == other.state && + stateReason == other.stateReason && + tourId == other.tourId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, assignedCarId.hashCode); + _$hash = $jc(_$hash, contactPersonIds.hashCode); + _$hash = $jc(_$hash, customerId.hashCode); + _$hash = $jc(_$hash, deliveryAddressSnapshot.hashCode); + _$hash = $jc(_$hash, desiredTime.hashCode); + _$hash = $jc(_$hash, erpBelegartId.hashCode); + _$hash = $jc(_$hash, erpBelegnummer.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, specialAgreements.hashCode); + _$hash = $jc(_$hash, state.hashCode); + _$hash = $jc(_$hash, stateReason.hashCode); + _$hash = $jc(_$hash, tourId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'$Delivery') + ..add('assignedCarId', assignedCarId) + ..add('contactPersonIds', contactPersonIds) + ..add('customerId', customerId) + ..add('deliveryAddressSnapshot', deliveryAddressSnapshot) + ..add('desiredTime', desiredTime) + ..add('erpBelegartId', erpBelegartId) + ..add('erpBelegnummer', erpBelegnummer) + ..add('id', id) + ..add('specialAgreements', specialAgreements) + ..add('state', state) + ..add('stateReason', stateReason) + ..add('tourId', tourId)) + .toString(); + } +} + +class $DeliveryBuilder + implements Builder<$Delivery, $DeliveryBuilder>, DeliveryBuilder { + _$$Delivery? _$v; + + String? _assignedCarId; + String? get assignedCarId => _$this._assignedCarId; + set assignedCarId(covariant String? assignedCarId) => + _$this._assignedCarId = assignedCarId; + + ListBuilder? _contactPersonIds; + ListBuilder get contactPersonIds => + _$this._contactPersonIds ??= ListBuilder(); + set contactPersonIds(covariant ListBuilder? contactPersonIds) => + _$this._contactPersonIds = contactPersonIds; + + String? _customerId; + String? get customerId => _$this._customerId; + set customerId(covariant String? customerId) => + _$this._customerId = customerId; + + AddressBuilder? _deliveryAddressSnapshot; + AddressBuilder get deliveryAddressSnapshot => + _$this._deliveryAddressSnapshot ??= AddressBuilder(); + set deliveryAddressSnapshot( + covariant AddressBuilder? deliveryAddressSnapshot) => + _$this._deliveryAddressSnapshot = deliveryAddressSnapshot; + + String? _desiredTime; + String? get desiredTime => _$this._desiredTime; + set desiredTime(covariant String? desiredTime) => + _$this._desiredTime = desiredTime; + + int? _erpBelegartId; + int? get erpBelegartId => _$this._erpBelegartId; + set erpBelegartId(covariant int? erpBelegartId) => + _$this._erpBelegartId = erpBelegartId; + + String? _erpBelegnummer; + String? get erpBelegnummer => _$this._erpBelegnummer; + set erpBelegnummer(covariant String? erpBelegnummer) => + _$this._erpBelegnummer = erpBelegnummer; + + String? _id; + String? get id => _$this._id; + set id(covariant String? id) => _$this._id = id; + + String? _specialAgreements; + String? get specialAgreements => _$this._specialAgreements; + set specialAgreements(covariant String? specialAgreements) => + _$this._specialAgreements = specialAgreements; + + DeliveryState? _state; + DeliveryState? get state => _$this._state; + set state(covariant DeliveryState? state) => _$this._state = state; + + String? _stateReason; + String? get stateReason => _$this._stateReason; + set stateReason(covariant String? stateReason) => + _$this._stateReason = stateReason; + + String? _tourId; + String? get tourId => _$this._tourId; + set tourId(covariant String? tourId) => _$this._tourId = tourId; + + $DeliveryBuilder() { + $Delivery._defaults(this); + } + + $DeliveryBuilder get _$this { + final $v = _$v; + if ($v != null) { + _assignedCarId = $v.assignedCarId; + _contactPersonIds = $v.contactPersonIds.toBuilder(); + _customerId = $v.customerId; + _deliveryAddressSnapshot = $v.deliveryAddressSnapshot.toBuilder(); + _desiredTime = $v.desiredTime; + _erpBelegartId = $v.erpBelegartId; + _erpBelegnummer = $v.erpBelegnummer; + _id = $v.id; + _specialAgreements = $v.specialAgreements; + _state = $v.state; + _stateReason = $v.stateReason; + _tourId = $v.tourId; + _$v = null; + } + return this; + } + + @override + void replace(covariant $Delivery other) { + _$v = other as _$$Delivery; + } + + @override + void update(void Function($DeliveryBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + $Delivery build() => _build(); + + _$$Delivery _build() { + _$$Delivery _$result; + try { + _$result = _$v ?? + _$$Delivery._( + assignedCarId: assignedCarId, + contactPersonIds: contactPersonIds.build(), + customerId: BuiltValueNullFieldError.checkNotNull( + customerId, r'$Delivery', 'customerId'), + deliveryAddressSnapshot: deliveryAddressSnapshot.build(), + desiredTime: desiredTime, + erpBelegartId: BuiltValueNullFieldError.checkNotNull( + erpBelegartId, r'$Delivery', 'erpBelegartId'), + erpBelegnummer: BuiltValueNullFieldError.checkNotNull( + erpBelegnummer, r'$Delivery', 'erpBelegnummer'), + id: BuiltValueNullFieldError.checkNotNull(id, r'$Delivery', 'id'), + specialAgreements: specialAgreements, + state: BuiltValueNullFieldError.checkNotNull( + state, r'$Delivery', 'state'), + stateReason: stateReason, + tourId: BuiltValueNullFieldError.checkNotNull( + tourId, r'$Delivery', 'tourId'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'contactPersonIds'; + contactPersonIds.build(); + + _$failedField = 'deliveryAddressSnapshot'; + deliveryAddressSnapshot.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'$Delivery', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_item.dart b/packages/holzleitner_api/lib/src/model/delivery_item.dart new file mode 100644 index 0000000..c964c76 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_item.dart @@ -0,0 +1,224 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/scan_state.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_item.g.dart'; + +/// Einzelposition einer Lieferung. Vereint reguläre Belegzeilen und Stücklisten-Komponenten zu einer flachen Liste — die Stücklisten- Hierarchie ist ein ERP-Konstrukt und wird beim Sync aufgelöst. Über die Felder `belegzeilen_nr` und `komponenten_artikel_nr` bleibt die ERP-Herkunft auflösbar. +/// +/// Properties: +/// * [articleId] +/// * [belegzeilenNr] - ERP-Belegzeilen-Nr (Position innerhalb des Belegs). +/// * [deliveryId] +/// * [id] +/// * [komponentenArtikelNr] - Bei Items aus einer Stückliste: Artikelnummer der Komponente. Bei regulären Belegzeilen: `None`. +/// * [requiredQuantity] +/// * [scanState] +/// * [warehouseId] +@BuiltValue() +abstract class DeliveryItem implements Built { + @BuiltValueField(wireName: r'articleId') + String get articleId; + + /// ERP-Belegzeilen-Nr (Position innerhalb des Belegs). + @BuiltValueField(wireName: r'belegzeilenNr') + int get belegzeilenNr; + + @BuiltValueField(wireName: r'deliveryId') + String get deliveryId; + + @BuiltValueField(wireName: r'id') + String get id; + + /// Bei Items aus einer Stückliste: Artikelnummer der Komponente. Bei regulären Belegzeilen: `None`. + @BuiltValueField(wireName: r'komponentenArtikelNr') + String? get komponentenArtikelNr; + + @BuiltValueField(wireName: r'requiredQuantity') + int get requiredQuantity; + + @BuiltValueField(wireName: r'scanState') + ScanState get scanState; + + @BuiltValueField(wireName: r'warehouseId') + String get warehouseId; + + DeliveryItem._(); + + factory DeliveryItem([void updates(DeliveryItemBuilder b)]) = _$DeliveryItem; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(DeliveryItemBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliveryItemSerializer(); +} + +class _$DeliveryItemSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [DeliveryItem, _$DeliveryItem]; + + @override + final String wireName = r'DeliveryItem'; + + Iterable _serializeProperties( + Serializers serializers, + DeliveryItem object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'articleId'; + yield serializers.serialize( + object.articleId, + specifiedType: const FullType(String), + ); + yield r'belegzeilenNr'; + yield serializers.serialize( + object.belegzeilenNr, + specifiedType: const FullType(int), + ); + yield r'deliveryId'; + yield serializers.serialize( + object.deliveryId, + specifiedType: const FullType(String), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + if (object.komponentenArtikelNr != null) { + yield r'komponentenArtikelNr'; + yield serializers.serialize( + object.komponentenArtikelNr, + specifiedType: const FullType.nullable(String), + ); + } + yield r'requiredQuantity'; + yield serializers.serialize( + object.requiredQuantity, + specifiedType: const FullType(int), + ); + yield r'scanState'; + yield serializers.serialize( + object.scanState, + specifiedType: const FullType(ScanState), + ); + yield r'warehouseId'; + yield serializers.serialize( + object.warehouseId, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + DeliveryItem object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryItemBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'articleId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.articleId = valueDes; + break; + case r'belegzeilenNr': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.belegzeilenNr = valueDes; + break; + case r'deliveryId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.deliveryId = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'komponentenArtikelNr': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.komponentenArtikelNr = valueDes; + break; + case r'requiredQuantity': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.requiredQuantity = valueDes; + break; + case r'scanState': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(ScanState), + ) as ScanState; + result.scanState.replace(valueDes); + break; + case r'warehouseId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.warehouseId = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + DeliveryItem deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = DeliveryItemBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery_item.g.dart b/packages/holzleitner_api/lib/src/model/delivery_item.g.dart new file mode 100644 index 0000000..b686b52 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_item.g.dart @@ -0,0 +1,199 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_item.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$DeliveryItem extends DeliveryItem { + @override + final String articleId; + @override + final int belegzeilenNr; + @override + final String deliveryId; + @override + final String id; + @override + final String? komponentenArtikelNr; + @override + final int requiredQuantity; + @override + final ScanState scanState; + @override + final String warehouseId; + + factory _$DeliveryItem([void Function(DeliveryItemBuilder)? updates]) => + (DeliveryItemBuilder()..update(updates))._build(); + + _$DeliveryItem._( + {required this.articleId, + required this.belegzeilenNr, + required this.deliveryId, + required this.id, + this.komponentenArtikelNr, + required this.requiredQuantity, + required this.scanState, + required this.warehouseId}) + : super._(); + @override + DeliveryItem rebuild(void Function(DeliveryItemBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + DeliveryItemBuilder toBuilder() => DeliveryItemBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is DeliveryItem && + articleId == other.articleId && + belegzeilenNr == other.belegzeilenNr && + deliveryId == other.deliveryId && + id == other.id && + komponentenArtikelNr == other.komponentenArtikelNr && + requiredQuantity == other.requiredQuantity && + scanState == other.scanState && + warehouseId == other.warehouseId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, articleId.hashCode); + _$hash = $jc(_$hash, belegzeilenNr.hashCode); + _$hash = $jc(_$hash, deliveryId.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, komponentenArtikelNr.hashCode); + _$hash = $jc(_$hash, requiredQuantity.hashCode); + _$hash = $jc(_$hash, scanState.hashCode); + _$hash = $jc(_$hash, warehouseId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'DeliveryItem') + ..add('articleId', articleId) + ..add('belegzeilenNr', belegzeilenNr) + ..add('deliveryId', deliveryId) + ..add('id', id) + ..add('komponentenArtikelNr', komponentenArtikelNr) + ..add('requiredQuantity', requiredQuantity) + ..add('scanState', scanState) + ..add('warehouseId', warehouseId)) + .toString(); + } +} + +class DeliveryItemBuilder + implements Builder { + _$DeliveryItem? _$v; + + String? _articleId; + String? get articleId => _$this._articleId; + set articleId(String? articleId) => _$this._articleId = articleId; + + int? _belegzeilenNr; + int? get belegzeilenNr => _$this._belegzeilenNr; + set belegzeilenNr(int? belegzeilenNr) => + _$this._belegzeilenNr = belegzeilenNr; + + String? _deliveryId; + String? get deliveryId => _$this._deliveryId; + set deliveryId(String? deliveryId) => _$this._deliveryId = deliveryId; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _komponentenArtikelNr; + String? get komponentenArtikelNr => _$this._komponentenArtikelNr; + set komponentenArtikelNr(String? komponentenArtikelNr) => + _$this._komponentenArtikelNr = komponentenArtikelNr; + + int? _requiredQuantity; + int? get requiredQuantity => _$this._requiredQuantity; + set requiredQuantity(int? requiredQuantity) => + _$this._requiredQuantity = requiredQuantity; + + ScanStateBuilder? _scanState; + ScanStateBuilder get scanState => _$this._scanState ??= ScanStateBuilder(); + set scanState(ScanStateBuilder? scanState) => _$this._scanState = scanState; + + String? _warehouseId; + String? get warehouseId => _$this._warehouseId; + set warehouseId(String? warehouseId) => _$this._warehouseId = warehouseId; + + DeliveryItemBuilder() { + DeliveryItem._defaults(this); + } + + DeliveryItemBuilder get _$this { + final $v = _$v; + if ($v != null) { + _articleId = $v.articleId; + _belegzeilenNr = $v.belegzeilenNr; + _deliveryId = $v.deliveryId; + _id = $v.id; + _komponentenArtikelNr = $v.komponentenArtikelNr; + _requiredQuantity = $v.requiredQuantity; + _scanState = $v.scanState.toBuilder(); + _warehouseId = $v.warehouseId; + _$v = null; + } + return this; + } + + @override + void replace(DeliveryItem other) { + _$v = other as _$DeliveryItem; + } + + @override + void update(void Function(DeliveryItemBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + DeliveryItem build() => _build(); + + _$DeliveryItem _build() { + _$DeliveryItem _$result; + try { + _$result = _$v ?? + _$DeliveryItem._( + articleId: BuiltValueNullFieldError.checkNotNull( + articleId, r'DeliveryItem', 'articleId'), + belegzeilenNr: BuiltValueNullFieldError.checkNotNull( + belegzeilenNr, r'DeliveryItem', 'belegzeilenNr'), + deliveryId: BuiltValueNullFieldError.checkNotNull( + deliveryId, r'DeliveryItem', 'deliveryId'), + id: BuiltValueNullFieldError.checkNotNull( + id, r'DeliveryItem', 'id'), + komponentenArtikelNr: komponentenArtikelNr, + requiredQuantity: BuiltValueNullFieldError.checkNotNull( + requiredQuantity, r'DeliveryItem', 'requiredQuantity'), + scanState: scanState.build(), + warehouseId: BuiltValueNullFieldError.checkNotNull( + warehouseId, r'DeliveryItem', 'warehouseId'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'scanState'; + scanState.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'DeliveryItem', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_note.dart b/packages/holzleitner_api/lib/src/model/delivery_note.dart new file mode 100644 index 0000000..0ac37c6 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_note.dart @@ -0,0 +1,214 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_note.g.dart'; + +/// Notiz an einer Lieferung — frei eingegeben durch den Fahrer. Mindestens eines von `text` oder `image_attachment` muss gesetzt sein. Die Constraint sitzt sowohl im DB-Schema (CHECK) als auch in der Application-Schicht. +/// +/// Properties: +/// * [authorCarId] - Fahrzeug, falls bekannt — nullable bis das Backend Cars verwaltet. +/// * [authorPersonalnummer] - Personalnummer des Akteurs (aus dem JWT). Pflicht. +/// * [createdAt] +/// * [deliveryId] +/// * [id] +/// * [imageAttachment] - Referenz auf einen Bild-Anhang (z. B. Object-Storage-Key/URL). +/// * [text] +@BuiltValue() +abstract class DeliveryNote implements Built { + /// Fahrzeug, falls bekannt — nullable bis das Backend Cars verwaltet. + @BuiltValueField(wireName: r'authorCarId') + String? get authorCarId; + + /// Personalnummer des Akteurs (aus dem JWT). Pflicht. + @BuiltValueField(wireName: r'authorPersonalnummer') + int get authorPersonalnummer; + + @BuiltValueField(wireName: r'createdAt') + DateTime get createdAt; + + @BuiltValueField(wireName: r'deliveryId') + String get deliveryId; + + @BuiltValueField(wireName: r'id') + String get id; + + /// Referenz auf einen Bild-Anhang (z. B. Object-Storage-Key/URL). + @BuiltValueField(wireName: r'imageAttachment') + String? get imageAttachment; + + @BuiltValueField(wireName: r'text') + String? get text; + + DeliveryNote._(); + + factory DeliveryNote([void updates(DeliveryNoteBuilder b)]) = _$DeliveryNote; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(DeliveryNoteBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliveryNoteSerializer(); +} + +class _$DeliveryNoteSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [DeliveryNote, _$DeliveryNote]; + + @override + final String wireName = r'DeliveryNote'; + + Iterable _serializeProperties( + Serializers serializers, + DeliveryNote object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.authorCarId != null) { + yield r'authorCarId'; + yield serializers.serialize( + object.authorCarId, + specifiedType: const FullType.nullable(String), + ); + } + yield r'authorPersonalnummer'; + yield serializers.serialize( + object.authorPersonalnummer, + specifiedType: const FullType(int), + ); + yield r'createdAt'; + yield serializers.serialize( + object.createdAt, + specifiedType: const FullType(DateTime), + ); + yield r'deliveryId'; + yield serializers.serialize( + object.deliveryId, + specifiedType: const FullType(String), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + if (object.imageAttachment != null) { + yield r'imageAttachment'; + yield serializers.serialize( + object.imageAttachment, + specifiedType: const FullType.nullable(String), + ); + } + if (object.text != null) { + yield r'text'; + yield serializers.serialize( + object.text, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + DeliveryNote object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryNoteBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'authorCarId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.authorCarId = valueDes; + break; + case r'authorPersonalnummer': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.authorPersonalnummer = valueDes; + break; + case r'createdAt': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DateTime), + ) as DateTime; + result.createdAt = valueDes; + break; + case r'deliveryId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.deliveryId = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'imageAttachment': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.imageAttachment = valueDes; + break; + case r'text': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.text = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + DeliveryNote deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = DeliveryNoteBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery_note.g.dart b/packages/holzleitner_api/lib/src/model/delivery_note.g.dart new file mode 100644 index 0000000..7367cb5 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_note.g.dart @@ -0,0 +1,170 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_note.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$DeliveryNote extends DeliveryNote { + @override + final String? authorCarId; + @override + final int authorPersonalnummer; + @override + final DateTime createdAt; + @override + final String deliveryId; + @override + final String id; + @override + final String? imageAttachment; + @override + final String? text; + + factory _$DeliveryNote([void Function(DeliveryNoteBuilder)? updates]) => + (DeliveryNoteBuilder()..update(updates))._build(); + + _$DeliveryNote._( + {this.authorCarId, + required this.authorPersonalnummer, + required this.createdAt, + required this.deliveryId, + required this.id, + this.imageAttachment, + this.text}) + : super._(); + @override + DeliveryNote rebuild(void Function(DeliveryNoteBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + DeliveryNoteBuilder toBuilder() => DeliveryNoteBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is DeliveryNote && + authorCarId == other.authorCarId && + authorPersonalnummer == other.authorPersonalnummer && + createdAt == other.createdAt && + deliveryId == other.deliveryId && + id == other.id && + imageAttachment == other.imageAttachment && + text == other.text; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, authorCarId.hashCode); + _$hash = $jc(_$hash, authorPersonalnummer.hashCode); + _$hash = $jc(_$hash, createdAt.hashCode); + _$hash = $jc(_$hash, deliveryId.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, imageAttachment.hashCode); + _$hash = $jc(_$hash, text.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'DeliveryNote') + ..add('authorCarId', authorCarId) + ..add('authorPersonalnummer', authorPersonalnummer) + ..add('createdAt', createdAt) + ..add('deliveryId', deliveryId) + ..add('id', id) + ..add('imageAttachment', imageAttachment) + ..add('text', text)) + .toString(); + } +} + +class DeliveryNoteBuilder + implements Builder { + _$DeliveryNote? _$v; + + String? _authorCarId; + String? get authorCarId => _$this._authorCarId; + set authorCarId(String? authorCarId) => _$this._authorCarId = authorCarId; + + int? _authorPersonalnummer; + int? get authorPersonalnummer => _$this._authorPersonalnummer; + set authorPersonalnummer(int? authorPersonalnummer) => + _$this._authorPersonalnummer = authorPersonalnummer; + + DateTime? _createdAt; + DateTime? get createdAt => _$this._createdAt; + set createdAt(DateTime? createdAt) => _$this._createdAt = createdAt; + + String? _deliveryId; + String? get deliveryId => _$this._deliveryId; + set deliveryId(String? deliveryId) => _$this._deliveryId = deliveryId; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _imageAttachment; + String? get imageAttachment => _$this._imageAttachment; + set imageAttachment(String? imageAttachment) => + _$this._imageAttachment = imageAttachment; + + String? _text; + String? get text => _$this._text; + set text(String? text) => _$this._text = text; + + DeliveryNoteBuilder() { + DeliveryNote._defaults(this); + } + + DeliveryNoteBuilder get _$this { + final $v = _$v; + if ($v != null) { + _authorCarId = $v.authorCarId; + _authorPersonalnummer = $v.authorPersonalnummer; + _createdAt = $v.createdAt; + _deliveryId = $v.deliveryId; + _id = $v.id; + _imageAttachment = $v.imageAttachment; + _text = $v.text; + _$v = null; + } + return this; + } + + @override + void replace(DeliveryNote other) { + _$v = other as _$DeliveryNote; + } + + @override + void update(void Function(DeliveryNoteBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + DeliveryNote build() => _build(); + + _$DeliveryNote _build() { + final _$result = _$v ?? + _$DeliveryNote._( + authorCarId: authorCarId, + authorPersonalnummer: BuiltValueNullFieldError.checkNotNull( + authorPersonalnummer, r'DeliveryNote', 'authorPersonalnummer'), + createdAt: BuiltValueNullFieldError.checkNotNull( + createdAt, r'DeliveryNote', 'createdAt'), + deliveryId: BuiltValueNullFieldError.checkNotNull( + deliveryId, r'DeliveryNote', 'deliveryId'), + id: BuiltValueNullFieldError.checkNotNull(id, r'DeliveryNote', 'id'), + imageAttachment: imageAttachment, + text: text, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_note_response.dart b/packages/holzleitner_api/lib/src/model/delivery_note_response.dart new file mode 100644 index 0000000..0cac8cc --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_note_response.dart @@ -0,0 +1,107 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/delivery_note.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_note_response.g.dart'; + +/// DeliveryNoteResponse +/// +/// Properties: +/// * [note] +@BuiltValue() +abstract class DeliveryNoteResponse implements Built { + @BuiltValueField(wireName: r'note') + DeliveryNote get note; + + DeliveryNoteResponse._(); + + factory DeliveryNoteResponse([void updates(DeliveryNoteResponseBuilder b)]) = _$DeliveryNoteResponse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(DeliveryNoteResponseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliveryNoteResponseSerializer(); +} + +class _$DeliveryNoteResponseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [DeliveryNoteResponse, _$DeliveryNoteResponse]; + + @override + final String wireName = r'DeliveryNoteResponse'; + + Iterable _serializeProperties( + Serializers serializers, + DeliveryNoteResponse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'note'; + yield serializers.serialize( + object.note, + specifiedType: const FullType(DeliveryNote), + ); + } + + @override + Object serialize( + Serializers serializers, + DeliveryNoteResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryNoteResponseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'note': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DeliveryNote), + ) as DeliveryNote; + result.note.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + DeliveryNoteResponse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = DeliveryNoteResponseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery_note_response.g.dart b/packages/holzleitner_api/lib/src/model/delivery_note_response.g.dart new file mode 100644 index 0000000..61abfb1 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_note_response.g.dart @@ -0,0 +1,106 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_note_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$DeliveryNoteResponse extends DeliveryNoteResponse { + @override + final DeliveryNote note; + + factory _$DeliveryNoteResponse( + [void Function(DeliveryNoteResponseBuilder)? updates]) => + (DeliveryNoteResponseBuilder()..update(updates))._build(); + + _$DeliveryNoteResponse._({required this.note}) : super._(); + @override + DeliveryNoteResponse rebuild( + void Function(DeliveryNoteResponseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + DeliveryNoteResponseBuilder toBuilder() => + DeliveryNoteResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is DeliveryNoteResponse && note == other.note; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, note.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'DeliveryNoteResponse') + ..add('note', note)) + .toString(); + } +} + +class DeliveryNoteResponseBuilder + implements Builder { + _$DeliveryNoteResponse? _$v; + + DeliveryNoteBuilder? _note; + DeliveryNoteBuilder get note => _$this._note ??= DeliveryNoteBuilder(); + set note(DeliveryNoteBuilder? note) => _$this._note = note; + + DeliveryNoteResponseBuilder() { + DeliveryNoteResponse._defaults(this); + } + + DeliveryNoteResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _note = $v.note.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(DeliveryNoteResponse other) { + _$v = other as _$DeliveryNoteResponse; + } + + @override + void update(void Function(DeliveryNoteResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + DeliveryNoteResponse build() => _build(); + + _$DeliveryNoteResponse _build() { + _$DeliveryNoteResponse _$result; + try { + _$result = _$v ?? + _$DeliveryNoteResponse._( + note: note.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'note'; + note.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'DeliveryNoteResponse', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_order_entry.dart b/packages/holzleitner_api/lib/src/model/delivery_order_entry.dart new file mode 100644 index 0000000..36b60d3 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_order_entry.dart @@ -0,0 +1,122 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_order_entry.g.dart'; + +/// DeliveryOrderEntry +/// +/// Properties: +/// * [deliveryId] +/// * [sortOrder] +@BuiltValue() +abstract class DeliveryOrderEntry implements Built { + @BuiltValueField(wireName: r'deliveryId') + String get deliveryId; + + @BuiltValueField(wireName: r'sortOrder') + int get sortOrder; + + DeliveryOrderEntry._(); + + factory DeliveryOrderEntry([void updates(DeliveryOrderEntryBuilder b)]) = _$DeliveryOrderEntry; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(DeliveryOrderEntryBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliveryOrderEntrySerializer(); +} + +class _$DeliveryOrderEntrySerializer implements PrimitiveSerializer { + @override + final Iterable types = const [DeliveryOrderEntry, _$DeliveryOrderEntry]; + + @override + final String wireName = r'DeliveryOrderEntry'; + + Iterable _serializeProperties( + Serializers serializers, + DeliveryOrderEntry object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'deliveryId'; + yield serializers.serialize( + object.deliveryId, + specifiedType: const FullType(String), + ); + yield r'sortOrder'; + yield serializers.serialize( + object.sortOrder, + specifiedType: const FullType(int), + ); + } + + @override + Object serialize( + Serializers serializers, + DeliveryOrderEntry object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryOrderEntryBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'deliveryId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.deliveryId = valueDes; + break; + case r'sortOrder': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.sortOrder = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + DeliveryOrderEntry deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = DeliveryOrderEntryBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery_order_entry.g.dart b/packages/holzleitner_api/lib/src/model/delivery_order_entry.g.dart new file mode 100644 index 0000000..04908c8 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_order_entry.g.dart @@ -0,0 +1,108 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_order_entry.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$DeliveryOrderEntry extends DeliveryOrderEntry { + @override + final String deliveryId; + @override + final int sortOrder; + + factory _$DeliveryOrderEntry( + [void Function(DeliveryOrderEntryBuilder)? updates]) => + (DeliveryOrderEntryBuilder()..update(updates))._build(); + + _$DeliveryOrderEntry._({required this.deliveryId, required this.sortOrder}) + : super._(); + @override + DeliveryOrderEntry rebuild( + void Function(DeliveryOrderEntryBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + DeliveryOrderEntryBuilder toBuilder() => + DeliveryOrderEntryBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is DeliveryOrderEntry && + deliveryId == other.deliveryId && + sortOrder == other.sortOrder; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, deliveryId.hashCode); + _$hash = $jc(_$hash, sortOrder.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'DeliveryOrderEntry') + ..add('deliveryId', deliveryId) + ..add('sortOrder', sortOrder)) + .toString(); + } +} + +class DeliveryOrderEntryBuilder + implements Builder { + _$DeliveryOrderEntry? _$v; + + String? _deliveryId; + String? get deliveryId => _$this._deliveryId; + set deliveryId(String? deliveryId) => _$this._deliveryId = deliveryId; + + int? _sortOrder; + int? get sortOrder => _$this._sortOrder; + set sortOrder(int? sortOrder) => _$this._sortOrder = sortOrder; + + DeliveryOrderEntryBuilder() { + DeliveryOrderEntry._defaults(this); + } + + DeliveryOrderEntryBuilder get _$this { + final $v = _$v; + if ($v != null) { + _deliveryId = $v.deliveryId; + _sortOrder = $v.sortOrder; + _$v = null; + } + return this; + } + + @override + void replace(DeliveryOrderEntry other) { + _$v = other as _$DeliveryOrderEntry; + } + + @override + void update(void Function(DeliveryOrderEntryBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + DeliveryOrderEntry build() => _build(); + + _$DeliveryOrderEntry _build() { + final _$result = _$v ?? + _$DeliveryOrderEntry._( + deliveryId: BuiltValueNullFieldError.checkNotNull( + deliveryId, r'DeliveryOrderEntry', 'deliveryId'), + sortOrder: BuiltValueNullFieldError.checkNotNull( + sortOrder, r'DeliveryOrderEntry', 'sortOrder'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_response.dart b/packages/holzleitner_api/lib/src/model/delivery_response.dart new file mode 100644 index 0000000..a0c0c84 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_response.dart @@ -0,0 +1,107 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/delivery.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_response.g.dart'; + +/// DeliveryResponse +/// +/// Properties: +/// * [delivery] +@BuiltValue() +abstract class DeliveryResponse implements Built { + @BuiltValueField(wireName: r'delivery') + Delivery get delivery; + + DeliveryResponse._(); + + factory DeliveryResponse([void updates(DeliveryResponseBuilder b)]) = _$DeliveryResponse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(DeliveryResponseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliveryResponseSerializer(); +} + +class _$DeliveryResponseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [DeliveryResponse, _$DeliveryResponse]; + + @override + final String wireName = r'DeliveryResponse'; + + Iterable _serializeProperties( + Serializers serializers, + DeliveryResponse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'delivery'; + yield serializers.serialize( + object.delivery, + specifiedType: const FullType(Delivery), + ); + } + + @override + Object serialize( + Serializers serializers, + DeliveryResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryResponseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'delivery': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Delivery), + ) as Delivery; + result.delivery = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + DeliveryResponse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = DeliveryResponseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery_response.g.dart b/packages/holzleitner_api/lib/src/model/delivery_response.g.dart new file mode 100644 index 0000000..1d1e373 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_response.g.dart @@ -0,0 +1,93 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$DeliveryResponse extends DeliveryResponse { + @override + final Delivery delivery; + + factory _$DeliveryResponse( + [void Function(DeliveryResponseBuilder)? updates]) => + (DeliveryResponseBuilder()..update(updates))._build(); + + _$DeliveryResponse._({required this.delivery}) : super._(); + @override + DeliveryResponse rebuild(void Function(DeliveryResponseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + DeliveryResponseBuilder toBuilder() => + DeliveryResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is DeliveryResponse && delivery == other.delivery; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, delivery.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'DeliveryResponse') + ..add('delivery', delivery)) + .toString(); + } +} + +class DeliveryResponseBuilder + implements Builder { + _$DeliveryResponse? _$v; + + Delivery? _delivery; + Delivery? get delivery => _$this._delivery; + set delivery(Delivery? delivery) => _$this._delivery = delivery; + + DeliveryResponseBuilder() { + DeliveryResponse._defaults(this); + } + + DeliveryResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _delivery = $v.delivery; + _$v = null; + } + return this; + } + + @override + void replace(DeliveryResponse other) { + _$v = other as _$DeliveryResponse; + } + + @override + void update(void Function(DeliveryResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + DeliveryResponse build() => _build(); + + _$DeliveryResponse _build() { + final _$result = _$v ?? + _$DeliveryResponse._( + delivery: BuiltValueNullFieldError.checkNotNull( + delivery, r'DeliveryResponse', 'delivery'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_state.dart b/packages/holzleitner_api/lib/src/model/delivery_state.dart new file mode 100644 index 0000000..723dabc --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_state.dart @@ -0,0 +1,42 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_state.g.dart'; + +class DeliveryState extends EnumClass { + + /// Lebenszyklus einer Lieferung. `Held` ist für „heute nicht zustellbar, aber nicht endgültig abgesagt\" reserviert; `Canceled` ist endgültig. `Completed` setzt der Abschluss-Flow am Ende der Auslieferung. + @BuiltValueEnumConst(wireName: r'active') + static const DeliveryState active = _$active; + /// Lebenszyklus einer Lieferung. `Held` ist für „heute nicht zustellbar, aber nicht endgültig abgesagt\" reserviert; `Canceled` ist endgültig. `Completed` setzt der Abschluss-Flow am Ende der Auslieferung. + @BuiltValueEnumConst(wireName: r'held') + static const DeliveryState held = _$held; + /// Lebenszyklus einer Lieferung. `Held` ist für „heute nicht zustellbar, aber nicht endgültig abgesagt\" reserviert; `Canceled` ist endgültig. `Completed` setzt der Abschluss-Flow am Ende der Auslieferung. + @BuiltValueEnumConst(wireName: r'canceled') + static const DeliveryState canceled = _$canceled; + /// Lebenszyklus einer Lieferung. `Held` ist für „heute nicht zustellbar, aber nicht endgültig abgesagt\" reserviert; `Canceled` ist endgültig. `Completed` setzt der Abschluss-Flow am Ende der Auslieferung. + @BuiltValueEnumConst(wireName: r'completed') + static const DeliveryState completed = _$completed; + + static Serializer get serializer => _$deliveryStateSerializer; + + const DeliveryState._(String name): super(name); + + static BuiltSet get values => _$values; + static DeliveryState valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class DeliveryStateMixin = Object with _$DeliveryStateMixin; + diff --git a/packages/holzleitner_api/lib/src/model/delivery_state.g.dart b/packages/holzleitner_api/lib/src/model/delivery_state.g.dart new file mode 100644 index 0000000..3e583bd --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_state.g.dart @@ -0,0 +1,86 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_state.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +const DeliveryState _$active = const DeliveryState._('active'); +const DeliveryState _$held = const DeliveryState._('held'); +const DeliveryState _$canceled = const DeliveryState._('canceled'); +const DeliveryState _$completed = const DeliveryState._('completed'); + +DeliveryState _$valueOf(String name) { + switch (name) { + case 'active': + return _$active; + case 'held': + return _$held; + case 'canceled': + return _$canceled; + case 'completed': + return _$completed; + default: + throw ArgumentError(name); + } +} + +final BuiltSet _$values = + BuiltSet(const [ + _$active, + _$held, + _$canceled, + _$completed, +]); + +class _$DeliveryStateMeta { + const _$DeliveryStateMeta(); + DeliveryState get active => _$active; + DeliveryState get held => _$held; + DeliveryState get canceled => _$canceled; + DeliveryState get completed => _$completed; + DeliveryState valueOf(String name) => _$valueOf(name); + BuiltSet get values => _$values; +} + +abstract class _$DeliveryStateMixin { + // ignore: non_constant_identifier_names + _$DeliveryStateMeta get DeliveryState => const _$DeliveryStateMeta(); +} + +Serializer _$deliveryStateSerializer = + _$DeliveryStateSerializer(); + +class _$DeliveryStateSerializer implements PrimitiveSerializer { + static const Map _toWire = const { + 'active': 'active', + 'held': 'held', + 'canceled': 'canceled', + 'completed': 'completed', + }; + static const Map _fromWire = const { + 'active': 'active', + 'held': 'held', + 'canceled': 'canceled', + 'completed': 'completed', + }; + + @override + final Iterable types = const [DeliveryState]; + @override + final String wireName = 'DeliveryState'; + + @override + Object serialize(Serializers serializers, DeliveryState object, + {FullType specifiedType = FullType.unspecified}) => + _toWire[object.name] ?? object.name; + + @override + DeliveryState deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) => + DeliveryState.valueOf( + _fromWire[serialized] ?? (serialized is String ? serialized : '')); +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/delivery_with_items.dart b/packages/holzleitner_api/lib/src/model/delivery_with_items.dart new file mode 100644 index 0000000..5050cc6 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_with_items.dart @@ -0,0 +1,296 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/delivery_item.dart'; +import 'package:holzleitner_api/src/model/delivery_state.dart'; +import 'package:holzleitner_api/src/model/address.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:holzleitner_api/src/model/delivery.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'delivery_with_items.g.dart'; + +/// DeliveryWithItems +/// +/// Properties: +/// * [assignedCarId] - Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. +/// * [contactPersonIds] - Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. +/// * [customerId] +/// * [deliveryAddressSnapshot] - Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. +/// * [desiredTime] - Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). +/// * [erpBelegartId] - ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. +/// * [erpBelegnummer] +/// * [id] +/// * [specialAgreements] - Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). +/// * [state] +/// * [stateReason] - Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. +/// * [tourId] +/// * [items] +/// * [sortOrder] - Sortier-Reihenfolge innerhalb der Tour (1-basiert). +@BuiltValue() +abstract class DeliveryWithItems implements Delivery, Built { + /// Sortier-Reihenfolge innerhalb der Tour (1-basiert). + @BuiltValueField(wireName: r'sortOrder') + int get sortOrder; + + @BuiltValueField(wireName: r'items') + BuiltList get items; + + DeliveryWithItems._(); + + factory DeliveryWithItems([void updates(DeliveryWithItemsBuilder b)]) = _$DeliveryWithItems; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(DeliveryWithItemsBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$DeliveryWithItemsSerializer(); +} + +class _$DeliveryWithItemsSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [DeliveryWithItems, _$DeliveryWithItems]; + + @override + final String wireName = r'DeliveryWithItems'; + + Iterable _serializeProperties( + Serializers serializers, + DeliveryWithItems object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'deliveryAddressSnapshot'; + yield serializers.serialize( + object.deliveryAddressSnapshot, + specifiedType: const FullType(Address), + ); + yield r'contactPersonIds'; + yield serializers.serialize( + object.contactPersonIds, + specifiedType: const FullType(BuiltList, [FullType(String)]), + ); + if (object.stateReason != null) { + yield r'stateReason'; + yield serializers.serialize( + object.stateReason, + specifiedType: const FullType.nullable(String), + ); + } + yield r'erpBelegnummer'; + yield serializers.serialize( + object.erpBelegnummer, + specifiedType: const FullType(String), + ); + if (object.assignedCarId != null) { + yield r'assignedCarId'; + yield serializers.serialize( + object.assignedCarId, + specifiedType: const FullType.nullable(String), + ); + } + if (object.specialAgreements != null) { + yield r'specialAgreements'; + yield serializers.serialize( + object.specialAgreements, + specifiedType: const FullType.nullable(String), + ); + } + if (object.desiredTime != null) { + yield r'desiredTime'; + yield serializers.serialize( + object.desiredTime, + specifiedType: const FullType.nullable(String), + ); + } + yield r'tourId'; + yield serializers.serialize( + object.tourId, + specifiedType: const FullType(String), + ); + yield r'sortOrder'; + yield serializers.serialize( + object.sortOrder, + specifiedType: const FullType(int), + ); + yield r'customerId'; + yield serializers.serialize( + object.customerId, + specifiedType: const FullType(String), + ); + yield r'erpBelegartId'; + yield serializers.serialize( + object.erpBelegartId, + specifiedType: const FullType(int), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'state'; + yield serializers.serialize( + object.state, + specifiedType: const FullType(DeliveryState), + ); + yield r'items'; + yield serializers.serialize( + object.items, + specifiedType: const FullType(BuiltList, [FullType(DeliveryItem)]), + ); + } + + @override + Object serialize( + Serializers serializers, + DeliveryWithItems object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required DeliveryWithItemsBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'deliveryAddressSnapshot': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Address), + ) as Address; + result.deliveryAddressSnapshot.replace(valueDes); + break; + case r'contactPersonIds': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(String)]), + ) as BuiltList; + result.contactPersonIds.replace(valueDes); + break; + case r'stateReason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.stateReason = valueDes; + break; + case r'erpBelegnummer': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.erpBelegnummer = valueDes; + break; + case r'assignedCarId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.assignedCarId = valueDes; + break; + case r'specialAgreements': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.specialAgreements = valueDes; + break; + case r'desiredTime': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.desiredTime = valueDes; + break; + case r'tourId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.tourId = valueDes; + break; + case r'sortOrder': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.sortOrder = valueDes; + break; + case r'customerId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.customerId = valueDes; + break; + case r'erpBelegartId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.erpBelegartId = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'state': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DeliveryState), + ) as DeliveryState; + result.state = valueDes; + break; + case r'items': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(DeliveryItem)]), + ) as BuiltList; + result.items.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + DeliveryWithItems deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = DeliveryWithItemsBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/delivery_with_items.g.dart b/packages/holzleitner_api/lib/src/model/delivery_with_items.g.dart new file mode 100644 index 0000000..80824fc --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/delivery_with_items.g.dart @@ -0,0 +1,293 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_with_items.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$DeliveryWithItems extends DeliveryWithItems { + @override + final int sortOrder; + @override + final BuiltList items; + @override + final String? assignedCarId; + @override + final BuiltList contactPersonIds; + @override + final String customerId; + @override + final Address deliveryAddressSnapshot; + @override + final String? desiredTime; + @override + final int erpBelegartId; + @override + final String erpBelegnummer; + @override + final String id; + @override + final String? specialAgreements; + @override + final DeliveryState state; + @override + final String? stateReason; + @override + final String tourId; + + factory _$DeliveryWithItems( + [void Function(DeliveryWithItemsBuilder)? updates]) => + (DeliveryWithItemsBuilder()..update(updates))._build(); + + _$DeliveryWithItems._( + {required this.sortOrder, + required this.items, + this.assignedCarId, + required this.contactPersonIds, + required this.customerId, + required this.deliveryAddressSnapshot, + this.desiredTime, + required this.erpBelegartId, + required this.erpBelegnummer, + required this.id, + this.specialAgreements, + required this.state, + this.stateReason, + required this.tourId}) + : super._(); + @override + DeliveryWithItems rebuild(void Function(DeliveryWithItemsBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + DeliveryWithItemsBuilder toBuilder() => + DeliveryWithItemsBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is DeliveryWithItems && + sortOrder == other.sortOrder && + items == other.items && + assignedCarId == other.assignedCarId && + contactPersonIds == other.contactPersonIds && + customerId == other.customerId && + deliveryAddressSnapshot == other.deliveryAddressSnapshot && + desiredTime == other.desiredTime && + erpBelegartId == other.erpBelegartId && + erpBelegnummer == other.erpBelegnummer && + id == other.id && + specialAgreements == other.specialAgreements && + state == other.state && + stateReason == other.stateReason && + tourId == other.tourId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, sortOrder.hashCode); + _$hash = $jc(_$hash, items.hashCode); + _$hash = $jc(_$hash, assignedCarId.hashCode); + _$hash = $jc(_$hash, contactPersonIds.hashCode); + _$hash = $jc(_$hash, customerId.hashCode); + _$hash = $jc(_$hash, deliveryAddressSnapshot.hashCode); + _$hash = $jc(_$hash, desiredTime.hashCode); + _$hash = $jc(_$hash, erpBelegartId.hashCode); + _$hash = $jc(_$hash, erpBelegnummer.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, specialAgreements.hashCode); + _$hash = $jc(_$hash, state.hashCode); + _$hash = $jc(_$hash, stateReason.hashCode); + _$hash = $jc(_$hash, tourId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'DeliveryWithItems') + ..add('sortOrder', sortOrder) + ..add('items', items) + ..add('assignedCarId', assignedCarId) + ..add('contactPersonIds', contactPersonIds) + ..add('customerId', customerId) + ..add('deliveryAddressSnapshot', deliveryAddressSnapshot) + ..add('desiredTime', desiredTime) + ..add('erpBelegartId', erpBelegartId) + ..add('erpBelegnummer', erpBelegnummer) + ..add('id', id) + ..add('specialAgreements', specialAgreements) + ..add('state', state) + ..add('stateReason', stateReason) + ..add('tourId', tourId)) + .toString(); + } +} + +class DeliveryWithItemsBuilder + implements + Builder, + DeliveryBuilder { + _$DeliveryWithItems? _$v; + + int? _sortOrder; + int? get sortOrder => _$this._sortOrder; + set sortOrder(covariant int? sortOrder) => _$this._sortOrder = sortOrder; + + ListBuilder? _items; + ListBuilder get items => + _$this._items ??= ListBuilder(); + set items(covariant ListBuilder? items) => + _$this._items = items; + + String? _assignedCarId; + String? get assignedCarId => _$this._assignedCarId; + set assignedCarId(covariant String? assignedCarId) => + _$this._assignedCarId = assignedCarId; + + ListBuilder? _contactPersonIds; + ListBuilder get contactPersonIds => + _$this._contactPersonIds ??= ListBuilder(); + set contactPersonIds(covariant ListBuilder? contactPersonIds) => + _$this._contactPersonIds = contactPersonIds; + + String? _customerId; + String? get customerId => _$this._customerId; + set customerId(covariant String? customerId) => + _$this._customerId = customerId; + + AddressBuilder? _deliveryAddressSnapshot; + AddressBuilder get deliveryAddressSnapshot => + _$this._deliveryAddressSnapshot ??= AddressBuilder(); + set deliveryAddressSnapshot( + covariant AddressBuilder? deliveryAddressSnapshot) => + _$this._deliveryAddressSnapshot = deliveryAddressSnapshot; + + String? _desiredTime; + String? get desiredTime => _$this._desiredTime; + set desiredTime(covariant String? desiredTime) => + _$this._desiredTime = desiredTime; + + int? _erpBelegartId; + int? get erpBelegartId => _$this._erpBelegartId; + set erpBelegartId(covariant int? erpBelegartId) => + _$this._erpBelegartId = erpBelegartId; + + String? _erpBelegnummer; + String? get erpBelegnummer => _$this._erpBelegnummer; + set erpBelegnummer(covariant String? erpBelegnummer) => + _$this._erpBelegnummer = erpBelegnummer; + + String? _id; + String? get id => _$this._id; + set id(covariant String? id) => _$this._id = id; + + String? _specialAgreements; + String? get specialAgreements => _$this._specialAgreements; + set specialAgreements(covariant String? specialAgreements) => + _$this._specialAgreements = specialAgreements; + + DeliveryState? _state; + DeliveryState? get state => _$this._state; + set state(covariant DeliveryState? state) => _$this._state = state; + + String? _stateReason; + String? get stateReason => _$this._stateReason; + set stateReason(covariant String? stateReason) => + _$this._stateReason = stateReason; + + String? _tourId; + String? get tourId => _$this._tourId; + set tourId(covariant String? tourId) => _$this._tourId = tourId; + + DeliveryWithItemsBuilder() { + DeliveryWithItems._defaults(this); + } + + DeliveryWithItemsBuilder get _$this { + final $v = _$v; + if ($v != null) { + _sortOrder = $v.sortOrder; + _items = $v.items.toBuilder(); + _assignedCarId = $v.assignedCarId; + _contactPersonIds = $v.contactPersonIds.toBuilder(); + _customerId = $v.customerId; + _deliveryAddressSnapshot = $v.deliveryAddressSnapshot.toBuilder(); + _desiredTime = $v.desiredTime; + _erpBelegartId = $v.erpBelegartId; + _erpBelegnummer = $v.erpBelegnummer; + _id = $v.id; + _specialAgreements = $v.specialAgreements; + _state = $v.state; + _stateReason = $v.stateReason; + _tourId = $v.tourId; + _$v = null; + } + return this; + } + + @override + void replace(covariant DeliveryWithItems other) { + _$v = other as _$DeliveryWithItems; + } + + @override + void update(void Function(DeliveryWithItemsBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + DeliveryWithItems build() => _build(); + + _$DeliveryWithItems _build() { + _$DeliveryWithItems _$result; + try { + _$result = _$v ?? + _$DeliveryWithItems._( + sortOrder: BuiltValueNullFieldError.checkNotNull( + sortOrder, r'DeliveryWithItems', 'sortOrder'), + items: items.build(), + assignedCarId: assignedCarId, + contactPersonIds: contactPersonIds.build(), + customerId: BuiltValueNullFieldError.checkNotNull( + customerId, r'DeliveryWithItems', 'customerId'), + deliveryAddressSnapshot: deliveryAddressSnapshot.build(), + desiredTime: desiredTime, + erpBelegartId: BuiltValueNullFieldError.checkNotNull( + erpBelegartId, r'DeliveryWithItems', 'erpBelegartId'), + erpBelegnummer: BuiltValueNullFieldError.checkNotNull( + erpBelegnummer, r'DeliveryWithItems', 'erpBelegnummer'), + id: BuiltValueNullFieldError.checkNotNull( + id, r'DeliveryWithItems', 'id'), + specialAgreements: specialAgreements, + state: BuiltValueNullFieldError.checkNotNull( + state, r'DeliveryWithItems', 'state'), + stateReason: stateReason, + tourId: BuiltValueNullFieldError.checkNotNull( + tourId, r'DeliveryWithItems', 'tourId'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'items'; + items.build(); + + _$failedField = 'contactPersonIds'; + contactPersonIds.build(); + + _$failedField = 'deliveryAddressSnapshot'; + deliveryAddressSnapshot.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'DeliveryWithItems', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/hold_delivery_request.dart b/packages/holzleitner_api/lib/src/model/hold_delivery_request.dart new file mode 100644 index 0000000..e0107b6 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/hold_delivery_request.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'hold_delivery_request.g.dart'; + +/// HoldDeliveryRequest +/// +/// Properties: +/// * [reason] +@BuiltValue() +abstract class HoldDeliveryRequest implements Built { + @BuiltValueField(wireName: r'reason') + String get reason; + + HoldDeliveryRequest._(); + + factory HoldDeliveryRequest([void updates(HoldDeliveryRequestBuilder b)]) = _$HoldDeliveryRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(HoldDeliveryRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$HoldDeliveryRequestSerializer(); +} + +class _$HoldDeliveryRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [HoldDeliveryRequest, _$HoldDeliveryRequest]; + + @override + final String wireName = r'HoldDeliveryRequest'; + + Iterable _serializeProperties( + Serializers serializers, + HoldDeliveryRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'reason'; + yield serializers.serialize( + object.reason, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + HoldDeliveryRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required HoldDeliveryRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'reason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.reason = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + HoldDeliveryRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = HoldDeliveryRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/hold_delivery_request.g.dart b/packages/holzleitner_api/lib/src/model/hold_delivery_request.g.dart new file mode 100644 index 0000000..d1f6f9f --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/hold_delivery_request.g.dart @@ -0,0 +1,94 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'hold_delivery_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$HoldDeliveryRequest extends HoldDeliveryRequest { + @override + final String reason; + + factory _$HoldDeliveryRequest( + [void Function(HoldDeliveryRequestBuilder)? updates]) => + (HoldDeliveryRequestBuilder()..update(updates))._build(); + + _$HoldDeliveryRequest._({required this.reason}) : super._(); + @override + HoldDeliveryRequest rebuild( + void Function(HoldDeliveryRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + HoldDeliveryRequestBuilder toBuilder() => + HoldDeliveryRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is HoldDeliveryRequest && reason == other.reason; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, reason.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'HoldDeliveryRequest') + ..add('reason', reason)) + .toString(); + } +} + +class HoldDeliveryRequestBuilder + implements Builder { + _$HoldDeliveryRequest? _$v; + + String? _reason; + String? get reason => _$this._reason; + set reason(String? reason) => _$this._reason = reason; + + HoldDeliveryRequestBuilder() { + HoldDeliveryRequest._defaults(this); + } + + HoldDeliveryRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _reason = $v.reason; + _$v = null; + } + return this; + } + + @override + void replace(HoldDeliveryRequest other) { + _$v = other as _$HoldDeliveryRequest; + } + + @override + void update(void Function(HoldDeliveryRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + HoldDeliveryRequest build() => _build(); + + _$HoldDeliveryRequest _build() { + final _$result = _$v ?? + _$HoldDeliveryRequest._( + reason: BuiltValueNullFieldError.checkNotNull( + reason, r'HoldDeliveryRequest', 'reason'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/scan_event.dart b/packages/holzleitner_api/lib/src/model/scan_event.dart new file mode 100644 index 0000000..e890f59 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_event.dart @@ -0,0 +1,196 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/audit_action.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'scan_event.g.dart'; + +/// ScanEvent +/// +/// Properties: +/// * [action] +/// * [actorCarId] - Fahrzeug, in dem der Scan gemacht wurde. Muss zum angemeldeten Account gehören. `None` ist erlaubt, schwächt aber den Audit-Trail. +/// * [clientScanId] +/// * [clientScannedAt] +/// * [deliveryItemId] +/// * [reason] - Pflicht bei `Hold` und `Remove`. Sonst ignoriert. +@BuiltValue() +abstract class ScanEvent implements Built { + @BuiltValueField(wireName: r'action') + AuditAction get action; + // enum actionEnum { scan, unscan, hold, unhold, remove, }; + + /// Fahrzeug, in dem der Scan gemacht wurde. Muss zum angemeldeten Account gehören. `None` ist erlaubt, schwächt aber den Audit-Trail. + @BuiltValueField(wireName: r'actorCarId') + String? get actorCarId; + + @BuiltValueField(wireName: r'clientScanId') + String get clientScanId; + + @BuiltValueField(wireName: r'clientScannedAt') + DateTime get clientScannedAt; + + @BuiltValueField(wireName: r'deliveryItemId') + String get deliveryItemId; + + /// Pflicht bei `Hold` und `Remove`. Sonst ignoriert. + @BuiltValueField(wireName: r'reason') + String? get reason; + + ScanEvent._(); + + factory ScanEvent([void updates(ScanEventBuilder b)]) = _$ScanEvent; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ScanEventBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ScanEventSerializer(); +} + +class _$ScanEventSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [ScanEvent, _$ScanEvent]; + + @override + final String wireName = r'ScanEvent'; + + Iterable _serializeProperties( + Serializers serializers, + ScanEvent object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'action'; + yield serializers.serialize( + object.action, + specifiedType: const FullType(AuditAction), + ); + if (object.actorCarId != null) { + yield r'actorCarId'; + yield serializers.serialize( + object.actorCarId, + specifiedType: const FullType.nullable(String), + ); + } + yield r'clientScanId'; + yield serializers.serialize( + object.clientScanId, + specifiedType: const FullType(String), + ); + yield r'clientScannedAt'; + yield serializers.serialize( + object.clientScannedAt, + specifiedType: const FullType(DateTime), + ); + yield r'deliveryItemId'; + yield serializers.serialize( + object.deliveryItemId, + specifiedType: const FullType(String), + ); + if (object.reason != null) { + yield r'reason'; + yield serializers.serialize( + object.reason, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + ScanEvent object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required ScanEventBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'action': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(AuditAction), + ) as AuditAction; + result.action = valueDes; + break; + case r'actorCarId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.actorCarId = valueDes; + break; + case r'clientScanId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.clientScanId = valueDes; + break; + case r'clientScannedAt': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DateTime), + ) as DateTime; + result.clientScannedAt = valueDes; + break; + case r'deliveryItemId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.deliveryItemId = valueDes; + break; + case r'reason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.reason = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + ScanEvent deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = ScanEventBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/scan_event.g.dart b/packages/holzleitner_api/lib/src/model/scan_event.g.dart new file mode 100644 index 0000000..4e84c36 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_event.g.dart @@ -0,0 +1,158 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'scan_event.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$ScanEvent extends ScanEvent { + @override + final AuditAction action; + @override + final String? actorCarId; + @override + final String clientScanId; + @override + final DateTime clientScannedAt; + @override + final String deliveryItemId; + @override + final String? reason; + + factory _$ScanEvent([void Function(ScanEventBuilder)? updates]) => + (ScanEventBuilder()..update(updates))._build(); + + _$ScanEvent._( + {required this.action, + this.actorCarId, + required this.clientScanId, + required this.clientScannedAt, + required this.deliveryItemId, + this.reason}) + : super._(); + @override + ScanEvent rebuild(void Function(ScanEventBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + ScanEventBuilder toBuilder() => ScanEventBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ScanEvent && + action == other.action && + actorCarId == other.actorCarId && + clientScanId == other.clientScanId && + clientScannedAt == other.clientScannedAt && + deliveryItemId == other.deliveryItemId && + reason == other.reason; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, action.hashCode); + _$hash = $jc(_$hash, actorCarId.hashCode); + _$hash = $jc(_$hash, clientScanId.hashCode); + _$hash = $jc(_$hash, clientScannedAt.hashCode); + _$hash = $jc(_$hash, deliveryItemId.hashCode); + _$hash = $jc(_$hash, reason.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ScanEvent') + ..add('action', action) + ..add('actorCarId', actorCarId) + ..add('clientScanId', clientScanId) + ..add('clientScannedAt', clientScannedAt) + ..add('deliveryItemId', deliveryItemId) + ..add('reason', reason)) + .toString(); + } +} + +class ScanEventBuilder implements Builder { + _$ScanEvent? _$v; + + AuditAction? _action; + AuditAction? get action => _$this._action; + set action(AuditAction? action) => _$this._action = action; + + String? _actorCarId; + String? get actorCarId => _$this._actorCarId; + set actorCarId(String? actorCarId) => _$this._actorCarId = actorCarId; + + String? _clientScanId; + String? get clientScanId => _$this._clientScanId; + set clientScanId(String? clientScanId) => _$this._clientScanId = clientScanId; + + DateTime? _clientScannedAt; + DateTime? get clientScannedAt => _$this._clientScannedAt; + set clientScannedAt(DateTime? clientScannedAt) => + _$this._clientScannedAt = clientScannedAt; + + String? _deliveryItemId; + String? get deliveryItemId => _$this._deliveryItemId; + set deliveryItemId(String? deliveryItemId) => + _$this._deliveryItemId = deliveryItemId; + + String? _reason; + String? get reason => _$this._reason; + set reason(String? reason) => _$this._reason = reason; + + ScanEventBuilder() { + ScanEvent._defaults(this); + } + + ScanEventBuilder get _$this { + final $v = _$v; + if ($v != null) { + _action = $v.action; + _actorCarId = $v.actorCarId; + _clientScanId = $v.clientScanId; + _clientScannedAt = $v.clientScannedAt; + _deliveryItemId = $v.deliveryItemId; + _reason = $v.reason; + _$v = null; + } + return this; + } + + @override + void replace(ScanEvent other) { + _$v = other as _$ScanEvent; + } + + @override + void update(void Function(ScanEventBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ScanEvent build() => _build(); + + _$ScanEvent _build() { + final _$result = _$v ?? + _$ScanEvent._( + action: BuiltValueNullFieldError.checkNotNull( + action, r'ScanEvent', 'action'), + actorCarId: actorCarId, + clientScanId: BuiltValueNullFieldError.checkNotNull( + clientScanId, r'ScanEvent', 'clientScanId'), + clientScannedAt: BuiltValueNullFieldError.checkNotNull( + clientScannedAt, r'ScanEvent', 'clientScannedAt'), + deliveryItemId: BuiltValueNullFieldError.checkNotNull( + deliveryItemId, r'ScanEvent', 'deliveryItemId'), + reason: reason, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/scan_result.dart b/packages/holzleitner_api/lib/src/model/scan_result.dart new file mode 100644 index 0000000..ad9c51e --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_result.dart @@ -0,0 +1,184 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/scan_result_status.dart'; +import 'package:holzleitner_api/src/model/scan_state.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'scan_result.g.dart'; + +/// ScanResult +/// +/// Properties: +/// * [clientScanId] +/// * [deliveryItemId] - Aktueller `scan_state` der Position nach der Verarbeitung — genau dann gesetzt, wenn der Server den Stand kennen konnte (`Applied` oder `Duplicate`). Erlaubt der App, die UI ohne Re-Fetch zu aktualisieren. +/// * [newScanState] +/// * [reason] - Bei `Rejected`: Begründung. Bei `Applied`/`Duplicate`: `None`. +/// * [status] +@BuiltValue() +abstract class ScanResult implements Built { + @BuiltValueField(wireName: r'clientScanId') + String get clientScanId; + + /// Aktueller `scan_state` der Position nach der Verarbeitung — genau dann gesetzt, wenn der Server den Stand kennen konnte (`Applied` oder `Duplicate`). Erlaubt der App, die UI ohne Re-Fetch zu aktualisieren. + @BuiltValueField(wireName: r'deliveryItemId') + String? get deliveryItemId; + + @BuiltValueField(wireName: r'newScanState') + ScanState? get newScanState; + + /// Bei `Rejected`: Begründung. Bei `Applied`/`Duplicate`: `None`. + @BuiltValueField(wireName: r'reason') + String? get reason; + + @BuiltValueField(wireName: r'status') + ScanResultStatus get status; + // enum statusEnum { applied, duplicate, rejected, }; + + ScanResult._(); + + factory ScanResult([void updates(ScanResultBuilder b)]) = _$ScanResult; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ScanResultBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ScanResultSerializer(); +} + +class _$ScanResultSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [ScanResult, _$ScanResult]; + + @override + final String wireName = r'ScanResult'; + + Iterable _serializeProperties( + Serializers serializers, + ScanResult object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'clientScanId'; + yield serializers.serialize( + object.clientScanId, + specifiedType: const FullType(String), + ); + if (object.deliveryItemId != null) { + yield r'deliveryItemId'; + yield serializers.serialize( + object.deliveryItemId, + specifiedType: const FullType.nullable(String), + ); + } + if (object.newScanState != null) { + yield r'newScanState'; + yield serializers.serialize( + object.newScanState, + specifiedType: const FullType.nullable(ScanState), + ); + } + if (object.reason != null) { + yield r'reason'; + yield serializers.serialize( + object.reason, + specifiedType: const FullType.nullable(String), + ); + } + yield r'status'; + yield serializers.serialize( + object.status, + specifiedType: const FullType(ScanResultStatus), + ); + } + + @override + Object serialize( + Serializers serializers, + ScanResult object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required ScanResultBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'clientScanId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.clientScanId = valueDes; + break; + case r'deliveryItemId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.deliveryItemId = valueDes; + break; + case r'newScanState': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(ScanState), + ) as ScanState?; + if (valueDes == null) continue; + result.newScanState.replace(valueDes); + break; + case r'reason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.reason = valueDes; + break; + case r'status': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(ScanResultStatus), + ) as ScanResultStatus; + result.status = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + ScanResult deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = ScanResultBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/scan_result.g.dart b/packages/holzleitner_api/lib/src/model/scan_result.g.dart new file mode 100644 index 0000000..352dc68 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_result.g.dart @@ -0,0 +1,158 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'scan_result.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$ScanResult extends ScanResult { + @override + final String clientScanId; + @override + final String? deliveryItemId; + @override + final ScanState? newScanState; + @override + final String? reason; + @override + final ScanResultStatus status; + + factory _$ScanResult([void Function(ScanResultBuilder)? updates]) => + (ScanResultBuilder()..update(updates))._build(); + + _$ScanResult._( + {required this.clientScanId, + this.deliveryItemId, + this.newScanState, + this.reason, + required this.status}) + : super._(); + @override + ScanResult rebuild(void Function(ScanResultBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + ScanResultBuilder toBuilder() => ScanResultBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ScanResult && + clientScanId == other.clientScanId && + deliveryItemId == other.deliveryItemId && + newScanState == other.newScanState && + reason == other.reason && + status == other.status; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, clientScanId.hashCode); + _$hash = $jc(_$hash, deliveryItemId.hashCode); + _$hash = $jc(_$hash, newScanState.hashCode); + _$hash = $jc(_$hash, reason.hashCode); + _$hash = $jc(_$hash, status.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ScanResult') + ..add('clientScanId', clientScanId) + ..add('deliveryItemId', deliveryItemId) + ..add('newScanState', newScanState) + ..add('reason', reason) + ..add('status', status)) + .toString(); + } +} + +class ScanResultBuilder implements Builder { + _$ScanResult? _$v; + + String? _clientScanId; + String? get clientScanId => _$this._clientScanId; + set clientScanId(String? clientScanId) => _$this._clientScanId = clientScanId; + + String? _deliveryItemId; + String? get deliveryItemId => _$this._deliveryItemId; + set deliveryItemId(String? deliveryItemId) => + _$this._deliveryItemId = deliveryItemId; + + ScanStateBuilder? _newScanState; + ScanStateBuilder get newScanState => + _$this._newScanState ??= ScanStateBuilder(); + set newScanState(ScanStateBuilder? newScanState) => + _$this._newScanState = newScanState; + + String? _reason; + String? get reason => _$this._reason; + set reason(String? reason) => _$this._reason = reason; + + ScanResultStatus? _status; + ScanResultStatus? get status => _$this._status; + set status(ScanResultStatus? status) => _$this._status = status; + + ScanResultBuilder() { + ScanResult._defaults(this); + } + + ScanResultBuilder get _$this { + final $v = _$v; + if ($v != null) { + _clientScanId = $v.clientScanId; + _deliveryItemId = $v.deliveryItemId; + _newScanState = $v.newScanState?.toBuilder(); + _reason = $v.reason; + _status = $v.status; + _$v = null; + } + return this; + } + + @override + void replace(ScanResult other) { + _$v = other as _$ScanResult; + } + + @override + void update(void Function(ScanResultBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ScanResult build() => _build(); + + _$ScanResult _build() { + _$ScanResult _$result; + try { + _$result = _$v ?? + _$ScanResult._( + clientScanId: BuiltValueNullFieldError.checkNotNull( + clientScanId, r'ScanResult', 'clientScanId'), + deliveryItemId: deliveryItemId, + newScanState: _newScanState?.build(), + reason: reason, + status: BuiltValueNullFieldError.checkNotNull( + status, r'ScanResult', 'status'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'newScanState'; + _newScanState?.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'ScanResult', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/scan_result_status.dart b/packages/holzleitner_api/lib/src/model/scan_result_status.dart new file mode 100644 index 0000000..b0f9c14 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_result_status.dart @@ -0,0 +1,36 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'scan_result_status.g.dart'; + +class ScanResultStatus extends EnumClass { + + @BuiltValueEnumConst(wireName: r'applied') + static const ScanResultStatus applied = _$applied; + @BuiltValueEnumConst(wireName: r'duplicate') + static const ScanResultStatus duplicate = _$duplicate; + @BuiltValueEnumConst(wireName: r'rejected') + static const ScanResultStatus rejected = _$rejected; + + static Serializer get serializer => _$scanResultStatusSerializer; + + const ScanResultStatus._(String name): super(name); + + static BuiltSet get values => _$values; + static ScanResultStatus valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class ScanResultStatusMixin = Object with _$ScanResultStatusMixin; + diff --git a/packages/holzleitner_api/lib/src/model/scan_result_status.g.dart b/packages/holzleitner_api/lib/src/model/scan_result_status.g.dart new file mode 100644 index 0000000..59a41a4 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_result_status.g.dart @@ -0,0 +1,80 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'scan_result_status.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +const ScanResultStatus _$applied = const ScanResultStatus._('applied'); +const ScanResultStatus _$duplicate = const ScanResultStatus._('duplicate'); +const ScanResultStatus _$rejected = const ScanResultStatus._('rejected'); + +ScanResultStatus _$valueOf(String name) { + switch (name) { + case 'applied': + return _$applied; + case 'duplicate': + return _$duplicate; + case 'rejected': + return _$rejected; + default: + throw ArgumentError(name); + } +} + +final BuiltSet _$values = + BuiltSet(const [ + _$applied, + _$duplicate, + _$rejected, +]); + +class _$ScanResultStatusMeta { + const _$ScanResultStatusMeta(); + ScanResultStatus get applied => _$applied; + ScanResultStatus get duplicate => _$duplicate; + ScanResultStatus get rejected => _$rejected; + ScanResultStatus valueOf(String name) => _$valueOf(name); + BuiltSet get values => _$values; +} + +abstract class _$ScanResultStatusMixin { + // ignore: non_constant_identifier_names + _$ScanResultStatusMeta get ScanResultStatus => const _$ScanResultStatusMeta(); +} + +Serializer _$scanResultStatusSerializer = + _$ScanResultStatusSerializer(); + +class _$ScanResultStatusSerializer + implements PrimitiveSerializer { + static const Map _toWire = const { + 'applied': 'applied', + 'duplicate': 'duplicate', + 'rejected': 'rejected', + }; + static const Map _fromWire = const { + 'applied': 'applied', + 'duplicate': 'duplicate', + 'rejected': 'rejected', + }; + + @override + final Iterable types = const [ScanResultStatus]; + @override + final String wireName = 'ScanResultStatus'; + + @override + Object serialize(Serializers serializers, ScanResultStatus object, + {FullType specifiedType = FullType.unspecified}) => + _toWire[object.name] ?? object.name; + + @override + ScanResultStatus deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) => + ScanResultStatus.valueOf( + _fromWire[serialized] ?? (serialized is String ? serialized : '')); +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/scan_state.dart b/packages/holzleitner_api/lib/src/model/scan_state.dart new file mode 100644 index 0000000..22dc4f8 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_state.dart @@ -0,0 +1,160 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/scan_status.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'scan_state.g.dart'; + +/// Eingebetteter Scan-Zustand pro [`DeliveryItem`]. Wird durch `ScanAuditEntry`-Events fortgeschrieben — das Audit-Log ist die Wahrheit über das WIE und WANN, dieses Embedded-VO ist die schnelle Wahrheit über das WIEVIEL. +/// +/// Properties: +/// * [heldReason] - Grund bei `status == Held` oder `status == Removed`. +/// * [lastUpdatedAt] +/// * [scannedQuantity] +/// * [status] +@BuiltValue() +abstract class ScanState implements Built { + /// Grund bei `status == Held` oder `status == Removed`. + @BuiltValueField(wireName: r'heldReason') + String? get heldReason; + + @BuiltValueField(wireName: r'lastUpdatedAt') + DateTime get lastUpdatedAt; + + @BuiltValueField(wireName: r'scannedQuantity') + int get scannedQuantity; + + @BuiltValueField(wireName: r'status') + ScanStatus get status; + // enum statusEnum { in_progress, done, held, removed, }; + + ScanState._(); + + factory ScanState([void updates(ScanStateBuilder b)]) = _$ScanState; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ScanStateBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ScanStateSerializer(); +} + +class _$ScanStateSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [ScanState, _$ScanState]; + + @override + final String wireName = r'ScanState'; + + Iterable _serializeProperties( + Serializers serializers, + ScanState object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.heldReason != null) { + yield r'heldReason'; + yield serializers.serialize( + object.heldReason, + specifiedType: const FullType.nullable(String), + ); + } + yield r'lastUpdatedAt'; + yield serializers.serialize( + object.lastUpdatedAt, + specifiedType: const FullType(DateTime), + ); + yield r'scannedQuantity'; + yield serializers.serialize( + object.scannedQuantity, + specifiedType: const FullType(int), + ); + yield r'status'; + yield serializers.serialize( + object.status, + specifiedType: const FullType(ScanStatus), + ); + } + + @override + Object serialize( + Serializers serializers, + ScanState object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required ScanStateBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'heldReason': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.heldReason = valueDes; + break; + case r'lastUpdatedAt': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DateTime), + ) as DateTime; + result.lastUpdatedAt = valueDes; + break; + case r'scannedQuantity': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.scannedQuantity = valueDes; + break; + case r'status': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(ScanStatus), + ) as ScanStatus; + result.status = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + ScanState deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = ScanStateBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/scan_state.g.dart b/packages/holzleitner_api/lib/src/model/scan_state.g.dart new file mode 100644 index 0000000..5a76b1f --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_state.g.dart @@ -0,0 +1,133 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'scan_state.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$ScanState extends ScanState { + @override + final String? heldReason; + @override + final DateTime lastUpdatedAt; + @override + final int scannedQuantity; + @override + final ScanStatus status; + + factory _$ScanState([void Function(ScanStateBuilder)? updates]) => + (ScanStateBuilder()..update(updates))._build(); + + _$ScanState._( + {this.heldReason, + required this.lastUpdatedAt, + required this.scannedQuantity, + required this.status}) + : super._(); + @override + ScanState rebuild(void Function(ScanStateBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + ScanStateBuilder toBuilder() => ScanStateBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ScanState && + heldReason == other.heldReason && + lastUpdatedAt == other.lastUpdatedAt && + scannedQuantity == other.scannedQuantity && + status == other.status; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, heldReason.hashCode); + _$hash = $jc(_$hash, lastUpdatedAt.hashCode); + _$hash = $jc(_$hash, scannedQuantity.hashCode); + _$hash = $jc(_$hash, status.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ScanState') + ..add('heldReason', heldReason) + ..add('lastUpdatedAt', lastUpdatedAt) + ..add('scannedQuantity', scannedQuantity) + ..add('status', status)) + .toString(); + } +} + +class ScanStateBuilder implements Builder { + _$ScanState? _$v; + + String? _heldReason; + String? get heldReason => _$this._heldReason; + set heldReason(String? heldReason) => _$this._heldReason = heldReason; + + DateTime? _lastUpdatedAt; + DateTime? get lastUpdatedAt => _$this._lastUpdatedAt; + set lastUpdatedAt(DateTime? lastUpdatedAt) => + _$this._lastUpdatedAt = lastUpdatedAt; + + int? _scannedQuantity; + int? get scannedQuantity => _$this._scannedQuantity; + set scannedQuantity(int? scannedQuantity) => + _$this._scannedQuantity = scannedQuantity; + + ScanStatus? _status; + ScanStatus? get status => _$this._status; + set status(ScanStatus? status) => _$this._status = status; + + ScanStateBuilder() { + ScanState._defaults(this); + } + + ScanStateBuilder get _$this { + final $v = _$v; + if ($v != null) { + _heldReason = $v.heldReason; + _lastUpdatedAt = $v.lastUpdatedAt; + _scannedQuantity = $v.scannedQuantity; + _status = $v.status; + _$v = null; + } + return this; + } + + @override + void replace(ScanState other) { + _$v = other as _$ScanState; + } + + @override + void update(void Function(ScanStateBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ScanState build() => _build(); + + _$ScanState _build() { + final _$result = _$v ?? + _$ScanState._( + heldReason: heldReason, + lastUpdatedAt: BuiltValueNullFieldError.checkNotNull( + lastUpdatedAt, r'ScanState', 'lastUpdatedAt'), + scannedQuantity: BuiltValueNullFieldError.checkNotNull( + scannedQuantity, r'ScanState', 'scannedQuantity'), + status: BuiltValueNullFieldError.checkNotNull( + status, r'ScanState', 'status'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/scan_status.dart b/packages/holzleitner_api/lib/src/model/scan_status.dart new file mode 100644 index 0000000..2f3ab45 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_status.dart @@ -0,0 +1,42 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'scan_status.g.dart'; + +class ScanStatus extends EnumClass { + + /// Status einer einzelnen Scan-Position innerhalb eines Items. + @BuiltValueEnumConst(wireName: r'in_progress') + static const ScanStatus inProgress = _$inProgress; + /// Status einer einzelnen Scan-Position innerhalb eines Items. + @BuiltValueEnumConst(wireName: r'done') + static const ScanStatus done = _$done; + /// Status einer einzelnen Scan-Position innerhalb eines Items. + @BuiltValueEnumConst(wireName: r'held') + static const ScanStatus held = _$held; + /// Status einer einzelnen Scan-Position innerhalb eines Items. + @BuiltValueEnumConst(wireName: r'removed') + static const ScanStatus removed = _$removed; + + static Serializer get serializer => _$scanStatusSerializer; + + const ScanStatus._(String name): super(name); + + static BuiltSet get values => _$values; + static ScanStatus valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class ScanStatusMixin = Object with _$ScanStatusMixin; + diff --git a/packages/holzleitner_api/lib/src/model/scan_status.g.dart b/packages/holzleitner_api/lib/src/model/scan_status.g.dart new file mode 100644 index 0000000..37a1eb6 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/scan_status.g.dart @@ -0,0 +1,84 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'scan_status.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +const ScanStatus _$inProgress = const ScanStatus._('inProgress'); +const ScanStatus _$done = const ScanStatus._('done'); +const ScanStatus _$held = const ScanStatus._('held'); +const ScanStatus _$removed = const ScanStatus._('removed'); + +ScanStatus _$valueOf(String name) { + switch (name) { + case 'inProgress': + return _$inProgress; + case 'done': + return _$done; + case 'held': + return _$held; + case 'removed': + return _$removed; + default: + throw ArgumentError(name); + } +} + +final BuiltSet _$values = BuiltSet(const [ + _$inProgress, + _$done, + _$held, + _$removed, +]); + +class _$ScanStatusMeta { + const _$ScanStatusMeta(); + ScanStatus get inProgress => _$inProgress; + ScanStatus get done => _$done; + ScanStatus get held => _$held; + ScanStatus get removed => _$removed; + ScanStatus valueOf(String name) => _$valueOf(name); + BuiltSet get values => _$values; +} + +abstract class _$ScanStatusMixin { + // ignore: non_constant_identifier_names + _$ScanStatusMeta get ScanStatus => const _$ScanStatusMeta(); +} + +Serializer _$scanStatusSerializer = _$ScanStatusSerializer(); + +class _$ScanStatusSerializer implements PrimitiveSerializer { + static const Map _toWire = const { + 'inProgress': 'in_progress', + 'done': 'done', + 'held': 'held', + 'removed': 'removed', + }; + static const Map _fromWire = const { + 'in_progress': 'inProgress', + 'done': 'done', + 'held': 'held', + 'removed': 'removed', + }; + + @override + final Iterable types = const [ScanStatus]; + @override + final String wireName = 'ScanStatus'; + + @override + Object serialize(Serializers serializers, ScanStatus object, + {FullType specifiedType = FullType.unspecified}) => + _toWire[object.name] ?? object.name; + + @override + ScanStatus deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) => + ScanStatus.valueOf( + _fromWire[serialized] ?? (serialized is String ? serialized : '')); +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/set_delivery_order_request.dart b/packages/holzleitner_api/lib/src/model/set_delivery_order_request.dart new file mode 100644 index 0000000..08a9c3d --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/set_delivery_order_request.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'set_delivery_order_request.g.dart'; + +/// SetDeliveryOrderRequest +/// +/// Properties: +/// * [deliveryIds] - Reihenfolge: Position im Array (0-basiert) wird zu `sort_order` (1-basiert) gemappt. +@BuiltValue() +abstract class SetDeliveryOrderRequest implements Built { + /// Reihenfolge: Position im Array (0-basiert) wird zu `sort_order` (1-basiert) gemappt. + @BuiltValueField(wireName: r'deliveryIds') + BuiltList get deliveryIds; + + SetDeliveryOrderRequest._(); + + factory SetDeliveryOrderRequest([void updates(SetDeliveryOrderRequestBuilder b)]) = _$SetDeliveryOrderRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(SetDeliveryOrderRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SetDeliveryOrderRequestSerializer(); +} + +class _$SetDeliveryOrderRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [SetDeliveryOrderRequest, _$SetDeliveryOrderRequest]; + + @override + final String wireName = r'SetDeliveryOrderRequest'; + + Iterable _serializeProperties( + Serializers serializers, + SetDeliveryOrderRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'deliveryIds'; + yield serializers.serialize( + object.deliveryIds, + specifiedType: const FullType(BuiltList, [FullType(String)]), + ); + } + + @override + Object serialize( + Serializers serializers, + SetDeliveryOrderRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required SetDeliveryOrderRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'deliveryIds': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(String)]), + ) as BuiltList; + result.deliveryIds.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + SetDeliveryOrderRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = SetDeliveryOrderRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/set_delivery_order_request.g.dart b/packages/holzleitner_api/lib/src/model/set_delivery_order_request.g.dart new file mode 100644 index 0000000..453f0e9 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/set_delivery_order_request.g.dart @@ -0,0 +1,109 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'set_delivery_order_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$SetDeliveryOrderRequest extends SetDeliveryOrderRequest { + @override + final BuiltList deliveryIds; + + factory _$SetDeliveryOrderRequest( + [void Function(SetDeliveryOrderRequestBuilder)? updates]) => + (SetDeliveryOrderRequestBuilder()..update(updates))._build(); + + _$SetDeliveryOrderRequest._({required this.deliveryIds}) : super._(); + @override + SetDeliveryOrderRequest rebuild( + void Function(SetDeliveryOrderRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + SetDeliveryOrderRequestBuilder toBuilder() => + SetDeliveryOrderRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is SetDeliveryOrderRequest && deliveryIds == other.deliveryIds; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, deliveryIds.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'SetDeliveryOrderRequest') + ..add('deliveryIds', deliveryIds)) + .toString(); + } +} + +class SetDeliveryOrderRequestBuilder + implements + Builder { + _$SetDeliveryOrderRequest? _$v; + + ListBuilder? _deliveryIds; + ListBuilder get deliveryIds => + _$this._deliveryIds ??= ListBuilder(); + set deliveryIds(ListBuilder? deliveryIds) => + _$this._deliveryIds = deliveryIds; + + SetDeliveryOrderRequestBuilder() { + SetDeliveryOrderRequest._defaults(this); + } + + SetDeliveryOrderRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _deliveryIds = $v.deliveryIds.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(SetDeliveryOrderRequest other) { + _$v = other as _$SetDeliveryOrderRequest; + } + + @override + void update(void Function(SetDeliveryOrderRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + SetDeliveryOrderRequest build() => _build(); + + _$SetDeliveryOrderRequest _build() { + _$SetDeliveryOrderRequest _$result; + try { + _$result = _$v ?? + _$SetDeliveryOrderRequest._( + deliveryIds: deliveryIds.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'deliveryIds'; + deliveryIds.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'SetDeliveryOrderRequest', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/set_delivery_order_response.dart b/packages/holzleitner_api/lib/src/model/set_delivery_order_response.dart new file mode 100644 index 0000000..4fa2d55 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/set_delivery_order_response.dart @@ -0,0 +1,124 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/delivery_order_entry.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'set_delivery_order_response.g.dart'; + +/// SetDeliveryOrderResponse +/// +/// Properties: +/// * [order] +/// * [tourId] +@BuiltValue() +abstract class SetDeliveryOrderResponse implements Built { + @BuiltValueField(wireName: r'order') + BuiltList get order; + + @BuiltValueField(wireName: r'tourId') + String get tourId; + + SetDeliveryOrderResponse._(); + + factory SetDeliveryOrderResponse([void updates(SetDeliveryOrderResponseBuilder b)]) = _$SetDeliveryOrderResponse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(SetDeliveryOrderResponseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SetDeliveryOrderResponseSerializer(); +} + +class _$SetDeliveryOrderResponseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [SetDeliveryOrderResponse, _$SetDeliveryOrderResponse]; + + @override + final String wireName = r'SetDeliveryOrderResponse'; + + Iterable _serializeProperties( + Serializers serializers, + SetDeliveryOrderResponse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'order'; + yield serializers.serialize( + object.order, + specifiedType: const FullType(BuiltList, [FullType(DeliveryOrderEntry)]), + ); + yield r'tourId'; + yield serializers.serialize( + object.tourId, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + SetDeliveryOrderResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required SetDeliveryOrderResponseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'order': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(DeliveryOrderEntry)]), + ) as BuiltList; + result.order.replace(valueDes); + break; + case r'tourId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.tourId = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + SetDeliveryOrderResponse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = SetDeliveryOrderResponseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/set_delivery_order_response.g.dart b/packages/holzleitner_api/lib/src/model/set_delivery_order_response.g.dart new file mode 100644 index 0000000..d2b192c --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/set_delivery_order_response.g.dart @@ -0,0 +1,122 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'set_delivery_order_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$SetDeliveryOrderResponse extends SetDeliveryOrderResponse { + @override + final BuiltList order; + @override + final String tourId; + + factory _$SetDeliveryOrderResponse( + [void Function(SetDeliveryOrderResponseBuilder)? updates]) => + (SetDeliveryOrderResponseBuilder()..update(updates))._build(); + + _$SetDeliveryOrderResponse._({required this.order, required this.tourId}) + : super._(); + @override + SetDeliveryOrderResponse rebuild( + void Function(SetDeliveryOrderResponseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + SetDeliveryOrderResponseBuilder toBuilder() => + SetDeliveryOrderResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is SetDeliveryOrderResponse && + order == other.order && + tourId == other.tourId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, order.hashCode); + _$hash = $jc(_$hash, tourId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'SetDeliveryOrderResponse') + ..add('order', order) + ..add('tourId', tourId)) + .toString(); + } +} + +class SetDeliveryOrderResponseBuilder + implements + Builder { + _$SetDeliveryOrderResponse? _$v; + + ListBuilder? _order; + ListBuilder get order => + _$this._order ??= ListBuilder(); + set order(ListBuilder? order) => _$this._order = order; + + String? _tourId; + String? get tourId => _$this._tourId; + set tourId(String? tourId) => _$this._tourId = tourId; + + SetDeliveryOrderResponseBuilder() { + SetDeliveryOrderResponse._defaults(this); + } + + SetDeliveryOrderResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _order = $v.order.toBuilder(); + _tourId = $v.tourId; + _$v = null; + } + return this; + } + + @override + void replace(SetDeliveryOrderResponse other) { + _$v = other as _$SetDeliveryOrderResponse; + } + + @override + void update(void Function(SetDeliveryOrderResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + SetDeliveryOrderResponse build() => _build(); + + _$SetDeliveryOrderResponse _build() { + _$SetDeliveryOrderResponse _$result; + try { + _$result = _$v ?? + _$SetDeliveryOrderResponse._( + order: order.build(), + tourId: BuiltValueNullFieldError.checkNotNull( + tourId, r'SetDeliveryOrderResponse', 'tourId'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'order'; + order.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'SetDeliveryOrderResponse', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/sync_delivery.dart b/packages/holzleitner_api/lib/src/model/sync_delivery.dart new file mode 100644 index 0000000..c412e7e --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_delivery.dart @@ -0,0 +1,261 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/sync_delivery_item.dart'; +import 'package:holzleitner_api/src/model/address.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'sync_delivery.g.dart'; + +/// SyncDelivery +/// +/// Properties: +/// * [belegartId] +/// * [belegnummer] +/// * [customerAddress] +/// * [customerName] +/// * [deliveryAddress] - Snapshot der Lieferadresse (kann von der Stammadresse abweichen). +/// * [desiredTime] +/// * [erpCustomerId] +/// * [items] +/// * [sortOrder] - 1-basiert, definiert die initiale Reihenfolge in der App. +/// * [specialAgreements] +@BuiltValue() +abstract class SyncDelivery implements Built { + @BuiltValueField(wireName: r'belegartId') + int get belegartId; + + @BuiltValueField(wireName: r'belegnummer') + String get belegnummer; + + @BuiltValueField(wireName: r'customerAddress') + Address get customerAddress; + + @BuiltValueField(wireName: r'customerName') + String get customerName; + + /// Snapshot der Lieferadresse (kann von der Stammadresse abweichen). + @BuiltValueField(wireName: r'deliveryAddress') + Address get deliveryAddress; + + @BuiltValueField(wireName: r'desiredTime') + String? get desiredTime; + + @BuiltValueField(wireName: r'erpCustomerId') + int get erpCustomerId; + + @BuiltValueField(wireName: r'items') + BuiltList get items; + + /// 1-basiert, definiert die initiale Reihenfolge in der App. + @BuiltValueField(wireName: r'sortOrder') + int get sortOrder; + + @BuiltValueField(wireName: r'specialAgreements') + String? get specialAgreements; + + SyncDelivery._(); + + factory SyncDelivery([void updates(SyncDeliveryBuilder b)]) = _$SyncDelivery; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(SyncDeliveryBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SyncDeliverySerializer(); +} + +class _$SyncDeliverySerializer implements PrimitiveSerializer { + @override + final Iterable types = const [SyncDelivery, _$SyncDelivery]; + + @override + final String wireName = r'SyncDelivery'; + + Iterable _serializeProperties( + Serializers serializers, + SyncDelivery object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'belegartId'; + yield serializers.serialize( + object.belegartId, + specifiedType: const FullType(int), + ); + yield r'belegnummer'; + yield serializers.serialize( + object.belegnummer, + specifiedType: const FullType(String), + ); + yield r'customerAddress'; + yield serializers.serialize( + object.customerAddress, + specifiedType: const FullType(Address), + ); + yield r'customerName'; + yield serializers.serialize( + object.customerName, + specifiedType: const FullType(String), + ); + yield r'deliveryAddress'; + yield serializers.serialize( + object.deliveryAddress, + specifiedType: const FullType(Address), + ); + if (object.desiredTime != null) { + yield r'desiredTime'; + yield serializers.serialize( + object.desiredTime, + specifiedType: const FullType.nullable(String), + ); + } + yield r'erpCustomerId'; + yield serializers.serialize( + object.erpCustomerId, + specifiedType: const FullType(int), + ); + yield r'items'; + yield serializers.serialize( + object.items, + specifiedType: const FullType(BuiltList, [FullType(SyncDeliveryItem)]), + ); + yield r'sortOrder'; + yield serializers.serialize( + object.sortOrder, + specifiedType: const FullType(int), + ); + if (object.specialAgreements != null) { + yield r'specialAgreements'; + yield serializers.serialize( + object.specialAgreements, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + SyncDelivery object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required SyncDeliveryBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'belegartId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.belegartId = valueDes; + break; + case r'belegnummer': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.belegnummer = valueDes; + break; + case r'customerAddress': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Address), + ) as Address; + result.customerAddress.replace(valueDes); + break; + case r'customerName': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.customerName = valueDes; + break; + case r'deliveryAddress': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Address), + ) as Address; + result.deliveryAddress.replace(valueDes); + break; + case r'desiredTime': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.desiredTime = valueDes; + break; + case r'erpCustomerId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.erpCustomerId = valueDes; + break; + case r'items': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(SyncDeliveryItem)]), + ) as BuiltList; + result.items.replace(valueDes); + break; + case r'sortOrder': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.sortOrder = valueDes; + break; + case r'specialAgreements': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.specialAgreements = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + SyncDelivery deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = SyncDeliveryBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/sync_delivery.g.dart b/packages/holzleitner_api/lib/src/model/sync_delivery.g.dart new file mode 100644 index 0000000..7d9c1b2 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_delivery.g.dart @@ -0,0 +1,232 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sync_delivery.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$SyncDelivery extends SyncDelivery { + @override + final int belegartId; + @override + final String belegnummer; + @override + final Address customerAddress; + @override + final String customerName; + @override + final Address deliveryAddress; + @override + final String? desiredTime; + @override + final int erpCustomerId; + @override + final BuiltList items; + @override + final int sortOrder; + @override + final String? specialAgreements; + + factory _$SyncDelivery([void Function(SyncDeliveryBuilder)? updates]) => + (SyncDeliveryBuilder()..update(updates))._build(); + + _$SyncDelivery._( + {required this.belegartId, + required this.belegnummer, + required this.customerAddress, + required this.customerName, + required this.deliveryAddress, + this.desiredTime, + required this.erpCustomerId, + required this.items, + required this.sortOrder, + this.specialAgreements}) + : super._(); + @override + SyncDelivery rebuild(void Function(SyncDeliveryBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + SyncDeliveryBuilder toBuilder() => SyncDeliveryBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is SyncDelivery && + belegartId == other.belegartId && + belegnummer == other.belegnummer && + customerAddress == other.customerAddress && + customerName == other.customerName && + deliveryAddress == other.deliveryAddress && + desiredTime == other.desiredTime && + erpCustomerId == other.erpCustomerId && + items == other.items && + sortOrder == other.sortOrder && + specialAgreements == other.specialAgreements; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, belegartId.hashCode); + _$hash = $jc(_$hash, belegnummer.hashCode); + _$hash = $jc(_$hash, customerAddress.hashCode); + _$hash = $jc(_$hash, customerName.hashCode); + _$hash = $jc(_$hash, deliveryAddress.hashCode); + _$hash = $jc(_$hash, desiredTime.hashCode); + _$hash = $jc(_$hash, erpCustomerId.hashCode); + _$hash = $jc(_$hash, items.hashCode); + _$hash = $jc(_$hash, sortOrder.hashCode); + _$hash = $jc(_$hash, specialAgreements.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'SyncDelivery') + ..add('belegartId', belegartId) + ..add('belegnummer', belegnummer) + ..add('customerAddress', customerAddress) + ..add('customerName', customerName) + ..add('deliveryAddress', deliveryAddress) + ..add('desiredTime', desiredTime) + ..add('erpCustomerId', erpCustomerId) + ..add('items', items) + ..add('sortOrder', sortOrder) + ..add('specialAgreements', specialAgreements)) + .toString(); + } +} + +class SyncDeliveryBuilder + implements Builder { + _$SyncDelivery? _$v; + + int? _belegartId; + int? get belegartId => _$this._belegartId; + set belegartId(int? belegartId) => _$this._belegartId = belegartId; + + String? _belegnummer; + String? get belegnummer => _$this._belegnummer; + set belegnummer(String? belegnummer) => _$this._belegnummer = belegnummer; + + AddressBuilder? _customerAddress; + AddressBuilder get customerAddress => + _$this._customerAddress ??= AddressBuilder(); + set customerAddress(AddressBuilder? customerAddress) => + _$this._customerAddress = customerAddress; + + String? _customerName; + String? get customerName => _$this._customerName; + set customerName(String? customerName) => _$this._customerName = customerName; + + AddressBuilder? _deliveryAddress; + AddressBuilder get deliveryAddress => + _$this._deliveryAddress ??= AddressBuilder(); + set deliveryAddress(AddressBuilder? deliveryAddress) => + _$this._deliveryAddress = deliveryAddress; + + String? _desiredTime; + String? get desiredTime => _$this._desiredTime; + set desiredTime(String? desiredTime) => _$this._desiredTime = desiredTime; + + int? _erpCustomerId; + int? get erpCustomerId => _$this._erpCustomerId; + set erpCustomerId(int? erpCustomerId) => + _$this._erpCustomerId = erpCustomerId; + + ListBuilder? _items; + ListBuilder get items => + _$this._items ??= ListBuilder(); + set items(ListBuilder? items) => _$this._items = items; + + int? _sortOrder; + int? get sortOrder => _$this._sortOrder; + set sortOrder(int? sortOrder) => _$this._sortOrder = sortOrder; + + String? _specialAgreements; + String? get specialAgreements => _$this._specialAgreements; + set specialAgreements(String? specialAgreements) => + _$this._specialAgreements = specialAgreements; + + SyncDeliveryBuilder() { + SyncDelivery._defaults(this); + } + + SyncDeliveryBuilder get _$this { + final $v = _$v; + if ($v != null) { + _belegartId = $v.belegartId; + _belegnummer = $v.belegnummer; + _customerAddress = $v.customerAddress.toBuilder(); + _customerName = $v.customerName; + _deliveryAddress = $v.deliveryAddress.toBuilder(); + _desiredTime = $v.desiredTime; + _erpCustomerId = $v.erpCustomerId; + _items = $v.items.toBuilder(); + _sortOrder = $v.sortOrder; + _specialAgreements = $v.specialAgreements; + _$v = null; + } + return this; + } + + @override + void replace(SyncDelivery other) { + _$v = other as _$SyncDelivery; + } + + @override + void update(void Function(SyncDeliveryBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + SyncDelivery build() => _build(); + + _$SyncDelivery _build() { + _$SyncDelivery _$result; + try { + _$result = _$v ?? + _$SyncDelivery._( + belegartId: BuiltValueNullFieldError.checkNotNull( + belegartId, r'SyncDelivery', 'belegartId'), + belegnummer: BuiltValueNullFieldError.checkNotNull( + belegnummer, r'SyncDelivery', 'belegnummer'), + customerAddress: customerAddress.build(), + customerName: BuiltValueNullFieldError.checkNotNull( + customerName, r'SyncDelivery', 'customerName'), + deliveryAddress: deliveryAddress.build(), + desiredTime: desiredTime, + erpCustomerId: BuiltValueNullFieldError.checkNotNull( + erpCustomerId, r'SyncDelivery', 'erpCustomerId'), + items: items.build(), + sortOrder: BuiltValueNullFieldError.checkNotNull( + sortOrder, r'SyncDelivery', 'sortOrder'), + specialAgreements: specialAgreements, + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'customerAddress'; + customerAddress.build(); + + _$failedField = 'deliveryAddress'; + deliveryAddress.build(); + + _$failedField = 'items'; + items.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'SyncDelivery', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/sync_delivery_item.dart b/packages/holzleitner_api/lib/src/model/sync_delivery_item.dart new file mode 100644 index 0000000..27d42fb --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_delivery_item.dart @@ -0,0 +1,242 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'sync_delivery_item.g.dart'; + +/// SyncDeliveryItem +/// +/// Properties: +/// * [articleDefaultWarehouseCode] - Default-Lager-Code für den Artikel (Anlage neuer Artikel). +/// * [articleName] +/// * [articleNumber] +/// * [articleScannable] +/// * [belegzeilenNr] +/// * [komponentenArtikelNr] - Komponenten-Artikelnummer bei aufgelösten Stücklisten, sonst leer. +/// * [requiredQuantity] +/// * [warehouseCode] +/// * [warehouseName] +@BuiltValue() +abstract class SyncDeliveryItem implements Built { + /// Default-Lager-Code für den Artikel (Anlage neuer Artikel). + @BuiltValueField(wireName: r'articleDefaultWarehouseCode') + String? get articleDefaultWarehouseCode; + + @BuiltValueField(wireName: r'articleName') + String get articleName; + + @BuiltValueField(wireName: r'articleNumber') + String get articleNumber; + + @BuiltValueField(wireName: r'articleScannable') + bool get articleScannable; + + @BuiltValueField(wireName: r'belegzeilenNr') + int get belegzeilenNr; + + /// Komponenten-Artikelnummer bei aufgelösten Stücklisten, sonst leer. + @BuiltValueField(wireName: r'komponentenArtikelNr') + String? get komponentenArtikelNr; + + @BuiltValueField(wireName: r'requiredQuantity') + int get requiredQuantity; + + @BuiltValueField(wireName: r'warehouseCode') + String get warehouseCode; + + @BuiltValueField(wireName: r'warehouseName') + String get warehouseName; + + SyncDeliveryItem._(); + + factory SyncDeliveryItem([void updates(SyncDeliveryItemBuilder b)]) = _$SyncDeliveryItem; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(SyncDeliveryItemBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SyncDeliveryItemSerializer(); +} + +class _$SyncDeliveryItemSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [SyncDeliveryItem, _$SyncDeliveryItem]; + + @override + final String wireName = r'SyncDeliveryItem'; + + Iterable _serializeProperties( + Serializers serializers, + SyncDeliveryItem object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.articleDefaultWarehouseCode != null) { + yield r'articleDefaultWarehouseCode'; + yield serializers.serialize( + object.articleDefaultWarehouseCode, + specifiedType: const FullType.nullable(String), + ); + } + yield r'articleName'; + yield serializers.serialize( + object.articleName, + specifiedType: const FullType(String), + ); + yield r'articleNumber'; + yield serializers.serialize( + object.articleNumber, + specifiedType: const FullType(String), + ); + yield r'articleScannable'; + yield serializers.serialize( + object.articleScannable, + specifiedType: const FullType(bool), + ); + yield r'belegzeilenNr'; + yield serializers.serialize( + object.belegzeilenNr, + specifiedType: const FullType(int), + ); + if (object.komponentenArtikelNr != null) { + yield r'komponentenArtikelNr'; + yield serializers.serialize( + object.komponentenArtikelNr, + specifiedType: const FullType.nullable(String), + ); + } + yield r'requiredQuantity'; + yield serializers.serialize( + object.requiredQuantity, + specifiedType: const FullType(int), + ); + yield r'warehouseCode'; + yield serializers.serialize( + object.warehouseCode, + specifiedType: const FullType(String), + ); + yield r'warehouseName'; + yield serializers.serialize( + object.warehouseName, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + SyncDeliveryItem object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required SyncDeliveryItemBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'articleDefaultWarehouseCode': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.articleDefaultWarehouseCode = valueDes; + break; + case r'articleName': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.articleName = valueDes; + break; + case r'articleNumber': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.articleNumber = valueDes; + break; + case r'articleScannable': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.articleScannable = valueDes; + break; + case r'belegzeilenNr': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.belegzeilenNr = valueDes; + break; + case r'komponentenArtikelNr': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.komponentenArtikelNr = valueDes; + break; + case r'requiredQuantity': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.requiredQuantity = valueDes; + break; + case r'warehouseCode': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.warehouseCode = valueDes; + break; + case r'warehouseName': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.warehouseName = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + SyncDeliveryItem deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = SyncDeliveryItemBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/sync_delivery_item.g.dart b/packages/holzleitner_api/lib/src/model/sync_delivery_item.g.dart new file mode 100644 index 0000000..fab1e33 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_delivery_item.g.dart @@ -0,0 +1,207 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sync_delivery_item.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$SyncDeliveryItem extends SyncDeliveryItem { + @override + final String? articleDefaultWarehouseCode; + @override + final String articleName; + @override + final String articleNumber; + @override + final bool articleScannable; + @override + final int belegzeilenNr; + @override + final String? komponentenArtikelNr; + @override + final int requiredQuantity; + @override + final String warehouseCode; + @override + final String warehouseName; + + factory _$SyncDeliveryItem( + [void Function(SyncDeliveryItemBuilder)? updates]) => + (SyncDeliveryItemBuilder()..update(updates))._build(); + + _$SyncDeliveryItem._( + {this.articleDefaultWarehouseCode, + required this.articleName, + required this.articleNumber, + required this.articleScannable, + required this.belegzeilenNr, + this.komponentenArtikelNr, + required this.requiredQuantity, + required this.warehouseCode, + required this.warehouseName}) + : super._(); + @override + SyncDeliveryItem rebuild(void Function(SyncDeliveryItemBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + SyncDeliveryItemBuilder toBuilder() => + SyncDeliveryItemBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is SyncDeliveryItem && + articleDefaultWarehouseCode == other.articleDefaultWarehouseCode && + articleName == other.articleName && + articleNumber == other.articleNumber && + articleScannable == other.articleScannable && + belegzeilenNr == other.belegzeilenNr && + komponentenArtikelNr == other.komponentenArtikelNr && + requiredQuantity == other.requiredQuantity && + warehouseCode == other.warehouseCode && + warehouseName == other.warehouseName; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, articleDefaultWarehouseCode.hashCode); + _$hash = $jc(_$hash, articleName.hashCode); + _$hash = $jc(_$hash, articleNumber.hashCode); + _$hash = $jc(_$hash, articleScannable.hashCode); + _$hash = $jc(_$hash, belegzeilenNr.hashCode); + _$hash = $jc(_$hash, komponentenArtikelNr.hashCode); + _$hash = $jc(_$hash, requiredQuantity.hashCode); + _$hash = $jc(_$hash, warehouseCode.hashCode); + _$hash = $jc(_$hash, warehouseName.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'SyncDeliveryItem') + ..add('articleDefaultWarehouseCode', articleDefaultWarehouseCode) + ..add('articleName', articleName) + ..add('articleNumber', articleNumber) + ..add('articleScannable', articleScannable) + ..add('belegzeilenNr', belegzeilenNr) + ..add('komponentenArtikelNr', komponentenArtikelNr) + ..add('requiredQuantity', requiredQuantity) + ..add('warehouseCode', warehouseCode) + ..add('warehouseName', warehouseName)) + .toString(); + } +} + +class SyncDeliveryItemBuilder + implements Builder { + _$SyncDeliveryItem? _$v; + + String? _articleDefaultWarehouseCode; + String? get articleDefaultWarehouseCode => + _$this._articleDefaultWarehouseCode; + set articleDefaultWarehouseCode(String? articleDefaultWarehouseCode) => + _$this._articleDefaultWarehouseCode = articleDefaultWarehouseCode; + + String? _articleName; + String? get articleName => _$this._articleName; + set articleName(String? articleName) => _$this._articleName = articleName; + + String? _articleNumber; + String? get articleNumber => _$this._articleNumber; + set articleNumber(String? articleNumber) => + _$this._articleNumber = articleNumber; + + bool? _articleScannable; + bool? get articleScannable => _$this._articleScannable; + set articleScannable(bool? articleScannable) => + _$this._articleScannable = articleScannable; + + int? _belegzeilenNr; + int? get belegzeilenNr => _$this._belegzeilenNr; + set belegzeilenNr(int? belegzeilenNr) => + _$this._belegzeilenNr = belegzeilenNr; + + String? _komponentenArtikelNr; + String? get komponentenArtikelNr => _$this._komponentenArtikelNr; + set komponentenArtikelNr(String? komponentenArtikelNr) => + _$this._komponentenArtikelNr = komponentenArtikelNr; + + int? _requiredQuantity; + int? get requiredQuantity => _$this._requiredQuantity; + set requiredQuantity(int? requiredQuantity) => + _$this._requiredQuantity = requiredQuantity; + + String? _warehouseCode; + String? get warehouseCode => _$this._warehouseCode; + set warehouseCode(String? warehouseCode) => + _$this._warehouseCode = warehouseCode; + + String? _warehouseName; + String? get warehouseName => _$this._warehouseName; + set warehouseName(String? warehouseName) => + _$this._warehouseName = warehouseName; + + SyncDeliveryItemBuilder() { + SyncDeliveryItem._defaults(this); + } + + SyncDeliveryItemBuilder get _$this { + final $v = _$v; + if ($v != null) { + _articleDefaultWarehouseCode = $v.articleDefaultWarehouseCode; + _articleName = $v.articleName; + _articleNumber = $v.articleNumber; + _articleScannable = $v.articleScannable; + _belegzeilenNr = $v.belegzeilenNr; + _komponentenArtikelNr = $v.komponentenArtikelNr; + _requiredQuantity = $v.requiredQuantity; + _warehouseCode = $v.warehouseCode; + _warehouseName = $v.warehouseName; + _$v = null; + } + return this; + } + + @override + void replace(SyncDeliveryItem other) { + _$v = other as _$SyncDeliveryItem; + } + + @override + void update(void Function(SyncDeliveryItemBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + SyncDeliveryItem build() => _build(); + + _$SyncDeliveryItem _build() { + final _$result = _$v ?? + _$SyncDeliveryItem._( + articleDefaultWarehouseCode: articleDefaultWarehouseCode, + articleName: BuiltValueNullFieldError.checkNotNull( + articleName, r'SyncDeliveryItem', 'articleName'), + articleNumber: BuiltValueNullFieldError.checkNotNull( + articleNumber, r'SyncDeliveryItem', 'articleNumber'), + articleScannable: BuiltValueNullFieldError.checkNotNull( + articleScannable, r'SyncDeliveryItem', 'articleScannable'), + belegzeilenNr: BuiltValueNullFieldError.checkNotNull( + belegzeilenNr, r'SyncDeliveryItem', 'belegzeilenNr'), + komponentenArtikelNr: komponentenArtikelNr, + requiredQuantity: BuiltValueNullFieldError.checkNotNull( + requiredQuantity, r'SyncDeliveryItem', 'requiredQuantity'), + warehouseCode: BuiltValueNullFieldError.checkNotNull( + warehouseCode, r'SyncDeliveryItem', 'warehouseCode'), + warehouseName: BuiltValueNullFieldError.checkNotNull( + warehouseName, r'SyncDeliveryItem', 'warehouseName'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/sync_tour_request.dart b/packages/holzleitner_api/lib/src/model/sync_tour_request.dart new file mode 100644 index 0000000..5a53bc2 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_tour_request.dart @@ -0,0 +1,141 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:holzleitner_api/src/model/date.dart'; +import 'package:holzleitner_api/src/model/sync_delivery.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'sync_tour_request.g.dart'; + +/// SyncTourRequest +/// +/// Properties: +/// * [deliveries] +/// * [driverPersonalnummer] +/// * [tourDate] +@BuiltValue() +abstract class SyncTourRequest implements Built { + @BuiltValueField(wireName: r'deliveries') + BuiltList get deliveries; + + @BuiltValueField(wireName: r'driverPersonalnummer') + int get driverPersonalnummer; + + @BuiltValueField(wireName: r'tourDate') + Date get tourDate; + + SyncTourRequest._(); + + factory SyncTourRequest([void updates(SyncTourRequestBuilder b)]) = _$SyncTourRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(SyncTourRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SyncTourRequestSerializer(); +} + +class _$SyncTourRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [SyncTourRequest, _$SyncTourRequest]; + + @override + final String wireName = r'SyncTourRequest'; + + Iterable _serializeProperties( + Serializers serializers, + SyncTourRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'deliveries'; + yield serializers.serialize( + object.deliveries, + specifiedType: const FullType(BuiltList, [FullType(SyncDelivery)]), + ); + yield r'driverPersonalnummer'; + yield serializers.serialize( + object.driverPersonalnummer, + specifiedType: const FullType(int), + ); + yield r'tourDate'; + yield serializers.serialize( + object.tourDate, + specifiedType: const FullType(Date), + ); + } + + @override + Object serialize( + Serializers serializers, + SyncTourRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required SyncTourRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'deliveries': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(SyncDelivery)]), + ) as BuiltList; + result.deliveries.replace(valueDes); + break; + case r'driverPersonalnummer': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.driverPersonalnummer = valueDes; + break; + case r'tourDate': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Date), + ) as Date; + result.tourDate = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + SyncTourRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = SyncTourRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/sync_tour_request.g.dart b/packages/holzleitner_api/lib/src/model/sync_tour_request.g.dart new file mode 100644 index 0000000..eeae02e --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_tour_request.g.dart @@ -0,0 +1,137 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sync_tour_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$SyncTourRequest extends SyncTourRequest { + @override + final BuiltList deliveries; + @override + final int driverPersonalnummer; + @override + final Date tourDate; + + factory _$SyncTourRequest([void Function(SyncTourRequestBuilder)? updates]) => + (SyncTourRequestBuilder()..update(updates))._build(); + + _$SyncTourRequest._( + {required this.deliveries, + required this.driverPersonalnummer, + required this.tourDate}) + : super._(); + @override + SyncTourRequest rebuild(void Function(SyncTourRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + SyncTourRequestBuilder toBuilder() => SyncTourRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is SyncTourRequest && + deliveries == other.deliveries && + driverPersonalnummer == other.driverPersonalnummer && + tourDate == other.tourDate; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, deliveries.hashCode); + _$hash = $jc(_$hash, driverPersonalnummer.hashCode); + _$hash = $jc(_$hash, tourDate.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'SyncTourRequest') + ..add('deliveries', deliveries) + ..add('driverPersonalnummer', driverPersonalnummer) + ..add('tourDate', tourDate)) + .toString(); + } +} + +class SyncTourRequestBuilder + implements Builder { + _$SyncTourRequest? _$v; + + ListBuilder? _deliveries; + ListBuilder get deliveries => + _$this._deliveries ??= ListBuilder(); + set deliveries(ListBuilder? deliveries) => + _$this._deliveries = deliveries; + + int? _driverPersonalnummer; + int? get driverPersonalnummer => _$this._driverPersonalnummer; + set driverPersonalnummer(int? driverPersonalnummer) => + _$this._driverPersonalnummer = driverPersonalnummer; + + Date? _tourDate; + Date? get tourDate => _$this._tourDate; + set tourDate(Date? tourDate) => _$this._tourDate = tourDate; + + SyncTourRequestBuilder() { + SyncTourRequest._defaults(this); + } + + SyncTourRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _deliveries = $v.deliveries.toBuilder(); + _driverPersonalnummer = $v.driverPersonalnummer; + _tourDate = $v.tourDate; + _$v = null; + } + return this; + } + + @override + void replace(SyncTourRequest other) { + _$v = other as _$SyncTourRequest; + } + + @override + void update(void Function(SyncTourRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + SyncTourRequest build() => _build(); + + _$SyncTourRequest _build() { + _$SyncTourRequest _$result; + try { + _$result = _$v ?? + _$SyncTourRequest._( + deliveries: deliveries.build(), + driverPersonalnummer: BuiltValueNullFieldError.checkNotNull( + driverPersonalnummer, + r'SyncTourRequest', + 'driverPersonalnummer'), + tourDate: BuiltValueNullFieldError.checkNotNull( + tourDate, r'SyncTourRequest', 'tourDate'), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'deliveries'; + deliveries.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'SyncTourRequest', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/sync_tour_response.dart b/packages/holzleitner_api/lib/src/model/sync_tour_response.dart new file mode 100644 index 0000000..539b205 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_tour_response.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'sync_tour_response.g.dart'; + +/// Antwort-Hülle für `POST /sync/tour`. +/// +/// Properties: +/// * [tourId] +@BuiltValue() +abstract class SyncTourResponse implements Built { + @BuiltValueField(wireName: r'tourId') + String get tourId; + + SyncTourResponse._(); + + factory SyncTourResponse([void updates(SyncTourResponseBuilder b)]) = _$SyncTourResponse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(SyncTourResponseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SyncTourResponseSerializer(); +} + +class _$SyncTourResponseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [SyncTourResponse, _$SyncTourResponse]; + + @override + final String wireName = r'SyncTourResponse'; + + Iterable _serializeProperties( + Serializers serializers, + SyncTourResponse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'tourId'; + yield serializers.serialize( + object.tourId, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + SyncTourResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required SyncTourResponseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'tourId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.tourId = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + SyncTourResponse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = SyncTourResponseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/sync_tour_response.g.dart b/packages/holzleitner_api/lib/src/model/sync_tour_response.g.dart new file mode 100644 index 0000000..c7f63d1 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/sync_tour_response.g.dart @@ -0,0 +1,93 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sync_tour_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$SyncTourResponse extends SyncTourResponse { + @override + final String tourId; + + factory _$SyncTourResponse( + [void Function(SyncTourResponseBuilder)? updates]) => + (SyncTourResponseBuilder()..update(updates))._build(); + + _$SyncTourResponse._({required this.tourId}) : super._(); + @override + SyncTourResponse rebuild(void Function(SyncTourResponseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + SyncTourResponseBuilder toBuilder() => + SyncTourResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is SyncTourResponse && tourId == other.tourId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, tourId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'SyncTourResponse') + ..add('tourId', tourId)) + .toString(); + } +} + +class SyncTourResponseBuilder + implements Builder { + _$SyncTourResponse? _$v; + + String? _tourId; + String? get tourId => _$this._tourId; + set tourId(String? tourId) => _$this._tourId = tourId; + + SyncTourResponseBuilder() { + SyncTourResponse._defaults(this); + } + + SyncTourResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _tourId = $v.tourId; + _$v = null; + } + return this; + } + + @override + void replace(SyncTourResponse other) { + _$v = other as _$SyncTourResponse; + } + + @override + void update(void Function(SyncTourResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + SyncTourResponse build() => _build(); + + _$SyncTourResponse _build() { + final _$result = _$v ?? + _$SyncTourResponse._( + tourId: BuiltValueNullFieldError.checkNotNull( + tourId, r'SyncTourResponse', 'tourId'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/tour.dart b/packages/holzleitner_api/lib/src/model/tour.dart new file mode 100644 index 0000000..9a298bf --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour.dart @@ -0,0 +1,156 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/date.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'tour.g.dart'; + +/// Tour eines Tages, pro [`crate::domain::Account`]. Aggregat-Wurzel für die Lieferungen dieses Tages — die einzelnen [`crate::domain::Delivery`] referenzieren ihre Tour per FK. Der Sync vom ERP läuft in der Regel einmal am Vortag und füllt eine neue Tour-Zeile inklusive Delivery- und DeliveryItem-Strukturen. +/// +/// Properties: +/// * [accountId] +/// * [date] +/// * [id] +/// * [syncedAt] - Zeitpunkt des letzten ERP-Sync — für Drift-Erkennung. +@BuiltValue() +abstract class Tour implements Built { + @BuiltValueField(wireName: r'accountId') + int get accountId; + + @BuiltValueField(wireName: r'date') + Date get date; + + @BuiltValueField(wireName: r'id') + String get id; + + /// Zeitpunkt des letzten ERP-Sync — für Drift-Erkennung. + @BuiltValueField(wireName: r'syncedAt') + DateTime get syncedAt; + + Tour._(); + + factory Tour([void updates(TourBuilder b)]) = _$Tour; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(TourBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$TourSerializer(); +} + +class _$TourSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Tour, _$Tour]; + + @override + final String wireName = r'Tour'; + + Iterable _serializeProperties( + Serializers serializers, + Tour object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'accountId'; + yield serializers.serialize( + object.accountId, + specifiedType: const FullType(int), + ); + yield r'date'; + yield serializers.serialize( + object.date, + specifiedType: const FullType(Date), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'syncedAt'; + yield serializers.serialize( + object.syncedAt, + specifiedType: const FullType(DateTime), + ); + } + + @override + Object serialize( + Serializers serializers, + Tour object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required TourBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'accountId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.accountId = valueDes; + break; + case r'date': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Date), + ) as Date; + result.date = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'syncedAt': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(DateTime), + ) as DateTime; + result.syncedAt = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Tour deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = TourBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/tour.g.dart b/packages/holzleitner_api/lib/src/model/tour.g.dart new file mode 100644 index 0000000..58d67e9 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour.g.dart @@ -0,0 +1,130 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tour.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Tour extends Tour { + @override + final int accountId; + @override + final Date date; + @override + final String id; + @override + final DateTime syncedAt; + + factory _$Tour([void Function(TourBuilder)? updates]) => + (TourBuilder()..update(updates))._build(); + + _$Tour._( + {required this.accountId, + required this.date, + required this.id, + required this.syncedAt}) + : super._(); + @override + Tour rebuild(void Function(TourBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + TourBuilder toBuilder() => TourBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Tour && + accountId == other.accountId && + date == other.date && + id == other.id && + syncedAt == other.syncedAt; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, accountId.hashCode); + _$hash = $jc(_$hash, date.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, syncedAt.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Tour') + ..add('accountId', accountId) + ..add('date', date) + ..add('id', id) + ..add('syncedAt', syncedAt)) + .toString(); + } +} + +class TourBuilder implements Builder { + _$Tour? _$v; + + int? _accountId; + int? get accountId => _$this._accountId; + set accountId(int? accountId) => _$this._accountId = accountId; + + Date? _date; + Date? get date => _$this._date; + set date(Date? date) => _$this._date = date; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + DateTime? _syncedAt; + DateTime? get syncedAt => _$this._syncedAt; + set syncedAt(DateTime? syncedAt) => _$this._syncedAt = syncedAt; + + TourBuilder() { + Tour._defaults(this); + } + + TourBuilder get _$this { + final $v = _$v; + if ($v != null) { + _accountId = $v.accountId; + _date = $v.date; + _id = $v.id; + _syncedAt = $v.syncedAt; + _$v = null; + } + return this; + } + + @override + void replace(Tour other) { + _$v = other as _$Tour; + } + + @override + void update(void Function(TourBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Tour build() => _build(); + + _$Tour _build() { + final _$result = _$v ?? + _$Tour._( + accountId: BuiltValueNullFieldError.checkNotNull( + accountId, r'Tour', 'accountId'), + date: BuiltValueNullFieldError.checkNotNull(date, r'Tour', 'date'), + id: BuiltValueNullFieldError.checkNotNull(id, r'Tour', 'id'), + syncedAt: BuiltValueNullFieldError.checkNotNull( + syncedAt, r'Tour', 'syncedAt'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/tour_details.dart b/packages/holzleitner_api/lib/src/model/tour_details.dart new file mode 100644 index 0000000..39b2df3 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour_details.dart @@ -0,0 +1,211 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/customer.dart'; +import 'package:holzleitner_api/src/model/tour.dart'; +import 'package:holzleitner_api/src/model/warehouse.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:holzleitner_api/src/model/customer_contact.dart'; +import 'package:holzleitner_api/src/model/delivery_note.dart'; +import 'package:holzleitner_api/src/model/delivery_with_items.dart'; +import 'package:holzleitner_api/src/model/article.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'tour_details.g.dart'; + +/// TourDetails +/// +/// Properties: +/// * [articles] +/// * [customerContacts] +/// * [customers] +/// * [deliveries] +/// * [notes] - Alle Notizen aller Lieferungen dieser Tour, in einer Liste. Die App joint clientseitig per `delivery_id`. Reihenfolge: pro Lieferung aufsteigend nach `created_at`. +/// * [tour] +/// * [warehouses] +@BuiltValue() +abstract class TourDetails implements Built { + @BuiltValueField(wireName: r'articles') + BuiltList
get articles; + + @BuiltValueField(wireName: r'customerContacts') + BuiltList get customerContacts; + + @BuiltValueField(wireName: r'customers') + BuiltList get customers; + + @BuiltValueField(wireName: r'deliveries') + BuiltList get deliveries; + + /// Alle Notizen aller Lieferungen dieser Tour, in einer Liste. Die App joint clientseitig per `delivery_id`. Reihenfolge: pro Lieferung aufsteigend nach `created_at`. + @BuiltValueField(wireName: r'notes') + BuiltList get notes; + + @BuiltValueField(wireName: r'tour') + Tour get tour; + + @BuiltValueField(wireName: r'warehouses') + BuiltList get warehouses; + + TourDetails._(); + + factory TourDetails([void updates(TourDetailsBuilder b)]) = _$TourDetails; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(TourDetailsBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$TourDetailsSerializer(); +} + +class _$TourDetailsSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [TourDetails, _$TourDetails]; + + @override + final String wireName = r'TourDetails'; + + Iterable _serializeProperties( + Serializers serializers, + TourDetails object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'articles'; + yield serializers.serialize( + object.articles, + specifiedType: const FullType(BuiltList, [FullType(Article)]), + ); + yield r'customerContacts'; + yield serializers.serialize( + object.customerContacts, + specifiedType: const FullType(BuiltList, [FullType(CustomerContact)]), + ); + yield r'customers'; + yield serializers.serialize( + object.customers, + specifiedType: const FullType(BuiltList, [FullType(Customer)]), + ); + yield r'deliveries'; + yield serializers.serialize( + object.deliveries, + specifiedType: const FullType(BuiltList, [FullType(DeliveryWithItems)]), + ); + yield r'notes'; + yield serializers.serialize( + object.notes, + specifiedType: const FullType(BuiltList, [FullType(DeliveryNote)]), + ); + yield r'tour'; + yield serializers.serialize( + object.tour, + specifiedType: const FullType(Tour), + ); + yield r'warehouses'; + yield serializers.serialize( + object.warehouses, + specifiedType: const FullType(BuiltList, [FullType(Warehouse)]), + ); + } + + @override + Object serialize( + Serializers serializers, + TourDetails object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required TourDetailsBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'articles': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(Article)]), + ) as BuiltList
; + result.articles.replace(valueDes); + break; + case r'customerContacts': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(CustomerContact)]), + ) as BuiltList; + result.customerContacts.replace(valueDes); + break; + case r'customers': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(Customer)]), + ) as BuiltList; + result.customers.replace(valueDes); + break; + case r'deliveries': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(DeliveryWithItems)]), + ) as BuiltList; + result.deliveries.replace(valueDes); + break; + case r'notes': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(DeliveryNote)]), + ) as BuiltList; + result.notes.replace(valueDes); + break; + case r'tour': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Tour), + ) as Tour; + result.tour.replace(valueDes); + break; + case r'warehouses': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(Warehouse)]), + ) as BuiltList; + result.warehouses.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + TourDetails deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = TourDetailsBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/tour_details.g.dart b/packages/holzleitner_api/lib/src/model/tour_details.g.dart new file mode 100644 index 0000000..75d440a --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour_details.g.dart @@ -0,0 +1,199 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tour_details.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$TourDetails extends TourDetails { + @override + final BuiltList
articles; + @override + final BuiltList customerContacts; + @override + final BuiltList customers; + @override + final BuiltList deliveries; + @override + final BuiltList notes; + @override + final Tour tour; + @override + final BuiltList warehouses; + + factory _$TourDetails([void Function(TourDetailsBuilder)? updates]) => + (TourDetailsBuilder()..update(updates))._build(); + + _$TourDetails._( + {required this.articles, + required this.customerContacts, + required this.customers, + required this.deliveries, + required this.notes, + required this.tour, + required this.warehouses}) + : super._(); + @override + TourDetails rebuild(void Function(TourDetailsBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + TourDetailsBuilder toBuilder() => TourDetailsBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is TourDetails && + articles == other.articles && + customerContacts == other.customerContacts && + customers == other.customers && + deliveries == other.deliveries && + notes == other.notes && + tour == other.tour && + warehouses == other.warehouses; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, articles.hashCode); + _$hash = $jc(_$hash, customerContacts.hashCode); + _$hash = $jc(_$hash, customers.hashCode); + _$hash = $jc(_$hash, deliveries.hashCode); + _$hash = $jc(_$hash, notes.hashCode); + _$hash = $jc(_$hash, tour.hashCode); + _$hash = $jc(_$hash, warehouses.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'TourDetails') + ..add('articles', articles) + ..add('customerContacts', customerContacts) + ..add('customers', customers) + ..add('deliveries', deliveries) + ..add('notes', notes) + ..add('tour', tour) + ..add('warehouses', warehouses)) + .toString(); + } +} + +class TourDetailsBuilder implements Builder { + _$TourDetails? _$v; + + ListBuilder
? _articles; + ListBuilder
get articles => + _$this._articles ??= ListBuilder
(); + set articles(ListBuilder
? articles) => _$this._articles = articles; + + ListBuilder? _customerContacts; + ListBuilder get customerContacts => + _$this._customerContacts ??= ListBuilder(); + set customerContacts(ListBuilder? customerContacts) => + _$this._customerContacts = customerContacts; + + ListBuilder? _customers; + ListBuilder get customers => + _$this._customers ??= ListBuilder(); + set customers(ListBuilder? customers) => + _$this._customers = customers; + + ListBuilder? _deliveries; + ListBuilder get deliveries => + _$this._deliveries ??= ListBuilder(); + set deliveries(ListBuilder? deliveries) => + _$this._deliveries = deliveries; + + ListBuilder? _notes; + ListBuilder get notes => + _$this._notes ??= ListBuilder(); + set notes(ListBuilder? notes) => _$this._notes = notes; + + TourBuilder? _tour; + TourBuilder get tour => _$this._tour ??= TourBuilder(); + set tour(TourBuilder? tour) => _$this._tour = tour; + + ListBuilder? _warehouses; + ListBuilder get warehouses => + _$this._warehouses ??= ListBuilder(); + set warehouses(ListBuilder? warehouses) => + _$this._warehouses = warehouses; + + TourDetailsBuilder() { + TourDetails._defaults(this); + } + + TourDetailsBuilder get _$this { + final $v = _$v; + if ($v != null) { + _articles = $v.articles.toBuilder(); + _customerContacts = $v.customerContacts.toBuilder(); + _customers = $v.customers.toBuilder(); + _deliveries = $v.deliveries.toBuilder(); + _notes = $v.notes.toBuilder(); + _tour = $v.tour.toBuilder(); + _warehouses = $v.warehouses.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(TourDetails other) { + _$v = other as _$TourDetails; + } + + @override + void update(void Function(TourDetailsBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + TourDetails build() => _build(); + + _$TourDetails _build() { + _$TourDetails _$result; + try { + _$result = _$v ?? + _$TourDetails._( + articles: articles.build(), + customerContacts: customerContacts.build(), + customers: customers.build(), + deliveries: deliveries.build(), + notes: notes.build(), + tour: tour.build(), + warehouses: warehouses.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'articles'; + articles.build(); + _$failedField = 'customerContacts'; + customerContacts.build(); + _$failedField = 'customers'; + customers.build(); + _$failedField = 'deliveries'; + deliveries.build(); + _$failedField = 'notes'; + notes.build(); + _$failedField = 'tour'; + tour.build(); + _$failedField = 'warehouses'; + warehouses.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'TourDetails', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/tour_summary.dart b/packages/holzleitner_api/lib/src/model/tour_summary.dart new file mode 100644 index 0000000..7da1c6f --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour_summary.dart @@ -0,0 +1,139 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:holzleitner_api/src/model/date.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'tour_summary.g.dart'; + +/// TourSummary +/// +/// Properties: +/// * [deliveryCount] +/// * [tourDate] +/// * [tourId] +@BuiltValue() +abstract class TourSummary implements Built { + @BuiltValueField(wireName: r'deliveryCount') + int get deliveryCount; + + @BuiltValueField(wireName: r'tourDate') + Date get tourDate; + + @BuiltValueField(wireName: r'tourId') + String get tourId; + + TourSummary._(); + + factory TourSummary([void updates(TourSummaryBuilder b)]) = _$TourSummary; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(TourSummaryBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$TourSummarySerializer(); +} + +class _$TourSummarySerializer implements PrimitiveSerializer { + @override + final Iterable types = const [TourSummary, _$TourSummary]; + + @override + final String wireName = r'TourSummary'; + + Iterable _serializeProperties( + Serializers serializers, + TourSummary object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'deliveryCount'; + yield serializers.serialize( + object.deliveryCount, + specifiedType: const FullType(int), + ); + yield r'tourDate'; + yield serializers.serialize( + object.tourDate, + specifiedType: const FullType(Date), + ); + yield r'tourId'; + yield serializers.serialize( + object.tourId, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + TourSummary object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required TourSummaryBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'deliveryCount': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.deliveryCount = valueDes; + break; + case r'tourDate': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(Date), + ) as Date; + result.tourDate = valueDes; + break; + case r'tourId': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.tourId = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + TourSummary deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = TourSummaryBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/tour_summary.g.dart b/packages/holzleitner_api/lib/src/model/tour_summary.g.dart new file mode 100644 index 0000000..0add367 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour_summary.g.dart @@ -0,0 +1,120 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tour_summary.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$TourSummary extends TourSummary { + @override + final int deliveryCount; + @override + final Date tourDate; + @override + final String tourId; + + factory _$TourSummary([void Function(TourSummaryBuilder)? updates]) => + (TourSummaryBuilder()..update(updates))._build(); + + _$TourSummary._( + {required this.deliveryCount, + required this.tourDate, + required this.tourId}) + : super._(); + @override + TourSummary rebuild(void Function(TourSummaryBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + TourSummaryBuilder toBuilder() => TourSummaryBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is TourSummary && + deliveryCount == other.deliveryCount && + tourDate == other.tourDate && + tourId == other.tourId; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, deliveryCount.hashCode); + _$hash = $jc(_$hash, tourDate.hashCode); + _$hash = $jc(_$hash, tourId.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'TourSummary') + ..add('deliveryCount', deliveryCount) + ..add('tourDate', tourDate) + ..add('tourId', tourId)) + .toString(); + } +} + +class TourSummaryBuilder implements Builder { + _$TourSummary? _$v; + + int? _deliveryCount; + int? get deliveryCount => _$this._deliveryCount; + set deliveryCount(int? deliveryCount) => + _$this._deliveryCount = deliveryCount; + + Date? _tourDate; + Date? get tourDate => _$this._tourDate; + set tourDate(Date? tourDate) => _$this._tourDate = tourDate; + + String? _tourId; + String? get tourId => _$this._tourId; + set tourId(String? tourId) => _$this._tourId = tourId; + + TourSummaryBuilder() { + TourSummary._defaults(this); + } + + TourSummaryBuilder get _$this { + final $v = _$v; + if ($v != null) { + _deliveryCount = $v.deliveryCount; + _tourDate = $v.tourDate; + _tourId = $v.tourId; + _$v = null; + } + return this; + } + + @override + void replace(TourSummary other) { + _$v = other as _$TourSummary; + } + + @override + void update(void Function(TourSummaryBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + TourSummary build() => _build(); + + _$TourSummary _build() { + final _$result = _$v ?? + _$TourSummary._( + deliveryCount: BuiltValueNullFieldError.checkNotNull( + deliveryCount, r'TourSummary', 'deliveryCount'), + tourDate: BuiltValueNullFieldError.checkNotNull( + tourDate, r'TourSummary', 'tourDate'), + tourId: BuiltValueNullFieldError.checkNotNull( + tourId, r'TourSummary', 'tourId'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/tour_summary_list.dart b/packages/holzleitner_api/lib/src/model/tour_summary_list.dart new file mode 100644 index 0000000..9a6a7ab --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour_summary_list.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:holzleitner_api/src/model/tour_summary.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'tour_summary_list.g.dart'; + +/// Antwort-Hülle für `GET /me/tours/today`. Eigenes Struct, weil utoipa für `Vec` als Top-Level-Response keinen sauberen Schemanamen vergibt — und ein Wrapper macht die Erweiterbarkeit (z. B. Paginierung in Zukunft) zur Nicht-Breaking-Change. +/// +/// Properties: +/// * [tours] +@BuiltValue() +abstract class TourSummaryList implements Built { + @BuiltValueField(wireName: r'tours') + BuiltList get tours; + + TourSummaryList._(); + + factory TourSummaryList([void updates(TourSummaryListBuilder b)]) = _$TourSummaryList; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(TourSummaryListBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$TourSummaryListSerializer(); +} + +class _$TourSummaryListSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [TourSummaryList, _$TourSummaryList]; + + @override + final String wireName = r'TourSummaryList'; + + Iterable _serializeProperties( + Serializers serializers, + TourSummaryList object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'tours'; + yield serializers.serialize( + object.tours, + specifiedType: const FullType(BuiltList, [FullType(TourSummary)]), + ); + } + + @override + Object serialize( + Serializers serializers, + TourSummaryList object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required TourSummaryListBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'tours': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, [FullType(TourSummary)]), + ) as BuiltList; + result.tours.replace(valueDes); + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + TourSummaryList deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = TourSummaryListBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/tour_summary_list.g.dart b/packages/holzleitner_api/lib/src/model/tour_summary_list.g.dart new file mode 100644 index 0000000..86a9c2d --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/tour_summary_list.g.dart @@ -0,0 +1,104 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tour_summary_list.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$TourSummaryList extends TourSummaryList { + @override + final BuiltList tours; + + factory _$TourSummaryList([void Function(TourSummaryListBuilder)? updates]) => + (TourSummaryListBuilder()..update(updates))._build(); + + _$TourSummaryList._({required this.tours}) : super._(); + @override + TourSummaryList rebuild(void Function(TourSummaryListBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + TourSummaryListBuilder toBuilder() => TourSummaryListBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is TourSummaryList && tours == other.tours; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, tours.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'TourSummaryList') + ..add('tours', tours)) + .toString(); + } +} + +class TourSummaryListBuilder + implements Builder { + _$TourSummaryList? _$v; + + ListBuilder? _tours; + ListBuilder get tours => + _$this._tours ??= ListBuilder(); + set tours(ListBuilder? tours) => _$this._tours = tours; + + TourSummaryListBuilder() { + TourSummaryList._defaults(this); + } + + TourSummaryListBuilder get _$this { + final $v = _$v; + if ($v != null) { + _tours = $v.tours.toBuilder(); + _$v = null; + } + return this; + } + + @override + void replace(TourSummaryList other) { + _$v = other as _$TourSummaryList; + } + + @override + void update(void Function(TourSummaryListBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + TourSummaryList build() => _build(); + + _$TourSummaryList _build() { + _$TourSummaryList _$result; + try { + _$result = _$v ?? + _$TourSummaryList._( + tours: tours.build(), + ); + } catch (_) { + late String _$failedField; + try { + _$failedField = 'tours'; + tours.build(); + } catch (e) { + throw BuiltValueNestedFieldError( + r'TourSummaryList', _$failedField, e.toString()); + } + rethrow; + } + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/update_car_request.dart b/packages/holzleitner_api/lib/src/model/update_car_request.dart new file mode 100644 index 0000000..8746e0f --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/update_car_request.dart @@ -0,0 +1,130 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'update_car_request.g.dart'; + +/// UpdateCarRequest +/// +/// Properties: +/// * [active] - Wenn gesetzt: aktiv/inaktiv. Inaktive Fahrzeuge tauchen in `GET /me/cars?activeOnly=true` (default) nicht auf. +/// * [plate] - Wenn gesetzt: neues Kennzeichen. +@BuiltValue() +abstract class UpdateCarRequest implements Built { + /// Wenn gesetzt: aktiv/inaktiv. Inaktive Fahrzeuge tauchen in `GET /me/cars?activeOnly=true` (default) nicht auf. + @BuiltValueField(wireName: r'active') + bool? get active; + + /// Wenn gesetzt: neues Kennzeichen. + @BuiltValueField(wireName: r'plate') + String? get plate; + + UpdateCarRequest._(); + + factory UpdateCarRequest([void updates(UpdateCarRequestBuilder b)]) = _$UpdateCarRequest; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(UpdateCarRequestBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$UpdateCarRequestSerializer(); +} + +class _$UpdateCarRequestSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [UpdateCarRequest, _$UpdateCarRequest]; + + @override + final String wireName = r'UpdateCarRequest'; + + Iterable _serializeProperties( + Serializers serializers, + UpdateCarRequest object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.active != null) { + yield r'active'; + yield serializers.serialize( + object.active, + specifiedType: const FullType.nullable(bool), + ); + } + if (object.plate != null) { + yield r'plate'; + yield serializers.serialize( + object.plate, + specifiedType: const FullType.nullable(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + UpdateCarRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required UpdateCarRequestBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'active': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(bool), + ) as bool?; + if (valueDes == null) continue; + result.active = valueDes; + break; + case r'plate': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType.nullable(String), + ) as String?; + if (valueDes == null) continue; + result.plate = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + UpdateCarRequest deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = UpdateCarRequestBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/update_car_request.g.dart b/packages/holzleitner_api/lib/src/model/update_car_request.g.dart new file mode 100644 index 0000000..c10aa07 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/update_car_request.g.dart @@ -0,0 +1,104 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'update_car_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$UpdateCarRequest extends UpdateCarRequest { + @override + final bool? active; + @override + final String? plate; + + factory _$UpdateCarRequest( + [void Function(UpdateCarRequestBuilder)? updates]) => + (UpdateCarRequestBuilder()..update(updates))._build(); + + _$UpdateCarRequest._({this.active, this.plate}) : super._(); + @override + UpdateCarRequest rebuild(void Function(UpdateCarRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + UpdateCarRequestBuilder toBuilder() => + UpdateCarRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is UpdateCarRequest && + active == other.active && + plate == other.plate; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, active.hashCode); + _$hash = $jc(_$hash, plate.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'UpdateCarRequest') + ..add('active', active) + ..add('plate', plate)) + .toString(); + } +} + +class UpdateCarRequestBuilder + implements Builder { + _$UpdateCarRequest? _$v; + + bool? _active; + bool? get active => _$this._active; + set active(bool? active) => _$this._active = active; + + String? _plate; + String? get plate => _$this._plate; + set plate(String? plate) => _$this._plate = plate; + + UpdateCarRequestBuilder() { + UpdateCarRequest._defaults(this); + } + + UpdateCarRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _active = $v.active; + _plate = $v.plate; + _$v = null; + } + return this; + } + + @override + void replace(UpdateCarRequest other) { + _$v = other as _$UpdateCarRequest; + } + + @override + void update(void Function(UpdateCarRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + UpdateCarRequest build() => _build(); + + _$UpdateCarRequest _build() { + final _$result = _$v ?? + _$UpdateCarRequest._( + active: active, + plate: plate, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/model/warehouse.dart b/packages/holzleitner_api/lib/src/model/warehouse.dart new file mode 100644 index 0000000..16054f2 --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/warehouse.dart @@ -0,0 +1,154 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'warehouse.g.dart'; + +/// Lager. ERP-Mirror; `code` ist die ERP-Lager-Nr (z. B. `\"0\"` für das Standardlager). Das `is_standard`-Flag ist der schnelle Filter für die Beladen-Logik („nur Standardlager-Artikel zählen für Fertig\"). +/// +/// Properties: +/// * [code] +/// * [id] +/// * [isStandard] +/// * [name] +@BuiltValue() +abstract class Warehouse implements Built { + @BuiltValueField(wireName: r'code') + String get code; + + @BuiltValueField(wireName: r'id') + String get id; + + @BuiltValueField(wireName: r'isStandard') + bool get isStandard; + + @BuiltValueField(wireName: r'name') + String get name; + + Warehouse._(); + + factory Warehouse([void updates(WarehouseBuilder b)]) = _$Warehouse; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(WarehouseBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$WarehouseSerializer(); +} + +class _$WarehouseSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Warehouse, _$Warehouse]; + + @override + final String wireName = r'Warehouse'; + + Iterable _serializeProperties( + Serializers serializers, + Warehouse object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'code'; + yield serializers.serialize( + object.code, + specifiedType: const FullType(String), + ); + yield r'id'; + yield serializers.serialize( + object.id, + specifiedType: const FullType(String), + ); + yield r'isStandard'; + yield serializers.serialize( + object.isStandard, + specifiedType: const FullType(bool), + ); + yield r'name'; + yield serializers.serialize( + object.name, + specifiedType: const FullType(String), + ); + } + + @override + Object serialize( + Serializers serializers, + Warehouse object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required WarehouseBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'code': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.code = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.id = valueDes; + break; + case r'isStandard': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(bool), + ) as bool; + result.isStandard = valueDes; + break; + case r'name': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.name = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Warehouse deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = WarehouseBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/packages/holzleitner_api/lib/src/model/warehouse.g.dart b/packages/holzleitner_api/lib/src/model/warehouse.g.dart new file mode 100644 index 0000000..e485f4e --- /dev/null +++ b/packages/holzleitner_api/lib/src/model/warehouse.g.dart @@ -0,0 +1,131 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'warehouse.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +class _$Warehouse extends Warehouse { + @override + final String code; + @override + final String id; + @override + final bool isStandard; + @override + final String name; + + factory _$Warehouse([void Function(WarehouseBuilder)? updates]) => + (WarehouseBuilder()..update(updates))._build(); + + _$Warehouse._( + {required this.code, + required this.id, + required this.isStandard, + required this.name}) + : super._(); + @override + Warehouse rebuild(void Function(WarehouseBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + WarehouseBuilder toBuilder() => WarehouseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is Warehouse && + code == other.code && + id == other.id && + isStandard == other.isStandard && + name == other.name; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, code.hashCode); + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, isStandard.hashCode); + _$hash = $jc(_$hash, name.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'Warehouse') + ..add('code', code) + ..add('id', id) + ..add('isStandard', isStandard) + ..add('name', name)) + .toString(); + } +} + +class WarehouseBuilder implements Builder { + _$Warehouse? _$v; + + String? _code; + String? get code => _$this._code; + set code(String? code) => _$this._code = code; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + bool? _isStandard; + bool? get isStandard => _$this._isStandard; + set isStandard(bool? isStandard) => _$this._isStandard = isStandard; + + String? _name; + String? get name => _$this._name; + set name(String? name) => _$this._name = name; + + WarehouseBuilder() { + Warehouse._defaults(this); + } + + WarehouseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _code = $v.code; + _id = $v.id; + _isStandard = $v.isStandard; + _name = $v.name; + _$v = null; + } + return this; + } + + @override + void replace(Warehouse other) { + _$v = other as _$Warehouse; + } + + @override + void update(void Function(WarehouseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + Warehouse build() => _build(); + + _$Warehouse _build() { + final _$result = _$v ?? + _$Warehouse._( + code: + BuiltValueNullFieldError.checkNotNull(code, r'Warehouse', 'code'), + id: BuiltValueNullFieldError.checkNotNull(id, r'Warehouse', 'id'), + isStandard: BuiltValueNullFieldError.checkNotNull( + isStandard, r'Warehouse', 'isStandard'), + name: + BuiltValueNullFieldError.checkNotNull(name, r'Warehouse', 'name'), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/lib/src/serializers.dart b/packages/holzleitner_api/lib/src/serializers.dart new file mode 100644 index 0000000..4bb4392 --- /dev/null +++ b/packages/holzleitner_api/lib/src/serializers.dart @@ -0,0 +1,113 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_import + +import 'package:one_of_serializer/any_of_serializer.dart'; +import 'package:one_of_serializer/one_of_serializer.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:built_value/standard_json_plugin.dart'; +import 'package:built_value/iso_8601_date_time_serializer.dart'; +import 'package:holzleitner_api/src/date_serializer.dart'; +import 'package:holzleitner_api/src/model/date.dart'; + +import 'package:holzleitner_api/src/model/account.dart'; +import 'package:holzleitner_api/src/model/address.dart'; +import 'package:holzleitner_api/src/model/apply_scans_request.dart'; +import 'package:holzleitner_api/src/model/apply_scans_response.dart'; +import 'package:holzleitner_api/src/model/article.dart'; +import 'package:holzleitner_api/src/model/assign_car_request.dart'; +import 'package:holzleitner_api/src/model/audit_action.dart'; +import 'package:holzleitner_api/src/model/cancel_delivery_request.dart'; +import 'package:holzleitner_api/src/model/car.dart'; +import 'package:holzleitner_api/src/model/car_response.dart'; +import 'package:holzleitner_api/src/model/cars_list.dart'; +import 'package:holzleitner_api/src/model/create_car_request.dart'; +import 'package:holzleitner_api/src/model/create_delivery_note_request.dart'; +import 'package:holzleitner_api/src/model/customer.dart'; +import 'package:holzleitner_api/src/model/customer_contact.dart'; +import 'package:holzleitner_api/src/model/delivery.dart'; +import 'package:holzleitner_api/src/model/delivery_item.dart'; +import 'package:holzleitner_api/src/model/delivery_note.dart'; +import 'package:holzleitner_api/src/model/delivery_note_response.dart'; +import 'package:holzleitner_api/src/model/delivery_order_entry.dart'; +import 'package:holzleitner_api/src/model/delivery_response.dart'; +import 'package:holzleitner_api/src/model/delivery_state.dart'; +import 'package:holzleitner_api/src/model/delivery_with_items.dart'; +import 'package:holzleitner_api/src/model/hold_delivery_request.dart'; +import 'package:holzleitner_api/src/model/scan_event.dart'; +import 'package:holzleitner_api/src/model/scan_result.dart'; +import 'package:holzleitner_api/src/model/scan_result_status.dart'; +import 'package:holzleitner_api/src/model/scan_state.dart'; +import 'package:holzleitner_api/src/model/scan_status.dart'; +import 'package:holzleitner_api/src/model/set_delivery_order_request.dart'; +import 'package:holzleitner_api/src/model/set_delivery_order_response.dart'; +import 'package:holzleitner_api/src/model/sync_delivery.dart'; +import 'package:holzleitner_api/src/model/sync_delivery_item.dart'; +import 'package:holzleitner_api/src/model/sync_tour_request.dart'; +import 'package:holzleitner_api/src/model/sync_tour_response.dart'; +import 'package:holzleitner_api/src/model/tour.dart'; +import 'package:holzleitner_api/src/model/tour_details.dart'; +import 'package:holzleitner_api/src/model/tour_summary.dart'; +import 'package:holzleitner_api/src/model/tour_summary_list.dart'; +import 'package:holzleitner_api/src/model/update_car_request.dart'; +import 'package:holzleitner_api/src/model/warehouse.dart'; + +part 'serializers.g.dart'; + +@SerializersFor([ + Account, + Address, + ApplyScansRequest, + ApplyScansResponse, + Article, + AssignCarRequest, + AuditAction, + CancelDeliveryRequest, + Car, + CarResponse, + CarsList, + CreateCarRequest, + CreateDeliveryNoteRequest, + Customer, + CustomerContact, + Delivery,$Delivery, + DeliveryItem, + DeliveryNote, + DeliveryNoteResponse, + DeliveryOrderEntry, + DeliveryResponse, + DeliveryState, + DeliveryWithItems, + HoldDeliveryRequest, + ScanEvent, + ScanResult, + ScanResultStatus, + ScanState, + ScanStatus, + SetDeliveryOrderRequest, + SetDeliveryOrderResponse, + SyncDelivery, + SyncDeliveryItem, + SyncTourRequest, + SyncTourResponse, + Tour, + TourDetails, + TourSummary, + TourSummaryList, + UpdateCarRequest, + Warehouse, +]) +Serializers serializers = (_$serializers.toBuilder() + ..add(Delivery.serializer) + ..add(const OneOfSerializer()) + ..add(const AnyOfSerializer()) + ..add(const DateSerializer()) + ..add(Iso8601DateTimeSerializer())) + .build(); + +Serializers standardSerializers = + (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build(); diff --git a/packages/holzleitner_api/lib/src/serializers.g.dart b/packages/holzleitner_api/lib/src/serializers.g.dart new file mode 100644 index 0000000..f00e4c6 --- /dev/null +++ b/packages/holzleitner_api/lib/src/serializers.g.dart @@ -0,0 +1,104 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'serializers.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +Serializers _$serializers = (Serializers().toBuilder() + ..add($Delivery.serializer) + ..add(Account.serializer) + ..add(Address.serializer) + ..add(ApplyScansRequest.serializer) + ..add(ApplyScansResponse.serializer) + ..add(Article.serializer) + ..add(AssignCarRequest.serializer) + ..add(AuditAction.serializer) + ..add(CancelDeliveryRequest.serializer) + ..add(Car.serializer) + ..add(CarResponse.serializer) + ..add(CarsList.serializer) + ..add(CreateCarRequest.serializer) + ..add(CreateDeliveryNoteRequest.serializer) + ..add(Customer.serializer) + ..add(CustomerContact.serializer) + ..add(DeliveryItem.serializer) + ..add(DeliveryNote.serializer) + ..add(DeliveryNoteResponse.serializer) + ..add(DeliveryOrderEntry.serializer) + ..add(DeliveryResponse.serializer) + ..add(DeliveryState.serializer) + ..add(DeliveryWithItems.serializer) + ..add(HoldDeliveryRequest.serializer) + ..add(ScanEvent.serializer) + ..add(ScanResult.serializer) + ..add(ScanResultStatus.serializer) + ..add(ScanState.serializer) + ..add(ScanStatus.serializer) + ..add(SetDeliveryOrderRequest.serializer) + ..add(SetDeliveryOrderResponse.serializer) + ..add(SyncDelivery.serializer) + ..add(SyncDeliveryItem.serializer) + ..add(SyncTourRequest.serializer) + ..add(SyncTourResponse.serializer) + ..add(Tour.serializer) + ..add(TourDetails.serializer) + ..add(TourSummary.serializer) + ..add(TourSummaryList.serializer) + ..add(UpdateCarRequest.serializer) + ..add(Warehouse.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(Article)]), + () => ListBuilder
()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CustomerContact)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(Customer)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(DeliveryWithItems)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(DeliveryNote)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(Warehouse)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(Car)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(DeliveryItem)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(String)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(DeliveryOrderEntry)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(ScanEvent)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(ScanResult)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(String)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(String)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(SyncDelivery)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(SyncDeliveryItem)]), + () => ListBuilder()) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(TourSummary)]), + () => ListBuilder())) + .build(); + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/packages/holzleitner_api/pubspec.yaml b/packages/holzleitner_api/pubspec.yaml new file mode 100644 index 0000000..32e0cb6 --- /dev/null +++ b/packages/holzleitner_api/pubspec.yaml @@ -0,0 +1,19 @@ +name: holzleitner_api +version: 1.0.0 +description: Generierter_Dart-Client_fuer_das_Holzleitner-Rust-Backend +homepage: homepage + +environment: + sdk: '>=2.15.0 <4.0.0' + +dependencies: + dio: '^5.2.0' + one_of: '>=1.5.0 <2.0.0' + one_of_serializer: '>=1.5.0 <2.0.0' + built_value: '>=8.4.0 <9.0.0' + built_collection: '>=5.1.1 <6.0.0' + +dev_dependencies: + built_value_generator: '>=8.4.0 <9.0.0' + build_runner: any + test: ^1.16.0 diff --git a/packages/holzleitner_api/test/account_test.dart b/packages/holzleitner_api/test/account_test.dart new file mode 100644 index 0000000..3d0b7e7 --- /dev/null +++ b/packages/holzleitner_api/test/account_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Account +void main() { + final instance = AccountBuilder(); + // TODO add properties to the builder and call build() + + group(Account, () { + // bool active + test('to test the property `active`', () async { + // TODO + }); + + // String name + test('to test the property `name`', () async { + // TODO + }); + + // int personalnummer + test('to test the property `personalnummer`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/accounts_api_test.dart b/packages/holzleitner_api/test/accounts_api_test.dart new file mode 100644 index 0000000..dc27dd7 --- /dev/null +++ b/packages/holzleitner_api/test/accounts_api_test.dart @@ -0,0 +1,18 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for AccountsApi +void main() { + final instance = HolzleitnerApi().getAccountsApi(); + + group(AccountsApi, () { + // Liest den Account zu einer Personalnummer. + // + //Future getAccount(int personalnummer) async + test('test getAccount', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/address_test.dart b/packages/holzleitner_api/test/address_test.dart new file mode 100644 index 0000000..fe3dc80 --- /dev/null +++ b/packages/holzleitner_api/test/address_test.dart @@ -0,0 +1,36 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Address +void main() { + final instance = AddressBuilder(); + // TODO add properties to the builder and call build() + + group(Address, () { + // String city + test('to test the property `city`', () async { + // TODO + }); + + // String country + test('to test the property `country`', () async { + // TODO + }); + + // String houseNumber + test('to test the property `houseNumber`', () async { + // TODO + }); + + // String postalCode + test('to test the property `postalCode`', () async { + // TODO + }); + + // String street + test('to test the property `street`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/apply_scans_request_test.dart b/packages/holzleitner_api/test/apply_scans_request_test.dart new file mode 100644 index 0000000..ddfb2ed --- /dev/null +++ b/packages/holzleitner_api/test/apply_scans_request_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ApplyScansRequest +void main() { + final instance = ApplyScansRequestBuilder(); + // TODO add properties to the builder and call build() + + group(ApplyScansRequest, () { + // BuiltList scans + test('to test the property `scans`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/apply_scans_response_test.dart b/packages/holzleitner_api/test/apply_scans_response_test.dart new file mode 100644 index 0000000..defa9a7 --- /dev/null +++ b/packages/holzleitner_api/test/apply_scans_response_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ApplyScansResponse +void main() { + final instance = ApplyScansResponseBuilder(); + // TODO add properties to the builder and call build() + + group(ApplyScansResponse, () { + // BuiltList results + test('to test the property `results`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/article_test.dart b/packages/holzleitner_api/test/article_test.dart new file mode 100644 index 0000000..9bc9c5c --- /dev/null +++ b/packages/holzleitner_api/test/article_test.dart @@ -0,0 +1,36 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Article +void main() { + final instance = ArticleBuilder(); + // TODO add properties to the builder and call build() + + group(Article, () { + // String articleNumber + test('to test the property `articleNumber`', () async { + // TODO + }); + + // String defaultWarehouseId + test('to test the property `defaultWarehouseId`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // String name + test('to test the property `name`', () async { + // TODO + }); + + // bool scannable + test('to test the property `scannable`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/assign_car_request_test.dart b/packages/holzleitner_api/test/assign_car_request_test.dart new file mode 100644 index 0000000..b86cfe8 --- /dev/null +++ b/packages/holzleitner_api/test/assign_car_request_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for AssignCarRequest +void main() { + final instance = AssignCarRequestBuilder(); + // TODO add properties to the builder and call build() + + group(AssignCarRequest, () { + // String carId + test('to test the property `carId`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/audit_action_test.dart b/packages/holzleitner_api/test/audit_action_test.dart new file mode 100644 index 0000000..8a216fc --- /dev/null +++ b/packages/holzleitner_api/test/audit_action_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for AuditAction +void main() { + + group(AuditAction, () { + }); +} diff --git a/packages/holzleitner_api/test/cancel_delivery_request_test.dart b/packages/holzleitner_api/test/cancel_delivery_request_test.dart new file mode 100644 index 0000000..440fa18 --- /dev/null +++ b/packages/holzleitner_api/test/cancel_delivery_request_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for CancelDeliveryRequest +void main() { + final instance = CancelDeliveryRequestBuilder(); + // TODO add properties to the builder and call build() + + group(CancelDeliveryRequest, () { + // String reason + test('to test the property `reason`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/car_response_test.dart b/packages/holzleitner_api/test/car_response_test.dart new file mode 100644 index 0000000..2e0c0d9 --- /dev/null +++ b/packages/holzleitner_api/test/car_response_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for CarResponse +void main() { + final instance = CarResponseBuilder(); + // TODO add properties to the builder and call build() + + group(CarResponse, () { + // Car car + test('to test the property `car`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/car_test.dart b/packages/holzleitner_api/test/car_test.dart new file mode 100644 index 0000000..20e3a5c --- /dev/null +++ b/packages/holzleitner_api/test/car_test.dart @@ -0,0 +1,32 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Car +void main() { + final instance = CarBuilder(); + // TODO add properties to the builder and call build() + + group(Car, () { + // Verweis auf [`crate::domain::Account::personalnummer`]. + // int accountId + test('to test the property `accountId`', () async { + // TODO + }); + + // bool active + test('to test the property `active`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // String plate + test('to test the property `plate`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/cars_api_test.dart b/packages/holzleitner_api/test/cars_api_test.dart new file mode 100644 index 0000000..32cfaa7 --- /dev/null +++ b/packages/holzleitner_api/test/cars_api_test.dart @@ -0,0 +1,32 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for CarsApi +void main() { + final instance = HolzleitnerApi().getCarsApi(); + + group(CarsApi, () { + // Legt ein neues Fahrzeug für den angemeldeten Fahrer an. + // + //Future createMyCar(CreateCarRequest createCarRequest) async + test('test createMyCar', () async { + // TODO + }); + + // Listet die Fahrzeuge des angemeldeten Fahrers. + // + //Future listMyCars({ bool includeInactive }) async + test('test listMyCars', () async { + // TODO + }); + + // Aktualisiert ein Fahrzeug (Kennzeichen ändern / deaktivieren). + // + //Future updateMyCar(String carId, UpdateCarRequest updateCarRequest) async + test('test updateMyCar', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/cars_list_test.dart b/packages/holzleitner_api/test/cars_list_test.dart new file mode 100644 index 0000000..ab89576 --- /dev/null +++ b/packages/holzleitner_api/test/cars_list_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for CarsList +void main() { + final instance = CarsListBuilder(); + // TODO add properties to the builder and call build() + + group(CarsList, () { + // BuiltList cars + test('to test the property `cars`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/create_car_request_test.dart b/packages/holzleitner_api/test/create_car_request_test.dart new file mode 100644 index 0000000..632c3a7 --- /dev/null +++ b/packages/holzleitner_api/test/create_car_request_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for CreateCarRequest +void main() { + final instance = CreateCarRequestBuilder(); + // TODO add properties to the builder and call build() + + group(CreateCarRequest, () { + // String plate + test('to test the property `plate`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/create_delivery_note_request_test.dart b/packages/holzleitner_api/test/create_delivery_note_request_test.dart new file mode 100644 index 0000000..b1defe0 --- /dev/null +++ b/packages/holzleitner_api/test/create_delivery_note_request_test.dart @@ -0,0 +1,28 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for CreateDeliveryNoteRequest +void main() { + final instance = CreateDeliveryNoteRequestBuilder(); + // TODO add properties to the builder and call build() + + group(CreateDeliveryNoteRequest, () { + // Fahrzeug, das die Notiz erzeugt hat. Muss zum angemeldeten Account gehören. `None` ist erlaubt. + // String authorCarId + test('to test the property `authorCarId`', () async { + // TODO + }); + + // Object-Storage-Key oder URL eines vorab hochgeladenen Bildes. + // String imageAttachment + test('to test the property `imageAttachment`', () async { + // TODO + }); + + // String text + test('to test the property `text`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/customer_contact_test.dart b/packages/holzleitner_api/test/customer_contact_test.dart new file mode 100644 index 0000000..0c7732a --- /dev/null +++ b/packages/holzleitner_api/test/customer_contact_test.dart @@ -0,0 +1,36 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for CustomerContact +void main() { + final instance = CustomerContactBuilder(); + // TODO add properties to the builder and call build() + + group(CustomerContact, () { + // String customerId + test('to test the property `customerId`', () async { + // TODO + }); + + // String email + test('to test the property `email`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // String name + test('to test the property `name`', () async { + // TODO + }); + + // String phone + test('to test the property `phone`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/customer_test.dart b/packages/holzleitner_api/test/customer_test.dart new file mode 100644 index 0000000..8c8cdbb --- /dev/null +++ b/packages/holzleitner_api/test/customer_test.dart @@ -0,0 +1,31 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Customer +void main() { + final instance = CustomerBuilder(); + // TODO add properties to the builder and call build() + + group(Customer, () { + // Address address + test('to test the property `address`', () async { + // TODO + }); + + // int erpCustomerId + test('to test the property `erpCustomerId`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // String name + test('to test the property `name`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/deliveries_api_test.dart b/packages/holzleitner_api/test/deliveries_api_test.dart new file mode 100644 index 0000000..1afe4c6 --- /dev/null +++ b/packages/holzleitner_api/test/deliveries_api_test.dart @@ -0,0 +1,53 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for DeliveriesApi +void main() { + final instance = HolzleitnerApi().getDeliveriesApi(); + + group(DeliveriesApi, () { + // Setzt das `assigned_car_id` einer Lieferung. `carId: null` löst die Zuordnung wieder. Der Use Case stellt sicher, dass das Fahrzeug zum angemeldeten Account gehört. + // + //Future assignCar(String deliveryId, AssignCarRequest assignCarRequest) async + test('test assignCar', () async { + // TODO + }); + + // Setzt die Lieferung auf `canceled` — endgültig. Erlaubt aus `active` und `held`. + // + //Future cancel(String deliveryId, CancelDeliveryRequest cancelDeliveryRequest) async + test('test cancel', () async { + // TODO + }); + + // Schließt die Lieferung ab — `state = completed`. Nur aus `active`. + // + //Future complete(String deliveryId) async + test('test complete', () async { + // TODO + }); + + // Legt eine neue Notiz an einer Lieferung an. Mindestens eines von `text` und `imageAttachment` muss inhaltlich gefüllt sein (Leerstrings werden serverseitig getrimmt und als leer behandelt). + // + //Future createNote(String deliveryId, CreateDeliveryNoteRequest createDeliveryNoteRequest) async + test('test createNote', () async { + // TODO + }); + + // Setzt die Lieferung auf `held`. Nur aus `active` zulässig. + // + //Future hold(String deliveryId, HoldDeliveryRequest holdDeliveryRequest) async + test('test hold', () async { + // TODO + }); + + // Setzt die Lieferung zurück auf `active`. Nur aus `held` zulässig. + // + //Future resume(String deliveryId) async + test('test resume', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_item_test.dart b/packages/holzleitner_api/test/delivery_item_test.dart new file mode 100644 index 0000000..10a9388 --- /dev/null +++ b/packages/holzleitner_api/test/delivery_item_test.dart @@ -0,0 +1,53 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryItem +void main() { + final instance = DeliveryItemBuilder(); + // TODO add properties to the builder and call build() + + group(DeliveryItem, () { + // String articleId + test('to test the property `articleId`', () async { + // TODO + }); + + // ERP-Belegzeilen-Nr (Position innerhalb des Belegs). + // int belegzeilenNr + test('to test the property `belegzeilenNr`', () async { + // TODO + }); + + // String deliveryId + test('to test the property `deliveryId`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // Bei Items aus einer Stückliste: Artikelnummer der Komponente. Bei regulären Belegzeilen: `None`. + // String komponentenArtikelNr + test('to test the property `komponentenArtikelNr`', () async { + // TODO + }); + + // int requiredQuantity + test('to test the property `requiredQuantity`', () async { + // TODO + }); + + // ScanState scanState + test('to test the property `scanState`', () async { + // TODO + }); + + // String warehouseId + test('to test the property `warehouseId`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_note_response_test.dart b/packages/holzleitner_api/test/delivery_note_response_test.dart new file mode 100644 index 0000000..147ec83 --- /dev/null +++ b/packages/holzleitner_api/test/delivery_note_response_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryNoteResponse +void main() { + final instance = DeliveryNoteResponseBuilder(); + // TODO add properties to the builder and call build() + + group(DeliveryNoteResponse, () { + // DeliveryNote note + test('to test the property `note`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_note_test.dart b/packages/holzleitner_api/test/delivery_note_test.dart new file mode 100644 index 0000000..f8cb1da --- /dev/null +++ b/packages/holzleitner_api/test/delivery_note_test.dart @@ -0,0 +1,49 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryNote +void main() { + final instance = DeliveryNoteBuilder(); + // TODO add properties to the builder and call build() + + group(DeliveryNote, () { + // Fahrzeug, falls bekannt — nullable bis das Backend Cars verwaltet. + // String authorCarId + test('to test the property `authorCarId`', () async { + // TODO + }); + + // Personalnummer des Akteurs (aus dem JWT). Pflicht. + // int authorPersonalnummer + test('to test the property `authorPersonalnummer`', () async { + // TODO + }); + + // DateTime createdAt + test('to test the property `createdAt`', () async { + // TODO + }); + + // String deliveryId + test('to test the property `deliveryId`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // Referenz auf einen Bild-Anhang (z. B. Object-Storage-Key/URL). + // String imageAttachment + test('to test the property `imageAttachment`', () async { + // TODO + }); + + // String text + test('to test the property `text`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_order_entry_test.dart b/packages/holzleitner_api/test/delivery_order_entry_test.dart new file mode 100644 index 0000000..25cd6d4 --- /dev/null +++ b/packages/holzleitner_api/test/delivery_order_entry_test.dart @@ -0,0 +1,21 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryOrderEntry +void main() { + final instance = DeliveryOrderEntryBuilder(); + // TODO add properties to the builder and call build() + + group(DeliveryOrderEntry, () { + // String deliveryId + test('to test the property `deliveryId`', () async { + // TODO + }); + + // int sortOrder + test('to test the property `sortOrder`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_response_test.dart b/packages/holzleitner_api/test/delivery_response_test.dart new file mode 100644 index 0000000..2013ea4 --- /dev/null +++ b/packages/holzleitner_api/test/delivery_response_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryResponse +void main() { + final instance = DeliveryResponseBuilder(); + // TODO add properties to the builder and call build() + + group(DeliveryResponse, () { + // Delivery delivery + test('to test the property `delivery`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_state_test.dart b/packages/holzleitner_api/test/delivery_state_test.dart new file mode 100644 index 0000000..11926c5 --- /dev/null +++ b/packages/holzleitner_api/test/delivery_state_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryState +void main() { + + group(DeliveryState, () { + }); +} diff --git a/packages/holzleitner_api/test/delivery_test.dart b/packages/holzleitner_api/test/delivery_test.dart new file mode 100644 index 0000000..f374d1b --- /dev/null +++ b/packages/holzleitner_api/test/delivery_test.dart @@ -0,0 +1,78 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Delivery +void main() { + //final instance = DeliveryBuilder(); + // TODO add properties to the builder and call build() + + group(Delivery, () { + // Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. + // String assignedCarId + test('to test the property `assignedCarId`', () async { + // TODO + }); + + // Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. + // BuiltList contactPersonIds + test('to test the property `contactPersonIds`', () async { + // TODO + }); + + // String customerId + test('to test the property `customerId`', () async { + // TODO + }); + + // Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. + // Address deliveryAddressSnapshot + test('to test the property `deliveryAddressSnapshot`', () async { + // TODO + }); + + // Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). + // String desiredTime + test('to test the property `desiredTime`', () async { + // TODO + }); + + // ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. + // int erpBelegartId + test('to test the property `erpBelegartId`', () async { + // TODO + }); + + // String erpBelegnummer + test('to test the property `erpBelegnummer`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). + // String specialAgreements + test('to test the property `specialAgreements`', () async { + // TODO + }); + + // DeliveryState state + test('to test the property `state`', () async { + // TODO + }); + + // Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. + // String stateReason + test('to test the property `stateReason`', () async { + // TODO + }); + + // String tourId + test('to test the property `tourId`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/delivery_with_items_test.dart b/packages/holzleitner_api/test/delivery_with_items_test.dart new file mode 100644 index 0000000..7219e9e --- /dev/null +++ b/packages/holzleitner_api/test/delivery_with_items_test.dart @@ -0,0 +1,89 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for DeliveryWithItems +void main() { + final instance = DeliveryWithItemsBuilder(); + // TODO add properties to the builder and call build() + + group(DeliveryWithItems, () { + // Fahrzeug-Zuordnung, gesetzt in der Auswählen-Phase. Bei Ein-Auto-Teams beim Sync automatisch gefüllt. + // String assignedCarId + test('to test the property `assignedCarId`', () async { + // TODO + }); + + // Ausgewählte Ansprechpartner für genau diese Lieferung (Auswahl aus `Customer.contacts`). Kann leer sein. + // BuiltList contactPersonIds + test('to test the property `contactPersonIds`', () async { + // TODO + }); + + // String customerId + test('to test the property `customerId`', () async { + // TODO + }); + + // Eingefrorene Liefer-Adresse zum Zeitpunkt des Tour-Syncs. Schützt vor rückwirkenden Kunden-Adressänderungen. + // Address deliveryAddressSnapshot + test('to test the property `deliveryAddressSnapshot`', () async { + // TODO + }); + + // Wunsch-Lieferzeit als Freitext (z. B. \"vormittags\", \"ab 14:00\"). + // String desiredTime + test('to test the property `desiredTime`', () async { + // TODO + }); + + // ERP-Beleg-Bezug: business-stabiles Paar `(Belegart, Belegnummer)`. Überlebt den Belegkopf-Archivübergang. + // int erpBelegartId + test('to test the property `erpBelegartId`', () async { + // TODO + }); + + // String erpBelegnummer + test('to test the property `erpBelegnummer`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // Sondervereinbarungen (z. B. „Türklingel defekt, hintenrum klopfen\"). + // String specialAgreements + test('to test the property `specialAgreements`', () async { + // TODO + }); + + // DeliveryState state + test('to test the property `state`', () async { + // TODO + }); + + // Begründung bei `state == Held` oder `state == Canceled`. Beim Resume / Complete wieder `None`. + // String stateReason + test('to test the property `stateReason`', () async { + // TODO + }); + + // String tourId + test('to test the property `tourId`', () async { + // TODO + }); + + // BuiltList items + test('to test the property `items`', () async { + // TODO + }); + + // Sortier-Reihenfolge innerhalb der Tour (1-basiert). + // int sortOrder + test('to test the property `sortOrder`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/health_api_test.dart b/packages/holzleitner_api/test/health_api_test.dart new file mode 100644 index 0000000..c4d10c8 --- /dev/null +++ b/packages/holzleitner_api/test/health_api_test.dart @@ -0,0 +1,18 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for HealthApi +void main() { + final instance = HolzleitnerApi().getHealthApi(); + + group(HealthApi, () { + // Health-Endpoint für Load-Balancer und Container-Probes. Bewusst kein Auth — eine `200 ok`-Antwort darf nicht von der Auth abhängen. + // + //Future health() async + test('test health', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/hold_delivery_request_test.dart b/packages/holzleitner_api/test/hold_delivery_request_test.dart new file mode 100644 index 0000000..7870abc --- /dev/null +++ b/packages/holzleitner_api/test/hold_delivery_request_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for HoldDeliveryRequest +void main() { + final instance = HoldDeliveryRequestBuilder(); + // TODO add properties to the builder and call build() + + group(HoldDeliveryRequest, () { + // String reason + test('to test the property `reason`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/scan_event_test.dart b/packages/holzleitner_api/test/scan_event_test.dart new file mode 100644 index 0000000..c35532d --- /dev/null +++ b/packages/holzleitner_api/test/scan_event_test.dart @@ -0,0 +1,43 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ScanEvent +void main() { + final instance = ScanEventBuilder(); + // TODO add properties to the builder and call build() + + group(ScanEvent, () { + // AuditAction action + test('to test the property `action`', () async { + // TODO + }); + + // Fahrzeug, in dem der Scan gemacht wurde. Muss zum angemeldeten Account gehören. `None` ist erlaubt, schwächt aber den Audit-Trail. + // String actorCarId + test('to test the property `actorCarId`', () async { + // TODO + }); + + // String clientScanId + test('to test the property `clientScanId`', () async { + // TODO + }); + + // DateTime clientScannedAt + test('to test the property `clientScannedAt`', () async { + // TODO + }); + + // String deliveryItemId + test('to test the property `deliveryItemId`', () async { + // TODO + }); + + // Pflicht bei `Hold` und `Remove`. Sonst ignoriert. + // String reason + test('to test the property `reason`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/scan_result_status_test.dart b/packages/holzleitner_api/test/scan_result_status_test.dart new file mode 100644 index 0000000..377343f --- /dev/null +++ b/packages/holzleitner_api/test/scan_result_status_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ScanResultStatus +void main() { + + group(ScanResultStatus, () { + }); +} diff --git a/packages/holzleitner_api/test/scan_result_test.dart b/packages/holzleitner_api/test/scan_result_test.dart new file mode 100644 index 0000000..ed39620 --- /dev/null +++ b/packages/holzleitner_api/test/scan_result_test.dart @@ -0,0 +1,38 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ScanResult +void main() { + final instance = ScanResultBuilder(); + // TODO add properties to the builder and call build() + + group(ScanResult, () { + // String clientScanId + test('to test the property `clientScanId`', () async { + // TODO + }); + + // Aktueller `scan_state` der Position nach der Verarbeitung — genau dann gesetzt, wenn der Server den Stand kennen konnte (`Applied` oder `Duplicate`). Erlaubt der App, die UI ohne Re-Fetch zu aktualisieren. + // String deliveryItemId + test('to test the property `deliveryItemId`', () async { + // TODO + }); + + // ScanState newScanState + test('to test the property `newScanState`', () async { + // TODO + }); + + // Bei `Rejected`: Begründung. Bei `Applied`/`Duplicate`: `None`. + // String reason + test('to test the property `reason`', () async { + // TODO + }); + + // ScanResultStatus status + test('to test the property `status`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/scan_state_test.dart b/packages/holzleitner_api/test/scan_state_test.dart new file mode 100644 index 0000000..d5f7832 --- /dev/null +++ b/packages/holzleitner_api/test/scan_state_test.dart @@ -0,0 +1,32 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ScanState +void main() { + final instance = ScanStateBuilder(); + // TODO add properties to the builder and call build() + + group(ScanState, () { + // Grund bei `status == Held` oder `status == Removed`. + // String heldReason + test('to test the property `heldReason`', () async { + // TODO + }); + + // DateTime lastUpdatedAt + test('to test the property `lastUpdatedAt`', () async { + // TODO + }); + + // int scannedQuantity + test('to test the property `scannedQuantity`', () async { + // TODO + }); + + // ScanStatus status + test('to test the property `status`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/scan_status_test.dart b/packages/holzleitner_api/test/scan_status_test.dart new file mode 100644 index 0000000..beeadcf --- /dev/null +++ b/packages/holzleitner_api/test/scan_status_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for ScanStatus +void main() { + + group(ScanStatus, () { + }); +} diff --git a/packages/holzleitner_api/test/scans_api_test.dart b/packages/holzleitner_api/test/scans_api_test.dart new file mode 100644 index 0000000..87de9e2 --- /dev/null +++ b/packages/holzleitner_api/test/scans_api_test.dart @@ -0,0 +1,20 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for ScansApi +void main() { + final instance = HolzleitnerApi().getScansApi(); + + group(ScansApi, () { + // Wendet eine Liste von Scan-Events idempotent an. + // + // Pro Event ein eigenes Resultat. Status `applied` schreibt einen frischen Audit-Eintrag, `duplicate` liefert den aktuellen Stand am Server, `rejected` enthält die Begründung. Reihenfolge der `results` entspricht der Reihenfolge der `scans` im Request. + // + //Future applyScans(ApplyScansRequest applyScansRequest) async + test('test applyScans', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/set_delivery_order_request_test.dart b/packages/holzleitner_api/test/set_delivery_order_request_test.dart new file mode 100644 index 0000000..f404634 --- /dev/null +++ b/packages/holzleitner_api/test/set_delivery_order_request_test.dart @@ -0,0 +1,17 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for SetDeliveryOrderRequest +void main() { + final instance = SetDeliveryOrderRequestBuilder(); + // TODO add properties to the builder and call build() + + group(SetDeliveryOrderRequest, () { + // Reihenfolge: Position im Array (0-basiert) wird zu `sort_order` (1-basiert) gemappt. + // BuiltList deliveryIds + test('to test the property `deliveryIds`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/set_delivery_order_response_test.dart b/packages/holzleitner_api/test/set_delivery_order_response_test.dart new file mode 100644 index 0000000..aa34607 --- /dev/null +++ b/packages/holzleitner_api/test/set_delivery_order_response_test.dart @@ -0,0 +1,21 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for SetDeliveryOrderResponse +void main() { + final instance = SetDeliveryOrderResponseBuilder(); + // TODO add properties to the builder and call build() + + group(SetDeliveryOrderResponse, () { + // BuiltList order + test('to test the property `order`', () async { + // TODO + }); + + // String tourId + test('to test the property `tourId`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/sync_api_test.dart b/packages/holzleitner_api/test/sync_api_test.dart new file mode 100644 index 0000000..853d9ab --- /dev/null +++ b/packages/holzleitner_api/test/sync_api_test.dart @@ -0,0 +1,18 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for SyncApi +void main() { + final instance = HolzleitnerApi().getSyncApi(); + + group(SyncApi, () { + // Sync-Endpoint für das ERP: legt eine Tagestour samt Lieferungen und Positionen idempotent an. Identität pro Tour `(driver_personalnummer, tour_date)`, pro Lieferung `(belegart_id, belegnummer)`. + // + //Future syncTour(SyncTourRequest syncTourRequest) async + test('test syncTour', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/sync_delivery_item_test.dart b/packages/holzleitner_api/test/sync_delivery_item_test.dart new file mode 100644 index 0000000..4dc09a7 --- /dev/null +++ b/packages/holzleitner_api/test/sync_delivery_item_test.dart @@ -0,0 +1,58 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for SyncDeliveryItem +void main() { + final instance = SyncDeliveryItemBuilder(); + // TODO add properties to the builder and call build() + + group(SyncDeliveryItem, () { + // Default-Lager-Code für den Artikel (Anlage neuer Artikel). + // String articleDefaultWarehouseCode + test('to test the property `articleDefaultWarehouseCode`', () async { + // TODO + }); + + // String articleName + test('to test the property `articleName`', () async { + // TODO + }); + + // String articleNumber + test('to test the property `articleNumber`', () async { + // TODO + }); + + // bool articleScannable + test('to test the property `articleScannable`', () async { + // TODO + }); + + // int belegzeilenNr + test('to test the property `belegzeilenNr`', () async { + // TODO + }); + + // Komponenten-Artikelnummer bei aufgelösten Stücklisten, sonst leer. + // String komponentenArtikelNr + test('to test the property `komponentenArtikelNr`', () async { + // TODO + }); + + // int requiredQuantity + test('to test the property `requiredQuantity`', () async { + // TODO + }); + + // String warehouseCode + test('to test the property `warehouseCode`', () async { + // TODO + }); + + // String warehouseName + test('to test the property `warehouseName`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/sync_delivery_test.dart b/packages/holzleitner_api/test/sync_delivery_test.dart new file mode 100644 index 0000000..e766983 --- /dev/null +++ b/packages/holzleitner_api/test/sync_delivery_test.dart @@ -0,0 +1,63 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for SyncDelivery +void main() { + final instance = SyncDeliveryBuilder(); + // TODO add properties to the builder and call build() + + group(SyncDelivery, () { + // int belegartId + test('to test the property `belegartId`', () async { + // TODO + }); + + // String belegnummer + test('to test the property `belegnummer`', () async { + // TODO + }); + + // Address customerAddress + test('to test the property `customerAddress`', () async { + // TODO + }); + + // String customerName + test('to test the property `customerName`', () async { + // TODO + }); + + // Snapshot der Lieferadresse (kann von der Stammadresse abweichen). + // Address deliveryAddress + test('to test the property `deliveryAddress`', () async { + // TODO + }); + + // String desiredTime + test('to test the property `desiredTime`', () async { + // TODO + }); + + // int erpCustomerId + test('to test the property `erpCustomerId`', () async { + // TODO + }); + + // BuiltList items + test('to test the property `items`', () async { + // TODO + }); + + // 1-basiert, definiert die initiale Reihenfolge in der App. + // int sortOrder + test('to test the property `sortOrder`', () async { + // TODO + }); + + // String specialAgreements + test('to test the property `specialAgreements`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/sync_tour_request_test.dart b/packages/holzleitner_api/test/sync_tour_request_test.dart new file mode 100644 index 0000000..02e77ff --- /dev/null +++ b/packages/holzleitner_api/test/sync_tour_request_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for SyncTourRequest +void main() { + final instance = SyncTourRequestBuilder(); + // TODO add properties to the builder and call build() + + group(SyncTourRequest, () { + // BuiltList deliveries + test('to test the property `deliveries`', () async { + // TODO + }); + + // int driverPersonalnummer + test('to test the property `driverPersonalnummer`', () async { + // TODO + }); + + // Date tourDate + test('to test the property `tourDate`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/sync_tour_response_test.dart b/packages/holzleitner_api/test/sync_tour_response_test.dart new file mode 100644 index 0000000..b2aecb6 --- /dev/null +++ b/packages/holzleitner_api/test/sync_tour_response_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for SyncTourResponse +void main() { + final instance = SyncTourResponseBuilder(); + // TODO add properties to the builder and call build() + + group(SyncTourResponse, () { + // String tourId + test('to test the property `tourId`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/tour_details_test.dart b/packages/holzleitner_api/test/tour_details_test.dart new file mode 100644 index 0000000..3708389 --- /dev/null +++ b/packages/holzleitner_api/test/tour_details_test.dart @@ -0,0 +1,47 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for TourDetails +void main() { + final instance = TourDetailsBuilder(); + // TODO add properties to the builder and call build() + + group(TourDetails, () { + // BuiltList
articles + test('to test the property `articles`', () async { + // TODO + }); + + // BuiltList customerContacts + test('to test the property `customerContacts`', () async { + // TODO + }); + + // BuiltList customers + test('to test the property `customers`', () async { + // TODO + }); + + // BuiltList deliveries + test('to test the property `deliveries`', () async { + // TODO + }); + + // Alle Notizen aller Lieferungen dieser Tour, in einer Liste. Die App joint clientseitig per `delivery_id`. Reihenfolge: pro Lieferung aufsteigend nach `created_at`. + // BuiltList notes + test('to test the property `notes`', () async { + // TODO + }); + + // Tour tour + test('to test the property `tour`', () async { + // TODO + }); + + // BuiltList warehouses + test('to test the property `warehouses`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/tour_summary_list_test.dart b/packages/holzleitner_api/test/tour_summary_list_test.dart new file mode 100644 index 0000000..cf20e2b --- /dev/null +++ b/packages/holzleitner_api/test/tour_summary_list_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for TourSummaryList +void main() { + final instance = TourSummaryListBuilder(); + // TODO add properties to the builder and call build() + + group(TourSummaryList, () { + // BuiltList tours + test('to test the property `tours`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/tour_summary_test.dart b/packages/holzleitner_api/test/tour_summary_test.dart new file mode 100644 index 0000000..2944fe4 --- /dev/null +++ b/packages/holzleitner_api/test/tour_summary_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for TourSummary +void main() { + final instance = TourSummaryBuilder(); + // TODO add properties to the builder and call build() + + group(TourSummary, () { + // int deliveryCount + test('to test the property `deliveryCount`', () async { + // TODO + }); + + // Date tourDate + test('to test the property `tourDate`', () async { + // TODO + }); + + // String tourId + test('to test the property `tourId`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/tour_test.dart b/packages/holzleitner_api/test/tour_test.dart new file mode 100644 index 0000000..35cd0ec --- /dev/null +++ b/packages/holzleitner_api/test/tour_test.dart @@ -0,0 +1,32 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Tour +void main() { + final instance = TourBuilder(); + // TODO add properties to the builder and call build() + + group(Tour, () { + // int accountId + test('to test the property `accountId`', () async { + // TODO + }); + + // Date date + test('to test the property `date`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // Zeitpunkt des letzten ERP-Sync — für Drift-Erkennung. + // DateTime syncedAt + test('to test the property `syncedAt`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/tours_api_test.dart b/packages/holzleitner_api/test/tours_api_test.dart new file mode 100644 index 0000000..fb2664c --- /dev/null +++ b/packages/holzleitner_api/test/tours_api_test.dart @@ -0,0 +1,32 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + + +/// tests for ToursApi +void main() { + final instance = HolzleitnerApi().getToursApi(); + + group(ToursApi, () { + // Lädt eine Tour mit allen Lieferungen, Positionen und referenzierten Stammdaten — die App nutzt das als einzigen großen Read. + // + //Future getTour(String tourId) async + test('test getTour', () async { + // TODO + }); + + // Listet heutige Touren des angemeldeten Fahrers (Filter aus dem JWT). + // + //Future listMyToursToday() async + test('test listMyToursToday', () async { + // TODO + }); + + // Schreibt die Sortier-Reihenfolge aller Lieferungen einer Tour neu. Der Client schickt die **vollständige** neue Reihenfolge; fehlende oder fremde Lieferungs-Ids werden mit `400 validation` abgelehnt. + // + //Future setDeliveryOrder(String tourId, SetDeliveryOrderRequest setDeliveryOrderRequest) async + test('test setDeliveryOrder', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/update_car_request_test.dart b/packages/holzleitner_api/test/update_car_request_test.dart new file mode 100644 index 0000000..993d687 --- /dev/null +++ b/packages/holzleitner_api/test/update_car_request_test.dart @@ -0,0 +1,23 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for UpdateCarRequest +void main() { + final instance = UpdateCarRequestBuilder(); + // TODO add properties to the builder and call build() + + group(UpdateCarRequest, () { + // Wenn gesetzt: aktiv/inaktiv. Inaktive Fahrzeuge tauchen in `GET /me/cars?activeOnly=true` (default) nicht auf. + // bool active + test('to test the property `active`', () async { + // TODO + }); + + // Wenn gesetzt: neues Kennzeichen. + // String plate + test('to test the property `plate`', () async { + // TODO + }); + + }); +} diff --git a/packages/holzleitner_api/test/warehouse_test.dart b/packages/holzleitner_api/test/warehouse_test.dart new file mode 100644 index 0000000..e123ae9 --- /dev/null +++ b/packages/holzleitner_api/test/warehouse_test.dart @@ -0,0 +1,31 @@ +import 'package:test/test.dart'; +import 'package:holzleitner_api/holzleitner_api.dart'; + +// tests for Warehouse +void main() { + final instance = WarehouseBuilder(); + // TODO add properties to the builder and call build() + + group(Warehouse, () { + // String code + test('to test the property `code`', () async { + // TODO + }); + + // String id + test('to test the property `id`', () async { + // TODO + }); + + // bool isStandard + test('to test the property `isStandard`', () async { + // TODO + }); + + // String name + test('to test the property `name`', () async { + // TODO + }); + + }); +} diff --git a/pubspec.lock b/pubspec.lock index c6ee03e..b5b1278 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -249,6 +249,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.11" + dio: + dependency: "direct main" + description: + name: dio + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + url: "https://pub.dev" + source: hosted + version: "5.9.2" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + url: "https://pub.dev" + source: hosted + version: "2.1.2" easy_stepper: dependency: "direct main" description: @@ -488,6 +504,13 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + holzleitner_api: + dependency: "direct main" + description: + path: "packages/holzleitner_api" + relative: true + source: path + version: "1.0.0" http: dependency: "direct main" description: @@ -712,6 +735,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + one_of: + dependency: transitive + description: + name: one_of + sha256: "25fe0fcf181e761c6fcd604caf9d5fdf952321be17584ba81c72c06bdaa511f0" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + one_of_serializer: + dependency: transitive + description: + name: one_of_serializer + sha256: "3f3dfb5c1578ba3afef1cb47fcc49e585e797af3f2b6c2cc7ed90aad0c5e7b83" + url: "https://pub.dev" + source: hosted + version: "1.5.0" package_config: dependency: transitive description: @@ -864,6 +903,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" + source: hosted + version: "3.2.2" rxdart: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index d92b012..3ebabb9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,15 @@ dependencies: rxdart: ^0.28.0 collection: any + + # HTTP-Client für das neue Rust-Backend (per OpenAPI-Generator + # erzeugter Client setzt dio voraus). + dio: ^5.7.0 + # Generiertes Sub-Package: produziert durch + # `tool/generate_api_client.sh` aus openapi/holzleitner.json. + holzleitner_api: + path: packages/holzleitner_api + dev_dependencies: build_runner: ^2.5.4 flutter_test: @@ -66,6 +75,8 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^5.0.0 json_serializable: ^6.9.5 + # Generator wird über tool/generate_api_client.sh (Java-CLI) gefahren — + # kein build_runner-Hook, daher kein openapi_generator-Paket nötig. # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/tool/fetch_openapi_generator.sh b/tool/fetch_openapi_generator.sh new file mode 100755 index 0000000..e1b9765 --- /dev/null +++ b/tool/fetch_openapi_generator.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# Lädt die openapi-generator-cli.jar von Maven Central nach +# tool/openapi-generator-cli.jar. Idempotent — überspringt, wenn schon da. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +JAR="${SCRIPT_DIR}/openapi-generator-cli.jar" +VERSION="7.10.0" + +if [[ -f "${JAR}" ]]; then + echo "→ JAR existiert bereits unter ${JAR}" + exit 0 +fi + +echo "→ Lade openapi-generator-cli ${VERSION} ..." +curl -sL \ + "https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/${VERSION}/openapi-generator-cli-${VERSION}.jar" \ + -o "${JAR}" +echo "✓ ${JAR}" diff --git a/tool/generate_api_client.sh b/tool/generate_api_client.sh new file mode 100755 index 0000000..4484ae6 --- /dev/null +++ b/tool/generate_api_client.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# +# Erzeugt den Dart/Dio-Client für das Holzleitner-Rust-Backend aus +# openapi/holzleitner.json. +# +# Voraussetzungen: +# * Java 11+ (auf macOS: brew install openjdk@21) +# * tool/openapi-generator-cli.jar (~29 MB, kann via +# `tool/fetch_openapi_generator.sh` nachgeladen werden — derzeit +# ist die JAR im Repo eingecheckt für reproduzierbare Builds) +# +# Aufruf vom Projekt-Root: +# ./tool/generate_api_client.sh +# +# Output: +# packages/holzleitner_api/ (eigenes Dart-Sub-Package) + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +JAR="${SCRIPT_DIR}/openapi-generator-cli.jar" +SPEC="${PROJECT_ROOT}/openapi/holzleitner.json" +OUT="${PROJECT_ROOT}/packages/holzleitner_api" + +if [[ ! -f "${JAR}" ]]; then + echo "→ JAR fehlt — lade nach via tool/fetch_openapi_generator.sh" + bash "${SCRIPT_DIR}/fetch_openapi_generator.sh" +fi +if [[ ! -f "${SPEC}" ]]; then + echo "Error: OpenAPI-Spec nicht gefunden unter ${SPEC}" >&2 + echo " → Backend starten und neu ziehen:" >&2 + echo " curl http://127.0.0.1:3000/openapi.json | jq . > openapi/holzleitner.json" >&2 + exit 1 +fi + +echo "→ Generiere Dart-Client nach ${OUT}" + +# `dart-dio` erzeugt einen sauberen Client auf Basis von dio + Built Value. +# Wir setzen pubName/pubAuthor, damit das Sub-Package gleich einen +# klaren Namen hat. `wrapper: none` unterdrückt unnötiges Wrapping. +java -jar "${JAR}" generate \ + --input-spec "${SPEC}" \ + --generator-name dart-dio \ + --output "${OUT}" \ + --additional-properties=\ +pubName=holzleitner_api,\ +pubAuthor=Holzleitner_GmbH,\ +pubDescription="Generierter_Dart-Client_fuer_das_Holzleitner-Rust-Backend",\ +nullableFields=true,\ +serializationLibrary=built_value + +echo "✓ Fertig. Code unter ${OUT}/lib" +echo " Im Hauptpaket: flutter pub get (greift via path-dep zu)." diff --git a/tool/smoke_test_api.dart b/tool/smoke_test_api.dart new file mode 100644 index 0000000..9bbcb02 --- /dev/null +++ b/tool/smoke_test_api.dart @@ -0,0 +1,64 @@ +/// Smoke-Test für den generierten Holzleitner-API-Client. +/// +/// Läuft als reines Dart-Script (kein Flutter-Engine nötig): +/// +/// dart run tool/smoke_test_api.dart +/// +/// Voraussetzungen: +/// * Backend läuft unter http://127.0.0.1:3000 +/// * Keycloak läuft unter http://127.0.0.1:8080 +/// * Testfahrer (PN 1001) ist im Keycloak-Realm angelegt +/// +/// Was getestet wird: +/// 1. /health (ohne Auth) +/// 2. /me/cars (mit Auth via DevPasswordGrantTokenProvider) +library; + +import 'package:dio/dio.dart'; +import 'package:hl_lieferservice/data/network/backend_config.dart'; +import 'package:hl_lieferservice/data/network/dev_password_grant_token_provider.dart'; +import 'package:hl_lieferservice/data/network/holzleitner_api_factory.dart'; + +Future main() async { + const config = BackendConfig.localDev; + + // Health geht ohne Auth — wir nutzen die generierte API-Klasse trotzdem, + // um zu zeigen, dass der Aufruf-Pfad funktioniert. + print('---- 1) GET /health ----'); + final tokenProvider = DevPasswordGrantTokenProvider( + tokenEndpoint: config.keycloakTokenEndpoint, + clientId: config.keycloakClientId, + username: 'testfahrer', + password: 'test', + ); + final api = buildHolzleitnerApi( + config: config, + tokenProvider: tokenProvider, + ); + + try { + final health = await api.getHealthApi().health(); + print(' OK: ${health.data?.length ?? 0} bytes → ${health.data}'); + } on DioException catch (e) { + print(' FEHLER: ${e.message}'); + print(' Response: ${e.response?.data}'); + return; + } + + print('\n---- 2) GET /me/cars (mit Bearer-Token) ----'); + try { + final response = await api.getCarsApi().listMyCars(); + final cars = response.data?.cars; + if (cars == null) { + print(' OK: leerer Body'); + return; + } + print(' OK: ${cars.length} Fahrzeug(e)'); + for (final c in cars) { + print(' • ${c.id} ${c.plate} active=${c.active}'); + } + } on DioException catch (e) { + print(' FEHLER: ${e.message}'); + print(' Response: ${e.response?.data}'); + } +}