/// <summary>
        /// Create the <see cref="ActualFiniteState"/>s for a <see cref="ActualFiniteStateList"/>
        /// </summary>
        /// <param name="pslCollection">The ordered collection of <see cref="PossibleFiniteStateList"/></param>
        /// <param name="pslIndex">The index of the <see cref="PossibleFiniteStateList"/> in the collection to process</param>
        /// <param name="possibleStateIds">The current collection of <see cref="Guid"/> to use for the <see cref="ActualFiniteState"/> to create</param>
        /// <param name="container">The <see cref="ActualFiniteStateList"/></param>
        /// <param name="transaction">The current <see cref="NpgsqlTransaction"/></param>
        /// <param name="partition">The partition in the database</param>
        /// <param name="oldActualStates">The old <see cref="ActualFiniteState"/></param>
        /// <param name="newOldStateMap">The resulting map that links the new to old <see cref="ActualFiniteState"/></param>
        private void CreateActualStates(IReadOnlyList <PossibleFiniteStateList> pslCollection, int pslIndex, IEnumerable <Guid> possibleStateIds, ActualFiniteStateList container, NpgsqlTransaction transaction, string partition, IReadOnlyList <ActualFiniteState> oldActualStates, ref Dictionary <ActualFiniteState, ActualFiniteState> newOldStateMap)
        {
            var currentPossibleStateIds = possibleStateIds == null ? new List <Guid>() : possibleStateIds.ToList();

            // build the different PossibleStates combination taken from the PossibleFiniteStateLists and create an ActualState for each of these combinations
            foreach (var orderedItem in pslCollection[pslIndex].PossibleState.OrderBy(x => x.K))
            {
                var newPossibleStateIds = currentPossibleStateIds.ToList();
                newPossibleStateIds.Add(Guid.Parse(orderedItem.V.ToString()));

                // Last PossibleFiniteStateList in the ordered collection
                if (pslIndex == pslCollection.Count - 1)
                {
                    // create actual state
                    var newActualstate = new ActualFiniteState(Guid.NewGuid(), 1);
                    newActualstate.PossibleState.AddRange(newPossibleStateIds);

                    this.ActualFiniteStateService.CreateConcept(transaction, partition, newActualstate, container);

                    var oldActualState =
                        oldActualStates.FirstOrDefault(x => x.PossibleState.All(ps => newPossibleStateIds.Contains(ps)));

                    newActualstate.Kind = oldActualState?.Kind ?? ActualFiniteStateKind.MANDATORY;

                    newOldStateMap.Add(newActualstate, oldActualState);
                    continue;
                }

                this.CreateActualStates(pslCollection, pslIndex + 1, newPossibleStateIds, container, transaction, partition, oldActualStates, ref newOldStateMap);
            }
        }
        /// <summary>
        /// Instantiate and deserialize the properties of a <paramref name="ActualFiniteState"/>
        /// </summary>
        /// <param name="jObject">The <see cref="JObject"/> containing the data</param>
        /// <returns>The <see cref="ActualFiniteState"/> to instantiate</returns>
        public static CDP4Common.DTO.ActualFiniteState FromJsonObject(JObject jObject)
        {
            var iid               = jObject["iid"].ToObject <Guid>();
            var revisionNumber    = jObject["revisionNumber"].IsNullOrEmpty() ? 0 : jObject["revisionNumber"].ToObject <int>();
            var actualFiniteState = new CDP4Common.DTO.ActualFiniteState(iid, revisionNumber);

            if (!jObject["excludedDomain"].IsNullOrEmpty())
            {
                actualFiniteState.ExcludedDomain.AddRange(jObject["excludedDomain"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["excludedPerson"].IsNullOrEmpty())
            {
                actualFiniteState.ExcludedPerson.AddRange(jObject["excludedPerson"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["kind"].IsNullOrEmpty())
            {
                actualFiniteState.Kind = jObject["kind"].ToObject <ActualFiniteStateKind>();
            }

            if (!jObject["modifiedOn"].IsNullOrEmpty())
            {
                actualFiniteState.ModifiedOn = jObject["modifiedOn"].ToObject <DateTime>();
            }

            if (!jObject["possibleState"].IsNullOrEmpty())
            {
                actualFiniteState.PossibleState.AddRange(jObject["possibleState"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["thingPreference"].IsNullOrEmpty())
            {
                actualFiniteState.ThingPreference = jObject["thingPreference"].ToObject <string>();
            }

            return(actualFiniteState);
        }