public static IList <CardHistoryData> ToJavaScriptCardHistory(IList <StoredEvent> storedEvents)
        {
            HistoryData = new List <CardHistoryData>();
            CardHistoryDeserializer(storedEvents);

            var sorted = HistoryData.OrderBy(c => c.When);
            var list   = new List <CardHistoryData>();
            var last   = new CardHistoryData();

            foreach (var change in sorted)
            {
                var jsSlot = new CardHistoryData
                {
                    Id = change.Id == Guid.Empty.ToString() || change.Id == last.Id
                        ? ""
                        : change.Id,
                    IdCardType = string.IsNullOrWhiteSpace(change.IdCardType) || change.IdCardType == last.IdCardType
                        ? ""
                        : change.IdCardType,
                    IdCustomer = string.IsNullOrWhiteSpace(change.IdCustomer) || change.IdCardType == last.IdCustomer
                        ? ""
                        : change.IdCustomer,
                    IdBrand = string.IsNullOrWhiteSpace(change.IdBrand) || change.IdBrand == last.IdBrand
                        ? ""
                        : change.IdBrand,
                    CardNumber = string.IsNullOrWhiteSpace(change.CardNumber) || change.CardNumber == last.CardNumber
                        ? ""
                        : change.CardNumber,
                    ExpirationDate = string.IsNullOrWhiteSpace(change.ExpirationDate) || change.ExpirationDate == last.ExpirationDate
                        ? ""
                        : change.ExpirationDate,
                    HasPassword = string.IsNullOrWhiteSpace(change.HasPassword) || change.HasPassword == last.HasPassword
                        ? ""
                        : change.HasPassword,
                    Password = string.IsNullOrWhiteSpace(change.Password) || change.Password == last.Password
                        ? ""
                        : change.Password,
                    Limit = string.IsNullOrWhiteSpace(change.Limit) || change.Limit == last.Limit
                        ? ""
                        : change.Limit,
                    LimitAvailable = string.IsNullOrWhiteSpace(change.LimitAvailable) || change.LimitAvailable == last.LimitAvailable
                        ? ""
                        : change.LimitAvailable,
                    Attempts = string.IsNullOrWhiteSpace(change.Attempts) || change.Attempts == last.Attempts
                        ? ""
                        : change.Attempts,
                    Blocked = string.IsNullOrWhiteSpace(change.Blocked) || change.Blocked == last.Blocked
                        ? ""
                        : change.Blocked,
                    Action = string.IsNullOrWhiteSpace(change.Action) ? "" : change.Action,
                    When   = change.When,
                    Who    = change.Who
                };

                list.Add(jsSlot);
                last = change;
            }
            return(list);
        }
        private static void CardHistoryDeserializer(IEnumerable <StoredEvent> storedEvents)
        {
            foreach (var e in storedEvents)
            {
                var     slot = new CardHistoryData();
                dynamic values;

                switch (e.MessageType)
                {
                case "CardRegisteredEvent":
                    values              = JsonConvert.DeserializeObject <dynamic>(e.Data);
                    slot.IdCardType     = values["IdCardType"];
                    slot.IdCustomer     = values["IdCustomer"];
                    slot.IdBrand        = values["IdBrand"];
                    slot.CardNumber     = values["CardNumber"];
                    slot.ExpirationDate = values["ExpirationDate"];
                    slot.HasPassword    = values["HasPassword"];
                    slot.Password       = values["Password"];
                    slot.Limit          = values["Limit"];
                    slot.LimitAvailable = values["LimitAvailable"];
                    slot.Attempts       = values["Attempts"];
                    slot.Blocked        = values["Blocked"];
                    slot.Action         = "Registered";
                    slot.When           = values["Timestamp"];
                    slot.Id             = values["Id"];
                    slot.Who            = e.User;
                    break;

                case "CardUpdatedEvent":
                    values              = JsonConvert.DeserializeObject <dynamic>(e.Data);
                    slot.IdCardType     = values["IdCardType"];
                    slot.IdCustomer     = values["IdCustomer"];
                    slot.IdBrand        = values["IdBrand"];
                    slot.CardNumber     = values["CardNumber"];
                    slot.ExpirationDate = values["ExpirationDate"];
                    slot.HasPassword    = values["HasPassword"];
                    slot.Password       = values["Password"];
                    slot.Limit          = values["Limit"];
                    slot.LimitAvailable = values["LimitAvailable"];
                    slot.Attempts       = values["Attempts"];
                    slot.Blocked        = values["Blocked"];
                    slot.Action         = "Updated";
                    slot.When           = values["Timestamp"];
                    slot.Id             = values["Id"];
                    slot.Who            = e.User;
                    break;

                case "CardRemovedEvent":
                    values      = JsonConvert.DeserializeObject <dynamic>(e.Data);
                    slot.Action = "Removed";
                    slot.When   = values["Timestamp"];
                    slot.Id     = values["Id"];
                    slot.Who    = e.User;
                    break;
                }
                HistoryData.Add(slot);
            }
        }