public PeriodisedPaymentEventKey(IPeriodisedPaymentEvent periodisedPaymentEvent) : base(periodisedPaymentEvent)
 {
     if (periodisedPaymentEvent == null)
     {
         throw new ArgumentNullException(nameof(periodisedPaymentEvent));
     }
     ApprenticeshipId           = periodisedPaymentEvent.ApprenticeshipId;
     AccountId                  = periodisedPaymentEvent.AccountId;
     TransferSenderAccountId    = periodisedPaymentEvent.TransferSenderAccountId;
     ApprenticeshipEmployerType = periodisedPaymentEvent.ApprenticeshipEmployerType;
     Amount                 = periodisedPaymentEvent.AmountDue;
     DeliveryPeriod         = periodisedPaymentEvent.DeliveryPeriod;
     PriceEpisodeIdentifier = periodisedPaymentEvent.PriceEpisodeIdentifier;
     TransactionType        = periodisedPaymentEvent.TransactionType;
 }
        public async Task <bool> IsDuplicate(IPeriodisedPaymentEvent periodisedPaymentEvent, CancellationToken cancellationToken)
        {
            logger.LogDebug($"Checking if periodised payment event of type {periodisedPaymentEvent.GetType().Name} with guid: {periodisedPaymentEvent.EventId} has already been received.");
            var periodisedPaymentEventKey = new PeriodisedPaymentEventKey(periodisedPaymentEvent);

            logger.LogDebug($"Earning event key: {periodisedPaymentEventKey.LogSafeKey}");
            if (await cache.Contains(periodisedPaymentEventKey.Key, cancellationToken).ConfigureAwait(false))
            {
                logger.LogWarning($"Key: {periodisedPaymentEventKey.LogSafeKey} found in the cache and is probably a duplicate.");
                return(true);
            }
            logger.LogDebug($"New periodised payment event. Event key: {periodisedPaymentEventKey.LogSafeKey}, event id: {periodisedPaymentEvent.EventId}");
            await cache.Add(periodisedPaymentEventKey.Key, periodisedPaymentEventKey, cancellationToken);

            logger.LogInfo($"Added new periodised payment event to cache. Key: {periodisedPaymentEventKey.LogSafeKey}");
            return(false);
        }