public bool ProcessEnvelope(ReadEnvelope item, SaveStatus status)
        {
            if (item == null || string.IsNullOrWhiteSpace(item.EnvelopeIdentifier))
            {
                status.AddError("A valid ReadEnvelope must be provided.");
                return(false);
            }

            //EntityServices mgr = new EntityServices();
            string payload            = item.DecodedResource.ToString();
            string envelopeIdentifier = item.EnvelopeIdentifier;
            string ctdlType           = RegistryServices.GetResourceType(payload);
            string envelopeUrl        = RegistryServices.GetEnvelopeUrl(envelopeIdentifier);

            if (ImportServiceHelpers.IsAGraphResource(payload))
            {
                //if ( payload.IndexOf( "\"en\":" ) > 0 )
                return(ImportV3(payload, envelopeIdentifier, status));
                //else
                //    return ImportV2( payload, envelopeIdentifier, status );
            }
            else
            {
                LoggingHelper.DoTrace(5, "		envelopeUrl: "+ envelopeUrl);
                LoggingHelper.WriteLogFile(1, "org_" + item.EnvelopeIdentifier, payload, "", false);
                input = JsonConvert.DeserializeObject <InputEntity>(item.DecodedResource.ToString());

                return(Import(input, envelopeIdentifier, status));
            }
        }
        public bool ImportByResourceUrl(string resourceUrl, SaveStatus status)
        {
            if (string.IsNullOrWhiteSpace(resourceUrl))
            {
                status.AddError(thisClassName + ".ImportByResourceUrl - a valid resourceUrl must be provided");
                return(false);
            }
            //this is currently specific, assumes envelop contains an organization
            //can use the hack for GetResourceType to determine the type, and then call the appropriate import method
            string statusMessage = "";
            //EntityServices mgr = new EntityServices();
            string ctdlType = "";

            try
            {
                string payload = RegistryServices.GetResourceByUrl(resourceUrl, ref ctdlType, ref statusMessage);

                if (!string.IsNullOrWhiteSpace(payload))
                {
                    if (ImportServiceHelpers.IsAGraphResource(payload))
                    {
                        //if ( payload.IndexOf( "\"en\":" ) > 0 )
                        return(ImportV3(payload, "", status));
                        //else
                        //    return ImportV2( payload, "", status );
                    }
                    else
                    {
                        input = JsonConvert.DeserializeObject <InputEntity>(payload.ToString());
                        return(Import(input, "", status));
                    }
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception ex)
            {
                LoggingHelper.LogError(ex, thisClassName + ".ImportByResourceUrl()");
                status.AddError(ex.Message);
                if (ex.Message.IndexOf("Path '@context', line 1") > 0)
                {
                    status.AddWarning("The referenced registry document is using an old schema. Please republish it with the latest schema!");
                }
                return(false);
            }
        }
 public bool ImportByPayload(string payload, SaveStatus status)
 {
     //EntityServices mgr = new EntityServices();
     if (ImportServiceHelpers.IsAGraphResource(payload))
     {
         //if ( payload.IndexOf( "\"en\":" ) > 0 )
         return(ImportV3(payload, "", status));
         //else
         //    return ImportV2( payload, "", status );
     }
     else
     {
         //do additional check in case of getting just the resource instead of /graph/
         input = JsonConvert.DeserializeObject <InputEntity>(payload);
         return(Import(input, "", status));
     }
 }
        public bool ImportV3(string payload, SaveStatus status)
        {
            DateTime      started      = DateTime.Now;
            var           saveDuration = new TimeSpan();
            InputEntityV3 input        = new InputEntityV3();
            var           bnodes       = new List <BNodeV3>();
            var           mainEntity   = new Dictionary <string, object>();

            Dictionary <string, object> dictionary = RegistryServices.JsonToDictionary(payload);
            object graph = dictionary["@graph"];
            //serialize the graph object
            var glist = JsonConvert.SerializeObject(graph);

            //parse graph in to list of objects
            JArray graphList = JArray.Parse(glist);
            int    cntr      = 0;

            foreach (var item in graphList)
            {
                cntr++;
                if (cntr == 1)
                {
                    var main = item.ToString();
                    //may not use this. Could add a trace method
                    mainEntity = RegistryServices.JsonToDictionary(main);
                    input      = JsonConvert.DeserializeObject <InputEntityV3>(main);
                }
                else //is this too much of an assumption?
                {
                    var bn = item.ToString();
                    bnodes.Add(JsonConvert.DeserializeObject <BNodeV3>(bn));
                }
            }

            List <string>   messages          = new List <string>();
            bool            importSuccessfull = false;
            EntityServices  mgr    = new EntityServices();
            MappingHelperV3 helper = new MappingHelperV3(2)
            {
                entityBlankNodes = bnodes
            };

            helper.entityBlankNodes  = bnodes;
            helper.CurrentEntityCTID = input.CTID;
            helper.CurrentEntityName = input.Name.ToString();

            try {
                string ctid           = input.CTID;
                string referencedAtId = input.CtdlId;

                LoggingHelper.DoTrace(5, "		name: "+ input.Name.ToString());
                LoggingHelper.DoTrace(6, "		url: "+ input.SubjectWebpage);
                LoggingHelper.DoTrace(5, "		ctid: "+ input.CTID);
                LoggingHelper.DoTrace(5, "		@Id: "+ input.CtdlId);
                status.Ctid = ctid;

                if (status.DoingDownloadOnly)
                {
                    return(true);
                }

                if (!DoesEntityExist(input.CTID, ref output))
                {
                    //set the rowid now, so that can be referenced as needed
                    output.RowId = Guid.NewGuid();
                    LoggingHelper.DoTrace(1, string.Format(thisClassName + ".ImportV3(). Record was NOT found using CTID: '{0}'", input.CTID));
                }
                else
                {
                    LoggingHelper.DoTrace(1, string.Format(thisClassName + ".ImportV3(). Found record: '{0}' using CTID: '{1}'", input.Name, input.CTID));
                }

                helper.currentBaseObject     = output;
                helper.CurrentOwningAgentUid = output.RowId;

                output.AgentDomainType = input.Type;
                output.Name            = helper.HandleLanguageMap(input.Name, output, "Name");
                output.Description     = helper.HandleLanguageMap(input.Description, output, "Description");
                //map from idProperty to url
                output.SubjectWebpage = input.SubjectWebpage;
                output.CTID           = input.CTID;
                //TBD handling
                if (!string.IsNullOrWhiteSpace(status.DocumentPublishedBy))
                {
                    //output.PublishedByOrganizationCTID = status.DocumentPublishedBy;
                    var porg = OrganizationManager.GetSummaryByCtid(status.DocumentPublishedBy);
                    if (porg != null && porg.Id > 0)
                    {
                        //TODO - store this in a json blob??????????
                        //output.PublishedByOrganizationId = porg.Id;
                        //output.PublishedByOrganizationName = porg.Name;
                        //this will result in being added to Entity.AgentRelationship
                        output.PublishedBy = new List <Guid>()
                        {
                            porg.RowId
                        };
                    }
                    else
                    {
                        //if publisher not imported yet, all publishee stuff will be orphaned
                        var entityUid = Guid.NewGuid();
                        var statusMsg = "";
                        var resPos    = referencedAtId.IndexOf("/resources/");
                        var swp       = referencedAtId.Substring(0, (resPos + "/resources/".Length)) + status.DocumentPublishedBy;
                        int orgId     = new OrganizationManager().AddPendingRecord(entityUid, status.DocumentPublishedBy, swp, ref statusMsg);
                    }
                }
                else
                {
                    //may need a check for existing published by to ensure not lost
                    if (output.Id > 0)
                    {
                        if (output.OrganizationRole_Recipient != null && output.OrganizationRole_Recipient.Any())
                        {
                            var publishedByList = output.OrganizationRole_Recipient.Where(s => s.RoleTypeId == 30).ToList();
                            if (publishedByList != null && publishedByList.Any())
                            {
                                var pby = publishedByList[0].ActingAgentUid;
                                output.PublishedBy = new List <Guid>()
                                {
                                    publishedByList[0].ActingAgentUid
                                };
                            }
                        }
                    }
                }

                output.CredentialRegistryId = status.EnvelopeId;;
                output.AlternateNames       = helper.MapToTextValueProfile(input.AlternateName, output, "AlternateName");
                output.Image = input.Image;

                output.AgentPurpose            = input.AgentPurpose;
                output.AgentPurposeDescription = helper.HandleLanguageMap(input.AgentPurposeDescription, output, "AgentPurposeDescription");

                output.FoundingDate = input.FoundingDate;
                //output.AvailabilityListing = helper.MapListToString( input.AvailabilityListing );
                //future prep
                output.AvailabilityListings = input.AvailabilityListing;

                output.MissionAndGoalsStatement            = input.MissionAndGoalsStatement;
                output.MissionAndGoalsStatementDescription = helper.HandleLanguageMap(input.MissionAndGoalsStatementDescription, output, "MissionAndGoalsStatementDescription");

                output.Addresses = helper.FormatAvailableAtAddresses(input.Address, ref status);
                if (output.Addresses != null && output.Addresses.Any())
                {
                    output.AddressesJson = JsonConvert.SerializeObject(output.Addresses, MappingHelperV3.GetJsonSettings());
                }
                //
                if (UtilityManager.GetAppKeyValue("skipOppImportIfNoShortRegions", false))
                {
                    if (output.Addresses.Count == 0)
                    {
                        //skip
                        LoggingHelper.DoTrace(2, string.Format("		***Skipping org# {0}, {1} as it has no addresses and this is a special run.", output.Id, output.Name));
                        return(true);
                    }
                    else if (output.HasAnyShortRegions == false)
                    {
                        //skip
                        LoggingHelper.DoTrace(2, string.Format("		***Skipping org# {0}, {1} as it has no addresses with short regions and this is a special run.", output.Id, output.Name));
                        return(true);
                    }
                }

                //agent type, map to enumeration
                output.AgentType = helper.MapCAOListToEnumermation(input.AgentType);

                output.TransferValueStatement            = input.TransferValueStatement;
                output.TransferValueStatementDescription = helper.HandleLanguageMap(input.TransferValueStatementDescription, output, "TransferValueStatementDescription");

                //Manifests
                output.ConditionManifestIds = helper.MapEntityReferences(input.HasConditionManifest, CodesManager.ENTITY_TYPE_CONDITION_MANIFEST, CodesManager.ENTITY_TYPE_ORGANIZATION, ref status);
                output.CostManifestIds      = helper.MapEntityReferences(input.HasCostManifest, CodesManager.ENTITY_TYPE_COST_MANIFEST, CodesManager.ENTITY_TYPE_ORGANIZATION, ref status);

                //hasVerificationService
                output.VerificationServiceProfiles = helper.MapVerificationServiceProfiles(input.VerificationServiceProfiles, ref status);

                // output.targetc
                //other enumerations
                //	serviceType, AgentSectorType
                output.ServiceType     = helper.MapCAOListToEnumermation(input.ServiceType);
                output.AgentSectorType = helper.MapCAOListToEnumermation(input.AgentSectorType);

                //Industries
                //output.Industry = helper.MapCAOListToEnumermation( input.IndustryType );
                output.Industries = helper.MapCAOListToCAOProfileList(input.IndustryType);
                //naics
                output.Naics = input.Naics;

                //keywords
                output.Keyword = helper.MapToTextValueProfile(input.Keyword, output, "Keyword");

                //duns, Fein.  IpedsID, opeID
                if (!string.IsNullOrWhiteSpace(input.DUNS))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:duns", TextValue = input.DUNS
                    });
                }
                if (!string.IsNullOrWhiteSpace(input.FEIN))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:fein", TextValue = input.FEIN
                    });
                }

                if (!string.IsNullOrWhiteSpace(input.IpedsID))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:ipedsID", TextValue = input.IpedsID
                    });
                }

                if (!string.IsNullOrWhiteSpace(input.OPEID))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:opeID", TextValue = input.OPEID
                    });
                }
                if (!string.IsNullOrWhiteSpace(input.LEICode))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:leiCode", TextValue = input.LEICode
                    });
                }
                //
                if (!string.IsNullOrWhiteSpace(input.NcesID))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:ncesID", TextValue = input.NcesID
                    });
                }
                //
                if (!string.IsNullOrWhiteSpace(input.ISICV4))
                {
                    output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                        CodeSchema = "ceterms:isicV4", TextValue = input.ISICV4
                    });
                }

                //alternativeidentifier - should just be added to IdentificationCodes
                //output.AlternativeIdentifier = helper.MapIdentifierValueListToString( input.AlternativeIdentifier );
                //output.AlternativeIdentifierList = helper.MapIdentifierValueList( input.AlternativeIdentifier );
                //20-10-31 - replacing AlternativeIdentifier with Identifier
                output.Identifier = helper.MapIdentifierValueList(input.Identifier);
                if (output.Identifier != null && output.Identifier.Count() > 0)
                {
                    output.IdentifierJson = JsonConvert.SerializeObject(output.Identifier, MappingHelperV3.GetJsonSettings());
                }

                //email

                output.Emails = helper.MapToTextValueProfile(input.Email);
                //contact point
                //output.ContactPoint = helper.FormatContactPoints( input.ContactPoint, ref status );
                //Jurisdiction
                output.Jurisdiction = helper.MapToJurisdiction(input.Jurisdiction, ref status);

                //SameAs URI
                output.SameAs = helper.MapToTextValueProfile(input.SameAs);
                //Social media
                output.SocialMediaPages = helper.MapToTextValueProfile(input.SocialMedia);

                //departments
                //not sure - MP - want to change how depts, and subs are handled
                output.ParentOrganization = helper.MapOrganizationReferenceGuids("Organization.ParentOrganization", input.ParentOrganization, ref status);
                output.Departments        = helper.MapOrganizationReferenceGuids("Organization.Department", input.Department, ref status);
                output.SubOrganizations   = helper.MapOrganizationReferenceGuids("Organization.SubOrganization", input.SubOrganization, ref status);

                //output.OrganizationRole_Subsidiary = helper.FormatOrganizationReferences( input.SubOrganization );

                //Process profiles
                output.AdministrationProcess = helper.FormatProcessProfile(input.AdministrationProcess, ref status);
                output.MaintenanceProcess    = helper.FormatProcessProfile(input.MaintenanceProcess, ref status);
                output.ComplaintProcess      = helper.FormatProcessProfile(input.ComplaintProcess, ref status);
                output.DevelopmentProcess    = helper.FormatProcessProfile(input.DevelopmentProcess, ref status);
                output.RevocationProcess     = helper.FormatProcessProfile(input.RevocationProcess, ref status);
                output.ReviewProcess         = helper.FormatProcessProfile(input.ReviewProcess, ref status);
                output.AppealProcess         = helper.FormatProcessProfile(input.AppealProcess, ref status);

                //BYs
                output.AccreditedBy = helper.MapOrganizationReferenceGuids("Organization.AccreditedBy", input.AccreditedBy, ref status);
                output.ApprovedBy   = helper.MapOrganizationReferenceGuids("Organization.ApprovedBy", input.ApprovedBy, ref status);
                output.RecognizedBy = helper.MapOrganizationReferenceGuids("Organization.RecognizedBy", input.RecognizedBy, ref status);
                output.RegulatedBy  = helper.MapOrganizationReferenceGuids("Organization.RegulatedBy", input.RegulatedBy, ref status);
                //INs
                output.AccreditedIn = helper.MapToJurisdiction("Organization.AccreditedIn", input.AccreditedIn, ref status);
                output.ApprovedIn   = helper.MapToJurisdiction("Organization.ApprovedIn", input.ApprovedIn, ref status);
                output.RecognizedIn = helper.MapToJurisdiction("Organization.RecognizedIn", input.RecognizedIn, ref status);
                output.RegulatedIn  = helper.MapToJurisdiction("Organization.RegulatedIn", input.RegulatedIn, ref status);

                //Asserts
                //the entity type is not known
                output.Accredits = helper.MapEntityReferenceGuids("Organization.Accredits", input.Accredits, 0, ref status);
                output.Approves  = helper.MapEntityReferenceGuids("Organization.Approves", input.Approves, 0, ref status);
                if (output.Approves.Count > 0)
                {
                }
                output.Offers     = helper.MapEntityReferenceGuids("Organization.Offers", input.Offers, 0, ref status);
                output.Owns       = helper.MapEntityReferenceGuids("Organization.Owns", input.Owns, 0, ref status);
                output.Renews     = helper.MapEntityReferenceGuids("Organization.Renews", input.Renews, 0, ref status);
                output.Revokes    = helper.MapEntityReferenceGuids("Organization.Revokes", input.Revokes, 0, ref status);
                output.Recognizes = helper.MapEntityReferenceGuids("Organization.Recognizes", input.Recognizes, 0, ref status);
                output.Regulates  = helper.MapEntityReferenceGuids("Organization.Regulates", input.Regulates, 0, ref status);

                //

                TimeSpan duration = DateTime.Now.Subtract(started);
                if (duration.TotalSeconds > 5)
                {
                    LoggingHelper.DoTrace(6, string.Format("         WARNING Mapping Duration: {0:N2} seconds ", duration.TotalSeconds));
                }
                DateTime saveStarted = DateTime.Now;

                //=== if any messages were encountered treat as warnings for now
                if (messages.Count > 0)
                {
                    status.SetMessages(messages, true);
                }
                //just in case check if entity added since start
                if (output.Id == 0)
                {
                    ThisEntity entity = EntityServices.GetSummaryByCtid(ctid);
                    if (entity != null && entity.Id > 0)
                    {
                        output.Id    = entity.Id;
                        output.RowId = entity.RowId;
                    }
                }
                importSuccessfull = mgr.Import(output, ref status);
                saveDuration      = DateTime.Now.Subtract(saveStarted);
                if (saveDuration.TotalSeconds > 5)
                {
                    LoggingHelper.DoTrace(6, string.Format("         WARNING SAVE Duration: {0:N2} seconds ", saveDuration.TotalSeconds));
                }
                //
                status.DocumentId    = output.Id;
                status.DetailPageUrl = string.Format("~/organization/{0}", output.Id);
                status.DocumentRowId = output.RowId;

                //just in case
                if (status.HasErrors)
                {
                    importSuccessfull = false;
                }

                //if record was added to db, add to/or set EntityResolution as resolved
                int ierId = new ImportManager().Import_EntityResolutionAdd(referencedAtId,
                                                                           ctid, CodesManager.ENTITY_TYPE_ORGANIZATION,
                                                                           output.RowId,
                                                                           output.Id,
                                                                           false,
                                                                           ref messages,
                                                                           output.Id > 0);
            }
            catch (Exception ex)
            {
                LoggingHelper.LogError(ex, string.Format("OrganizationImportV3. Exception encountered in CTID: {0}", input.CTID), false, "Organization Import exception");
            }
            finally
            {
                var totalDuration = DateTime.Now.Subtract(started);
                if (totalDuration.TotalSeconds > 9 && (totalDuration.TotalSeconds - saveDuration.TotalSeconds > 3))
                {
                    LoggingHelper.DoTrace(5, string.Format("         WARNING Total Duration: {0:N2} seconds ", totalDuration.TotalSeconds));
                }
            }
            return(importSuccessfull);
        }
        public bool ImportV3(string payload, string envelopeIdentifier, SaveStatus status)
        {
            InputEntityV3 input      = new InputEntityV3();
            var           bnodes     = new List <BNodeV3>();
            var           mainEntity = new Dictionary <string, object>();

            Dictionary <string, object> dictionary = RegistryServices.JsonToDictionary(payload);
            object graph = dictionary["@graph"];
            //serialize the graph object
            var glist = JsonConvert.SerializeObject(graph);

            //parse graph in to list of objects
            JArray graphList = JArray.Parse(glist);
            int    cntr      = 0;

            foreach (var item in graphList)
            {
                cntr++;
                if (cntr == 1)
                {
                    var main = item.ToString();
                    //may not use this. Could add a trace method
                    mainEntity = RegistryServices.JsonToDictionary(main);
                    input      = JsonConvert.DeserializeObject <InputEntityV3>(main);
                }
                else //is this too much of an assumption?
                {
                    var bn = item.ToString();
                    bnodes.Add(JsonConvert.DeserializeObject <BNodeV3>(bn));
                }
            }

            List <string>   messages          = new List <string>();
            bool            importSuccessfull = false;
            EntityServices  mgr    = new EntityServices();
            MappingHelperV3 helper = new MappingHelperV3
            {
                entityBlankNodes = bnodes
            };

            string ctid           = input.Ctid;
            string referencedAtId = input.CtdlId;

            LoggingHelper.DoTrace(5, "		name: "+ input.Name.ToString());
            LoggingHelper.DoTrace(6, "		url: "+ input.SubjectWebpage);
            LoggingHelper.DoTrace(5, "		ctid: "+ input.Ctid);
            LoggingHelper.DoTrace(5, "		@Id: "+ input.CtdlId);
            status.Ctid = ctid;

            if (status.DoingDownloadOnly)
            {
                return(true);
            }

            if (!DoesEntityExist(input.Ctid, ref output))
            {
                //set the rowid now, so that can be referenced as needed
                output.RowId = Guid.NewGuid();
            }

            helper.currentBaseObject = output;

            output.AgentDomainType = input.Type;
            output.Name            = helper.HandleLanguageMap(input.Name, output, "Name");
            output.Description     = helper.HandleLanguageMap(input.Description, output, "Description");
            //map from idProperty to url
            output.SubjectWebpage       = input.SubjectWebpage;
            output.CTID                 = input.Ctid;
            output.CredentialRegistryId = envelopeIdentifier;
            output.AlternateNames       = helper.MapToTextValueProfile(input.AlternateName, output, "AlternateName");
            output.ImageUrl             = input.Image;

            output.AgentPurpose            = input.AgentPurpose;
            output.AgentPurposeDescription = helper.HandleLanguageMap(input.AgentPurposeDescription, output, "AgentPurposeDescription");

            output.FoundingDate        = input.FoundingDate;
            output.AvailabilityListing = helper.MapListToString(input.AvailabilityListing);
            //future prep
            output.AvailabilityListings = input.AvailabilityListing;

            output.MissionAndGoalsStatement = input.MissionAndGoalsStatement;
            //output.MissionAndGoalsStatementDescription = input.MissionAndGoalsStatementDescription;
            output.MissionAndGoalsStatementDescription = helper.HandleLanguageMap(input.MissionAndGoalsStatementDescription, output, "MissionAndGoalsStatementDescription");

            output.Addresses = helper.FormatAvailableAtAddresses(input.Address, ref status);
            if (UtilityManager.GetAppKeyValue("skipOppImportIfNoShortRegions", false))
            {
                if (output.Addresses.Count == 0)
                {
                    //skip
                    LoggingHelper.DoTrace(2, string.Format("		***Skipping org# {0}, {1} as it has no addresses and this is a special run.", output.Id, output.Name));
                    return(true);
                }
                else if (output.HasAnyShortRegions == false)
                {
                    //skip
                    LoggingHelper.DoTrace(2, string.Format("		***Skipping org# {0}, {1} as it has no addresses with short regions and this is a special run.", output.Id, output.Name));
                    return(true);
                }
            }

            //agent type, map to enumeration
            output.AgentType = helper.MapCAOListToEnumermation(input.AgentType);


            //Manifests
            output.ConditionManifestIds = helper.MapEntityReferences(input.HasConditionManifest, CodesManager.ENTITY_TYPE_CONDITION_MANIFEST, CodesManager.ENTITY_TYPE_ORGANIZATION, ref status);
            output.CostManifestIds      = helper.MapEntityReferences(input.HasCostManifest, CodesManager.ENTITY_TYPE_COST_MANIFEST, CodesManager.ENTITY_TYPE_ORGANIZATION, ref status);

            //hasVerificationService
            output.VerificationServiceProfiles = helper.MapVerificationServiceProfiles(input.VerificationServiceProfiles, ref status);

            // output.targetc
            //other enumerations
            //	serviceType, AgentSectorType
            output.ServiceType     = helper.MapCAOListToEnumermation(input.ServiceType);
            output.AgentSectorType = helper.MapCAOListToEnumermation(input.AgentSectorType);

            //Industries
            //output.Industry = helper.MapCAOListToEnumermation( input.IndustryType );
            output.Industries = helper.MapCAOListToCAOProfileList(input.IndustryType);
            //naics
            output.Naics = input.Naics;

            //keywords
            output.Keyword = helper.MapToTextValueProfile(input.Keyword, output, "Keyword");

            //duns, Fein.  IpedsID, opeID
            if (!string.IsNullOrWhiteSpace(input.DUNS))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:duns", TextValue = input.DUNS
                });
            }
            if (!string.IsNullOrWhiteSpace(input.FEIN))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:fein", TextValue = input.FEIN
                });
            }

            if (!string.IsNullOrWhiteSpace(input.IpedsID))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:ipedsID", TextValue = input.IpedsID
                });
            }

            if (!string.IsNullOrWhiteSpace(input.OPEID))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:opeID", TextValue = input.OPEID
                });
            }
            if (!string.IsNullOrWhiteSpace(input.LEICode))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:leiCode", TextValue = input.LEICode
                });
            }
            //
            if (!string.IsNullOrWhiteSpace(input.NcesID))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:ncesID", TextValue = input.NcesID
                });
            }
            //
            if (!string.IsNullOrWhiteSpace(input.ISICV4))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:isicV4", TextValue = input.ISICV4
                });
            }
            //alternativeidentifier - should just be added to IdentificationCodes
            output.AlternativeIdentifier     = helper.MapIdentifierValueListToString(input.AlternativeIdentifier);
            output.AlternativeIdentifierList = helper.MapIdentifierValueList(input.AlternativeIdentifier);

            //email

            output.Emails = helper.MapToTextValueProfile(input.Email);
            //contact point
            //output.ContactPoint = helper.FormatContactPoints( input.ContactPoint, ref status );
            //Jurisdiction
            output.Jurisdiction = helper.MapToJurisdiction(input.Jurisdiction, ref status);

            //SameAs
            output.SameAs = helper.MapToTextValueProfile(input.SameAs);
            //Social media
            output.SocialMediaPages = helper.MapToTextValueProfile(input.SocialMedia);

            //departments
            //not sure - MP - want to change how depts, and subs are handled
            output.ParentOrganization = helper.MapOrganizationReferenceGuids(input.ParentOrganization, ref status);
            output.Departments        = helper.MapOrganizationReferenceGuids(input.Department, ref status);
            output.SubOrganizations   = helper.MapOrganizationReferenceGuids(input.SubOrganization, ref status);

            //output.OrganizationRole_Subsidiary = helper.FormatOrganizationReferences( input.SubOrganization );

            //Process profiles
            output.AdministrationProcess = helper.FormatProcessProfile(input.AdministrationProcess, ref status);
            output.MaintenanceProcess    = helper.FormatProcessProfile(input.MaintenanceProcess, ref status);
            output.ComplaintProcess      = helper.FormatProcessProfile(input.ComplaintProcess, ref status);
            output.DevelopmentProcess    = helper.FormatProcessProfile(input.DevelopmentProcess, ref status);
            output.RevocationProcess     = helper.FormatProcessProfile(input.RevocationProcess, ref status);
            output.ReviewProcess         = helper.FormatProcessProfile(input.ReviewProcess, ref status);
            output.AppealProcess         = helper.FormatProcessProfile(input.AppealProcess, ref status);

            //BYs
            output.AccreditedBy = helper.MapOrganizationReferenceGuids("Organization.AccreditedBy", input.AccreditedBy, ref status);
            output.ApprovedBy   = helper.MapOrganizationReferenceGuids("Organization.ApprovedBy", input.ApprovedBy, ref status);
            output.RecognizedBy = helper.MapOrganizationReferenceGuids("Organization.RecognizedBy", input.RecognizedBy, ref status);
            output.RegulatedBy  = helper.MapOrganizationReferenceGuids("Organization.RegulatedBy", input.RegulatedBy, ref status);
            //INs
            output.AccreditedIn = helper.MapToJurisdiction(input.AccreditedIn, ref status);
            output.ApprovedIn   = helper.MapToJurisdiction(input.ApprovedIn, ref status);
            output.RecognizedIn = helper.MapToJurisdiction(input.RecognizedIn, ref status);
            output.RegulatedIn  = helper.MapToJurisdiction(input.RegulatedIn, ref status);

            //Asserts
            //the entity type is not known
            output.Accredits = helper.MapEntityReferenceGuids(input.Accredits, 0, ref status);
            output.Approves  = helper.MapEntityReferenceGuids(input.Approves, 0, ref status);
            if (output.Approves.Count > 0)
            {
            }
            output.Offers     = helper.MapEntityReferenceGuids(input.Offers, 0, ref status);
            output.Owns       = helper.MapEntityReferenceGuids(input.Owns, 0, ref status);
            output.Renews     = helper.MapEntityReferenceGuids(input.Renews, 0, ref status);
            output.Revokes    = helper.MapEntityReferenceGuids(input.Revokes, 0, ref status);
            output.Recognizes = helper.MapEntityReferenceGuids(input.Recognizes, 0, ref status);
            output.Regulates  = helper.MapEntityReferenceGuids(input.Regulates, 0, ref status);

            //Ins - defer to later



            //=== if any messages were encountered treat as warnings for now
            if (messages.Count > 0)
            {
                status.SetMessages(messages, true);
            }
            //just in case check if entity added since start
            if (output.Id == 0)
            {
                ThisEntity entity = EntityServices.GetByCtid(ctid);
                if (entity != null && entity.Id > 0)
                {
                    output.Id    = entity.Id;
                    output.RowId = entity.RowId;
                }
            }
            importSuccessfull = mgr.Import(output, ref status);

            status.DocumentId    = output.Id;
            status.DetailPageUrl = string.Format("~/organization/{0}", output.Id);
            status.DocumentRowId = output.RowId;

            //just in case
            if (status.HasErrors)
            {
                importSuccessfull = false;
            }

            //if record was added to db, add to/or set EntityResolution as resolved
            int ierId = new ImportManager().Import_EntityResolutionAdd(referencedAtId,
                                                                       ctid, CodesManager.ENTITY_TYPE_ORGANIZATION,
                                                                       output.RowId,
                                                                       output.Id,
                                                                       false,
                                                                       ref messages,
                                                                       output.Id > 0);

            return(importSuccessfull);
        }
        public bool Import(InputEntity input, string envelopeIdentifier, SaveStatus status)
        {
            List <string>  messages          = new List <string>();
            bool           importSuccessfull = false;
            EntityServices mgr = new EntityServices();

            string ctid           = input.Ctid;
            string referencedAtId = input.CtdlId;

            LoggingHelper.DoTrace(5, "		name: "+ input.Name);
            LoggingHelper.DoTrace(6, "		url: "+ input.SubjectWebpage);
            LoggingHelper.DoTrace(5, "		ctid: "+ input.Ctid);
            LoggingHelper.DoTrace(5, "		@Id: "+ input.CtdlId);
            status.Ctid = ctid;

            if (status.DoingDownloadOnly)
            {
                return(true);
            }

            if (!DoesEntityExist(input.Ctid, ref output))
            {
                //set the rowid now, so that can be referenced as needed
                output.RowId = Guid.NewGuid();
            }


            //re:messages - currently passed to mapping but no errors are trapped??
            //				- should use SaveStatus and skip import if errors encountered (vs warnings)

            output.AgentDomainType = input.Type;
            output.Name            = input.Name;
            output.Description     = input.Description;
            //map from idProperty to url
            output.SubjectWebpage       = input.SubjectWebpage;
            output.CTID                 = input.Ctid;
            output.CredentialRegistryId = envelopeIdentifier;
            //output.AlternateNames = input.AlternateName;
            output.AlternateNames = MappingHelper.MapToTextValueProfile(input.AlternateName);
            output.ImageUrl       = input.Image;

            output.AgentPurpose            = input.AgentPurpose;
            output.AgentPurposeDescription = input.AgentPurposeDescription;

            output.FoundingDate = input.FoundingDate;
            if ((output.FoundingDate ?? "").Length > 20)
            {
                status.AddError("Organization Founding Date error - exceeds 20 characters: " + output.FoundingDate);
                output.FoundingDate = output.FoundingDate.Substring(0, 10);
            }
            output.AvailabilityListing = MappingHelper.MapListToString(input.AvailabilityListing);
            //future prep
            output.AvailabilityListings = input.AvailabilityListing;

            output.MissionAndGoalsStatement            = input.MissionAndGoalsStatement;
            output.MissionAndGoalsStatementDescription = input.MissionAndGoalsStatementDescription;

            output.Addresses = MappingHelper.FormatAddresses(input.Address, ref status);

            //agent type, map to enumeration
            output.AgentType = MappingHelper.MapCAOListToEnumermation(input.AgentType);


            //Manifests
            output.ConditionManifestIds = MappingHelper.MapEntityReferences(input.HasConditionManifest, CodesManager.ENTITY_TYPE_CONDITION_MANIFEST, CodesManager.ENTITY_TYPE_ORGANIZATION, ref status);
            output.CostManifestIds      = MappingHelper.MapEntityReferences(input.HasCostManifest, CodesManager.ENTITY_TYPE_COST_MANIFEST, CodesManager.ENTITY_TYPE_ORGANIZATION, ref status);

            //hasVerificationService
            output.VerificationServiceProfiles = MappingHelper.MapVerificationServiceProfiles(input.VerificationServiceProfiles, ref status);

            // output.targetc
            //other enumerations
            //	serviceType, AgentSectorType
            output.ServiceType     = MappingHelper.MapCAOListToEnumermation(input.ServiceType);
            output.AgentSectorType = MappingHelper.MapCAOListToEnumermation(input.AgentSectorType);

            //Industries
            output.Industry   = MappingHelper.MapCAOListToEnumermation(input.IndustryType);
            output.Industries = MappingHelper.MapCAOListToFramework(input.IndustryType);
            //naics
            output.Naics = input.Naics;

            //keywords
            output.Keyword = MappingHelper.MapToTextValueProfile(input.Keyword);

            //duns, Fein.  IpedsID, opeID
            if (!string.IsNullOrWhiteSpace(input.DUNS))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:duns", TextValue = input.DUNS
                });
            }
            if (!string.IsNullOrWhiteSpace(input.FEIN))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:fein", TextValue = input.FEIN
                });
            }

            if (!string.IsNullOrWhiteSpace(input.IpedsID))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:ipedsID", TextValue = input.IpedsID
                });
            }

            if (!string.IsNullOrWhiteSpace(input.OPEID))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:opeID", TextValue = input.OPEID
                });
            }
            if (!string.IsNullOrWhiteSpace(input.LEICode))
            {
                output.IdentificationCodes.Add(new workIT.Models.ProfileModels.TextValueProfile {
                    CodeSchema = "ceterms:leiCode", TextValue = input.LEICode
                });
            }
            //alternativeidentifier - should just be added to IdentificationCodes
            output.AlternativeIdentifier     = MappingHelper.MapIdentifierValueListToString(input.AlternativeIdentifier);
            output.AlternativeIdentifierList = MappingHelper.MapIdentifierValueList(input.AlternativeIdentifier);

            //email

            output.Emails = MappingHelper.MapToTextValueProfile(input.Email);
            //contact point - now in address
            //output.ContactPoint = MappingHelper.FormatContactPoints( input.ContactPoint, ref status );
            //Jurisdiction
            output.Jurisdiction = MappingHelper.MapToJurisdiction(input.Jurisdiction, ref status);

            //SameAs
            output.SameAs = MappingHelper.MapToTextValueProfile(input.SameAs);
            //Social media
            output.SocialMediaPages = MappingHelper.MapToTextValueProfile(input.SocialMedia);

            //departments
            //not sure - MP - want to change how depts, and subs are handled
            //output.ParentOrganization = MappingHelper.MapOrganizationReferenceGuids( input.ParentOrganization, ref status );
            output.Departments      = MappingHelper.MapOrganizationReferenceGuids(input.Department, ref status);
            output.SubOrganizations = MappingHelper.MapOrganizationReferenceGuids(input.SubOrganization, ref status);

            //output.OrganizationRole_Subsidiary = MappingHelper.FormatOrganizationReferences( input.SubOrganization );

            //Process profiles
            output.AdministrationProcess = MappingHelper.FormatProcessProfile(input.AdministrationProcess, ref status);
            output.MaintenanceProcess    = MappingHelper.FormatProcessProfile(input.MaintenanceProcess, ref status);
            output.ComplaintProcess      = MappingHelper.FormatProcessProfile(input.ComplaintProcess, ref status);
            output.DevelopmentProcess    = MappingHelper.FormatProcessProfile(input.DevelopmentProcess, ref status);
            output.RevocationProcess     = MappingHelper.FormatProcessProfile(input.RevocationProcess, ref status);
            output.ReviewProcess         = MappingHelper.FormatProcessProfile(input.ReviewProcess, ref status);
            output.AppealProcess         = MappingHelper.FormatProcessProfile(input.AppealProcess, ref status);

            //BYs
            output.AccreditedBy = MappingHelper.MapOrganizationReferenceGuids(input.AccreditedBy, ref status);
            output.ApprovedBy   = MappingHelper.MapOrganizationReferenceGuids(input.ApprovedBy, ref status);
            output.RecognizedBy = MappingHelper.MapOrganizationReferenceGuids(input.RecognizedBy, ref status);
            output.RegulatedBy  = MappingHelper.MapOrganizationReferenceGuids(input.RegulatedBy, ref status);
            //INs
            output.AccreditedIn = MappingHelper.MapToJurisdiction(input.AccreditedIn, ref status);
            output.ApprovedIn   = MappingHelper.MapToJurisdiction(input.ApprovedIn, ref status);
            output.RecognizedIn = MappingHelper.MapToJurisdiction(input.RecognizedIn, ref status);
            output.RegulatedIn  = MappingHelper.MapToJurisdiction(input.RegulatedIn, ref status);

            //Asserts
            //the entity type is not known
            output.Accredits  = MappingHelper.MapEntityReferenceGuids(input.Accredits, 0, ref status);
            output.Approves   = MappingHelper.MapEntityReferenceGuids(input.Approves, 0, ref status);
            output.Offers     = MappingHelper.MapEntityReferenceGuids(input.Offers, 0, ref status);
            output.Owns       = MappingHelper.MapEntityReferenceGuids(input.Owns, 0, ref status);
            output.Renews     = MappingHelper.MapEntityReferenceGuids(input.Renews, 0, ref status);
            output.Revokes    = MappingHelper.MapEntityReferenceGuids(input.Revokes, 0, ref status);
            output.Recognizes = MappingHelper.MapEntityReferenceGuids(input.Recognizes, 0, ref status);
            output.Regulates  = MappingHelper.MapEntityReferenceGuids(input.Regulates, 0, ref status);

            //Ins - defer to later



            //=== if any messages were encountered treat as warnings for now
            if (messages.Count > 0)
            {
                status.SetMessages(messages, true);
            }
            //just in case check if entity added since start
            if (output.Id == 0)
            {
                ThisEntity entity = EntityServices.GetByCtid(ctid);
                if (entity != null && entity.Id > 0)
                {
                    output.Id    = entity.Id;
                    output.RowId = entity.RowId;
                }
            }
            importSuccessfull = mgr.Import(output, ref status);

            status.DocumentId    = output.Id;
            status.DetailPageUrl = string.Format("~/organization/{0}", output.Id);
            status.DocumentRowId = output.RowId;

            //just in case
            if (status.HasErrors)
            {
                importSuccessfull = false;
            }

            //if record was added to db, add to/or set EntityResolution as resolved
            int ierId = new ImportManager().Import_EntityResolutionAdd(referencedAtId,
                                                                       ctid, CodesManager.ENTITY_TYPE_ORGANIZATION,
                                                                       output.RowId,
                                                                       output.Id,
                                                                       (output.Id > 0),
                                                                       ref messages,
                                                                       output.Id > 0);

            return(importSuccessfull);
        }