Exemple #1
0
        /// <summary>
        /// Try to parse the given XML representation of an eMIP heartbeat request.
        /// </summary>
        /// <param name="GetServiceAuthorisationRequestXML">The XML to parse.</param>
        /// <param name="CustomSendGetServiceAuthorisationRequestParser">An optional delegate to parse custom GetServiceAuthorisationRequest XML elements.</param>
        /// <param name="GetServiceAuthorisationRequest">The parsed heartbeat request.</param>
        /// <param name="OnException">An optional delegate called whenever an exception occured.</param>
        ///
        /// <param name="HTTPRequest">The correlated HTTP request of this eMIP request.</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 GetServiceAuthorisationRequestXML,
                                       CustomXMLParserDelegate <GetServiceAuthorisationRequest> CustomSendGetServiceAuthorisationRequestParser,
                                       out GetServiceAuthorisationRequest GetServiceAuthorisationRequest,
                                       OnExceptionDelegate OnException = null,

                                       HTTPRequest HTTPRequest             = null,
                                       DateTime?Timestamp                  = null,
                                       CancellationToken?CancellationToken = null,
                                       EventTracking_Id EventTrackingId    = null,
                                       TimeSpan?RequestTimeout             = null)
        {
            try
            {
                GetServiceAuthorisationRequest = new GetServiceAuthorisationRequest(

                    //ToDo: What to do with: <partnerIdType>eMI3</partnerIdType>?
                    GetServiceAuthorisationRequestXML.MapValueOrFail("partnerId", Partner_Id.Parse),

                    //ToDo: What to do with: <operatorIdType>eMI3</operatorIdType>
                    GetServiceAuthorisationRequestXML.MapValueOrFail("operatorId", Operator_Id.Parse),

                    //ToDo: What to do with: <EVSEIdType>eMI3</EVSEIdType>
                    GetServiceAuthorisationRequestXML.MapValueOrFail("EVSEId", EVSE_Id.Parse),

                    GetServiceAuthorisationRequestXML.MapValueOrFail("userId", s => User_Id.Parse(s,
                                                                                                  GetServiceAuthorisationRequestXML.MapValueOrFail("userIdType", UserIdFormatsExtensions.Parse))),

                    GetServiceAuthorisationRequestXML.MapValueOrFail("requestedServiceId", Service_Id.Parse),
                    GetServiceAuthorisationRequestXML.MapValueOrNullable("transactionId", Transaction_Id.Parse),
                    GetServiceAuthorisationRequestXML.MapValueOrNullable("partnerServiceSessionId", PartnerServiceSession_Id.Parse),

                    HTTPRequest,
                    Timestamp,
                    CancellationToken,
                    EventTrackingId,
                    RequestTimeout

                    );


                if (CustomSendGetServiceAuthorisationRequestParser != null)
                {
                    GetServiceAuthorisationRequest = CustomSendGetServiceAuthorisationRequestParser(GetServiceAuthorisationRequestXML,
                                                                                                    GetServiceAuthorisationRequest);
                }

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

                GetServiceAuthorisationRequest = null;
                return(false);
            }
        }
        /// <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>
        /// Try to parse the given XML representation of an eMIP heartbeat request.
        /// </summary>
        /// <param name="SetServiceAuthorisationRequestXML">The XML to parse.</param>
        /// <param name="CustomSendSetServiceAuthorisationRequestParser">An optional delegate to parse custom SetServiceAuthorisationRequest XML elements.</param>
        /// <param name="CustomMeterReportParser">An optional delegate to parse custom MeterReport XML elements.</param>
        /// <param name="SetServiceAuthorisationRequest">The parsed heartbeat request.</param>
        /// <param name="OnException">An optional delegate called whenever an exception occured.</param>
        /// 
        /// <param name="HTTPRequest">The correlated HTTP request of this eMIP request.</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                                                 SetServiceAuthorisationRequestXML,
                                       CustomXMLParserDelegate<SetServiceAuthorisationRequest>  CustomSendSetServiceAuthorisationRequestParser,
                                       CustomXMLParserDelegate<MeterReport>                     CustomMeterReportParser,
                                       out SetServiceAuthorisationRequest                       SetServiceAuthorisationRequest,
                                       OnExceptionDelegate                                      OnException         = null,

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

            try
            {

                SetServiceAuthorisationRequest = new SetServiceAuthorisationRequest(

                                                     HTTPRequest,

                                                     //ToDo: What to do with: <partnerIdType>eMI3</partnerIdType>?
                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("partnerId",                Partner_Id.Parse),

                                                     //ToDo: What to do with: <operatorIdType>eMI3</operatorIdType>
                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("operatorId",               Operator_Id.Parse),

                                                     //ToDo: What to do with: <targetOperatorIdType>eMI3</targetOperatorIdType>
                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("targetOperatorId",         Operator_Id.Parse),

                                                     //ToDo: What to do with: <EVSEIdType>eMI3</EVSEIdType>
                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("EVSEId",                   EVSE_Id.Parse),

                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("userId",                   s => User_Id.Parse(s,
                                                         SetServiceAuthorisationRequestXML.MapValueOrFail   ("userIdType",               UserIdFormatsExtensions.Parse))),

                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("requestedServiceId",       Service_Id.Parse),
                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("serviceSessionId",         ServiceSession_Id.Parse),
                                                     SetServiceAuthorisationRequestXML.MapValueOrFail       ("authorisationValue",       ConversionMethods.AsRemoteStartStopValue),
                                                     SetServiceAuthorisationRequestXML.MapBooleanOrFail     ("intermediateCDRRequested"),

                                                     SetServiceAuthorisationRequestXML.MapValueOrNullable   ("transactionId",            Transaction_Id.Parse),
                                                     SetServiceAuthorisationRequestXML.MapValueOrNullable   ("userContractIdAlias",      Contract_Id.Parse),

                                                     SetServiceAuthorisationRequestXML.MapElements          ("meterLimitList",
                                                                                                             "meterReport",              xml => MeterReport.Parse(xml,
                                                                                                                                                                  CustomMeterReportParser,
                                                                                                                                                                  OnException)),
                                                     SetServiceAuthorisationRequestXML.ElementValueOrDefault("userContractIdAlias"),
                                                     SetServiceAuthorisationRequestXML.MapValueOrNullable   ("bookingId",                Booking_Id.Parse),

                                                     Timestamp,
                                                     CancellationToken,
                                                     EventTrackingId,
                                                     RequestTimeout

                                                 );


                if (CustomSendSetServiceAuthorisationRequestParser != null)
                    SetServiceAuthorisationRequest = CustomSendSetServiceAuthorisationRequestParser(SetServiceAuthorisationRequestXML,
                                                                                                    SetServiceAuthorisationRequest);

                return true;

            }
            catch (Exception e)
            {

                OnException?.Invoke(DateTime.UtcNow, SetServiceAuthorisationRequestXML, e);

                SetServiceAuthorisationRequest = null;
                return false;

            }

        }
Exemple #4
0
        public async Task UsersAPI_Test01()
        {
            Assert.AreEqual(0, usersAPI.Users.Count());
            Assert.AreEqual(2, usersAPI.Organizations.Count());

            Assert.IsTrue(usersAPI.OrganizationExists(Organization_Id.Parse("NoOwner")));
            Assert.IsTrue(usersAPI.OrganizationExists(Organization_Id.Parse("admins")));


            var result01a = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("apiAdmin01"),
                                                       "API Admin 01",
                                                       SimpleEMailAddress.Parse("*****@*****.**"),
                                                       MobilePhone : PhoneNumber.Parse("+49 170 111111")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsAdmin,
                                                   usersAPI.GetOrganization(Organization_Id.Parse("admins")));

            Assert.IsNotNull(result01a);
            Assert.IsTrue(result01a.IsSuccess);
            Assert.AreEqual(1, usersAPI.Users.Count());

            await usersAPI.AddEMailNotification(result01a.User,
                                                new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });

            await usersAPI.AddSMSNotification(result01a.User,
                                              new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });


            var result01b = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("apiAdmin02"),
                                                       "API Admin 02",
                                                       SimpleEMailAddress.Parse("*****@*****.**")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsAdmin,
                                                   usersAPI.GetOrganization(Organization_Id.Parse("admins")));

            Assert.IsNotNull(result01b);
            Assert.IsTrue(result01b.IsSuccess);
            Assert.AreEqual(2, usersAPI.Users.Count());


            var result01c = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("apiMember01"),
                                                       "API Member 01",
                                                       SimpleEMailAddress.Parse("*****@*****.**"),
                                                       MobilePhone : PhoneNumber.Parse("+49 170 222222")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsMember,
                                                   usersAPI.GetOrganization(Organization_Id.Parse("admins")));

            Assert.IsNotNull(result01c);
            Assert.IsTrue(result01c.IsSuccess);
            Assert.AreEqual(3, usersAPI.Users.Count());

            await usersAPI.AddEMailNotification(result01c.User,
                                                new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });

            await usersAPI.AddSMSNotification(result01c.User,
                                              new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });


            var result01d = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("apiMember02"),
                                                       "API Member 02",
                                                       SimpleEMailAddress.Parse("*****@*****.**")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsMember,
                                                   usersAPI.GetOrganization(Organization_Id.Parse("admins")));

            Assert.IsNotNull(result01d);
            Assert.IsTrue(result01d.IsSuccess);
            Assert.AreEqual(4, usersAPI.Users.Count());


            #region Setup FirstOrg

            var result03 = await usersAPI.AddOrganization(new Organization(
                                                              Organization_Id.Parse("firstOrg"),
                                                              I18NString.Create(Languages.en, "First Organization")
                                                              ),
                                                          ParentOrganization : result01a.Organization);

            Assert.AreEqual(3, usersAPI.Organizations.Count());
            Assert.IsTrue(usersAPI.OrganizationExists(Organization_Id.Parse("firstOrg")));

            var IsChildOrganizationEdge1 = result03.Organization.Organization2OrganizationOutEdges.FirstOrDefault();

            Assert.IsNotNull(IsChildOrganizationEdge1);
            Assert.AreEqual(Organization_Id.Parse("firstOrg"), IsChildOrganizationEdge1.Source.Id);
            Assert.AreEqual(usersAPI.AdminOrganizationId, IsChildOrganizationEdge1.Target.Id);


            var result04a = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("firstOrgAdmin01"),
                                                       "First Org Admin 01",
                                                       SimpleEMailAddress.Parse("*****@*****.**"),
                                                       MobilePhone : PhoneNumber.Parse("+49 170 333333")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsAdmin,
                                                   result03.Organization);

            Assert.IsNotNull(result04a);
            Assert.IsTrue(result04a.IsSuccess);
            Assert.AreEqual(5, usersAPI.Users.Count());

            await usersAPI.AddEMailNotification(result04a.User,
                                                new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });

            await usersAPI.AddSMSNotification(result04a.User,
                                              new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });


            var result04b = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("firstOrgAdmin02"),
                                                       "First Org Admin 02",
                                                       SimpleEMailAddress.Parse("*****@*****.**")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsAdmin,
                                                   result03.Organization);

            Assert.IsNotNull(result04b);
            Assert.IsTrue(result04b.IsSuccess);
            Assert.AreEqual(6, usersAPI.Users.Count());


            var result04c = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("firstOrgMember01"),
                                                       "First Org Member 01",
                                                       SimpleEMailAddress.Parse("*****@*****.**"),
                                                       MobilePhone : PhoneNumber.Parse("+49 170 444444")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsMember,
                                                   result03.Organization);


            Assert.IsNotNull(result04c);
            Assert.IsTrue(result04c.IsSuccess);
            Assert.AreEqual(7, usersAPI.Users.Count());

            await usersAPI.AddEMailNotification(result04c.User,
                                                new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });

            await usersAPI.AddSMSNotification(result04c.User,
                                              new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });


            var result04d = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("firstOrgMember02"),
                                                       "First Org Member 02",
                                                       SimpleEMailAddress.Parse("*****@*****.**")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsMember,
                                                   result03.Organization);

            Assert.IsNotNull(result04d);
            Assert.IsTrue(result04d.IsSuccess);
            Assert.AreEqual(8, usersAPI.Users.Count());

            #endregion

            #region Setup SecondOrg

            var result13 = await usersAPI.AddOrganization(new Organization(
                                                              Organization_Id.Parse("secondOrg"),
                                                              I18NString.Create(Languages.en, "Second Organization")
                                                              ),
                                                          ParentOrganization : result03.Organization);

            Assert.AreEqual(4, usersAPI.Organizations.Count());
            Assert.IsTrue(usersAPI.OrganizationExists(Organization_Id.Parse("secondOrg")));

            var IsChildOrganizationEdge2 = result13.Organization.Organization2OrganizationOutEdges.FirstOrDefault();

            Assert.IsNotNull(IsChildOrganizationEdge2);
            Assert.AreEqual(Organization_Id.Parse("secondOrg"), IsChildOrganizationEdge2.Source.Id);
            Assert.AreEqual(Organization_Id.Parse("firstOrg"), IsChildOrganizationEdge2.Target.Id);


            var result14a = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("secondOrgAdmin01"),
                                                       "Second Org Admin 01",
                                                       SimpleEMailAddress.Parse("*****@*****.**"),
                                                       MobilePhone : PhoneNumber.Parse("+49 170 555555")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsAdmin,
                                                   result13.Organization);

            Assert.IsNotNull(result14a);
            Assert.IsTrue(result14a.IsSuccess);
            Assert.AreEqual(9, usersAPI.Users.Count());

            await usersAPI.AddEMailNotification(result14a.User,
                                                new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });

            await usersAPI.AddSMSNotification(result14a.User,
                                              new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });


            var result14b = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("secondOrgAdmin02"),
                                                       "Second Org Admin 02",
                                                       SimpleEMailAddress.Parse("*****@*****.**")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsAdmin,
                                                   result13.Organization);

            Assert.IsNotNull(result14b);
            Assert.IsTrue(result14b.IsSuccess);
            Assert.AreEqual(10, usersAPI.Users.Count());


            var result14c = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("secondOrgMember01"),
                                                       "Second Org Member 01",
                                                       SimpleEMailAddress.Parse("*****@*****.**"),
                                                       MobilePhone : PhoneNumber.Parse("+49 170 666666")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsMember,
                                                   result13.Organization);


            Assert.IsNotNull(result14c);
            Assert.IsTrue(result14c.IsSuccess);
            Assert.AreEqual(11, usersAPI.Users.Count());

            await usersAPI.AddEMailNotification(result14c.User,
                                                new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });

            await usersAPI.AddSMSNotification(result14c.User,
                                              new NotificationMessageType[] {
                UsersAPI.addUser_MessageType,
                UsersAPI.updateUser_MessageType,
                UsersAPI.deleteUser_MessageType,

                UsersAPI.addUserToOrganization_MessageType,
                UsersAPI.removeUserFromOrganization_MessageType,

                UsersAPI.addOrganization_MessageType,
                UsersAPI.updateOrganization_MessageType,
                UsersAPI.deleteOrganization_MessageType,

                UsersAPI.linkOrganizations_MessageType,
                UsersAPI.unlinkOrganizations_MessageType
            });


            var result14d = await usersAPI.AddUser(new User(
                                                       User_Id.Parse("secondOrgMember02"),
                                                       "Second Org Member 02",
                                                       SimpleEMailAddress.Parse("*****@*****.**")
                                                       ),
                                                   User2OrganizationEdgeLabel.IsMember,
                                                   result13.Organization);

            Assert.IsNotNull(result14d);
            Assert.IsTrue(result14d.IsSuccess);
            Assert.AreEqual(12, usersAPI.Users.Count());

            #endregion


            Assert.IsTrue(nullMailer.EMails.Any(), "Not a single notification e-mail was sent!");

            var maxEMailSubjectLength = nullMailer.EMails.Max(emailEnvelope => emailEnvelope.Mail.Subject.Length);
            var allEMailNotifications = nullMailer.EMails.Select(emailEnvelope => emailEnvelope.Mail.Subject.PadRight(maxEMailSubjectLength + 2) + " => " + emailEnvelope.RcptTo.Select(email => email.Address).OrderBy(_ => _).AggregateWith(", ")).ToArray();
            var eMailOverview         = allEMailNotifications.AggregateWith(Environment.NewLine);

            // User 'API Admin 02' was successfully created.                                            => [email protected]
            // User 'API Admin 02' was added to organization 'Admins' as admin.                         => [email protected]
            // User 'API Member 01' was successfully created.                                           => [email protected]
            // User 'API Member 01' was added to organization 'Admins' as member.                       => [email protected]
            // User 'API Member 02' was successfully created.                                           => [email protected], [email protected]
            // User 'API Member 02' was added to organization 'Admins' as member.                       => [email protected], [email protected]
            //
            // Organization 'First Organization' was successfully created.                              => [email protected], [email protected]
            // Organization 'First Organization' was linked to organization 'Admins'.                   => [email protected], [email protected]
            // User 'First Org Admin 01' was successfully created.                                      => [email protected], [email protected]
            // User 'First Org Admin 01' was added to organization 'First Organization' as admin.       => [email protected], [email protected]
            // User 'First Org Admin 02' was successfully created.                                      => [email protected], [email protected], [email protected]
            // User 'First Org Admin 02' was added to organization 'First Organization' as admin.       => [email protected], [email protected], [email protected]
            // User 'First Org Member 01' was successfully created.                                     => [email protected], [email protected], [email protected]
            // User 'First Org Member 01' was added to organization 'First Organization' as member.     => [email protected], [email protected], [email protected]
            // User 'First Org Member 02' was successfully created.                                     => [email protected], [email protected], [email protected], [email protected]
            // User 'First Org Member 02' was added to organization 'First Organization' as member.     => [email protected], [email protected], [email protected], [email protected]
            //
            // Organization 'Second Organization' was successfully created.                             => [email protected], [email protected], [email protected], [email protected]
            // Organization 'Second Organization' was linked to organization 'First Organization'.      => [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Admin 01' was successfully created.                                     => [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Admin 01' was added to organization 'Second Organization' as admin.     => [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Admin 02' was successfully created.                                     => [email protected], [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Admin 02' was added to organization 'Second Organization' as admin.     => [email protected], [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Member 01' was successfully created.                                    => [email protected], [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Member 01' was added to organization 'Second Organization' as member.   => [email protected], [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Member 02' was successfully created.                                    => [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
            // User 'Second Org Member 02' was added to organization 'Second Organization' as member.   => [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]


            Assert.IsTrue(nullSMSClient.SMSs.Any(), "Not a single notification SMS was sent!");

            var maxSMSMessageLength = nullSMSClient.SMSs.Max(sms => sms.Text.Length);
            var allSMSNotifications = nullSMSClient.SMSs.Select(sms => sms.Text.PadRight(maxSMSMessageLength + 2) + " => " + sms.Receivers.OrderBy(_ => _).AggregateWith(", ")).ToArray();
            var smsOverview         = allSMSNotifications.AggregateWith(Environment.NewLine);

            // |-- 160 characters --------------------------------------------------------------------------------------------------------------------------------------------|
            // User 'API Admin 02' was successfully added. https://example.cloud/users/apiAdmin02                           => +49 170 111111
            // User 'API Admin 02' was added to organization 'Admins' as admin.                                             => +49 170 111111
            // User 'API Member 01' was successfully added. https://example.cloud/users/apiMember01                         => +49 170 111111
            // User 'API Member 01' was added to organization 'Admins' as member.                                           => +49 170 111111
            // User 'API Member 02' was successfully added. https://example.cloud/users/apiMember02                         => +49 170 111111, +49 170 222222
            // User 'API Member 02' was added to organization 'Admins' as member.                                           => +49 170 111111, +49 170 222222
            //
            // Organization 'First Organization' was successfully created. https://example.cloud/organizations/firstOrg     => +49 170 111111, +49 170 222222
            // Organization 'First Organization' was linked to organization 'Admins'.                                       => +49 170 111111, +49 170 222222
            // User 'First Org Admin 01' was successfully added. https://example.cloud/users/firstOrgAdmin01                => +49 170 111111, +49 170 222222
            // User 'First Org Admin 01' was added to organization 'First Organization' as admin.                           => +49 170 111111, +49 170 222222
            // User 'First Org Admin 02' was successfully added. https://example.cloud/users/firstOrgAdmin02                => +49 170 111111, +49 170 222222, +49 170 333333
            // User 'First Org Admin 02' was added to organization 'First Organization' as admin.                           => +49 170 111111, +49 170 222222, +49 170 333333
            // User 'First Org Member 01' was successfully added. https://example.cloud/users/firstOrgMember01              => +49 170 111111, +49 170 222222, +49 170 333333
            // User 'First Org Member 01' was added to organization 'First Organization' as member.                         => +49 170 111111, +49 170 222222, +49 170 333333
            // User 'First Org Member 02' was successfully added. https://example.cloud/users/firstOrgMember02              => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444
            // User 'First Org Member 02' was added to organization 'First Organization' as member.                         => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444
            //
            // Organization 'Second Organization' was successfully created. https://example.cloud/organizations/secondOrg   => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444
            // Organization 'Second Organization' was linked to organization 'First Organization'.                          => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444
            // User 'Second Org Admin 01' was successfully added. https://example.cloud/users/secondOrgAdmin01              => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444
            // User 'Second Org Admin 01' was added to organization 'Second Organization' as admin.                         => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444
            // User 'Second Org Admin 02' was successfully added. https://example.cloud/users/secondOrgAdmin02              => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444, +49 170 555555
            // User 'Second Org Admin 02' was added to organization 'Second Organization' as admin.                         => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444, +49 170 555555
            // User 'Second Org Member 01' was successfully added. https://example.cloud/users/secondOrgMember01            => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444, +49 170 555555
            // User 'Second Org Member 01' was added to organization 'Second Organization' as member.                       => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444, +49 170 555555
            // User 'Second Org Member 02' was successfully added. https://example.cloud/users/secondOrgMember02            => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444, +49 170 555555, +49 170 666666
            // User 'Second Org Member 02' was added to organization 'Second Organization' as member.                       => +49 170 111111, +49 170 222222, +49 170 333333, +49 170 444444, +49 170 555555, +49 170 666666
        }