/******************************************************************************
* Copyright (c) 2000-2019  Ericsson AB
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
*   Gabor Szalai - initial implementation and initial documentation
******************************************************************************/
//
//  File:               TS32291_Nchf_ConvergedCharging.ttcn
//  Description:	      Type definitions for 3GPP TS32291
/////////////////////////////////////////////// 
module TS32291_Nchf_ConvergedCharging {

  import from TS29571_CommonData all

external function f_enc_ChargingDataRequest(in ChargingDataRequest pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_ChargingDataRequest(in octetstring stream, out ChargingDataRequest pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_ChargingDataResponse(in ChargingDataResponse pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_ChargingDataResponse(in octetstring stream, out ChargingDataResponse pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }

external function f_enc_ChargingNotification(in ChargingNotification pdu) return octetstring 
with { extension "prototype(convert) encode(JSON)" }

external function f_dec_ChargingNotification(in octetstring stream, out ChargingNotification pdu) return integer 
with { extension "prototype(backtrack) decode(JSON)" }


  type set ChargingDataRequest {
    TS29571_CommonData.Supi    subscriberIdentifier optional,
    NFConsumerIdentification    nfConsumerIdentification,
    TS29571_CommonData.DateTime    invocationTimeStamp,
    TS29571_CommonData.Uint32    invocationSequenceNumber,
    TS29571_CommonData.Uri    notifyUri optional,
    set of       MultipleUnitUsage    multipleUnitUsage optional,
    set of       Trigger    triggers optional,
    PDUSessionChargingInformation    pDUSessionChargingInformation optional,
    RoamingQBCInformation    roamingQBCInformation optional
  }

  type set ChargingDataResponse {
    TS29571_CommonData.DateTime    invocationTimeStamp,
    TS29571_CommonData.Uint32    invocationSequenceNumber,
    InvocationResult    invocationResult,
    SessionFailover    sessionFailover optional,
    set of       MultipleQuotaInformation    multipleQuotaInformation optional,
    set of       Trigger    triggers optional,
    PDUSessionChargingInformation    pDUSessionChargingInformation optional,
    RoamingQBCInformation    roamingQBCInformation optional
  }

  type set ChargingNotification {
    NotificationType    notificationType,
    set of       ReauthorizationDetails    reauthorizationDetails optional
  }

  type set NFConsumerIdentification {
    TS29571_CommonData.NfInstanceId    nFName,
    TS29571_CommonData.Ipv4Addr    nFIPv4Address,
    TS29571_CommonData.Ipv6Addr    nFIPv6Address,
    TS29571_CommonData.PlmnId    nFPLMNID optional,
    NodeFunctionality    nodeFunctionality
  }

  type set MultipleUnitUsage {
    RatingGroupId    ratingGroup,
    RequestedUnit    requestedUnit optional,
    set of       UsedUnitContainer    UsedUnitContainer optional,
    TS29571_CommonData.NfInstanceId    uPFID optional
  }

  type set InvocationResult {
    TS29571_CommonData.ProblemDetails    error_,
    FailureHandling    failureHandling optional
  } with {
    variant (error_) "name as 'error'"
  }

  type set Trigger {
    TriggerType    triggerType,
    TriggerCategory    category optional,
    TS29571_CommonData.DurationSec    timeLimit optional,
    TS29571_CommonData.Uint32    volumeLimit optional,
    TS29571_CommonData.Uint32    maxNumberOfccc optional
  }

  type set MultipleQuotaInformation {
    ResultCode    resultCode optional,
    RatingGroupId    ratingGroup,
    GrantedUnit    grantedUnit optional,
    set of       Trigger    triggers optional,
    TS29571_CommonData.DateTime    validityTime optional,
    TS29571_CommonData.DurationSec    quotaHoldingTime optional,
    FinalUnitIndication    finalUnitIndication optional,
    integer timeQuotaThreshold optional,
    integer volumeQuotaThreshold optional,
    integer unitQuotaThreshold optional,
    TS29571_CommonData.NfInstanceId    uPFID optional
  }

  type set RequestedUnit {
    TS29571_CommonData.Uint32    time optional,
    TS29571_CommonData.Uint64    totalVolume optional,
    TS29571_CommonData.Uint64    uplinkVolume optional,
    TS29571_CommonData.Uint64    downlinkVolume optional,
    TS29571_CommonData.Uint64    serviceSpecificUnits optional
  }

  type set UsedUnitContainer {
    ServiceId    serviceId optional,
    QuotaManagementIndicator    quotaManagementIndicator optional,
    set of       Trigger    triggers optional,
    TS29571_CommonData.DateTime    triggerTimestamp optional,
    TS29571_CommonData.Uint32    time optional,
    TS29571_CommonData.Uint64    totalVolume optional,
    TS29571_CommonData.Uint64    uplinkVolume optional,
    TS29571_CommonData.Uint64    downlinkVolume optional,
    TS29571_CommonData.Uint64    serviceSpecificUnits optional,
    TS29571_CommonData.DateTime    eventTimeStamps optional,
    integer localSequenceNumber,
    PDUContainerInformation    pDUContainerInformation optional
  }

  type set GrantedUnit {
    TS29571_CommonData.DateTime    tariffTimeChange optional,
    TS29571_CommonData.Uint32    time optional,
    TS29571_CommonData.Uint64    totalVolume optional,
    TS29571_CommonData.Uint64    uplinkVolume optional,
    TS29571_CommonData.Uint64    downlinkVolume optional,
    TS29571_CommonData.Uint64    serviceSpecificUnits optional
  }

  type set FinalUnitIndication {
    FinalUnitAction    finalUnitAction,
    IPFilterRule    restrictionFilterRule optional,
    charstring filterId optional,
    RedirectServer    redirectServer optional
  }

  type set RedirectServer {
    RedirectAddressType    redirectAddressType,
    charstring redirectServerAddress
  }

  type set ReauthorizationDetails {
    ServiceId    serviceIdentifier optional,
    RatingGroupId    ratingGroup,
    QuotaManagementIndicator    quotaManagementIndicator optional
  }

  type set PDUSessionChargingInformation {
    charstring chargingId optional,
    UserInformation    userInformation,
    TS29571_CommonData.UserLocation    userLocationinfo optional,
    TS29571_CommonData.DateTime    userLocationTime optional,
    set of record {
      universal charstring key,
      TS29571_CommonData.PresenceInfo    additionalProperties
    } presenceReportingAreaInformation optional,
    TS29571_CommonData.TimeZone    uetimeZone optional,
    PDUSessionInformation    pduSessionInformation,
    TS29571_CommonData.DurationSec    unusedQuotaTimer optional
  } with {
    variant (presenceReportingAreaInformation) "as map"
  }


  type set UserInformation {
    TS29571_CommonData.Gpsi    servedGPSI,
    TS29571_CommonData.Pei    servedPEI optional,
    boolean unauthenticatedFlag optional,
    RoamerInOut    roamerInOut optional
  }

  type set PDUSessionInformation {
    NetworkSlicingInfo    networkSlicingInfo optional,
    TS29571_CommonData.PduSessionId    pduSessionID,
    TS29571_CommonData.PduSessionType    pduType optional,
    TS29571_CommonData.SscMode    sscMode optional,
    TS29571_CommonData.PlmnId    hPlmnId optional,
    set of       TS29571_CommonData.AmfId    servingNodeID optional,
    ServingNetworkFunctionID    servingNetworkFunctionID optional,
    TS29571_CommonData.RatType    ratType optional,
    charstring dnnId,
    charstring chargingCharacteristics optional,
    ChargingCharacteristicsSelectionMode    chargingCharacteristicsSelectionMode optional,
    TS29571_CommonData.DateTime    startTime optional,
    TS29571_CommonData.DateTime    stopTime optional,
    ThreeGPPPSDataOffStatus    threegppPSDataOffStatus optional,
    boolean sessionStopIndicator optional,
    PDUAddress    pduAddress optional,
    Diagnostics    diagnostics optional,
    TS29571_CommonData.DefaultQosInformation    qoSInformation optional,
    TS29571_CommonData.PlmnId    servingCNPlmnId optional
  } with {
    variant (threegppPSDataOffStatus) "name as '3gppPSDataOffStatus'"
  }


  type set PDUContainerInformation {
    TS29571_CommonData.DateTime    timeofFirstUsage optional,
    TS29571_CommonData.DateTime    timeofLastUsage optional,
    TS29571_CommonData.DefaultQosInformation    qoSInformation optional,
    charstring aFCorrelationInformation optional,
    TS29571_CommonData.UserLocation    userLocationInformation optional,
    TS29571_CommonData.TimeZone    uetimeZone optional,
    TS29571_CommonData.RatType    rATType optional,
    set of       TS29571_CommonData.AmfId    servingNodeID optional,
    set of record {
      universal charstring key,
      TS29571_CommonData.PresenceInfo    additionalProperties
    } presenceReportingAreaInformation optional,
    ThreeGPPPSDataOffStatus    threegppPSDataOffStatus optional,
    charstring sponsorIdentity optional,
    charstring applicationserviceProviderIdentity optional,
    charstring chargingRuleBaseName optional
  } with {
    variant (presenceReportingAreaInformation) "as map"
    variant (threegppPSDataOffStatus) "name as '3gppPSDataOffStatus'"
  }


  type set NetworkSlicingInfo {
    TS29571_CommonData.Snssai    sNSSAI
  }

  type set PDUAddress {
    TS29571_CommonData.Ipv4Addr    pduIPv4Address optional,
    TS29571_CommonData.Ipv6Addr    pduIPv6Address optional,
    integer pduAddressprefixlength optional,
    boolean IPv4dynamicAddressFlag optional,
    boolean IPv6dynamicAddressFlag optional
  }

  type set ServingNetworkFunctionID {
    charstring servingNetworkFunctionName optional,
    charstring servingNetworkFunctionInstanceid optional
  }

  type set RoamingQBCInformation {
    set of       MultipleQFIcontainer    multipleQFIcontainer optional,
    TS29571_CommonData.NfInstanceId    uPFID optional,
    RoamingChargingProfile    roamingChargingProfile optional
  }

  type set MultipleQFIcontainer {
    set of       Trigger    triggers optional,
    TS29571_CommonData.DateTime    triggerTimestamp optional,
    TS29571_CommonData.Uint32    time optional,
    TS29571_CommonData.Uint64    totalVolume optional,
    TS29571_CommonData.Uint64    uplinkVolume optional,
    integer localSequenceNumber,
    QFIContainerInformation    qFIContainerInformation optional
  }

  type set QFIContainerInformation {
    TS29571_CommonData.Qfi    qFI optional,
    TS29571_CommonData.DateTime    timeofFirstUsage optional,
    TS29571_CommonData.DateTime    timeofLastUsage optional,
    TS29571_CommonData.DefaultQosInformation    qoSInformation optional,
    TS29571_CommonData.UserLocation    userLocationInformation optional,
    TS29571_CommonData.TimeZone    uetimeZone optional,
    set of record {
      universal charstring key,
      TS29571_CommonData.PresenceInfo    additionalProperties
    } presenceReportingAreaInformation optional,
    TS29571_CommonData.RatType    rATType optional,
    set of       TS29571_CommonData.AmfId    servingNetworkFunctionID optional,
    ThreeGPPPSDataOffStatus    threegppPSDataOffStatus optional
  } with {
    variant (presenceReportingAreaInformation) "as map"
    variant (threegppPSDataOffStatus) "name as '3gppPSDataOffStatus'"
  }

  type set RoamingChargingProfile {
    set of       Trigger    triggers optional,
    PartialRecordMethod    partialRecordMethod optional
  }

  type integer RatingGroupId

  type integer ServiceId

  type integer Diagnostics

  type charstring IPFilterRule

  type enumerated NotificationType_enum { REAUTHORIZATION, ABORT_CHARGING}

  type union NotificationType {
    NotificationType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated NodeFunctionality_enum { SMF}

  type union NodeFunctionality {
    NodeFunctionality_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated ChargingCharacteristicsSelectionMode_enum { HOME_DEFAULT, ROAMING_DEFAULT, VISITING_DEFAULT}

  type union ChargingCharacteristicsSelectionMode {
    ChargingCharacteristicsSelectionMode_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated TriggerType_enum { QUOTA_THRESHOLD, QHT, FINAL, QUOTA_EXHAUSTED, VALIDITY_TIME, OTHER_QUOTA_TYPE, FORCED_REAUTHORISATION, UNUSED_QUOTA_TIMER, ABNORMAL_RELEASE, QOS_CHANGE, VOLUME_LIMIT, TIME_LIMIT, PLMN_CHANGE, USER_LOCATION_CHANGE, RAT_CHANGE, UE_TIMEZONE_CHANGE, TARIFF_TIME_CHANGE, MAX_NUMBER_OF_CHANGES_IN_CHARGING_CONDITIONS, MANAGEMENT_INTERVENTION, CHANGE_OF_UE_PRESENCE_IN_PRESENCE_REPORTING_AREA, CHANGE_OF_3GPP_PS_DATA_OFF_STATUS, SERVING_NODE_CHANGE, REMOVAL_OF_UPF, ADDITION_OF_UPF}

  type union TriggerType {
    TriggerType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated FinalUnitAction_enum { TERMINATE, REDIRECT, RESTRICT_ACCESS}

  type union FinalUnitAction {
    FinalUnitAction_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated RedirectAddressType_enum { IPV4, IPV6, URL}

  type union RedirectAddressType {
    RedirectAddressType_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated TriggerCategory_enum { IMMEDIATE_REPORT, DEFERRED_REPORT}

  type union TriggerCategory {
    TriggerCategory_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated QuotaManagementIndicator_enum { ONLINE_CHARGING, OFFLINE_CHARGING}

  type union QuotaManagementIndicator {
    QuotaManagementIndicator_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated FailureHandling_enum { TERMINATE, CONTINUE, RETRY_AND_TERMINATE}

  type union FailureHandling {
    FailureHandling_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated SessionFailover_enum { FAILOVER_NOT_SUPPORTED, FAILOVER_SUPPORTED}

  type union SessionFailover {
    SessionFailover_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated ThreeGPPPSDataOffStatus_enum { ACTIVE, INACTIVE}

  type union ThreeGPPPSDataOffStatus {
    ThreeGPPPSDataOffStatus_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated ResultCode_enum { END_USER_SERVICE_DENIED, CREDIT_CONTROL_NOT_APPLICABLE, CREDIT_LIMIT_REACHED, AUTHORIZATION_REJECTED, USER_UNKNOWN, RATING_FAILED}

  type union ResultCode {
    ResultCode_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated PartialRecordMethod_enum { DEFAULT, INDIVIDUAL}

  type union PartialRecordMethod {
    PartialRecordMethod_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }


  type enumerated RoamerInOut_enum { IN_BOUND, OUT_BOUND}

  type union RoamerInOut {
    RoamerInOut_enum  enum_val,
    charstring           other_val
  } with {
    variant "JSON: as value"
  }






} with {
  encode "JSON"
}
