public async Task UpdateAsync(ClientProfileSettings model, string username, string correlationId) { var existing = await _regulatorySettingsRepository.GetByIdsAsync(model.ClientProfileId, model.AssetTypeId); if (existing == null) { throw new ClientSettingsDoNotExistException(); } var regulatorySettings = await _regulatorySettingsApi.GetRegulatorySettingsByIdsAsync(existing.RegulatoryProfileId, existing.RegulatoryTypeId); //This should not happen when we handle deleting of RegulatorySettings in MDM if (regulatorySettings.ErrorCode == RegulationsErrorCodesContract.RegulatorySettingsDoNotExist) { throw new RegulatorySettingsDoNotExistException(); } if (model.IsAvailable && !regulatorySettings.RegulatorySettings.IsAvailable) { throw new CannotSetToAvailableException(); } if (model.Margin > 100 || model.Margin < regulatorySettings.RegulatorySettings.MarginMinPercent) { throw new InvalidMarginValueException(); } if (model.OnBehalfFee < 0) { throw new InvalidOnBehalfFeeException(); } if (model.ExecutionFeesRate < 0 || model.ExecutionFeesRate > 100) { throw new InvalidExecutionFeesRateException(); } if (model.ExecutionFeesCap < model.ExecutionFeesFloor) { throw new InvalidExecutionFeesCapException(); } if (model.ExecutionFeesFloor > model.ExecutionFeesCap || model.ExecutionFeesFloor < 0) { throw new InvalidExecutionFeesFloorException(); } await _regulatorySettingsRepository.UpdateAsync(model); var referenceId = $"ClientProfileId:{model.ClientProfileId},AssetTypeId:{model.AssetTypeId}"; await _auditService.TryAudit(correlationId, username, referenceId, AuditDataType.ClientProfileSettings, model.ToJson(), existing.ToJson()); await _entityChangedSender .SendEntityEditedEvent <ClientProfileSettings, ClientProfileSettingsContract, ClientProfileSettingsChangedEvent>(existing, model, username, correlationId); }