public async Task SaveAsync()
        {
            QuoteCacheRegion.ExpireQuote(_quoteRequest);

            var quoteDto = _quoteRequest.ToQuoteRequestDto();

            if (_quoteRequest.IsTransient())
            {
                await _quoteApi.CreateAsync(quoteDto);
            }
            else
            {
                await _quoteApi.UpdateAsync(quoteDto);
            }

            await _publisher.Publish(new QuoteRequestUpdatedEvent(_quoteRequest));
        }
        public async Task <IQuoteRequestBuilder> MergeFromOtherAsync(QuoteRequest quoteRequest)
        {
            _quoteRequest.Comment = quoteRequest.Comment;

            foreach (var quoteItem in quoteRequest.Items)
            {
                _quoteRequest.Items.Add(quoteItem);
            }

            if (quoteRequest.Addresses != null && quoteRequest.Addresses.Any())
            {
                _quoteRequest.Addresses = quoteRequest.Addresses;
            }

            await _quoteApi.DeleteAsync(new[] { quoteRequest.Id }.ToList());

            QuoteCacheRegion.ExpireQuote(_quoteRequest);

            return(this);
        }
        public IQuoteRequestBuilder Update(QuoteRequestFormModel quoteRequest)
        {
            QuoteCacheRegion.ExpireQuote(_quoteRequest);

            _quoteRequest.Comment = quoteRequest.Comment;
            _quoteRequest.Status  = quoteRequest.Status;
            _quoteRequest.Tag     = quoteRequest.Tag;

            _quoteRequest.Addresses.Clear();
            if (quoteRequest.BillingAddress != null)
            {
                _quoteRequest.Addresses.Add(quoteRequest.BillingAddress);
            }
            if (quoteRequest.ShippingAddress != null)
            {
                _quoteRequest.Addresses.Add(quoteRequest.ShippingAddress);
            }

            if (quoteRequest.Items != null)
            {
                foreach (var item in quoteRequest.Items)
                {
                    var existingItem = _quoteRequest.Items.FirstOrDefault(i => i.Id == item.Id);
                    if (existingItem != null)
                    {
                        existingItem.Comment           = item.Comment;
                        existingItem.SelectedTierPrice = new TierPrice(new Money(item.SelectedTierPrice.Price, _quoteRequest.Currency), item.SelectedTierPrice.Quantity);
                        existingItem.ProposalPrices.Clear();
                        foreach (var proposalPrice in item.ProposalPrices)
                        {
                            existingItem.ProposalPrices.Add(new TierPrice(new Money(proposalPrice.Price, _quoteRequest.Currency), proposalPrice.Quantity));
                        }
                    }
                }
            }

            return(this);
        }