/// <summary>
        /// Create an OICP PushEVSEData XML/SOAP request.
        /// </summary>
        /// <param name="OperatorEVSEData">An operator EVSE data.</param>
        /// <param name="Action">The server-side data management operation.</param>
        ///
        /// <param name="Timestamp">The optional timestamp of the request.</param>
        /// <param name="CancellationToken">An optional token to cancel this request.</param>
        /// <param name="EventTrackingId">An optional event tracking identification for correlating this request with other events.</param>
        /// <param name="RequestTimeout">An optional timeout for this request.</param>
        public PushEVSEDataRequest(OperatorEVSEData OperatorEVSEData,
                                   ActionTypes Action = ActionTypes.fullLoad,

                                   DateTime?Timestamp = null,
                                   CancellationToken?CancellationToken = null,
                                   EventTracking_Id EventTrackingId    = null,
                                   TimeSpan?RequestTimeout             = null)

            : base(Timestamp,
                   CancellationToken,
                   EventTrackingId,
                   RequestTimeout)

        {
            #region Initial checks

            if (OperatorEVSEData == null)
            {
                throw new ArgumentNullException(nameof(OperatorEVSEData), "The given operator EVSE data must not be null!");
            }

            #endregion

            this.OperatorEVSEData = OperatorEVSEData;
            this.Action           = Action;
        }
 /// <summary>
 /// Return the HashCode of this object.
 /// </summary>
 /// <returns>The HashCode of this object.</returns>
 public override Int32 GetHashCode()
 {
     unchecked
     {
         return(OperatorEVSEData.GetHashCode() * 3 ^
                Action.GetHashCode());
     }
 }
        /// <summary>
        /// Compares two push EVSE data requests for equality.
        /// </summary>
        /// <param name="PushEVSEData">An push EVSE data request to compare with.</param>
        /// <returns>True if both match; False otherwise.</returns>
        public override Boolean Equals(PushEVSEDataRequest PushEVSEData)
        {
            if ((Object)PushEVSEData == null)
            {
                return(false);
            }

            return(OperatorEVSEData.Equals(PushEVSEData.OperatorEVSEData) &&
                   Action.Equals(PushEVSEData.Action));
        }
        PushEVSEData(this ICPOClient ICPOClient,
                     OperatorEVSEData OperatorEVSEData,
                     ActionTypes Action = ActionTypes.fullLoad,

                     DateTime?Timestamp = null,
                     CancellationToken?CancellationToken = null,
                     EventTracking_Id EventTrackingId    = null,
                     TimeSpan?RequestTimeout             = null)


        => ICPOClient.PushEVSEData(new PushEVSEDataRequest(OperatorEVSEData,
                                                           Action,

                                                           Timestamp,
                                                           CancellationToken,
                                                           EventTrackingId,
                                                           RequestTimeout ?? ICPOClient.RequestTimeout));
        /// <summary>
        /// Try to parse the given XML representation of an OICP push EVSE data request.
        /// </summary>
        /// <param name="PushEVSEDataXML">The XML to parse.</param>
        /// <param name="PushEVSEData">The parsed push EVSE data request.</param>
        /// <param name="CustomOperatorEVSEDataParser">A delegate to parse custom OperatorEVSEData XML elements.</param>
        /// <param name="CustomEVSEDataRecordParser">A delegate to parse custom EVSEDataRecord XML elements.</param>
        /// <param name="OnException">An optional delegate called whenever an exception occured.</param>
        ///
        /// <param name="Timestamp">The optional timestamp of the request.</param>
        /// <param name="CancellationToken">An optional token to cancel this request.</param>
        /// <param name="EventTrackingId">An optional event tracking identification for correlating this request with other events.</param>
        /// <param name="RequestTimeout">An optional timeout for this request.</param>
        public static Boolean TryParse(XElement PushEVSEDataXML,
                                       out PushEVSEDataRequest PushEVSEData,
                                       CustomXMLParserDelegate <OperatorEVSEData> CustomOperatorEVSEDataParser = null,
                                       CustomXMLParserDelegate <EVSEDataRecord> CustomEVSEDataRecordParser     = null,
                                       OnExceptionDelegate OnException = null,

                                       DateTime?Timestamp = null,
                                       CancellationToken?CancellationToken = null,
                                       EventTracking_Id EventTrackingId    = null,
                                       TimeSpan?RequestTimeout             = null)
        {
            try
            {
                if (PushEVSEDataXML.Name != OICPNS.EVSEData + "eRoamingPushEvseData")
                {
                    PushEVSEData = null;
                    return(false);
                }

                PushEVSEData = new PushEVSEDataRequest(

                    OperatorEVSEData.Parse(PushEVSEDataXML.ElementOrFail(OICPNS.EVSEData + "OperatorEvseData"),
                                           CustomOperatorEVSEDataParser,
                                           CustomEVSEDataRecordParser),

                    PushEVSEDataXML.MapValueOrFail(OICPNS.EVSEData + "ActionType",
                                                   ActionTypesExtentions.Parse),

                    Timestamp,
                    CancellationToken,
                    EventTrackingId,
                    RequestTimeout

                    );

                return(true);
            }
            catch (Exception e)
            {
                OnException?.Invoke(DateTime.UtcNow, PushEVSEDataXML, e);

                PushEVSEData = null;
                return(false);
            }
        }
        /// <summary>
        /// Return a XML representation of this object.
        /// </summary>
        /// <param name="CustomPushEVSEDataRequestSerializer">A delegate to customize the serialization of PushEVSEData requests.</param>
        /// <param name="OperatorEVSEDataXName">The OperatorEVSEData XML name to use.</param>
        /// <param name="CustomOperatorEVSEDataSerializer">A delegate to serialize custom OperatorEVSEData XML elements.</param>
        /// <param name="EVSEDataRecordXName">The EVSEDataRecord XML name to use.</param>
        /// <param name="IncludeEVSEDataRecordMetadata">Include EVSEDataRecord deltaType and lastUpdate meta data.</param>
        /// <param name="CustomEVSEDataRecordSerializer">A delegate to serialize custom EVSEDataRecord XML elements.</param>
        public XElement ToXML(CustomXMLSerializerDelegate <PushEVSEDataRequest> CustomPushEVSEDataRequestSerializer = null,
                              XName OperatorEVSEDataXName = null,
                              CustomXMLSerializerDelegate <OperatorEVSEData> CustomOperatorEVSEDataSerializer = null,
                              XName EVSEDataRecordXName             = null,
                              Boolean IncludeEVSEDataRecordMetadata = true,
                              CustomXMLSerializerDelegate <EVSEDataRecord> CustomEVSEDataRecordSerializer = null)

        {
            var XML = new XElement(OICPNS.EVSEData + "eRoamingPushEvseData",

                                   new XElement(OICPNS.EVSEData + "ActionType", Action.AsString()),

                                   OperatorEVSEData.ToXML(OperatorEVSEDataXName,
                                                          CustomOperatorEVSEDataSerializer,
                                                          EVSEDataRecordXName,
                                                          IncludeEVSEDataRecordMetadata,
                                                          CustomEVSEDataRecordSerializer)

                                   );

            return(CustomPushEVSEDataRequestSerializer != null
                       ? CustomPushEVSEDataRequestSerializer(this, XML)
                       : XML);
        }