2828use Tutor \Helpers \ValidationHelper ;
2929use Tutor \Models \EnrollmentModel ;
3030use Tutor \Options_V2 ;
31+ use TUTOR_ASSIGNMENTS \Assignments ;
3132
3233/**
3334 * Course Class
@@ -1832,7 +1833,7 @@ private function save_course_content_order( $sort_order = array() ) {
18321833
18331834 $ i = 0 ;
18341835 foreach ( $ sort_order as $ topic ) {
1835- $ i ++ ;
1836+ ++ $ i ;
18361837 $ wpdb ->update (
18371838 $ wpdb ->posts ,
18381839 array ( 'menu_order ' => $ i ),
@@ -2887,102 +2888,93 @@ public function remove_price_if_enrolled( $html ) {
28872888 *
28882889 * @return string|null
28892890 */
2890- public static function get_course_completion_missing_requirements_msg ( $ course_id = 0 , $ user_id = 0 ) {
2891+ public static function get_course_completion_restrict_msg ( $ course_id = 0 , $ user_id = 0 ) {
28912892 $ course_id = tutor_utils ()->get_post_id ( $ course_id );
28922893 $ user_id = tutor_utils ()->get_user_id ( $ user_id );
28932894
2894- $ completion_mode = tutor_utils ()->get_option ( 'course_completion_process ' );
2895- if ( 'strict ' !== $ completion_mode ) {
2895+ if ( 'strict ' !== tutor_utils ()->get_option ( 'course_completion_process ' ) ) {
28962896 return null ;
28972897 }
28982898
2899- $ completed_lesson = tutor_utils ()->get_completed_lesson_count_by_course ( $ course_id , $ user_id );
2900- $ lesson_count = tutor_utils ()->get_lesson_count_by_course ( $ course_id );
2899+ $ completed_lessons = tutor_utils ()->get_completed_lesson_count_by_course ( $ course_id , $ user_id );
2900+ $ total_lessons = tutor_utils ()->get_lesson_count_by_course ( $ course_id );
29012901
2902- if ( $ completed_lesson < $ lesson_count ) {
2902+ if ( $ completed_lessons < $ total_lessons ) {
29032903 return __ ( 'Complete all lessons to mark this course as complete ' , 'tutor ' );
29042904 }
29052905
2906- $ quizzes = array ();
2907- $ assignments = array ();
2908-
29092906 $ course_contents = tutor_utils ()->get_course_contents_by_id ( $ course_id );
2910- if ( tutor_utils ()->count ( $ course_contents ) ) {
2911- foreach ( $ course_contents as $ content ) {
2912- if ( 'tutor_quiz ' === $ content ->post_type ) {
2913- $ quizzes [] = $ content ;
2914- }
2915- if ( 'tutor_assignments ' === $ content ->post_type ) {
2916- $ assignments [] = $ content ;
2917- }
2918- }
2919- }
29202907
2921- $ required_assignment_pass = 0 ;
2922- foreach ( $ assignments as $ row ) {
2923- $ assignment_submission = tutor_utils ()->is_assignment_submitted ( $ row ->ID , $ user_id );
2924- $ is_reviewed_by_instructor = ! count ( $ assignment_submission )
2925- ? false
2926- : get_comment_meta ( $ assignment_submission [0 ]->comment_ID , 'evaluate_time ' , true );
2908+ $ required_quiz_pass_count = 0 ;
2909+ $ required_assignment_pass_count = 0 ;
29272910
2928- if ( $ assignment_submission && $ is_reviewed_by_instructor ) {
2929- $ pass_mark = tutor_utils ()->get_assignment_option ( $ row ->ID , 'pass_mark ' );
2930- $ has_passed = false ;
2931- foreach ( $ assignment_submission as $ submission ) {
2932- $ given_mark = (int ) get_comment_meta ( $ submission ->comment_ID , 'assignment_mark ' , true );
2933- if ( $ given_mark >= $ pass_mark ) {
2934- $ has_passed = true ;
2935- break ;
2936- }
2911+ $ is_assignment_addon_enabled = tutor_utils ()->is_addon_enabled ( 'tutor-assignments ' );
2912+
2913+ foreach ( $ course_contents as $ content ) {
2914+
2915+ if ( tutor ()->quiz_post_type === $ content ->post_type ) {
2916+ if ( ! QuizModel::is_quiz_passed ( $ content ->ID , $ user_id ) ) {
2917+ ++$ required_quiz_pass_count ;
29372918 }
2938- if ( ! $ has_passed ) {
2939- $ required_assignment_pass ++;
2919+ }
2920+
2921+ if ( $ is_assignment_addon_enabled && tutor ()->assignment_post_type === $ content ->post_type ) {
2922+ if ( ! Assignments::is_assignment_passed ( $ content ->ID , $ user_id ) ) {
2923+ ++$ required_assignment_pass_count ;
29402924 }
2941- } else {
2942- $ required_assignment_pass ++;
29432925 }
29442926 }
29452927
2946- $ is_quiz_pass = true ;
2947- $ required_quiz_pass = 0 ;
2928+ if ( ! $ required_quiz_pass_count && ! $ required_assignment_pass_count ) {
2929+ return null ;
2930+ }
29482931
2949- if ( tutor_utils ()->count ( $ quizzes ) ) {
2950- foreach ( $ quizzes as $ quiz ) {
2951- $ attempt = tutor_utils ()->get_quiz_attempt ( $ quiz ->ID , $ user_id );
2952- if ( $ attempt ) {
2953- $ passing_grade = tutor_utils ()->get_quiz_option ( $ quiz ->ID , 'passing_grade ' , 0 );
2954- $ earned_percentage = QuizModel::calculate_attempt_earned_percentage ( $ attempt );
2932+ return self ::get_course_completion_requirement_message (
2933+ $ required_quiz_pass_count ,
2934+ $ required_assignment_pass_count
2935+ );
2936+ }
29552937
2956- if ( $ earned_percentage < $ passing_grade ) {
2957- $ required_quiz_pass ++;
2958- $ is_quiz_pass = false ;
2959- }
2960- } else {
2961- $ required_quiz_pass ++;
2962- $ is_quiz_pass = false ;
2963- }
2964- }
2965- }
2938+ /**
2939+ * Build missing course completion requirements message.
2940+ *
2941+ * @since 4.0.0
2942+ *
2943+ * @param int $quiz_count Total quiz count.
2944+ * @param int $assignment_count Total assignment count.
2945+ *
2946+ * @return string
2947+ */
2948+ private static function get_course_completion_requirement_message ( $ quiz_count , $ assignment_count ) {
2949+ $ quiz_label = _n ( 'quiz ' , 'quizzes ' , $ quiz_count , 'tutor ' );
2950+ $ assignment_label = _n ( 'assignment ' , 'assignments ' , $ assignment_count , 'tutor ' );
29662951
2967- if ( ! $ is_quiz_pass || $ required_assignment_pass > 0 ) {
2968- $ _msg = '' ;
2969- $ quiz_str = _n ( 'quiz ' , 'quizzes ' , $ required_quiz_pass , 'tutor ' );
2970- $ assignment_str = _n ( 'assignment ' , 'assignments ' , $ required_assignment_pass , 'tutor ' );
2952+ if ( $ quiz_count && ! $ assignment_count ) {
2953+ return sprintf (
2954+ /* translators: %1$s: quiz count; %2$s: quiz label */
2955+ __ ( 'You have to pass %1$s %2$s to complete this course. ' , 'tutor ' ),
2956+ $ quiz_count ,
2957+ $ quiz_label
2958+ );
2959+ }
29712960
2972- if ( ! $ is_quiz_pass && 0 == $ required_assignment_pass ) {
2973- /* translators: %1$s: number of quiz pass required; %2$s: quiz string */
2974- $ _msg = sprintf ( __ ( 'You have to pass %1$s %2$s to complete this course. ' , 'tutor ' ), $ required_quiz_pass , $ quiz_str );
2975- } elseif ( $ is_quiz_pass && $ required_assignment_pass > 0 ) {
2976- /* translators: %1$s: number of assignment pass required; %2$s: assignment string */
2977- $ _msg = sprintf ( __ ( 'You have to pass %1$s %2$s to complete this course. ' , 'tutor ' ), $ required_assignment_pass , $ assignment_str );
2978- } else {
2979- /* translators: %1$s: number of quiz pass required; %2$s: quiz string; %3$s: number of assignment pass required; %4$s: assignment string */
2980- $ _msg = sprintf ( __ ( 'You have to pass %1$s %2$s and %3$s %4$s to complete this course. ' , 'tutor ' ), $ required_quiz_pass , $ quiz_str , $ required_assignment_pass , $ assignment_str );
2981- }
2982- return $ _msg ;
2961+ if ( ! $ quiz_count && $ assignment_count ) {
2962+ return sprintf (
2963+ /* translators: %1$s: assignment count; %2$s: assignment label */
2964+ __ ( 'You have to pass %1$s %2$s to complete this course. ' , 'tutor ' ),
2965+ $ assignment_count ,
2966+ $ assignment_label
2967+ );
29832968 }
29842969
2985- return null ;
2970+ return sprintf (
2971+ /* translators: %1$s: quiz count; %2$s: quiz label; %3$s: assignment count; %4$s: assignment label */
2972+ __ ( 'You have to pass %1$s %2$s and %3$s %4$s to complete this course. ' , 'tutor ' ),
2973+ $ quiz_count ,
2974+ $ quiz_label ,
2975+ $ assignment_count ,
2976+ $ assignment_label
2977+ );
29862978 }
29872979
29882980 /**
@@ -2994,7 +2986,7 @@ public static function get_course_completion_missing_requirements_msg( $course_i
29942986 * @return string
29952987 */
29962988 public function tutor_lms_hide_course_complete_btn ( $ html ) {
2997- $ _msg = self ::get_course_completion_missing_requirements_msg ();
2989+ $ _msg = self ::get_course_completion_restrict_msg ();
29982990
29992991 if ( $ _msg ) {
30002992 return '<div class="tutor-alert tutor-warning tutor-mt-28">
0 commit comments