198 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| set_time_limit(0);
 | |
| require_once 'config.inc';
 | |
| require_once 'helper.inc';
 | |
| require_once 'vendor/autoload.php';
 | |
| require_once 'database.inc';
 | |
| require_once 'excelConditionalStyles.inc';
 | |
| 
 | |
| use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 | |
| use Monolog\Logger;
 | |
| use Monolog\Handler\StreamHandler;
 | |
| 
 | |
| $log_level = convert_log_level();
 | |
| $log = new Logger("eChecklist-export");
 | |
| $log->pushHandler(new StreamHandler(LOG_PATH . "/echecklist-export.log", $log_level));
 | |
| 
 | |
| global $conditions, $validation, $borders;
 | |
| 
 | |
| $db = new db();
 | |
| $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
 | |
| 
 | |
| if(!$id) {
 | |
|     die("Failed to read checklist ID");
 | |
| }
 | |
| 
 | |
| $host_status = [
 | |
|     $conditions['open'],
 | |
|     $conditions['exception'],
 | |
|     $conditions['false_positive'],
 | |
|     $conditions['not_a_finding'],
 | |
|     $conditions['not_applicable'],
 | |
|     $conditions['no_data'],
 | |
|     $conditions['not_reviewed'],
 | |
|     $conditions['true'],
 | |
|     $conditions['false']
 | |
| ];
 | |
| 
 | |
| /** @var checklist $chk */
 | |
| $chk = $db->get_Checklist($id);
 | |
| if(is_array($chk) && count($chk) && isset($chk[0])) {
 | |
|     $chk = $chk[0];
 | |
| } else {
 | |
|     die("Failed to find the checklist");
 | |
| }
 | |
| 
 | |
| $Reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("../ste/eChecklist-Template.xlsx");
 | |
| $ss = $Reader->load("../ste/eChecklist-Template.xlsx");
 | |
| 
 | |
| $log->debug("Loaded template");
 | |
| 
 | |
| $ss->setActiveSheetIndexByName('Cover Sheet')
 | |
|     ->setCellValue("B5", "{$chk->get_Name()} eChecklist")
 | |
|     ->setCellValue("B9", "")
 | |
|     ->setCellValue("B2", (substr($chk->get_File_Name(), 0, 1) == 'U' ? "UNCLASSIFIED" : "FOUO"))
 | |
|     ->setCellValue("B12", "by:\r" . COMPANY . "\r" . COMP_ADD)
 | |
|     ->setCellValue("B15", "Derived from: " . SCG . "\rReasons: <reasons>\rDeclassify on: " . DECLASSIFY_ON);
 | |
| 
 | |
| // set properties
 | |
| $ss->getProperties()
 | |
|     ->setCreator(CREATOR);
 | |
| $ss->getProperties()
 | |
|     ->setLastModifiedBy(LAST_MODIFIED_BY);
 | |
| $ss->getProperties()
 | |
|     ->setCompany(COMPANY);
 | |
| $ss->getProperties()
 | |
|     ->setTitle("{$chk->get_Name()} eChecklist");
 | |
| $ss->getProperties()
 | |
|     ->setSubject("{$chk->get_Name()} eChecklist");
 | |
| $ss->getProperties()
 | |
|     ->setDescription("{$chk->get_Name()} eChecklist");
 | |
| 
 | |
| // set active sheet
 | |
| $ss->setActiveSheetIndex(2);
 | |
| $sheet = $ss->getActiveSheet();
 | |
| $sheet->setCellValue("B9", "{$chk->get_Name()} V{$chk->get_Version()}R{$chk->get_Release()} ({$chk->get_type()})");
 | |
| $sheet->setTitle($chk->get_Name());
 | |
| $sheet->setCellValue("A1", (substr($chk->get_File_Name(), 0, 1) == 'U' ? "UNCLASSIFIED" : "UNCLASSIFIED//FOUO"));
 | |
| 
 | |
| $db->help->select("pdi", null, [
 | |
|     [
 | |
|         'field' => 'pcl.checklist_id',
 | |
|         'op' => '=',
 | |
|         'value' => $id
 | |
|     ]
 | |
| ], [
 | |
|     'table_joins' => [
 | |
|         "JOIN pdi_checklist_lookup pcl ON pcl.pdi_id = pdi.pdi_id"
 | |
|     ]
 | |
| ]);
 | |
| $pdis = $db->help->execute();
 | |
| 
 | |
| $row = 11;
 | |
| if(is_array($pdis) && count($pdis)) {
 | |
|     foreach($pdis as $p) {
 | |
|         $overall_str = "=IF(" .
 | |
|             "COUNTIF(F{$row}:F{$row},\"Open\")+" .
 | |
|             "COUNTIF(F{$row}:F{$row},\"Exception\")" .
 | |
|             ">0,\"Open\",\"Not a Finding\")";
 | |
|         $same_str = "=IF(" .
 | |
|             "COUNTIF(F{$row}:F{$row},F{$row})=" .
 | |
|             "COLUMNS(F{$row}:F{$row}), TRUE, FALSE)";
 | |
|         
 | |
|         $sheet->setCellValue("A{$row}", $p['STIG_ID'])
 | |
|             ->setCellValue("B{$row}", $p['VMS_ID'])
 | |
|             ->setCellValue("C{$row}", $p['CAT'])
 | |
|             ->setCellValue("D{$row}", $p['IA_Controls'])
 | |
|             ->setCellValue("E{$row}", $p['short_title'])
 | |
|             ->setCellValue("F{$row}", "Not Reviewed")
 | |
|             ->setCellValue("G{$row}", $overall_str)
 | |
|             ->setCellValue("H{$row}", $same_str, true)
 | |
|             ->setCellValue("I{$row}", "")
 | |
|             ->setCellValue("J{$row}", $p['check_contents'])
 | |
|             ->getStyle("H11:H{$sheet->getHighestDataRow()}")
 | |
|             ->setConditionalStyles([$conditions['true'], $conditions['false']]);
 | |
|         $row++;
 | |
|     }
 | |
|     
 | |
|     $sheet->setDataValidation("F11:F{$row}", clone $validation['host_status']);
 | |
|     $sheet->getStyle("F11:G{$row}")
 | |
|         ->setConditionalStyles($host_status);
 | |
|     $sheet->getStyle("C11:C{$row}")
 | |
|         ->setConditionalStyles(array($conditions['cat_1'], $conditions['cat_2'], $conditions['cat_3']));
 | |
|     
 | |
|     $sheet->getStyle("I11:I{$row}")
 | |
|         ->setConditionalStyles(
 | |
|         [
 | |
|             $conditions['open_conflict'],
 | |
|             $conditions['nf_na_conflict']
 | |
|         ]
 | |
|     );
 | |
|     
 | |
|     $sheet->getStyle("A1:I{$row}")
 | |
|         ->applyFromArray($borders);
 | |
|     $sheet->freezePane("A11");
 | |
|     $sheet->setAutoFilter("A10:I10");
 | |
|     
 | |
|     $sheet->getColumnDimension("F")->setWidth(14.14);
 | |
|     $sheet->setCellValue("F8", "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"I\")")
 | |
|         ->setCellValue("F9", "=COUNTIF(F11:F{$row}, \"Not Reviewed\")")
 | |
|         ->setCellValue("F10", "Example");
 | |
|     $sheet->getStyle("F10")
 | |
|         ->getFont()
 | |
|         ->setBold(true);
 | |
|     $sheet->getStyle("F10")
 | |
|         ->getFill()
 | |
|         ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
 | |
|         ->setStartColor($GLOBALS['yellow']);
 | |
| 
 | |
|     $open_cat_1 = "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"I\")";
 | |
|     $open_cat_2 = "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"II\")";
 | |
|     $open_cat_3 = "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"III\")";
 | |
|     $not_a_finding = "=COUNTIF(F11:F{$row}, \"Not a Finding\")";
 | |
|     $not_applicable = "=COUNTIF(F11:F{$row}, \"Not Applicable\")";
 | |
|     $not_reviewed = "=COUNTIF(F11:F{$row}, \"Not Reviewed\")";
 | |
|     
 | |
|     $sheet->getStyle("G8:H8")
 | |
|         ->getFill()
 | |
|         ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
 | |
|         ->setStartColor($GLOBALS['orange']);
 | |
|     $sheet->getStyle("G9:H9")
 | |
|         ->getFill()
 | |
|         ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
 | |
|         ->setStartColor($GLOBALS['green']);
 | |
|     $sheet->getStyle("G10:H10")
 | |
|         ->getFill()
 | |
|         ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
 | |
|         ->setStartColor($GLOBALS['yellow']);
 | |
|     $sheet->getStyle("I10:J10")
 | |
|         ->getFill()
 | |
|         ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
 | |
|         ->setStartColor($GLOBALS['light_gray']);
 | |
|     
 | |
|     $sheet->setCellValue("G8", "=COUNTIF(G11:H{$row}, \"Open\")")
 | |
|         ->setCellValue("G9", "=COUNTIF(G11:G{$row}, \"Not a Finding\")")
 | |
|         ->setCellValue("H8", "=COUNTIF(H11:H{$row}, FALSE)")
 | |
|         ->setCellValue("H9", "=COUNTIF(H11:H{$row}, TRUE)")
 | |
|         ->setCellValue("E3", "")
 | |
|         ->setCellValue("E4", "")
 | |
|         ->setCellValue("G4", "")
 | |
|         ->setCellValue('C2', $open_cat_1)
 | |
|         ->setCellValue('C3', $open_cat_2)
 | |
|         ->setCellValue('C4', $open_cat_3)
 | |
|         ->setCellValue('C5', $not_a_finding)
 | |
|         ->setCellValue('C6', $not_applicable)
 | |
|         ->setCellValue('C7', $not_reviewed);
 | |
|         
 | |
| } else {
 | |
|     print "Error";
 | |
| }
 | |
| 
 | |
| /**/
 | |
| $writer = new Xlsx($ss);
 | |
| $writer->setPreCalculateFormulas(false);
 | |
| header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
 | |
| header("Content-disposition: attachment; filename='{$chk->get_Name()}-eChecklist.xlsx'");
 | |
| $writer->save("php://output");
 |