public PipelinePosition GeneratePipelinePosition(Application application)
        {
            if(application.IsArchived())
                return PipelinePosition.Archived;

            if (application.MasterTenant.IsNull())
                return PipelinePosition.Unknown;

            switch (application.Status)
            {
                case Status.Live:
                    return application.TenancyIsEnding() ? PipelinePosition.TenancyEnding : PipelinePosition.Let;

                case Status.Ended:
                    return PipelinePosition.TenancyEnded;
            }

            switch (application.MasterTenant.Status)
            {
                case Status.Approved:
                {
                    if(application.Properties.Any(x => x.Status == Status.Taken))
                        return PipelinePosition.InProgress;

                    if(application.Properties.Any(x => x.Status == Status.Viewing))
                        return PipelinePosition.Viewing;

                    if (application.Properties.Any(x => x.Status == Status.AwaitingViewing))
                        return PipelinePosition.AwaitingViewing;

                    return application.Properties.Any(x => x.Status == Status.Interested)
                    ? PipelinePosition.Interested
                    : PipelinePosition.Approved;
                }

                case Status.Cancelled:
                    return PipelinePosition.Cancelled;
            }

            if (application.Guarantors.Any())
            {
                if (application.Guarantors.All(x => x.Status == Status.Declined))
                {
                    return PipelinePosition.ApplicantComplete;
                }

                if (application.Guarantors.Any(x => x.Status == Status.Approved))
                {
                    if (application.Properties.Any(x => x.Status == Status.Taken))
                        return PipelinePosition.InProgress;

                    if (application.Properties.Any(x => x.Status == Status.Viewing))
                        return PipelinePosition.Viewing;

                    if (application.Properties.Any(x => x.Status == Status.AwaitingViewing))
                        return PipelinePosition.AwaitingViewing;

                    return application.Properties.Any(x => x.Status == Status.Interested)
                        ? PipelinePosition.Interested
                        : PipelinePosition.Approved;
                }

                return PipelinePosition.GuarantorComplete;
            }

            return  PipelinePosition.ApplicantComplete;
        }