Exemplo n.º 1
0
        public void Execute(string ravenInstanceId)
        {
            var organisations = _session.MasterRaven.Query <OrganisationDocument, Organisations>()
                                .Where(o => o.OrganisationStatus == OrganisationStatus.Active && o.SubscriptionStatus == SubscriptionStatus.Active)
                                .As <Organisation>()
                                .ToList();

            if (organisations.Any())
            {
                Trace("Found {0} active organisations", organisations.Count);

                var plans = _getAvailablePaymentPlansQuery.Invoke(new GetAvailablePaymentPlansRequest()).Plans;

                foreach (var organisation in organisations)
                {
                    using (_session.SwitchOrg(organisation))
                    {
                        var stats = _getOrganisationStatisticsQuery.Invoke(new GetOrganisationStatisticsRequest()).Statistics;
                        var plan  = plans.FirstOrDefault(p => p.Id == organisation.PaymentPlanId && !p.IsFreeTier);

                        if (plan != null)
                        {
                            var quotas = PlanQuotas.FromStats(stats, plan);

                            if (quotas.IssuesExceededBy > 0)
                            {
                                organisation.Status = OrganisationStatus.PlanQuotaExceeded;
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public ActionResult Index()
        {
            var pagingRequest = GetSinglePagingRequest();

            var organisations = _getOrganisationsQuery.Invoke(new GetOrganisationsRequest
            {
                Paging = pagingRequest
            }).Organisations;

            return(View(new OrganisationsViewModel
            {
                Organisations = organisations.Items.Select(o =>
                {
                    using (SwitchOrgScope(o.Id))
                    {
                        var stats = _getOrganisationStatisticsQuery.Invoke(new GetOrganisationStatisticsRequest()).Statistics;
                        return new OrganisationViewModel
                        {
                            Organisation = o,
                            Stats = stats
                        };
                    }
                }),
                Paging = _pagingViewModelGenerator.Generate(PagingConstants.DefaultPagingId, organisations.PagingStatus, pagingRequest)
            }));
        }
Exemplo n.º 3
0
        public ChangeSubscriptionResponse Invoke(ChangeSubscriptionRequest request)
        {
            Trace("Starting...");

            var organisation = Session.MasterRaven.Load <Organisation>(request.CurrentUser.ActiveOrganisation.Id);

            if (organisation == null)
            {
                return(new ChangeSubscriptionResponse(ignoreCache: true)
                {
                    Status = ChangeSubscriptionStatus.OrganisationNotFound
                });
            }

            if (!organisation.Subscription.ChargifyId.HasValue)
            {
                return(new ChangeSubscriptionResponse(ignoreCache: true)
                {
                    Status = ChangeSubscriptionStatus.SubscriptionNotFound
                });
            }

            var plans = _getAvailablePaymentPlansQuery.Invoke(new GetAvailablePaymentPlansRequest()).Plans;
            var stats = _getOrganisationStatisticsQuery.Invoke(new GetOrganisationStatisticsRequest()).Statistics;

            //if we are downgrading check the organisations stats to make sure they can
            if (request.Downgrading)
            {
                var plan = plans.FirstOrDefault(p => p.Id == PaymentPlan.GetId(request.NewPlanId));

                if (plan != null)
                {
                    var quotas = PlanQuotas.FromStats(stats, plan);

                    if (quotas.IssuesExceededBy > 0)
                    {
                        return(new ChangeSubscriptionResponse(ignoreCache: true)
                        {
                            Status = ChangeSubscriptionStatus.QuotasExceeded,
                            Quotas = quotas
                        });
                    }
                }
            }

            var chargifyConnect = new ChargifyConnect(_configuration.ChargifyUrl, _configuration.ChargifyApiKey, _configuration.ChargifyPassword);
            var subscription    = chargifyConnect.LoadSubscription(organisation.Subscription.ChargifyId.Value);

            if (subscription == null)
            {
                return(new ChangeSubscriptionResponse(ignoreCache: true)
                {
                    Status = ChangeSubscriptionStatus.SubscriptionNotFound
                });
            }

            var newPlan = plans.First(p => p.Id == PaymentPlan.GetId(request.NewPlanId));

            if (newPlan.IsFreeTier)
            {
                chargifyConnect.DeleteSubscription(organisation.Subscription.ChargifyId.Value, "Downgrade");
                organisation.Subscription.ChargifyId = null;
                organisation.Subscription.Status     = SubscriptionStatus.Trial;
            }
            else
            {
                subscription = chargifyConnect.EditSubscriptionProduct(organisation.Subscription.ChargifyId.Value, request.NewPlanName.ToLowerInvariant());
                organisation.Subscription.ChargifyId = subscription.SubscriptionID;
                organisation.Subscription.Status     = SubscriptionStatus.Active;
            }

            organisation.PaymentPlanId             = PaymentPlan.GetId(request.NewPlanId);
            organisation.PaymentPlan               = newPlan;
            organisation.Subscription.LastModified = DateTime.UtcNow.ToDateTimeOffset(organisation.TimezoneId);

            //if status is quotas exceeded, check again and update if necessary
            if (organisation.Status == OrganisationStatus.PlanQuotaExceeded)
            {
                var quotas = PlanQuotas.FromStats(stats, newPlan);

                if (quotas.IssuesExceededBy <= 0)
                {
                    organisation.Status = OrganisationStatus.Active;
                }
            }

            Session.SynchroniseIndexes <Indexing.Organisations, Indexing.Users>();
            Session.AddCommitAction(new SendMessageCommitAction(
                                        new SubsciptionChangedEmailInfo
            {
                OrganisationName     = organisation.Name,
                SubscriptionId       = subscription.SubscriptionID.ToString(),
                UserName             = request.CurrentUser.FirstName,
                BillingAmount        = string.Format(CultureInfo.GetCultureInfo(1033), "{0:C}", newPlan.Price),
                BillingPeriodEndDate = organisation.Subscription.CurrentPeriodEndDate.ToLocalFormatted(),
                OldPlanName          = request.OldPlanName,
                NewPlanName          = newPlan.Name
            },
                                        _configuration.GetNotificationsQueueAddress(organisation.RavenInstanceId)));

            return(new ChangeSubscriptionResponse(organisation.Id, request.CurrentUser.Email)
            {
                Status = ChangeSubscriptionStatus.Ok
            });
        }
Exemplo n.º 4
0
        public ActionResult Update(string mode, string showMe, int pageSize)
        {
            object feed          = null;
            object errors        = null;
            object stats         = null;
            var    liveErrorFeed = false;

            var currentApplication = CurrentApplication;
            var applicationId      = currentApplication == null ? null : currentApplication.Id;

            if (mode.IsIn("feed", "undefined"))
            {
                CookieManager.Set(WebConstants.CookieSettings.DashboardCookieKey, "{0}|{1}".FormatWith(showMe, pageSize), null);

                var sort = DashboardViewModel.Sorting.First(s => s.Id == showMe);

                if (sort.Id == "5")
                {
                    liveErrorFeed = true;
                    var applications = Core.GetApplications();
                    var items        = _getApplicationErrorsQuery.Invoke(new GetApplicationErrorsRequest
                    {
                        Paging         = new PageRequestWithSort(1, pageSize, "TimestampUtc", true),
                        OrganisationId = Core.AppContext.CurrentUser.OrganisationId,
                        ApplicationId  = applicationId
                    }).Errors;

                    feed = items == null ? new string[] { } : items.Items.Select(e => new ErrorInstanceViewModel
                    {
                        Error           = e,
                        ApplicationName = GetApplicationName(applications.Items, e.ApplicationId),
                    }).Select(e => RenderPartial("Dashboard/Error", e));
                }
                else
                {
                    var items = _getApplicationIssuesQuery.Invoke(new GetApplicationIssuesRequest
                    {
                        Paging         = new PageRequestWithSort(1, pageSize, sort.SortField, sort.SortDescending),
                        OrganisationId = Core.AppContext.CurrentUser.OrganisationId,
                        ApplicationId  = applicationId
                    }).Issues.Items;

                    feed = items == null || items.Count == 0 ?
                           new string[] { } :
                    IssueItemViewModel.ConvertSimple(items, Core.GetUsers().Items, Core.AppContext.CurrentUser.ActiveOrganisation.TimezoneId, sort.Id != "2")
                    .Select(i => RenderPartial("Dashboard/Issue", i));
                }
            }

            if (mode.IsIn("graphs", "undefined"))
            {
                stats = _getOrganisationStatisticsQuery.Invoke(new GetOrganisationStatisticsRequest
                {
                    ApplicationId = CurrentApplication == null ? null : CurrentApplication.Id
                }).Statistics ?? new Statistics();

                errors = _getDashboardReportQuery.Invoke(new GetDashboardReportRequest
                {
                    ApplicationId = currentApplication == null ? null : currentApplication.Id
                }).Data;
            }

            return(new JsonSuccessResult(new
            {
                feed,
                stats,
                errors,
                liveErrorFeed
            }, allowGet: true));
        }