diff --git a/ecommerce/HooksHandler.php b/ecommerce/HooksHandler.php index 2d65b0f8cd..0b90f401a4 100644 --- a/ecommerce/HooksHandler.php +++ b/ecommerce/HooksHandler.php @@ -285,6 +285,7 @@ public function handle_payment_status_changed( $order_id, $prev_payment_status, * Clear cart items, managing enrollment & earnings * * @since 3.0.0 + * @since 4.2.1 manage earnings and enrollment only for the buyer's unprocessed order. * * @param int $order_id Order id. * @@ -292,16 +293,25 @@ public function handle_payment_status_changed( $order_id, $prev_payment_status, */ public function handle_order_placement_success( int $order_id ) { $order_data = $this->order_model->get_order_by_id( $order_id ); - if ( $order_data ) { - $user_id = $order_data->student->id; + if ( ! $order_data ) { + return; + } - ( new CartModel() )->clear_user_cart( $user_id ); + $user_id = $order_data->student->id; + ( new CartModel() )->clear_user_cart( $user_id ); - // Manage enrollment & earnings. - $order = ( new OrderModel() )->get_order_by_id( $order_id ); - $payment_status = $order->payment_status; + /** + * Skip if the order is already processed, otherwise revisiting the success URL + * re-activates expired/cancelled enrollments and recalculates earnings. + * + * @since 4.2.1 + */ + $is_processed = isset( $order_data->enrollment ) || Earnings::get_instance()->is_exist_order_earning( $order_id ); - $order_status = $this->order_model->get_order_status_by_payment_status( $payment_status ); + if ( get_current_user_id() === $user_id && ! $is_processed ) { + // Manage enrollment & earnings. + $payment_status = $order_data->payment_status; + $order_status = $this->order_model->get_order_status_by_payment_status( $payment_status ); $this->manage_earnings_and_enrollments( $order_status, $order_id ); } @@ -527,8 +537,12 @@ public function handle_free_checkout( array $order_data ) { add_filter( 'tutor_enroll_data', fn( $enroll_data ) => array_merge( $enroll_data, array( 'post_status' => 'completed' ) ) ); $enrolled_id = EnrollmentModel::do_enroll( $item['item_id'], $order_data['id'], $user_id ); - if ( $enrolled_id && tutor_utils()->is_addon_enabled( 'course-bundle' ) && get_post_type( $item['item_id'] ) === CourseBundle::POST_TYPE ) { - BundleModel::enroll_to_bundle_courses( $item['item_id'], $user_id ); + if ( $enrolled_id ) { + do_action( 'tutor_order_enrolled', (object) $order_data, $enrolled_id ); + + if ( tutor_utils()->is_addon_enabled( 'course-bundle' ) && get_post_type( $item['item_id'] ) === CourseBundle::POST_TYPE ) { + BundleModel::enroll_to_bundle_courses( $item['item_id'], $user_id ); + } } }