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 .jsv suffix or ?format=jsv

HTTP + JSV

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: text/jsv
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	dataRecipient: 
	{
		contact: 
		[
			{
				contactTypeCode: String,
				personName: String,
				departmentName: String,
				jobTitle: String,
				responsibility: String,
				communicationChannel: 
				[
					{
						communicationChannelCode: String,
						communicationChannelName: String,
						communicationValue: String
					}
				]
			}
		],
		address: 
		{
			streetAddressOne: String,
			streetAddressTwo: String,
			streetAddressThree: String,
			city: String,
			postalCode: String,
			provinceCode: String,
			countryCode: String
		},
		communicationChannel: 
		[
			{
				code: String,
				value: String
			}
		],
		financialInstitutionInformation: 
		{
			financialInstitutionBranchName: String,
			financialInstitutionName: String,
			financialRoutingNumber: 
			{
				number: String,
				numberTypeCode: String
			},
			financialAccount: 
			{
				number: String,
				numberTypeCode: String,
				name: String
			},
			swiftCode: String,
			exportersCode: String
		},
		dutyFeeTaxRegistration: String,
		entityIdentification: String,
		gln: String,
		name: String,
		additionalPartyIdentification: 
		[
			{
				code: String,
				value: String
			}
		]
	},
	dataSource: 
	{
		contact: 
		[
			{
				contactTypeCode: String,
				personName: String,
				departmentName: String,
				jobTitle: String,
				responsibility: String,
				communicationChannel: 
				[
					{
						communicationChannelCode: String,
						communicationChannelName: String,
						communicationValue: String
					}
				]
			}
		],
		address: 
		{
			streetAddressOne: String,
			streetAddressTwo: String,
			streetAddressThree: String,
			city: String,
			postalCode: String,
			provinceCode: String,
			countryCode: String
		},
		communicationChannel: 
		[
			{
				code: String,
				value: String
			}
		],
		financialInstitutionInformation: 
		{
			financialInstitutionBranchName: String,
			financialInstitutionName: String,
			financialRoutingNumber: 
			{
				number: String,
				numberTypeCode: String
			},
			financialAccount: 
			{
				number: String,
				numberTypeCode: String,
				name: String
			},
			swiftCode: String,
			exportersCode: String
		},
		dutyFeeTaxRegistration: String,
		entityIdentification: String,
		gln: String,
		name: String,
		additionalPartyIdentification: 
		[
			{
				code: String,
				value: String
			}
		]
	},
	itemDataNotificationIdentification: String,
	itemDataNotificationLineItem: 
	[
		{
			brandName: String,
			gpcCategoryCode: String,
			isTheProductVariantPreferred: False,
			lineItemNumber: 0,
			parentLineItemNumber: 0,
			productVariantIdentifier: 
			{
				value: String,
				identificationSchemeAgencyCodeCodeListVersion: String,
				identificationSchemeAgencyName: String,
				identificationSchemeName: String
			},
			quantityOfItemTypes: 0,
			quantityOfItemUnits: 0,
			tradeItemDescription: 
			[
				String
			],
			tradeItemUnitDescriptorCode: String,
			itemDataTradingPartnerNeutral: 
			{
				cancelledDateTime: 0001-01-01,
				discontinuedDateTime: 0001-01-01,
				endAvailabilityDateTime: 0001-01-01,
				maximumStackingFactor: 0,
				tradeItemBaseUnitOfMeasure: String,
				tradeItemClassificationCode: 
				[
					{
						value: String,
						additionalTradeItemClassificationCodeListCode: String,
						additionalTradeItemClassificationCodeListVersion: String,
						codeDescription: String
					}
				],
				warehouseABCClassificationCode: String,
				itemDataWeightAndDimension: 
				{
					depth: 
					{
						value: 0,
						codeListVersion: String,
						measurementUnitCode: String
					},
					diameter: 
					{
						value: 0,
						codeListVersion: String,
						measurementUnitCode: String
					},
					grossWeight: 
					{
						value: 0,
						codeListVersion: String,
						measurementUnitCode: String
					},
					height: 
					{
						value: 0,
						codeListVersion: String,
						measurementUnitCode: String
					},
					netWeight: 
					{
						value: 0,
						codeListVersion: String,
						measurementUnitCode: String
					},
					width: 
					{
						value: 0,
						codeListVersion: String,
						measurementUnitCode: String
					}
				},
				handlingInstruction: 
				[
					{
						handlingInstructionCode: String,
						handlingInstructionText: String,
						printingInstructionCode: 
						[
							String
						],
						storageTemperature: 
						{
							maximumTemperature: 
							{
								value: 0,
								temperatureMeasurementUnitCode: String
							},
							minimumTemperature: 
							{
								value: 0,
								temperatureMeasurementUnitCode: String
							}
						},
						transportTemperature: 
						{
							maximumTemperature: 
							{
								value: 0,
								temperatureMeasurementUnitCode: String
							},
							minimumTemperature: 
							{
								value: 0,
								temperatureMeasurementUnitCode: String
							}
						}
					}
				],
				dangerousGoodsInformation: 
				[
					{
						dangerousGoodsDescription: String,
						dangerousGoodsShippingName: String,
						dangerousGoodsTechnicalName: String,
						dangerousGoodsUNIdentifier: 
						{
							authority: String,
							text: String
						},
						contact: 
						[
							{
								contactTypeCode: String,
								personName: String,
								departmentName: String,
								jobTitle: String,
								responsibility: String,
								communicationChannel: 
								[
									{
										communicationChannelCode: String,
										communicationChannelName: String,
										communicationValue: String
									}
								]
							}
						]
					}
				],
				administrativeUnitOfLogisticServiceBuyer: 
				{
					typeCode: String,
					gln: String,
					internalIdentification: String
				},
				avpList: 
				[
					{
						code: String,
						value: String
					}
				]
			},
			itemDataTradingPartnerDependent: 
			[
				{
					countryOfOrigin: String,
					minimumRemainingShelfLifeInbound: 
					{
						timeMeasurementUnitCode: String,
						value: 0
					},
					minimumRemainingShelfLifeOutbound: 
					{
						timeMeasurementUnitCode: String,
						value: 0
					},
					orderQuantityMaximum: 
					{
						value: 0,
						measurementUnitCode: String,
						codeListVersion: String
					},
					orderQuantityMinimum: 
					{
						value: 0,
						measurementUnitCode: String,
						codeListVersion: String
					},
					orderQuantityMultiple: 
					{
						value: 0,
						measurementUnitCode: String,
						codeListVersion: String
					},
					qualityControlCode: String,
					quarantinePeriod: 
					{
						timeMeasurementUnitCode: String,
						value: 0
					},
					tradeItemProductionLeadTime: 
					{
						timeMeasurementUnitCode: String,
						value: 0
					},
					tradeItemShipmentLeadTime: 
					{
						timeMeasurementUnitCode: String,
						value: 0
					},
					tradeItemSpecificUnitOfMeasure: String,
					tradeItemSubstitutionDateTime: 0001-01-01,
					itemDataLogisticUnitInformation: 
					[
						{
							grossWeight: 
							{
								value: 0,
								codeListVersion: String,
								measurementUnitCode: String
							},
							maximumStackingFactor: 0,
							netWeight: 
							{
								value: 0,
								codeListVersion: String,
								measurementUnitCode: String
							},
							numberOfLayers: 0,
							packageLevelCode: String,
							packageTypeCode: String,
							tradeItemQuantity: 
							{
								value: 0,
								measurementUnitCode: String,
								codeListVersion: String
							},
							tradeItemQuantityPerLayer: 
							{
								value: 0,
								measurementUnitCode: String,
								codeListVersion: String
							},
							avpList: 
							{
								code: String,
								value: String
							},
							dimensionsOfLogisticUnit: 
							[
								{
									depth: 
									{
										value: 0,
										codeListVersion: String,
										measurementUnitCode: String
									},
									height: 
									{
										value: 0,
										codeListVersion: String,
										measurementUnitCode: String
									},
									width: 
									{
										value: 0,
										codeListVersion: String,
										measurementUnitCode: String
									}
								}
							]
						}
					],
					itemDataStockRequirements: 
					[
						{
							requiredStockLevel: 
							{
								value: 0,
								measurementUnitCode: String,
								codeListVersion: String
							},
							requiredStockLevelValidityDateTime: 0001-01-01,
							stockRequirementTypeCode: String
						}
					],
					administrativeUnitOfReceiver: 
					[
						{
							typeCode: String,
							gln: String,
							internalIdentification: String
						}
					],
					avpList: 
					{
						code: String,
						value: String
					},
					originatingParty: 
					[
						{
							partyRoleCode: String,
							transactionalParty: 
							{
								contact: 
								[
									{
										contactTypeCode: String,
										personName: String,
										departmentName: String,
										jobTitle: String,
										responsibility: String,
										communicationChannel: 
										[
											{
												communicationChannelCode: String,
												communicationChannelName: String,
												communicationValue: String
											}
										]
									}
								],
								address: 
								{
									streetAddressOne: String,
									streetAddressTwo: String,
									streetAddressThree: String,
									city: String,
									postalCode: String,
									provinceCode: String,
									countryCode: String
								},
								communicationChannel: 
								[
									{
										code: String,
										value: String
									}
								],
								financialInstitutionInformation: 
								{
									financialInstitutionBranchName: String,
									financialInstitutionName: String,
									financialRoutingNumber: 
									{
										number: String,
										numberTypeCode: String
									},
									financialAccount: 
									{
										number: String,
										numberTypeCode: String,
										name: String
									},
									swiftCode: String,
									exportersCode: String
								},
								dutyFeeTaxRegistration: String,
								entityIdentification: String,
								gln: String,
								name: String,
								additionalPartyIdentification: 
								[
									{
										code: String,
										value: String
									}
								]
							}
						}
					],
					receiver: 
					{
						contact: 
						[
							{
								contactTypeCode: String,
								personName: String,
								departmentName: String,
								jobTitle: String,
								responsibility: String,
								communicationChannel: 
								[
									{
										communicationChannelCode: String,
										communicationChannelName: String,
										communicationValue: String
									}
								]
							}
						],
						address: 
						{
							streetAddressOne: String,
							streetAddressTwo: String,
							streetAddressThree: String,
							city: String,
							postalCode: String,
							provinceCode: String,
							countryCode: String
						},
						communicationChannel: 
						[
							{
								code: String,
								value: String
							}
						],
						financialInstitutionInformation: 
						{
							financialInstitutionBranchName: String,
							financialInstitutionName: String,
							financialRoutingNumber: 
							{
								number: String,
								numberTypeCode: String
							},
							financialAccount: 
							{
								number: String,
								numberTypeCode: String,
								name: String
							},
							swiftCode: String,
							exportersCode: String
						},
						dutyFeeTaxRegistration: String,
						entityIdentification: String,
						gln: String,
						name: String,
						additionalPartyIdentification: 
						[
							{
								code: String,
								value: String
							}
						]
					},
					shipper: 
					{
						contact: 
						[
							{
								contactTypeCode: String,
								personName: String,
								departmentName: String,
								jobTitle: String,
								responsibility: String,
								communicationChannel: 
								[
									{
										communicationChannelCode: String,
										communicationChannelName: String,
										communicationValue: String
									}
								]
							}
						],
						address: 
						{
							streetAddressOne: String,
							streetAddressTwo: String,
							streetAddressThree: String,
							city: String,
							postalCode: String,
							provinceCode: String,
							countryCode: String
						},
						communicationChannel: 
						[
							{
								code: String,
								value: String
							}
						],
						financialInstitutionInformation: 
						{
							financialInstitutionBranchName: String,
							financialInstitutionName: String,
							financialRoutingNumber: 
							{
								number: String,
								numberTypeCode: String
							},
							financialAccount: 
							{
								number: String,
								numberTypeCode: String,
								name: String
							},
							swiftCode: String,
							exportersCode: String
						},
						dutyFeeTaxRegistration: String,
						entityIdentification: String,
						gln: String,
						name: String,
						additionalPartyIdentification: 
						[
							{
								code: String,
								value: String
							}
						]
					},
					substituteItem: 
					{
						additionalTradeItemIdentification: 
						[
							{
								value: String,
								code: String
							}
						],
						gtin: String
					}
				}
			],
			lowerLevelTradeItem: 
			[
				{
					quantityOfLowerLevelTradeItem: 0,
					additionalTradeItemIdentification: 
					[
						{
							value: String,
							code: String
						}
					],
					gtin: String
				}
			],
			avpList: 
			[
				{
					code: String,
					value: String
				}
			],
			additionalTradeItemIdentification: 
			[
				{
					value: String,
					code: String
				}
			],
			gtin: String
		}
	],
	currencyCode: String,
	documentActionCode: ADD,
	documentStatusCode: ADDITIONAL_TRANSMISSION,
	documentStructureVersion: String,
	lastUpdateDateTime: 0001-01-01,
	revisionNumber: 0,
	avpList: 
	[
		{
			code: String,
			value: String
		}
	]
}