Created view to calculate statistics for YTD Permits. Also changed the term RDI to Permit for consistency and understanding

This commit is contained in:
James Richie
2026-04-04 19:14:39 -04:00
parent 1499685dd0
commit a24bcfbae7
25 changed files with 1332 additions and 1171 deletions
+104 -117
View File
@@ -57,13 +57,16 @@ class PermitsByBuilder extends Base {
// Populate Entry Dates with what was searched for if provided or users entry dates if no entry dates were provided
$searchhistory->record->searchhistory_parameters->rdi_entry_start_date = $permits->record->rdi_entry_start_date;
$searchhistory->record->searchhistory_parameters->rdi_entry_end_date = $permits->record->rdi_entry_end_date;
$searchhistory->record->searchhistory_parameters->permit_entry_start_date = $permits->record->permit_entry_start_date;
$searchhistory->record->searchhistory_parameters->permit_entry_end_date = $permits->record->permit_entry_end_date;
$XML = $this->mergeXML($permits, "<XML/>");
$XML = $this->mergeXML($subscription, $XML);
$XML = $this->mergeXML($popovers, $XML);
// echo $XML;
// die();
$content = $this->applyXSL($XML, $this->getXSL("searchPermitsByBuilder"));
$this->displayContent($content);
}
@@ -75,78 +78,77 @@ class PermitsByBuilder extends Base {
public function getPermits($permit_area, $projecttype) {
// Sanitize inputs
$rdi_company = filter_input(INPUT_POST, "rdi_company") ?: "";
$rdi_and_or = filter_input(INPUT_POST, "rdi_and_or") ?: "OR";
$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_company = filter_input(INPUT_POST, "permit_company") ?: "";
$permit_and_or = filter_input(INPUT_POST, "permit_and_or") ?: "OR";
$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") ?: "";
$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"])) {
$rdi_and_or = "OR";
if (!in_array(strtoupper($permit_and_or), ["AND", "OR"])) {
$permit_and_or = "OR";
}
// Pagination settings
$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 = strtoupper(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_company";
$permits_order_direction = strtoupper(filter_input(INPUT_POST, "permits_order_direction") ?: "ASC");
// Ensure valid order by column
$allowed_order_columns = ["rdi_permit_number", "rdi_entry_date", "rdi_permit_date", "rdi_company", "rdi_permit_count"];
if (!in_array($rdis_order_by, $allowed_order_columns)) {
$rdis_order_by = "rdi_permit_number";
$allowed_order_columns = ["permit_permit_number", "permit_entry_date", "permit_permit_date", "permit_company", "permit_permit_count"];
if (!in_array($permits_order_by, $allowed_order_columns)) {
$permits_order_by = "order by view_permits.permit_company";
}
// Connect to DB
$connection = $this->connect();
// === count QUERY ===
$SQL = "select count(distinct rdi_company, rdi_address, rdi_city, rdi_state, rdi_zip, rdi_phone_verbose,
rdi_ytd_permits, rdi_ytd_value, rdi_12mth_prev_permits) as totalcount
from view_rdis r
join counties c on r.rdi_county = c.county_serial
where r.rdi_project_type = :rdi_project_type";
$SQL = "select count(distinct permit_company) as totalcount
from view_permits r
join counties c on r.permit_county = c.county_serial
where r.permit_project_type = :permit_project_type";
if ($permit_area != "All") {
$SQL .= " and c.county_area = :permit_area";
}
if (!empty($rdi_company)) {
$SQL .= " and r.rdi_company REGEXP :rdi_company";
if (!empty($permit_company)) {
$SQL .= " and r.permit_company REGEXP :permit_company";
}
if (!empty($rdi_entry_start_date)) {
$SQL .= " $rdi_and_or (r.rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
if (!empty($permit_entry_start_date)) {
$SQL .= " $permit_and_or (r.permit_entry_date between :permit_entry_start_date and :permit_entry_end_date)";
}
if (!empty($rdi_permit_start_date)) {
$SQL .= " $rdi_and_or (r.rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
if (!empty($permit_permit_start_date)) {
$SQL .= " $permit_and_or (r.permit_permit_date between :permit_permit_start_date and :permit_permit_end_date)";
}
$statement = $connection->prepare($SQL);
$statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_project_type", $projecttype, PDO::PARAM_STR);
if ($permit_area != "All") {
$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_entry_start_date)) {
$statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
$statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
if (!empty($permit_entry_start_date)) {
$statement->bindValue(":permit_entry_start_date", $permit_entry_start_date);
$statement->bindValue(":permit_entry_end_date", $permit_entry_end_date);
}
if (!empty($rdi_permit_start_date)) {
$statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
$statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
if (!empty($permit_permit_start_date)) {
$statement->bindValue(":permit_permit_start_date", $permit_permit_start_date);
$statement->bindValue(":permit_permit_end_date", $permit_permit_end_date);
}
$statement->execute();
@@ -172,60 +174,48 @@ class PermitsByBuilder extends Base {
$end = min($count, $start + $this->pagination_size - 1);
// === DATA QUERY ===
$SQL = "select r.rdi_serial, r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone_verbose,
r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits,
count(*) as rdi_permit_count, SUM(r.rdi_value) as rdi_value_verbose,
case
when rdi_12mth_prev_permits is null or rdi_12mth_prev_permits = 0 then ''
/* your 75% rule: current is < 75% of last year */
when (r.rdi_ytd_permits / rdi_12mth_prev_permits) < 0.75 then '='
/* ±5% band */
when ((r.rdi_ytd_permits - rdi_12mth_prev_permits) / rdi_12mth_prev_permits) >= 0.05 then 'up'
when ((r.rdi_ytd_permits - rdi_12mth_prev_permits) / rdi_12mth_prev_permits) <= -0.05 then 'down'
else '='
end as permits_trend
from view_rdis r
join counties c on r.rdi_county = c.county_serial
where r.rdi_project_type = :rdi_project_type";
$SQL = "select view_permits.permit_serial, view_permits.permit_company, count(*) as permit_permit_count, SUM(view_permits.permit_value) as permit_value_verbose,
view_permits.ytd_permits, view_permits.previous_ytd_permits, view_permits.permits_trend, view_permits.previous_ytd_value, view_permits.ytd_value,
view_permits.permit_address, view_permits.permit_city, view_permits.permit_state, view_permits.permit_zip, view_permits.permit_phone_verbose
from view_permits
join counties c on view_permits.permit_county = c.county_serial
where view_permits.permit_project_type = :permit_project_type";
if ($permit_area != "All") {
$SQL .= " and c.county_area = :permit_area";
}
if (!empty($rdi_company)) {
$SQL .= " and r.rdi_company REGEXP :rdi_company";
if (!empty($permit_company)) {
$SQL .= " and view_permits.permit_company REGEXP :permit_company";
}
if (!empty($rdi_entry_start_date)) {
$SQL .= " $rdi_and_or (r.rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
if (!empty($permit_entry_start_date)) {
$SQL .= " $permit_and_or (view_permits.permit_entry_date between :permit_entry_start_date and :permit_entry_end_date)";
}
if (!empty($rdi_permit_start_date)) {
$SQL .= " $rdi_and_or (r.rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
if (!empty($permit_permit_start_date)) {
$SQL .= " $permit_and_or (view_permits.permit_permit_date between :permit_permit_start_date and :permit_permit_end_date)";
}
$SQL .= " group by r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone,
r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits
order by $rdis_order_by $rdis_order_direction
$SQL .= " group by view_permits.permit_company
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);
if ($permit_area != "All") {
$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_entry_start_date)) {
$statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
$statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
if (!empty($permit_entry_start_date)) {
$statement->bindValue(":permit_entry_start_date", $permit_entry_start_date);
$statement->bindValue(":permit_entry_end_date", $permit_entry_end_date);
}
if (!empty($rdi_permit_start_date)) {
$statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
$statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
if (!empty($permit_permit_start_date)) {
$statement->bindValue(":permit_permit_start_date", $permit_permit_start_date);
$statement->bindValue(":permit_permit_end_date", $permit_permit_end_date);
}
$statement->bindValue(":limit", $this->pagination_size, PDO::PARAM_INT);
@@ -233,83 +223,80 @@ class PermitsByBuilder extends Base {
$statement->execute();
$rdis = $this->getTableXML("rdis", $statement);
$permits = $this->getTableXML("permits", $statement);
// Insert 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;
}
// =============================
// Fetch All Permits for Exports
// =============================
public function getAllPermitsByBuilder($permit_area, $projecttype) {
public function getAllPermits($permit_area, $projecttype) {
// Connect to DB
$connection = $this->connect();
// === count QUERY ===
$SQL = "SELECT count(DISTINCT rdi_company, rdi_address, rdi_city, rdi_state, rdi_zip, rdi_phone_verbose,
rdi_ytd_permits, rdi_ytd_value, rdi_12mth_prev_permits) AS count
FROM view_rdis r
JOIN counties c on r.rdi_county = c.county_serial
WHERE r.rdi_project_type = :rdi_project_type";
$SQL = "select count(distinct permit_company) as totalcount
from view_permits r
join counties c on r.permit_county = c.county_serial
where r.permit_project_type = :permit_project_type";
if ($permit_area !== "All") {
if ($permit_area != "All") {
$SQL .= " and c.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);
if ($permit_area !== "All") {
if ($permit_area != "All") {
$statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
}
$statement->execute();
$recordset = $statement->fetch(PDO::FETCH_ASSOC);
$count = $recordset ? (int) $recordset["count"] : 0;
$count = $recordset ? (int) $recordset["totalcount"] : 0;
// === DATA QUERY ===
$SQL = "SELECT r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone_verbose,
r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits,
count(*) AS rdi_permit_count, SUM(r.rdi_value) AS rdi_value
FROM view_rdis r
JOIN counties c on r.rdi_county = c.county_serial
WHERE r.rdi_project_type = :rdi_project_type";
$SQL = "select view_permits.permit_serial, view_permits.permit_company, count(*) as permit_permit_count, SUM(view_permits.permit_value) as permit_value_verbose,
view_permits.ytd_permits, view_permits.previous_ytd_permits, view_permits.permits_trend, view_permits.previous_ytd_value, view_permits.ytd_value,
view_permits.permit_address, view_permits.permit_city, view_permits.permit_state, view_permits.permit_zip, view_permits.permit_phone_verbose
from view_permits
join counties c on view_permits.permit_county = c.county_serial
where view_permits.permit_project_type = :permit_project_type";
if ($permit_area !== "All") {
if ($permit_area != "All") {
$SQL .= " and c.county_area = :permit_area";
}
$SQL .= " group by r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone,
r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits";
$SQL .= " group by view_permits.permit_company order by view_permits.permit_company";
$statement = $connection->prepare($SQL);
$statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
$statement->bindValue(":permit_project_type", $projecttype, PDO::PARAM_STR);
if ($permit_area !== "All") {
if ($permit_area != "All") {
$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;
}
// ======================
@@ -318,20 +305,20 @@ class PermitsByBuilder extends Base {
public function getSelectedPermits($permit_area, $projecttype, $permit_serial = 0) {
$SQL = "SELECT r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone_verbose,
r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits,
count(*) AS rdi_permit_count, SUM(r.rdi_value) AS rdi_value
FROM view_rdis r
JOIN counties c on r.rdi_county = c.county_serial
WHERE r.rdi_project_type = '{$projecttype}' ";
$SQL = "select view_permits.permit_serial, view_permits.permit_company, count(*) as permit_permit_count, SUM(view_permits.permit_value) as permit_value_verbose,
view_permits.ytd_permits, view_permits.previous_ytd_permits, view_permits.permits_trend, view_permits.previous_ytd_value, view_permits.ytd_value,
view_permits.permit_address, view_permits.permit_city, view_permits.permit_state, view_permits.permit_zip, view_permits.permit_phone_verbose
from view_permits
join counties c on view_permits.permit_county = c.county_serial
where view_permits.permit_project_type = '{$projecttype}' ";
if ($permit_area !== "All") {
if ($permit_area != "All") {
$SQL .= " and c.county_area = '$permit_area'";
}
$SQL .= " and rdi_serial in ({$permit_serial}) ";
$SQL .= " group by r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone,
r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits";
$SQL .= " and permit_serial in ({$permit_serial}) ";
$SQL .= " group by view_permits.permit_company order by view_permits.permit_company";
return $this->getTable("permits", $SQL);
}