public override async Task <bool> ProcessMessageAsync(ReferralRealEstatePurchasePaymentEvent message)
        {
            if (string.IsNullOrWhiteSpace(message.CurrencyCode))
            {
                Log.Error(null, "Currency is missing in Referral Property First Purchase Event", context: message, process: nameof(ProcessMessageAsync));
                return(false);
            }

            var amount = message.NetPropertyAmount;

            if (amount < 0)
            {
                Log.Error(null, "NetPropertyAmount has invalid value in Referral Property First Purchase Event", context: message, process: nameof(ProcessMessageAsync));
                return(false);
            }

            var response = await _currencyConverterClient.Converter
                           .ConvertAsync(message.CurrencyCode, _assetName, amount);

            if (response.ErrorCode != ConverterErrorCode.None)
            {
                Log.Error(message: "An error occured while converting currency amount",
                          context: $"from: {message.CurrencyCode}; to: {_assetName}; error: {response.ErrorCode}");

                return(false);
            }

            var bonusTriggerEvent = new BonusTriggerEvent
            {
                CustomerId = message.CustomerId,
                TimeStamp  = DateTime.UtcNow,
                Type       = BonusTypes.ReferralPropertyFirstPurchase.EventName,
                Data       = new Dictionary <string, string>()
                {
                    { "Amount", response.Amount.ToString("G") },
                    { "IsDownPayment", message.IsDownPayment.ToString() },
                    { "PurchaseCompletionPercentage", message.PurchaseCompletionPercentage.ToString() },
                    { "PaymentId", message.ReferralId },
                    { "StakedCampaignId", message.CampaignId.ToString("D") },
                    { "UnitLocationCode", message.UnitLocationCode }
                }
            };

            await _bonusTriggerEventPublisher.PublishAsync(bonusTriggerEvent);

            return(true);
        }
        public override async Task <bool> ProcessMessageAsync(PropertyLeadApprovedReferralEvent message)
        {
            var bonusTriggerEvent = new BonusTriggerEvent
            {
                CustomerId = message.ReferrerId,
                TimeStamp  = message.TimeStamp,
                Type       = BonusTypes.PropertyLeadApprovedReferral.EventName,
                Data       = new Dictionary <string, string>()
                {
                    { "ReferralId", message.ReferralId }
                }
            };

            if (message.StakedCampaignId.HasValue)
            {
                bonusTriggerEvent.Data.Add("StakedCampaignId", message.StakedCampaignId.Value.ToString());
            }

            await _bonusTriggerEventPublisher.PublishAsync(bonusTriggerEvent);

            return(true);
        }
        public override async Task <bool> ProcessMessageAsync(HotelReferralUsedEvent message)
        {
            var response = await _currencyConverterClient.Converter
                           .ConvertAsync(message.CurrencyCode, _assetName, message.Amount);

            if (response.ErrorCode != ConverterErrorCode.None)
            {
                _log.Error(message: "An error occured while converting currency amount",
                           context: $"from: {message.CurrencyCode}; to: {_assetName}; error: {response.ErrorCode}");

                return(false);
            }

            var bonusTriggerEvent = new BonusTriggerEvent
            {
                CustomerId = message.CustomerId,
                TimeStamp  = DateTime.UtcNow,
                Type       = BonusTypes.HotelCheckoutReferral.EventName,
                PartnerId  = message.PartnerId,
                LocationId = message.LocationId,
                Data       = new Dictionary <string, string>
                {
                    { "Amount", response.Amount.ToString("G") },
                    { "ReferralId", message.ReferralId }
                }
            };

            if (message.StakedCampaignId.HasValue)
            {
                bonusTriggerEvent.Data.Add("StakedCampaignId", message.StakedCampaignId.Value.ToString());
            }

            await _bonusTriggerEventPublisher.PublishAsync(bonusTriggerEvent);

            _log.Info("Hotel stay referral bonus event published", context: $"CustomerId: {message.CustomerId}");

            return(true);
        }