// this method only performs a call to Ret on Organisation if there are actual changes public void Ret(string uuid, string newValue, string newShortKey, DateTime timestamp, RegistreringType1 registration) { log.Debug("Attempting Ret on Address with uuid " + uuid); AdressePortType channel = StubUtil.CreateChannel <AdressePortType>(AdresseStubHelper.SERVICE, "Ret", helper.CreatePort()); try { RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; // compare latest property to the local object EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe); if (latestProperty == null || !latestProperty.AdresseTekst.Equals(newValue) || (newShortKey != null && !latestProperty.BrugervendtNoegleTekst.Equals(newShortKey))) { // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(timestamp); newProperty.BrugervendtNoegleTekst = ((newShortKey != null) ? newShortKey : latestProperty.BrugervendtNoegleTekst); newProperty.AdresseTekst = newValue; // create a new set of properties input.AttributListe = new EgenskabType[1]; input.AttributListe[0] = newProperty; } else { log.Debug("No changes on Address, so returning without calling Organisation"); // if there are no changes to the attributes, we do not call the Organisation service 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", AdresseStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret successful on Address with uuid " + 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 Adresse", ex); } }
internal void AddProperties(string adresseTekst, string shortKey, VirkningType virkning, RegistreringType1 registration) { EgenskabType property = new EgenskabType(); property.AdresseTekst = adresseTekst; property.Virkning = virkning; property.BrugervendtNoegleTekst = shortKey; EgenskabType[] egenskab = new EgenskabType[1]; egenskab[0] = property; registration.AttributListe = egenskab; }
internal void AddProperties(string shortKey, string brugerNavn, VirkningType virkning, RegistreringType1 registration) { EgenskabType property = new EgenskabType(); property.BrugervendtNoegleTekst = shortKey; property.BrugerNavn = brugerNavn; property.Virkning = virkning; EgenskabType[] egenskab = new EgenskabType[1]; egenskab[0] = property; registration.AttributListe.Egenskab = egenskab; }
internal void AddProperties(String userFacingKey, String funktionNavn, VirkningType virkning, RegistreringType1 registration) { EgenskabType property = new EgenskabType(); property.BrugervendtNoegleTekst = userFacingKey; property.FunktionNavn = funktionNavn; property.Virkning = virkning; EgenskabType[] egenskab = new EgenskabType[1]; egenskab[0] = property; registration.AttributListe.Egenskab = egenskab; }
internal void AddProperties(string navn, string shortKey, string cprnummer, VirkningType virkning, RegistreringType1 registration) { EgenskabType property = new EgenskabType(); property.CPRNummerTekst = cprnummer; property.Virkning = virkning; property.NavnTekst = navn; property.BrugervendtNoegleTekst = shortKey; EgenskabType[] egenskab = new EgenskabType[1]; egenskab[0] = property; registration.AttributListe = egenskab; }
public virtual EgenskabType ToEgenskabType() { var ret = new EgenskabType() { AndreAdresser = this.ToAndreAdresse(), BirthDate = this.ToBirthdate(), FoedestedNavn = Converters.ToNeutralString(this.BirthPlaceText), FoedselsregistreringMyndighedNavn = ToBirthRegistrationAuthority(), KontaktKanal = this.ToKontaktKanalType(), NaermestePaaroerende = this.ToNextOfKin(), NavnStruktur = this.ToNavnStrukturType(), PersonGenderCode = Converters.ToPersonGenderCodeType(this.Gender), Virkning = this.ToEgenskabTypeVirkning() }; return(ret); }
public EgenskabType ToEgenskaberType() { var ret = new EgenskabType() { BirthDate = Utilities.ToDateTime(BirthDate).Value, AndreAdresser = null, FoedselsregistreringMyndighedNavn = null, FoedestedNavn = null, KontaktKanal = null, NaermestePaaroerende = null, //TODO: Change this PersonGenderCode = Utilities.ToPartGender(this.PNR), NavnStruktur = ToNavnStrukturType(), Virkning = VirkningType.Create( Utilities.GetMaxDate(BirthDate, AbroadDate, NameDate), null) }; return(ret); }
public EgenskabType ToEgenskabType() { var ret = new EgenskabType() { BirthDate = this.PersonTotal.ToBirthdate().Value, // Birth registration authority //TODO: Is this assignment correct? FoedselsregistreringMyndighedNavn = PersonTotal.BirthPlaceOfRegistration, // Place of birth // Shall this be null? Is it birthplace or name at birth - I think it should be null FoedestedNavn = PersonTotal.BirthplaceText, PersonGenderCode = Utilities.PersonGenderCodeTypeFromChar(PersonTotal.Sex), NavnStruktur = PersonName != null?PersonName.ToNavnStrukturType() : null, AndreAdresser = Address != null?Address.ToForeignAddressFromSupplementary() : null, //No contact channels implemented KontaktKanal = null, //Next of kin (nearest relative). Not implemented NaermestePaaroerende = null, //TODO: Fill this object Virkning = VirkningType.Create(Utilities.GetMaxDate(PersonTotal.DateOfBirth, PersonTotal.StatusDate), null) }; if (PersonName != null) { ret.Virkning = VirkningType.Compose( ret.Virkning, VirkningType.Create(Utilities.DateFromDecimal(PersonName.NameStartDate), null), VirkningType.Create(Utilities.DateFromDecimal(PersonName.AddressingNameDate), null) ); } // TODO: More effect date fields here ret.Virkning.FraTidspunkt = TidspunktType.Create(Utilities.GetMaxDate(PersonTotal.DateOfBirth)); return(ret); }
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); } }
// this method only performs a call to Ret on Organisation if there are actual changes public void Ret(string uuid, string newName, string newCpr, DateTime timestamp) { log.Debug("Attempting Ret on Person with uuid " + uuid); // this should never fail - we always import the Person before the User, and we have a User with a reference to this object RegistreringType1 registration = GetLatestRegistration(uuid); if (registration == null) { log.Debug("Cannot call Ret on Person with uuid " + uuid + " because it does not exist in Organisation"); return; } PersonPortType channel = StubUtil.CreateChannel <PersonPortType>(PersonStubHelper.SERVICE, "Ret", helper.CreatePort()); try { RetInputType1 input = new RetInputType1(); input.UUIDIdentifikator = uuid; input.AttributListe = registration.AttributListe; input.TilstandListe = registration.TilstandListe; input.RelationListe = registration.RelationListe; // compare latest property to the local object EgenskabType latestProperty = StubUtil.GetLatestProperty(input.AttributListe); if (latestProperty == null || string.Compare(latestProperty.NavnTekst, newName) != 0 || string.Compare(latestProperty.CPRNummerTekst, newCpr) != 0) { // create a new property EgenskabType newProperty = new EgenskabType(); newProperty.Virkning = helper.GetVirkning(timestamp); newProperty.BrugervendtNoegleTekst = ((latestProperty != null) ? latestProperty.BrugervendtNoegleTekst : IdUtil.GenerateShortKey()); newProperty.NavnTekst = newName; newProperty.CPRNummerTekst = newCpr; // overwrite existing property set input.AttributListe = new EgenskabType[1]; input.AttributListe[0] = newProperty; } else { log.Debug("No changes on Person, so returning without calling Organisation"); // if there are no changes to the attributes, we do not call the Organisation service 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 Person " + uuid + " as Organisation returned status 49. The most likely cause is that the object has been Passiveret"); return; } string message = StubUtil.ConstructSoapErrorMessage(statusCode, "Ret", PersonStubHelper.SERVICE, response.RetResponse1.RetOutput.StandardRetur.FejlbeskedTekst); log.Error(message); throw new SoapServiceException(message); } log.Debug("Ret successful on Person with uuid " + 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 Person", ex); } }
internal static void UpdatePosition(UserRegistration user) { /* * 1. fetch all positions that the user currently have * 2. compare positions from organisation with the positions in the registration, using the following rules * a) a position is a "match" if it points to the same unit (and no two positions can point to the same unit), or if it matches on UUID * b) a position should be updated if the name/shortKey/ou-pointer has been changed * c) a position should be removed if it no longer exist in the registration, but does in organisation * d) a position should be added, if it exists in the registration, but not in organisation */ // fetch all the users existing positions List <FiltreretOejebliksbilledeType> unitRoles = FindUnitRolesForUser(user.Uuid); // loop through roles found in organisation, and find those that must be updated, and those that must be deleted foreach (FiltreretOejebliksbilledeType unitRole in unitRoles) { RegistreringType1 existingRoleRegistration = unitRole.Registrering[0]; if (existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length != 1) { log.Warn("User '" + user.Uuid + "' has an existing position in Organisation with " + existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length + " associated OrgUnits"); continue; } // figure out everything relevant about the position object in Organisation EgenskabType latestProperty = StubUtil.GetLatestProperty(existingRoleRegistration.AttributListe.Egenskab); string existingRoleUuid = unitRole.ObjektType.UUIDIdentifikator; string existingRoleOUUuid = existingRoleRegistration.RelationListe.TilknyttedeEnheder[0].ReferenceID.Item; string existingRoleName = latestProperty.FunktionNavn; string existingRoleShortKey = latestProperty.BrugervendtNoegleTekst; bool found = false; foreach (DTO.V1_1.Position position in user.Positions) { // if the UUID of the function is controlled by the local system, the pointer to the OU could be changed, // so we also need to check for equality on the UUID of the function itself if (existingRoleUuid.Equals(position.Uuid) || (position.Uuid == null && existingRoleOUUuid.Equals(position.OrgUnitUuid))) { if (!existingRoleOUUuid.Equals(position.OrgUnitUuid) || // user has moved to a different OU (existingRoleName == null || !existingRoleName.Equals(position.Name)) || // the users title has changed (null check deals with bad GUI data) (position.ShortKey != null && existingRoleShortKey.Equals(position.ShortKey))) // there is a new ShortKey for the position { organisationFunktionStub.Ret(new OrgFunctionData() { Uuid = existingRoleUuid, ShortKey = (position.ShortKey != null) ? position.ShortKey : existingRoleShortKey, Name = position.Name, FunctionTypeUuid = UUIDConstants.ORGFUN_POSITION, OrgUnits = new List <string>() { position.OrgUnitUuid }, Users = new List <string>() { user.Uuid }, Timestamp = user.Timestamp }, UpdateIndicator.NONE, UpdateIndicator.COMPARE, UpdateIndicator.NONE); } found = true; break; } } if (!found) { organisationFunktionStub.Deactivate(existingRoleUuid, user.Timestamp); } } // loop through all roles found in the local registration, and create all those that do not exist in Organisation foreach (DTO.V1_1.Position position in user.Positions) { bool found = false; foreach (FiltreretOejebliksbilledeType unitRole in unitRoles) { RegistreringType1 existingRoleRegistration = unitRole.Registrering[0]; if (existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length != 1) { log.Warn("User '" + user.Uuid + "' has an existing position in Organisation with " + existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length + " associated OrgUnits"); continue; } string existingRoleUuid = unitRole.ObjektType.UUIDIdentifikator; string existingRoleOUUuid = existingRoleRegistration.RelationListe.TilknyttedeEnheder[0].ReferenceID.Item; if (existingRoleUuid.Equals(position.Uuid) || (position.Uuid == null && existingRoleOUUuid.Equals(position.OrgUnitUuid))) { found = true; } } if (!found) { organisationFunktionStub.Importer(new OrgFunctionData() { Uuid = position.Uuid, ShortKey = position.ShortKey, Name = position.Name, FunctionTypeUuid = UUIDConstants.ORGFUN_POSITION, OrgUnits = new List <string>() { position.OrgUnitUuid }, Users = new List <string>() { user.Uuid }, Timestamp = user.Timestamp }); } } }
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 static void UpdatePosition(UserRegistration user) { /* * 1. fetch all positions that the user currently have * 2. compare positions from organisation with the positions in the registration, using the following rules * a) a position is a "match" if it points to the same unit (yes, this is an issue for the users with multiple positions in the same OU, luckily those are few) * b) a position should be updated if the name/ou-pointer has been changed * c) a position should be removed if it no longer exist in the registration, but does in organisation * d) a position should be added, if it exists in the registration, but not in organisation */ // fetch all the users existing positions List <FiltreretOejebliksbilledeType> unitRoles = FindUnitRolesForUser(user.Uuid); List <Position> copyOfUserPositions = new List <Position>(user.Positions); // loop through roles found in organisation, and find those that must be updated, and those that must be deleted foreach (FiltreretOejebliksbilledeType unitRole in unitRoles) { RegistreringType1 existingRoleRegistration = unitRole.Registrering[0]; if (existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length != 1) { log.Warn("User '" + user.Uuid + "' has an existing position in Organisation with " + existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length + " associated OrgUnits"); continue; } // figure out everything relevant about the position object in Organisation EgenskabType latestProperty = StubUtil.GetLatestProperty(existingRoleRegistration.AttributListe.Egenskab); string existingRoleUuid = unitRole.ObjektType.UUIDIdentifikator; string existingRoleOUUuid = existingRoleRegistration.RelationListe.TilknyttedeEnheder[0].ReferenceID.Item; string existingRoleName = latestProperty.FunktionNavn; string existingRoleShortKey = latestProperty.BrugervendtNoegleTekst; bool found = false; for (int i = copyOfUserPositions.Count - 1; i >= 0; i--) { Position position = copyOfUserPositions[i]; if (existingRoleOUUuid.Equals(position.OrgUnitUuid)) { // update if needed if (string.Compare(existingRoleName, position.Name) != 0) { organisationFunktionStub.Ret(new OrgFunctionData() { Uuid = existingRoleUuid, ShortKey = existingRoleShortKey, Name = position.Name, FunctionTypeUuid = UUIDConstants.ORGFUN_POSITION, OrgUnits = new List <string>() { position.OrgUnitUuid }, Users = new List <string>() { user.Uuid }, Timestamp = user.Timestamp }, UpdateIndicator.NONE, UpdateIndicator.COMPARE, UpdateIndicator.NONE); // copy value to read data, so we can use it for comparison below when deciding what to create latestProperty.FunktionNavn = position.Name; } // ensure that the updated positions i no longer in the copied list, so multiple positions // in the same OU, will not hit the same source-position copyOfUserPositions.RemoveAt(i); found = true; break; } } if (!found) { organisationFunktionStub.Deactivate(existingRoleUuid, user.Timestamp); } } // refresh copy of positions var copyOfRemotePositions = new List <FiltreretOejebliksbilledeType>(unitRoles); // loop through all roles found in the local registration, and create all those that do not exist in Organisation foreach (var position in user.Positions) { bool found = false; for (int i = copyOfRemotePositions.Count - 1; i >= 0; i--) { var unitRole = copyOfRemotePositions[i]; RegistreringType1 existingRoleRegistration = unitRole.Registrering[0]; if (existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length != 1) { log.Warn("User '" + user.Uuid + "' has an existing position in Organisation with " + existingRoleRegistration.RelationListe.TilknyttedeEnheder.Length + " associated OrgUnits"); continue; } string existingRoleOUUuid = existingRoleRegistration.RelationListe.TilknyttedeEnheder[0].ReferenceID.Item; string existingFunctionName = existingRoleRegistration.AttributListe.Egenskab[0].FunktionNavn; if (existingRoleOUUuid.Equals(position.OrgUnitUuid) && string.Compare(existingFunctionName, position.Name) == 0) { // to make sure we can add new positions within the same OU as existing positions, we // remove existing ones, one at a time, so we do not match twice copyOfRemotePositions.RemoveAt(i); found = true; } } if (!found) { organisationFunktionStub.Importer(new OrgFunctionData() { Uuid = IdUtil.GenerateUuid(), ShortKey = IdUtil.GenerateShortKey(), Name = position.Name, FunctionTypeUuid = UUIDConstants.ORGFUN_POSITION, OrgUnits = new List <string>() { position.OrgUnitUuid }, Users = new List <string>() { user.Uuid }, Timestamp = user.Timestamp }); } } }