public static Model.ConnectionInfo FromDataModel(Core.Data.ConnectionInfo s, bool isVerboseMode, Model.CoreReferenceData refData)
        {
            if (s == null)
            {
                return(null);
            }

            var connectionInfo = new Model.ConnectionInfo()
            {
                ID        = s.Id,
                Reference = s.Reference,
                Amps      = s.Amps,
                Voltage   = s.Voltage,
                PowerKW   = s.PowerKw,
                Quantity  = s.Quantity,
                Comments  = s.Comments
            };

            //connection type (full object or id only)
            connectionInfo.ConnectionTypeID = s.ConnectionTypeId;

            if (isVerboseMode)
            {
                connectionInfo.ConnectionType = refData.ConnectionTypes.FirstOrDefault(c => c.ID == s.ConnectionTypeId);
            }


            //status type (full object or id only)
            connectionInfo.StatusTypeID = s.StatusTypeId;
            if (isVerboseMode)
            {
                connectionInfo.StatusType = refData.StatusTypes.FirstOrDefault(i => i.ID == s.StatusTypeId);
            }


            connectionInfo.CurrentTypeID = s.CurrentTypeId;
            if (isVerboseMode)
            {
                connectionInfo.CurrentType = refData.CurrentTypes.FirstOrDefault(i => i.ID == connectionInfo.CurrentTypeID);
            }

            // if PowerKW not manually supplied, attempt to compute it

            if (connectionInfo.PowerKW == null || connectionInfo.PowerKW == 0)
            {
                connectionInfo.PowerKW = ConnectionInfo.ComputePowerkW(connectionInfo);
            }

            // determine legacy charging 'level' (SAE definition) based on kw/voltage if available
            // if can't be computed use existing user supplied value (if any)

            connectionInfo.LevelID = ComputeChargingLevel(connectionInfo);

            if (connectionInfo.LevelID == null)
            {
                connectionInfo.LevelID = s.LevelTypeId;
            }

            if (isVerboseMode)
            {
                connectionInfo.Level = refData.ChargerTypes.FirstOrDefault(i => i.ID == connectionInfo.LevelID);
            }

            return(connectionInfo);
        }
        public static Model.ChargePoint FromDataModel(Core.Data.ChargePoint source, bool loadUserComments, bool loadMediaItems, bool loadMetadataValues, bool isVerboseMode, Model.CoreReferenceData refData)
        {
            if (source == null)
            {
                return(null);
            }

            var poi = new Model.ChargePoint();

            poi.ID   = source.Id;
            poi.UUID = source.Uuid;

            //populate data provider info (full object or id only)
            if (isVerboseMode && source.DataProvider != null)
            {
                poi.DataProvider   = DataProvider.FromDataModel(source.DataProvider);
                poi.DataProviderID = source.DataProvider.Id;
            }
            else
            {
                poi.DataProviderID = source.DataProviderId;
            }

            poi.DataProvidersReference = source.DataProvidersReference;

            //populate Operator (full object or id only)
            if (isVerboseMode && (source.OperatorId != null || source.Operator != null))
            {
                poi.OperatorInfo = OperatorInfo.FromDataModel(source.Operator);
                poi.OperatorID   = source.Operator.Id;
            }
            else
            {
                poi.OperatorID = source.OperatorId;
            }

            poi.OperatorsReference = source.OperatorsReference;

            //populate usage type (full object or id only)
            if (isVerboseMode && (source.UsageTypeId != null || source.UsageType != null))
            {
                poi.UsageType   = UsageType.FromDataModel(source.UsageType);
                poi.UsageTypeID = source.UsageType.Id;
            }
            else
            {
                poi.UsageTypeID = source.UsageTypeId;
            }

            poi.UsageCost = source.UsageCost;

            //populate address info
            if (source.AddressInfoId != null || source.AddressInfo != null)
            {
                poi.AddressInfo = AddressInfo.FromDataModel(source.AddressInfo, isVerboseMode);
            }

            poi.NumberOfPoints  = source.NumberOfPoints;
            poi.GeneralComments = source.GeneralComments;

            poi.DatePlanned       = source.DatePlanned;
            poi.DateLastConfirmed = source.DateLastConfirmed;

            //populate status type (full object or id only)
            if (isVerboseMode && (source.StatusTypeId != null || source.StatusType != null))
            {
                poi.StatusType   = StatusType.FromDataModel(source.StatusType);
                poi.StatusTypeID = source.StatusType.Id;
            }
            else
            {
                poi.StatusTypeID = source.StatusTypeId;
            }

            poi.DateLastStatusUpdate = source.DateLastStatusUpdate;
            poi.DataQualityLevel     = source.DataQualityLevel;
            poi.DateCreated          = source.DateCreated;

            //populate submission status type (full object or id only)
            if (isVerboseMode && (source.SubmissionStatusTypeId != null || source.SubmissionStatusType != null))
            {
                poi.SubmissionStatus       = SubmissionStatusType.FromDataModel(source.SubmissionStatusType);
                poi.SubmissionStatusTypeID = source.SubmissionStatusType.Id;
            }
            else
            {
                poi.SubmissionStatusTypeID = source.SubmissionStatusTypeId;
            }

            poi.Connections = new List <Model.ConnectionInfo>();
            foreach (var conn in source.ConnectionInfoes)
            {
                poi.Connections.Add(ConnectionInfo.FromDataModel(conn, isVerboseMode, refData));
            }

            //loadUserComments = true;
            //loadMetadataValues = true;
            //loadMediaItems = true;

            //optionally load user comments
            if (loadUserComments)
            {
                foreach (var comment in source.UserComments.OrderByDescending(cm => cm.DateCreated))
                {
                    if (poi.UserComments == null)
                    {
                        poi.UserComments = new List <Model.UserComment>();
                    }
                    Model.UserComment com = UserComment.FromDataModel(comment, isVerboseMode);
                    poi.UserComments.Add(com);
                }
            }

            if (loadMediaItems)
            {
                foreach (var mediaItem in source.MediaItems.OrderByDescending(cm => cm.DateCreated))
                {
                    if (poi.MediaItems == null)
                    {
                        poi.MediaItems = new List <Model.MediaItem>();
                    }
                    poi.MediaItems.Add(MediaItem.FromDataModel(mediaItem));
                }
            }

            if (loadMetadataValues)
            {
                foreach (var metadataValue in source.MetadataValues)
                {
                    if (poi.MetadataValues == null)
                    {
                        poi.MetadataValues = new List <Model.MetadataValue>();
                    }
                    poi.MetadataValues.Add(MetadataValue.FromDataModel(metadataValue));
                }
            }

            //mapping level of detail (priority level, lower is higher priority)
            poi.LevelOfDetail = source.LevelOfDetail;
            return(poi);
        }
 public static Model.ChargePoint FromDataModel(Core.Data.ChargePoint source, Model.CoreReferenceData refData)
 {
     return(FromDataModel(source, false, false, false, true, refData));
 }
        public static Model.UserComment FromDataModel(Core.Data.UserComment source, bool isVerboseMode, Model.CoreReferenceData refData = null)
        {
            var userComment = new Model.UserComment
            {
                ID                 = source.Id,
                Comment            = source.Comment,
                Rating             = source.Rating,
                RelatedURL         = source.RelatedUrl,
                DateCreated        = source.DateCreated,
                ChargePointID      = source.ChargePointId,
                User               = User.BasicFromDataModel(source.User),
                IsActionedByEditor = source.IsActionedByEditor
            };

            if (isVerboseMode && refData != null)
            {
                userComment.CommentType   = refData?.UserCommentTypes.FirstOrDefault(i => i.ID == source.UserCommentTypeId) ?? UserCommentType.FromDataModel(source.UserCommentType);
                userComment.CommentTypeID = source.UserCommentTypeId;
            }
            else
            {
                userComment.CommentTypeID = source.UserCommentTypeId;
            }

            if (isVerboseMode && (refData != null || source.CheckinStatusType != null) && source.CheckinStatusTypeId != null)
            {
                userComment.CheckinStatusType   = refData?.CheckinStatusTypes.FirstOrDefault(i => i.ID == source.CheckinStatusTypeId) ?? CheckinStatusType.FromDataModel(source.CheckinStatusType);
                userComment.CheckinStatusTypeID = source.CheckinStatusTypeId;
            }
            else
            {
                userComment.CheckinStatusTypeID = source.CheckinStatusTypeId;
            }

            if (userComment.User != null)
            {
                userComment.UserName = userComment.User.Username;
            }
            else
            {
                userComment.UserName = source.UserName;
            }

            return(userComment);
        }