current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0; $this->current_user_id = $_SESSION[self::USER_ID] ?? ""; $this->current_user_name = $_SESSION[self::USER_NAME] ?? ""; $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? ""; $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1; } // ============================ // Search Recreational Licenses // ============================ public function searchRecreationalLicenses() { $step = filter_input(INPUT_POST, "step") ?: "prompt"; $popovers = (new Popovers())->getPopovers(); $dropdowns = (new Dropdowns())->getDropdowns(); $constants = $this->getConstants(); $cities = (new Cities())->getCities(); $XML = $this->mergeXML($popovers, ""); $XML = $this->mergeXML($dropdowns, $XML); $XML = $this->mergeXML($constants, $XML); $XML = $this->mergeXML($cities, $XML); switch ($step) { case "prompt": $this->displayContent($this->applyXSL($XML, $this->getXSL("searchRecreationalLicenses"))); break; case "search": $licenses = $this->getRecreationalLicensesPage(); $XML = $this->mergeXML($licenses, $XML); $this->displayContent($this->applyXSL($XML, $this->getXSL("searchRecreationalLicenses"))); break; } } // ========================== // Search Commercial Licenses // ========================== public function searchCommercialLicenses() { $step = filter_input(INPUT_POST, "step") ?: "prompt"; $popovers = (new Popovers())->getPopovers(); $dropdowns = (new Dropdowns())->getDropdowns(); $constants = $this->getConstants(); $cities = (new Cities())->getCities(); $licensescodes = $this->getCommercialLicenseCodes(); $XML = $this->mergeXML($popovers, ""); $XML = $this->mergeXML($dropdowns, $XML); $XML = $this->mergeXML($constants, $XML); $XML = $this->mergeXML($cities, $XML); $XML = $this->mergeXML($licensescodes, $XML); switch ($step) { case "prompt": $this->displayContent($this->applyXSL($XML, $this->getXSL("searchCommercialLicenses"))); break; case "search": $licenses = $this->getRecreationalLicensesPage(); $XML = $this->mergeXML($licenses, $XML); $this->displayContent($this->applyXSL($XML, $this->getXSL("searchCommercialLicenses"))); break; } } // =============== // License Summary // =============== public function licenseSummary() { $license_serial = filter_input(INPUT_POST, "license_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0; $license = $this->getLicense($license_serial); if ($license->count() == 0) { $this->logError("Invalid License ({$license_serial}). " . __METHOD__); } $XML = $this->mergeXML($license, ""); $content = $this->applyXSL($XML, $this->getXSL("licenseSummary")); $this->displayContent($content); } // ========================================== // Return AutoComplete License Numbers (ajax) // ========================================== public function getAutoCompleteLicenseNumbers() { $results = array(); $licensenumber = filter_input(INPUT_GET, "commercial_license_number") ?: ""; $licensenumber = trim(preg_replace("/\s+/", " ", $licensenumber)); $licensenumber = preg_replace("/'+/", "'", $licensenumber); $licensenumber = preg_replace('/"+/', '"', $licensenumber); $licensenumber = str_replace("'", "''", $licensenumber); $SQL = "select distinct commercial_license_number from view_fwc_commercial_licenses where commercial_license_number like '%{$licensenumber}%' order by commercial_license_number limit 10 offset 0"; $matches = $this->getTable("licensenumbers", $SQL); foreach ($matches as $match) { $results[] = (string) $match->commercial_license_number; } header('Content-Type: application/json'); echo json_encode($results); exit(); } // ============================= // Determine if a License exists // ============================= public function licenseExists() { $license_serial = filter_input(INPUT_POST, "license_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0; $license_name = filter_input(INPUT_POST, "license_name") ?: ""; $SQL = "select license_serial from view_licenses where license_serial != :license_serial and lower(license_name) = :license_name"; $statement = $this->connect()->prepare($SQL); $statement->bindValue(":license_serial", $license_serial); $statement->bindValue(":license_name", strtolower($license_name)); $statement->execute(); $recordset = $statement->fetchAll(PDO::FETCH_ASSOC); $exists = (count($recordset) > 0) ? true : false; echo json_encode($exists); } // ============================ // Return a License Type Object // ============================ public function getCommercialLicenseCodes() { $SQL = "select fwc_commercial_license_codes.* from fwc_commercial_license_codes"; return $this->getTable("licensecodes", $SQL); } // ============================ // Return a License Type Object // ============================ public function getLicenseTypes() { $SQL = "select distinct license_type from fwc_recreational_licenses where license_type != ''"; return $this->getTable("licensetypes", $SQL); } // ======================== // Return an License Object // ======================== public function getLicense($license_serial = 0) { $SQL = "select view_licenses.* from view_licenses where license_serial = {$license_serial}"; return $this->getTable("licenses", $SQL); } // ======================== // Return a Licenses Object // ======================== public function getLicenses() { $SQL = "select view_licenses.* from view_licenses"; return $this->getTable("licenses", $SQL); } // ========================================== // Return a Recreational Licenses Page Object // ========================================== public function getRecreationalLicensesPage() { // =============== // Sanitize Inputs // =============== $license_last_name = trim(filter_input(INPUT_POST, "license_last_name") ?: ""); $license_first_name = trim(filter_input(INPUT_POST, "license_first_name") ?: ""); $license_counties = $this->getMultiSelectInput("license_county"); $license_cities = $this->getMultiSelectInput("license_city"); $license_types = $this->getMultiSelectInput("license_type"); $license_genders = $this->getMultiSelectInput("license_gender"); $license_ethnicities = $this->getMultiSelectInput("license_ethnicity"); $license_start_date = trim(filter_input(INPUT_POST, "license_start_date") ?: ""); $license_expire_date = trim(filter_input(INPUT_POST, "license_expire_date") ?: ""); $pagination = trim(filter_input(INPUT_POST, "pagination") ?: ""); $license_start_date = empty($license_start_date) ? null : date("Y-m-d", strtotime($license_start_date)); $license_expire_date = empty($license_expire_date) ? null : date("Y-m-d", strtotime($license_expire_date)); // =================== // Pagination Settings // =================== $this->pagination_page = isset($_SESSION[self::PAGINATION_PAGE]) ? (int) $_SESSION[self::PAGINATION_PAGE] : 1; $this->pagination_size = (int) (filter_input(INPUT_POST, "licenses_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size); if ($this->pagination_size <= 0) { $this->pagination_size = 25; } $licenses_order_by = trim(filter_input(INPUT_POST, "licenses_order_by") ?: "license_last_name"); $licenses_order_direction = strtoupper(trim(filter_input(INPUT_POST, "licenses_order_direction") ?: "ASC")); $allowed_order_columns = [ "license_last_name", "license_first_name", "license_county", "license_city", "license_type", "license_gender", "license_ethnicity", "license_start_date", "license_expire_date" ]; if (!in_array($licenses_order_by, $allowed_order_columns, true)) { $licenses_order_by = "license_last_name"; } if (!in_array($licenses_order_direction, ["ASC", "DESC"], true)) { $licenses_order_direction = "ASC"; } // =================== // Connect to Database // =================== $connection = $this->connect(); $license_counties = $this->getDropdownValuesBySerial($connection, $license_counties); $license_types = $this->getDropdownValuesBySerial($connection, $license_types); $license_ethnicities = $this->getDropdownValuesBySerial($connection, $license_ethnicities); // ================== // Build WHERE Clause // ================== $where = []; $params = []; if (!empty($license_last_name)) { $where[] = "fwc_recreational_licenses.license_last_name LIKE :license_last_name"; $params[":license_last_name"] = $license_last_name . "%"; } if (!empty($license_first_name)) { $where[] = "fwc_recreational_licenses.license_first_name LIKE :license_first_name"; $params[":license_first_name"] = $license_first_name . "%"; } $this->addInFilter($where, $params, "fwc_recreational_licenses.license_county", "license_county", $license_counties); $this->addInFilter($where, $params, "fwc_recreational_licenses.license_city", "license_city", $license_cities); $this->addInFilter($where, $params, "fwc_recreational_licenses.license_type", "license_type", $license_types); $this->addInFilter($where, $params, "fwc_recreational_licenses.license_gender", "license_gender", $license_genders); $this->addInFilter($where, $params, "fwc_recreational_licenses.license_ethnicity", "license_ethnicity", $license_ethnicities); if (!empty($license_start_date) && !empty($license_expire_date)) { $where[] = "fwc_recreational_licenses.license_start_date BETWEEN :license_start_date AND :license_expire_date"; $params[":license_start_date"] = $license_start_date; $params[":license_expire_date"] = $license_expire_date; } $whereSQL = ""; if (!empty($where)) { $whereSQL = " WHERE " . implode(" AND ", $where); } // =========== // Count Query // =========== $SQL = "SELECT COUNT(*) AS totalcount FROM fwc_recreational_licenses {$whereSQL}"; $statement = $connection->prepare($SQL); foreach ($params as $key => $value) { $statement->bindValue($key, $value, PDO::PARAM_STR); } $statement->execute(); $recordset = $statement->fetch(PDO::FETCH_ASSOC); $count = $recordset ? (int) $recordset["totalcount"] : 0; // ================= // Pagination Logic // ================= $totalPages = max(1, (int) ceil($count / $this->pagination_size)); switch ($pagination) { case "first": $this->pagination_page = 1; break; case "previous": $this->pagination_page = max($this->pagination_page - 1, 1); break; case "next": $this->pagination_page = min($this->pagination_page + 1, $totalPages); break; case "last": $this->pagination_page = $totalPages; break; default: $this->pagination_page = min(max($this->pagination_page, 1), $totalPages); break; } $offset = max(0, ($this->pagination_page - 1) * $this->pagination_size); $start = ($count > 0) ? $offset + 1 : 0; $end = min($count, $offset + $this->pagination_size); // ========== // Data Query // ========== $SQL = " SELECT fwc_recreational_licenses.license_serial, fwc_recreational_licenses.license_last_name, fwc_recreational_licenses.license_first_name, fwc_recreational_licenses.license_county, fwc_recreational_licenses.license_city, fwc_recreational_licenses.license_type, fwc_recreational_licenses.license_gender, fwc_recreational_licenses.license_ethnicity, DATE_FORMAT(fwc_recreational_licenses.license_start_date, '%c/%e/%Y') AS license_start_date_verbose, DATE_FORMAT(fwc_recreational_licenses.license_expire_date, '%c/%e/%Y') AS license_expire_date_verbose FROM fwc_recreational_licenses {$whereSQL} ORDER BY fwc_recreational_licenses.{$licenses_order_by} {$licenses_order_direction} LIMIT :limit OFFSET :offset"; $statement = $connection->prepare($SQL); foreach ($params as $key => $value) { $statement->bindValue($key, $value, PDO::PARAM_STR); } $statement->bindValue(":limit", (int) $this->pagination_size, PDO::PARAM_INT); $statement->bindValue(":offset", (int) $offset, PDO::PARAM_INT); $statement->execute(); $licenses = $this->getTableXML("licenses", $statement); // ============================ // Insert Pagination Attributes // ============================ $licenses->addAttribute("count", $count); $licenses->addAttribute("start", $start); $licenses->addAttribute("end", $end); $licenses->addAttribute("page", $this->pagination_page); $licenses->addAttribute("pages", $totalPages); $licenses->addAttribute("limit", $this->pagination_size); $licenses->addAttribute("type", "recreational"); $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page; return $licenses; } // ======================================== // Return a Commercial Licenses Page Object // ======================================== public function getCommercialLicensesPage() { // =============== // Sanitize Inputs // =============== $commercial_license_company_or_last_name = trim(filter_input(INPUT_POST, "commercial_license_company_or_last_name") ?: ""); $license_codes = $this->getMultiSelectInput("license_code"); $commercial_license_number = trim(filter_input(INPUT_POST, "commercial_license_number") ?: ""); $license_counties = $this->getMultiSelectInput("license_county"); $commercial_license_total_tag_qty_from = filter_input(INPUT_POST, "commercial_license_total_tag_qty_from", FILTER_SANITIZE_NUMBER_INT); $commercial_license_total_tag_qty_to = filter_input(INPUT_POST, "commercial_license_total_tag_qty_to", FILTER_SANITIZE_NUMBER_INT); $commercial_license_begin_date_from = trim(filter_input(INPUT_POST, "commercial_license_begin_date_from") ?: ""); $commercial_license_begin_date_to = trim(filter_input(INPUT_POST, "commercial_license_begin_date_to") ?: ""); $commercial_license_expire_date_from = trim(filter_input(INPUT_POST, "commercial_license_expire_date_from") ?: ""); $commercial_license_expire_date_to = trim(filter_input(INPUT_POST, "commercial_license_expire_date_to") ?: ""); $pagination = trim(filter_input(INPUT_POST, "pagination") ?: ""); $commercial_license_total_tag_qty_from = ($commercial_license_total_tag_qty_from === null || $commercial_license_total_tag_qty_from === "") ? null : (int) $commercial_license_total_tag_qty_from; $commercial_license_total_tag_qty_to = ($commercial_license_total_tag_qty_to === null || $commercial_license_total_tag_qty_to === "") ? null : (int) $commercial_license_total_tag_qty_to; $commercial_license_begin_date_from = empty($commercial_license_begin_date_from) ? null : date("Y-m-d", strtotime($commercial_license_begin_date_from)); $commercial_license_begin_date_to = empty($commercial_license_begin_date_to) ? null : date("Y-m-d", strtotime($commercial_license_begin_date_to)); $commercial_license_expire_date_from = empty($commercial_license_expire_date_from) ? null : date("Y-m-d", strtotime($commercial_license_expire_date_from)); $commercial_license_expire_date_to = empty($commercial_license_expire_date_to) ? null : date("Y-m-d", strtotime($commercial_license_expire_date_to)); // =================== // Pagination Settings // =================== $this->pagination_page = isset($_SESSION[self::PAGINATION_PAGE]) ? (int) $_SESSION[self::PAGINATION_PAGE] : 1; $this->pagination_size = (int) (filter_input(INPUT_POST, "licenses_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size); if ($this->pagination_size <= 0) { $this->pagination_size = 25; } $licenses_order_by = trim(filter_input(INPUT_POST, "licenses_order_by") ?: "license_last_name"); $licenses_order_direction = strtoupper(trim(filter_input(INPUT_POST, "licenses_order_direction") ?: "ASC")); $allowed_order_columns = [ "license_last_name" => "commercial_license_company_or_last_name", "license_county" => "commercial_license_county", "license_type" => "commercial_license_code", "commercial_license_number" => "commercial_license_number", "commercial_license_total_tag_qty" => "commercial_license_total_tag_qty", "license_start_date" => "commercial_license_begin_date", "license_expire_date" => "commercial_license_expire_date" ]; if (!array_key_exists($licenses_order_by, $allowed_order_columns)) { $licenses_order_by = "license_last_name"; } if (!in_array($licenses_order_direction, ["ASC", "DESC"], true)) { $licenses_order_direction = "ASC"; } $licenses_order_column = $allowed_order_columns[$licenses_order_by]; // =================== // Connect to Database // =================== $connection = $this->connect(); $license_counties = $this->getDropdownValuesBySerial($connection, $license_counties); // ================== // Build WHERE Clause // ================== $where = []; $params = []; if (!empty($commercial_license_company_or_last_name)) { $where[] = "fwc_commercial_licenses.commercial_license_company_or_last_name LIKE :commercial_license_company_or_last_name"; $params[":commercial_license_company_or_last_name"] = $commercial_license_company_or_last_name . "%"; } if (!empty($commercial_license_number)) { $where[] = "fwc_commercial_licenses.commercial_license_number LIKE :commercial_license_number"; $params[":commercial_license_number"] = "%" . $commercial_license_number . "%"; } $this->addInFilter($where, $params, "fwc_commercial_licenses.commercial_license_code", "license_code", $license_codes); $this->addInFilter($where, $params, "fwc_commercial_licenses.commercial_license_county", "license_county", $license_counties); if ($commercial_license_total_tag_qty_from !== null) { $where[] = "fwc_commercial_licenses.commercial_license_total_tag_qty >= :commercial_license_total_tag_qty_from"; $params[":commercial_license_total_tag_qty_from"] = $commercial_license_total_tag_qty_from; } if ($commercial_license_total_tag_qty_to !== null) { $where[] = "fwc_commercial_licenses.commercial_license_total_tag_qty <= :commercial_license_total_tag_qty_to"; $params[":commercial_license_total_tag_qty_to"] = $commercial_license_total_tag_qty_to; } if (!empty($commercial_license_begin_date_from)) { $where[] = "fwc_commercial_licenses.commercial_license_begin_date >= :commercial_license_begin_date_from"; $params[":commercial_license_begin_date_from"] = $commercial_license_begin_date_from; } if (!empty($commercial_license_begin_date_to)) { $where[] = "fwc_commercial_licenses.commercial_license_begin_date <= :commercial_license_begin_date_to"; $params[":commercial_license_begin_date_to"] = $commercial_license_begin_date_to; } if (!empty($commercial_license_expire_date_from)) { $where[] = "fwc_commercial_licenses.commercial_license_expire_date >= :commercial_license_expire_date_from"; $params[":commercial_license_expire_date_from"] = $commercial_license_expire_date_from; } if (!empty($commercial_license_expire_date_to)) { $where[] = "fwc_commercial_licenses.commercial_license_expire_date <= :commercial_license_expire_date_to"; $params[":commercial_license_expire_date_to"] = $commercial_license_expire_date_to; } $whereSQL = ""; if (!empty($where)) { $whereSQL = " WHERE " . implode(" AND ", $where); } // =========== // Count Query // =========== $SQL = "SELECT COUNT(*) AS totalcount FROM fwc_commercial_licenses {$whereSQL}"; $statement = $connection->prepare($SQL); foreach ($params as $key => $value) { $statement->bindValue($key, $value, is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR); } $statement->execute(); $recordset = $statement->fetch(PDO::FETCH_ASSOC); $count = $recordset ? (int) $recordset["totalcount"] : 0; // ================= // Pagination Logic // ================= $totalPages = max(1, (int) ceil($count / $this->pagination_size)); switch ($pagination) { case "first": $this->pagination_page = 1; break; case "previous": $this->pagination_page = max($this->pagination_page - 1, 1); break; case "next": $this->pagination_page = min($this->pagination_page + 1, $totalPages); break; case "last": $this->pagination_page = $totalPages; break; default: $this->pagination_page = min(max($this->pagination_page, 1), $totalPages); break; } $offset = max(0, ($this->pagination_page - 1) * $this->pagination_size); $start = ($count > 0) ? $offset + 1 : 0; $end = min($count, $offset + $this->pagination_size); // ========== // Data Query // ========== $SQL = " SELECT fwc_commercial_licenses.commercial_license_serial AS license_serial, '' AS license_first_name, fwc_commercial_licenses.commercial_license_company_or_last_name AS license_last_name, fwc_commercial_licenses.commercial_license_county AS license_county, '' AS license_city, fwc_commercial_licenses.commercial_license_code AS license_type, '' AS license_gender, '' AS license_ethnicity, DATE_FORMAT(fwc_commercial_licenses.commercial_license_begin_date, '%c/%e/%Y') AS license_start_date_verbose, DATE_FORMAT(fwc_commercial_licenses.commercial_license_expire_date, '%c/%e/%Y') AS license_expire_date_verbose, fwc_commercial_licenses.commercial_license_number, fwc_commercial_licenses.commercial_license_total_tag_qty FROM fwc_commercial_licenses {$whereSQL} ORDER BY fwc_commercial_licenses.{$licenses_order_column} {$licenses_order_direction} LIMIT :limit OFFSET :offset"; $statement = $connection->prepare($SQL); foreach ($params as $key => $value) { $statement->bindValue($key, $value, is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR); } $statement->bindValue(":limit", (int) $this->pagination_size, PDO::PARAM_INT); $statement->bindValue(":offset", (int) $offset, PDO::PARAM_INT); $statement->execute(); $licenses = $this->getTableXML("licenses", $statement); // ============================ // Insert Pagination Attributes // ============================ $licenses->addAttribute("count", $count); $licenses->addAttribute("start", $start); $licenses->addAttribute("end", $end); $licenses->addAttribute("page", $this->pagination_page); $licenses->addAttribute("pages", $totalPages); $licenses->addAttribute("limit", $this->pagination_size); $licenses->addAttribute("type", "commercial"); $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page; return $licenses; } // =============== // Search Licenses // =============== private function getMultiSelectInput($name) { $value = $_POST[$name] ?? null; if ($value === null) { return null; } if (!is_array($value)) { $value = explode(",", $value); } $value = array_values(array_filter(array_map("trim", $value), function ($item) { return $item !== ""; })); return empty($value) ? null : $value; } private function getDropdownValuesBySerial($connection, $serials) { if (empty($serials)) { return []; } $serials = array_values(array_filter(array_map("intval", $serials), function ($serial) { return $serial > 0; })); if (empty($serials)) { return []; } $placeholders = []; $params = []; foreach ($serials as $index => $serial) { $placeholder = ":dropdown_serial_{$index}"; $placeholders[] = $placeholder; $params[$placeholder] = $serial; } $SQL = "select dropdown_value from dropdowns where dropdown_serial in (" . implode(", ", $placeholders) . ")"; $statement = $connection->prepare($SQL); foreach ($params as $key => $value) { $statement->bindValue($key, $value, PDO::PARAM_INT); } $statement->execute(); $values = $statement->fetchAll(PDO::FETCH_COLUMN); return empty($values) ? ["__NO_MATCHING_DROPDOWN_VALUE__"] : $values; } private function addInFilter(&$where, &$params, $column, $name, $values) { if (empty($values)) { return; } $placeholders = []; foreach ($values as $index => $value) { $placeholder = ":{$name}_{$index}"; $placeholders[] = $placeholder; $params[$placeholder] = $value; } $where[] = "{$column} IN (" . implode(", ", $placeholders) . ")"; } // ======================== // Return a Licenses Object // ======================== public function getSelectedLicenses($licenses = array()) { if (empty($licenses)) { return; } $SQL = "select fwc_recreational_licenses.* from fwc_recreational_licenses where license_serial in ({$licenses})"; return $this->getTable("licenses", $SQL); } } ?>