effective_learndash 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +16 -10
- data/app/assets/config/effective_learndash_manifest.js +0 -1
- data/app/controllers/admin/course_registrations_controller.rb +8 -0
- data/app/controllers/admin/learndash_courses_controller.rb +1 -1
- data/app/controllers/effective/course_registrations_controller.rb +13 -0
- data/app/controllers/effective/learndash_courses_controller.rb +32 -0
- data/app/datatables/admin/effective_course_registrations_datatable.rb +28 -0
- data/app/datatables/admin/effective_learndash_courses_datatable.rb +5 -1
- data/app/datatables/admin/effective_learndash_enrollments_datatable.rb +1 -2
- data/app/datatables/admin/effective_learndash_users_datatable.rb +1 -1
- data/app/datatables/effective_course_registrants_datatable.rb +24 -0
- data/app/datatables/effective_course_registrations_datatable.rb +35 -0
- data/app/datatables/effective_learndash_courses_datatable.rb +30 -0
- data/app/datatables/effective_learndash_enrollments_datatable.rb +7 -4
- data/app/models/concerns/effective_learndash_course_registration.rb +172 -0
- data/app/models/concerns/effective_learndash_owner.rb +1 -1
- data/app/models/effective/course_registrant.rb +53 -0
- data/app/models/effective/course_registration.rb +5 -0
- data/app/models/effective/learndash_api.rb +14 -5
- data/app/models/effective/learndash_course.rb +78 -3
- data/app/models/effective/learndash_enrollment.rb +7 -3
- data/app/models/effective/learndash_user.rb +5 -6
- data/app/views/admin/learndash_courses/_form.html.haml +25 -0
- data/app/views/admin/learndash_courses/_form_course_registration_content.html.haml +19 -0
- data/app/views/admin/learndash_courses/_form_learndash_course.html.haml +32 -0
- data/app/views/admin/learndash_courses/_learndash_course.html.haml +3 -3
- data/app/views/admin/learndash_owners/_form.html.haml +1 -1
- data/app/views/admin/learndash_users/_form.html.haml +1 -1
- data/app/views/admin/learndash_users/_learndash_user.html.haml +4 -4
- data/app/views/effective/course_registrations/_content.html.haml +10 -0
- data/app/views/effective/course_registrations/_course.html.haml +9 -0
- data/app/views/effective/course_registrations/_course_registration.html.haml +3 -0
- data/app/views/effective/course_registrations/_dashboard.html.haml +30 -0
- data/app/views/effective/course_registrations/_layout.html.haml +3 -0
- data/app/views/effective/course_registrations/_orders.html.haml +4 -0
- data/app/views/effective/course_registrations/_summary.html.haml +39 -0
- data/app/views/effective/course_registrations/billing.html.haml +15 -0
- data/app/views/effective/course_registrations/checkout.html.haml +6 -0
- data/app/views/effective/course_registrations/course.html.haml +20 -0
- data/app/views/effective/course_registrations/start.html.haml +25 -0
- data/app/views/effective/course_registrations/submitted.html.haml +15 -0
- data/app/views/effective/course_registrations/summary.html.haml +8 -0
- data/app/views/effective/learndash/_dashboard.html.haml +14 -16
- data/app/views/effective/learndash_courses/_learndash_course.html.haml +13 -0
- data/app/views/effective/learndash_courses/index.html.haml +5 -0
- data/app/views/effective/learndash_courses/show.html.haml +6 -0
- data/config/effective_learndash.rb +9 -0
- data/config/routes.rb +13 -3
- data/db/migrate/01_create_effective_learndash.rb.erb +98 -33
- data/lib/effective_learndash/engine.rb +1 -0
- data/lib/effective_learndash/version.rb +1 -1
- data/lib/effective_learndash.rb +6 -1
- data/lib/generators/effective_learndash/install_generator.rb +0 -1
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf3a76614af4d9fba4a5d9e483ecfc78ec821c042643b0d59508b42f80aead20
|
4
|
+
data.tar.gz: 3e383233f17438db0bc4c134e8fb767183b3697b0036100ddf89e80961b42332
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73041dc5fa8d6e130f865cd0ed5acf4c966ff1d7148168d6482f582f68c29d86fd8521c6d23aeb35227ca1f70810bd54b88408527767c3654b0998f8f6513d37
|
7
|
+
data.tar.gz: 58d39dc3138ff44d2be3152aba69734f7f83146714b1b79a44b084cdc05dcd865974e457b4f61c2c3dd2436e5a81b709db7ea3cde5b68b807a325bf28df7c58e
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# Effective
|
1
|
+
# Effective LearnDash
|
2
2
|
|
3
|
-
Create Wordpress users and read
|
3
|
+
Create Wordpress users and read LearnDash course progress. This is an unofficial integration that is not supported or affiliated with WordPress or LearnDash.
|
4
4
|
|
5
5
|
## Getting Started
|
6
6
|
|
@@ -74,6 +74,12 @@ The permissions you actually want to define are as follows (using CanCan):
|
|
74
74
|
can(:show, Effective::LearndashUser) { |lduser| lduser.owner_id == user.id }
|
75
75
|
can(:index, Effective::LearndashEnrollment)
|
76
76
|
|
77
|
+
can([:index, :show], Effective::LearndashCourse) { |course| !course.draft? }
|
78
|
+
can([:show, :index], Effective::CourseRegistrant) { |registrant| registrant.owner == user || registrant.owner.blank? }
|
79
|
+
can([:new, :create], EffectiveLearndash.CourseRegistration)
|
80
|
+
can([:show, :index], EffectiveLearndash.CourseRegistration) { |registration| registration.owner == user }
|
81
|
+
can([:update, :destroy], EffectiveLearndash.CourseRegistration) { |registration| registration.owner == user && !registration.was_submitted? }
|
82
|
+
|
77
83
|
if user.admin?
|
78
84
|
can :admin, :effective_learndash
|
79
85
|
|
@@ -85,29 +91,29 @@ if user.admin?
|
|
85
91
|
end
|
86
92
|
```
|
87
93
|
|
88
|
-
## Configuring
|
94
|
+
## Configuring LearnDash
|
89
95
|
|
90
|
-
Your
|
96
|
+
Your WordPress should be configured ahead of time with the LearnDash plugin.
|
91
97
|
|
92
98
|
Please generate an application password via:
|
93
99
|
|
94
100
|
https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/
|
95
101
|
|
96
|
-
and fill in the username/password details in config/initializers/
|
102
|
+
and fill in the username/password details in config/initializers/effective_learndash.rb
|
97
103
|
|
98
|
-
## Working with
|
104
|
+
## Working with LearnDash
|
99
105
|
|
100
106
|
Visit `/admin/learndash_courses` and Refresh the list of Courses.
|
101
107
|
|
102
|
-
Create a New
|
108
|
+
Create a New LearnDash User will create a new WordPress/LearnDash account with a username/password according to the settings in the config file.
|
103
109
|
|
104
110
|
When you create a user, you only get access to the password once. So any existing users will have an unknown password.
|
105
111
|
|
106
|
-
Create a new
|
112
|
+
Create a new LearnDash Enrollment to enroll a LearnDash user into a course. This will begin tracking their progress.
|
107
113
|
|
108
|
-
There are no webhooks or callbacks from
|
114
|
+
There are no webhooks or callbacks from LearnDash, everything is a GET request that updates the local database.
|
109
115
|
|
110
|
-
You can refresh an entire
|
116
|
+
You can refresh an entire LearnDash user in one operation and it will sync the entire user at once, `user.learndash_user.refresh!`
|
111
117
|
|
112
118
|
## License
|
113
119
|
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module Admin
|
2
|
+
class CourseRegistrationsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_learndash) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
end
|
8
|
+
end
|
@@ -7,7 +7,7 @@ module Admin
|
|
7
7
|
|
8
8
|
def refresh
|
9
9
|
resource_scope.refresh!
|
10
|
-
flash[:success] = "Successfully refreshed Courses from
|
10
|
+
flash[:success] = "Successfully refreshed Courses from LearnDash"
|
11
11
|
redirect_to effective_learndash.admin_learndash_courses_path
|
12
12
|
end
|
13
13
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Effective
|
2
|
+
class CourseRegistrationsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
|
5
|
+
include Effective::WizardController
|
6
|
+
|
7
|
+
resource_scope -> {
|
8
|
+
learndash_course = Effective::LearndashCourse.find(params[:learndash_course_id])
|
9
|
+
EffectiveLearndash.CourseRegistration.deep.where(owner: current_user, learndash_course: learndash_course)
|
10
|
+
}
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Effective
|
2
|
+
class LearndashCoursesController < ApplicationController
|
3
|
+
include Effective::CrudController
|
4
|
+
|
5
|
+
resource_scope -> {
|
6
|
+
unpublished = EffectiveResources.authorized?(self, :admin, :effective_learndash)
|
7
|
+
Effective::LearndashCourse.learndash_courses(user: current_user, unpublished: unpublished)
|
8
|
+
}
|
9
|
+
|
10
|
+
def show
|
11
|
+
@learndash_course = resource_scope.find(params[:id])
|
12
|
+
|
13
|
+
if @learndash_course.respond_to?(:roles_permit?)
|
14
|
+
raise Effective::AccessDenied.new('Access Denied', :show, @learndash_course) unless @learndash_course.roles_permit?(current_user)
|
15
|
+
end
|
16
|
+
|
17
|
+
EffectiveResources.authorize!(self, :show, @learndash_course)
|
18
|
+
|
19
|
+
if EffectiveResources.authorized?(self, :admin, :effective_learndash)
|
20
|
+
flash.now[:warning] = [
|
21
|
+
'Hi Admin!',
|
22
|
+
('You are viewing a hidden course.' if @learndash_course.draft?),
|
23
|
+
'Click here to',
|
24
|
+
("<a href='#{effective_learndash.edit_admin_learndash_course_path(@learndash_course)}' class='alert-link'>edit learndash course settings</a>.")
|
25
|
+
].compact.join(' ')
|
26
|
+
end
|
27
|
+
|
28
|
+
@page_title ||= @learndash_course.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Admin
|
2
|
+
class EffectiveCourseRegistrationsDatatable < Effective::Datatable
|
3
|
+
datatable do
|
4
|
+
col :updated_at, visible: false
|
5
|
+
col :created_at, visible: false
|
6
|
+
col :id, visible: false
|
7
|
+
|
8
|
+
col :token, visible: false
|
9
|
+
|
10
|
+
col :created_at, label: 'Created', visible: false
|
11
|
+
col :updated_at, label: 'Updated', visible: false
|
12
|
+
col :submitted_at, label: 'Submitted', visible: false, as: :date
|
13
|
+
|
14
|
+
col :learndash_course
|
15
|
+
col :owner
|
16
|
+
|
17
|
+
col :course_registrants, search: :string, visible: false
|
18
|
+
col :orders, label: 'Order'
|
19
|
+
|
20
|
+
actions_col
|
21
|
+
end
|
22
|
+
|
23
|
+
collection do
|
24
|
+
scope = EffectiveLearndash.CourseRegistration.all.deep.done
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -4,7 +4,7 @@ module Admin
|
|
4
4
|
order :title
|
5
5
|
|
6
6
|
col :id, visible: false
|
7
|
-
col :course_id, label: '
|
7
|
+
col :course_id, label: 'LearnDash Id', visible: false
|
8
8
|
|
9
9
|
col :title
|
10
10
|
col :status
|
@@ -15,6 +15,10 @@ module Admin
|
|
15
15
|
|
16
16
|
col :learndash_users, visible: false
|
17
17
|
|
18
|
+
col :can_register
|
19
|
+
col :regular_price, as: :price
|
20
|
+
col :member_price, as: :price
|
21
|
+
|
18
22
|
actions_col
|
19
23
|
end
|
20
24
|
|
@@ -2,7 +2,7 @@ module Admin
|
|
2
2
|
class EffectiveLearndashUsersDatatable < Effective::Datatable
|
3
3
|
datatable do
|
4
4
|
col :id, visible: false
|
5
|
-
col :user_id, label: '
|
5
|
+
col :user_id, label: 'LearnDash Id', visible: false
|
6
6
|
|
7
7
|
col :last_refreshed, visible: true do |user|
|
8
8
|
time_ago_in_words(user.last_synced_at) + ' ago'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Used on the Course Registrations courses step
|
2
|
+
|
3
|
+
class EffectiveCourseRegistrantsDatatable < Effective::Datatable
|
4
|
+
datatable do
|
5
|
+
col :learndash_course
|
6
|
+
col :owner, label: 'User', action: false
|
7
|
+
col :price, as: :price
|
8
|
+
end
|
9
|
+
|
10
|
+
collection do
|
11
|
+
scope = Effective::CourseRegistrant.deep.all
|
12
|
+
|
13
|
+
if attributes[:learndash_course_id].present?
|
14
|
+
scope = scope.where(learndash_course_id: attributes[:learndash_course_id])
|
15
|
+
end
|
16
|
+
|
17
|
+
if attributes[:course_registration_id].present?
|
18
|
+
scope = scope.where(course_registration_id: attributes[:course_registration_id])
|
19
|
+
end
|
20
|
+
|
21
|
+
scope
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Dashboard Course Registrations
|
2
|
+
class EffectiveCourseRegistrationsDatatable < Effective::Datatable
|
3
|
+
datatable do
|
4
|
+
order :created_at
|
5
|
+
|
6
|
+
col :token, visible: false
|
7
|
+
col :created_at, visible: false
|
8
|
+
|
9
|
+
col :learndash_course, label: 'Title', search: :string do |registration|
|
10
|
+
registration.learndash_course.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
col(:submitted_at, label: 'Registered on') do |registration|
|
14
|
+
registration.submitted_at&.strftime('%F') || 'Incomplete'
|
15
|
+
end
|
16
|
+
|
17
|
+
col :owner, visible: false, search: :string
|
18
|
+
col :status, visible: false
|
19
|
+
col :orders, action: :show, visible: false, search: :string
|
20
|
+
|
21
|
+
actions_col(actions: []) do |registration|
|
22
|
+
if registration.draft?
|
23
|
+
dropdown_link_to('Continue', effective_learndash.learndash_course_course_registration_build_path(registration.learndash_course, registration, registration.next_step), 'data-turbolinks' => false)
|
24
|
+
dropdown_link_to('Delete', effective_learndash.learndash_course_course_registration_path(registration.learndash_course, registration), 'data-confirm': "Really delete #{registration}?", 'data-method': :delete)
|
25
|
+
else
|
26
|
+
dropdown_link_to('Show', effective_learndash.learndash_course_course_registration_path(registration.learndash_course, registration))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
collection do
|
32
|
+
EffectiveLearndash.CourseRegistration.deep.where(owner: current_user)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Dashboard Courses
|
2
|
+
class EffectiveLearndashCoursesDatatable < Effective::Datatable
|
3
|
+
filters do
|
4
|
+
# Registerable should be first here, so when displayed as a simple datatable on the dashboard they only see registerable courses
|
5
|
+
scope :registerable
|
6
|
+
scope :all
|
7
|
+
end
|
8
|
+
|
9
|
+
datatable do
|
10
|
+
order :title
|
11
|
+
col :id, visible: false
|
12
|
+
|
13
|
+
col :title do |learndash_course|
|
14
|
+
learndash_course.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
actions_col show: false do |learndash_course|
|
18
|
+
if current_user.learndash_enrollment(course: learndash_course).present?
|
19
|
+
'Registered. Please access from the home dashboard or applicant wizard.'
|
20
|
+
elsif learndash_course.can_register?
|
21
|
+
dropdown_link_to('Register', effective_learndash.new_learndash_course_course_registration_path(learndash_course))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
collection do
|
27
|
+
Effective::LearndashCourse.deep.learndash_courses(user: current_user)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
# Dashboard LearndashUsers
|
2
2
|
class EffectiveLearndashEnrollmentsDatatable < Effective::Datatable
|
3
3
|
datatable do
|
4
|
-
col :learndash_course
|
5
|
-
|
4
|
+
col :learndash_course, label: 'Title' do |enrollment|
|
5
|
+
enrollment.learndash_course.to_s
|
6
|
+
end
|
7
|
+
|
8
|
+
col :progress_status, label: 'Status'
|
6
9
|
|
7
10
|
col :last_step, visible: false
|
8
11
|
col :steps_completed, visible: false
|
@@ -13,9 +16,9 @@ class EffectiveLearndashEnrollmentsDatatable < Effective::Datatable
|
|
13
16
|
|
14
17
|
actions_col(show: false) do |enrollment|
|
15
18
|
if enrollment.not_started?
|
16
|
-
dropdown_link_to('
|
19
|
+
dropdown_link_to('Access Course', EffectiveLearndash.learndash_url, target: '_blank')
|
17
20
|
elsif enrollment.in_progress?
|
18
|
-
dropdown_link_to('Continue', EffectiveLearndash.learndash_url, target: '_blank')
|
21
|
+
dropdown_link_to('Continue Course', EffectiveLearndash.learndash_url, target: '_blank')
|
19
22
|
else
|
20
23
|
dropdown_link_to('Show', EffectiveLearndash.learndash_url, target: '_blank')
|
21
24
|
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# frozen_stcourse_registrant_literal: true
|
2
|
+
|
3
|
+
# EffectiveLearndashCourseRegistration
|
4
|
+
#
|
5
|
+
# Mark your owner model with effective_learndash_course_registration to get all the includes
|
6
|
+
|
7
|
+
module EffectiveLearndashCourseRegistration
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
module Base
|
11
|
+
def effective_learndash_course_registration
|
12
|
+
include ::EffectiveLearndashCourseRegistration
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def effective_learndash_course_registration?; true; end
|
18
|
+
end
|
19
|
+
|
20
|
+
included do
|
21
|
+
acts_as_purchasable_parent
|
22
|
+
acts_as_tokened
|
23
|
+
|
24
|
+
acts_as_statused(
|
25
|
+
:draft, # Just Started
|
26
|
+
:submitted # All done
|
27
|
+
)
|
28
|
+
|
29
|
+
acts_as_wizard(
|
30
|
+
start: 'Start',
|
31
|
+
course: 'Course',
|
32
|
+
summary: 'Review',
|
33
|
+
billing: 'Billing Address',
|
34
|
+
checkout: 'Checkout',
|
35
|
+
submitted: 'Submitted'
|
36
|
+
)
|
37
|
+
|
38
|
+
acts_as_purchasable_wizard
|
39
|
+
|
40
|
+
log_changes(except: :wizard_steps) if respond_to?(:log_changes)
|
41
|
+
|
42
|
+
# Application Namespace
|
43
|
+
belongs_to :owner, polymorphic: true
|
44
|
+
accepts_nested_attributes_for :owner
|
45
|
+
|
46
|
+
# Effective Namespace
|
47
|
+
belongs_to :learndash_course, class_name: 'Effective::LearndashCourse'
|
48
|
+
|
49
|
+
has_many :course_registrants, -> { order(:id) }, class_name: 'Effective::CourseRegistrant', inverse_of: :course_registration, dependent: :destroy
|
50
|
+
accepts_nested_attributes_for :course_registrants, reject_if: :all_blank, allow_destroy: true
|
51
|
+
|
52
|
+
has_many :orders, -> { order(:id) }, as: :parent, class_name: 'Effective::Order', dependent: :nullify
|
53
|
+
accepts_nested_attributes_for :orders
|
54
|
+
|
55
|
+
effective_resource do
|
56
|
+
# Acts as Statused
|
57
|
+
status :string, permitted: false
|
58
|
+
status_steps :text, permitted: false
|
59
|
+
|
60
|
+
# Dates
|
61
|
+
submitted_at :datetime
|
62
|
+
|
63
|
+
# Acts as Wizard
|
64
|
+
wizard_steps :text, permitted: false
|
65
|
+
|
66
|
+
timestamps
|
67
|
+
end
|
68
|
+
|
69
|
+
scope :deep, -> { includes(:owner, :orders, :course_registrants) }
|
70
|
+
scope :sorted, -> { order(:id) }
|
71
|
+
|
72
|
+
scope :in_progress, -> { where.not(status: [:submitted]) }
|
73
|
+
scope :done, -> { where(status: [:submitted]) }
|
74
|
+
|
75
|
+
scope :for, -> (user) { where(owner: user) }
|
76
|
+
|
77
|
+
# All Steps validations
|
78
|
+
validates :owner, presence: true
|
79
|
+
|
80
|
+
# Course Step
|
81
|
+
validate(if: -> { current_step == :course }) do
|
82
|
+
self.errors.add(:course_registrants, "can't be blank") unless present_course_registrants.present?
|
83
|
+
end
|
84
|
+
|
85
|
+
# All Fees and Orders
|
86
|
+
def submit_fees
|
87
|
+
course_registrants
|
88
|
+
end
|
89
|
+
|
90
|
+
# Enroll them in all courses.
|
91
|
+
def after_submit_purchased!
|
92
|
+
course_registrants.each { |registrant| registrant.owner.create_learndash_enrollment(course: registrant.learndash_course) }
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
# Instance Methods
|
98
|
+
def to_s
|
99
|
+
persisted? ? "#{learndash_course} - #{owner}" : 'course registration'
|
100
|
+
end
|
101
|
+
|
102
|
+
def course
|
103
|
+
learndash_course
|
104
|
+
end
|
105
|
+
|
106
|
+
def in_progress?
|
107
|
+
draft?
|
108
|
+
end
|
109
|
+
|
110
|
+
def done?
|
111
|
+
submitted?
|
112
|
+
end
|
113
|
+
|
114
|
+
def course_registrant
|
115
|
+
course_registrants.first
|
116
|
+
end
|
117
|
+
|
118
|
+
def build_course_registrant
|
119
|
+
course_registrants.build(owner: owner, learndash_course: learndash_course)
|
120
|
+
end
|
121
|
+
|
122
|
+
def learndash_owner
|
123
|
+
(course_registrant&.owner || owner)
|
124
|
+
end
|
125
|
+
|
126
|
+
def member_pricing?
|
127
|
+
learndash_owner.membership_present?
|
128
|
+
end
|
129
|
+
|
130
|
+
def registration_price
|
131
|
+
raise('expected a learndash course') unless learndash_course.present?
|
132
|
+
raise('expected a learndash owner') unless learndash_owner.present?
|
133
|
+
|
134
|
+
member_pricing? ? learndash_course.member_price : learndash_course.regular_price
|
135
|
+
end
|
136
|
+
|
137
|
+
def assign_pricing
|
138
|
+
course_registrant.assign_attributes(
|
139
|
+
price: registration_price,
|
140
|
+
qb_item_name: learndash_course.qb_item_name,
|
141
|
+
tax_exempt: learndash_course.tax_exempt
|
142
|
+
)
|
143
|
+
end
|
144
|
+
|
145
|
+
# After the course step.
|
146
|
+
def course!
|
147
|
+
raise('expected a learndash course') unless learndash_course.present?
|
148
|
+
raise('expected a course_registrant to be present') unless course_registrant.present?
|
149
|
+
raise('expected a course_registrant to have an owner') unless course_registrant.owner.present?
|
150
|
+
raise('expected a learndash owner') unless learndash_owner.class.try(:effective_learndash_owner?)
|
151
|
+
|
152
|
+
# Assign prices
|
153
|
+
assign_pricing()
|
154
|
+
raise('expected course_registrants to have a price') if course_registrants.any? { |registrant| registrant.price.blank? }
|
155
|
+
|
156
|
+
# Save record
|
157
|
+
save!
|
158
|
+
|
159
|
+
# Create a learndash user now before payment to catch any errors in server stuff before payment.
|
160
|
+
learndash_owner.create_learndash_user
|
161
|
+
raise('expected a persisted learndash user') unless learndash_owner.learndash_user&.persisted?
|
162
|
+
|
163
|
+
true
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def present_course_registrants
|
169
|
+
course_registrants.reject(&:marked_for_destruction?)
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This is the registrant as created by the course registration
|
4
|
+
# It tracks who purchased which course for how much
|
5
|
+
|
6
|
+
module Effective
|
7
|
+
class CourseRegistrant < ActiveRecord::Base
|
8
|
+
acts_as_purchasable
|
9
|
+
|
10
|
+
log_changes(to: :learndash_course) if respond_to?(:log_changes)
|
11
|
+
|
12
|
+
# The learndash course containing all the pricing and unique info about this course purchase
|
13
|
+
belongs_to :learndash_course
|
14
|
+
|
15
|
+
# Every course is charged to a owner
|
16
|
+
belongs_to :owner, polymorphic: true
|
17
|
+
|
18
|
+
# As checked out through the learndash course purchase wizard
|
19
|
+
belongs_to :course_registration, polymorphic: true
|
20
|
+
|
21
|
+
effective_resource do
|
22
|
+
# Acts as Purchasable
|
23
|
+
price :integer
|
24
|
+
qb_item_name :string
|
25
|
+
tax_exempt :boolean
|
26
|
+
|
27
|
+
timestamps
|
28
|
+
end
|
29
|
+
|
30
|
+
scope :sorted, -> { order(:id) }
|
31
|
+
scope :deep, -> { includes(:learndash_course, :owner, :course_registration) }
|
32
|
+
|
33
|
+
before_validation(if: -> { course_registration.present? }) do
|
34
|
+
self.learndash_course ||= course_registration.learndash_course
|
35
|
+
self.owner ||= course_registration.owner
|
36
|
+
end
|
37
|
+
|
38
|
+
before_validation(if: -> { learndash_course.present? }) do
|
39
|
+
self.price ||= learndash_course.price
|
40
|
+
self.qb_item_name ||= learndash_course.qb_item_name
|
41
|
+
self.tax_exempt = learndash_course.tax_exempt? if self.tax_exempt.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
persisted? ? title : 'course purchase'
|
46
|
+
end
|
47
|
+
|
48
|
+
def title
|
49
|
+
"#{learndash_course} - #{owner}"
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -60,13 +60,14 @@ module Effective
|
|
60
60
|
|
61
61
|
username = username_for(owner)
|
62
62
|
password = password_for(owner)
|
63
|
+
email = email_for(owner)
|
63
64
|
|
64
65
|
payload = {
|
65
66
|
username: username,
|
66
67
|
password: password,
|
68
|
+
email: email,
|
67
69
|
|
68
70
|
name: owner.to_s,
|
69
|
-
email: owner.email,
|
70
71
|
roles: ['subscriber'],
|
71
72
|
|
72
73
|
first_name: owner.try(:first_name),
|
@@ -145,15 +146,23 @@ module Effective
|
|
145
146
|
end
|
146
147
|
|
147
148
|
def username_for(resource)
|
148
|
-
raise('expected a
|
149
|
+
raise('expected a LearnDash owner') unless resource.class.respond_to?(:effective_learndash_owner?) # This is a user
|
149
150
|
|
150
151
|
name = EffectiveLearndash.wp_username_for(resource)
|
151
152
|
name = "test#{name}" unless Rails.env.production?
|
152
153
|
name
|
153
154
|
end
|
154
155
|
|
156
|
+
def email_for(resource)
|
157
|
+
raise('expected a LearnDash owner') unless resource.class.respond_to?(:effective_learndash_owner?) # This is a user
|
158
|
+
|
159
|
+
email = resource.email
|
160
|
+
email = "test#{email}" unless Rails.env.production?
|
161
|
+
email
|
162
|
+
end
|
163
|
+
|
155
164
|
def password_for(resource)
|
156
|
-
raise('expected a
|
165
|
+
raise('expected a LearnDash owner') unless resource.class.respond_to?(:effective_learndash_owner?) # This is a user
|
157
166
|
EffectiveLearndash.wp_password_for(resource)
|
158
167
|
end
|
159
168
|
|
@@ -169,7 +178,7 @@ module Effective
|
|
169
178
|
elsif response.kind_of?(Array)
|
170
179
|
response.first
|
171
180
|
else
|
172
|
-
raise("unexpected
|
181
|
+
raise("unexpected LearnDash API response #{response}")
|
173
182
|
end
|
174
183
|
end
|
175
184
|
|
@@ -190,7 +199,7 @@ module Effective
|
|
190
199
|
elsif response.kind_of?(Array)
|
191
200
|
response
|
192
201
|
else
|
193
|
-
raise("unexpected
|
202
|
+
raise("unexpected LearnDash API find_by response #{response}")
|
194
203
|
end
|
195
204
|
)
|
196
205
|
|