/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
 */

'use strict';

/**
 * The Edifact agreement protocol settings.
 *
 */
class EdifactProtocolSettings {
  /**
   * Create a EdifactProtocolSettings.
   * @property {object} validationSettings The EDIFACT validation settings.
   * @property {boolean} [validationSettings.validateCharacterSet] The value
   * indicating whether to validate character set in the message.
   * @property {boolean}
   * [validationSettings.checkDuplicateInterchangeControlNumber] The value
   * indicating whether to check for duplicate interchange control number.
   * @property {number}
   * [validationSettings.interchangeControlNumberValidityDays] The validity
   * period of interchange control number.
   * @property {boolean} [validationSettings.checkDuplicateGroupControlNumber]
   * The value indicating whether to check for duplicate group control number.
   * @property {boolean}
   * [validationSettings.checkDuplicateTransactionSetControlNumber] The value
   * indicating whether to check for duplicate transaction set control number.
   * @property {boolean} [validationSettings.validateEDITypes] The value
   * indicating whether to Whether to validate EDI types.
   * @property {boolean} [validationSettings.validateXSDTypes] The value
   * indicating whether to Whether to validate XSD types.
   * @property {boolean}
   * [validationSettings.allowLeadingAndTrailingSpacesAndZeroes] The value
   * indicating whether to allow leading and trailing spaces and zeroes.
   * @property {boolean}
   * [validationSettings.trimLeadingAndTrailingSpacesAndZeroes] The value
   * indicating whether to trim leading and trailing spaces and zeroes.
   * @property {string} [validationSettings.trailingSeparatorPolicy] The
   * trailing separator policy. Possible values include: 'NotSpecified',
   * 'NotAllowed', 'Optional', 'Mandatory'
   * @property {object} framingSettings The EDIFACT framing settings.
   * @property {string} [framingSettings.serviceCodeListDirectoryVersion] The
   * service code list directory version.
   * @property {string} [framingSettings.characterEncoding] The character
   * encoding.
   * @property {number} [framingSettings.protocolVersion] The protocol version.
   * @property {number} [framingSettings.dataElementSeparator] The data element
   * separator.
   * @property {number} [framingSettings.componentSeparator] The component
   * separator.
   * @property {number} [framingSettings.segmentTerminator] The segment
   * terminator.
   * @property {number} [framingSettings.releaseIndicator] The release
   * indicator.
   * @property {number} [framingSettings.repetitionSeparator] The repetition
   * separator.
   * @property {string} [framingSettings.characterSet] The EDIFACT frame
   * setting characterSet. Possible values include: 'NotSpecified', 'UNOB',
   * 'UNOA', 'UNOC', 'UNOD', 'UNOE', 'UNOF', 'UNOG', 'UNOH', 'UNOI', 'UNOJ',
   * 'UNOK', 'UNOX', 'UNOY', 'KECA'
   * @property {string} [framingSettings.decimalPointIndicator] The EDIFACT
   * frame setting decimal indicator. Possible values include: 'NotSpecified',
   * 'Comma', 'Decimal'
   * @property {string} [framingSettings.segmentTerminatorSuffix] The EDIFACT
   * frame setting segment terminator suffix. Possible values include:
   * 'NotSpecified', 'None', 'CR', 'LF', 'CRLF'
   * @property {object} envelopeSettings The EDIFACT envelope settings.
   * @property {string} [envelopeSettings.groupAssociationAssignedCode] The
   * group association assigned code.
   * @property {string} [envelopeSettings.communicationAgreementId] The
   * communication agreement id.
   * @property {boolean} [envelopeSettings.applyDelimiterStringAdvice] The
   * value indicating whether to apply delimiter string advice.
   * @property {boolean} [envelopeSettings.createGroupingSegments] The value
   * indicating whether to create grouping segments.
   * @property {boolean} [envelopeSettings.enableDefaultGroupHeaders] The value
   * indicating whether to enable default group headers.
   * @property {string} [envelopeSettings.recipientReferencePasswordValue] The
   * recipient reference password value.
   * @property {string} [envelopeSettings.recipientReferencePasswordQualifier]
   * The recipient reference password qualifier.
   * @property {string} [envelopeSettings.applicationReferenceId] The
   * application reference id.
   * @property {string} [envelopeSettings.processingPriorityCode] The
   * processing priority code.
   * @property {number} [envelopeSettings.interchangeControlNumberLowerBound]
   * The interchange control number lower bound.
   * @property {number} [envelopeSettings.interchangeControlNumberUpperBound]
   * The interchange control number upper bound.
   * @property {boolean} [envelopeSettings.rolloverInterchangeControlNumber]
   * The value indicating whether to rollover interchange control number.
   * @property {string} [envelopeSettings.interchangeControlNumberPrefix] The
   * interchange control number prefix.
   * @property {string} [envelopeSettings.interchangeControlNumberSuffix] The
   * interchange control number suffix.
   * @property {string} [envelopeSettings.senderReverseRoutingAddress] The
   * sender reverse routing address.
   * @property {string} [envelopeSettings.receiverReverseRoutingAddress] The
   * receiver reverse routing address.
   * @property {string} [envelopeSettings.functionalGroupId] The functional
   * group id.
   * @property {string} [envelopeSettings.groupControllingAgencyCode] The group
   * controlling agency code.
   * @property {string} [envelopeSettings.groupMessageVersion] The group
   * message version.
   * @property {string} [envelopeSettings.groupMessageRelease] The group
   * message release.
   * @property {number} [envelopeSettings.groupControlNumberLowerBound] The
   * group control number lower bound.
   * @property {number} [envelopeSettings.groupControlNumberUpperBound] The
   * group control number upper bound.
   * @property {boolean} [envelopeSettings.rolloverGroupControlNumber] The
   * value indicating whether to rollover group control number.
   * @property {string} [envelopeSettings.groupControlNumberPrefix] The group
   * control number prefix.
   * @property {string} [envelopeSettings.groupControlNumberSuffix] The group
   * control number suffix.
   * @property {string} [envelopeSettings.groupApplicationReceiverQualifier]
   * The group application receiver qualifier.
   * @property {string} [envelopeSettings.groupApplicationReceiverId] The group
   * application receiver id.
   * @property {string} [envelopeSettings.groupApplicationSenderQualifier] The
   * group application sender qualifier.
   * @property {string} [envelopeSettings.groupApplicationSenderId] The group
   * application sender id.
   * @property {string} [envelopeSettings.groupApplicationPassword] The group
   * application password.
   * @property {boolean}
   * [envelopeSettings.overwriteExistingTransactionSetControlNumber] The value
   * indicating whether to overwrite existing transaction set control number.
   * @property {string} [envelopeSettings.transactionSetControlNumberPrefix]
   * The transaction set control number prefix.
   * @property {string} [envelopeSettings.transactionSetControlNumberSuffix]
   * The transaction set control number suffix.
   * @property {number}
   * [envelopeSettings.transactionSetControlNumberLowerBound] The transaction
   * set control number lower bound.
   * @property {number}
   * [envelopeSettings.transactionSetControlNumberUpperBound] The transaction
   * set control number upper bound.
   * @property {boolean} [envelopeSettings.rolloverTransactionSetControlNumber]
   * The value indicating whether to rollover transaction set control number.
   * @property {boolean} [envelopeSettings.isTestInterchange] The value
   * indicating whether the message is a test interchange.
   * @property {string} [envelopeSettings.senderInternalIdentification] The
   * sender internal identification.
   * @property {string} [envelopeSettings.senderInternalSubIdentification] The
   * sender internal sub identification.
   * @property {string} [envelopeSettings.receiverInternalIdentification] The
   * receiver internal identification.
   * @property {string} [envelopeSettings.receiverInternalSubIdentification]
   * The receiver internal sub identification.
   * @property {object} acknowledgementSettings The EDIFACT acknowledgement
   * settings.
   * @property {boolean} [acknowledgementSettings.needTechnicalAcknowledgement]
   * The value indicating whether technical acknowledgement is needed.
   * @property {boolean}
   * [acknowledgementSettings.batchTechnicalAcknowledgements] The value
   * indicating whether to batch the technical acknowledgements.
   * @property {boolean}
   * [acknowledgementSettings.needFunctionalAcknowledgement] The value
   * indicating whether functional acknowledgement is needed.
   * @property {boolean}
   * [acknowledgementSettings.batchFunctionalAcknowledgements] The value
   * indicating whether to batch functional acknowledgements.
   * @property {boolean} [acknowledgementSettings.needLoopForValidMessages] The
   * value indicating whether a loop is needed for valid messages.
   * @property {boolean}
   * [acknowledgementSettings.sendSynchronousAcknowledgement] The value
   * indicating whether to send synchronous acknowledgement.
   * @property {string}
   * [acknowledgementSettings.acknowledgementControlNumberPrefix] The
   * acknowledgement control number prefix.
   * @property {string}
   * [acknowledgementSettings.acknowledgementControlNumberSuffix] The
   * acknowledgement control number suffix.
   * @property {number}
   * [acknowledgementSettings.acknowledgementControlNumberLowerBound] The
   * acknowledgement control number lower bound.
   * @property {number}
   * [acknowledgementSettings.acknowledgementControlNumberUpperBound] The
   * acknowledgement control number upper bound.
   * @property {boolean}
   * [acknowledgementSettings.rolloverAcknowledgementControlNumber] The value
   * indicating whether to rollover acknowledgement control number.
   * @property {object} messageFilter The EDIFACT message filter.
   * @property {string} [messageFilter.messageFilterType] The message filter
   * type. Possible values include: 'NotSpecified', 'Include', 'Exclude'
   * @property {object} processingSettings The EDIFACT processing Settings.
   * @property {boolean} [processingSettings.maskSecurityInfo] The value
   * indicating whether to mask security information.
   * @property {boolean} [processingSettings.preserveInterchange] The value
   * indicating whether to preserve interchange.
   * @property {boolean} [processingSettings.suspendInterchangeOnError] The
   * value indicating whether to suspend interchange on error.
   * @property {boolean}
   * [processingSettings.createEmptyXmlTagsForTrailingSeparators] The value
   * indicating whether to create empty xml tags for trailing separators.
   * @property {boolean} [processingSettings.useDotAsDecimalSeparator] The
   * value indicating whether to use dot as decimal separator.
   * @property {array} [envelopeOverrides] The EDIFACT envelope override
   * settings.
   * @property {array} [messageFilterList] The EDIFACT message filter list.
   * @property {array} schemaReferences The EDIFACT schema references.
   * @property {array} [validationOverrides] The EDIFACT validation override
   * settings.
   * @property {array} [edifactDelimiterOverrides] The EDIFACT delimiter
   * override settings.
   */
  constructor() {
  }

  /**
   * Defines the metadata of EdifactProtocolSettings
   *
   * @returns {object} metadata of EdifactProtocolSettings
   *
   */
  mapper() {
    return {
      required: false,
      serializedName: 'EdifactProtocolSettings',
      type: {
        name: 'Composite',
        className: 'EdifactProtocolSettings',
        modelProperties: {
          validationSettings: {
            required: true,
            serializedName: 'validationSettings',
            type: {
              name: 'Composite',
              className: 'EdifactValidationSettings'
            }
          },
          framingSettings: {
            required: true,
            serializedName: 'framingSettings',
            type: {
              name: 'Composite',
              className: 'EdifactFramingSettings'
            }
          },
          envelopeSettings: {
            required: true,
            serializedName: 'envelopeSettings',
            type: {
              name: 'Composite',
              className: 'EdifactEnvelopeSettings'
            }
          },
          acknowledgementSettings: {
            required: true,
            serializedName: 'acknowledgementSettings',
            type: {
              name: 'Composite',
              className: 'EdifactAcknowledgementSettings'
            }
          },
          messageFilter: {
            required: true,
            serializedName: 'messageFilter',
            type: {
              name: 'Composite',
              className: 'EdifactMessageFilter'
            }
          },
          processingSettings: {
            required: true,
            serializedName: 'processingSettings',
            type: {
              name: 'Composite',
              className: 'EdifactProcessingSettings'
            }
          },
          envelopeOverrides: {
            required: false,
            serializedName: 'envelopeOverrides',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'EdifactEnvelopeOverrideElementType',
                  type: {
                    name: 'Composite',
                    className: 'EdifactEnvelopeOverride'
                  }
              }
            }
          },
          messageFilterList: {
            required: false,
            serializedName: 'messageFilterList',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'EdifactMessageIdentifierElementType',
                  type: {
                    name: 'Composite',
                    className: 'EdifactMessageIdentifier'
                  }
              }
            }
          },
          schemaReferences: {
            required: true,
            serializedName: 'schemaReferences',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'EdifactSchemaReferenceElementType',
                  type: {
                    name: 'Composite',
                    className: 'EdifactSchemaReference'
                  }
              }
            }
          },
          validationOverrides: {
            required: false,
            serializedName: 'validationOverrides',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'EdifactValidationOverrideElementType',
                  type: {
                    name: 'Composite',
                    className: 'EdifactValidationOverride'
                  }
              }
            }
          },
          edifactDelimiterOverrides: {
            required: false,
            serializedName: 'edifactDelimiterOverrides',
            type: {
              name: 'Sequence',
              element: {
                  required: false,
                  serializedName: 'EdifactDelimiterOverrideElementType',
                  type: {
                    name: 'Composite',
                    className: 'EdifactDelimiterOverride'
                  }
              }
            }
          }
        }
      }
    };
  }
}

module.exports = EdifactProtocolSettings;
