public static void MapToDB(ThisEntity input, DBEntity output)
        {
            //want output ensure fields input create are not wiped
            if (output.Id == 0)
            {
                output.CTID = input.CTID;
            }
            //if ( !string.IsNullOrWhiteSpace( input.CredentialRegistryId ) )
            //	output.CredentialRegistryId = input.CredentialRegistryId;

            output.Id = input.Id;
            //output.EntityStateId = input.EntityStateId;
            output.Name        = GetData(input.Name);
            output.Description = GetData(input.Description);
            //output.JobsObtainedJson = input.JobsObtained;
            input.JsonProperties.JobsObtainedList = input.JobsObtainedList;
            //NOT proper. Decided to use a generic JsonProperties here. Will rename if any additional properties need to be added.
            output.JobsObtainedJson = JsonConvert.SerializeObject(input.JsonProperties);


            output.Source = GetUrlData(input.Source);
            if (IsValidDate(input.DateEffective))
            {
                output.DateEffective = DateTime.Parse(input.DateEffective);
            }
            else
            {
                output.DateEffective = null;
            }
            //======================================================================
        }
        public static ThisEntity GetBasic(int id)
        {
            ThisEntity entity = new ThisEntity();

            using (var context = new EntityContext())
            {
                DBEntity item = context.EmploymentOutcomeProfile
                                .SingleOrDefault(s => s.Id == id);

                if (item != null && item.Id > 0)
                {
                    MapFromDB(item, entity, false);
                }
            }

            return(entity);
        }
        public static ThisEntity GetByCtid(string ctid)
        {
            ThisEntity entity = new ThisEntity();

            using (var context = new EntityContext())
            {
                DBEntity item = context.EmploymentOutcomeProfile
                                .FirstOrDefault(s => s.CTID.ToLower() == ctid.ToLower());

                if (item != null && item.Id > 0)
                {
                    MapFromDB(item, entity, false);
                }
            }

            return(entity);
        }
        //
        public static ThisEntity GetDetails(int id)
        {
            ThisEntity entity = new ThisEntity();

            using (var context = new EntityContext())
            {
                DBEntity item = context.EmploymentOutcomeProfile
                                .SingleOrDefault(s => s.Id == id);

                if (item != null && item.Id > 0)
                {
                    //check for virtual deletes
                    if (item.EntityStateId == 0)
                    {
                        return(entity);
                    }

                    MapFromDB(item, entity, true);
                }
            }

            return(entity);
        }
        public bool Save(ThisEntity entity, Entity parentEntity, ref SaveStatus status)
        {
            bool isValid = true;
            int  count   = 0;

            try
            {
                using (var context = new EntityContext())
                {
                    if (ValidateProfile(entity, ref status) == false)
                    {
                        //return false;
                    }
                    //actually will always be an add
                    if (entity.Id > 0)
                    {
                        //TODO - consider if necessary, or interferes with anything
                        context.Configuration.LazyLoadingEnabled = false;
                        DBEntity efEntity = context.EmploymentOutcomeProfile
                                            .FirstOrDefault(s => s.Id == entity.Id);

                        if (efEntity != null && efEntity.Id > 0)
                        {
                            //fill in fields that may not be in entity
                            entity.RowId = efEntity.RowId;

                            MapToDB(entity, efEntity);

                            if (efEntity.EntityStateId == 0)
                            {
                                var          url = string.Format(UtilityManager.GetAppKeyValue("credentialFinderSite") + "EmploymentOutcomeProfile/{0}", efEntity.Id);
                                SiteActivity sa  = new SiteActivity()
                                {
                                    ActivityType     = "EmploymentOutcomeProfile",
                                    Activity         = "Import",
                                    Event            = "Reactivate",
                                    Comment          = string.Format("EmploymentOutcomeProfile had been marked as deleted, and was reactivted by the import. CTID: {0}, SWP: {1}", entity.CTID, entity.Source),
                                    ActivityObjectId = entity.Id
                                };
                                new ActivityManager().SiteActivityAdd(sa);
                            }
                            //assume and validate, that if we get here we have a full record
                            if (efEntity.EntityStateId != 2)
                            {
                                efEntity.EntityStateId = 3;
                            }

                            //if ( IsValidDate( status.EnvelopeCreatedDate ) && status.LocalCreatedDate < efEntity.Created )
                            //{
                            //	efEntity.Created = status.LocalCreatedDate;
                            //}
                            if (IsValidDate(status.EnvelopeUpdatedDate) && status.LocalUpdatedDate != efEntity.LastUpdated)
                            {
                                efEntity.LastUpdated = status.LocalUpdatedDate;
                            }
                            //has changed?
                            if (HasStateChanged(context))
                            {
                                if (IsValidDate(status.EnvelopeUpdatedDate))
                                {
                                    efEntity.LastUpdated = status.LocalUpdatedDate;
                                }
                                else
                                {
                                    efEntity.LastUpdated = DateTime.Now;
                                }
                                //NOTE efEntity.EntityStateId is set to 0 in delete method )
                                count = context.SaveChanges();
                                //can be zero if no data changed
                                if (count >= 0)
                                {
                                    isValid = true;
                                }
                                else
                                {
                                    //?no info on error
                                    isValid = false;
                                    string message = string.Format(thisClassName + ".Save Failed", "Attempted to update a EmploymentOutcomeProfile. The process appeared to not work, but was not an exception, so we have no message, or no clue. EmploymentOutcomeProfile: {0}, Id: {1}", entity.Name, entity.Id);
                                    status.AddError("Error - the update was not successful. " + message);
                                    EmailManager.NotifyAdmin(thisClassName + ".Save Failed Failed", message);
                                }
                            }
                            else
                            {
                                //update entity.LastUpdated - assuming there has to have been some change in related data
                                //new EntityManager().UpdateModifiedDate( entity.RowId, ref status );
                            }
                            if (isValid)
                            {
                                if (!UpdateParts(entity, ref status))
                                {
                                    isValid = false;
                                }

                                SiteActivity sa = new SiteActivity()
                                {
                                    ActivityType     = "EmploymentOutcomeProfile",
                                    Activity         = "Import",
                                    Event            = "Update",
                                    Comment          = string.Format("EmploymentOutcomeProfile was updated by the import. CTID: {0}, Source: {1}", entity.CTID, entity.Source),
                                    ActivityObjectId = entity.Id
                                };
                                new ActivityManager().SiteActivityAdd(sa);
                                new EntityManager().UpdateModifiedDate(entity.RowId, ref status, efEntity.LastUpdated);
                            }
                        }
                        else
                        {
                            status.AddError("Error - update failed, as record was not found.");
                        }
                    }
                    else
                    {
                        int newId = Add(entity, parentEntity, ref status);
                        if (newId == 0 || status.HasErrors)
                        {
                            isValid = false;
                        }
                    }
                }
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException dbex)
            {
                string message = HandleDBValidationError(dbex, thisClassName + string.Format(".Save. id: {0}, Name: {1}", entity.Id, entity.Name), "EmploymentOutcomeProfile");
                status.AddError(thisClassName + ".Save(). Error - the save was not successful. " + message);
            }
            catch (Exception ex)
            {
                string message = FormatExceptions(ex);
                LoggingHelper.LogError(ex, thisClassName + string.Format(".Save. id: {0}, Name: {1}", entity.Id, entity.Name));
                status.AddError(thisClassName + ".Save(). Error - the save was not successful. " + message);
                isValid = false;
            }


            return(isValid);
        }
        public static void MapFromDB(DBEntity input, ThisEntity output,
                                     bool includingParts)
        {
            output.Id            = input.Id;
            output.RowId         = input.RowId;
            output.EntityStateId = input.EntityStateId;
            output.Name          = input.Name == null ? "" : input.Name;
            output.Description   = input.Description == null ? "" : input.Description;
            output.CTID          = input.CTID;
            if (IsValidDate(input.DateEffective))
            {
                output.DateEffective = (( DateTime )input.DateEffective).ToString("yyyy-MM-dd");
            }
            else
            {
                output.DateEffective = "";
            }
            //
            //output.JobsObtained = input.JobsObtained ?? 0;
            if (!string.IsNullOrEmpty(input.JobsObtainedJson))
            {
                var jp = JsonConvert.DeserializeObject <EmploymentOutcomeProfileProperties>(input.JobsObtainedJson);
                if (jp != null)
                {
                    //unpack JobsObtainedList
                    output.JobsObtainedList = jp.JobsObtainedList;
                }
            }

            output.Source = GetUrlData(input.Source);

            if (IsValidDate(input.Created))
            {
                output.Created = ( DateTime )input.Created;
            }
            if (IsValidDate(input.LastUpdated))
            {
                output.LastUpdated = ( DateTime )input.LastUpdated;
            }

            if (string.IsNullOrWhiteSpace(output.CTID) || output.EntityStateId < 3)
            {
                output.IsReferenceVersion = true;
                return;
            }
            //=====
            var relatedEntity = EntityManager.GetEntity(output.RowId, false);

            if (relatedEntity != null && relatedEntity.Id > 0)
            {
                output.EntityLastUpdated = relatedEntity.LastUpdated;
            }

            //components
            if (includingParts)
            {
                //
                output.Jurisdiction = Entity_JurisdictionProfileManager.Jurisdiction_GetAll(output.RowId);
                //get datasetprofiles
                output.RelevantDataSet = DataSetProfileManager.GetAll(output.RowId, true);
            }
        }         //
        /// <summary>
        /// Delete profile
        /// </summary>
        /// <param name="id"></param>
        /// <param name="statusMessage"></param>
        /// <returns></returns>
        public bool Delete(int id, ref List <string> messages)
        {
            bool isValid = true;

            if (id < 1)
            {
                messages.Add(thisClassName + ".Delete() Error - a valid holders profile id must be provided.");
                return(false);
            }

            using (var context = new EntityContext())
            {
                try
                {
                    context.Configuration.LazyLoadingEnabled = false;
                    DBEntity efEntity = context.EmploymentOutcomeProfile
                                        .FirstOrDefault(s => s.Id == id);

                    if (efEntity != null && efEntity.Id > 0)
                    {
                        Guid rowId = efEntity.RowId;
                        //need to remove from Entity.
                        //need to trigger delete of relevant dataset, timeframe, and
                        new DataSetProfileManager().DeleteAll(rowId, ref messages);

                        //-using before delete trigger - verify won't have RI issues
                        string msg = string.Format(" EmploymentOutcomeProfile. Id: {0}, Ctid: {1}.", efEntity.Id, efEntity.CTID);
                        //21-03-31 mp - just removing the profile will not remove its entity and the latter's children!
                        string statusMessage = "";
                        new EntityManager().Delete(rowId, string.Format("EmploymentOutcomeProfile: {0} ({1})", string.IsNullOrWhiteSpace(efEntity.Name) ? "none" : efEntity.Name, efEntity.Id), ref statusMessage);
                        //
                        context.EmploymentOutcomeProfile.Remove(efEntity);
                        int count = context.SaveChanges();
                        if (count > 0)
                        {
                            new ActivityManager().SiteActivityAdd(new SiteActivity()
                            {
                                ActivityType     = "EmploymentOutcomeProfile",
                                Activity         = "Import",
                                Event            = "Delete",
                                Comment          = msg,
                                ActivityObjectId = efEntity.Id
                            });
                            isValid = true;
                        }
                    }
                    else
                    {
                        messages.Add(thisClassName + ".Delete() Warning No action taken, as the record was not found.");
                    }
                }
                catch (Exception ex)
                {
                    LoggingHelper.LogError(ex, thisClassName + ".Delete()");
                    isValid = false;
                    var statusMessage = FormatExceptions(ex);
                    if (statusMessage.ToLower().IndexOf("the delete statement conflicted with the reference constraint") > -1)
                    {
                        statusMessage = "Error: this EmploymentOutcomeProfile cannot be deleted as it is being referenced by other items, such as roles or credentials. These associations must be removed before this EmploymentOutcomeProfile can be deleted.";
                    }
                    messages.Add(statusMessage);
                }
            }
            return(isValid);
        }
        /// <summary>
        /// add a EmploymentOutcomeProfile
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        private int Add(ThisEntity entity, Entity parentEntity, ref SaveStatus status)
        {
            DBEntity efEntity = new DBEntity();

            using (var context = new EntityContext())
            {
                try
                {
                    MapToDB(entity, efEntity);

                    if (IsValidGuid(entity.RowId))
                    {
                        efEntity.RowId = entity.RowId;
                    }
                    else
                    {
                        efEntity.RowId = Guid.NewGuid();
                    }
                    efEntity.EntityStateId = 3;
                    //the envelope date may not reflect when the earning profile was added
                    //if ( IsValidDate( status.EnvelopeCreatedDate ) )
                    //{
                    //	efEntity.Created = status.LocalCreatedDate;
                    //	efEntity.LastUpdated = status.LocalCreatedDate;
                    //}
                    //else
                    {
                        efEntity.Created     = System.DateTime.Now;
                        efEntity.LastUpdated = System.DateTime.Now;
                    }

                    context.EmploymentOutcomeProfile.Add(efEntity);

                    // submit the change to database
                    int count = context.SaveChanges();
                    if (count > 0)
                    {
                        if (efEntity.Id == 0)
                        {
                            List <string> messages = new List <string>();
                            Delete(efEntity.Id, ref messages);

                            efEntity.RowId = Guid.NewGuid();
                            context.EmploymentOutcomeProfile.Add(efEntity);
                            count        = context.SaveChanges();
                            entity.Id    = efEntity.Id;
                            entity.RowId = efEntity.RowId;
                        }
                        else
                        {
                            entity.Id    = efEntity.Id;
                            entity.RowId = efEntity.RowId;
                        }
                        //add log entry
                        SiteActivity sa = new SiteActivity()
                        {
                            ActivityType     = "EmploymentOutcomeProfile",
                            Activity         = "Import",
                            Event            = "Add",
                            Comment          = string.Format("Full EmploymentOutcomeProfile was added by the import. CTID: {0}, Desc: {1}", entity.CTID, entity.Description),
                            ActivityObjectId = entity.Id
                        };
                        new ActivityManager().SiteActivityAdd(sa);
                        //TODO
                        new Entity_EmploymentOutcomeProfileManager().Add(parentEntity.EntityUid, entity.Id, ref status);

                        if (UpdateParts(entity, ref status) == false)
                        {
                        }

                        return(efEntity.Id);
                    }
                    else
                    {
                        //?no info on error

                        string message = thisClassName + string.Format(". Add Failed", "Attempted to add a EmploymentOutcomeProfile. The process appeared to not work, but was not an exception, so we have no message, or no clue. EmploymentOutcomeProfile: {0}, ctid: {1}", entity.Name, entity.CTID);
                        status.AddError(thisClassName + ". Error - the add was not successful. " + message);
                        EmailManager.NotifyAdmin("EmploymentOutcomeProfileManager. Add Failed", message);
                    }
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException dbex)
                {
                    string message = HandleDBValidationError(dbex, thisClassName + ".Add() ", "EmploymentOutcomeProfile");
                    status.AddError(thisClassName + ".Add(). Error - the save was not successful. " + message);

                    LoggingHelper.LogError(message, true);
                }
                catch (Exception ex)
                {
                    string message = FormatExceptions(ex);
                    LoggingHelper.LogError(ex, thisClassName + string.Format(".Add(), CTID: {0}\r\n", efEntity.CTID));
                    status.AddError(thisClassName + ".Add(). Error - the save was not successful. \r\n" + message);
                }
            }

            return(efEntity.Id);
        }