public async Task InsertAsync(AssetTypeWithTemplate model, IEnumerable <ClientProfileSettings> clientProfileSettingsToAdd)
        {
            var entity = new AssetTypeEntity
            {
                Id = model.Id,
                RegulatoryTypeId     = model.RegulatoryTypeId,
                UnderlyingCategoryId = model.UnderlyingCategoryId,
            };

            var clientProfileSettingsEntities = clientProfileSettingsToAdd.Select(ClientProfileSettingsEntity.Create).ToArray();

            using (var context = _contextFactory.CreateDataContext())
            {
                context.AssetTypes.Add(entity);

                context.ClientProfileSettings.AddRange(clientProfileSettingsEntities);

                try
                {
                    await context.SaveChangesAsync();
                }
                catch (DbUpdateException e)
                {
                    if (e.InnerException is SqlException sqlException &&
                        sqlException.Number == MsSqlErrorCodes.PrimaryKeyConstraintViolation)
                    {
                        throw new AlreadyExistsException();
                    }

                    throw;
                }
            }
        }
예제 #2
0
        public async Task InsertAsync(AssetTypeWithTemplate model, string username, string correlationId)
        {
            var brokerSettingsResponse = await _brokerSettingsApi.GetByIdAsync(_brokerId);

            if (brokerSettingsResponse.ErrorCode == BrokerSettingsErrorCodesContract.BrokerSettingsDoNotExist)
            {
                throw new BrokerSettingsDoNotExistException();
            }

            await ValidateUnderlyingCategory(model.UnderlyingCategoryId);

            var regulationId = brokerSettingsResponse.BrokerSettings.RegulationId;

            await ValidateRegulatoryType(model.RegulatoryTypeId, regulationId);

            List <ClientProfileSettings> clientProfileSettings;

            //duplicate settings if we use template
            if (!string.IsNullOrEmpty(model.AssetTypeTemplateId))
            {
                var regulatoryProfileTemplateExists =
                    await _assetTypesRepository.ExistsAsync(model.AssetTypeTemplateId);

                if (!regulatoryProfileTemplateExists)
                {
                    throw new AssetTypeDoesNotExistException();
                }

                clientProfileSettings = await
                                        _clientProfileSettingsRepository.GetAllAsync(null, model.AssetTypeTemplateId);

                foreach (var clientProfileSetting in clientProfileSettings)
                {
                    clientProfileSetting.AssetTypeId = model.Id;

                    var regulatorySettings = await _regulatorySettingsApi.GetRegulatorySettingsByIdsAsync(
                        clientProfileSetting.RegulatoryProfileId, model.RegulatoryTypeId);

                    ValidateRegulatoryConstraint(regulatorySettings, clientProfileSetting);
                }
            }
            else
            {
                clientProfileSettings = new List <ClientProfileSettings>();
                var allRegulatorySettings =
                    await _regulatorySettingsApi.GetRegulatorySettingsByRegulationAsync(regulationId);

                var clientProfiles = await _clientProfilesRepository.GetAllAsync();

                foreach (var clientProfile in clientProfiles)
                {
                    var regulatorySettings = allRegulatorySettings.RegulatorySettings.Single(x =>
                                                                                             x.TypeId == model.RegulatoryTypeId && x.ProfileId == clientProfile.RegulatoryProfileId);

                    clientProfileSettings.Add(new ClientProfileSettings
                    {
                        AssetTypeId     = model.Id,
                        ClientProfileId = clientProfile.Id,
                        Margin          = regulatorySettings.MarginMinPercent,
                        IsAvailable     = regulatorySettings.IsAvailable,
                    });
                }
            }

            await _assetTypesRepository.InsertAsync(model, clientProfileSettings);

            await _auditService.TryAudit(correlationId, username, model.Id, AuditDataType.AssetType,
                                         model.ToJson());

            await _entityChangedSender.SendEntityCreatedEvent <AssetType, AssetTypeContract, AssetTypeChangedEvent>(model,
                                                                                                                    username, correlationId);

            foreach (var profileSettings in clientProfileSettings)
            {
                await _entityChangedSender
                .SendEntityCreatedEvent <ClientProfileSettings, ClientProfileSettingsContract,
                                         ClientProfileSettingsChangedEvent>(profileSettings, username, correlationId);
            }
        }