public function index()
 {
     if ($this->shouldLockIfNoPermission('data.view')) {
         return;
     }
     $now = time();
     $filterStartDate = 1;
     $filterEndDate = 1;
     if (isset($_GET['start_year']) && isset($_GET['start_month'])) {
         $filterStartDate = strtotime($_GET['start_year'] . '-' . $_GET['start_month'] . '-1');
     }
     if (isset($_GET['end_year']) && isset($_GET['end_month'])) {
         $filterEndDate = strtotime($_GET['end_year'] . '-' . ($_GET['end_month'] + 1) . '-1') - 1;
     }
     if ($filterEndDate <= $filterStartDate) {
         $filterEndDate = $now - $now % self::SECONDS_IN_DAY + self::SECONDS_IN_DAY;
     }
     $searchQuery = '';
     if (isset($_GET['search_query'])) {
         $searchQuery = $_GET['search_query'];
     }
     $customerService = new Customer($this->db);
     $allItems = $customerService->findAllCustomers();
     if ($allItems === false) {
         $this->flash->error('Unable to get customers information!');
         return $this->redirect('/');
     }
     $firstDateOfCustomerCreated = $now;
     $lastDateOfCustomerCreated = 1;
     foreach ($allItems as $key => $item) {
         if ($firstDateOfCustomerCreated > $item['created']) {
             $firstDateOfCustomerCreated = $item['created'];
         }
         if ($lastDateOfCustomerCreated < $item['created']) {
             $lastDateOfCustomerCreated = $item['created'];
         }
     }
     $items = $customerService->searchBetweenDates($searchQuery, $filterStartDate, $filterEndDate);
     if ($items === false) {
         $this->flash->error('Unable to get customers information!');
         return $this->redirect('/');
     }
     $earliestPossibleDate = $now;
     $latestPossibleDate = 1;
     foreach ($items as $key => $item) {
         if ($earliestPossibleDate > $item['created']) {
             $earliestPossibleDate = $item['created'];
         }
         if ($latestPossibleDate < $item['created']) {
             $latestPossibleDate = $item['created'];
         }
     }
     if ($filterStartDate < $firstDateOfCustomerCreated) {
         $filterStartDate = $firstDateOfCustomerCreated;
     }
     if ($filterEndDate > $lastDateOfCustomerCreated) {
         $filterEndDate = $lastDateOfCustomerCreated;
     }
     $sortKey = isset($_GET['sortkey']) ? $_GET['sortkey'] : 'first_name';
     $sortUsingDescending = isset($_GET['sortorder']) && $_GET['sortorder'] === 'desc' || !isset($_GET['sortorder']);
     $alpha = new KeySorter($sortKey);
     if ($sortUsingDescending) {
         $items = $alpha->sortDescending($items);
     } else {
         $items = array_reverse($alpha->sortDescending($items));
     }
     foreach ($items as &$row) {
         $row['created'] = $this->formatNullableDate($row['created']);
     }
     /* Build ranges */
     $ranges = [];
     $startYear = idate('Y', $firstDateOfCustomerCreated);
     $endYear = idate('Y', $lastDateOfCustomerCreated);
     for ($i = $startYear; $i <= $endYear; $i++) {
         $ranges[] = $i;
     }
     $this->set('ranges', $ranges);
     $sortOrder = $sortUsingDescending ? 'desc' : 'asc';
     $nextSortOrder = $sortUsingDescending ? 'asc' : 'desc';
     $this->set('searchQuery', $searchQuery);
     $this->set('startDate', $filterStartDate);
     $this->set('endDate', $filterEndDate);
     $this->set('startMonth', idate('n', $firstDateOfCustomerCreated));
     $this->set('selectedStartYear', idate('Y', $filterStartDate));
     $this->set('endMonth', idate('n', $lastDateOfCustomerCreated));
     $this->set('selectedEndYear', idate('Y', $filterEndDate));
     $this->set('sortOrder', $sortOrder);
     $this->set('nextSortOrder', $nextSortOrder);
     $this->set('sortKey', $sortKey);
     $this->set('items', $items);
     $this->set('months', self::$months);
 }