diff --git a/src/Controller/ReportController.php b/src/Controller/ReportController.php index db379c08..4363e747 100644 --- a/src/Controller/ReportController.php +++ b/src/Controller/ReportController.php @@ -11,6 +11,7 @@ use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; @@ -52,15 +53,38 @@ class ReportController extends BaseController ->getQuery(); - + // run query $jors = $query->getResult(); + // initialize counter + $counter = []; + // get results $res = []; foreach ($jors as $jor) { $jo = $jor->getJobOrder(); $hub = $jor->getHub(); + $hub_id = $hub->getID(); + $hub_name = $hub->getName() . ' - ' . $hub->getBranch(); + + $reason = $jor->getReason(); + + if (!isset($counter[$hub_id])) + $counter[$hub_id] = [ + 'reasons' => [], + 'name' => $hub_name, + ]; + + if (!isset($counter[$hub_id][$reason])) + { + $counter[$hub_id]['reasons'][$reason]['name'] = JORejectionReason::getName($reason); + $counter[$hub_id]['reasons'][$reason]['counter'] = 1; + } + else + { + $counter[$hub_id]['reasons'][$reason]['counter'] += 1; + } $res[] = [ 'jo_id' => $jo->getID(), @@ -73,9 +97,54 @@ class ReportController extends BaseController ]; } + // response + $resp = new StreamedResponse(); + $resp->setCallback(function() use ($counter) { + // csv output + $csv_handle = fopen('php://output', 'w+'); + fputcsv($csv_handle, ['Enrollee', 'Reason', 'Count']); + foreach ($counter as $centry) + { + $first = true; + foreach ($centry['reasons'] as $creason) + { + // first line has hub name + if ($first) + { + fputcsv($csv_handle, [ + $centry['name'], + $creason['name'], + $creason['counter'], + ]); + $first = false; + } + else + { + fputcsv($csv_handle, [ + '', + $creason['name'], + $creason['counter'], + ]); + } + } + } + + fclose($csv_handle); + }); + + $filename = 'reject_' . $date_start->format('Ymd') . '_' . $date_end->format('Ymd') . '.csv'; + + $resp->setStatusCode(200); + $resp->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $resp->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); + + return $resp; + /* return $this->json([ 'result' => $res, + 'counter' => $counter, ]); + */ } }