public static void Session_SerializeDeserialize_Test01() { #region Define Session1 var Session1 = new Session( CountryCode.Parse("DE"), Party_Id.Parse("GEF"), Session_Id.Parse("Session0001"), DateTime.Parse("2020-08-21T00:00:00.000Z"), // Start 1.11M, // KWh new CDRToken( Token_Id.Parse("1234"), TokenTypes.RFID, Contract_Id.Parse("Contract0815") ), AuthMethods.AUTH_REQUEST, Location_Id.Parse("LOC0001"), EVSE_UId.Parse("EVSE0001"), Connector_Id.Parse("C1"), Currency.EUR, SessionStatusTypes.ACTIVE, DateTime.Parse("2020-08-22T00:00:00.000Z"), // End AuthorizationReference.Parse("Auth1234"), Meter_Id.Parse("Meter0001"), // OCPI Computer Science Extentions new EnergyMeter( Meter_Id.Parse("Meter0815"), "EnergyMeter Model #1", "hw. v1.80", "fw. v1.20", "Energy Metering Services", null, null ), // OCPI Computer Science Extentions new TransparencySoftware[] { new TransparencySoftware( "Chargy Transparency Software Desktop Application", "v1.00", LegalStatus.LegallyBinding, OpenSourceLicenses.GPL3, "GraphDefined GmbH", URL.Parse("https://open.charging.cloud/logo.svg"), URL.Parse("https://open.charging.cloud/Chargy/howto"), URL.Parse("https://open.charging.cloud/Chargy"), URL.Parse("https://github.com/OpenChargingCloud/ChargyDesktopApp") ), new TransparencySoftware( "Chargy Transparency Software Mobile Application", "v1.00", LegalStatus.ForInformationOnly, OpenSourceLicenses.GPL3, "GraphDefined GmbH", URL.Parse("https://open.charging.cloud/logo.svg"), URL.Parse("https://open.charging.cloud/Chargy/howto"), URL.Parse("https://open.charging.cloud/Chargy"), URL.Parse("https://github.com/OpenChargingCloud/ChargyMobileApp") ) }, new ChargingPeriod[] { new ChargingPeriod( DateTime.Parse("2020-04-12T18:21:49Z"), new CDRDimension[] { new CDRDimension( CDRDimensions.ENERGY, 1.33M ) }, Tariff_Id.Parse("DE*GEF*T0001") ), new ChargingPeriod( DateTime.Parse("2020-04-12T18:21:50Z"), new CDRDimension[] { new CDRDimension( CDRDimensions.TIME, 5.12M ) }, Tariff_Id.Parse("DE*GEF*T0002") ) }, // Total Costs new Price( 1.12, 2.24 ), DateTime.Parse("2020-09-21T00:00:00.000Z") ); #endregion var JSON = Session1.ToJSON(); Assert.AreEqual("DE", JSON["country_code"].Value <String>()); Assert.AreEqual("GEF", JSON["party_id"].Value <String>()); Assert.AreEqual("Session0001", JSON["id"].Value <String>()); Assert.AreEqual("2020-08-21T00:00:00.000Z", JSON["start_date_time"].Value <String>()); Assert.AreEqual("2020-08-22T00:00:00.000Z", JSON["end_date_time"].Value <String>()); Assert.AreEqual(1.11, JSON["kwh"].Value <Decimal>()); Assert.AreEqual("1234", JSON["cdr_token"]["uid"].Value <String>()); Assert.AreEqual("RFID", JSON["cdr_token"]["type"].Value <String>()); Assert.AreEqual("Contract0815", JSON["cdr_token"]["contract_id"].Value <String>()); Assert.AreEqual("AUTH_REQUEST", JSON["auth_method"].Value <String>()); Assert.AreEqual("Auth1234", JSON["authorization_reference"].Value <String>()); Assert.AreEqual("LOC0001", JSON["location_id"].Value <String>()); Assert.AreEqual("EVSE0001", JSON["evse_uid"].Value <String>()); Assert.AreEqual("C1", JSON["connector_id"].Value <String>()); Assert.AreEqual("Meter0001", JSON["meter_id"].Value <String>()); Assert.AreEqual("EUR", JSON["currency"].Value <String>()); //Assert.AreEqual("Stadtwerke Jena-Ost", JSON["charging_periods"]["xxx"].Value<String>()); Assert.AreEqual(1.12, JSON["total_cost"]["excl_vat"].Value <Decimal>()); Assert.AreEqual(2.24, JSON["total_cost"]["incl_vat"].Value <Decimal>()); Assert.AreEqual("ACTIVE", JSON["status"].Value <String>()); Assert.AreEqual("2020-09-21T00:00:00.000Z", JSON["last_updated"].Value <String>()); Assert.IsTrue(Session.TryParse(JSON, out Session Session2, out String ErrorResponse)); Assert.IsNull(ErrorResponse); Assert.AreEqual(Session1.CountryCode, Session2.CountryCode); Assert.AreEqual(Session1.PartyId, Session2.PartyId); Assert.AreEqual(Session1.Id, Session2.Id); Assert.AreEqual(Session1.Start.ToIso8601(), Session2.Start.ToIso8601()); Assert.AreEqual(Session1.End.Value.ToIso8601(), Session2.End.Value.ToIso8601()); Assert.AreEqual(Session1.kWh, Session2.kWh); Assert.AreEqual(Session1.CDRToken, Session2.CDRToken); Assert.AreEqual(Session1.AuthMethod, Session2.AuthMethod); Assert.AreEqual(Session1.AuthorizationReference, Session2.AuthorizationReference); Assert.AreEqual(Session1.LocationId, Session2.LocationId); Assert.AreEqual(Session1.EVSEUId, Session2.EVSEUId); Assert.AreEqual(Session1.ConnectorId, Session2.ConnectorId); Assert.AreEqual(Session1.MeterId, Session2.MeterId); Assert.AreEqual(Session1.EnergyMeter, Session2.EnergyMeter); Assert.AreEqual(Session1.TransparencySoftwares, Session2.TransparencySoftwares); Assert.AreEqual(Session1.Currency, Session2.Currency); Assert.AreEqual(Session1.ChargingPeriods, Session2.ChargingPeriods); Assert.AreEqual(Session1.TotalCosts, Session2.TotalCosts); Assert.AreEqual(Session1.Status, Session2.Status); Assert.AreEqual(Session1.LastUpdated.ToIso8601(), Session2.LastUpdated.ToIso8601()); }
/// <summary> /// The CDR object describes the Charging Session and its costs. /// How these costs are build up etc. /// </summary> /// <param name="Id">Uniquely identifies the CDR within the CPOs platform (and suboperator platforms).</param> /// <param name="Start">The time when the CDR became active.</param> /// <param name="End">The time when the CDR is completed.</param> /// <param name="AuthId">An id provided by the authentication used so that the eMSP knows to which driver the CDR belongs.</param> /// <param name="AuthMethod">Method used for authentication.</param> /// <param name="Dimensions">List of relevant values for this charging period.</param> /// <param name="Location">The location where this CDR took place.</param> /// <param name="EVSE">The EVSE that was used for this CDR.</param> /// <param name="ConnectorId">Connector ID of the connector used at the EVSE.</param> /// <param name="MeterId">Optional identification of the kWh meter.</param> /// <param name="Currency">ISO 4217 code of the currency used for this CDR.</param> /// <param name="Tariffs">Enumeration of relevant tariffs.</param> /// <param name="ChargingPeriods">Enumeration of charging periods that make up this charging session. A session consist of 1 or more periodes with, each period has a different relevant Tariff.</param> /// <param name="TotalCosts">The total cost (excluding VAT) of the CDR in the specified currency. This is the price that the eMSP will have to pay to the CPO.</param> /// <param name="Remark">Optional remark, can be used to provide addition human readable information to the CDR, for example: reason why a transaction was stopped.</param> public CDR(CDR_Id Id, DateTime Start, DateTime?End, Auth_Id AuthId, AuthMethodType AuthMethod, IEnumerable <CDRDimension> Dimensions, Location Location, EVSE EVSE, Connector_Id ConnectorId, Meter_Id MeterId, Currency Currency, IEnumerable <Tariff> Tariffs, IEnumerable <ChargingPeriod> ChargingPeriods, Decimal TotalCosts, I18NString Remark) : base(Id) { #region Initial checks if (AuthId == null) { throw new ArgumentNullException("AuthId", "The given parameter must not be null!"); } if (Dimensions == null) { throw new ArgumentNullException("Dimensions", "The given parameter must not be null!"); } if (!Dimensions.Any()) { throw new ArgumentNullException("Dimensions", "The given enumeration must not be empty!"); } if (Location == null) { throw new ArgumentNullException("Location", "The given parameter must not be null!"); } if (EVSE == null) { throw new ArgumentNullException("EVSE", "The given parameter must not be null!"); } if (ConnectorId == null) { throw new ArgumentNullException("ConnectorId", "The given parameter must not be null!"); } if (MeterId == null) { throw new ArgumentNullException("MeterId", "The given parameter must not be null!"); } if (Currency == null) { throw new ArgumentNullException("Currency", "The given parameter must not be null!"); } if (ChargingPeriods == null) { throw new ArgumentNullException("ChargingPeriods", "The given parameter must not be null!"); } if (!ChargingPeriods.Any()) { throw new ArgumentNullException("ChargingPeriods", "The given enumeration must not be empty!"); } #endregion #region Init data and properties this._Start = Start; this._End = End; this._AuthId = AuthId; this._AuthMethod = AuthMethod; this._Dimensions = Dimensions; this._Location = Location; this._EVSE = EVSE; this._ConnectorId = ConnectorId; this._MeterId = MeterId; this._Currency = Currency; this._Tariffs = Tariffs; this._ChargingPeriods = ChargingPeriods; this._TotalCosts = TotalCosts; this._Remark = Remark != null ? Remark : new I18NString(); #endregion }
/// <summary> /// The Session object describes the Session and its properties /// where a group of EVSEs that belong together are installed. /// </summary> /// <param name="Id">Uniquely identifies the Session within the CPOs platform (and suboperator platforms).</param> /// <param name="Start">The time when the session became active.</param> /// <param name="End">The time when the session is completed.</param> /// <param name="kWh">How many kWh are charged.</param> /// <param name="AuthId">An id provided by the authentication used so that the eMSP knows to which driver the session belongs.</param> /// <param name="AuthMethod">Method used for authentication.</param> /// <param name="Location">The location where this session took place.</param> /// <param name="EVSE">The EVSE that was used for this session.</param> /// <param name="ConnectorId">Connector ID of the connector used at the EVSE.</param> /// <param name="MeterId">Optional identification of the kWh meter.</param> /// <param name="Currency">ISO 4217 code of the currency used for this session.</param> /// <param name="ChargingPeriods">An optional enumeration of charging periods that can be used to calculate and verify the total cost.</param> /// <param name="TotalCosts">The total cost (excluding VAT) of the session in the specified currency. This is the price that the eMSP will have to pay to the CPO.</param> /// <param name="Status">The status of the session.</param> public Session(Session_Id Id, DateTime Start, DateTime?End, Decimal kWh, Auth_Id AuthId, AuthMethodType AuthMethod, Location Location, EVSE EVSE, Connector_Id ConnectorId, Meter_Id MeterId, Currency Currency, IEnumerable <ChargingPeriod> ChargingPeriods, Decimal TotalCosts, SessionStatusType Status) : base(Id) { #region Initial checks if (AuthId == null) { throw new ArgumentNullException("AuthId", "The given parameter must not be null!"); } if (Location == null) { throw new ArgumentNullException("Location", "The given parameter must not be null!"); } if (EVSE == null) { throw new ArgumentNullException("EVSE", "The given parameter must not be null!"); } if (ConnectorId == null) { throw new ArgumentNullException("ConnectorId", "The given parameter must not be null!"); } if (MeterId == null) { throw new ArgumentNullException("MeterId", "The given parameter must not be null!"); } if (Currency == null) { throw new ArgumentNullException("Currency", "The given parameter must not be null!"); } #endregion #region Init data and properties this._Start = Start; this._End = End; this._kWh = kWh; this._AuthId = AuthId; this._AuthMethod = AuthMethod; this._Location = Location; this._EVSE = EVSE; this._ConnectorId = ConnectorId; this._MeterId = MeterId; this._Currency = Currency; this._ChargingPeriods = ChargingPeriods; this._TotalCosts = TotalCosts; this._Status = Status; #endregion }
public static void CDR_SerializeDeserialize_Test01() { #region Defined CDR1 var CDR1 = new CDR(CountryCode.Parse("DE"), Party_Id.Parse("GEF"), CDR_Id.Parse("CDR0001"), DateTime.Parse("2020-04-12T18:20:19Z"), DateTime.Parse("2020-04-12T22:20:19Z"), new CDRToken( Token_Id.Parse("1234"), TokenTypes.RFID, Contract_Id.Parse("C1234") ), AuthMethods.AUTH_REQUEST, new CDRLocation( Location_Id.Parse("LOC0001"), "Biberweg 18", "Jena", "Deutschland", GeoCoordinate.Parse(10, 20), EVSE_UId.Parse("DE*GEF*E*LOC0001*1"), EVSE_Id.Parse("DE*GEF*E*LOC0001*1"), Connector_Id.Parse("1"), ConnectorTypes.IEC_62196_T2, ConnectorFormats.SOCKET, PowerTypes.AC_3_PHASE, "Name?", "07749" ), Currency.EUR, new ChargingPeriod[] { new ChargingPeriod( DateTime.Parse("2020-04-12T18:21:49Z"), new CDRDimension[] { new CDRDimension( CDRDimensions.ENERGY, 1.33M ) }, Tariff_Id.Parse("DE*GEF*T0001") ), new ChargingPeriod( DateTime.Parse("2020-04-12T18:21:50Z"), new CDRDimension[] { new CDRDimension( CDRDimensions.TIME, 5.12M ) }, Tariff_Id.Parse("DE*GEF*T0002") ) }, // Total costs new Price( 10.00, 11.60 ), // Total Energy 50.00M, // Total time TimeSpan.FromMinutes(30), Session_Id.Parse("0815"), AuthorizationReference.Parse("Auth0815"), Meter_Id.Parse("Meter0815"), // OCPI Computer Science Extentions new EnergyMeter( Meter_Id.Parse("Meter0815"), "EnergyMeter Model #1", "hw. v1.80", "fw. v1.20", "Energy Metering Services", null, null ), // OCPI Computer Science Extentions new TransparencySoftware[] { new TransparencySoftware( "Chargy Transparency Software Desktop Application", "v1.00", LegalStatus.LegallyBinding, OpenSourceLicenses.GPL3, "GraphDefined GmbH", URL.Parse("https://open.charging.cloud/logo.svg"), URL.Parse("https://open.charging.cloud/Chargy/howto"), URL.Parse("https://open.charging.cloud/Chargy"), URL.Parse("https://github.com/OpenChargingCloud/ChargyDesktopApp") ), new TransparencySoftware( "Chargy Transparency Software Mobile Application", "v1.00", LegalStatus.ForInformationOnly, OpenSourceLicenses.GPL3, "GraphDefined GmbH", URL.Parse("https://open.charging.cloud/logo.svg"), URL.Parse("https://open.charging.cloud/Chargy/howto"), URL.Parse("https://open.charging.cloud/Chargy"), URL.Parse("https://github.com/OpenChargingCloud/ChargyMobileApp") ) }, new Tariff[] { new Tariff( CountryCode.Parse("DE"), Party_Id.Parse("GEF"), Tariff_Id.Parse("TARIFF0001"), Currency.EUR, new TariffElement[] { new TariffElement( new PriceComponent[] { PriceComponent.ChargingTime( TimeSpan.FromSeconds(300), 2.00M, 0.10M ) }, new TariffRestrictions [] { new TariffRestrictions( Time.FromHourMin(08, 00), // Start time Time.FromHourMin(18, 00), // End time DateTime.Parse("2020-12-01"), // Start timestamp DateTime.Parse("2020-12-31"), // End timestamp 1.12M, // MinkWh 5.67M, // MaxkWh 1.34M, // MinCurrent 8.89M, // MaxCurrent 1.49M, // MinPower 9.91M, // MaxPower TimeSpan.FromMinutes(10), // MinDuration TimeSpan.FromMinutes(30), // MaxDuration new DayOfWeek[] { DayOfWeek.Monday, DayOfWeek.Tuesday }, ReservationRestrictionTypes.RESERVATION ) } ) }, TariffTypes.PROFILE_GREEN, new DisplayText[] { new DisplayText(Languages.de, "Hallo Welt!"), new DisplayText(Languages.en, "Hello world!"), }, URL.Parse("https://open.charging.cloud"), new Price( // Min Price 1.10, 1.26 ), new Price( // Max Price 2.20, 2.52 ), DateTime.Parse("2020-12-01"), // Start timestamp DateTime.Parse("2020-12-31"), // End timestamp new EnergyMix( true, new EnergySource[] { new EnergySource( EnergySourceCategories.SOLAR, 80 ), new EnergySource( EnergySourceCategories.WIND, 20 ) }, new EnvironmentalImpact[] { new EnvironmentalImpact( EnvironmentalImpactCategories.CARBON_DIOXIDE, 0.1 ) }, "Stadtwerke Jena-Ost", "New Green Deal" ), DateTime.Parse("2020-09-22") ) }, new SignedData( EncodingMethod.GraphDefiened, new SignedValue[] { new SignedValue( SignedValueNature.START, "PlainStartValue", "SignedStartValue" ), new SignedValue( SignedValueNature.INTERMEDIATE, "PlainIntermediateValue", "SignedIntermediateValue" ), new SignedValue( SignedValueNature.END, "PlainEndValue", "SignedEndValue" ) }, 1, // Encoding method version null, // Public key "https://open.charging.cloud/pools/1/stations/1/evse/1/publicKey" ), // Total Fixed Costs new Price( 20.00, 23.10 ), // Total Energy Cost new Price( 20.00, 23.10 ), // Total Time Cost new Price( 20.00, 23.10 ), // Total Parking Time TimeSpan.FromMinutes(120), // Total Parking Cost new Price( 20.00, 23.10 ), // Total Reservation Cost new Price( 20.00, 23.10 ), "Remark!", InvoiceReference_Id.Parse("Invoice:0815"), true, // IsCredit CreditReference_Id.Parse("Credit:0815"), DateTime.Parse("2020-09-12") ); #endregion var JSON = CDR1.ToJSON(); Assert.AreEqual("DE", JSON["country_code"].Value <String>()); Assert.AreEqual("GEF", JSON["party_id"].Value <String>()); Assert.AreEqual("CDR0001", JSON["id"].Value <String>()); Assert.IsTrue(CDR.TryParse(JSON, out CDR CDR2, out String ErrorResponse)); Assert.IsNull(ErrorResponse); Assert.AreEqual(CDR1.CountryCode, CDR2.CountryCode); Assert.AreEqual(CDR1.PartyId, CDR2.PartyId); Assert.AreEqual(CDR1.Id, CDR2.Id); Assert.AreEqual(CDR1.Start.ToIso8601(), CDR2.Start.ToIso8601()); Assert.AreEqual(CDR1.End.ToIso8601(), CDR2.End.ToIso8601()); Assert.AreEqual(CDR1.CDRToken, CDR2.CDRToken); Assert.AreEqual(CDR1.AuthMethod, CDR2.AuthMethod); Assert.AreEqual(CDR1.Location, CDR2.Location); Assert.AreEqual(CDR1.Currency, CDR2.Currency); Assert.AreEqual(CDR1.ChargingPeriods, CDR2.ChargingPeriods); Assert.AreEqual(CDR1.TotalCosts, CDR2.TotalCosts); Assert.AreEqual(CDR1.TotalEnergy, CDR2.TotalEnergy); Assert.AreEqual(CDR1.TotalTime, CDR2.TotalTime); Assert.AreEqual(CDR1.SessionId, CDR2.SessionId); Assert.AreEqual(CDR1.AuthorizationReference, CDR2.AuthorizationReference); Assert.AreEqual(CDR1.MeterId, CDR2.MeterId); Assert.AreEqual(CDR1.EnergyMeter, CDR2.EnergyMeter); Assert.AreEqual(CDR1.TransparencySoftwares, CDR2.TransparencySoftwares); Assert.AreEqual(CDR1.Tariffs, CDR2.Tariffs); Assert.AreEqual(CDR1.SignedData, CDR2.SignedData); Assert.AreEqual(CDR1.TotalFixedCosts, CDR2.TotalFixedCosts); Assert.AreEqual(CDR1.TotalEnergyCost, CDR2.TotalEnergyCost); Assert.AreEqual(CDR1.TotalTimeCost, CDR2.TotalTimeCost); Assert.AreEqual(CDR1.TotalParkingTime, CDR2.TotalParkingTime); Assert.AreEqual(CDR1.TotalParkingCost, CDR2.TotalParkingCost); Assert.AreEqual(CDR1.TotalReservationCost, CDR2.TotalReservationCost); Assert.AreEqual(CDR1.Remark, CDR2.Remark); Assert.AreEqual(CDR1.InvoiceReferenceId, CDR2.InvoiceReferenceId); Assert.AreEqual(CDR1.Credit, CDR2.Credit); Assert.AreEqual(CDR1.CreditReferenceId, CDR2.CreditReferenceId); Assert.AreEqual(CDR1.LastUpdated.ToIso8601(), CDR2.LastUpdated.ToIso8601()); }