DX STF Client API

<back to all web services

GetItemDataNotificationByGtin

Item Data Notification Requests

Item Data Notification

Requires Authentication
The following routes are available for this service:
GET/api/itemDataNotification/gtin/{Gtin}Get specific ItemDataNotification by Gtin
<?php namespace dtos;

use DateTime;
use Exception;
use DateInterval;
use JsonSerializable;
use ServiceStack\{IReturn,IReturnVoid,IGet,IPost,IPut,IDelete,IPatch,IMeta,IHasSessionId,IHasBearerToken,IHasVersion};
use ServiceStack\{ICrud,ICreateDb,IUpdateDb,IPatchDb,IDeleteDb,ISaveDb,AuditBase,QueryDb,QueryDb2,QueryData,QueryData2,QueryResponse};
use ServiceStack\{ResponseStatus,ResponseError,EmptyResponse,IdResponse,ArrayList,KeyValuePair2,StringResponse,StringsResponse,Tuple2,Tuple3,ByteArray};
use ServiceStack\{JsonConverters,Returns,TypeContext};


enum DocumentAction : string
{
    case ADD = 'ADD';
    case CHANGE_BY_REFRESH = 'CHANGE_BY_REFRESH';
    case DELETE = 'DELETE';
    case REJECTED = 'REJECTED';
}

enum DocumentStatus : string
{
    case ADDITIONAL_TRANSMISSION = 'ADDITIONAL_TRANSMISSION';
    case COPY = 'COPY';
    case ORIGINAL = 'ORIGINAL';
}

class AvpList implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $code='',
        /** @var string */
        public string $value=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['code'])) $this->code = $o['code'];
        if (isset($o['value'])) $this->value = $o['value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->code)) $o['code'] = $this->code;
        if (isset($this->value)) $o['value'] = $this->value;
        return empty($o) ? new class(){} : $o;
    }
}

class BaseDocument implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $currencyCode='',
        /** @var DateTime */
        public DateTime $creationDateTime=new DateTime(),
        /** @var DocumentAction|null */
        public ?DocumentAction $documentActionCode=null,
        /** @var DocumentStatus|null */
        public ?DocumentStatus $documentStatusCode=null,
        /** @var string */
        public string $documentStructureVersion='',
        /** @var DateTime|null */
        public ?DateTime $lastUpdateDateTime=null,
        /** @var int|null */
        public ?int $revisionNumber=null,
        /** @var array<AvpList>|null */
        public ?array $avpList=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['currencyCode'])) $this->currencyCode = $o['currencyCode'];
        if (isset($o['creationDateTime'])) $this->creationDateTime = JsonConverters::from('DateTime', $o['creationDateTime']);
        if (isset($o['documentActionCode'])) $this->documentActionCode = JsonConverters::from('DocumentAction', $o['documentActionCode']);
        if (isset($o['documentStatusCode'])) $this->documentStatusCode = JsonConverters::from('DocumentStatus', $o['documentStatusCode']);
        if (isset($o['documentStructureVersion'])) $this->documentStructureVersion = $o['documentStructureVersion'];
        if (isset($o['lastUpdateDateTime'])) $this->lastUpdateDateTime = JsonConverters::from('DateTime', $o['lastUpdateDateTime']);
        if (isset($o['revisionNumber'])) $this->revisionNumber = $o['revisionNumber'];
        if (isset($o['avpList'])) $this->avpList = JsonConverters::fromArray('AvpList', $o['avpList']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->currencyCode)) $o['currencyCode'] = $this->currencyCode;
        if (isset($this->creationDateTime)) $o['creationDateTime'] = JsonConverters::to('DateTime', $this->creationDateTime);
        if (isset($this->documentActionCode)) $o['documentActionCode'] = JsonConverters::to('DocumentAction', $this->documentActionCode);
        if (isset($this->documentStatusCode)) $o['documentStatusCode'] = JsonConverters::to('DocumentStatus', $this->documentStatusCode);
        if (isset($this->documentStructureVersion)) $o['documentStructureVersion'] = $this->documentStructureVersion;
        if (isset($this->lastUpdateDateTime)) $o['lastUpdateDateTime'] = JsonConverters::to('DateTime', $this->lastUpdateDateTime);
        if (isset($this->revisionNumber)) $o['revisionNumber'] = $this->revisionNumber;
        if (isset($this->avpList)) $o['avpList'] = JsonConverters::toArray('AvpList', $this->avpList);
        return empty($o) ? new class(){} : $o;
    }
}

class Ecom_PartyIdentificationType implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $gln='',
        /** @var string */
        public string $name='',
        /** @var array<AvpList>|null */
        public ?array $additionalPartyIdentification=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['gln'])) $this->gln = $o['gln'];
        if (isset($o['name'])) $this->name = $o['name'];
        if (isset($o['additionalPartyIdentification'])) $this->additionalPartyIdentification = JsonConverters::fromArray('AvpList', $o['additionalPartyIdentification']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->gln)) $o['gln'] = $this->gln;
        if (isset($this->name)) $o['name'] = $this->name;
        if (isset($this->additionalPartyIdentification)) $o['additionalPartyIdentification'] = JsonConverters::toArray('AvpList', $this->additionalPartyIdentification);
        return empty($o) ? new class(){} : $o;
    }
}

class CommunicationChannel implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $communicationChannelCode='',
        /** @var string */
        public string $communicationChannelName='',
        /** @var string */
        public string $communicationValue=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['communicationChannelCode'])) $this->communicationChannelCode = $o['communicationChannelCode'];
        if (isset($o['communicationChannelName'])) $this->communicationChannelName = $o['communicationChannelName'];
        if (isset($o['communicationValue'])) $this->communicationValue = $o['communicationValue'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->communicationChannelCode)) $o['communicationChannelCode'] = $this->communicationChannelCode;
        if (isset($this->communicationChannelName)) $o['communicationChannelName'] = $this->communicationChannelName;
        if (isset($this->communicationValue)) $o['communicationValue'] = $this->communicationValue;
        return empty($o) ? new class(){} : $o;
    }
}

class Contact implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $contactTypeCode='',
        /** @var string */
        public string $personName='',
        /** @var string */
        public string $departmentName='',
        /** @var string */
        public string $jobTitle='',
        /** @var string */
        public string $responsibility='',
        /** @var array<CommunicationChannel>|null */
        public ?array $communicationChannel=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['contactTypeCode'])) $this->contactTypeCode = $o['contactTypeCode'];
        if (isset($o['personName'])) $this->personName = $o['personName'];
        if (isset($o['departmentName'])) $this->departmentName = $o['departmentName'];
        if (isset($o['jobTitle'])) $this->jobTitle = $o['jobTitle'];
        if (isset($o['responsibility'])) $this->responsibility = $o['responsibility'];
        if (isset($o['communicationChannel'])) $this->communicationChannel = JsonConverters::fromArray('CommunicationChannel', $o['communicationChannel']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->contactTypeCode)) $o['contactTypeCode'] = $this->contactTypeCode;
        if (isset($this->personName)) $o['personName'] = $this->personName;
        if (isset($this->departmentName)) $o['departmentName'] = $this->departmentName;
        if (isset($this->jobTitle)) $o['jobTitle'] = $this->jobTitle;
        if (isset($this->responsibility)) $o['responsibility'] = $this->responsibility;
        if (isset($this->communicationChannel)) $o['communicationChannel'] = JsonConverters::toArray('CommunicationChannel', $this->communicationChannel);
        return empty($o) ? new class(){} : $o;
    }
}

class Address implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $streetAddressOne='',
        /** @var string */
        public string $streetAddressTwo='',
        /** @var string */
        public string $streetAddressThree='',
        /** @var string */
        public string $city='',
        /** @var string */
        public string $postalCode='',
        /** @var string */
        public string $provinceCode='',
        /** @var string */
        public string $countryCode=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['streetAddressOne'])) $this->streetAddressOne = $o['streetAddressOne'];
        if (isset($o['streetAddressTwo'])) $this->streetAddressTwo = $o['streetAddressTwo'];
        if (isset($o['streetAddressThree'])) $this->streetAddressThree = $o['streetAddressThree'];
        if (isset($o['city'])) $this->city = $o['city'];
        if (isset($o['postalCode'])) $this->postalCode = $o['postalCode'];
        if (isset($o['provinceCode'])) $this->provinceCode = $o['provinceCode'];
        if (isset($o['countryCode'])) $this->countryCode = $o['countryCode'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->streetAddressOne)) $o['streetAddressOne'] = $this->streetAddressOne;
        if (isset($this->streetAddressTwo)) $o['streetAddressTwo'] = $this->streetAddressTwo;
        if (isset($this->streetAddressThree)) $o['streetAddressThree'] = $this->streetAddressThree;
        if (isset($this->city)) $o['city'] = $this->city;
        if (isset($this->postalCode)) $o['postalCode'] = $this->postalCode;
        if (isset($this->provinceCode)) $o['provinceCode'] = $this->provinceCode;
        if (isset($this->countryCode)) $o['countryCode'] = $this->countryCode;
        return empty($o) ? new class(){} : $o;
    }
}

class FinancialRoutingNumber implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $number='',
        /** @var string */
        public string $numberTypeCode=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['number'])) $this->number = $o['number'];
        if (isset($o['numberTypeCode'])) $this->numberTypeCode = $o['numberTypeCode'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->number)) $o['number'] = $this->number;
        if (isset($this->numberTypeCode)) $o['numberTypeCode'] = $this->numberTypeCode;
        return empty($o) ? new class(){} : $o;
    }
}

class FinancialAccount implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $number='',
        /** @var string */
        public string $numberTypeCode='',
        /** @var string */
        public string $name=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['number'])) $this->number = $o['number'];
        if (isset($o['numberTypeCode'])) $this->numberTypeCode = $o['numberTypeCode'];
        if (isset($o['name'])) $this->name = $o['name'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->number)) $o['number'] = $this->number;
        if (isset($this->numberTypeCode)) $o['numberTypeCode'] = $this->numberTypeCode;
        if (isset($this->name)) $o['name'] = $this->name;
        return empty($o) ? new class(){} : $o;
    }
}

class FinancialInstitutionInformation implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $financialInstitutionBranchName='',
        /** @var string */
        public string $financialInstitutionName='',
        /** @var FinancialRoutingNumber|null */
        public ?FinancialRoutingNumber $financialRoutingNumber=null,
        /** @var FinancialAccount|null */
        public ?FinancialAccount $financialAccount=null,
        /** @var string */
        public string $swiftCode='',
        /** @var string */
        public string $exportersCode=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['financialInstitutionBranchName'])) $this->financialInstitutionBranchName = $o['financialInstitutionBranchName'];
        if (isset($o['financialInstitutionName'])) $this->financialInstitutionName = $o['financialInstitutionName'];
        if (isset($o['financialRoutingNumber'])) $this->financialRoutingNumber = JsonConverters::from('FinancialRoutingNumber', $o['financialRoutingNumber']);
        if (isset($o['financialAccount'])) $this->financialAccount = JsonConverters::from('FinancialAccount', $o['financialAccount']);
        if (isset($o['swiftCode'])) $this->swiftCode = $o['swiftCode'];
        if (isset($o['exportersCode'])) $this->exportersCode = $o['exportersCode'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->financialInstitutionBranchName)) $o['financialInstitutionBranchName'] = $this->financialInstitutionBranchName;
        if (isset($this->financialInstitutionName)) $o['financialInstitutionName'] = $this->financialInstitutionName;
        if (isset($this->financialRoutingNumber)) $o['financialRoutingNumber'] = JsonConverters::to('FinancialRoutingNumber', $this->financialRoutingNumber);
        if (isset($this->financialAccount)) $o['financialAccount'] = JsonConverters::to('FinancialAccount', $this->financialAccount);
        if (isset($this->swiftCode)) $o['swiftCode'] = $this->swiftCode;
        if (isset($this->exportersCode)) $o['exportersCode'] = $this->exportersCode;
        return empty($o) ? new class(){} : $o;
    }
}

class TransactionalParty extends Ecom_PartyIdentificationType implements JsonSerializable
{
    /**
     * @param string $gln
     * @param string $name
     * @param array<AvpList>|null $additionalPartyIdentification
     */
    public function __construct(
        string $gln='',
        string $name='',
        ?array $additionalPartyIdentification=null,
        /** @var array<Contact>|null */
        public ?array $contact=null,
        /** @var Address|null */
        public ?Address $address=null,
        /** @var array<AvpList>|null */
        public ?array $communicationChannel=null,
        /** @var FinancialInstitutionInformation|null */
        public ?FinancialInstitutionInformation $financialInstitutionInformation=null,
        /** @var string */
        public string $dutyFeeTaxRegistration='',
        /** @var string */
        public string $entityIdentification=''
    ) {
        parent::__construct($gln,$name,$additionalPartyIdentification);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['contact'])) $this->contact = JsonConverters::fromArray('Contact', $o['contact']);
        if (isset($o['address'])) $this->address = JsonConverters::from('Address', $o['address']);
        if (isset($o['communicationChannel'])) $this->communicationChannel = JsonConverters::fromArray('AvpList', $o['communicationChannel']);
        if (isset($o['financialInstitutionInformation'])) $this->financialInstitutionInformation = JsonConverters::from('FinancialInstitutionInformation', $o['financialInstitutionInformation']);
        if (isset($o['dutyFeeTaxRegistration'])) $this->dutyFeeTaxRegistration = $o['dutyFeeTaxRegistration'];
        if (isset($o['entityIdentification'])) $this->entityIdentification = $o['entityIdentification'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->contact)) $o['contact'] = JsonConverters::toArray('Contact', $this->contact);
        if (isset($this->address)) $o['address'] = JsonConverters::to('Address', $this->address);
        if (isset($this->communicationChannel)) $o['communicationChannel'] = JsonConverters::toArray('AvpList', $this->communicationChannel);
        if (isset($this->financialInstitutionInformation)) $o['financialInstitutionInformation'] = JsonConverters::to('FinancialInstitutionInformation', $this->financialInstitutionInformation);
        if (isset($this->dutyFeeTaxRegistration)) $o['dutyFeeTaxRegistration'] = $this->dutyFeeTaxRegistration;
        if (isset($this->entityIdentification)) $o['entityIdentification'] = $this->entityIdentification;
        return empty($o) ? new class(){} : $o;
    }
}

class AdditionalTradeItemIdentification implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $value='',
        /** @var string */
        public string $code=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['value'])) $this->value = $o['value'];
        if (isset($o['code'])) $this->code = $o['code'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->value)) $o['value'] = $this->value;
        if (isset($this->code)) $o['code'] = $this->code;
        return empty($o) ? new class(){} : $o;
    }
}

class Ecom_TradeItemIdentification implements JsonSerializable
{
    public function __construct(
        /** @var array<AdditionalTradeItemIdentification>|null */
        public ?array $additionalTradeItemIdentification=null,
        /** @var string */
        public string $gtin=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['additionalTradeItemIdentification'])) $this->additionalTradeItemIdentification = JsonConverters::fromArray('AdditionalTradeItemIdentification', $o['additionalTradeItemIdentification']);
        if (isset($o['gtin'])) $this->gtin = $o['gtin'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->additionalTradeItemIdentification)) $o['additionalTradeItemIdentification'] = JsonConverters::toArray('AdditionalTradeItemIdentification', $this->additionalTradeItemIdentification);
        if (isset($this->gtin)) $o['gtin'] = $this->gtin;
        return empty($o) ? new class(){} : $o;
    }
}

class IdentifierType implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $value='',
        /** @var string */
        public string $identificationSchemeAgencyCodeCodeListVersion='',
        /** @var string */
        public string $identificationSchemeAgencyName='',
        /** @var string */
        public string $identificationSchemeName=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['value'])) $this->value = $o['value'];
        if (isset($o['identificationSchemeAgencyCodeCodeListVersion'])) $this->identificationSchemeAgencyCodeCodeListVersion = $o['identificationSchemeAgencyCodeCodeListVersion'];
        if (isset($o['identificationSchemeAgencyName'])) $this->identificationSchemeAgencyName = $o['identificationSchemeAgencyName'];
        if (isset($o['identificationSchemeName'])) $this->identificationSchemeName = $o['identificationSchemeName'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->value)) $o['value'] = $this->value;
        if (isset($this->identificationSchemeAgencyCodeCodeListVersion)) $o['identificationSchemeAgencyCodeCodeListVersion'] = $this->identificationSchemeAgencyCodeCodeListVersion;
        if (isset($this->identificationSchemeAgencyName)) $o['identificationSchemeAgencyName'] = $this->identificationSchemeAgencyName;
        if (isset($this->identificationSchemeName)) $o['identificationSchemeName'] = $this->identificationSchemeName;
        return empty($o) ? new class(){} : $o;
    }
}

class AdditionalTradeItemClassificationCode implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $value='',
        /** @var string */
        public string $additionalTradeItemClassificationCodeListCode='',
        /** @var string */
        public string $additionalTradeItemClassificationCodeListVersion='',
        /** @var string */
        public string $codeDescription=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['value'])) $this->value = $o['value'];
        if (isset($o['additionalTradeItemClassificationCodeListCode'])) $this->additionalTradeItemClassificationCodeListCode = $o['additionalTradeItemClassificationCodeListCode'];
        if (isset($o['additionalTradeItemClassificationCodeListVersion'])) $this->additionalTradeItemClassificationCodeListVersion = $o['additionalTradeItemClassificationCodeListVersion'];
        if (isset($o['codeDescription'])) $this->codeDescription = $o['codeDescription'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->value)) $o['value'] = $this->value;
        if (isset($this->additionalTradeItemClassificationCodeListCode)) $o['additionalTradeItemClassificationCodeListCode'] = $this->additionalTradeItemClassificationCodeListCode;
        if (isset($this->additionalTradeItemClassificationCodeListVersion)) $o['additionalTradeItemClassificationCodeListVersion'] = $this->additionalTradeItemClassificationCodeListVersion;
        if (isset($this->codeDescription)) $o['codeDescription'] = $this->codeDescription;
        return empty($o) ? new class(){} : $o;
    }
}

class Measurement implements JsonSerializable
{
    public function __construct(
        /** @var float|null */
        public ?float $value=null,
        /** @var string */
        public string $codeListVersion='',
        /** @var string */
        public string $measurementUnitCode=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['value'])) $this->value = $o['value'];
        if (isset($o['codeListVersion'])) $this->codeListVersion = $o['codeListVersion'];
        if (isset($o['measurementUnitCode'])) $this->measurementUnitCode = $o['measurementUnitCode'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->value)) $o['value'] = $this->value;
        if (isset($this->codeListVersion)) $o['codeListVersion'] = $this->codeListVersion;
        if (isset($this->measurementUnitCode)) $o['measurementUnitCode'] = $this->measurementUnitCode;
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataWeightAndDimension implements JsonSerializable
{
    public function __construct(
        /** @var Measurement|null */
        public ?Measurement $depth=null,
        /** @var Measurement|null */
        public ?Measurement $diameter=null,
        /** @var Measurement|null */
        public ?Measurement $grossWeight=null,
        /** @var Measurement|null */
        public ?Measurement $height=null,
        /** @var Measurement|null */
        public ?Measurement $netWeight=null,
        /** @var Measurement|null */
        public ?Measurement $width=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['depth'])) $this->depth = JsonConverters::from('Measurement', $o['depth']);
        if (isset($o['diameter'])) $this->diameter = JsonConverters::from('Measurement', $o['diameter']);
        if (isset($o['grossWeight'])) $this->grossWeight = JsonConverters::from('Measurement', $o['grossWeight']);
        if (isset($o['height'])) $this->height = JsonConverters::from('Measurement', $o['height']);
        if (isset($o['netWeight'])) $this->netWeight = JsonConverters::from('Measurement', $o['netWeight']);
        if (isset($o['width'])) $this->width = JsonConverters::from('Measurement', $o['width']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->depth)) $o['depth'] = JsonConverters::to('Measurement', $this->depth);
        if (isset($this->diameter)) $o['diameter'] = JsonConverters::to('Measurement', $this->diameter);
        if (isset($this->grossWeight)) $o['grossWeight'] = JsonConverters::to('Measurement', $this->grossWeight);
        if (isset($this->height)) $o['height'] = JsonConverters::to('Measurement', $this->height);
        if (isset($this->netWeight)) $o['netWeight'] = JsonConverters::to('Measurement', $this->netWeight);
        if (isset($this->width)) $o['width'] = JsonConverters::to('Measurement', $this->width);
        return empty($o) ? new class(){} : $o;
    }
}

class TemperatureMeasurement implements JsonSerializable
{
    public function __construct(
        /** @var float|null */
        public ?float $value=null,
        /** @var string */
        public string $temperatureMeasurementUnitCode=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['value'])) $this->value = $o['value'];
        if (isset($o['temperatureMeasurementUnitCode'])) $this->temperatureMeasurementUnitCode = $o['temperatureMeasurementUnitCode'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->value)) $o['value'] = $this->value;
        if (isset($this->temperatureMeasurementUnitCode)) $o['temperatureMeasurementUnitCode'] = $this->temperatureMeasurementUnitCode;
        return empty($o) ? new class(){} : $o;
    }
}

class TemperatureRange implements JsonSerializable
{
    public function __construct(
        /** @var TemperatureMeasurement|null */
        public ?TemperatureMeasurement $maximumTemperature=null,
        /** @var TemperatureMeasurement|null */
        public ?TemperatureMeasurement $minimumTemperature=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['maximumTemperature'])) $this->maximumTemperature = JsonConverters::from('TemperatureMeasurement', $o['maximumTemperature']);
        if (isset($o['minimumTemperature'])) $this->minimumTemperature = JsonConverters::from('TemperatureMeasurement', $o['minimumTemperature']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->maximumTemperature)) $o['maximumTemperature'] = JsonConverters::to('TemperatureMeasurement', $this->maximumTemperature);
        if (isset($this->minimumTemperature)) $o['minimumTemperature'] = JsonConverters::to('TemperatureMeasurement', $this->minimumTemperature);
        return empty($o) ? new class(){} : $o;
    }
}

class HandlingInstruction implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $handlingInstructionCode='',
        /** @var string */
        public string $handlingInstructionText='',
        /** @var array<string>|null */
        public ?array $printingInstructionCode=null,
        /** @var TemperatureRange|null */
        public ?TemperatureRange $storageTemperature=null,
        /** @var TemperatureRange|null */
        public ?TemperatureRange $transportTemperature=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['handlingInstructionCode'])) $this->handlingInstructionCode = $o['handlingInstructionCode'];
        if (isset($o['handlingInstructionText'])) $this->handlingInstructionText = $o['handlingInstructionText'];
        if (isset($o['printingInstructionCode'])) $this->printingInstructionCode = JsonConverters::fromArray('string', $o['printingInstructionCode']);
        if (isset($o['storageTemperature'])) $this->storageTemperature = JsonConverters::from('TemperatureRange', $o['storageTemperature']);
        if (isset($o['transportTemperature'])) $this->transportTemperature = JsonConverters::from('TemperatureRange', $o['transportTemperature']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->handlingInstructionCode)) $o['handlingInstructionCode'] = $this->handlingInstructionCode;
        if (isset($this->handlingInstructionText)) $o['handlingInstructionText'] = $this->handlingInstructionText;
        if (isset($this->printingInstructionCode)) $o['printingInstructionCode'] = JsonConverters::toArray('string', $this->printingInstructionCode);
        if (isset($this->storageTemperature)) $o['storageTemperature'] = JsonConverters::to('TemperatureRange', $this->storageTemperature);
        if (isset($this->transportTemperature)) $o['transportTemperature'] = JsonConverters::to('TemperatureRange', $this->transportTemperature);
        return empty($o) ? new class(){} : $o;
    }
}

// @DataContract
class Identifier implements JsonSerializable
{
    public function __construct(
        // @DataMember(Name="authority")
        /** @var string */
        public string $authority='',

        // @DataMember(Name="text")
        /** @var string */
        public string $text=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['authority'])) $this->authority = $o['authority'];
        if (isset($o['text'])) $this->text = $o['text'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->authority)) $o['authority'] = $this->authority;
        if (isset($this->text)) $o['text'] = $this->text;
        return empty($o) ? new class(){} : $o;
    }
}

class DangerousGoodsInformation implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $dangerousGoodsDescription='',
        /** @var string */
        public string $dangerousGoodsShippingName='',
        /** @var string */
        public string $dangerousGoodsTechnicalName='',
        /** @var Identifier|null */
        public ?Identifier $dangerousGoodsUNIdentifier=null,
        /** @var array<Contact>|null */
        public ?array $contact=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['dangerousGoodsDescription'])) $this->dangerousGoodsDescription = $o['dangerousGoodsDescription'];
        if (isset($o['dangerousGoodsShippingName'])) $this->dangerousGoodsShippingName = $o['dangerousGoodsShippingName'];
        if (isset($o['dangerousGoodsTechnicalName'])) $this->dangerousGoodsTechnicalName = $o['dangerousGoodsTechnicalName'];
        if (isset($o['dangerousGoodsUNIdentifier'])) $this->dangerousGoodsUNIdentifier = JsonConverters::from('Identifier', $o['dangerousGoodsUNIdentifier']);
        if (isset($o['contact'])) $this->contact = JsonConverters::fromArray('Contact', $o['contact']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->dangerousGoodsDescription)) $o['dangerousGoodsDescription'] = $this->dangerousGoodsDescription;
        if (isset($this->dangerousGoodsShippingName)) $o['dangerousGoodsShippingName'] = $this->dangerousGoodsShippingName;
        if (isset($this->dangerousGoodsTechnicalName)) $o['dangerousGoodsTechnicalName'] = $this->dangerousGoodsTechnicalName;
        if (isset($this->dangerousGoodsUNIdentifier)) $o['dangerousGoodsUNIdentifier'] = JsonConverters::to('Identifier', $this->dangerousGoodsUNIdentifier);
        if (isset($this->contact)) $o['contact'] = JsonConverters::toArray('Contact', $this->contact);
        return empty($o) ? new class(){} : $o;
    }
}

class AdministrativeUnit implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $typeCode='',
        /** @var string */
        public string $gln='',
        /** @var string */
        public string $internalIdentification=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['typeCode'])) $this->typeCode = $o['typeCode'];
        if (isset($o['gln'])) $this->gln = $o['gln'];
        if (isset($o['internalIdentification'])) $this->internalIdentification = $o['internalIdentification'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->typeCode)) $o['typeCode'] = $this->typeCode;
        if (isset($this->gln)) $o['gln'] = $this->gln;
        if (isset($this->internalIdentification)) $o['internalIdentification'] = $this->internalIdentification;
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataTradingPartnerNeutral implements JsonSerializable
{
    public function __construct(
        /** @var DateTime|null */
        public ?DateTime $cancelledDateTime=null,
        /** @var DateTime|null */
        public ?DateTime $discontinuedDateTime=null,
        /** @var DateTime */
        public DateTime $effectiveDateTime=new DateTime(),
        /** @var DateTime|null */
        public ?DateTime $endAvailabilityDateTime=null,
        /** @var int|null */
        public ?int $maximumStackingFactor=null,
        /** @var DateTime */
        public DateTime $startAvailabilityDateTime=new DateTime(),
        /** @var string */
        public string $tradeItemBaseUnitOfMeasure='',
        /** @var array<AdditionalTradeItemClassificationCode>|null */
        public ?array $tradeItemClassificationCode=null,
        /** @var string */
        public string $warehouseABCClassificationCode='',
        /** @var ItemDataWeightAndDimension|null */
        public ?ItemDataWeightAndDimension $itemDataWeightAndDimension=null,
        /** @var array<HandlingInstruction>|null */
        public ?array $handlingInstruction=null,
        /** @var array<DangerousGoodsInformation>|null */
        public ?array $dangerousGoodsInformation=null,
        /** @var AdministrativeUnit|null */
        public ?AdministrativeUnit $administrativeUnitOfLogisticServiceBuyer=null,
        /** @var array<AvpList>|null */
        public ?array $avpList=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['cancelledDateTime'])) $this->cancelledDateTime = JsonConverters::from('DateTime', $o['cancelledDateTime']);
        if (isset($o['discontinuedDateTime'])) $this->discontinuedDateTime = JsonConverters::from('DateTime', $o['discontinuedDateTime']);
        if (isset($o['effectiveDateTime'])) $this->effectiveDateTime = JsonConverters::from('DateTime', $o['effectiveDateTime']);
        if (isset($o['endAvailabilityDateTime'])) $this->endAvailabilityDateTime = JsonConverters::from('DateTime', $o['endAvailabilityDateTime']);
        if (isset($o['maximumStackingFactor'])) $this->maximumStackingFactor = $o['maximumStackingFactor'];
        if (isset($o['startAvailabilityDateTime'])) $this->startAvailabilityDateTime = JsonConverters::from('DateTime', $o['startAvailabilityDateTime']);
        if (isset($o['tradeItemBaseUnitOfMeasure'])) $this->tradeItemBaseUnitOfMeasure = $o['tradeItemBaseUnitOfMeasure'];
        if (isset($o['tradeItemClassificationCode'])) $this->tradeItemClassificationCode = JsonConverters::fromArray('AdditionalTradeItemClassificationCode', $o['tradeItemClassificationCode']);
        if (isset($o['warehouseABCClassificationCode'])) $this->warehouseABCClassificationCode = $o['warehouseABCClassificationCode'];
        if (isset($o['itemDataWeightAndDimension'])) $this->itemDataWeightAndDimension = JsonConverters::from('ItemDataWeightAndDimension', $o['itemDataWeightAndDimension']);
        if (isset($o['handlingInstruction'])) $this->handlingInstruction = JsonConverters::fromArray('HandlingInstruction', $o['handlingInstruction']);
        if (isset($o['dangerousGoodsInformation'])) $this->dangerousGoodsInformation = JsonConverters::fromArray('DangerousGoodsInformation', $o['dangerousGoodsInformation']);
        if (isset($o['administrativeUnitOfLogisticServiceBuyer'])) $this->administrativeUnitOfLogisticServiceBuyer = JsonConverters::from('AdministrativeUnit', $o['administrativeUnitOfLogisticServiceBuyer']);
        if (isset($o['avpList'])) $this->avpList = JsonConverters::fromArray('AvpList', $o['avpList']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->cancelledDateTime)) $o['cancelledDateTime'] = JsonConverters::to('DateTime', $this->cancelledDateTime);
        if (isset($this->discontinuedDateTime)) $o['discontinuedDateTime'] = JsonConverters::to('DateTime', $this->discontinuedDateTime);
        if (isset($this->effectiveDateTime)) $o['effectiveDateTime'] = JsonConverters::to('DateTime', $this->effectiveDateTime);
        if (isset($this->endAvailabilityDateTime)) $o['endAvailabilityDateTime'] = JsonConverters::to('DateTime', $this->endAvailabilityDateTime);
        if (isset($this->maximumStackingFactor)) $o['maximumStackingFactor'] = $this->maximumStackingFactor;
        if (isset($this->startAvailabilityDateTime)) $o['startAvailabilityDateTime'] = JsonConverters::to('DateTime', $this->startAvailabilityDateTime);
        if (isset($this->tradeItemBaseUnitOfMeasure)) $o['tradeItemBaseUnitOfMeasure'] = $this->tradeItemBaseUnitOfMeasure;
        if (isset($this->tradeItemClassificationCode)) $o['tradeItemClassificationCode'] = JsonConverters::toArray('AdditionalTradeItemClassificationCode', $this->tradeItemClassificationCode);
        if (isset($this->warehouseABCClassificationCode)) $o['warehouseABCClassificationCode'] = $this->warehouseABCClassificationCode;
        if (isset($this->itemDataWeightAndDimension)) $o['itemDataWeightAndDimension'] = JsonConverters::to('ItemDataWeightAndDimension', $this->itemDataWeightAndDimension);
        if (isset($this->handlingInstruction)) $o['handlingInstruction'] = JsonConverters::toArray('HandlingInstruction', $this->handlingInstruction);
        if (isset($this->dangerousGoodsInformation)) $o['dangerousGoodsInformation'] = JsonConverters::toArray('DangerousGoodsInformation', $this->dangerousGoodsInformation);
        if (isset($this->administrativeUnitOfLogisticServiceBuyer)) $o['administrativeUnitOfLogisticServiceBuyer'] = JsonConverters::to('AdministrativeUnit', $this->administrativeUnitOfLogisticServiceBuyer);
        if (isset($this->avpList)) $o['avpList'] = JsonConverters::toArray('AvpList', $this->avpList);
        return empty($o) ? new class(){} : $o;
    }
}

class TimeMeasurement implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $timeMeasurementUnitCode='',
        /** @var float|null */
        public ?float $value=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['timeMeasurementUnitCode'])) $this->timeMeasurementUnitCode = $o['timeMeasurementUnitCode'];
        if (isset($o['value'])) $this->value = $o['value'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->timeMeasurementUnitCode)) $o['timeMeasurementUnitCode'] = $this->timeMeasurementUnitCode;
        if (isset($this->value)) $o['value'] = $this->value;
        return empty($o) ? new class(){} : $o;
    }
}

class Quantity implements JsonSerializable
{
    public function __construct(
        /** @var float|null */
        public ?float $value=null,
        /** @var string */
        public string $measurementUnitCode='',
        /** @var string */
        public string $codeListVersion=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['value'])) $this->value = $o['value'];
        if (isset($o['measurementUnitCode'])) $this->measurementUnitCode = $o['measurementUnitCode'];
        if (isset($o['codeListVersion'])) $this->codeListVersion = $o['codeListVersion'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->value)) $o['value'] = $this->value;
        if (isset($this->measurementUnitCode)) $o['measurementUnitCode'] = $this->measurementUnitCode;
        if (isset($this->codeListVersion)) $o['codeListVersion'] = $this->codeListVersion;
        return empty($o) ? new class(){} : $o;
    }
}

class Dimension implements JsonSerializable
{
    public function __construct(
        /** @var Measurement|null */
        public ?Measurement $depth=null,
        /** @var Measurement|null */
        public ?Measurement $height=null,
        /** @var Measurement|null */
        public ?Measurement $width=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['depth'])) $this->depth = JsonConverters::from('Measurement', $o['depth']);
        if (isset($o['height'])) $this->height = JsonConverters::from('Measurement', $o['height']);
        if (isset($o['width'])) $this->width = JsonConverters::from('Measurement', $o['width']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->depth)) $o['depth'] = JsonConverters::to('Measurement', $this->depth);
        if (isset($this->height)) $o['height'] = JsonConverters::to('Measurement', $this->height);
        if (isset($this->width)) $o['width'] = JsonConverters::to('Measurement', $this->width);
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataLogisticUnitInformation implements JsonSerializable
{
    public function __construct(
        /** @var Measurement|null */
        public ?Measurement $grossWeight=null,
        /** @var int|null */
        public ?int $maximumStackingFactor=null,
        /** @var Measurement|null */
        public ?Measurement $netWeight=null,
        /** @var int|null */
        public ?int $numberOfLayers=null,
        /** @var string */
        public string $packageLevelCode='',
        /** @var string */
        public string $packageTypeCode='',
        /** @var Quantity|null */
        public ?Quantity $tradeItemQuantity=null,
        /** @var Quantity|null */
        public ?Quantity $tradeItemQuantityPerLayer=null,
        /** @var AvpList|null */
        public ?AvpList $avpList=null,
        /** @var array<Dimension>|null */
        public ?array $dimensionsOfLogisticUnit=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['grossWeight'])) $this->grossWeight = JsonConverters::from('Measurement', $o['grossWeight']);
        if (isset($o['maximumStackingFactor'])) $this->maximumStackingFactor = $o['maximumStackingFactor'];
        if (isset($o['netWeight'])) $this->netWeight = JsonConverters::from('Measurement', $o['netWeight']);
        if (isset($o['numberOfLayers'])) $this->numberOfLayers = $o['numberOfLayers'];
        if (isset($o['packageLevelCode'])) $this->packageLevelCode = $o['packageLevelCode'];
        if (isset($o['packageTypeCode'])) $this->packageTypeCode = $o['packageTypeCode'];
        if (isset($o['tradeItemQuantity'])) $this->tradeItemQuantity = JsonConverters::from('Quantity', $o['tradeItemQuantity']);
        if (isset($o['tradeItemQuantityPerLayer'])) $this->tradeItemQuantityPerLayer = JsonConverters::from('Quantity', $o['tradeItemQuantityPerLayer']);
        if (isset($o['avpList'])) $this->avpList = JsonConverters::from('AvpList', $o['avpList']);
        if (isset($o['dimensionsOfLogisticUnit'])) $this->dimensionsOfLogisticUnit = JsonConverters::fromArray('Dimension', $o['dimensionsOfLogisticUnit']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->grossWeight)) $o['grossWeight'] = JsonConverters::to('Measurement', $this->grossWeight);
        if (isset($this->maximumStackingFactor)) $o['maximumStackingFactor'] = $this->maximumStackingFactor;
        if (isset($this->netWeight)) $o['netWeight'] = JsonConverters::to('Measurement', $this->netWeight);
        if (isset($this->numberOfLayers)) $o['numberOfLayers'] = $this->numberOfLayers;
        if (isset($this->packageLevelCode)) $o['packageLevelCode'] = $this->packageLevelCode;
        if (isset($this->packageTypeCode)) $o['packageTypeCode'] = $this->packageTypeCode;
        if (isset($this->tradeItemQuantity)) $o['tradeItemQuantity'] = JsonConverters::to('Quantity', $this->tradeItemQuantity);
        if (isset($this->tradeItemQuantityPerLayer)) $o['tradeItemQuantityPerLayer'] = JsonConverters::to('Quantity', $this->tradeItemQuantityPerLayer);
        if (isset($this->avpList)) $o['avpList'] = JsonConverters::to('AvpList', $this->avpList);
        if (isset($this->dimensionsOfLogisticUnit)) $o['dimensionsOfLogisticUnit'] = JsonConverters::toArray('Dimension', $this->dimensionsOfLogisticUnit);
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataStockRequirements implements JsonSerializable
{
    public function __construct(
        /** @var Quantity|null */
        public ?Quantity $requiredStockLevel=null,
        /** @var DateTime|null */
        public ?DateTime $requiredStockLevelValidityDateTime=null,
        /** @var string */
        public string $stockRequirementTypeCode=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['requiredStockLevel'])) $this->requiredStockLevel = JsonConverters::from('Quantity', $o['requiredStockLevel']);
        if (isset($o['requiredStockLevelValidityDateTime'])) $this->requiredStockLevelValidityDateTime = JsonConverters::from('DateTime', $o['requiredStockLevelValidityDateTime']);
        if (isset($o['stockRequirementTypeCode'])) $this->stockRequirementTypeCode = $o['stockRequirementTypeCode'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->requiredStockLevel)) $o['requiredStockLevel'] = JsonConverters::to('Quantity', $this->requiredStockLevel);
        if (isset($this->requiredStockLevelValidityDateTime)) $o['requiredStockLevelValidityDateTime'] = JsonConverters::to('DateTime', $this->requiredStockLevelValidityDateTime);
        if (isset($this->stockRequirementTypeCode)) $o['stockRequirementTypeCode'] = $this->stockRequirementTypeCode;
        return empty($o) ? new class(){} : $o;
    }
}

class TransactionalPartyInRole implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $partyRoleCode='',
        /** @var TransactionalParty|null */
        public ?TransactionalParty $transactionalParty=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['partyRoleCode'])) $this->partyRoleCode = $o['partyRoleCode'];
        if (isset($o['transactionalParty'])) $this->transactionalParty = JsonConverters::from('TransactionalParty', $o['transactionalParty']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->partyRoleCode)) $o['partyRoleCode'] = $this->partyRoleCode;
        if (isset($this->transactionalParty)) $o['transactionalParty'] = JsonConverters::to('TransactionalParty', $this->transactionalParty);
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataTradingPartnerDependent implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $countryOfOrigin='',
        /** @var TimeMeasurement|null */
        public ?TimeMeasurement $minimumRemainingShelfLifeInbound=null,
        /** @var TimeMeasurement|null */
        public ?TimeMeasurement $minimumRemainingShelfLifeOutbound=null,
        /** @var Quantity|null */
        public ?Quantity $orderQuantityMaximum=null,
        /** @var Quantity|null */
        public ?Quantity $orderQuantityMinimum=null,
        /** @var Quantity|null */
        public ?Quantity $orderQuantityMultiple=null,
        /** @var string */
        public string $qualityControlCode='',
        /** @var TimeMeasurement|null */
        public ?TimeMeasurement $quarantinePeriod=null,
        /** @var TimeMeasurement|null */
        public ?TimeMeasurement $tradeItemProductionLeadTime=null,
        /** @var TimeMeasurement|null */
        public ?TimeMeasurement $tradeItemShipmentLeadTime=null,
        /** @var string */
        public string $tradeItemSpecificUnitOfMeasure='',
        /** @var DateTime|null */
        public ?DateTime $tradeItemSubstitutionDateTime=null,
        /** @var array<ItemDataLogisticUnitInformation>|null */
        public ?array $itemDataLogisticUnitInformation=null,
        /** @var array<ItemDataStockRequirements>|null */
        public ?array $itemDataStockRequirements=null,
        /** @var array<AdministrativeUnit>|null */
        public ?array $administrativeUnitOfReceiver=null,
        /** @var AvpList|null */
        public ?AvpList $avpList=null,
        /** @var array<TransactionalPartyInRole>|null */
        public ?array $originatingParty=null,
        /** @var TransactionalParty|null */
        public ?TransactionalParty $receiver=null,
        /** @var TransactionalParty|null */
        public ?TransactionalParty $shipper=null,
        /** @var Ecom_TradeItemIdentification|null */
        public ?Ecom_TradeItemIdentification $substituteItem=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['countryOfOrigin'])) $this->countryOfOrigin = $o['countryOfOrigin'];
        if (isset($o['minimumRemainingShelfLifeInbound'])) $this->minimumRemainingShelfLifeInbound = JsonConverters::from('TimeMeasurement', $o['minimumRemainingShelfLifeInbound']);
        if (isset($o['minimumRemainingShelfLifeOutbound'])) $this->minimumRemainingShelfLifeOutbound = JsonConverters::from('TimeMeasurement', $o['minimumRemainingShelfLifeOutbound']);
        if (isset($o['orderQuantityMaximum'])) $this->orderQuantityMaximum = JsonConverters::from('Quantity', $o['orderQuantityMaximum']);
        if (isset($o['orderQuantityMinimum'])) $this->orderQuantityMinimum = JsonConverters::from('Quantity', $o['orderQuantityMinimum']);
        if (isset($o['orderQuantityMultiple'])) $this->orderQuantityMultiple = JsonConverters::from('Quantity', $o['orderQuantityMultiple']);
        if (isset($o['qualityControlCode'])) $this->qualityControlCode = $o['qualityControlCode'];
        if (isset($o['quarantinePeriod'])) $this->quarantinePeriod = JsonConverters::from('TimeMeasurement', $o['quarantinePeriod']);
        if (isset($o['tradeItemProductionLeadTime'])) $this->tradeItemProductionLeadTime = JsonConverters::from('TimeMeasurement', $o['tradeItemProductionLeadTime']);
        if (isset($o['tradeItemShipmentLeadTime'])) $this->tradeItemShipmentLeadTime = JsonConverters::from('TimeMeasurement', $o['tradeItemShipmentLeadTime']);
        if (isset($o['tradeItemSpecificUnitOfMeasure'])) $this->tradeItemSpecificUnitOfMeasure = $o['tradeItemSpecificUnitOfMeasure'];
        if (isset($o['tradeItemSubstitutionDateTime'])) $this->tradeItemSubstitutionDateTime = JsonConverters::from('DateTime', $o['tradeItemSubstitutionDateTime']);
        if (isset($o['itemDataLogisticUnitInformation'])) $this->itemDataLogisticUnitInformation = JsonConverters::fromArray('ItemDataLogisticUnitInformation', $o['itemDataLogisticUnitInformation']);
        if (isset($o['itemDataStockRequirements'])) $this->itemDataStockRequirements = JsonConverters::fromArray('ItemDataStockRequirements', $o['itemDataStockRequirements']);
        if (isset($o['administrativeUnitOfReceiver'])) $this->administrativeUnitOfReceiver = JsonConverters::fromArray('AdministrativeUnit', $o['administrativeUnitOfReceiver']);
        if (isset($o['avpList'])) $this->avpList = JsonConverters::from('AvpList', $o['avpList']);
        if (isset($o['originatingParty'])) $this->originatingParty = JsonConverters::fromArray('TransactionalPartyInRole', $o['originatingParty']);
        if (isset($o['receiver'])) $this->receiver = JsonConverters::from('TransactionalParty', $o['receiver']);
        if (isset($o['shipper'])) $this->shipper = JsonConverters::from('TransactionalParty', $o['shipper']);
        if (isset($o['substituteItem'])) $this->substituteItem = JsonConverters::from('Ecom_TradeItemIdentification', $o['substituteItem']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->countryOfOrigin)) $o['countryOfOrigin'] = $this->countryOfOrigin;
        if (isset($this->minimumRemainingShelfLifeInbound)) $o['minimumRemainingShelfLifeInbound'] = JsonConverters::to('TimeMeasurement', $this->minimumRemainingShelfLifeInbound);
        if (isset($this->minimumRemainingShelfLifeOutbound)) $o['minimumRemainingShelfLifeOutbound'] = JsonConverters::to('TimeMeasurement', $this->minimumRemainingShelfLifeOutbound);
        if (isset($this->orderQuantityMaximum)) $o['orderQuantityMaximum'] = JsonConverters::to('Quantity', $this->orderQuantityMaximum);
        if (isset($this->orderQuantityMinimum)) $o['orderQuantityMinimum'] = JsonConverters::to('Quantity', $this->orderQuantityMinimum);
        if (isset($this->orderQuantityMultiple)) $o['orderQuantityMultiple'] = JsonConverters::to('Quantity', $this->orderQuantityMultiple);
        if (isset($this->qualityControlCode)) $o['qualityControlCode'] = $this->qualityControlCode;
        if (isset($this->quarantinePeriod)) $o['quarantinePeriod'] = JsonConverters::to('TimeMeasurement', $this->quarantinePeriod);
        if (isset($this->tradeItemProductionLeadTime)) $o['tradeItemProductionLeadTime'] = JsonConverters::to('TimeMeasurement', $this->tradeItemProductionLeadTime);
        if (isset($this->tradeItemShipmentLeadTime)) $o['tradeItemShipmentLeadTime'] = JsonConverters::to('TimeMeasurement', $this->tradeItemShipmentLeadTime);
        if (isset($this->tradeItemSpecificUnitOfMeasure)) $o['tradeItemSpecificUnitOfMeasure'] = $this->tradeItemSpecificUnitOfMeasure;
        if (isset($this->tradeItemSubstitutionDateTime)) $o['tradeItemSubstitutionDateTime'] = JsonConverters::to('DateTime', $this->tradeItemSubstitutionDateTime);
        if (isset($this->itemDataLogisticUnitInformation)) $o['itemDataLogisticUnitInformation'] = JsonConverters::toArray('ItemDataLogisticUnitInformation', $this->itemDataLogisticUnitInformation);
        if (isset($this->itemDataStockRequirements)) $o['itemDataStockRequirements'] = JsonConverters::toArray('ItemDataStockRequirements', $this->itemDataStockRequirements);
        if (isset($this->administrativeUnitOfReceiver)) $o['administrativeUnitOfReceiver'] = JsonConverters::toArray('AdministrativeUnit', $this->administrativeUnitOfReceiver);
        if (isset($this->avpList)) $o['avpList'] = JsonConverters::to('AvpList', $this->avpList);
        if (isset($this->originatingParty)) $o['originatingParty'] = JsonConverters::toArray('TransactionalPartyInRole', $this->originatingParty);
        if (isset($this->receiver)) $o['receiver'] = JsonConverters::to('TransactionalParty', $this->receiver);
        if (isset($this->shipper)) $o['shipper'] = JsonConverters::to('TransactionalParty', $this->shipper);
        if (isset($this->substituteItem)) $o['substituteItem'] = JsonConverters::to('Ecom_TradeItemIdentification', $this->substituteItem);
        return empty($o) ? new class(){} : $o;
    }
}

class LowerLevelTradeItem extends Ecom_TradeItemIdentification implements JsonSerializable
{
    /**
     * @param array<AdditionalTradeItemIdentification>|null $additionalTradeItemIdentification
     * @param string $gtin
     */
    public function __construct(
        ?array $additionalTradeItemIdentification=null,
        string $gtin='',
        /** @var float|null */
        public ?float $quantityOfLowerLevelTradeItem=null
    ) {
        parent::__construct($additionalTradeItemIdentification,$gtin);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['quantityOfLowerLevelTradeItem'])) $this->quantityOfLowerLevelTradeItem = $o['quantityOfLowerLevelTradeItem'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->quantityOfLowerLevelTradeItem)) $o['quantityOfLowerLevelTradeItem'] = $this->quantityOfLowerLevelTradeItem;
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataNotificationLineItem extends Ecom_TradeItemIdentification implements JsonSerializable
{
    /**
     * @param array<AdditionalTradeItemIdentification>|null $additionalTradeItemIdentification
     * @param string $gtin
     */
    public function __construct(
        ?array $additionalTradeItemIdentification=null,
        string $gtin='',
        /** @var string */
        public string $brandName='',
        /** @var string */
        public string $gpcCategoryCode='',
        /** @var bool|null */
        public ?bool $isTheProductVariantPreferred=null,
        /** @var int|null */
        public ?int $lineItemNumber=null,
        /** @var int|null */
        public ?int $parentLineItemNumber=null,
        /** @var IdentifierType|null */
        public ?IdentifierType $productVariantIdentifier=null,
        /** @var float|null */
        public ?float $quantityOfItemTypes=null,
        /** @var float|null */
        public ?float $quantityOfItemUnits=null,
        /** @var array<string>|null */
        public ?array $tradeItemDescription=null,
        /** @var string */
        public string $tradeItemUnitDescriptorCode='',
        /** @var ItemDataTradingPartnerNeutral|null */
        public ?ItemDataTradingPartnerNeutral $itemDataTradingPartnerNeutral=null,
        /** @var array<ItemDataTradingPartnerDependent>|null */
        public ?array $itemDataTradingPartnerDependent=null,
        /** @var array<LowerLevelTradeItem>|null */
        public ?array $lowerLevelTradeItem=null,
        /** @var array<AvpList>|null */
        public ?array $avpList=null
    ) {
        parent::__construct($additionalTradeItemIdentification,$gtin);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['brandName'])) $this->brandName = $o['brandName'];
        if (isset($o['gpcCategoryCode'])) $this->gpcCategoryCode = $o['gpcCategoryCode'];
        if (isset($o['isTheProductVariantPreferred'])) $this->isTheProductVariantPreferred = $o['isTheProductVariantPreferred'];
        if (isset($o['lineItemNumber'])) $this->lineItemNumber = $o['lineItemNumber'];
        if (isset($o['parentLineItemNumber'])) $this->parentLineItemNumber = $o['parentLineItemNumber'];
        if (isset($o['productVariantIdentifier'])) $this->productVariantIdentifier = JsonConverters::from('IdentifierType', $o['productVariantIdentifier']);
        if (isset($o['quantityOfItemTypes'])) $this->quantityOfItemTypes = $o['quantityOfItemTypes'];
        if (isset($o['quantityOfItemUnits'])) $this->quantityOfItemUnits = $o['quantityOfItemUnits'];
        if (isset($o['tradeItemDescription'])) $this->tradeItemDescription = JsonConverters::fromArray('string', $o['tradeItemDescription']);
        if (isset($o['tradeItemUnitDescriptorCode'])) $this->tradeItemUnitDescriptorCode = $o['tradeItemUnitDescriptorCode'];
        if (isset($o['itemDataTradingPartnerNeutral'])) $this->itemDataTradingPartnerNeutral = JsonConverters::from('ItemDataTradingPartnerNeutral', $o['itemDataTradingPartnerNeutral']);
        if (isset($o['itemDataTradingPartnerDependent'])) $this->itemDataTradingPartnerDependent = JsonConverters::fromArray('ItemDataTradingPartnerDependent', $o['itemDataTradingPartnerDependent']);
        if (isset($o['lowerLevelTradeItem'])) $this->lowerLevelTradeItem = JsonConverters::fromArray('LowerLevelTradeItem', $o['lowerLevelTradeItem']);
        if (isset($o['avpList'])) $this->avpList = JsonConverters::fromArray('AvpList', $o['avpList']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->brandName)) $o['brandName'] = $this->brandName;
        if (isset($this->gpcCategoryCode)) $o['gpcCategoryCode'] = $this->gpcCategoryCode;
        if (isset($this->isTheProductVariantPreferred)) $o['isTheProductVariantPreferred'] = $this->isTheProductVariantPreferred;
        if (isset($this->lineItemNumber)) $o['lineItemNumber'] = $this->lineItemNumber;
        if (isset($this->parentLineItemNumber)) $o['parentLineItemNumber'] = $this->parentLineItemNumber;
        if (isset($this->productVariantIdentifier)) $o['productVariantIdentifier'] = JsonConverters::to('IdentifierType', $this->productVariantIdentifier);
        if (isset($this->quantityOfItemTypes)) $o['quantityOfItemTypes'] = $this->quantityOfItemTypes;
        if (isset($this->quantityOfItemUnits)) $o['quantityOfItemUnits'] = $this->quantityOfItemUnits;
        if (isset($this->tradeItemDescription)) $o['tradeItemDescription'] = JsonConverters::toArray('string', $this->tradeItemDescription);
        if (isset($this->tradeItemUnitDescriptorCode)) $o['tradeItemUnitDescriptorCode'] = $this->tradeItemUnitDescriptorCode;
        if (isset($this->itemDataTradingPartnerNeutral)) $o['itemDataTradingPartnerNeutral'] = JsonConverters::to('ItemDataTradingPartnerNeutral', $this->itemDataTradingPartnerNeutral);
        if (isset($this->itemDataTradingPartnerDependent)) $o['itemDataTradingPartnerDependent'] = JsonConverters::toArray('ItemDataTradingPartnerDependent', $this->itemDataTradingPartnerDependent);
        if (isset($this->lowerLevelTradeItem)) $o['lowerLevelTradeItem'] = JsonConverters::toArray('LowerLevelTradeItem', $this->lowerLevelTradeItem);
        if (isset($this->avpList)) $o['avpList'] = JsonConverters::toArray('AvpList', $this->avpList);
        return empty($o) ? new class(){} : $o;
    }
}

class ItemDataNotificationMessage extends BaseDocument implements JsonSerializable
{
    /**
     * @param string $currencyCode
     * @param DateTime $creationDateTime
     * @param DocumentAction|null $documentActionCode
     * @param DocumentStatus|null $documentStatusCode
     * @param string $documentStructureVersion
     * @param DateTime|null $lastUpdateDateTime
     * @param int|null $revisionNumber
     * @param array<AvpList>|null $avpList
     */
    public function __construct(
        string $currencyCode='',
        DateTime $creationDateTime=new DateTime(),
        ?DocumentAction $documentActionCode=null,
        ?DocumentStatus $documentStatusCode=null,
        string $documentStructureVersion='',
        ?DateTime $lastUpdateDateTime=null,
        ?int $revisionNumber=null,
        ?array $avpList=null,
        /** @var TransactionalParty|null */
        public ?TransactionalParty $dataRecipient=null,
        /** @var TransactionalParty|null */
        public ?TransactionalParty $dataSource=null,
        /** @var string */
        public string $itemDataNotificationIdentification='',
        /** @var array<ItemDataNotificationLineItem>|null */
        public ?array $itemDataNotificationLineItem=null
    ) {
        parent::__construct($currencyCode,$creationDateTime,$documentActionCode,$documentStatusCode,$documentStructureVersion,$lastUpdateDateTime,$revisionNumber,$avpList);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['dataRecipient'])) $this->dataRecipient = JsonConverters::from('TransactionalParty', $o['dataRecipient']);
        if (isset($o['dataSource'])) $this->dataSource = JsonConverters::from('TransactionalParty', $o['dataSource']);
        if (isset($o['itemDataNotificationIdentification'])) $this->itemDataNotificationIdentification = $o['itemDataNotificationIdentification'];
        if (isset($o['itemDataNotificationLineItem'])) $this->itemDataNotificationLineItem = JsonConverters::fromArray('ItemDataNotificationLineItem', $o['itemDataNotificationLineItem']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->dataRecipient)) $o['dataRecipient'] = JsonConverters::to('TransactionalParty', $this->dataRecipient);
        if (isset($this->dataSource)) $o['dataSource'] = JsonConverters::to('TransactionalParty', $this->dataSource);
        if (isset($this->itemDataNotificationIdentification)) $o['itemDataNotificationIdentification'] = $this->itemDataNotificationIdentification;
        if (isset($this->itemDataNotificationLineItem)) $o['itemDataNotificationLineItem'] = JsonConverters::toArray('ItemDataNotificationLineItem', $this->itemDataNotificationLineItem);
        return empty($o) ? new class(){} : $o;
    }
}

/** @description Item Data Notification */
// @Api(Description="Item Data Notification")
// @ApiResponse(Description="ItemDataNotification data", IsDefaultResponse=true, StatusCode=200)
// @ApiResponse(Description="No Content", ResponseType="typeof(ServiceStack.IReturnVoid)", StatusCode=204)
// @ApiResponse(Description="Specified argument was out of the range of valid values.", ResponseType="typeof(System.ArgumentOutOfRangeException)", StatusCode=400)
class GetItemDataNotificationByGtin implements JsonSerializable
{
    public function __construct(
        /** @description Global Trade Item Number (GTIN) */
        // @ApiMember(Description="Global Trade Item Number (GTIN)", ExcludeInSchema=true, ParameterType="path")
        /** @var string */
        public string $gtin=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['gtin'])) $this->gtin = $o['gtin'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->gtin)) $o['gtin'] = $this->gtin;
        return empty($o) ? new class(){} : $o;
    }
}

PHP GetItemDataNotificationByGtin DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .xml suffix or ?format=xml

HTTP + XML

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

GET /api/itemDataNotification/gtin/{Gtin} HTTP/1.1 
Host: stf-api-uat.data-xchange.co.za 
Accept: application/xml
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: length

<ItemDataNotificationMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DX.STF.Models.Dto.GS1">
  <AvpList>
    <AvpList>
      <Code>String</Code>
      <Value>String</Value>
    </AvpList>
  </AvpList>
  <CreationDateTime>0001-01-01T00:00:00</CreationDateTime>
  <CurrencyCode>String</CurrencyCode>
  <DocumentActionCode>ADD</DocumentActionCode>
  <DocumentStatusCode>ADDITIONAL_TRANSMISSION</DocumentStatusCode>
  <DocumentStructureVersion>String</DocumentStructureVersion>
  <LastUpdateDateTime>0001-01-01T00:00:00</LastUpdateDateTime>
  <RevisionNumber>0</RevisionNumber>
  <DataRecipient>
    <AdditionalPartyIdentification>
      <AvpList>
        <Code>String</Code>
        <Value>String</Value>
      </AvpList>
    </AdditionalPartyIdentification>
    <Gln>String</Gln>
    <Name>String</Name>
    <Address>
      <City>String</City>
      <CountryCode>String</CountryCode>
      <PostalCode>String</PostalCode>
      <ProvinceCode>String</ProvinceCode>
      <StreetAddressOne>String</StreetAddressOne>
      <StreetAddressThree>String</StreetAddressThree>
      <StreetAddressTwo>String</StreetAddressTwo>
    </Address>
    <CommunicationChannel>
      <AvpList>
        <Code>String</Code>
        <Value>String</Value>
      </AvpList>
    </CommunicationChannel>
    <Contact>
      <Contact>
        <CommunicationChannel>
          <CommunicationChannel>
            <CommunicationChannelCode>String</CommunicationChannelCode>
            <CommunicationChannelName>String</CommunicationChannelName>
            <CommunicationValue>String</CommunicationValue>
          </CommunicationChannel>
        </CommunicationChannel>
        <ContactTypeCode>String</ContactTypeCode>
        <DepartmentName>String</DepartmentName>
        <JobTitle>String</JobTitle>
        <PersonName>String</PersonName>
        <Responsibility>String</Responsibility>
      </Contact>
    </Contact>
    <DutyFeeTaxRegistration>String</DutyFeeTaxRegistration>
    <EntityIdentification>String</EntityIdentification>
    <FinancialInstitutionInformation>
      <ExportersCode>String</ExportersCode>
      <FinancialAccount>
        <Name>String</Name>
        <Number>String</Number>
        <NumberTypeCode>String</NumberTypeCode>
      </FinancialAccount>
      <FinancialInstitutionBranchName>String</FinancialInstitutionBranchName>
      <FinancialInstitutionName>String</FinancialInstitutionName>
      <FinancialRoutingNumber>
        <Number>String</Number>
        <NumberTypeCode>String</NumberTypeCode>
      </FinancialRoutingNumber>
      <SwiftCode>String</SwiftCode>
    </FinancialInstitutionInformation>
  </DataRecipient>
  <DataSource>
    <AdditionalPartyIdentification>
      <AvpList>
        <Code>String</Code>
        <Value>String</Value>
      </AvpList>
    </AdditionalPartyIdentification>
    <Gln>String</Gln>
    <Name>String</Name>
    <Address>
      <City>String</City>
      <CountryCode>String</CountryCode>
      <PostalCode>String</PostalCode>
      <ProvinceCode>String</ProvinceCode>
      <StreetAddressOne>String</StreetAddressOne>
      <StreetAddressThree>String</StreetAddressThree>
      <StreetAddressTwo>String</StreetAddressTwo>
    </Address>
    <CommunicationChannel>
      <AvpList>
        <Code>String</Code>
        <Value>String</Value>
      </AvpList>
    </CommunicationChannel>
    <Contact>
      <Contact>
        <CommunicationChannel>
          <CommunicationChannel>
            <CommunicationChannelCode>String</CommunicationChannelCode>
            <CommunicationChannelName>String</CommunicationChannelName>
            <CommunicationValue>String</CommunicationValue>
          </CommunicationChannel>
        </CommunicationChannel>
        <ContactTypeCode>String</ContactTypeCode>
        <DepartmentName>String</DepartmentName>
        <JobTitle>String</JobTitle>
        <PersonName>String</PersonName>
        <Responsibility>String</Responsibility>
      </Contact>
    </Contact>
    <DutyFeeTaxRegistration>String</DutyFeeTaxRegistration>
    <EntityIdentification>String</EntityIdentification>
    <FinancialInstitutionInformation>
      <ExportersCode>String</ExportersCode>
      <FinancialAccount>
        <Name>String</Name>
        <Number>String</Number>
        <NumberTypeCode>String</NumberTypeCode>
      </FinancialAccount>
      <FinancialInstitutionBranchName>String</FinancialInstitutionBranchName>
      <FinancialInstitutionName>String</FinancialInstitutionName>
      <FinancialRoutingNumber>
        <Number>String</Number>
        <NumberTypeCode>String</NumberTypeCode>
      </FinancialRoutingNumber>
      <SwiftCode>String</SwiftCode>
    </FinancialInstitutionInformation>
  </DataSource>
  <ItemDataNotificationIdentification>String</ItemDataNotificationIdentification>
  <ItemDataNotificationLineItem>
    <ItemDataNotificationLineItem>
      <AdditionalTradeItemIdentification>
        <AdditionalTradeItemIdentification>
          <Code>String</Code>
          <Value>String</Value>
        </AdditionalTradeItemIdentification>
      </AdditionalTradeItemIdentification>
      <Gtin>String</Gtin>
      <AvpList>
        <AvpList>
          <Code>String</Code>
          <Value>String</Value>
        </AvpList>
      </AvpList>
      <BrandName>String</BrandName>
      <GpcCategoryCode>String</GpcCategoryCode>
      <IsTheProductVariantPreferred>false</IsTheProductVariantPreferred>
      <ItemDataTradingPartnerDependent>
        <ItemDataTradingPartnerDependent>
          <AdministrativeUnitOfReceiver>
            <AdministrativeUnit>
              <Gln>String</Gln>
              <InternalIdentification>String</InternalIdentification>
              <TypeCode>String</TypeCode>
            </AdministrativeUnit>
          </AdministrativeUnitOfReceiver>
          <AvpList>
            <Code>String</Code>
            <Value>String</Value>
          </AvpList>
          <CountryOfOrigin>String</CountryOfOrigin>
          <ItemDataLogisticUnitInformation>
            <ItemDataLogisticUnitInformation>
              <AvpList>
                <Code>String</Code>
                <Value>String</Value>
              </AvpList>
              <MaximumStackingFactor>0</MaximumStackingFactor>
              <NetWeight>
                <CodeListVersion>String</CodeListVersion>
                <MeasurementUnitCode>String</MeasurementUnitCode>
                <Value>0</Value>
              </NetWeight>
              <NumberOfLayers>0</NumberOfLayers>
              <PackageLevelCode>String</PackageLevelCode>
              <PackageTypeCode>String</PackageTypeCode>
              <TradeItemQuantity>
                <CodeListVersion>String</CodeListVersion>
                <MeasurementUnitCode>String</MeasurementUnitCode>
                <Value>0</Value>
              </TradeItemQuantity>
              <TradeItemQuantityPerLayer>
                <CodeListVersion>String</CodeListVersion>
                <MeasurementUnitCode>String</MeasurementUnitCode>
                <Value>0</Value>
              </TradeItemQuantityPerLayer>
              <dimensionsOfLogisticUnit>
                <Dimension>
                  <Depth>
                    <CodeListVersion>String</CodeListVersion>
                    <MeasurementUnitCode>String</MeasurementUnitCode>
                    <Value>0</Value>
                  </Depth>
                  <Height>
                    <CodeListVersion>String</CodeListVersion>
                    <MeasurementUnitCode>String</MeasurementUnitCode>
                    <Value>0</Value>
                  </Height>
                  <Width>
                    <CodeListVersion>String</CodeListVersion>
                    <MeasurementUnitCode>String</MeasurementUnitCode>
                    <Value>0</Value>
                  </Width>
                </Dimension>
              </dimensionsOfLogisticUnit>
              <grossWeight>
                <CodeListVersion>String</CodeListVersion>
                <MeasurementUnitCode>String</MeasurementUnitCode>
                <Value>0</Value>
              </grossWeight>
            </ItemDataLogisticUnitInformation>
          </ItemDataLogisticUnitInformation>
          <ItemDataStockRequirements>
            <ItemDataStockRequirements>
              <StockRequirementTypeCode>String</StockRequirementTypeCode>
              <requiredStockLevel>
                <CodeListVersion>String</CodeListVersion>
                <MeasurementUnitCode>String</MeasurementUnitCode>
                <Value>0</Value>
              </requiredStockLevel>
              <requiredStockLevelValidityDateTime>0001-01-01T00:00:00</requiredStockLevelValidityDateTime>
            </ItemDataStockRequirements>
          </ItemDataStockRequirements>
          <MinimumRemainingShelfLifeInbound>
            <TimeMeasurementUnitCode>String</TimeMeasurementUnitCode>
            <Value>0</Value>
          </MinimumRemainingShelfLifeInbound>
          <MinimumRemainingShelfLifeOutbound>
            <TimeMeasurementUnitCode>String</TimeMeasurementUnitCode>
            <Value>0</Value>
          </MinimumRemainingShelfLifeOutbound>
          <OrderQuantityMaximum>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </OrderQuantityMaximum>
          <OrderQuantityMinimum>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </OrderQuantityMinimum>
          <OrderQuantityMultiple>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </OrderQuantityMultiple>
          <QualityControlCode>String</QualityControlCode>
          <QuarantinePeriod>
            <TimeMeasurementUnitCode>String</TimeMeasurementUnitCode>
            <Value>0</Value>
          </QuarantinePeriod>
          <Receiver>
            <AdditionalPartyIdentification>
              <AvpList>
                <Code>String</Code>
                <Value>String</Value>
              </AvpList>
            </AdditionalPartyIdentification>
            <Gln>String</Gln>
            <Name>String</Name>
            <Address>
              <City>String</City>
              <CountryCode>String</CountryCode>
              <PostalCode>String</PostalCode>
              <ProvinceCode>String</ProvinceCode>
              <StreetAddressOne>String</StreetAddressOne>
              <StreetAddressThree>String</StreetAddressThree>
              <StreetAddressTwo>String</StreetAddressTwo>
            </Address>
            <CommunicationChannel>
              <AvpList>
                <Code>String</Code>
                <Value>String</Value>
              </AvpList>
            </CommunicationChannel>
            <Contact>
              <Contact>
                <CommunicationChannel>
                  <CommunicationChannel>
                    <CommunicationChannelCode>String</CommunicationChannelCode>
                    <CommunicationChannelName>String</CommunicationChannelName>
                    <CommunicationValue>String</CommunicationValue>
                  </CommunicationChannel>
                </CommunicationChannel>
                <ContactTypeCode>String</ContactTypeCode>
                <DepartmentName>String</DepartmentName>
                <JobTitle>String</JobTitle>
                <PersonName>String</PersonName>
                <Responsibility>String</Responsibility>
              </Contact>
            </Contact>
            <DutyFeeTaxRegistration>String</DutyFeeTaxRegistration>
            <EntityIdentification>String</EntityIdentification>
            <FinancialInstitutionInformation>
              <ExportersCode>String</ExportersCode>
              <FinancialAccount>
                <Name>String</Name>
                <Number>String</Number>
                <NumberTypeCode>String</NumberTypeCode>
              </FinancialAccount>
              <FinancialInstitutionBranchName>String</FinancialInstitutionBranchName>
              <FinancialInstitutionName>String</FinancialInstitutionName>
              <FinancialRoutingNumber>
                <Number>String</Number>
                <NumberTypeCode>String</NumberTypeCode>
              </FinancialRoutingNumber>
              <SwiftCode>String</SwiftCode>
            </FinancialInstitutionInformation>
          </Receiver>
          <Shipper>
            <AdditionalPartyIdentification>
              <AvpList>
                <Code>String</Code>
                <Value>String</Value>
              </AvpList>
            </AdditionalPartyIdentification>
            <Gln>String</Gln>
            <Name>String</Name>
            <Address>
              <City>String</City>
              <CountryCode>String</CountryCode>
              <PostalCode>String</PostalCode>
              <ProvinceCode>String</ProvinceCode>
              <StreetAddressOne>String</StreetAddressOne>
              <StreetAddressThree>String</StreetAddressThree>
              <StreetAddressTwo>String</StreetAddressTwo>
            </Address>
            <CommunicationChannel>
              <AvpList>
                <Code>String</Code>
                <Value>String</Value>
              </AvpList>
            </CommunicationChannel>
            <Contact>
              <Contact>
                <CommunicationChannel>
                  <CommunicationChannel>
                    <CommunicationChannelCode>String</CommunicationChannelCode>
                    <CommunicationChannelName>String</CommunicationChannelName>
                    <CommunicationValue>String</CommunicationValue>
                  </CommunicationChannel>
                </CommunicationChannel>
                <ContactTypeCode>String</ContactTypeCode>
                <DepartmentName>String</DepartmentName>
                <JobTitle>String</JobTitle>
                <PersonName>String</PersonName>
                <Responsibility>String</Responsibility>
              </Contact>
            </Contact>
            <DutyFeeTaxRegistration>String</DutyFeeTaxRegistration>
            <EntityIdentification>String</EntityIdentification>
            <FinancialInstitutionInformation>
              <ExportersCode>String</ExportersCode>
              <FinancialAccount>
                <Name>String</Name>
                <Number>String</Number>
                <NumberTypeCode>String</NumberTypeCode>
              </FinancialAccount>
              <FinancialInstitutionBranchName>String</FinancialInstitutionBranchName>
              <FinancialInstitutionName>String</FinancialInstitutionName>
              <FinancialRoutingNumber>
                <Number>String</Number>
                <NumberTypeCode>String</NumberTypeCode>
              </FinancialRoutingNumber>
              <SwiftCode>String</SwiftCode>
            </FinancialInstitutionInformation>
          </Shipper>
          <SubstituteItem>
            <AdditionalTradeItemIdentification>
              <AdditionalTradeItemIdentification>
                <Code>String</Code>
                <Value>String</Value>
              </AdditionalTradeItemIdentification>
            </AdditionalTradeItemIdentification>
            <Gtin>String</Gtin>
          </SubstituteItem>
          <TradeItemProductionLeadTime>
            <TimeMeasurementUnitCode>String</TimeMeasurementUnitCode>
            <Value>0</Value>
          </TradeItemProductionLeadTime>
          <TradeItemShipmentLeadTime>
            <TimeMeasurementUnitCode>String</TimeMeasurementUnitCode>
            <Value>0</Value>
          </TradeItemShipmentLeadTime>
          <TradeItemSpecificUnitOfMeasure>String</TradeItemSpecificUnitOfMeasure>
          <TradeItemSubstitutionDateTime>0001-01-01T00:00:00</TradeItemSubstitutionDateTime>
          <originatingParty>
            <TransactionalPartyInRole>
              <PartyRoleCode>String</PartyRoleCode>
              <TransactionalParty>
                <AdditionalPartyIdentification>
                  <AvpList>
                    <Code>String</Code>
                    <Value>String</Value>
                  </AvpList>
                </AdditionalPartyIdentification>
                <Gln>String</Gln>
                <Name>String</Name>
                <Address>
                  <City>String</City>
                  <CountryCode>String</CountryCode>
                  <PostalCode>String</PostalCode>
                  <ProvinceCode>String</ProvinceCode>
                  <StreetAddressOne>String</StreetAddressOne>
                  <StreetAddressThree>String</StreetAddressThree>
                  <StreetAddressTwo>String</StreetAddressTwo>
                </Address>
                <CommunicationChannel>
                  <AvpList>
                    <Code>String</Code>
                    <Value>String</Value>
                  </AvpList>
                </CommunicationChannel>
                <Contact>
                  <Contact>
                    <CommunicationChannel>
                      <CommunicationChannel>
                        <CommunicationChannelCode>String</CommunicationChannelCode>
                        <CommunicationChannelName>String</CommunicationChannelName>
                        <CommunicationValue>String</CommunicationValue>
                      </CommunicationChannel>
                    </CommunicationChannel>
                    <ContactTypeCode>String</ContactTypeCode>
                    <DepartmentName>String</DepartmentName>
                    <JobTitle>String</JobTitle>
                    <PersonName>String</PersonName>
                    <Responsibility>String</Responsibility>
                  </Contact>
                </Contact>
                <DutyFeeTaxRegistration>String</DutyFeeTaxRegistration>
                <EntityIdentification>String</EntityIdentification>
                <FinancialInstitutionInformation>
                  <ExportersCode>String</ExportersCode>
                  <FinancialAccount>
                    <Name>String</Name>
                    <Number>String</Number>
                    <NumberTypeCode>String</NumberTypeCode>
                  </FinancialAccount>
                  <FinancialInstitutionBranchName>String</FinancialInstitutionBranchName>
                  <FinancialInstitutionName>String</FinancialInstitutionName>
                  <FinancialRoutingNumber>
                    <Number>String</Number>
                    <NumberTypeCode>String</NumberTypeCode>
                  </FinancialRoutingNumber>
                  <SwiftCode>String</SwiftCode>
                </FinancialInstitutionInformation>
              </TransactionalParty>
            </TransactionalPartyInRole>
          </originatingParty>
        </ItemDataTradingPartnerDependent>
      </ItemDataTradingPartnerDependent>
      <ItemDataTradingPartnerNeutral>
        <AdministrativeUnitOfLogisticServiceBuyer>
          <Gln>String</Gln>
          <InternalIdentification>String</InternalIdentification>
          <TypeCode>String</TypeCode>
        </AdministrativeUnitOfLogisticServiceBuyer>
        <AvpList>
          <AvpList>
            <Code>String</Code>
            <Value>String</Value>
          </AvpList>
        </AvpList>
        <CancelledDateTime>0001-01-01T00:00:00</CancelledDateTime>
        <DangerousGoodsInformation>
          <DangerousGoodsInformation>
            <Contact>
              <Contact>
                <CommunicationChannel>
                  <CommunicationChannel>
                    <CommunicationChannelCode>String</CommunicationChannelCode>
                    <CommunicationChannelName>String</CommunicationChannelName>
                    <CommunicationValue>String</CommunicationValue>
                  </CommunicationChannel>
                </CommunicationChannel>
                <ContactTypeCode>String</ContactTypeCode>
                <DepartmentName>String</DepartmentName>
                <JobTitle>String</JobTitle>
                <PersonName>String</PersonName>
                <Responsibility>String</Responsibility>
              </Contact>
            </Contact>
            <DangerousGoodsDescription>String</DangerousGoodsDescription>
            <DangerousGoodsShippingName>String</DangerousGoodsShippingName>
            <DangerousGoodsTechnicalName>String</DangerousGoodsTechnicalName>
            <dangerousGoodsUNIdentifier>
              <authority>String</authority>
              <text>String</text>
            </dangerousGoodsUNIdentifier>
          </DangerousGoodsInformation>
        </DangerousGoodsInformation>
        <DiscontinuedDateTime>0001-01-01T00:00:00</DiscontinuedDateTime>
        <EffectiveDateTime>0001-01-01T00:00:00</EffectiveDateTime>
        <EndAvailabilityDateTime>0001-01-01T00:00:00</EndAvailabilityDateTime>
        <HandlingInstruction>
          <HandlingInstruction>
            <HandlingInstructionCode>String</HandlingInstructionCode>
            <HandlingInstructionText>String</HandlingInstructionText>
            <PrintingInstructionCode xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </PrintingInstructionCode>
            <TransportTemperature>
              <MaximumTemperature>
                <TemperatureMeasurementUnitCode>String</TemperatureMeasurementUnitCode>
                <Value>0</Value>
              </MaximumTemperature>
              <MinimumTemperature>
                <TemperatureMeasurementUnitCode>String</TemperatureMeasurementUnitCode>
                <Value>0</Value>
              </MinimumTemperature>
            </TransportTemperature>
            <storageTemperature>
              <MaximumTemperature>
                <TemperatureMeasurementUnitCode>String</TemperatureMeasurementUnitCode>
                <Value>0</Value>
              </MaximumTemperature>
              <MinimumTemperature>
                <TemperatureMeasurementUnitCode>String</TemperatureMeasurementUnitCode>
                <Value>0</Value>
              </MinimumTemperature>
            </storageTemperature>
          </HandlingInstruction>
        </HandlingInstruction>
        <ItemDataWeightAndDimension>
          <Depth>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </Depth>
          <Diameter>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </Diameter>
          <GrossWeight>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </GrossWeight>
          <NetWeight>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </NetWeight>
          <Width>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </Width>
          <height>
            <CodeListVersion>String</CodeListVersion>
            <MeasurementUnitCode>String</MeasurementUnitCode>
            <Value>0</Value>
          </height>
        </ItemDataWeightAndDimension>
        <MaximumStackingFactor>0</MaximumStackingFactor>
        <StartAvailabilityDateTime>0001-01-01T00:00:00</StartAvailabilityDateTime>
        <TradeItemBaseUnitOfMeasure>String</TradeItemBaseUnitOfMeasure>
        <TradeItemClassificationCode>
          <AdditionalTradeItemClassificationCode>
            <AdditionalTradeItemClassificationCodeListCode>String</AdditionalTradeItemClassificationCodeListCode>
            <AdditionalTradeItemClassificationCodeListVersion>String</AdditionalTradeItemClassificationCodeListVersion>
            <CodeDescription>String</CodeDescription>
            <Value>String</Value>
          </AdditionalTradeItemClassificationCode>
        </TradeItemClassificationCode>
        <WarehouseABCClassificationCode>String</WarehouseABCClassificationCode>
      </ItemDataTradingPartnerNeutral>
      <LineItemNumber>0</LineItemNumber>
      <LowerLevelTradeItem>
        <LowerLevelTradeItem>
          <AdditionalTradeItemIdentification>
            <AdditionalTradeItemIdentification>
              <Code>String</Code>
              <Value>String</Value>
            </AdditionalTradeItemIdentification>
          </AdditionalTradeItemIdentification>
          <Gtin>String</Gtin>
          <QuantityOfLowerLevelTradeItem>0</QuantityOfLowerLevelTradeItem>
        </LowerLevelTradeItem>
      </LowerLevelTradeItem>
      <ParentLineItemNumber>0</ParentLineItemNumber>
      <ProductVariantIdentifier>
        <IdentificationSchemeAgencyCodeCodeListVersion>String</IdentificationSchemeAgencyCodeCodeListVersion>
        <IdentificationSchemeAgencyName>String</IdentificationSchemeAgencyName>
        <IdentificationSchemeName>String</IdentificationSchemeName>
        <Value>String</Value>
      </ProductVariantIdentifier>
      <QuantityOfItemTypes>0</QuantityOfItemTypes>
      <QuantityOfItemUnits>0</QuantityOfItemUnits>
      <TradeItemDescription xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d4p1:string>String</d4p1:string>
      </TradeItemDescription>
      <TradeItemUnitDescriptorCode>String</TradeItemUnitDescriptorCode>
    </ItemDataNotificationLineItem>
  </ItemDataNotificationLineItem>
</ItemDataNotificationMessage>