Modified all points Allan sent via email on 04-05-2026

This commit is contained in:
James Richie
2026-04-08 20:09:13 -04:00
parent da832f82fc
commit cb9e1a9fa1
11 changed files with 422 additions and 480 deletions
+1 -3
View File
@@ -62,11 +62,9 @@ class PermitsByBuilder extends Base {
$XML = $this->mergeXML($permits, "<XML/>");
$XML = $this->mergeXML($subscription, $XML);
$XML = $this->mergeXML($searchhistory, $XML);
$XML = $this->mergeXML($popovers, $XML);
// echo $XML;
// die();
$content = $this->applyXSL($XML, $this->getXSL("searchPermitsByBuilder"));
$this->displayContent($content);
}
+160 -148
View File
@@ -46,14 +46,26 @@ class PermitsBySubdivision extends Base {
$permit_area = $subscription->record->subscription_area;
$projecttype = $subscription->record->subscription_projecttype;
$searchhistory = (new SearchHistory())->getUsersPreviousSearchParameters($this->current_user_serial, $subscription_serial);
// Update Search History Record
if (empty($searchhistory)) {
(new SearchHistory())->saveUserSearchParameters($_POST);
} else {
(new SearchHistory())->updateUserSearchParameters($_POST);
}
$permits = $this->getPermits($permit_area, $projecttype);
$searchhistory = (new SearchHistory())->getUsersPreviousSearchParameters($this->current_user_serial, $subscription_serial);
$counties = (new Counties())->getCountiesByArea($permit_area);
$popovers = (new Popovers())->getPopovers();
$XML = $this->mergeXML($permits, "<XML/>");
$XML = $this->mergeXML($counties, $XML);
$XML = $this->mergeXML($subscription, $XML);
$XML = $this->mergeXML($searchhistory, $XML);
$XML = $this->mergeXML($popovers, $XML);
$content = $this->applyXSL($XML, $this->getXSL("searchPermitsBySubdivision"));
@@ -62,47 +74,47 @@ class PermitsBySubdivision extends Base {
public function getPermits($permit_area, $projecttype) {
$rdi_county_raw = trim(filter_input(INPUT_POST, "rdi_county") ?: "");
$rdi_and_or = trim(filter_input(INPUT_POST, "rdi_and_or") ?: "OR");
$rdi_company = trim(filter_input(INPUT_POST, "rdi_company") ?: "");
$rdi_sub_div_name = trim(filter_input(INPUT_POST, "rdi_sub_div_name") ?: "");
$rdi_project_city = trim(filter_input(INPUT_POST, "rdi_project_city") ?: "");
$rdi_project_addr = trim(filter_input(INPUT_POST, "rdi_project_addr") ?: "");
$permit_county_raw = trim(filter_input(INPUT_POST, "permit_county") ?: "");
$permit_and_or = trim(filter_input(INPUT_POST, "permit_and_or") ?: "OR");
$permit_company = trim(filter_input(INPUT_POST, "permit_company") ?: "");
$permit_sub_div_name = trim(filter_input(INPUT_POST, "permit_sub_div_name") ?: "");
$permit_project_city = trim(filter_input(INPUT_POST, "permit_project_city") ?: "");
$permit_project_addr = trim(filter_input(INPUT_POST, "permit_project_addr") ?: "");
$rdi_entry_start_date = filter_input(INPUT_POST, "rdi_entry_start_date") ?: "";
$rdi_entry_end_date = filter_input(INPUT_POST, "rdi_entry_end_date") ?: "";
$rdi_permit_start_date = filter_input(INPUT_POST, "rdi_permit_start_date") ?: "";
$rdi_permit_end_date = filter_input(INPUT_POST, "rdi_permit_end_date") ?: "";
$permit_entry_start_date = filter_input(INPUT_POST, "permit_entry_start_date") ?: "";
$permit_entry_end_date = filter_input(INPUT_POST, "permit_entry_end_date") ?: "";
$permit_permit_start_date = filter_input(INPUT_POST, "permit_permit_start_date") ?: "";
$permit_permit_end_date = filter_input(INPUT_POST, "permit_permit_end_date") ?: "";
$pagination = filter_input(INPUT_POST, "pagination") ?: "";
// Normalize dates to Y-m-d or null
$rdi_entry_start_date = ($rdi_entry_start_date === "") ? null : date("Y-m-d", strtotime($rdi_entry_start_date));
$rdi_entry_end_date = ($rdi_entry_end_date === "") ? null : date("Y-m-d", strtotime($rdi_entry_end_date));
$rdi_permit_start_date = ($rdi_permit_start_date === "") ? null : date("Y-m-d", strtotime($rdi_permit_start_date));
$rdi_permit_end_date = ($rdi_permit_end_date === "") ? null : date("Y-m-d", strtotime($rdi_permit_end_date));
$permit_entry_start_date = ($permit_entry_start_date === "") ? null : date("Y-m-d", strtotime($permit_entry_start_date));
$permit_entry_end_date = ($permit_entry_end_date === "") ? null : date("Y-m-d", strtotime($permit_entry_end_date));
$permit_permit_start_date = ($permit_permit_start_date === "") ? null : date("Y-m-d", strtotime($permit_permit_start_date));
$permit_permit_end_date = ($permit_permit_end_date === "") ? null : date("Y-m-d", strtotime($permit_permit_end_date));
// Validate AND/OR
if (!in_array(strtoupper($rdi_and_or), ["AND", "OR"], true)) {
$rdi_and_or = "OR";
if (!in_array(strtoupper($permit_and_or), ["AND", "OR"], true)) {
$permit_and_or = "OR";
}
// Pagination / ordering
$this->pagination_size = filter_input(INPUT_POST, "rdis_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
$rdis_order_by = filter_input(INPUT_POST, "rdis_order_by") ?: "rdi_permit_number";
$rdis_order_direction = filter_input(INPUT_POST, "rdis_order_direction" ?? "DESC");
$this->pagination_size = filter_input(INPUT_POST, "permits_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
$permits_order_by = filter_input(INPUT_POST, "permits_order_by") ?: "permit_permit_number";
$permits_order_direction = filter_input(INPUT_POST, "permits_order_direction" ?? "DESC");
$allowed_order_columns = [
"rdi_permit_number",
"rdi_county", "rdi_sub_div_name", "rdi_project_addr", "rdi_city",
"rdi_state", "rdi_zip", "rdi_company", "rdi_permit_date", "rdi_size", "rdi_value"
"permit_permit_number",
"permit_county", "permit_sub_div_name", "permit_project_addr", "permit_city",
"permit_state", "permit_zip", "permit_company", "permit_permit_date", "permit_size", "permit_value"
];
if (!in_array($rdis_order_by, $allowed_order_columns, true)) {
$rdis_order_by = "rdi_sub_div_name";
if (!in_array($permits_order_by, $allowed_order_columns, true)) {
$permits_order_by = "permit_sub_div_name";
}
if (!in_array(strtoupper((string) $rdis_order_direction), ["ASC", "DESC"], true)) {
$rdis_order_direction = "DESC";
if (!in_array(strtoupper((string) $permits_order_direction), ["ASC", "DESC"], true)) {
$permits_order_direction = "DESC";
}
// Database Connection
@@ -113,7 +125,7 @@ class PermitsBySubdivision extends Base {
$countyIds = array_values(array_filter(
array_map(
fn($v) => ctype_digit(trim($v)) ? (int) trim($v) : null,
explode(",", $rdi_county_raw)
explode(",", $permit_county_raw)
),
fn($v) => $v !== null
));
@@ -125,8 +137,8 @@ class PermitsBySubdivision extends Base {
if (!empty($countyIds)) {
if (count($countyIds) === 1) {
$countyClauseCount = " and rdi_county = :county_0";
$countyClauseData = " and view_rdis.rdi_county = :county_0";
$countyClauseCount = " and permit_county = :county_0";
$countyClauseData = " and view_permits.permit_county = :county_0";
$countyParams[':county_0'] = $countyIds[0];
} else {
$ph = [];
@@ -136,12 +148,12 @@ class PermitsBySubdivision extends Base {
$countyParams[$k] = $id;
}
$in = implode(",", $ph);
$countyClauseCount = " and rdi_county in ($in)";
$countyClauseData = " and view_rdis.rdi_county in ($in)";
$countyClauseCount = " and permit_county in ($in)";
$countyClauseData = " and view_permits.permit_county in ($in)";
}
} elseif ($permit_area != "All") {
$countyClauseCount = " and rdi_county in (select county_serial from view_counties where county_area = :permit_area)";
$countyClauseData = " and view_rdis.rdi_county in (select county_serial from view_counties where county_area = :permit_area)";
$countyClauseCount = " and permit_county in (select county_serial from view_counties where county_area = :permit_area)";
$countyClauseData = " and view_permits.permit_county in (select county_serial from view_counties where county_area = :permit_area)";
$bindArea = true;
} else {
// No county/area filter -> omit entirely to keep the plan simple
@@ -151,47 +163,47 @@ class PermitsBySubdivision extends Base {
// ===================== COUNT QUERY =====================
$SQL = "select count(*) as count
from view_rdis
where rdi_project_type = :rdi_project_type
from view_permits
where permit_project_type = :permit_project_type
$countyClauseCount ";
if (!empty($rdi_company)) {
$SQL .= " and rdi_company like :rdi_company";
if (!empty($permit_company)) {
$SQL .= " and permit_company like :permit_company";
}
if (!empty($rdi_sub_div_name)) {
$SQL .= " and rdi_sub_div_name like :rdi_sub_div_name";
if (!empty($permit_sub_div_name)) {
$SQL .= " and permit_sub_div_name like :permit_sub_div_name";
}
if (!empty($rdi_project_city)) {
$SQL .= " and rdi_project_city like :rdi_project_city";
if (!empty($permit_project_city)) {
$SQL .= " and permit_project_city like :permit_project_city";
}
if (!empty($rdi_project_addr)) {
$SQL .= " and rdi_project_addr like :rdi_project_addr";
if (!empty($permit_project_addr)) {
$SQL .= " and permit_project_addr like :permit_project_addr";
}
// group date conditions so $rdi_and_or applies between themcx
// group date conditions so $permit_and_or applies between themcx
$dateConds = [];
if ($rdi_entry_start_date && $rdi_entry_end_date) {
$dateConds[] = "(rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
} elseif ($rdi_entry_start_date) {
$dateConds[] = "(rdi_entry_date >= :rdi_entry_start_date)";
if ($permit_entry_start_date && $permit_entry_end_date) {
$dateConds[] = "(permit_entry_date between :permit_entry_start_date and :permit_entry_end_date)";
} elseif ($permit_entry_start_date) {
$dateConds[] = "(permit_entry_date >= :permit_entry_start_date)";
}
if ($rdi_permit_start_date && $rdi_permit_end_date) {
$dateConds[] = "(rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
} elseif ($rdi_permit_start_date) {
$dateConds[] = "(rdi_permit_date >= :rdi_permit_start_date)";
if ($permit_permit_start_date && $permit_permit_end_date) {
$dateConds[] = "(permit_permit_date between :permit_permit_start_date and :permit_permit_end_date)";
} elseif ($permit_permit_start_date) {
$dateConds[] = "(permit_permit_date >= :permit_permit_start_date)";
}
if ($dateConds) {
$SQL .= " and (" . implode(" $rdi_and_or ", $dateConds) . ")";
$SQL .= " and (" . implode(" $permit_and_or ", $dateConds) . ")";
}
$statement = $connection->prepare($SQL);
$statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_project_type", $projecttype, PDO::PARAM_STR);
foreach ($countyParams as $k => $v) {
$statement->bindValue($k, $v, PDO::PARAM_INT);
@@ -200,29 +212,29 @@ class PermitsBySubdivision extends Base {
if ($bindArea) {
$statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
}
if (!empty($rdi_company)) {
$statement->bindValue(":rdi_company", '%' . $rdi_company . '%', PDO::PARAM_STR);
if (!empty($permit_company)) {
$statement->bindValue(":permit_company", '%' . $permit_company . '%', PDO::PARAM_STR);
}
if (!empty($rdi_sub_div_name)) {
$statement->bindValue(":rdi_sub_div_name", '%' . $rdi_sub_div_name . '%', PDO::PARAM_STR);
if (!empty($permit_sub_div_name)) {
$statement->bindValue(":permit_sub_div_name", '%' . $permit_sub_div_name . '%', PDO::PARAM_STR);
}
if (!empty($rdi_project_city)) {
$statement->bindValue(":rdi_project_city", '%' . $rdi_project_city . '%', PDO::PARAM_STR);
if (!empty($permit_project_city)) {
$statement->bindValue(":permit_project_city", '%' . $permit_project_city . '%', PDO::PARAM_STR);
}
if (!empty($rdi_project_addr)) {
$statement->bindValue(":rdi_project_addr", '%' . $rdi_project_addr . '%', PDO::PARAM_STR);
if (!empty($permit_project_addr)) {
$statement->bindValue(":permit_project_addr", '%' . $permit_project_addr . '%', PDO::PARAM_STR);
}
if ($rdi_entry_start_date) {
$statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
if ($permit_entry_start_date) {
$statement->bindValue(":permit_entry_start_date", $permit_entry_start_date);
}
if ($rdi_entry_end_date && str_contains($SQL, ":rdi_entry_end_date")) {
$statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
if ($permit_entry_end_date && str_contains($SQL, ":permit_entry_end_date")) {
$statement->bindValue(":permit_entry_end_date", $permit_entry_end_date);
}
if ($rdi_permit_start_date) {
$statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
if ($permit_permit_start_date) {
$statement->bindValue(":permit_permit_start_date", $permit_permit_start_date);
}
if ($rdi_permit_end_date && str_contains($SQL, ":rdi_permit_end_date")) {
$statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
if ($permit_permit_end_date && str_contains($SQL, ":permit_permit_end_date")) {
$statement->bindValue(":permit_permit_end_date", $permit_permit_end_date);
}
$statement->execute();
@@ -249,49 +261,49 @@ class PermitsBySubdivision extends Base {
$end = min($count, $start + $this->pagination_size - 1);
// ===================== DATA QUERY =====================
$SQL = "select view_rdis.*
from view_rdis
where view_rdis.rdi_project_type = :rdi_project_type
$SQL = "select view_permits.*
from view_permits
where view_permits.permit_project_type = :permit_project_type
$countyClauseData";
if (!empty($rdi_company)) {
$SQL .= " and view_rdis.rdi_company like :rdi_company";
if (!empty($permit_company)) {
$SQL .= " and view_permits.permit_company like :permit_company";
}
if (!empty($rdi_sub_div_name)) {
$SQL .= " and view_rdis.rdi_sub_div_name like :rdi_sub_div_name";
if (!empty($permit_sub_div_name)) {
$SQL .= " and view_permits.permit_sub_div_name like :permit_sub_div_name";
}
if (!empty($rdi_project_city)) {
$SQL .= " and view_rdis.rdi_project_city like :rdi_project_city";
if (!empty($permit_project_city)) {
$SQL .= " and view_permits.permit_project_city like :permit_project_city";
}
if (!empty($rdi_project_addr)) {
$SQL .= " and view_rdis.rdi_project_addr like :rdi_project_addr";
if (!empty($permit_project_addr)) {
$SQL .= " and view_permits.permit_project_addr like :permit_project_addr";
}
$dateConds = [];
if ($rdi_entry_start_date && $rdi_entry_end_date) {
$dateConds[] = "(view_rdis.rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
} elseif ($rdi_entry_start_date) {
$dateConds[] = "(view_rdis.rdi_entry_date >= :rdi_entry_start_date)";
if ($permit_entry_start_date && $permit_entry_end_date) {
$dateConds[] = "(view_permits.permit_entry_date between :permit_entry_start_date and :permit_entry_end_date)";
} elseif ($permit_entry_start_date) {
$dateConds[] = "(view_permits.permit_entry_date >= :permit_entry_start_date)";
}
if ($rdi_permit_start_date && $rdi_permit_end_date) {
$dateConds[] = "(view_rdis.rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
} elseif ($rdi_permit_start_date) {
$dateConds[] = "(view_rdis.rdi_permit_date >= :rdi_permit_start_date)";
if ($permit_permit_start_date && $permit_permit_end_date) {
$dateConds[] = "(view_permits.permit_permit_date between :permit_permit_start_date and :permit_permit_end_date)";
} elseif ($permit_permit_start_date) {
$dateConds[] = "(view_permits.permit_permit_date >= :permit_permit_start_date)";
}
if ($dateConds) {
$SQL .= " and (" . implode(" $rdi_and_or ", $dateConds) . ")";
$SQL .= " and (" . implode(" $permit_and_or ", $dateConds) . ")";
}
$SQL .= " order by $rdis_order_by $rdis_order_direction
$SQL .= " order by $permits_order_by $permits_order_direction
limit :limit
offset :offset";
$statement = $connection->prepare($SQL);
$statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_project_type", $projecttype, PDO::PARAM_STR);
foreach ($countyParams as $k => $v) {
$statement->bindValue($k, $v, PDO::PARAM_INT);
@@ -300,52 +312,52 @@ class PermitsBySubdivision extends Base {
if ($bindArea) {
$statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
}
if (!empty($rdi_company)) {
$statement->bindValue(":rdi_company", '%' . $rdi_company . '%', PDO::PARAM_STR);
if (!empty($permit_company)) {
$statement->bindValue(":permit_company", '%' . $permit_company . '%', PDO::PARAM_STR);
}
if (!empty($rdi_sub_div_name)) {
$statement->bindValue(":rdi_sub_div_name", '%' . $rdi_sub_div_name . '%', PDO::PARAM_STR);
if (!empty($permit_sub_div_name)) {
$statement->bindValue(":permit_sub_div_name", '%' . $permit_sub_div_name . '%', PDO::PARAM_STR);
}
if (!empty($rdi_project_city)) {
$statement->bindValue(":rdi_project_city", '%' . $rdi_project_city . '%', PDO::PARAM_STR);
if (!empty($permit_project_city)) {
$statement->bindValue(":permit_project_city", '%' . $permit_project_city . '%', PDO::PARAM_STR);
}
if (!empty($rdi_project_addr)) {
$statement->bindValue(":rdi_project_addr", '%' . $rdi_project_addr . '%', PDO::PARAM_STR);
if (!empty($permit_project_addr)) {
$statement->bindValue(":permit_project_addr", '%' . $permit_project_addr . '%', PDO::PARAM_STR);
}
if ($rdi_entry_start_date) {
$statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
if ($permit_entry_start_date) {
$statement->bindValue(":permit_entry_start_date", $permit_entry_start_date);
}
if ($rdi_entry_end_date && str_contains($SQL, ":rdi_entry_end_date")) {
$statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
if ($permit_entry_end_date && str_contains($SQL, ":permit_entry_end_date")) {
$statement->bindValue(":permit_entry_end_date", $permit_entry_end_date);
}
if ($rdi_permit_start_date) {
$statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
if ($permit_permit_start_date) {
$statement->bindValue(":permit_permit_start_date", $permit_permit_start_date);
}
if ($rdi_permit_end_date && str_contains($SQL, ":rdi_permit_end_date")) {
$statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
if ($permit_permit_end_date && str_contains($SQL, ":permit_permit_end_date")) {
$statement->bindValue(":permit_permit_end_date", $permit_permit_end_date);
}
$statement->bindValue(":limit", $this->pagination_size, PDO::PARAM_INT);
$statement->bindValue(":offset", $offset, PDO::PARAM_INT);
$statement->execute();
$rdis = $this->getTableXML("rdis", $statement);
$permits = $this->getTableXML("permits", $statement);
foreach ($rdis as $rdi) {
if (!empty($rdi->rdi_county)) {
$county = (new Counties())->getCounty($rdi->rdi_county);
$rdi->rdi_county_name_verbose = $county->record->county_name ?? null;
foreach ($permits as $permit) {
if (!empty($permit->permit_county)) {
$county = (new Counties())->getCounty($permit->permit_county);
$permit->permit_county_name_verbose = $county->record->county_name ?? null;
}
}
// Pagination attributes
$rdis->addAttribute("count", $count);
$rdis->addAttribute("start", $start);
$rdis->addAttribute("end", $end);
$rdis->addAttribute("page", $this->pagination_page);
$permits->addAttribute("count", $count);
$permits->addAttribute("start", $start);
$permits->addAttribute("end", $end);
$permits->addAttribute("page", $this->pagination_page);
$_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
return $rdis;
return $permits;
}
// =============================
@@ -358,17 +370,17 @@ class PermitsBySubdivision extends Base {
// Count Query
$SQL = "select count(*) as count
from view_rdis r
join counties c on r.rdi_county = c.county_serial
where r.rdi_project_type = :rdi_project_type
and r.rdi_county in
from view_permits r
join counties c on r.permit_county = c.county_serial
where r.permit_project_type = :permit_project_type
and r.permit_county in
(select county_serial
from view_counties
where county_area = :permit_area)";
$statement = $connection->prepare($SQL);
$statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
$statement->execute();
@@ -376,28 +388,28 @@ class PermitsBySubdivision extends Base {
$count = $recordset ? (int) $recordset["count"] : 0;
// === DATA QUERY ===
$SQL = "select r.*, c.county_name as rdi_county_name_verbose
from view_rdis r
join counties c on r.rdi_county = c.county_serial
where r.rdi_project_type = :rdi_project_type
and r.rdi_county in
$SQL = "select r.*, c.county_name as permit_county_name_verbose
from view_permits r
join counties c on r.permit_county = c.county_serial
where r.permit_project_type = :permit_project_type
and r.permit_county in
(select county_serial
from view_counties
where county_area = :permit_area)";
$statement = $connection->prepare($SQL);
$statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
$statement->execute();
$rdis = $this->getTableXML("rdis", $statement);
$permits = $this->getTableXML("permits", $statement);
// Insert Pagination Attributes
$rdis->addAttribute("count", $count);
$permits->addAttribute("count", $count);
return $rdis;
return $permits;
}
// ======================
@@ -410,7 +422,7 @@ class PermitsBySubdivision extends Base {
return;
}
$SQL = "select view_rdis.* from view_rdis where rdi_serial in ({$permits})";
$SQL = "select view_permits.* from view_permits where permit_serial in ({$permits})";
return $this->getTable("permits", $SQL);
}
@@ -423,18 +435,18 @@ class PermitsBySubdivision extends Base {
$results = array();
$subdivision = filter_input(INPUT_GET, "rdi_sub_div_name") ?: "";
$subdivision = filter_input(INPUT_GET, "permit_sub_div_name") ?: "";
$subdivision = trim(preg_replace("/\s+/", " ", $subdivision));
$subdivision = preg_replace("/'+/", "'", $subdivision);
$subdivision = preg_replace('/"+/', '"', $subdivision);
$subdivision = str_replace("'", "''", $subdivision);
$SQL = "select distinct rdi_sub_div_name from view_rdis where rdi_sub_div_name like '%{$subdivision}%' order by rdi_sub_div_name limit 10 offset 0";
$SQL = "select distinct permit_sub_div_name from view_permits where permit_sub_div_name like '%{$subdivision}%' order by permit_sub_div_name limit 10 offset 0";
$matches = $this->getTable("subdivisions", $SQL);
foreach ($matches as $match) {
$results[] = (string) $match->rdi_sub_div_name;
$results[] = (string) $match->permit_sub_div_name;
}
header('Content-Type: application/json');
@@ -450,18 +462,18 @@ class PermitsBySubdivision extends Base {
$results = array();
$city = filter_input(INPUT_GET, "rdi_project_city") ?: "";
$city = filter_input(INPUT_GET, "permit_project_city") ?: "";
$city = trim(preg_replace("/\s+/", " ", $city));
$city = preg_replace("/'+/", "'", $city);
$city = preg_replace('/"+/', '"', $city);
$city = str_replace("'", "''", $city);
$SQL = "select distinct rdi_project_city from view_rdis where rdi_project_city like '%{$city}%' order by rdi_project_city limit 10 offset 0";
$SQL = "select distinct permit_project_city from view_permits where permit_project_city like '%{$city}%' order by permit_project_city limit 10 offset 0";
$matches = $this->getTable("cities", $SQL);
foreach ($matches as $match) {
$results[] = (string) $match->rdi_project_city;
$results[] = (string) $match->permit_project_city;
}
header('Content-Type: application/json');
@@ -477,18 +489,18 @@ class PermitsBySubdivision extends Base {
$results = array();
$street = filter_input(INPUT_GET, "rdi_project_addr") ?: "";
$street = filter_input(INPUT_GET, "permit_project_addr") ?: "";
$street = trim(preg_replace("/\s+/", " ", $street));
$street = preg_replace("/'+/", "'", $street);
$street = preg_replace('/"+/', '"', $street);
$street = str_replace("'", "''", $street);
$SQL = "select distinct rdi_project_addr from view_rdis where rdi_project_addr like '%{$street}%' order by rdi_project_addr limit 10 offset 0";
$SQL = "select distinct permit_project_addr from view_permits where permit_project_addr like '%{$street}%' order by permit_project_addr limit 10 offset 0";
$matches = $this->getTable("cities", $SQL);
foreach ($matches as $match) {
$results[] = (string) $match->rdi_project_addr;
$results[] = (string) $match->permit_project_addr;
}
header('Content-Type: application/json');
@@ -500,9 +512,9 @@ class PermitsBySubdivision extends Base {
// Return a Permit Object
// ======================
public function getPermit($rdi_serial = 0) {
public function getPermit($permit_serial = 0) {
$SQL = "select view_rdis.* from view_rdis where rdi_serial = {$rdi_serial}";
$SQL = "select view_permits.* from view_permits where permit_serial = {$permit_serial}";
return $this->getTable("permit", $SQL);
}
@@ -513,12 +525,12 @@ class PermitsBySubdivision extends Base {
public function getPermitRecordDialog() {
$rdi_serial = filter_input(INPUT_POST, "rdi_serial", FILTER_SANITIZE_NUMBER_INT) ?: 9;
$permit_serial = filter_input(INPUT_POST, "permit_serial", FILTER_SANITIZE_NUMBER_INT) ?: 9;
$permit_record = $this->getPermit($rdi_serial);
$permit_record = $this->getPermit($permit_serial);
$rdi_county = (new Counties())->getCounty($permit_record->record->rdi_county);
$permit_record->record->rdi_county = $rdi_county->record->county_name;
$permit_county = (new Counties())->getCounty($permit_record->record->permit_county);
$permit_record->record->permit_county = $permit_county->record->county_name;
$content = $this->applyXSL($permit_record, $this->getXSL("permitRecordDialog"));
+4 -4
View File
@@ -42,7 +42,7 @@ class SearchHistory extends Base {
case 13:
case 15:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'permit_'), ARRAY_FILTER_USE_KEY));
break;
@@ -52,7 +52,7 @@ class SearchHistory extends Base {
case 14:
case 16:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'permit_'), ARRAY_FILTER_USE_KEY));
break;
@@ -103,7 +103,7 @@ class SearchHistory extends Base {
case 13:
case 15:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'permit_'), ARRAY_FILTER_USE_KEY));
break;
@@ -113,7 +113,7 @@ class SearchHistory extends Base {
case 14:
case 16:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'permit_'), ARRAY_FILTER_USE_KEY));
break;
+12 -6
View File
@@ -595,12 +595,18 @@ class Subscriptions extends Base {
public function getUsersActiveSubscriptions($user_serial) {
$SQL = "select view_usersubscriptions.*
from view_usersubscriptions
where usersubscription_user_serial = {$user_serial}
and view_usersubscriptions.usersubscription_status = 'ACTIVE'
and view_usersubscriptions.usersubscription_stop_date >= now()
order by view_usersubscriptions.subscription_title, view_usersubscriptions.usersubscription_status";
$SQL = "SELECT view_usersubscriptions.*
FROM view_usersubscriptions
WHERE usersubscription_user_serial = 67
AND view_usersubscriptions.usersubscription_status = 'ACTIVE'
AND view_usersubscriptions.usersubscription_stop_date >= NOW()
ORDER BY
CASE
WHEN view_usersubscriptions.subscription_area = 'All' THEN 0
ELSE 1
END,
view_usersubscriptions.subscription_title,
view_usersubscriptions.usersubscription_status";
return $this->getTable("usersubscriptions", $SQL);
}
-78
View File
@@ -562,84 +562,6 @@ $(document).ready(function () {
}, 2000); // optional: add a slight delay so it feels responsive
});
// -------------------
// Save Changed Inputs
// -------------------
$(".autosave").on("change", function (e) {
switch (e.target.type) {
case "text" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "radio" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "checkbox" :
$sessionStorage[e.target.name] = $(this).prop("checked");
break;
case "select-one" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "hidden" :
$sessionStorage[e.target.name] = $(this).val();
break;
default :
$sessionStorage[e.target.name] = $(this).val();
break;
}
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
});
// ----------------
// Initalize Inputs
// ----------------
$.each($sessionStorage, function (name, value) {
var $input = $(":input").filter("[name='" + name + "']");
if ($input.length > 0) {
switch ($input.prop("type")) {
case "text" :
$input.val(value);
break;
case "radio" :
$input.filter("[value=" + value + "]").prop("checked", true);
break;
case "checkbox" :
$input.prop("checked", value);
break;
case "select-one" :
$input.val(value);
break;
case "hidden" :
$input.val(value);
break;
default :
$input.val(value);
break;
}
}
});
// ------------------
// Save preset Inputs
// ------------------
$("input[type=radio]:checked").trigger("change");
// -----------------
// Per Page Dropdown
// -----------------
+82 -82
View File
@@ -24,7 +24,7 @@ $(document).ready(function () {
// Initialize Dropdowns
// --------------------
$("#rdis_per_page").val($sessionStorage.rdis_per_page || "20");
$("#permits_per_page").val($sessionStorage.permits_per_page || "20");
// -----------
// Input Masks
@@ -53,8 +53,8 @@ $(document).ready(function () {
// Date Pickers
// ------------
$("#rdi_entry_start_date").datepicker({format: "mm-dd-yyyy",
container: "div.rdi_entry_start_date",
$("#permit_entry_start_date").datepicker({format: "mm-dd-yyyy",
container: "div.permit_entry_start_date",
keyboardNavigation: false,
showOnFocus: false,
autoclose: true,
@@ -62,8 +62,8 @@ $(document).ready(function () {
todayBtn: "linked",
todayHighlight: true});
$("#rdi_entry_end_date").datepicker({format: "mm-dd-yyyy",
container: "div.rdi_entry_end_date",
$("#permit_entry_end_date").datepicker({format: "mm-dd-yyyy",
container: "div.permit_entry_end_date",
keyboardNavigation: false,
showOnFocus: false,
autoclose: true,
@@ -71,8 +71,8 @@ $(document).ready(function () {
todayBtn: "linked",
todayHighlight: true});
$("#rdi_permit_start_date").datepicker({format: "mm-dd-yyyy",
container: "div.rdi_permit_start_date",
$("#permit_permit_start_date").datepicker({format: "mm-dd-yyyy",
container: "div.permit_permit_start_date",
keyboardNavigation: false,
showOnFocus: false,
autoclose: true,
@@ -80,8 +80,8 @@ $(document).ready(function () {
todayBtn: "linked",
todayHighlight: true});
$("#rdi_permit_end_date").datepicker({format: "mm-dd-yyyy",
container: "div.rdi_permit_end_date",
$("#permit_permit_end_date").datepicker({format: "mm-dd-yyyy",
container: "div.permit_permit_end_date",
keyboardNavigation: false,
showOnFocus: false,
autoclose: true,
@@ -97,7 +97,7 @@ $(document).ready(function () {
e.preventDefault();
$("#rdi_entry_start_date").focus().datepicker("show");
$("#permit_entry_start_date").focus().datepicker("show");
});
@@ -105,7 +105,7 @@ $(document).ready(function () {
e.preventDefault();
$("#rdi_entry_end_date").focus().datepicker("show");
$("#permit_entry_end_date").focus().datepicker("show");
});
@@ -113,7 +113,7 @@ $(document).ready(function () {
e.preventDefault();
$("#rdi_permit_start_date").focus().datepicker("show");
$("#permit_permit_start_date").focus().datepicker("show");
});
@@ -121,7 +121,7 @@ $(document).ready(function () {
e.preventDefault();
$("#rdi_permit_end_date").focus().datepicker("show");
$("#permit_permit_end_date").focus().datepicker("show");
});
@@ -133,15 +133,15 @@ $(document).ready(function () {
var filter = $(this).val().toLowerCase();
$(".rdi-row").hide().filter(function () {
$(".permit-row").hide().filter(function () {
return $(this).find(".filterable").text().toLowerCase().indexOf(filter) > -1;
}).show();
if ($(".rdi-row:visible").length === 0) {
$("#rdis-table thead").hide();
if ($(".permit-row:visible").length === 0) {
$("#permits-table thead").hide();
$(".filter-error").removeClass("d-none");
} else {
$("#rdis-table thead").show();
$("#permits-table thead").show();
$(".filter-error").addClass("d-none");
}
@@ -170,9 +170,9 @@ $(document).ready(function () {
// Per Page Change
// ---------------
$("#rdis_per_page").on("change", function () {
$("#permits_per_page").on("change", function () {
$sessionStorage.rdis_per_page = $(this).val();
$sessionStorage.permits_per_page = $(this).val();
$sessionStorage.action = "PermitsBySubdivision.searchPermits";
$sessionStorage.pagination = "first";
@@ -214,7 +214,7 @@ $(document).ready(function () {
resolverSettings: {
url: "main.php?Xaction=PermitsBySubdivision.getAutoCompleteSubdivisions",
queryKey: "rdi_sub_div_name",
queryKey: "permit_sub_div_name",
requestThrottling: 0
},
noResultsText: "No Matching Subdivisions Found.",
@@ -225,7 +225,7 @@ $(document).ready(function () {
$(".city-autocomplete").autoComplete({
resolverSettings: {
url: "main.php?Xaction=PermitsBySubdivision.getAutoCompleteCities",
queryKey: "rdi_project_city",
queryKey: "permit_project_city",
requestThrottling: 0
},
noResultsText: "No Matching Cities Found.",
@@ -237,7 +237,7 @@ $(document).ready(function () {
resolverSettings: {
url: "main.php?Xaction=PermitsBySubdivision.getAutoCompleteStreets",
queryKey: "rdi_project_addr",
queryKey: "permit_project_addr",
requestThrottling: 0
},
noResultsText: "No Matching Streets Found.",
@@ -279,16 +279,16 @@ $(document).ready(function () {
$("#spinner-dialog").modal("show");
delete $sessionStorage.pagination;
delete $sessionStorage.rdi_company;
delete $sessionStorage.rdi_county;
delete $sessionStorage.rdi_sub_div_name;
delete $sessionStorage.rdi_project_city;
delete $sessionStorage.rdi_project_addr;
delete $sessionStorage.rdi_and_or;
delete $sessionStorage.rdi_entry_start_date;
delete $sessionStorage.rdi_entry_end_date;
delete $sessionStorage.rdi_permit_start_date;
delete $sessionStorage.rdi_permit_end_date;
delete $sessionStorage.permit_company;
delete $sessionStorage.permit_county;
delete $sessionStorage.permit_sub_div_name;
delete $sessionStorage.permit_project_city;
delete $sessionStorage.permit_project_addr;
delete $sessionStorage.permit_and_or;
delete $sessionStorage.permit_entry_start_date;
delete $sessionStorage.permit_entry_end_date;
delete $sessionStorage.permit_permit_start_date;
delete $sessionStorage.permit_permit_end_date;
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
@@ -317,16 +317,16 @@ $(document).ready(function () {
$("#spinner-dialog").modal("show");
var rdi_county = $("#rdi_county"),
rdi_and_or = $("#rdi_and_or"),
rdi_company = $("#rdi_company"),
rdi_sub_div_name = $("#rdi_sub_div_name"),
rdi_project_city = $("#rdi_project_city"),
rdi_project_addr = $("#rdi_project_addr"),
rdi_entry_start_date = $("#rdi_entry_start_date"),
rdi_entry_end_date = $("#rdi_entry_end_date"),
rdi_permit_start_date = $("#rdi_permit_start_date"),
rdi_permit_end_date = $("#rdi_permit_end_date"),
var permit_county = $("#permit_county"),
permit_and_or = $("#permit_and_or"),
permit_company = $("#permit_company"),
permit_sub_div_name = $("#permit_sub_div_name"),
permit_project_city = $("#permit_project_city"),
permit_project_addr = $("#permit_project_addr"),
permit_entry_start_date = $("#permit_entry_start_date"),
permit_entry_end_date = $("#permit_entry_end_date"),
permit_permit_start_date = $("#permit_permit_start_date"),
permit_permit_end_date = $("#permit_permit_end_date"),
form_error = $("#search-form-error");
clearInputErrors();
@@ -341,39 +341,39 @@ $(document).ready(function () {
}
// Validate required fields
if ([rdi_county, rdi_company, rdi_sub_div_name, rdi_project_city, rdi_project_addr, rdi_entry_start_date, rdi_entry_end_date, rdi_permit_start_date, rdi_permit_end_date].every(isBlank)) {
if ([permit_county, permit_company, permit_sub_div_name, permit_project_city, permit_project_addr, permit_entry_start_date, permit_entry_end_date, permit_permit_start_date, permit_permit_end_date].every(isBlank)) {
return showError("Please provide a search criteria.");
}
if (isBlank(rdi_entry_start_date) && !isBlank(rdi_entry_end_date)) {
return showError("Please provide an Entry From Date for range.", rdi_entry_start_date);
if (isBlank(permit_entry_start_date) && !isBlank(permit_entry_end_date)) {
return showError("Please provide an Entry From Date for range.", permit_entry_start_date);
}
if (isBlank(rdi_permit_start_date) && !isBlank(rdi_permit_end_date)) {
return showError("Please provide a Permit From Date for range.", rdi_permit_start_date);
if (isBlank(permit_permit_start_date) && !isBlank(permit_permit_end_date)) {
return showError("Please provide a Permit From Date for range.", permit_permit_start_date);
}
// Validate date ranges
if (rdi_entry_end_date.val() && !checkEndingDate(rdi_entry_start_date, rdi_entry_end_date)) {
if (permit_entry_end_date.val() && !checkEndingDate(permit_entry_start_date, permit_entry_end_date)) {
return showError("Start Date must be prior to End Date");
}
if (rdi_permit_end_date.val() && !checkEndingDate(rdi_permit_start_date, rdi_permit_end_date)) {
if (permit_permit_end_date.val() && !checkEndingDate(permit_permit_start_date, permit_permit_end_date)) {
return showError("Start Date must be prior to End Date");
}
e.preventDefault();
$sessionStorage.rdi_company = rdi_company.val();
$sessionStorage.rdi_county = rdi_county.val();
$sessionStorage.rdi_and_or = rdi_and_or.val();
$sessionStorage.rdi_sub_div_name = rdi_sub_div_name.val();
$sessionStorage.rdi_project_city = rdi_project_city.val();
$sessionStorage.rdi_project_addr = rdi_project_addr.val();
$sessionStorage.rdi_entry_start_date = rdi_entry_start_date.val();
$sessionStorage.rdi_entry_end_date = rdi_entry_end_date.val();
$sessionStorage.rdi_permit_start_date = rdi_permit_start_date.val();
$sessionStorage.rdi_permit_end_date = rdi_permit_end_date.val();
$sessionStorage.permit_company = permit_company.val();
$sessionStorage.permit_county = permit_county.val();
$sessionStorage.permit_and_or = permit_and_or.val();
$sessionStorage.permit_sub_div_name = permit_sub_div_name.val();
$sessionStorage.permit_project_city = permit_project_city.val();
$sessionStorage.permit_project_addr = permit_project_addr.val();
$sessionStorage.permit_entry_start_date = permit_entry_start_date.val();
$sessionStorage.permit_entry_end_date = permit_entry_end_date.val();
$sessionStorage.permit_permit_start_date = permit_permit_start_date.val();
$sessionStorage.permit_permit_end_date = permit_permit_end_date.val();
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
@@ -385,43 +385,43 @@ $(document).ready(function () {
// Column Heading Sort
// -------------------
if (($sessionStorage.rdis_order_by || "") !== "") {
if (($sessionStorage.permits_order_by || "") !== "") {
$("th[data-order-by = '" + ($sessionStorage.rdis_order_by || "") + "']").append('<i class="' + ($sessionStorage.rdis_order_icon || "") + ' text-danger ms-1 me-0"/>');
$("th[data-order-by = '" + ($sessionStorage.permits_order_by || "") + "']").append('<i class="' + ($sessionStorage.permits_order_icon || "") + ' text-danger ms-1 me-0"/>');
}
$("th.sortable").on("click", function (e) {
if ($(e.target).data("order-by") !== ($sessionStorage.rdis_order_by || "")) { // New Column
if ($(e.target).data("order-by") !== ($sessionStorage.permits_order_by || "")) { // New Column
$sessionStorage.rdis_order_by = $(e.target).data("order-by");
$sessionStorage.rdis_order_direction = "asc";
$sessionStorage.rdis_order_icon = "bi bi-arrow-up";
$sessionStorage.permits_order_by = $(e.target).data("order-by");
$sessionStorage.permits_order_direction = "asc";
$sessionStorage.permits_order_icon = "bi bi-arrow-up";
} else {
switch ($sessionStorage.rdis_order_direction) {
switch ($sessionStorage.permits_order_direction) {
case "" :
$sessionStorage.rdis_order_by = $(e.target).data("order-by");
$sessionStorage.rdis_order_direction = "asc";
$sessionStorage.rdis_order_icon = "bi bi-arrow-up";
$sessionStorage.permits_order_by = $(e.target).data("order-by");
$sessionStorage.permits_order_direction = "asc";
$sessionStorage.permits_order_icon = "bi bi-arrow-up";
break;
case "asc" :
$sessionStorage.rdis_order_by = $(e.target).data("order-by");
$sessionStorage.rdis_order_direction = "desc";
$sessionStorage.rdis_order_icon = "bi bi-arrow-down";
$sessionStorage.permits_order_by = $(e.target).data("order-by");
$sessionStorage.permits_order_direction = "desc";
$sessionStorage.permits_order_icon = "bi bi-arrow-down";
break;
case "desc" :
$sessionStorage.rdis_order_by = "";
$sessionStorage.rdis_order_direction = "";
$sessionStorage.rdis_order_icon = "";
$sessionStorage.permits_order_by = "";
$sessionStorage.permits_order_direction = "";
$sessionStorage.permits_order_icon = "";
break;
}
@@ -468,7 +468,7 @@ $(document).ready(function () {
// Toggle a Select Checkbox
// ------------------------
$(".rdi-row").on("click touch", function (e) {
$(".permit-row").on("click touch", function (e) {
if (!($(e.target).hasClass("selection-area"))) {
return false;
@@ -492,16 +492,16 @@ $(document).ready(function () {
});
$("#rdis-table tbody tr").on("click touch", function (e) {
$("#permits-table tbody tr").on("click touch", function (e) {
// If the click was on selection area (or the checkbox itself), do nothing
if ($(e.target).closest(".selection-area, input[name='selected[]'], label").length) {
return;
}
const rdi_serial = $(this).data("rdi-serial");
const permit_serial = $(this).data("permit-serial");
openPermitDialog(getPermitRecordDialog(rdi_serial));
openPermitDialog(getPermitRecordDialog(permit_serial));
});
@@ -729,7 +729,7 @@ $(document).ready(function () {
// Per Page Dropdown
// -----------------
$("#rdis_per_page").on("change", function () {
$("#permits_per_page").on("change", function () {
$(".btnFind").trigger("click");
@@ -758,7 +758,7 @@ function openPermitDialog(modalHtml) {
// Returns Modal with Permit Record Data
// -------------------------------------
function getPermitRecordDialog(rdi_serial) {
function getPermitRecordDialog(permit_serial) {
var dialog = null;
@@ -766,7 +766,7 @@ function getPermitRecordDialog(rdi_serial) {
url: "main.php?Xaction=PermitsBySubdivision.getPermitRecordDialog",
type: "POST",
async: false,
data: {rdi_serial: rdi_serial},
data: {permit_serial: permit_serial},
dataType: "html",
success: function (result) {
dialog = result;
+1 -2
View File
@@ -3,8 +3,7 @@
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/classes/PermitsByBuilder.php</file>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/classes/Consolidation.php</file>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/views/view_company_permit_trends.php</file>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/xsl/searchPermitsByBuilder.xsl</file>
</group>
</open-files>
+22 -36
View File
@@ -1,38 +1,33 @@
<?php
$SQL = "create or replace view view_company_permit_trends as
select
companies.permit_company,
select companies.permit_company,
ifnull(prev.prev_ytd_permits, 0) as prev_ytd_permits,
ifnull(curr.ytd_permits, 0) as ytd_permits,
ifnull(prev.prev_ytd_value, 0) as prev_ytd_value,
ifnull(curr.ytd_value, 0) as ytd_value,
case
when ifnull(prev.prev_ytd_permits, 0) = 0 then null
else round(
((ifnull(curr.ytd_permits, 0) - prev.prev_ytd_permits) / prev.prev_ytd_permits) * 100,
2
)
end as permits_pct_change,
else round( ((ifnull(curr.ytd_permits, 0) - prev.prev_ytd_permits) / prev.prev_ytd_permits) * 100, 2 )
end
as permits_pct_change,
case
when ifnull(prev.prev_ytd_value, 0) = 0 then null
else round(
((ifnull(curr.ytd_value, 0) - prev.prev_ytd_value) / prev.prev_ytd_value) * 100,
2
)
end as value_pct_change,
else round(((ifnull(curr.ytd_value, 0) - prev.prev_ytd_value) / prev.prev_ytd_value) * 100, 2 )
end
as value_pct_change,
case
when ifnull(prev.prev_ytd_permits, 0) = 0 then ''
when ( ifnull(curr.ytd_permits, 0) / prev.prev_ytd_permits) < 0.75 then 'down'
when (( ifnull(curr.ytd_permits, 0) - prev.prev_ytd_permits) / prev.prev_ytd_permits) >= 0.05 then 'up'
when ((ifnull(curr.ytd_permits, 0) - prev.prev_ytd_permits) / prev.prev_ytd_permits) <= -0.05 then 'down'
when (( ifnull(curr.ytd_permits, 0) - prev.prev_ytd_permits) / prev.prev_ytd_permits) <= -0.05 then '='
else '='
end as permits_trend,
end
as permits_trend,
case
when ifnull(prev.prev_ytd_value, 0) = 0 then ''
@@ -40,43 +35,34 @@ select
when (( ifnull(curr.ytd_value, 0) - prev.prev_ytd_value) / prev.prev_ytd_value) >= 0.05 then 'up'
when (( ifnull(curr.ytd_value, 0) - prev.prev_ytd_value) / prev.prev_ytd_value) <= -0.05 then 'down'
else '='
end as value_trend
end
as value_trend
from (
from
(
select distinct permit_company
from permits
where permit_company is not null
and trim(permit_company) <> ''
) companies
and trim(permit_company) <> '' ) companies
left join
(
select
permit_company,
count(*) as prev_ytd_permits,
sum(ifnull(permit_value, 0)) as prev_ytd_value
left join (
select permit_company, count(*) as prev_ytd_permits, sum(ifnull(permit_value, 0)) as prev_ytd_value
from permits
where permit_company is not null
and trim(permit_company) <> ''
and permit_permit_date >= makedate(year(curdate()) - 1, 1)
and permit_permit_date <= date_sub(curdate(), interval 1 year)
group by permit_company
) prev
group by permit_company ) prev
on companies.permit_company = prev.permit_company
left join
(
select
permit_company,
count(*) as ytd_permits,
sum(ifnull(permit_value, 0)) as ytd_value
left join (
select permit_company, count(*) as ytd_permits, sum(ifnull(permit_value, 0)) as ytd_value
from permits
where permit_company is not null
and trim(permit_company) <> ''
and permit_permit_date >= makedate(year(curdate()), 1)
and permit_permit_date <= curdate()
group by permit_company
) curr
group by permit_company ) curr
on companies.permit_company = curr.permit_company";
?>
+29 -11
View File
@@ -12,9 +12,9 @@
<div class="modal-header bg-primary">
<h5 class="modal-title text-white" id="permit-details-title">
<xsl:value-of select="//permit/record/rdi_sub_div_name"/>
<xsl:value-of select="//permit/record/permit_sub_div_name"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="concat(//permit/record/rdi_project_addr, ' ', //permit/record/rdi_project_city, ' ', //permit/record/rdi_project_state)"/>
<xsl:value-of select="concat(//permit/record/permit_project_addr, ' ', //permit/record/permit_project_city, ' ', //permit/record/permit_project_state)"/>
</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
@@ -26,21 +26,39 @@
<div class="col-md-4">
<label class="form-label">Permit Number</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_permit_number"/>
<xsl:value-of select="//permit/record/permit_permit_number"/>
</p>
</div>
<div class="col-md-4">
<label class="form-label">Permit Date</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_permit_date_verbose"/>
<xsl:value-of select="//permit/record/permit_permit_date_verbose"/>
</p>
</div>
<div class="col-md-4">
<label class="form-label">Entry Date</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_entry_date_verbose"/>
<xsl:value-of select="//permit/record/permit_entry_date_verbose"/>
</p>
</div>
</div>
<hr class="my-3"/>
<div class="row g-3">
<div class="col-md-4">
<label class="form-label">Value</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/permit_value_verbose"/>
</p>
</div>
<div class="col-md-4">
<label class="form-label">Square Footage</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/permit_size_verbose"/>
</p>
</div>
</div>
@@ -51,14 +69,14 @@
<div class="col-md-6">
<label class="form-label">Project Address</label>
<p class="mb-0">
<xsl:value-of select="concat(//permit/record/rdi_project_addr, ' ', //permit/record/rdi_project_city, ', ', //permit/record/rdi_project_state, ' ', //permit/record/rdi_zip)"/>
<xsl:value-of select="concat(//permit/record/permit_project_addr, ' ', //permit/record/permit_project_city, ', ', //permit/record/permit_project_state, ' ', //permit/record/permit_zip)"/>
</p>
</div>
<div class="col-md-6">
<label class="form-label">Owner Address</label>
<p class="mb-0">
<xsl:value-of select="concat(//permit/record/rdi_owner_address, ' ', //permit/record/rdi_owner_city, ', ', //permit/record/rdi_owner_state, ' ', //permit/record/rdi_owner_zip)"/>
<xsl:value-of select="concat(//permit/record/permit_owner_address, ' ', //permit/record/permit_owner_city, ', ', //permit/record/permit_owner_state, ' ', //permit/record/permit_owner_zip)"/>
</p>
</div>
</div>
@@ -69,14 +87,14 @@
<div class="col-md-6">
<label class="form-label">Company</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_company"/>
<xsl:value-of select="//permit/record/permit_company"/>
</p>
</div>
<div class="col-md-6">
<label class="form-label">Project Name</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_sub_div_name"/>
<xsl:value-of select="//permit/record/permit_sub_div_name"/>
</p>
</div>
</div>
@@ -87,14 +105,14 @@
<div class="col-md-6">
<label class="form-label">County</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_county"/>
<xsl:value-of select="//permit/record/permit_county"/>
</p>
</div>
<div class="col-md-6">
<label class="form-label">Owner Name</label>
<p class="mb-0">
<xsl:value-of select="//permit/record/rdi_owner_name"/>
<xsl:value-of select="//permit/record/permit_owner_name"/>
</p>
</div>
</div>
+9 -8
View File
@@ -376,14 +376,6 @@
<td class="ytd_permits text-nowrap filterable text-center">
<xsl:value-of select="ytd_permits"/>
</td>
<td class="permit_ytd_value filterable text-center">
<xsl:value-of select="concat('$', format-number(ytd_value, '###,###'))"/>
</td>
<td class="permit_12mth_prev_permits filterable text-center">
<xsl:value-of select="previous_ytd_permits"/>
<xsl:choose>
<xsl:when test="permits_trend = 'up'">
<i class="bi bi-arrow-up text-success"></i>
@@ -397,6 +389,15 @@
</xsl:choose>
</td>
<td class="permit_ytd_value filterable text-center">
<xsl:value-of select="concat('$', format-number(ytd_value, '###,###'))"/>
</td>
<td class="permit_12mth_prev_permits filterable text-center">
<xsl:value-of select="previous_ytd_permits"/>
</td>
<td class="permit_address filterable">
<xsl:value-of select="concat(permit_address, ' ', permit_city, ', ', permit_state, ' ', permit_zip)"/>
</td>
+66 -66
View File
@@ -11,10 +11,10 @@
<!-- Variables -->
<xsl:variable name="PAGINATION_COUNT" select="//rdis/@count"/>
<xsl:variable name="PAGINATION_START" select="//rdis/@start"/>
<xsl:variable name="PAGINATION_END" select="//rdis/@end"/>
<xsl:variable name="PAGINATION_PAGE" select="//rdis/@page"/>
<xsl:variable name="PAGINATION_COUNT" select="//permits/@count"/>
<xsl:variable name="PAGINATION_START" select="//permits/@start"/>
<xsl:variable name="PAGINATION_END" select="//permits/@end"/>
<xsl:variable name="PAGINATION_PAGE" select="//permits/@page"/>
<xsl:template match="/">
@@ -47,15 +47,15 @@
<div class="row">
<div class="col-lg-4 mb-3">
<label class="form-label" for="rdi_county">County</label>
<select class="form-control form-control-sm multiple-dropdown" multiple="multiple" name="rdi_county" id="rdi_county" size="1">
<label class="form-label" for="permit_county">County</label>
<select class="form-control form-control-sm multiple-dropdown" multiple="multiple" name="permit_county" id="permit_county" size="1">
<xsl:apply-templates select="//counties"/>
</select>
</div>
<div class="col-lg-1 mb-3">
<label class="form-label" for="rdi_and_or">And/Or</label>
<select class="form-select form-select-sm" name="rdi_and_or" id="rdi_and_or" size="1">
<label class="form-label" for="permit_and_or">And/Or</label>
<select class="form-select form-select-sm" name="permit_and_or" id="permit_and_or" size="1">
<option value="and">And</option>
<option value="or">Or</option>
</select>
@@ -66,59 +66,59 @@
<div class="row">
<div class="col-lg-3 mb-3">
<label class="form-label" for="rdi_company">Company/Builder</label>
<input type="text" class="form-control form-control-sm" name="rdi_company" id="rdi_company" maxlength="120" autocomplete="off" autofocus="autofocus"/>
<label class="form-label" for="permit_company">Company/Builder</label>
<input type="text" class="form-control form-control-sm" name="permit_company" id="permit_company" maxlength="120" autocomplete="off" autofocus="autofocus"/>
</div>
<div class="col-lg-3 mb-3">
<label class="form-label" for="rdi_sub_div_name">Subdivision</label>
<input type="text" class="form-control form-control-sm subdivision-autocomplete" autocomplete="chrome-off" name="rdi_sub_div_name" id="rdi_sub_div_name" maxlength="100"/>
<label class="form-label" for="permit_sub_div_name">Subdivision</label>
<input type="text" class="form-control form-control-sm subdivision-autocomplete" autocomplete="chrome-off" name="permit_sub_div_name" id="permit_sub_div_name" maxlength="100"/>
</div>
<div class="col-lg-3 mb-3">
<label class="form-label" for="rdi_project_city">City</label>
<input type="text" class="form-control form-control-sm city-autocomplete" autocomplete="chrome-off" name="rdi_project_city" id="rdi_project_city" maxlength="100"/>
<label class="form-label" for="permit_project_city">City</label>
<input type="text" class="form-control form-control-sm city-autocomplete" autocomplete="chrome-off" name="permit_project_city" id="permit_project_city" maxlength="100"/>
</div>
<div class="col-lg-3 mb-3">
<label class="form-label" for="rdi_project_addr">Street Name</label>
<input type="text" class="form-control form-control-sm street-autocomplete" autocomplete="chrome-off" name="rdi_project_addr" id="rdi_project_addr" maxlength="100"/>
<label class="form-label" for="permit_project_addr">Street Name</label>
<input type="text" class="form-control form-control-sm street-autocomplete" autocomplete="chrome-off" name="permit_project_addr" id="permit_project_addr" maxlength="100"/>
</div>
</div>
<div class="row">
<div class="col-lg-2 mb-3">
<label class="form-label" for="rdi_entry_start_date">Entry Start Date</label>
<div class="input-group input-group-sm rdi_entry_start_date">
<input type="text" class="form-control form-control-sm date-mask" name="rdi_entry_start_date" id="rdi_entry_start_date" autocomplete="off" value=""/>
<label class="form-label" for="permit_entry_start_date">Entry Start Date</label>
<div class="input-group input-group-sm permit_entry_start_date">
<input type="text" class="form-control form-control-sm date-mask" name="permit_entry_start_date" id="permit_entry_start_date" autocomplete="off" value=""/>
<button class="btn btn-sm btn-outline-primary btnEntryStartDateCalendar" type="button" data-bs-toggle="tooltip" data-bs-title="Calendar" data-bs-custom-class="custom-tooltip" tabindex="-1">
<i class="bi bi-calendar3"/>
</button>
</div>
</div>
<div class="col-lg-2 mb-3">
<label class="form-label" for="rdi_entry_end_date">Entry End Date</label>
<div class="input-group input-group-sm rdi_entry_end_date">
<input type="text" class="form-control form-control-sm date-mask" name="rdi_entry_end_date" id="rdi_entry_end_date" autocomplete="off" value=""/>
<label class="form-label" for="permit_entry_end_date">Entry End Date</label>
<div class="input-group input-group-sm permit_entry_end_date">
<input type="text" class="form-control form-control-sm date-mask" name="permit_entry_end_date" id="permit_entry_end_date" autocomplete="off" value=""/>
<button class="btn btn-sm btn-outline-primary btnEntryEndDateCalendar" type="button" data-bs-toggle="tooltip" data-bs-title="Calendar" data-bs-custom-class="custom-tooltip" tabindex="-1">
<i class="bi bi-calendar3"/>
</button>
</div>
</div>
<div class="col-lg-2 mb-3">
<label class="form-label" for="rdi_permit_start_date">Permit Start Date</label>
<div class="input-group input-group-sm rdi_permit_start_date">
<input type="text" class="form-control form-control-sm date-mask" name="rdi_permit_start_date" id="rdi_permit_start_date" autocomplete="off" value=""/>
<label class="form-label" for="permit_permit_start_date">Permit Start Date</label>
<div class="input-group input-group-sm permit_permit_start_date">
<input type="text" class="form-control form-control-sm date-mask" name="permit_permit_start_date" id="permit_permit_start_date" autocomplete="off" value=""/>
<button class="btn btn-sm btn-outline-primary btnPermitStartDateCalendar" type="button" data-bs-toggle="tooltip" data-bs-title="Calendar" data-bs-custom-class="custom-tooltip" tabindex="-1">
<i class="bi bi-calendar3"/>
</button>
</div>
</div>
<div class="col-lg-2 mb-3">
<label class="form-label" for="rdi_permit_end_date">Permit End Date</label>
<div class="input-group input-group-sm rdi_permit_end_date">
<input type="text" class="form-control form-control-sm date-mask" name="rdi_permit_end_date" id="rdi_permit_end_date" autocomplete="off"/>
<label class="form-label" for="permit_permit_end_date">Permit End Date</label>
<div class="input-group input-group-sm permit_permit_end_date">
<input type="text" class="form-control form-control-sm date-mask" name="permit_permit_end_date" id="permit_permit_end_date" autocomplete="off"/>
<button class="btn btn-sm btn-outline-primary btnPermitEndDateCalendar" type="button" data-bs-toggle="tooltip" data-bs-title="Calendar" data-bs-custom-class="custom-tooltip" tabindex="-1">
<i class="bi bi-calendar3"/>
</button>
@@ -148,7 +148,7 @@
<xsl:choose>
<xsl:when test="count(//rdis/record) > 0">
<xsl:when test="count(//permits/record) > 0">
<div class="card mt-3">
@@ -183,7 +183,7 @@
<div class="input-group-text">
<i class="bi bi-list-ol"/>
</div>
<select class="form-select" name="rdis_per_page" id="rdis_per_page">
<select class="form-select" name="permits_per_page" id="permits_per_page">
<option value="20">20</option>
<option value="40">40</option>
<option value="60">60</option>
@@ -199,7 +199,7 @@
<div class="buttons mt-1 mb-1">
<xsl:if test="count(//rdis/record) > 0">
<xsl:if test="count(//permits/record) > 0">
<button type="button" class="btn btn-sm btn-primary me-2 mb-2 btnSelectAll">
<i class="bi bi-check2-square me-2"/>Select All</button>
</xsl:if>
@@ -268,7 +268,7 @@
<xsl:choose>
<xsl:when test="count(//rdis/record) = 0">
<xsl:when test="count(//permits/record) = 0">
@@ -282,19 +282,19 @@
<div class="table-responsive scrollable">
<table class="table table-sm table-striped table-hover base-table" id="rdis-table">
<table class="table table-sm table-striped table-hover base-table" id="permits-table">
<thead class="sticky-header" data-theme="{$THEME}">
<th class="text-center">Select</th>
<th class="sortable text-nowrap" data-order-by="rdi_county" >County</th>
<th class="sortable text-nowrap" data-order-by="rdi_sub_div_name">Subdivison/Project Name</th>
<th class="sortable text-nowrap" data-order-by="rdi_project_addr">Address</th>
<th class="text-nowrap" data-order-by="rdi_project_city">City</th>
<th class="text-nowrap" data-order-by="rdi_state" >State</th>
<th class="text-nowrap" data-order-by="rdi_zip" >Zip</th>
<th class="sortable text-nowrap" data-order-by="permit_county" >County</th>
<th class="sortable text-nowrap" data-order-by="permit_sub_div_name">Subdivison/Project Name</th>
<th class="sortable text-nowrap" data-order-by="permit_project_addr">Address</th>
<th class="text-nowrap" data-order-by="permit_project_city">City</th>
<th class="text-nowrap" data-order-by="permit_state" >State</th>
<th class="text-nowrap" data-order-by="permit_zip" >Zip</th>
<th class="text-nowrap" >Builder</th>
<th class="sortable text-nowrap" data-order-by="rdi_permit_date" >Permit Date</th>
<th class="sortable text-nowrap" data-order-by="permit_permit_date" >Permit Date</th>
<th class="text-nowrap" >Sq. Ft. </th>
<th class="text-nowrap" >Value</th>
@@ -302,7 +302,7 @@
<tbody>
<xsl:apply-templates select="//rdis"/>
<xsl:apply-templates select="//permits"/>
</tbody>
@@ -382,54 +382,54 @@
<!-- Template for RDI rows -->
<xsl:template match="rdis/record">
<xsl:template match="permits/record">
<tr class="hoverable rdi-row text-nowrap" data-rdi-serial="{rdi_serial}">
<tr class="hoverable permit-row text-nowrap" data-permit-serial="{permit_serial}">
<td class="checkbox text-center selection-checkboxes selection-area">
<input type="checkbox" class="selection-checkbox selection-area" name="selected[]" value="{rdi_serial}">
<input type="checkbox" class="selection-checkbox selection-area" name="selected[]" value="{permit_serial}">
</input>
<span class="selection-area user-select-none">&#160;</span>
</td>
<td class="rdi_county filterable">
<xsl:value-of select="rdi_county_name_verbose"/>
<td class="permit_county filterable">
<xsl:value-of select="permit_county_name_verbose"/>
</td>
<td class="rdi_sub_div_name text-nowrap filterable">
<xsl:value-of select="rdi_sub_div_name"/>
<td class="permit_sub_div_name text-nowrap filterable">
<xsl:value-of select="permit_sub_div_name"/>
</td>
<td class="rdi_address text-nowrap filterable">
<xsl:value-of select="rdi_project_addr"/>
<td class="permit_address text-nowrap filterable">
<xsl:value-of select="permit_project_addr"/>
</td>
<td class="rdi_address text-nowrap">
<xsl:value-of select="rdi_project_city"/>
<td class="permit_address text-nowrap">
<xsl:value-of select="permit_project_city"/>
</td>
<td class="rdi_address text-nowrap">
<xsl:value-of select="rdi_state"/>
<td class="permit_address text-nowrap">
<xsl:value-of select="permit_state"/>
</td>
<td class="rdi_address text-nowrap">
<xsl:value-of select="rdi_zip"/>
<td class="permit_address text-nowrap">
<xsl:value-of select="permit_zip"/>
</td>
<td class="rdi_company filterable">
<xsl:value-of select="rdi_company"/>
<td class="permit_company filterable">
<xsl:value-of select="permit_company"/>
</td>
<td class="rdi_permit_date filterable">
<xsl:value-of select="rdi_permit_date_verbose"/>
<td class="permit_permit_date filterable">
<xsl:value-of select="permit_permit_date_verbose"/>
</td>
<td class="rdi_value filterable">
<xsl:value-of select="rdi_size_verbose"/>
<td class="permit_value filterable">
<xsl:value-of select="permit_size_verbose"/>
</td>
<td class="rdi_value filterable">
<xsl:value-of select="rdi_value_verbose"/>
<td class="permit_value filterable">
<xsl:value-of select="permit_value_verbose"/>
</td>
</tr>
@@ -443,9 +443,9 @@
<option value="{county_serial}" data-tokens="{county_serial}">
<!-- <xsl:if test="//searchhistory/record/searchhistory_parameters/permitfact_county/id = subscriptioncounty_county">
<xsl:if test="//searchhistory/record/searchhistory_parameters/permit_county/id = county_serial">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>-->
</xsl:if>
<xsl:value-of select="county_name"/>
</option>