function read_excel_and_insert_into_database($target_file, $userid)
{
    // return {"status":, error:[{"line":"1", "message":"xxx error"},{"line":"", "message":""}, ...]}
    $users = array();
    global $file_status;
    // load file
    try {
        $input_file_type = PHPExcel_IOFactory::identify($target_file);
        $reader = PHPExcel_IOFactory::createReader($input_file_type);
        $excel = $reader->load($target_file);
    } catch (Exception $e) {
        $file_status->status = ERR_FILE_LOAD;
        array_push($file_status->errors, array("sheet" => 0, "lines" => 0, "message" => $e->getMessage()));
        return $file_status->status;
    }
    // parse file
    $sheet_count = $excel->getSheetCount();
    for ($cur_sheet = 0; $cur_sheet < $sheet_count; $cur_sheet++) {
        $sheet = $excel->getSheet($cur_sheet);
        $sheet_title = $sheet->getTitle();
        //print_r($sheet_title);
        if ($sheet_title == "上传名单说明") {
            continue;
        }
        // if sheet name is xxxx, skip it
        $highest_row = $sheet->getHighestRow();
        $highest_col = count($file_status->upload_user_syntax);
        $tmp = array();
        for ($col = 0; $col <= $highest_col; $col++) {
            array_push($tmp, trim($sheet->getCellByColumnAndRow($col, 1)->getValue()));
        }
        if (!is_valid_syntax_import_file($tmp)) {
            $file_status->status = ERR_FILE_LOAD;
            array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => 0, "message" => MSG_ERR_FILE_CONTENT_SYNTAX));
            return $file_status->status;
        }
        for ($row = 2; $row <= $highest_row; $row++) {
            $tmp = array();
            $functions = array();
            for ($col = 0; $col <= $highest_col; $col++) {
                array_push($tmp, trim($sheet->getCellByColumnAndRow($col, $row)->getValue()));
            }
            if (is_empty_row($tmp)) {
                continue;
            }
            $cur_user = new UploadUser($tmp);
            if (!is_correct_user_eid_format($cur_user->EmployeeId)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_USER_EID_FORMAT));
            }
            if (!is_correct_user_name_format($cur_user->UserName)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_USER_NAME_FORMAT));
            }
            if (!is_correct_user_email_format($cur_user->Email)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_USER_EMAIL_FORMAT));
            }
            if (!is_correct_user_dept_format($cur_user->DeptCode)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_USER_DEPT_FORMAT));
            }
            $detp_id = get_dept_id_from_database($cur_user->DeptCode);
            if ($detp_id == ERR_USER_DEPT_NOT_EXIST) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => "{$product_name} 不存在"));
            } else {
                $cur_user->DeptId = $detp_id;
            }
            $canapprove = get_canapprove_from_tf($cur_user->CanApprovestr);
            $cur_user->CanApprove = $canapprove;
            if (is_user_exist($cur_user)) {
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "UserName" => $cur_user->UserName, "EmployeeId" => $cur_user->EmployeeId, "message" => "此用户系统中已存在!"));
            } else {
                array_push($users, $cur_user);
            }
        }
    }
    if ($file_status->status == UPLOAD_SUCCESS) {
        return write_into_database($users, $userid);
    } else {
        return $file_status->status;
    }
}
function read_excel_and_insert_into_database($target_file)
{
    // return {"status":, error:[{"line":"1", "message":"xxx error"},{"line":"", "message":""}, ...]}
    $problems = array();
    global $file_status;
    // load file
    try {
        $input_file_type = PHPExcel_IOFactory::identify($target_file);
        $reader = PHPExcel_IOFactory::createReader($input_file_type);
        $excel = $reader->load($target_file);
    } catch (Exception $e) {
        $file_status->status = ERR_FILE_LOAD;
        array_push($file_status->errors, array("sheet" => 0, "lines" => 0, "message" => $e->getMessage()));
        return $file_status->status;
    }
    // parse file
    $sheet_count = $excel->getSheetCount();
    for ($cur_sheet = 0; $cur_sheet < $sheet_count; $cur_sheet++) {
        $sheet = $excel->getSheet($cur_sheet);
        $highest_row = $sheet->getHighestRow();
        $highest_col = count($file_status->upload_problem_syntax);
        $tmp = array();
        for ($col = 0; $col <= $highest_col; $col++) {
            array_push($tmp, trim($sheet->getCellByColumnAndRow($col, 1)->getValue()));
        }
        if (!is_valid_syntax_import_file($tmp)) {
            $file_status->status = ERR_FILE_LOAD;
            array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => 0, "message" => MSG_ERR_FILE_CONTENT_SYNTAX));
            return $file_status->status;
        }
        for ($row = 2; $row <= $highest_row; $row++) {
            $tmp = array();
            $functions = array();
            for ($col = 0; $col <= $highest_col; $col++) {
                array_push($tmp, trim($sheet->getCellByColumnAndRow($col, $row)->getValue()));
            }
            if (is_empty_row($tmp)) {
                continue;
            }
            $cur_problem = new UploadProblem($tmp);
            if (!is_correct_prob_type_format($cur_problem->type)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_PROB_TYPE_FORMAT));
            }
            if (!is_correct_prob_desc_format($cur_problem->desc)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_PROB_DESC_FORMAT));
            }
            if (!is_correct_prob_level_format($cur_problem->level)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_PROB_LEVEL_FORMAT));
            }
            if (!is_correct_prob_answer_format($cur_problem->answer, $cur_problem->selections, $cur_problem->type)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_PROB_ANSWER_FORMAT));
            }
            if (!is_correct_prob_selection_format($cur_problem->selections, $cur_problem->type)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_PROB_SELECTOR_FORMAT));
            }
            foreach ($cur_problem->category_product as $product_name) {
                $func_id = get_function_id_from_database($product_name);
                if ($func_id == ERR_PROB_FUNC_NOT_EXIST) {
                    $file_status->status = ERR_FILE_LOAD;
                    array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => "{$product_name} 不存在"));
                } else {
                    array_push($functions, $func_id);
                }
            }
            foreach ($cur_problem->category_adaptaion as $adaptation_name) {
                $func_id = get_function_id_from_database($adaptation_name);
                if ($func_id == ERR_PROB_FUNC_NOT_EXIST) {
                    $file_status->status = ERR_FILE_LOAD;
                    array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => "{$adaptation_name} 不存在"));
                } else {
                    array_push($functions, $func_id);
                }
            }
            foreach ($cur_problem->problem_category as $category_name) {
                $func_id = get_function_id_from_database($category_name);
                if ($func_id == ERR_PROB_FUNC_NOT_EXIST) {
                    $file_status->status = ERR_FILE_LOAD;
                    array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => "{$category_name} 不存在"));
                } else {
                    array_push($functions, $func_id);
                }
            }
            if (is_no_any_functions($functions)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => "至少需要有一个分类"));
            }
            $cur_problem->functions_str = output_category_str_from_func_array($functions);
            array_push($problems, $cur_problem);
        }
    }
    if ($file_status->status == UPLOAD_SUCCESS) {
        return write_into_database($problems);
    } else {
        return $file_status->status;
    }
}
 function add_details($data)
 {
     $reason = '';
     $data['financialperiod'] = $data['fystart__financialperiods'] . '-all';
     if (empty($data['plan_id'])) {
         $planCount = $this->_query_reader->get_count('get_procurement_plan_by_data', array('pde_id' => $data['pde_id'], 'financial_year_start' => get_quarter_date($data['financialperiod'], 'start'), 'financial_year_end' => get_quarter_date($data['financialperiod'], 'end')));
     }
     # proceed with the addition if this is a unique plan
     if (!empty($data['plan_id']) || empty($data['plan_id']) && $planCount == 0) {
         $planId = $this->_query_reader->add_data((!empty($data['plan_id']) ? 'edit' : 'add') . '_procurement_plan', array('organization_id' => $data['pde_id'], 'financial_year_start' => get_quarter_date($data['financialperiod'], 'start'), 'financial_year_end' => get_quarter_date($data['financialperiod'], 'end'), 'title' => htmlentities($data['name'], ENT_QUOTES), 'details' => '', 'document_url' => '', 'status' => $data['status__procurementplanstatus'], 'user_id' => $this->native_session->get('__user_id'), 'plan_id' => !empty($data['plan_id']) ? $data['plan_id'] : ''));
         $planId = !empty($data['plan_id']) ? $data['plan_id'] : $planId;
         # proceed with processing the procurement plan details
         if (!empty($planId)) {
             $this->native_session->set('plan_id', $planId);
             require_once HOME_URL . 'external_libraries/phpexcel/PHPExcel.php';
             $objPHPExcel = PHPExcel_IOFactory::load(UPLOAD_DIRECTORY . $data['document']);
             $sheetData = $objPHPExcel->getActiveSheet()->toArray('', true, true, true);
             $DATA_START = 9;
             $result = TRUE;
             $usefulData = array();
             # extract the useful data
             foreach ($sheetData as $i => $row) {
                 if ($i >= $DATA_START && !is_empty_row($row)) {
                     # where they can not edit
                     if (!empty($row['B']) && trim($row['B']) == 'DO NOT EDIT BELOW THIS LINE') {
                         break;
                     }
                     # put only categories with data
                     if (in_array(trim(strtolower($row['B'])), get_option_list($this, 'procurementcategories', 'array')) && !empty($sheetData[$i + 1]['D'])) {
                         array_push($usefulData, $row);
                     } else {
                         if (!empty($row['D'])) {
                             # convert back to UK format if excel importer converted the dates to US format
                             $tempRow = $row;
                             foreach ($tempRow as $key => $value) {
                                 if (strtolower($key) > 'd') {
                                     if (strpos($value, '/', 3) !== FALSE) {
                                         $value = date('m-d-y', strtotime(make_us_date($value)));
                                     }
                                     # correct dates in the format 12-31-15 as they can not be converted correctly
                                     if (strpos($value, '-', 3) !== FALSE && strlen($value) == 8) {
                                         $valueParts = explode('-', $value);
                                         if (count($valueParts) > 2) {
                                             $value = substr(@date('Y'), 0, 2) . $valueParts[2] . '-' . $valueParts[0] . '-' . $valueParts[1];
                                         }
                                     }
                                     $row[$key] = !empty($value) ? date('d/m/Y', strtotime($value)) : '';
                                 }
                             }
                             array_push($usefulData, $row);
                         }
                     }
                 }
             }
             # remove the old sheet data
             if (!empty($usefulData) && !empty($data['plan_id'])) {
                 $result = $this->_query_reader->run('remove_plan_detail_rows', array('plan_id' => $data['plan_id']));
             }
             # add the new sheet data
             foreach ($usefulData as $row) {
                 # save the rows with data
                 $rowData = array_merge($row, array('plan_id' => $planId, 'user_id' => $this->native_session->get('__user_id')));
                 $result = $this->_query_reader->run('add_plan_detail_row', $rowData);
             }
             # return with the list of added items for immediate display
             if ($result) {
                 return $this->_query_reader->get_list('get_procurement_plan_details', array('plan_id' => $planId));
             } else {
                 $reason = "The plan details could not be fully recorded.";
             }
         } else {
             $reason = "The plan headers could not be recorded.";
         }
     } else {
         $reason = "This PDE already has a plan for the same financial period. Please edit that instead.";
     }
     return $reason;
 }
function read_excel_and_insert_into_database($target_file, $qtid)
{
    // return {"status":, error:[{"line":"1", "message":"xxx error"},{"line":"", "message":""}, ...]}
    $qts = array();
    global $file_status;
    // load file
    try {
        $input_file_type = PHPExcel_IOFactory::identify($target_file);
        $reader = PHPExcel_IOFactory::createReader($input_file_type);
        $excel = $reader->load($target_file);
    } catch (Exception $e) {
        $file_status->status = ERR_FILE_LOAD;
        array_push($file_status->errors, array("sheet" => 0, "lines" => 0, "message" => $e->getMessage()));
        return $file_status->status;
    }
    // parse file
    $sheet_count = $excel->getSheetCount();
    for ($cur_sheet = 0; $cur_sheet < $sheet_count; $cur_sheet++) {
        $sheet = $excel->getSheet($cur_sheet);
        $sheet_title = $sheet->getTitle();
        // print_r($sheet_title);
        if ($sheet_title == "上传题库说明") {
            continue;
        }
        // if sheet name is xxxx, skip it
        $highest_row = $sheet->getHighestRow();
        $highest_col = count($file_status->upload_qd_syntax);
        $tmp = array();
        for ($col = 0; $col <= $highest_col; $col++) {
            array_push($tmp, trim($sheet->getCellByColumnAndRow($col, 1)->getValue()));
        }
        if (!is_valid_syntax_import_file($tmp)) {
            $file_status->status = ERR_FILE_LOAD;
            array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => 0, "message" => MSG_ERR_FILE_CONTENT_SYNTAX));
            $resultStr = MSG_ERR_FILE_CONTENT_SYNTAX;
            return $file_status->status;
        }
        for ($row = 2; $row <= $highest_row; $row++) {
            $tmp = array();
            $functions = array();
            for ($col = 0; $col <= $highest_col; $col++) {
                array_push($tmp, trim($sheet->getCellByColumnAndRow($col, $row)->getValue()));
            }
            if (is_empty_row($tmp)) {
                continue;
            }
            //$qtid = 1;
            $cur_qt = new UploadQT($tmp, $qtid);
            // echo "<br />";
            // print_r($cur_qt);
            if (!is_correct_qt_type_format($cur_qt->type)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_QT_TYPE_FORMAT));
                $resultStr = MSG_ERR_QT_TYPE_FORMAT;
            }
            if (!is_correct_qt_desc_format($cur_qt->desc)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_QT_DESC_FORMAT));
                $resultStr = MSG_ERR_QT_DESC_FORMAT;
            }
            // if (!is_correct_prob_level_format($cur_problem->level))
            // {
            // $file_status->status = ERR_FILE_LOAD;
            // array_push($file_status->errors, array("sheet"=>$cur_sheet, "lines"=>$row, "message"=>MSG_ERR_PROB_LEVEL_FORMAT));
            // }
            // if (!is_correct_prob_answer_format($cur_problem->answer, $cur_problem->selections, $cur_problem->type))
            // {
            // $file_status->status = ERR_FILE_LOAD;
            // array_push($file_status->errors, array("sheet"=>$cur_sheet, "lines"=>$row, "message"=>MSG_ERR_PROB_ANSWER_FORMAT));
            // }
            if (!is_correct_qt_selection_format($cur_qt->selections, $cur_qt->type)) {
                $file_status->status = ERR_FILE_LOAD;
                array_push($file_status->errors, array("sheet" => $cur_sheet, "lines" => $row, "message" => MSG_ERR_QT_SELECTOR_FORMAT));
                $resultStr = MSG_ERR_QT_SELECTOR_FORMAT;
            }
            // if this sheet is OBL, insert OBL function name to $cur_problem->category_product
            // if ($sheet_title == "OBL")
            // {
            // print_r("OBL");
            // array_push($cur_problem->category_product, "OBL");
            // }
            // foreach ($cur_problem->category_product as $product_name)
            // {
            // $func_id = get_function_id_from_database($product_name);
            // if ($func_id == ERR_PROB_FUNC_NOT_EXIST)
            // {
            // $file_status->status = ERR_FILE_LOAD;
            // array_push($file_status->errors, array("sheet"=>$cur_sheet, "lines"=>$row, "message"=> "$product_name 不存在"));
            // }
            // else
            // {
            // array_push($functions, $func_id);
            // }
            // }
            // foreach ($cur_problem->category_adaptaion as $adaptation_name)
            // {
            // $func_id = get_function_id_from_database($adaptation_name);
            // if ($func_id == ERR_PROB_FUNC_NOT_EXIST)
            // {
            // $file_status->status = ERR_FILE_LOAD;
            // array_push($file_status->errors, array("sheet"=>$cur_sheet, "lines"=>$row, "message"=> "$adaptation_name 不存在"));
            // }
            // else
            // {
            // array_push($functions, $func_id);
            // }
            // }
            // foreach ($cur_problem->problem_category as $category_name)
            // {
            // $func_id = get_function_id_from_database($category_name);
            // if ($func_id == ERR_PROB_FUNC_NOT_EXIST)
            // {
            // $file_status->status = ERR_FILE_LOAD;
            // array_push($file_status->errors, array("sheet"=>$cur_sheet, "lines"=>$row, "message"=> "$category_name 不存在"));
            // }
            // else
            // {
            // array_push($functions, $func_id);
            // }
            // }
            //
            // if (is_no_any_functions($functions))
            // {
            // $file_status->status = ERR_FILE_LOAD;
            // array_push($file_status->errors, array("sheet"=>$cur_sheet, "lines"=>$row, "message"=> "至少需要有一个分类"));
            // }
            // $cur_problem->functions_str = output_category_str_from_func_array($functions);
            array_push($qts, $cur_qt);
        }
    }
    if ($file_status->status == UPLOAD_SUCCESS) {
        return write_into_database($qts);
    } else {
        return $file_status->status;
    }
}