Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature 80: Validation assigned to other reviewer #173

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 161 additions & 26 deletions relis_app/controllers/Screening.php
Original file line number Diff line number Diff line change
Expand Up @@ -2104,6 +2104,14 @@ public function validate_screen_set($data = array())
}
}
// print_test($users);
if (get_appconfig_element('assign_to_non_screened_validator_on')){
// Get assignable papers
$user_papers_map = array();
foreach ($_assign_user as $user_id => $user_name) {
$user_papers_map[$user_id] = $this->get_assignable_papers($user_id, $screening_phase_id, $papers['to_assign']);
}
$data['user_papers_map'] = $user_papers_map;
}
$data['users'] = $_assign_user;
$data['number_papers'] = count($papers['to_assign']);
$data['number_papers_assigned'] = count($papers['assigned']);
Expand All @@ -2123,6 +2131,22 @@ public function validate_screen_set($data = array())
$this->load->view('shared/body', $data);
}

function get_assignable_papers($user_id, $screen_phase_id, $papers) {
// Gets a list of papers that the user has screened
$screened_papers = $this->Screening_dataAccess->get_user_screened_papers($user_id, $screen_phase_id);
$screened_paper_ids = array_column($screened_papers, 'paper_id');

// Filter out papers that the user has not screened
$assignable_papers = array();
foreach ($papers as $paper) {
if (!in_array($paper['id'], $screened_paper_ids)) {
$assignable_papers[] = $paper;
}
}

return $assignable_papers;
}

public function get_papers_by_criteria($data = array()) {
header('Content-Type: application/json');
$validation_by_criteria = $this->input->post('validation_by_criteria');
Expand Down Expand Up @@ -2288,6 +2312,7 @@ function save_assign_screen_validation()
$papers_sources = $post_arr['papers_sources'];
$paper_source_status = $post_arr['paper_source_status'];
$screening_phase_info = active_screening_phase_info();
$screen_phase_id = $screening_phase_info['screen_phase_id'];
$phase_title = $screening_phase_info['phase_title'];
$reviews_per_paper = 1;
if ($validation_by_exclusion_criteria_toggle == 'on'){
Expand All @@ -2303,39 +2328,148 @@ function save_assign_screen_validation()
$papers = $papers_all['to_assign'];
}
$papers_to_validate_nbr = round(count($papers) * $percentage / 100);
if ($papers_to_validate_nbr <= 0) {
$data['err_msg'] = " No papers selected for assignment. Please increase the percentage of papers to be assigned.";
$this->validate_screen_set($data);
return;
}
$operation_description = "Assign $percentage % ($papers_to_validate_nbr) of " . $paper_source_status . " papers for $phase_title";
// print_test($papers);
shuffle($papers); // randomize the list
$assign_papers = array();
$this->db2 = $this->load->database(project_db(), TRUE);
$operation_code = active_user_id() . "_" . time();
foreach ($papers as $key => $value) {
if ($key < $papers_to_validate_nbr) {
$assign_papers[$key]['paper'] = $value['id'];
$assign_papers[$key]['users'] = array();
$assignment_save = array(
'paper_id' => $value['id'],
'user_id' => '',
'assignment_note' => '',
'assignment_type' => screening_validator_assignment_type(),
'operation_code' => $operation_code,
'assignment_mode' => 'auto',
'assignment_role' => 'Validation',
'screening_phase' => $currect_screening_phase,
'assigned_by' => $this->session->userdata('user_id')
);
$j = 1;
//the table to save assignments
if (get_appconfig_element('assign_to_non_screened_validator_on')){
// Get assignable papers for each user
$user_papers_map = array();
foreach ($users as $user) {
$user_papers_map[$user] = $this->get_assignable_papers($user, $screen_phase_id, $papers);

}

// Sort users by the number of assignable papers from low to high
uasort($user_papers_map, function($a, $b) {
return count($a) > count($b);
});

// Get all assignable papers
$all_assignable_papers = array();
foreach ($user_papers_map as $user_papers) {
foreach ($user_papers as $paper) {
$all_assignable_papers[$paper['id']] = $paper;
}
}
$all_assignable_papers = array_values($all_assignable_papers);

// print_test('papers_to_validate_nbr: '.$papers_to_validate_nbr);

if (count($all_assignable_papers) < $papers_to_validate_nbr) {
$data['err_msg'] = " Selected users cannot be assigned the required number of papers. Please select more users or reduce the percentage of papers to be assigned.";
$this->validate_screen_set($data);
return;
}

// The number of papers each user has been assigned
$assigned_papers = array();
foreach ($users as $user) {
$assigned_papers[$user] = 0;
}

foreach ($all_assignable_papers as $paper) {
// Get validators who can be assigned this paper
$eligible_users = array();
foreach ($user_papers_map as $user => $user_papers) {
if (in_array($paper, $user_papers)) {
if (!isset($assign_papers[$user])) {
$assign_papers[$user] = [];
}
$eligible_users[$user] = count($assign_papers[$user]);
}
}

// Sort in ascending order according to the number of papers assigned
asort($eligible_users);

$final_user = null;
foreach ($eligible_users as $user => $assigned_count) {
if (is_null($final_user)) {
$final_user = $user;
} elseif ($assigned_count == $assigned_papers[$final_user]) {
// If the number of assigned papers is the same, select validators with fewer papers to be assigned
if (count($user_papers_map[$user]) < count($user_papers_map[$final_user])) {
$final_user = $user;
}
} else {
break;
}
}

$assign_papers[$final_user][] = $paper; // papers assigned under best average
$assigned_papers[$final_user]++; // number of papers assigned

}

// Assign papers as expected number
for ($i = 0, $j =0; $j < $papers_to_validate_nbr; $i++){
foreach ($users as $user){
if ($j >= $papers_to_validate_nbr){
break;
}
if ($assigned_papers[$user] > 0) {
$assignments_to_save[] = array(
'paper_id' => $assign_papers[$user][$i]['id'],
'user_id' => $user,
'assignment_note' => '',
'assignment_type' => screening_validator_assignment_type(),
'operation_code' => $operation_code,
'assignment_mode' => 'auto',
'assignment_role' => 'Validation',
'screening_phase' => $currect_screening_phase,
'assigned_by' => $this->session->userdata('user_id')
);
$assigned_papers[$user]--;
$j++;
}
}
}

// print_test($assignments_to_save);exit();

if (!empty($assignments_to_save)) {
$table_name = get_table_configuration('screening', 'current', 'table_name');
while ($j <= $reviews_per_paper) {
$temp_user = ($key % count($users)) + $j;
if ($temp_user >= count($users))
$temp_user = $temp_user - count($users);
array_push($assign_papers[$key]['users'], $users[$temp_user]);
$assignment_save['user_id'] = $users[$temp_user];
//print_test($assignment_save);
$this->db2->insert($table_name, $assignment_save);
$j++;
$this->db2->insert_batch($table_name, $assignments_to_save);
}

}
else {
foreach ($papers as $key => $value) {
if ($key < $papers_to_validate_nbr) {
$assign_papers[$key]['paper'] = $value['id'];
$assign_papers[$key]['users'] = array();
$assignment_save = array(
'paper_id' => $value['id'],
'user_id' => '',
'assignment_note' => '',
'assignment_type' => screening_validator_assignment_type(),
'operation_code' => $operation_code,
'assignment_mode' => 'auto',
'assignment_role' => 'Validation',
'screening_phase' => $currect_screening_phase,
'assigned_by' => $this->session->userdata('user_id')
);
$j = 1;
//the table to save assignments
$table_name = get_table_configuration('screening', 'current', 'table_name');
while ($j <= $reviews_per_paper) {
$temp_user = ($key % count($users)) + $j;
if ($temp_user >= count($users))
$temp_user = $temp_user - count($users);
array_push($assign_papers[$key]['users'], $users[$temp_user]);
$assignment_save['user_id'] = $users[$temp_user];
//print_test($assignment_save);
$this->db2->insert($table_name, $assignment_save);
$j++;
}
}
}
}
Expand Down Expand Up @@ -2878,6 +3012,7 @@ public function toggle_phase_config($phase_id) {
'use_kappa' => $config['use_kappa'],
'screening_validation_on' => $config['screening_validation_on'],
'screening_validator_assignment_type' => $config['screening_validator_assignment_type'],
'assign_to_non_screened_validator_on' => $config['assign_to_non_screened_validator_on'],
'validation_default_percentage' => $config['validation_default_percentage']
);
$this->db2->where('screen_phase_id', $phase_id);
Expand Down
1 change: 1 addition & 0 deletions relis_app/helpers/bm_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -857,6 +857,7 @@ function is_screening_config_element($element) {
'screening_status_to_validate',
'screening_validator_assignment_type',
'use_kappa',
'assign_to_non_screened_validator_on',
'validation_default_percentage'
));
}
Expand Down
1 change: 1 addition & 0 deletions relis_app/helpers/tests/element_ut_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -3083,6 +3083,7 @@ private function update_screening_config()
'screening_validation_on' => array(0, 1),
'screening_validator_assignment_type' => 'Normal',
'screening_status_to_validate' => 'Excluded',
'assign_to_non_screened_validator_on' => array(0, 1),
'validation_default_percentage' => 50
);

Expand Down
25 changes: 25 additions & 0 deletions relis_app/helpers/tests/helpers/functions_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,31 @@ function save_assignment_screen($data)
}
}

//The purpose of this function is to handle the remove of screening entry from the database
function remove_screening($screen_id)
{
$ci = get_instance();

$ci->db2 = $ci->load->database(project_db(), TRUE);
$config = "screen";
$screen_detail = $ci->DBConnection_mdl->get_row_details($config, $screen_id);
$ci->db2->update('screening_paper', array('screening_active' => 0), array('screening_id' => $screen_id));
$ci->db2->update('screening_paper', array('screening_status' => 'Pending'), array('screening_id' => $screen_id));
update_paper_status_status($screen_detail['paper_id']);
}

//The purpose of this function is to handle the removal of screening validation entries from the database
function remove_screening_validation($screen_id)
{
$ci = get_instance();

$ci->db2 = $ci->load->database(project_db(), TRUE);
$config = "screen";
$screen_detail = $ci->DBConnection_mdl->get_row_details($config, $screen_id);
$ci->db2->update('screening_paper', array('screening_active' => 0), array('screening_id' => $screen_id));
$ci->db2->update('screening_paper', array('screening_status' => 'Pending'), array('screening_id' => $screen_id));
}

/**
* The purpose of this function is to retrieve and organize papers for screening based on the provided source,
* source status, current phase, and assignment role
Expand Down
7 changes: 7 additions & 0 deletions relis_app/helpers/tests/inclusion_mode_conflict_ut_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ private function changeModeWhenNoInclusionCriteria() {
'use_kappa' => true,
'screening_validation_on' => true,
'screening_validator_assignment_type' => "Normal",
'assign_to_non_screened_validator_on' => false,
'validation_default_percentage' => 20
);

Expand Down Expand Up @@ -120,6 +121,7 @@ private function defaultCriteria_one() {
'use_kappa' => '1',
'screening_validation_on' => '0',
'screening_validator_assignment_type' => 'Normal',
'assign_to_non_screened_validator_on' => '0',
'validation_default_percentage' => '10',
)),
'affected_phases' => serialize(array(
Expand Down Expand Up @@ -186,6 +188,7 @@ private function keepOneFromAny() {
'use_kappa' => '1',
'screening_validation_on' => '0',
'screening_validator_assignment_type' => 'Normal',
'assign_to_non_screened_validator_on' => '0',
'validation_default_percentage' => '10',
)),
'affected_phases' => serialize(array(
Expand Down Expand Up @@ -226,6 +229,7 @@ private function keepOneFromAll() {
'use_kappa' => true,
'screening_validation_on' => true,
'screening_validator_assignment_type' => "Normal",
'assign_to_non_screened_validator_on' => false,
'validation_default_percentage' => 20
);

Expand Down Expand Up @@ -258,6 +262,7 @@ private function keepOneFromAll() {
'use_kappa' => '1',
'screening_validation_on' => '0',
'screening_validator_assignment_type' => 'Normal',
'assign_to_non_screened_validator_on' => '0',
'validation_default_percentage' => '10',
)),
'affected_phases' => serialize(array(
Expand Down Expand Up @@ -301,6 +306,7 @@ private function resetScreening() {
'use_kappa' => true,
'screening_validation_on' => true,
'screening_validator_assignment_type' => "Normal",
'assign_to_non_screened_validator_on' => false,
'validation_default_percentage' => 20
);

Expand Down Expand Up @@ -333,6 +339,7 @@ private function resetScreening() {
'use_kappa' => '1',
'screening_validation_on' => '0',
'screening_validator_assignment_type' => 'Normal',
'assign_to_non_screened_validator_on' => '0',
'validation_default_percentage' => '10',
)),
'affected_phases' => serialize(array(
Expand Down
1 change: 1 addition & 0 deletions relis_app/helpers/tests/manager_ut_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -1133,6 +1133,7 @@ private function update_screening_config()
'screening_validation_on' => array(0, 1),
'screening_validator_assignment_type' => 'Normal',
'screening_status_to_validate' => 'Excluded',
'assign_to_non_screened_validator_on' => array(0, 1),
'validation_default_percentage' => 50
);

Expand Down
Loading
Loading