internal void AddAddressReferences(List <AddressRelation> references, VirkningType virkning, RegistreringType1 registration) { if (references == null || references.Count == 0) { return; } var adresses = new AdresseFlerRelationType[references.Count]; int referencesCount = references.Count; registration.RelationListe.Adresser = new AdresseFlerRelationType[referencesCount]; for (int i = 0; i < referencesCount; i++) { AddressRelation addressRelation = references[i]; switch (addressRelation.Type) { case AddressRelationType.URL: AdresseFlerRelationType urlAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGFUNCTION_URL, virkning); registration.RelationListe.Adresser[i] = urlAddress; break; default: throw new Exception("Cannot import OrganisationFunktion with addressRelationType = " + addressRelation.Type); } } }
internal void AddAddressReferences(List <AddressRelation> references, VirkningType virkning, RegistreringType1 registration) { if (references == null || references.Count == 0) { return; } var adresses = new AdresseFlerRelationType[references.Count]; int referencesCount = references.Count; registration.RelationListe.Adresser = new AdresseFlerRelationType[referencesCount]; for (int i = 0; i < referencesCount; i++) { AddressRelation addressRelation = references[i]; switch (addressRelation.Type) { case AddressRelationType.EMAIL: AdresseFlerRelationType emailAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_USER_EMAIL, virkning); registration.RelationListe.Adresser[i] = emailAddress; break; case AddressRelationType.RACFID: AdresseFlerRelationType racfId = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_USER_RACFID, virkning); registration.RelationListe.Adresser[i] = racfId; break; case AddressRelationType.PHONE: AdresseFlerRelationType phoneAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_USER_PHONE, virkning); registration.RelationListe.Adresser[i] = phoneAddress; break; case AddressRelationType.LOCATION: AdresseFlerRelationType locationAddres = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_USER_LOCATION, virkning); registration.RelationListe.Adresser[i] = locationAddres; break; default: throw new Exception("Cannot import Bruger with addressRelationType = " + addressRelation.Type); } } }
internal AdresseFlerRelationType CreateAddressReference(string uuid, int indeks, string roleUuid, VirkningType virkning) { UnikIdType type = new UnikIdType(); type.Item = UUIDConstants.ADDRESS_TYPE_USER; type.ItemElementName = ItemChoiceType.UUIDIdentifikator; UnikIdType role = new UnikIdType(); role.ItemElementName = ItemChoiceType.UUIDIdentifikator; role.Item = roleUuid; AdresseFlerRelationType address = new AdresseFlerRelationType(); address.ReferenceID = StubUtil.GetReference <UnikIdType>(uuid, ItemChoiceType.UUIDIdentifikator); address.Virkning = virkning; address.Indeks = "" + indeks; address.Rolle = role; address.Type = type; return(address); }
public void Ret(OrgUnitData unit) { log.Debug("Attempting Ret on OrganisationEnhed with uuid " + unit.Uuid); RegistreringType1 registration = GetLatestRegistration(unit.Uuid); if (registration == null) { log.Debug("Cannot call Ret on OrganisationEnhed with uuid " + unit.Uuid + " because it does not exist in Organisation"); return; } VirkningType virkning = helper.GetVirkning(unit.Timestamp); OrganisationEnhedPortType channel = StubUtil.CreateChannel <OrganisationEnhedPortType>(OrganisationEnhedStubHelper.SERVICE, "Ret", helper.CreatePort()); try { bool changes = false; RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = unit.Uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; changes = helper.SetTilstandToActive(virkning, registration, unit.Timestamp) | changes; #region Update attributes // compare latest property to the local object EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe.Egenskab); if (latestProperty == null || !latestProperty.EnhedNavn.Equals(unit.Name) || (unit.ShortKey != null && !latestProperty.BrugervendtNoegleTekst.Equals(unit.ShortKey))) { if (latestProperty == null) { EnsureKeys(unit); } // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(unit.Timestamp); newProperty.BrugervendtNoegleTekst = ((unit.ShortKey != null) ? unit.ShortKey : latestProperty.BrugervendtNoegleTekst); newProperty.EnhedNavn = unit.Name; // create a new set of properties input.AttributListe.Egenskab = new EgenskabType[1]; input.AttributListe.Egenskab[0] = newProperty; changes = true; } #endregion #region Update address relationships // terminate the Virkning on all address relationships that no longer exists locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.Adresser, unit.Addresses, unit.Timestamp, true) || changes; // add references to address objects that are new List <string> uuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.Adresser, unit.Addresses, true); if (uuidsToAdd.Count > 0) { int size = uuidsToAdd.Count + ((input.RelationListe.Adresser != null) ? input.RelationListe.Adresser.Length : 0); AdresseFlerRelationType[] newAdresser = new AdresseFlerRelationType[size]; int i = 0; if (input.RelationListe.Adresser != null) { foreach (var addressInOrg in input.RelationListe.Adresser) { newAdresser[i++] = addressInOrg; } } foreach (string uuidToAdd in uuidsToAdd) { foreach (var addressInLocal in unit.Addresses) { if (addressInLocal.Uuid.Equals(uuidToAdd)) { string roleUuid = null; switch (addressInLocal.Type) { case AddressRelationType.EMAIL: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_EMAIL; break; case AddressRelationType.PHONE: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_PHONE; break; case AddressRelationType.LOCATION: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_LOCATION; break; case AddressRelationType.LOSSHORTNAME: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_LOSSHORTNAME; break; case AddressRelationType.CONTACT_ADDRESS_OPEN_HOURS: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_CONTACT_ADDRESS_OPEN_HOURS; break; case AddressRelationType.DTR_ID: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_DTR_ID; break; case AddressRelationType.URL: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_URL; break; case AddressRelationType.LANDLINE: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_LANDLINE; break; case AddressRelationType.EAN: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_EAN; break; case AddressRelationType.LOSID: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_LOSID; break; case AddressRelationType.EMAIL_REMARKS: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_EMAIL_REMARKS; break; case AddressRelationType.POST_RETURN: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_POST_RETURN; break; case AddressRelationType.CONTACT_ADDRESS: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_CONTACT_ADDRESS; break; case AddressRelationType.POST: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_POST; break; case AddressRelationType.PHONE_OPEN_HOURS: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGUNIT_PHONE_OPEN_HOURS; break; default: log.Warn("Cannot add relationship to address of type " + addressInLocal.Type + " with uuid " + addressInLocal.Uuid + " as the type is unknown"); continue; } AdresseFlerRelationType newAddress = helper.CreateAddressReference(uuidToAdd, (i + 1), roleUuid, virkning); newAdresser[i++] = newAddress; } } } input.RelationListe.Adresser = newAdresser; changes = true; } #endregion #region Update organisation relationship if (registration.RelationListe.Tilhoerer != null) { // make sure that the pointer is set correctly if (!StubUtil.GetMunicipalityOrganisationUUID().Equals(registration.RelationListe.Tilhoerer.ReferenceID.Item)) { registration.RelationListe.Tilhoerer.ReferenceID.Item = StubUtil.GetMunicipalityOrganisationUUID(); changes = true; } // update the Virkning on the Tilhører relationship if needed (undelete feature) object endTime = registration.RelationListe.Tilhoerer.Virkning.TilTidspunkt.Item; if ((endTime is DateTime) && (DateTime.Compare(DateTime.Now, (DateTime)endTime) >= 0)) { log.Debug("Re-establishing relationship with Organisation for OrgUnit " + unit.Uuid); registration.RelationListe.Tilhoerer.Virkning = virkning; changes = true; } } else { // no existing relationship (should actually never happen, but let us just take care of it) helper.AddOrganisationRelation(StubUtil.GetMunicipalityOrganisationUUID(), virkning, registration); changes = true; } #endregion #region Update parent relationship if (registration.RelationListe.Overordnet != null) { // there is an existing Overordnet relationship, so let us see if there is a change if (unit.ParentOrgUnitUuid != null) { bool expired = false; object endDate = registration.RelationListe.Overordnet.Virkning.TilTidspunkt.Item; if (endDate != null && endDate is DateTime && DateTime.Compare(DateTime.Now, (DateTime)endDate) >= 0) { expired = true; } if (expired || !registration.RelationListe.Overordnet.ReferenceID.Item.Equals(unit.ParentOrgUnitUuid)) { // overwrite the existing values (we cannot create multiple references on this, so it is the best we can do with regards to storing full history in the latest registration) registration.RelationListe.Overordnet.ReferenceID = StubUtil.GetReference <UnikIdType>(unit.ParentOrgUnitUuid, ItemChoiceType.UUIDIdentifikator); registration.RelationListe.Overordnet.Virkning = virkning; changes = true; } } else { // attempt to terminate the existing relationship (it might already be terminated) if (StubUtil.TerminateVirkning(registration.RelationListe.Overordnet.Virkning, unit.Timestamp)) { changes = true; } } } else if (unit.ParentOrgUnitUuid != null) { // no existing parent, so just create one helper.AddOverordnetEnhed(unit.ParentOrgUnitUuid, virkning, registration); changes = true; } #endregion #region Update opgaver if (helper.UpdateOpgaver(unit.Tasks, virkning, registration, unit.Timestamp)) { changes = true; } #endregion #region Update function references (PayoutUnits) // TODO: if we ever have other functions for OrgUnits than payout units, this solution will not work if (!registry.DisableUdbetalingsenheder) { // terminate the Virkning on all functions (currently there is only one, the payout unit, but this will work for all kinds of functions) changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.TilknyttedeFunktioner, unit.OrgFunctionUuids, unit.Timestamp, false) || changes; // add references to function objects that are new List <string> functionUuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.TilknyttedeFunktioner, unit.OrgFunctionUuids, false); if (functionUuidsToAdd.Count > 0) { int size = functionUuidsToAdd.Count + ((input.RelationListe.TilknyttedeFunktioner != null) ? input.RelationListe.TilknyttedeFunktioner.Length : 0); OrganisationFunktionFlerRelationType[] newFunctions = new OrganisationFunktionFlerRelationType[size]; int i = 0; if (input.RelationListe.TilknyttedeFunktioner != null) { foreach (var functionsInOrg in input.RelationListe.TilknyttedeFunktioner) { newFunctions[i++] = functionsInOrg; } } foreach (string uuidToAdd in functionUuidsToAdd) { OrganisationFunktionFlerRelationType newFunction = new OrganisationFunktionFlerRelationType(); newFunction.ReferenceID = StubUtil.GetReference <UnikIdType>(uuidToAdd, ItemChoiceType.UUIDIdentifikator); newFunction.Virkning = virkning; newFunctions[i++] = newFunction; } input.RelationListe.TilknyttedeFunktioner = newFunctions; changes = true; } } #endregion #region Update Type if (helper.SetType(unit.OrgUnitType, virkning, registration)) { changes = true; } #endregion // if no changes are made, we do not call the service if (!changes) { log.Debug("Ret on OrganisationEnhed with uuid " + unit.Uuid + " cancelled because of no changes"); return; } // send Ret request retRequest request = new retRequest(); request.RetRequest1 = new RetRequestType(); request.RetRequest1.RetInput = input; request.RetRequest1.AuthorityContext = new AuthorityContextType(); request.RetRequest1.AuthorityContext.MunicipalityCVR = OrganisationRegistryProperties.GetCurrentMunicipality(); retResponse response = channel.ret(request); int statusCode = Int32.Parse(response.RetResponse1.RetOutput.StandardRetur.StatusKode); if (statusCode != 20) { if (statusCode == 49) { log.Warn("Ret failed on OrgUnit " + unit.Uuid + " as Organisation returned status 49. The most likely cause is that the object has been Passiveret"); return; } string message = StubUtil.ConstructSoapErrorMessage(statusCode, "Ret", OrganisationEnhedStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret succesful on OrganisationEnhed with uuid " + unit.Uuid); } catch (Exception ex) when(ex is CommunicationException || ex is IOException || ex is TimeoutException || ex is WebException) { throw new ServiceNotFoundException("Failed to establish connection to the Ret service on OrganisationEnhed", ex); } }
public void Ret(UserData user) { log.Debug("Attempting Ret on Bruger with uuid " + user.Uuid); RegistreringType1 registration = GetLatestRegistration(user.Uuid); if (registration == null) { log.Debug("Cannot call Ret on Bruger with uuid " + user.Uuid + " because it does not exist in Organisation"); return; } VirkningType virkning = helper.GetVirkning(user.Timestamp); BrugerPortType channel = StubUtil.CreateChannel <BrugerPortType>(BrugerStubHelper.SERVICE, "Ret", helper.CreatePort()); try { bool changes = false; RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = user.Uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; // set Tilstand to Active (idempotent change - but it ensures that a previously deactived object is re-activated) changes = helper.SetTilstandToActive(virkning, registration, user.Timestamp) | changes; #region Update attributes // compare latest property to the local object EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe.Egenskab); if (latestProperty == null || !latestProperty.BrugerNavn.Equals(user.UserId) || (user.ShortKey != null && !latestProperty.BrugervendtNoegleTekst.Equals(user.ShortKey))) { // end the validity of open-ended property if (latestProperty == null) { // create ShortKey if not supplied EnsureKeys(user); } // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(user.Timestamp); newProperty.BrugervendtNoegleTekst = ((user.ShortKey != null) ? user.ShortKey : latestProperty.BrugervendtNoegleTekst); newProperty.BrugerNavn = user.UserId; // create a new set of properties input.AttributListe.Egenskab = new EgenskabType[1]; input.AttributListe.Egenskab[0] = newProperty; changes = true; } #endregion #region Update address relationships // terminate the Virkning on all address relationships that no longer exists locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.Adresser, user.Addresses, user.Timestamp, true) || changes; // add references to address objects that are new List <string> uuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.Adresser, user.Addresses, true); if (uuidsToAdd.Count > 0) { int size = uuidsToAdd.Count + ((input.RelationListe.Adresser != null) ? input.RelationListe.Adresser.Length : 0); AdresseFlerRelationType[] newAdresser = new AdresseFlerRelationType[size]; int i = 0; if (input.RelationListe.Adresser != null) { foreach (var addressInOrg in input.RelationListe.Adresser) { newAdresser[i++] = addressInOrg; } } foreach (string uuidToAdd in uuidsToAdd) { foreach (var addressInLocal in user.Addresses) { if (addressInLocal.Uuid.Equals(uuidToAdd)) { string roleUuid = null; switch (addressInLocal.Type) { case AddressRelationType.EMAIL: roleUuid = UUIDConstants.ADDRESS_ROLE_USER_EMAIL; break; case AddressRelationType.PHONE: roleUuid = UUIDConstants.ADDRESS_ROLE_USER_PHONE; break; case AddressRelationType.LOCATION: roleUuid = UUIDConstants.ADDRESS_ROLE_USER_LOCATION; break; default: log.Warn("Cannot add relationship to address of type " + addressInLocal.Type + " with uuid " + addressInLocal.Uuid + " as the type is unknown"); continue; } AdresseFlerRelationType newAddress = helper.CreateAddressReference(uuidToAdd, (i + 1), roleUuid, virkning); newAdresser[i++] = newAddress; } } } input.RelationListe.Adresser = newAdresser; changes = true; } #endregion #region Update organisation relationship if (registration.RelationListe.Tilhoerer != null) { // make sure that the pointer is set correctly if (!StubUtil.GetMunicipalityOrganisationUUID().Equals(registration.RelationListe.Tilhoerer.ReferenceID.Item)) { registration.RelationListe.Tilhoerer.ReferenceID.Item = StubUtil.GetMunicipalityOrganisationUUID(); changes = true; } // update the Virkning on the Tilhører relationship if needed (undelete feature) object endTime = registration.RelationListe.Tilhoerer.Virkning.TilTidspunkt.Item; if (endTime is DateTime && (DateTime.Compare(DateTime.Now, (DateTime)endTime) >= 0)) { log.Debug("Re-establishing relationship with Organisation for Bruger " + user.Uuid); registration.RelationListe.Tilhoerer.Virkning = virkning; changes = true; } } else { // no existing relationship (should actually never happen, but let us just take care of it) helper.AddOrganisationRelation(StubUtil.GetMunicipalityOrganisationUUID(), virkning, registration); changes = true; } #endregion #region Update person relationship PersonFlerRelationType existingPerson = BrugerStubHelper.GetLatestPersonFlerRelationType(registration.RelationListe.TilknyttedePersoner); if (existingPerson != null) { // It really shouldn't happen that often that the Person reference changes on a User, but we support it nonetheless if (!existingPerson.ReferenceID.Item.Equals(user.PersonUuid)) { // terminiate existing relationship, and add a new one StubUtil.TerminateVirkning(existingPerson.Virkning, user.Timestamp); // create a new person relation PersonFlerRelationType newPerson = new PersonFlerRelationType(); newPerson.Virkning = helper.GetVirkning(user.Timestamp); newPerson.ReferenceID = StubUtil.GetReference <UnikIdType>(user.PersonUuid, ItemChoiceType.UUIDIdentifikator); // create a new set of person references, containing the new user PersonFlerRelationType[] oldPersons = registration.RelationListe.TilknyttedePersoner; input.RelationListe.TilknyttedePersoner = new PersonFlerRelationType[oldPersons.Length + 1]; for (int i = 0; i < oldPersons.Length; i++) { input.RelationListe.TilknyttedePersoner[i] = oldPersons[i]; } input.RelationListe.TilknyttedePersoner[oldPersons.Length] = newPerson; changes = true; } } else { // This really shouldn't have happened, as it means we have an existing User without a Person attached - but // we will just fix it, and create the reference on this user log.Warn("Ret on Bruge with uuid " + user.Uuid + " encountered a registration with NO relationship to a Person - fixing it!"); helper.AddPersonRelationship(user.PersonUuid, virkning, registration); changes = true; } #endregion // if no changes are made, we do not call the service if (!changes) { log.Debug("Ret on Bruger with uuid " + user.Uuid + " cancelled because of no changes"); return; } // send Ret request retRequest request = new retRequest(); request.RetRequest1 = new RetRequestType(); request.RetRequest1.RetInput = input; request.RetRequest1.AuthorityContext = new AuthorityContextType(); request.RetRequest1.AuthorityContext.MunicipalityCVR = OrganisationRegistryProperties.GetMunicipality(); retResponse response = channel.ret(request); int statusCode = Int32.Parse(response.RetResponse1.RetOutput.StandardRetur.StatusKode); if (statusCode != 20) { string message = StubUtil.ConstructSoapErrorMessage(statusCode, "Ret", BrugerStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret succesful on Bruger with uuid " + user.Uuid); } catch (Exception ex) when(ex is CommunicationException || ex is IOException || ex is TimeoutException || ex is WebException) { throw new ServiceNotFoundException("Failed to establish connection to the Ret service on Bruger", ex); } }
public void Ret(OrgFunctionData orgFunction, UpdateIndicator userIndicator, UpdateIndicator unitIndicator, UpdateIndicator taskIndicator) { log.Debug("Attempting Ret on OrganisationFunction with uuid " + orgFunction.Uuid); RegistreringType1 registration = GetLatestRegistration(orgFunction.Uuid); if (registration == null) { log.Debug("Cannot call Ret on OrganisationFunktion with uuid " + orgFunction.Uuid + " because it does not exist in Organisation"); return; } VirkningType virkning = helper.GetVirkning(orgFunction.Timestamp); OrganisationFunktionPortType channel = StubUtil.CreateChannel <OrganisationFunktionPortType>(OrganisationFunktionStubHelper.SERVICE, "Ret", helper.CreatePort()); try { bool changes = false; RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = orgFunction.Uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; changes = helper.SetTilstandToActive(virkning, registration, orgFunction.Timestamp) | changes; #region Update attributes if needed EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe.Egenskab); if (latestProperty == null || latestProperty.FunktionNavn == null || (orgFunction.Name != null && !latestProperty.FunktionNavn.Equals(orgFunction.Name)) || (orgFunction.ShortKey != null && !latestProperty.BrugervendtNoegleTekst.Equals(orgFunction.ShortKey))) { if (latestProperty == null) { orgFunction.ShortKey = (orgFunction.ShortKey != null) ? orgFunction.ShortKey : IdUtil.GenerateShortKey(); // special case where editing a function that has been orphaned, without supplying a name - should never really happen, but the API allows it orgFunction.Name = (orgFunction.Name != null) ? orgFunction.Name : "Unknown Function"; } // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(orgFunction.Timestamp); newProperty.BrugervendtNoegleTekst = (orgFunction.ShortKey != null) ? orgFunction.ShortKey : latestProperty.BrugervendtNoegleTekst; newProperty.FunktionNavn = (orgFunction.Name != null) ? orgFunction.Name : latestProperty.FunktionNavn; // create a new set of properties input.AttributListe.Egenskab = new EgenskabType[1]; input.AttributListe.Egenskab[0] = newProperty; changes = true; } #endregion #region update tasks if needed if (taskIndicator.Equals(UpdateIndicator.COMPARE)) { // terminate the Virkning on all address relationships that no longer exists locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.Opgaver, orgFunction.Tasks, orgFunction.Timestamp, true) || changes; // add references to address objects that are new List <string> taskUuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.Opgaver, orgFunction.Tasks, true); if (taskUuidsToAdd.Count > 0) { int size = taskUuidsToAdd.Count + ((input.RelationListe.Opgaver != null) ? input.RelationListe.Opgaver.Length : 0); KlasseFlerRelationType[] newTasks = new KlasseFlerRelationType[size]; int i = 0; if (input.RelationListe.Opgaver != null) { foreach (var taskInOrg in input.RelationListe.Opgaver) { newTasks[i++] = taskInOrg; } } foreach (string uuidToAdd in taskUuidsToAdd) { foreach (var taskInLocal in orgFunction.Tasks) { if (taskInLocal.Equals(uuidToAdd)) { KlasseFlerRelationType newTask = helper.CreateOpgaveRelation(uuidToAdd, virkning); newTasks[i++] = newTask; } } } input.RelationListe.Opgaver = newTasks; changes = true; } } #endregion #region Update TilknyttedeBrugere relationships // terminate references if (userIndicator.Equals(UpdateIndicator.COMPARE)) { // terminate the references in Org that no longer exist locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.TilknyttedeBrugere, orgFunction.Users, orgFunction.Timestamp, false) || changes; } else if (userIndicator.Equals(UpdateIndicator.REMOVE)) { changes = TerminateObjectsInOrgThatAreInLocal(input.RelationListe.TilknyttedeBrugere, orgFunction.Users, orgFunction.Timestamp) || changes; } if (userIndicator.Equals(UpdateIndicator.COMPARE) || userIndicator.Equals(UpdateIndicator.ADD)) { // get the set of new local objects only List <string> uuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.TilknyttedeBrugere, orgFunction.Users, false); // add all the new references if (uuidsToAdd.Count > 0) { int size = uuidsToAdd.Count + ((input.RelationListe.TilknyttedeBrugere != null) ? input.RelationListe.TilknyttedeBrugere.Length : 0); BrugerFlerRelationType[] newUsers = new BrugerFlerRelationType[size]; int i = 0; if (input.RelationListe.TilknyttedeBrugere != null) { foreach (var usersInOrg in input.RelationListe.TilknyttedeBrugere) { newUsers[i++] = usersInOrg; } } foreach (string uuidToAdd in uuidsToAdd) { newUsers[i++] = helper.CreateBrugerRelation(uuidToAdd, virkning); } input.RelationListe.TilknyttedeBrugere = newUsers; changes = true; } } #endregion #region Update TilknyttedeEnheder relationships // terminate references if (unitIndicator.Equals(UpdateIndicator.COMPARE)) { // terminate the references in Org that no longer exist locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.TilknyttedeEnheder, orgFunction.OrgUnits, orgFunction.Timestamp, false) || changes; } else if (unitIndicator.Equals(UpdateIndicator.REMOVE)) { changes = TerminateObjectsInOrgThatAreInLocal(input.RelationListe.TilknyttedeEnheder, orgFunction.OrgUnits, orgFunction.Timestamp) || changes; } if (unitIndicator.Equals(UpdateIndicator.COMPARE) || unitIndicator.Equals(UpdateIndicator.ADD)) { // get the set of new local objects List <string> uuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.TilknyttedeEnheder, orgFunction.OrgUnits, false); // add all the new references if (uuidsToAdd.Count > 0) { int size = uuidsToAdd.Count + ((input.RelationListe.TilknyttedeEnheder != null) ? input.RelationListe.TilknyttedeEnheder.Length : 0); OrganisationEnhedFlerRelationType[] newUnits = new OrganisationEnhedFlerRelationType[size]; int i = 0; if (input.RelationListe.TilknyttedeEnheder != null) { foreach (var unit in input.RelationListe.TilknyttedeEnheder) { newUnits[i++] = unit; } } foreach (string uuidToAdd in uuidsToAdd) { newUnits[i++] = helper.CreateOrgEnhedRelation(uuidToAdd, virkning); } input.RelationListe.TilknyttedeEnheder = newUnits; changes = true; } } #endregion #region Update organisation relationship bool foundExistingValidOrganisationRelation = false; if (registration.RelationListe.TilknyttedeOrganisationer != null && registration.RelationListe.TilknyttedeOrganisationer.Length > 0) { foreach (OrganisationFlerRelationType orgRelation in registration.RelationListe.TilknyttedeOrganisationer) { // make sure that the pointer is set correctly if (!StubUtil.GetMunicipalityOrganisationUUID().Equals(orgRelation.ReferenceID.Item)) { orgRelation.ReferenceID.Item = StubUtil.GetMunicipalityOrganisationUUID(); changes = true; } // update the Virkning on the TilknyttedeOrganisationer relationship if needed (undelete feature) object endTime = orgRelation.Virkning.TilTidspunkt.Item; // endTime is bool => ok // endTime is DateTime, but Now is before endTime => ok if (!(endTime is DateTime) || (DateTime.Compare(DateTime.Now, (DateTime)endTime) < 0)) { foundExistingValidOrganisationRelation = true; } } } if (!foundExistingValidOrganisationRelation) { helper.AddOrganisationRelation(StubUtil.GetMunicipalityOrganisationUUID(), virkning, registration); changes = true; } #endregion // TODO: addresses are not currently used for functions, this is a left-over from the days of it-systems and JumpUrls #region Update Address relationships // terminate the Virkning on all address relationships that no longer exists locally changes = StubUtil.TerminateObjectsInOrgNoLongerPresentLocally(input.RelationListe.Adresser, orgFunction.Addresses, orgFunction.Timestamp, true) || changes; // add references to address objects that are new List <string> addressUuidsToAdd = StubUtil.FindAllObjectsInLocalNotInOrg(input.RelationListe.Adresser, orgFunction.Addresses, true); if (addressUuidsToAdd.Count > 0) { int size = addressUuidsToAdd.Count + ((input.RelationListe.Adresser != null) ? input.RelationListe.Adresser.Length : 0); AdresseFlerRelationType[] newAdresser = new AdresseFlerRelationType[size]; int i = 0; if (input.RelationListe.Adresser != null) { foreach (var addressInOrg in input.RelationListe.Adresser) { newAdresser[i++] = addressInOrg; } } foreach (string uuidToAdd in addressUuidsToAdd) { foreach (var addressInLocal in orgFunction.Addresses) { if (addressInLocal.Uuid.Equals(uuidToAdd)) { string roleUuid = null; switch (addressInLocal.Type) { case AddressRelationType.URL: roleUuid = UUIDConstants.ADDRESS_ROLE_ORGFUNCTION_URL; break; default: log.Warn("Cannot add relationship to address of type " + addressInLocal.Type + " with uuid " + addressInLocal.Uuid + " as the type is unknown"); continue; } AdresseFlerRelationType newAddress = helper.CreateAddressReference(uuidToAdd, (i + 1), roleUuid, virkning); newAdresser[i++] = newAddress; } } } input.RelationListe.Adresser = newAdresser; changes = true; } #endregion // if no changes are made, we do not call the service if (!changes) { log.Debug("Ret on OrganisationFunktion with uuid " + orgFunction.Uuid + " cancelled because of no changes"); return; } // send Ret request retRequest request = new retRequest(); request.RetRequest1 = new RetRequestType(); request.RetRequest1.RetInput = input; request.RetRequest1.AuthorityContext = new AuthorityContextType(); request.RetRequest1.AuthorityContext.MunicipalityCVR = OrganisationRegistryProperties.GetMunicipality(); retResponse response = channel.ret(request); int statusCode = Int32.Parse(response.RetResponse1.RetOutput.StandardRetur.StatusKode); if (statusCode != 20) { string message = StubUtil.ConstructSoapErrorMessage(statusCode, "Ret", OrganisationFunktionStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret succesful on OrganisationFunktion with uuid " + orgFunction.Uuid); } catch (Exception ex) when(ex is CommunicationException || ex is IOException || ex is TimeoutException || ex is WebException) { throw new ServiceNotFoundException("Failed to establish connection to the Ret service on OrganisationFunktion", ex); } }
internal void AddAddressReferences(List <AddressRelation> references, VirkningType virkning, RegistreringType1 registration) { if (references == null || references.Count == 0) { return; } var adresses = new AdresseFlerRelationType[references.Count]; int referencesCount = references.Count; registration.RelationListe.Adresser = new AdresseFlerRelationType[referencesCount]; for (int i = 0; i < referencesCount; i++) { AddressRelation addressRelation = references[i]; switch (addressRelation.Type) { case AddressRelationType.EMAIL: AdresseFlerRelationType emailAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_EMAIL, virkning); registration.RelationListe.Adresser[i] = emailAddress; break; case AddressRelationType.PHONE: AdresseFlerRelationType phoneAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_PHONE, virkning); registration.RelationListe.Adresser[i] = phoneAddress; break; case AddressRelationType.LOCATION: AdresseFlerRelationType locationAddres = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_LOCATION, virkning); registration.RelationListe.Adresser[i] = locationAddres; break; case AddressRelationType.LOSSHORTNAME: AdresseFlerRelationType losAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_LOSSHORTNAME, virkning); registration.RelationListe.Adresser[i] = losAddress; break; case AddressRelationType.CONTACT_ADDRESS_OPEN_HOURS: AdresseFlerRelationType contactOpenHoursAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_CONTACT_ADDRESS_OPEN_HOURS, virkning); registration.RelationListe.Adresser[i] = contactOpenHoursAddress; break; case AddressRelationType.DTR_ID: AdresseFlerRelationType dtrId = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_DTR_ID, virkning); registration.RelationListe.Adresser[i] = dtrId; break; case AddressRelationType.URL: AdresseFlerRelationType urlAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_URL, virkning); registration.RelationListe.Adresser[i] = urlAddress; break; case AddressRelationType.LANDLINE: AdresseFlerRelationType landlineAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_LANDLINE, virkning); registration.RelationListe.Adresser[i] = landlineAddress; break; case AddressRelationType.EAN: AdresseFlerRelationType eanAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_EAN, virkning); registration.RelationListe.Adresser[i] = eanAddress; break; case AddressRelationType.LOSID: AdresseFlerRelationType losIdAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_LOSID, virkning); registration.RelationListe.Adresser[i] = losIdAddress; break; case AddressRelationType.PHONE_OPEN_HOURS: AdresseFlerRelationType phoneOpenHoursAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_PHONE_OPEN_HOURS, virkning); registration.RelationListe.Adresser[i] = phoneOpenHoursAddress; break; case AddressRelationType.POST: AdresseFlerRelationType postAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_POST, virkning); registration.RelationListe.Adresser[i] = postAddress; break; case AddressRelationType.CONTACT_ADDRESS: AdresseFlerRelationType contactAddress = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_CONTACT_ADDRESS, virkning); registration.RelationListe.Adresser[i] = contactAddress; break; case AddressRelationType.EMAIL_REMARKS: AdresseFlerRelationType emailRemarks = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_EMAIL_REMARKS, virkning); registration.RelationListe.Adresser[i] = emailRemarks; break; case AddressRelationType.POST_RETURN: AdresseFlerRelationType postReturn = CreateAddressReference(addressRelation.Uuid, (i + 1), UUIDConstants.ADDRESS_ROLE_ORGUNIT_POST_RETURN, virkning); registration.RelationListe.Adresser[i] = postReturn; break; default: throw new Exception("Cannot import OrganisationEnhed with addressRelationType = " + addressRelation.Type); } } }