Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor-pro/gift-course/GiftEnrollment.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
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 +