diff --git a/app/Exports/ZenovaReportExport.php b/app/Exports/ZenovaReportExport.php index d98d0a10..fb2bdbd0 100644 --- a/app/Exports/ZenovaReportExport.php +++ b/app/Exports/ZenovaReportExport.php @@ -123,7 +123,7 @@ class ZenovaReportExport implements FromArray, WithEvents if ($column['type'] === 'text') { $sheet->getStyle($dataRange)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT); } elseif ($column['type'] === 'percent') { - $sheet->getStyle($dataRange)->getNumberFormat()->setFormatCode('0.00"%"'); + $sheet->getStyle($dataRange)->getNumberFormat()->setFormatCode('0.0"%"'); $sheet->getStyle($dataRange)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT); } else { $sheet->getStyle($dataRange)->getNumberFormat()->setFormatCode('#,##0'); @@ -134,9 +134,9 @@ class ZenovaReportExport implements FromArray, WithEvents $col += $span; } - $sheet->getRowDimension(1)->setRowHeight(22); + $sheet->getRowDimension(1)->setRowHeight(36); $sheet->getRowDimension(2)->setRowHeight(36); - $sheet->freezePane('A3'); + $sheet->freezePane('C3'); if (!empty($this->totals)) { $sheet->getStyle('A' . $rowCount . ':' . $lastCol . $rowCount)->applyFromArray([ diff --git a/app/Http/Controllers/ZenovaReportController.php b/app/Http/Controllers/ZenovaReportController.php index 0d5389cc..67d1ea50 100644 --- a/app/Http/Controllers/ZenovaReportController.php +++ b/app/Http/Controllers/ZenovaReportController.php @@ -23,7 +23,7 @@ class ZenovaReportController extends Controller $this->_service = 'reports'; $this->_module = 'zenova_reports'; $this->_viewname = 'zenovareport'; - $this->_title = 'Glipiq & Sitazit Dashboard'; + $this->_title = 'Custom Dashboard'; $this->_base_url = '/zenovareport'; } @@ -35,11 +35,14 @@ class ZenovaReportController extends Controller public function dashboard(Request $request) { $level = $this->level($request); - $built = $this->build($level); + $month = $this->month($request); + $built = $this->build($level, $month); return view('zenovareport.dashboard', [ 'title' => $this->_title, 'level' => $level, + 'month' => $month, + 'months' => $this->months(), 'groups' => $built['groups'], 'body' => $built['body'], 'totals' => $built['totals'], @@ -50,10 +53,11 @@ class ZenovaReportController extends Controller public function export(Request $request) { $level = $this->level($request); - $built = $this->build($level); + $month = $this->month($request); + $built = $this->build($level, $month); if ($built['error']) { - return redirect('/zenovareport/dashboard?level=' . $level)->with('error', $built['error']); + return redirect('/zenovareport/dashboard?level=' . $level . '&month=' . urlencode($month))->with('error', $built['error']); } return Excel::download( @@ -69,24 +73,51 @@ class ZenovaReportController extends Controller return ($level >= 1 && $level <= 5) ? $level : 3; } - private function build(int $level): array + private function months(): array + { + $now = now()->startOfMonth(); + $startYear = $now->month >= 4 ? $now->year : $now->year - 1; + $cursor = now()->setDate($startYear, 4, 1)->startOfMonth(); + $months = []; + while ($cursor->lte($now)) { + $months[$cursor->format('Y-m')] = $cursor->format('F Y'); + $cursor->addMonth(); + } + + return $months; + } + + private function month(Request $request): string + { + $months = $this->months(); + $selected = (string) $request->input('month', ''); + if (isset($months[$selected])) { + return $selected; + } + + return (string) array_key_last($months); + } + + private function build(int $level, string $month): array { $response = LambdaRequest::signedrequest( 'get', 'reports', 'zenova_reports/glipiqsitazit_report', - ['level' => (string) $level], + ['level' => (string) $level, 'month' => $month], 120 ); $rows = []; $error = null; if (!$response || ($response->status ?? '') !== 'success') { - $error = $response->message ?? 'Unable to load the Glipiq & Sitazit report.'; + $error = $response->message ?? 'Unable to load the Custom Dashboard.'; } else { $rows = is_array($response->data ?? null) ? $response->data : []; } + $rows = $this->sortRows($rows); + $groups = $this->groups($rows); $columns = []; foreach ($groups as $group) { @@ -153,6 +184,70 @@ class ZenovaReportController extends Controller ]; } + private function sortRows(array $rows): array + { + usort($rows, function ($left, $right) { + $zoneLeft = $this->zoneName($left); + $zoneRight = $this->zoneName($right); + if ($zoneLeft === '' && $zoneRight !== '') { + return 1; + } + if ($zoneRight === '' && $zoneLeft !== '') { + return -1; + } + $zone = strcasecmp($zoneLeft, $zoneRight); + if ($zone !== 0) { + return $zone; + } + $users = $this->fsoCount($right) <=> $this->fsoCount($left); + if ($users !== 0) { + return $users; + } + + return strcasecmp($this->rowName($left), $this->rowName($right)); + }); + + return $rows; + } + + private function zoneName($row): string + { + $parents = (array) ($row->parent_positions ?? []); + foreach ($parents as $key => $value) { + if (strcasecmp((string) $key, 'Zone') === 0 && $value !== null && $value !== '') { + return (string) $value; + } + } + + $demo = (array) ($row->{'Demography & Details'} ?? []); + foreach ($demo as $key => $value) { + if (strcasecmp((string) $key, 'Name of Zone') === 0 && $value !== null && $value !== '') { + return (string) $value; + } + } + + return ''; + } + + private function fsoCount($row): float + { + $value = $row->{'Demography & Details'}->{'No. of FSOs'} ?? 0; + + return is_numeric($value) ? (float) $value : 0; + } + + private function rowName($row): string + { + $demo = (array) ($row->{'Demography & Details'} ?? []); + foreach ($demo as $key => $value) { + if (strpos((string) $key, 'Name of ') === 0) { + return (string) $value; + } + } + + return (string) ($row->position_name ?? ''); + } + private function groups(array $rows): array { $nameKey = 'Name of Region'; @@ -197,7 +292,7 @@ class ZenovaReportController extends Controller ]; $groups = [ - ['label' => 'Demography & Details', 'tone' => 'demo', 'columns' => $demoColumns], + ['label' => 'Demography & Details (Data as per Yesterday)', 'tone' => 'demo', 'columns' => $demoColumns], ]; $first = isset($rows[0]) ? $rows[0] : null; @@ -247,10 +342,13 @@ class ZenovaReportController extends Controller if (strcasecmp($currentType, $type) === 0) { $column = $this->column($type, 'Demography & Details', $nameKey, 'text'); $column['is_total'] = true; - $columns[] = $column; - continue; + } else { + $column = $this->column($type, 'parent_positions', $type, 'text'); } - $columns[] = $this->column($type, 'parent_positions', $type, 'text'); + if (in_array($type, ['Zone', 'Region'], true)) { + $column['sticky'] = strtolower($type); + } + $columns[] = $column; } return $columns; @@ -337,7 +435,7 @@ class ZenovaReportController extends Controller } $number = (float) $value; if ($type === 'percent') { - return number_format($number, 2) . '%'; + return number_format($number, 1) . '%'; } if (floor($number) == $number) { return number_format($number, 0); diff --git a/resources/views/auth/loginotp.blade.php b/resources/views/auth/loginotp.blade.php index b2857ada..29624f26 100644 --- a/resources/views/auth/loginotp.blade.php +++ b/resources/views/auth/loginotp.blade.php @@ -101,14 +101,17 @@ @endif