public bool CreateSubscriberRecord(SubscriberRecord record)
        {
            if (record.IsNull())
                return false;

            record.Contacted();

            _automessagingContext.Records.Add(record);

            return _automessagingContext.SaveChanges() > 0;
        }
        public SubscriberRecord GetExistingSubscriberRecord(SubscriberRecord record)
        {
            if (record.IsNull())
                return null;

            return
                _automessagingContext.Records.Active()
                    .FirstOrDefault(
                        s =>
                            (s.SubscriberEmail == record.SubscriberEmail) &&
                            (s.SubscriberTelephoneNumber == record.SubscriberTelephoneNumber) &&
                            (s.EventType == record.EventType));
        }
        public static SubscriberRecord BuildLandlordSubscriberRecord(LandlordSummary summary, Campaign campaign)
        {
            var subscriberRecord = new SubscriberRecord
            {
                ApplicationReference = summary.LandlordReference,
                CustomerReference = null,
                SubscriberEmail = summary.Email,
                SubscriberTelephoneNumber = summary.Mobile,
                SegmentType = campaign.SegmentType,
                EventType = campaign.Type
            };

            return subscriberRecord;
        }
        public bool Execute(Dictionary<string, string> traitsDictionary, SubscriberRecord subscriberRecord)
        {
            var properties = new Properties {{"newProperty", "true"}};

            try
            {
                Analytics.Client.Track(subscriberRecord.SubscriberEmail, EventType.NewPropertyAdded.ToString(), properties);
            }
            catch (Exception ex)
            {
                _logger.Error($"NewPropertyAddedTrackLogic - Exception thrown calling Analytics.Client.Track().  {ex}");
                return false;
            }
            return true;
        }
        public bool HasStateChanged(SubscriberRecord subscriberRecord)
        {
            //If the app has a GT of any kind or the tenant is
            //approved, they should not be in this segment
            var customers = _applicationService.GetCustomers(subscriberRecord.ApplicationReference);

            if (customers == null || customers.Count == 0)
                return false;

            var tenant = customers.FirstOrDefault(c => EnumHelper<RoleType>.Parse(c.RoleType) == RoleType.MasterTenant);

            if (tenant?.Status == Status.Approved.ToString())
                return true;

            return customers.Count(c => c.RoleType == RoleType.Guarantor.ToString()) > 0;
        }
        public bool DeleteExistingRecord(SubscriberRecord record)
        {
            if (record == null)
                return false;

            var existingRecord =
                _automessagingContext.Records.Active()
                    .FirstOrDefault(s => s.ApplicationReference == record.ApplicationReference);

            if (existingRecord.IsNull())
                return true;

            existingRecord?.SoftDelete();

            return _automessagingContext.SaveChanges() > 0;
        }
        public bool Execute(Dictionary<string, string> traitsDictionary, SubscriberRecord subscriberRecord)
        {
            var properties = new Properties
            {
                {"newSubmission", true},
                {"landlordReference", subscriberRecord.ApplicationReference}
            };

            try
            {
                Analytics.Client.Track(subscriberRecord.SubscriberEmail, EventType.NewPropertySubmission.ToString(), properties);
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }
        public static SubscriberRecord BuildTenantSubscriber(ApplicationSummary summary, Campaign campaign)
        {
            var tenant = summary.Customers.FirstOrDefault(c => EnumHelper<RoleType>.Parse(c.RoleType) == RoleType.MasterTenant);
            if (tenant == null)
                return null;

            var subscriberRecord = new SubscriberRecord
            {
                ApplicationReference = summary.ApplicationReference,
                CustomerReference = tenant.CustomerReference,
                SubscriberEmail = tenant.Email,
                SubscriberTelephoneNumber = tenant.TelephoneNumber,
                SegmentType = campaign.SegmentType,
                EventType = campaign.Type
            };

            return subscriberRecord;
        }
 public bool AddSubscriber(SubscriberRecord subscriber)
 {
     switch(subscriber.EventType)
     {
         case CampaignType.ApplicationNoGuarantorAdd:
         case CampaignType.NewPropertyAdded:
         case CampaignType.BookAViewing:
         case CampaignType.DeclinedGuarantor:
             return _identityLogicFactory.GetIdentityLogicByType<ApplicationSummary>(subscriber.EventType)
                 .Execute(subscriber, _applicationService.GetSummaryByReference(subscriber.ApplicationReference),
                     true);
         case CampaignType.LandlordNewPropertySubmission:
             return _identityLogicFactory.GetIdentityLogicByType<LandlordSummary>(subscriber.EventType)
                                     .Execute(subscriber, _landlordService.GetSummaryByReference(subscriber.ApplicationReference),
                                         true);
         default:
             return false;
     }
 }
        public bool HasStateChanged(SubscriberRecord subscriberRecord)
        {
            var customers = _applicationService.GetCustomers(subscriberRecord.ApplicationReference);

            if (customers == null || customers.Count == 0)
                return false;

            var tenant = customers.FirstOrDefault(c => EnumHelper<RoleType>.Parse(c.RoleType) == RoleType.MasterTenant);

            if (tenant?.Status == Status.Cancelled.ToString())
                return true;

            var approvedGuarantor = customers.Where(
                c =>
                    c.RoleType == RoleType.Guarantor.ToString())
                        .Any(x => x.Status == Status.Approved.ToString());

            return approvedGuarantor;
        }
        public bool HasStateChanged(SubscriberRecord subscriberRecord)
        {
            //If the app contains a property with a status of Viewing, they should
            //not be in this segment
            var properties =
                _applicationService.GetApplicationPropertiesByApplicationReference(subscriberRecord.ApplicationReference);

            if (properties.IsNullOrEmpty())
                return true;

            return
                properties.Any(
                    p =>
                        p.Status == Status.AwaitingViewing.GetDescription() ||
                        p.Status == Status.Viewing.GetDescription() || 
                        p.Status == Status.Taken.GetDescription() || 
                        p.Status == Status.NotInterested.GetDescription() || 
                        p.Status == Status.Live.GetDescription());
        }
        public bool DeleteExistingRecords(SubscriberRecord record)
        {
            if (record == null)
                return false;

            var existingRecords =
                _automessagingContext.Records.Active()
                    .Where(s => s.ApplicationReference == record.ApplicationReference);

            if (existingRecords.IsNull())
                return true;

            foreach (var existingRecord in existingRecords)
            {
                existingRecord.SoftDelete();
            }

            return _automessagingContext.SaveChanges() > 0;
        }
 public void SetSubscriberRecordContacted(SubscriberRecord subscriberRecord)
 {
     _subscriberRecordRepository.SetSubscriberRecordDateLastContacted(subscriberRecord);
 }
 public SubscriberRecord GetExistingRecord(SubscriberRecord subscriberRecord)
 {
     var existingRecord = _subscriberRecordRepository.GetExistingSubscriberRecord(subscriberRecord);
     return existingRecord;
 }
 public void UpdateSubscriberRecord(SubscriberRecord subscriberRecord)
 {
     _subscriberRecordRepository.DeleteExistingRecords(subscriberRecord);
 }
        public void SetSubscriberRecordDateLastContacted(SubscriberRecord subscriberRecord)
        {
            var existingRecord =
                _automessagingContext.Records.Active()
                    .FirstOrDefault(
                        s =>
                            s.ApplicationReference == subscriberRecord.ApplicationReference &&
                            s.EventType == subscriberRecord.EventType);

            if (existingRecord.IsNotNull())
            {
                existingRecord.Contacted();
                _automessagingContext.SaveChanges();
            }
        }
 public void SetSubscriberRecordChecked(SubscriberRecord subscriberRecord)
 {
     _subscriberRecordRepository.SetSubscriberRecordChecked(subscriberRecord);
 }