/// <summary> /// Try to parse the given XML representation of an OIOI ChargeDetailRecord. /// </summary> /// <param name="ChargeDetailRecordXML">The XML to parse.</param> /// <param name="ChargeDetailRecord">The parsed charge detail record.</param> /// <param name="CustomChargeDetailRecordParser">An optional delegate to parse custom ChargeDetailRecord XML elements.</param> /// <param name="CustomMeterReportParser">An optional delegate to parse custom MeterReport XML elements.</param> /// <param name="OnException">An optional delegate called whenever an exception occured.</param> public static Boolean TryParse(XElement ChargeDetailRecordXML, out ChargeDetailRecord ChargeDetailRecord, CustomXMLParserDelegate <ChargeDetailRecord> CustomChargeDetailRecordParser = null, CustomXMLParserDelegate <MeterReport> CustomMeterReportParser = null, OnExceptionDelegate OnException = null) { try { ChargeDetailRecord = new ChargeDetailRecord( ChargeDetailRecordXML.MapValueOrFail("CDRNature", ConversionMethods.AsCDRNature), ChargeDetailRecordXML.MapValueOrFail("serviceSessionId", ServiceSession_Id.Parse), ChargeDetailRecordXML.MapValueOrFail("requestedServiceId", Service_Id.Parse), ChargeDetailRecordXML.MapValueOrFail("EVSEId", EVSE_Id.Parse), ChargeDetailRecordXML.MapValueOrFail("userId", s => User_Id.Parse(s, ChargeDetailRecordXML.MapValueOrFail("userIdType", UserIdFormatsExtensions.Parse))), ChargeDetailRecordXML.MapValueOrFail("startTime", DateTime.Parse), ChargeDetailRecordXML.MapValueOrFail("endTime", DateTime.Parse), ChargeDetailRecordXML.MapValueOrNullable("userContractIdAlias", Contract_Id.Parse), ChargeDetailRecordXML.MapValueOrNullable("execPartnerSessionId", ServiceSession_Id.Parse), ChargeDetailRecordXML.MapValueOrNullable("execPartnerOperatorId", Operator_Id.Parse), ChargeDetailRecordXML.MapValueOrNullable("salePartnerSessionId", ServiceSession_Id.Parse), ChargeDetailRecordXML.MapValueOrNullable("salePartnerOperatorId", Provider_Id.Parse), ChargeDetailRecordXML.MapValueOrNullable("partnerProductId", PartnerProduct_Id.Parse), ChargeDetailRecordXML.MapElements("meterReportList", "meterReport", (s, e) => MeterReport.Parse(s, CustomMeterReportParser, e), OnException) ); if (CustomChargeDetailRecordParser != null) { ChargeDetailRecord = CustomChargeDetailRecordParser(ChargeDetailRecordXML, ChargeDetailRecord); } return(true); } catch (Exception e) { OnException?.Invoke(DateTime.UtcNow, ChargeDetailRecordXML, e); } ChargeDetailRecord = null; return(false); }
/// <summary> /// Convert a WWCP charge detail record into a corresponding eMIP charge detail record. /// </summary> /// <param name="ChargeDetailRecord">A WWCP charge detail record.</param> /// <param name="WWCPChargeDetailRecord2ChargeDetailRecord">A delegate which allows you to modify the convertion from WWCP charge detail records to eMIP charge detail records.</param> public static ChargeDetailRecord ToEMIP(this WWCP.ChargeDetailRecord ChargeDetailRecord, CPO.WWCPChargeDetailRecord2ChargeDetailRecordDelegate WWCPChargeDetailRecord2ChargeDetailRecord = null) { var CDR = new ChargeDetailRecord( CDRNature: CDRNatures.Final, ServiceSessionId: ServiceSession_Id.Parse(ChargeDetailRecord.SessionId.ToString()), RequestedServiceId: Service_Id.GenericChargeService, EVSEId: ChargeDetailRecord.EVSEId.Value.ToEMIP().Value, UserId: ChargeDetailRecord.AuthenticationStart.ToEMIP().Value, StartTime: ChargeDetailRecord.SessionTime.StartTime, EndTime: ChargeDetailRecord.SessionTime.EndTime.Value, UserContractIdAlias: null, ExecPartnerSessionId: null, ExecPartnerOperatorId: null, SalesPartnerSessionId: null, //ChargeDetailRecord.GetCustomDataAs<PartnerSession_Id?>("eMIP.PartnerSessionId"), SalesPartnerOperatorId: null, PartnerProductId: ChargeDetailRecord.ChargingProduct?.Id.ToEMIP(), MeterReports: new MeterReport[] { MeterReport.Create(ChargeDetailRecord.Duration.HasValue ? ChargeDetailRecord.Duration.Value.TotalMinutes.ToString("0.##").Replace(',', '.') : (ChargeDetailRecord.EnergyMeteringValues.Last().Timestamp - ChargeDetailRecord.EnergyMeteringValues.First().Timestamp).TotalMinutes.ToString("0.##").Replace(',', '.'), "min", MeterTypes.TotalDuration), MeterReport.Create(ChargeDetailRecord.ConsumedEnergy.HasValue ? ChargeDetailRecord.ConsumedEnergy.Value.ToString("0.##").Replace(',', '.') : (ChargeDetailRecord.EnergyMeteringValues.Last().Value - ChargeDetailRecord.EnergyMeteringValues.First().Value).ToString("0.##").Replace(',', '.'), "kWh", MeterTypes.TotalEnergy), }, InternalData: new Dictionary <String, Object> { { WWCP_CDR, ChargeDetailRecord } }); if (WWCPChargeDetailRecord2ChargeDetailRecord != null) { CDR = WWCPChargeDetailRecord2ChargeDetailRecord(ChargeDetailRecord, CDR); } return(CDR); }