/* Options:
Date: 2025-04-07 15:03:44
Version: 8.52
Tip: To override a DTO option, remove "//" prefix before updating
BaseUrl: https://taxfiling.pwc.de

//GlobalNamespace: 
//AddServiceStackTypes: True
//AddResponseStatus: False
//AddImplicitVersion: 
//AddDescriptionAsComments: True
IncludeTypes: RetrieveProductAsync.*
//ExcludeTypes: 
//DefaultImports: package:servicestack/servicestack.dart,dart:typed_data
*/

import 'package:servicestack/servicestack.dart';
import 'dart:typed_data';

/**
* Specifies a service request to retrieve a product.
*/
// @Api(Description="Specifies a service request to retrieve a product.")
abstract class RetrieveProductBase implements IGet
{
    /**
    * The unique identifier of the product.
    */
    // @ApiMember(Description="The unique identifier of the product.", Name="Id")
    int? id;

    /**
    * Should the related orders of the account be included in the retrieved product?
    */
    // @ApiMember(Description="Should the related orders of the account be included in the retrieved product?")
    bool? includeOrders;

    /**
    * Specifies the number of orders to skip. Applicable only when 'IncludeOrders' is true. 
    */
    // @ApiMember(Description="Specifies the number of orders to skip. Applicable only when 'IncludeOrders' is true. ")
    int? skipOrders;

    /**
    * Specifies the number of orders to include. Applicable only when 'IncludeOrders' is true. 
    */
    // @ApiMember(Description="Specifies the number of orders to include. Applicable only when 'IncludeOrders' is true. ")
    int? takeOrders;

    RetrieveProductBase({this.id,this.includeOrders,this.skipOrders,this.takeOrders});
    RetrieveProductBase.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        id = json['id'];
        includeOrders = json['includeOrders'];
        skipOrders = json['skipOrders'];
        takeOrders = json['takeOrders'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'id': id,
        'includeOrders': includeOrders,
        'skipOrders': skipOrders,
        'takeOrders': takeOrders
    };

    getTypeName() => "RetrieveProductBase";
    TypeContext? context = _ctx;
}

/**
* Represents a product.
*/
// @Api(Description="Represents a product.")
class Product implements IHasName, IConvertible
{
    /**
    * The unique identifier of the product.
    */
    // @ApiMember(Description="The unique identifier of the product.", IsRequired=true)
    int? id;

    /**
    * The position of this instance in a collection of 'Product' instances
    */
    // @ApiMember(Description="The position of this instance in a collection of 'Product' instances", IsRequired=true)
    int? index;

    /**
    * The name of the product.
    */
    // @ApiMember(Description="The name of the product.", IsRequired=true)
    // @Validate(Validator="NotEmpty")
    String? name;

    /**
    * The version of the product.
    */
    // @ApiMember(Description="The version of the product.", IsRequired=true)
    // @Validate(Validator="NotEmpty")
    String? version;

    /**
    * The version of the product.
    */
    // @ApiMember(Description="The version of the product.")
    String? description;

    /**
    * Tags associated with the product.
    */
    // @ApiMember(Description="Tags associated with the product.")
    List<String>? tags = [];

    Product({this.id,this.index,this.name,this.version,this.description,this.tags});
    Product.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        id = json['id'];
        index = json['index'];
        name = json['name'];
        version = json['version'];
        description = json['description'];
        tags = JsonConverters.fromJson(json['tags'],'List<String>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'id': id,
        'index': index,
        'name': name,
        'version': version,
        'description': description,
        'tags': JsonConverters.toJson(tags,'List<String>',context!)
    };

    getTypeName() => "Product";
    TypeContext? context = _ctx;
}

enum HttpStatusCode
{
    Continue,
    SwitchingProtocols,
    Processing,
    EarlyHints,
    OK,
    Created,
    Accepted,
    NonAuthoritativeInformation,
    NoContent,
    ResetContent,
    PartialContent,
    MultiStatus,
    AlreadyReported,
    IMUsed,
    MultipleChoices,
    Ambiguous,
    MovedPermanently,
    Moved,
    Found,
    Redirect,
    SeeOther,
    RedirectMethod,
    NotModified,
    UseProxy,
    Unused,
    TemporaryRedirect,
    RedirectKeepVerb,
    PermanentRedirect,
    BadRequest,
    Unauthorized,
    PaymentRequired,
    Forbidden,
    NotFound,
    MethodNotAllowed,
    NotAcceptable,
    ProxyAuthenticationRequired,
    RequestTimeout,
    Conflict,
    Gone,
    LengthRequired,
    PreconditionFailed,
    RequestEntityTooLarge,
    RequestUriTooLong,
    UnsupportedMediaType,
    RequestedRangeNotSatisfiable,
    ExpectationFailed,
    MisdirectedRequest,
    UnprocessableEntity,
    UnprocessableContent,
    Locked,
    FailedDependency,
    UpgradeRequired,
    PreconditionRequired,
    TooManyRequests,
    RequestHeaderFieldsTooLarge,
    UnavailableForLegalReasons,
    InternalServerError,
    NotImplemented,
    BadGateway,
    ServiceUnavailable,
    GatewayTimeout,
    HttpVersionNotSupported,
    VariantAlsoNegotiates,
    InsufficientStorage,
    LoopDetected,
    NotExtended,
    NetworkAuthenticationRequired,
}

/**
* Represents a commission to consume services.
*/
// @Api(Description="Represents a commission to consume services.")
class Order implements IHasName, IConvertible
{
    /**
    * The unique identifier of the order.
    */
    // @ApiMember(Description="The unique identifier of the order.", IsRequired=true)
    int? id;

    /**
    * The unique identifier of the product, for which the order is made.
    */
    // @ApiMember(Description="The unique identifier of the product, for which the order is made.", IsRequired=true)
    int? productId;

    /**
    * The unique identifier of the user account, who placed the order.
    */
    // @ApiMember(Description="The unique identifier of the user account, who placed the order.", IsRequired=true)
    int? accountId;

    /**
    * A name to identify the order.
    */
    // @ApiMember(Description="A name to identify the order.", IsRequired=true)
    // @Validate(Validator="NotEmpty")
    String? name;

    /**
    * The name of the service, for which the order was made.
    */
    // @ApiMember(Description="The name of the service, for which the order was made.")
    String? serviceName;

    /**
    * The time stamp at which the order was initiated.
    */
    // @ApiMember(Description="The time stamp at which the order was initiated.")
    DateTime? requestTimestamp;

    /**
    * The time stamp at which the order was completed.
    */
    // @ApiMember(Description="The time stamp at which the order was completed.")
    DateTime? responseTimestamp;

    /**
    * The URI from which the order was initiated.
    */
    // @ApiMember(Description="The URI from which the order was initiated.")
    String? requestUri;

    /**
    * The HTTP method of the order request.
    */
    // @ApiMember(Description="The HTTP method of the order request.")
    String? requestHttpMethod;

    /**
    * The duration of the order request.
    */
    // @ApiMember(Description="The duration of the order request.")
    Duration? requestDuration;

    /**
    * The HTTP status code of the order request.
    */
    // @ApiMember(Description="The HTTP status code of the order request.")
    HttpStatusCode? responseStatusCode;

    /**
    * The IP address of client, who placed the order.
    */
    // @ApiMember(Description="The IP address of client, who placed the order.")
    String? clientIPAddress;

    /**
    * The unit of measurement for the order.
    */
    // @ApiMember(Description="The unit of measurement for the order.")
    String? unitOfMeasurement;

    /**
    * The type of process, for which the order is charged.
    */
    // @ApiMember(Description="The type of process, for which the order is charged.")
    String? processType;

    /**
    * The type of data, for which the order is charged.
    */
    // @ApiMember(Description="The type of data, for which the order is charged.")
    String? dataType;

    /**
    * The name of the data, for which the order is charged.
    */
    // @ApiMember(Description="The name of the data, for which the order is charged.")
    String? dataName;

    /**
    * The date of creation of the order.
    */
    // @ApiMember(Description="The date of creation of the order.")
    DateTime? creationDate;

    /**
    * The final date to retain the order in the records. After this date, the order is expunged from the records.
    */
    // @ApiMember(Description="The final date to retain the order in the records. After this date, the order is expunged from the records.")
    DateTime? expiryDate;

    /**
    * Indicates whether the order is simulated for test purposes. True if the order is simulated for test purposes; otherwise it is a false order for production purposes.
    */
    // @ApiMember(Description="Indicates whether the order is simulated for test purposes. True if the order is simulated for test purposes; otherwise it is a false order for production purposes.")
    bool? isTest;

    Order({this.id,this.productId,this.accountId,this.name,this.serviceName,this.requestTimestamp,this.responseTimestamp,this.requestUri,this.requestHttpMethod,this.requestDuration,this.responseStatusCode,this.clientIPAddress,this.unitOfMeasurement,this.processType,this.dataType,this.dataName,this.creationDate,this.expiryDate,this.isTest});
    Order.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        id = json['id'];
        productId = json['productId'];
        accountId = json['accountId'];
        name = json['name'];
        serviceName = json['serviceName'];
        requestTimestamp = JsonConverters.fromJson(json['requestTimestamp'],'DateTime',context!);
        responseTimestamp = JsonConverters.fromJson(json['responseTimestamp'],'DateTime',context!);
        requestUri = json['requestUri'];
        requestHttpMethod = json['requestHttpMethod'];
        requestDuration = JsonConverters.fromJson(json['requestDuration'],'Duration',context!);
        responseStatusCode = JsonConverters.fromJson(json['responseStatusCode'],'HttpStatusCode',context!);
        clientIPAddress = json['clientIPAddress'];
        unitOfMeasurement = json['unitOfMeasurement'];
        processType = json['processType'];
        dataType = json['dataType'];
        dataName = json['dataName'];
        creationDate = JsonConverters.fromJson(json['creationDate'],'DateTime',context!);
        expiryDate = JsonConverters.fromJson(json['expiryDate'],'DateTime',context!);
        isTest = json['isTest'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'id': id,
        'productId': productId,
        'accountId': accountId,
        'name': name,
        'serviceName': serviceName,
        'requestTimestamp': JsonConverters.toJson(requestTimestamp,'DateTime',context!),
        'responseTimestamp': JsonConverters.toJson(responseTimestamp,'DateTime',context!),
        'requestUri': requestUri,
        'requestHttpMethod': requestHttpMethod,
        'requestDuration': JsonConverters.toJson(requestDuration,'Duration',context!),
        'responseStatusCode': JsonConverters.toJson(responseStatusCode,'HttpStatusCode',context!),
        'clientIPAddress': clientIPAddress,
        'unitOfMeasurement': unitOfMeasurement,
        'processType': processType,
        'dataType': dataType,
        'dataName': dataName,
        'creationDate': JsonConverters.toJson(creationDate,'DateTime',context!),
        'expiryDate': JsonConverters.toJson(expiryDate,'DateTime',context!),
        'isTest': isTest
    };

    getTypeName() => "Order";
    TypeContext? context = _ctx;
}

/**
* Specifies a base service response class that contains a structured error information.
*/
// @Api(Description="Specifies a base service response class that contains a structured error information.")
abstract class ServiceResponseBase
{
    /**
    * Data structure that holds error information from a service operation.
    */
    // @ApiMember(Description="Data structure that holds error information from a service operation.")
    ResponseStatus? responseStatus;

    ServiceResponseBase({this.responseStatus});
    ServiceResponseBase.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        responseStatus = JsonConverters.fromJson(json['responseStatus'],'ResponseStatus',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'responseStatus': JsonConverters.toJson(responseStatus,'ResponseStatus',context!)
    };

    getTypeName() => "ServiceResponseBase";
    TypeContext? context = _ctx;
}

/**
*  Specifies that a data type should have a 'Name' property.
*/
abstract class IHasName
{
    /**
    * The 'Name' property.
    */
    String? name;
}

/**
* Represents a service response that encapsulates product data.
*/
// @Api(Description="Represents a service response that encapsulates product data.")
class ProductResponse extends ServiceResponseBase implements IConvertible
{
    /**
    * The product data of the response.
    */
    // @ApiMember(Description="The product data of the response.")
    Product? product;

    /**
    * The list of orders associated with the encapsulated product.
    */
    // @ApiMember(Description="The list of orders associated with the encapsulated product.")
    List<Order>? orders = [];

    ProductResponse({this.product,this.orders});
    ProductResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        super.fromMap(json);
        product = JsonConverters.fromJson(json['product'],'Product',context!);
        orders = JsonConverters.fromJson(json['orders'],'List<Order>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => super.toJson()..addAll({
        'product': JsonConverters.toJson(product,'Product',context!),
        'orders': JsonConverters.toJson(orders,'List<Order>',context!)
    });

    getTypeName() => "ProductResponse";
    TypeContext? context = _ctx;
}

/**
* Represents a service request to retrieve a product in an asynchronous operation.
*/
// @Route("/async/products/{Id}", "GET")
// @Api(Description="Represents a service request to retrieve a product in an asynchronous operation.")
class RetrieveProductAsync extends RetrieveProductBase implements IReturn<ProductResponse>, IConvertible, IGet
{
    RetrieveProductAsync();
    RetrieveProductAsync.fromJson(Map<String, dynamic> json) : super.fromJson(json);
    fromMap(Map<String, dynamic> json) {
        super.fromMap(json);
        return this;
    }

    Map<String, dynamic> toJson() => super.toJson();
    createResponse() => ProductResponse();
    getResponseTypeName() => "ProductResponse";
    getTypeName() => "RetrieveProductAsync";
    TypeContext? context = _ctx;
}

TypeContext _ctx = TypeContext(library: 'taxfiling.pwc.de', types: <String, TypeInfo> {
    'RetrieveProductBase': TypeInfo(TypeOf.AbstractClass),
    'Product': TypeInfo(TypeOf.Class, create:() => Product()),
    'HttpStatusCode': TypeInfo(TypeOf.Enum, enumValues:HttpStatusCode.values),
    'Order': TypeInfo(TypeOf.Class, create:() => Order()),
    'ServiceResponseBase': TypeInfo(TypeOf.AbstractClass),
    'IHasName': TypeInfo(TypeOf.Interface),
    'ProductResponse': TypeInfo(TypeOf.Class, create:() => ProductResponse()),
    'List<Order>': TypeInfo(TypeOf.Class, create:() => <Order>[]),
    'RetrieveProductAsync': TypeInfo(TypeOf.Class, create:() => RetrieveProductAsync()),
});