/// <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);
        }
Esempio n. 2
0
        /// <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);
        }