// EnsureSubscriptionForGroup ensures subscription for a group func EnsureSubscriptionForGroup(groupName string, params *stripe.SubParams) (*stripe.Sub, error) { if params == nil { params = &stripe.SubParams{ Plan: Plans[UpTo10Users].ID, } } group, err := modelhelper.GetGroup(groupName) if err != nil { return nil, err } if group.Payment.Subscription.ID != "" { return sub.Get(group.Payment.Subscription.ID, nil) } if group.Payment.Customer.ID == "" { return nil, ErrCustomerNotExists } if err := CheckCustomerHasSource(group.Payment.Customer.ID); err != nil { return nil, err } now := time.Now().UTC() thirtyDaysLater := now.Add(30 * 24 * time.Hour).Unix() sevenDaysLater := now.Add(7 * 24 * time.Hour).Unix() if params.TrialEnd != 0 { // we only allow 0, 7 and 30 day trials if params.TrialEnd < sevenDaysLater { params.TrialEnd = sevenDaysLater } if params.TrialEnd > sevenDaysLater { params.TrialEnd = thirtyDaysLater } } // override quantity and plan in case we did not charge the user previously // due to failed payment and the subscription is deleted by stripe, create // new subscription quantity := uint64(1) activeCount, _ := (&socialapimodels.PresenceDaily{}).CountDistinctByGroupName(groupName) if activeCount != 0 { quantity = uint64(activeCount) params.Plan = GetPlanID(activeCount) params.TrialEnd = 0 } // only send our whitelisted params req := &stripe.SubParams{ Customer: group.Payment.Customer.ID, Quantity: quantity, Plan: params.Plan, Coupon: params.Coupon, Token: params.Token, TrialEnd: params.TrialEnd, Card: params.Card, } sub, err := sub.New(req) if err != nil { return nil, err } if err := syncGroupWithCustomerID(group.Payment.Customer.ID); err != nil { return nil, err } return sub, nil }