Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor-pro/gift-course/GiftEnrollment.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
/**
3
+
* Handle Gift Enrollments
4
+
*
5
+
* @package TutorPro\GiftCourse
6
+
* @author Themeum <support@themeum.com>
7
+
* @link https://themeum.com
8
+
* @since 3.8.0
9
+
*/
10
+
11
+
namespace TutorPro\GiftCourse;
12
+
13
+
use AllowDynamicProperties;
14
+
use TUTOR\Input;
15
+
use Tutor\Models\CourseModel;
16
+
use Tutor\Traits\JsonResponse;
17
+
use TUTOR_PRO\GuestEmail;
18
+
use TutorPro\CourseBundle\CustomPosts\CourseBundle;
19
+
use TutorPro\CourseBundle\Models\BundleModel;
20
+
21
+
/**
22
+
* Manage gift enrollments
23
+
*
24
+
* @since 3.8.0
25
+
*/
26
+
#[AllowDynamicProperties]
27
+
class GiftEnrollment {
28
+
29
+
use JsonResponse;
30
+
31
+
/**
32
+
* Resolve dependencies and register hooks
33
+
*
34
+
* @since 3.8.0
35
+
*
36
+
* @param GiftScheduler $scheduler GiftScheduler.
37
+
*/
38
+
public function __construct( GiftScheduler $scheduler ) {
39
+
$this->scheduler = $scheduler;
40
+
add_action( 'tutor_action_claim_gift', array( $this, 'claim_gift' ) );
41
+
add_action( 'wp_ajax_tutor_pro_gift_enrollment', array( $this, 'ajax_gift_enrollment' ) );
42
+
}
43
+
44
+
/**
45
+
* Ajax handler to enroll the gift receiver to a course
46
+
*
47
+
* @since 3.8.0
48
+
*
49
+
* @return void send wp_json response
50
+
*/
51
+
public function ajax_gift_enrollment() {
52
+
tutor_utils()->checking_nonce();
53
+
$post = Input::sanitize_array( $_POST );
54
+
$course_id = $post['course_id'];
55
+
$reference_id = $post['reference_id'];
56
+
$user_id = get_current_user_id();
57
+
58
+
if ( ! $course_id || ! $reference_id ) {
59
+
$this->response_bad_request( __( 'Invalid gift request', 'tutor-pro' ) );
60
+
}
61
+
62
+
$can_claim = $this->can_claim_gift( $reference_id );
63
+
if ( ! $can_claim->success ) {
64
+
// If user can not claim then delete the scheduled record.
65
+
$this->scheduler->delete( array( 'reference_id' => $reference_id ) );
66
+
67
+
// Send response.
68
+
$this->response_bad_request( $can_claim->message );
69
+
}
70
+
71
+
add_filter(
72
+
'tutor_enroll_data',
73
+
function ( $data ) {
74
+
$data['post_status'] = 'completed';
75
+
return $data;
76
+
}
77
+
);
78
+
79
+
$enroll = tutor_utils()->do_enroll( $course_id, 0, $user_id );
80
+
if ( $enroll ) {
81
+
// Enroll user to the bundle courses.
82
+
if ( tutor_utils()->is_addon_enabled( 'course-bundle' ) ) {
83
+
if ( CourseBundle::POST_TYPE === get_post_type( $course_id ) ) {
84
+
BundleModel::enroll_to_bundle_courses( $course_id, $user_id );
85
+
}
86
+
}
87
+
88
+
// Notify the gift sender.
89
+
$payload = $can_claim->payload;
90
+
if ( $payload->notify_me ) {
91
+
( new GiftMailer( $payload ) )->send_notification_email_to_purchaser();
92
+
}
93
+
94
+
// Update items status as received.
95
+
try {
96
+
$proceeder = GiftCourse::get_gift_proceeder();
97
+
$proceeder->update_item_meta( $payload->order_item_id, GiftCourse::GIFT_STATUS_META, GiftCourse::GIFT_STATUS_RECEIVED );
98
+
$proceeder->update_item_meta( $payload->order_item_id, GiftCourse::GIFT_RECEIVED_AT_META, current_time( 'mysql', 'U' ) );
99
+
} catch ( \Throwable $th ) {
100
+
tutor_log( $th );
101
+
}
102
+
103
+
// Delete scheduled record.
104
+
( new GiftScheduler() )->delete( array( 'reference_id' => $reference_id ) );
105
+
106
+
$this->response_success( __( 'You have successfully claimed this gift.', 'tutor-pro' ) );
107
+
} else {
108
+
$this->response_bad_request( __( 'Could not enroll', 'tutor-pro' ) );
109
+
}
110
+
}
111
+
112
+
/**
113
+
* Handle gift course enrollment.
114
+
*
115
+
* @since 3.8.0
116
+
*
117
+
* @return void
118
+
*/
119
+
public function claim_gift() {
120
+
$reference_id = Input::get( 'reference' );
121
+
122
+
if ( empty( $reference_id ) ) {
123
+
wp_die( esc_html__( 'Invalid request.', 'tutor-pro' ) );
124
+
}
125
+
126
+
$can_claim = $this->can_claim_gift( $reference_id );
127
+
if ( ! $can_claim->success ) {
128
+
wp_die( esc_html( $can_claim->message ) );
129
+
}
130
+
131
+
$payload = $can_claim->payload;
132
+
$recipient_email = $payload->recipient_email;
133
+
$recipient_name = $payload->recipient_name;
134
+
$course_id = (int) $payload->course_id;
135
+
136
+
$recipient_first_name = '';
137
+
$recipient_last_name = '';
138
+
139
+
if ( ! empty( $recipient_name ) ) {
140
+
$names = explode( ' ', trim( $recipient_name ), 2 );
141
+
142
+
if ( count( $names ) >= 2 ) {
143
+
$recipient_first_name = $names[0] ?? '';
144
+
$recipient_last_name = $names[1] ?? '';
145
+
} else {
146
+
$recipient_first_name = $names[0] ?? '';
147
+
}
148
+
}
149
+
150
+
// Check if user exists.
151
+
$user = get_user_by( 'email', $recipient_email );
152
+
153
+
if ( ! $user ) {
154
+
// Create new user.
155
+
$username = sanitize_user( tutor_utils()->create_unique_username( $recipient_email ), true );
156
+
$password = wp_generate_password( 12, true );
157
+
$user_id = wp_create_user( $username, $password, $recipient_email );
158
+
159
+
if ( is_wp_error( $user_id ) ) {
160
+
wp_die( esc_html__( 'Could not create user account.', 'tutor-pro' ) );
161
+
}
162
+
163
+
// Update display name.
164
+
wp_update_user(
165
+
array(
166
+
'ID' => $user_id,
167
+
'display_name' => $recipient_name,
168
+
'first_name' => $recipient_first_name,
169
+
'last_name' => $recipient_last_name,
170
+
)
171
+
);
172
+
173
+
$user = get_user_by( 'id', $user_id );
174
+
175
+
// Send password reset email to the recipient.
176
+
( new GuestEmail() )->send_password_reset_email( $user );
177
+
}
178
+
179
+
// Log the user in.
180
+
wp_set_current_user( $user->ID );
181
+
wp_set_auth_cookie( $user->ID );
182
+
183
+
// Update scheduled, this is required when gift sent to a guest user.
184
+
$gift_details = $this->scheduler->get( array( 'reference_id' => $reference_id ) );
185
+
if ( $gift_details ) {
186
+
$this->scheduler->update(
187
+
array( 'scheduled_for' => $user->ID ),
188
+
array( 'reference_id' => $reference_id )
189
+
);
190
+
}
191
+
192
+
// Redirect to Tutor LMS Dashboard.
193
+
wp_safe_redirect( tutor_utils()->tutor_dashboard_url() );
194
+
exit;
195
+
}
196
+
197
+
/**
198
+
* Check whether current user can claim this gift
199
+
*
200
+
* @since 3.8.0
201
+
*
202
+
* @param mixed $reference_id Gift reference id.
203
+
*
204
+
* @return object {success, message, payload}
205
+
*/
206
+
public function can_claim_gift( $reference_id ): object {
207
+
$res = (object) array(
208
+
'success' => true,
209
+
'message' => esc_html__( 'You have successfully claimed this gift', 'tutor-pro' ),
210
+
'payload' => null,
211
+
);
212
+
213
+
$gift_data = $this->scheduler->get( $reference_id );
214
+
215
+
if ( empty( $gift_data ) || ! is_object( $gift_data ) ) {
216
+
$res->success = false;
217
+
$res->message = esc_html__( 'Gift data is missing or invalid.', 'tutor-pro' );
218
+
return $res;
219
+
}
220
+
221
+
$payload = json_decode( $gift_data->payload );
222
+
if ( empty( $payload ) || ! is_object( $payload ) ) {
223
+
$res->success = false;
224
+
$res->message = esc_html__( 'Gift data is missing or invalid.', 'tutor-pro' );
225
+
return $res;
226
+
}
227
+
228
+
// Status not processed mean it is scheduled. Not available yet.
229
+
if ( $this->scheduler::STATUS_PROCESSED !== $gift_data->status ) {
230
+
$res->success = false;
231
+
$res->message = esc_html__( 'This gift is not yet available to claim.', 'tutor-pro' );
232
+
return $res;
233
+
}
234
+
235
+
try {
236
+
$proceeder = GiftCourse::get_gift_proceeder();
237
+
$order = $proceeder->get_order( $payload->order_id );
238
+
if ( ! $order || 'completed' !== $order->order_status ) {
239
+
$res->success = false;
240
+
$res->message = esc_html__( 'The associated order is not completed yet.', 'tutor-pro' );
241
+
return $res;
242
+
}
243
+
} catch ( \Throwable $th ) {
244
+
$res->success = false;
245
+
$res->message = esc_html__( 'Unable to process the order for this gift.', 'tutor-pro' );
246
+
return $res;
247
+
}
248
+
249
+
$course = get_post( $payload->course_id );
250
+
if ( ! $course || CourseModel::STATUS_PUBLISH !== $course->post_status ) {
251
+
$res->success = false;
252
+
$res->message = esc_html__( 'The gifted course is not available.', 'tutor-pro' );
253
+
return $res;
254
+
}
255
+
256
+
$res->payload = $payload;
257
+
return $res;
258
+
}
259
+
}
260
+