diff --git a/classes/Consolidation.php b/classes/Consolidation.php
index c7d3112..dfdd7a6 100644
--- a/classes/Consolidation.php
+++ b/classes/Consolidation.php
@@ -2,12 +2,12 @@
class Consolidation extends Base {
- // Variables.
+ // Variables
private $current_user_serial = 0;
- private $current_user_id = "";
- private $current_user_name = "";
- private $current_user_email = "";
+ private $current_user_id = "";
+ private $current_user_name = "";
+ private $current_user_email = "";
// =================
// Class Constructor
@@ -20,9 +20,9 @@ class Consolidation extends Base {
date_default_timezone_set(self::TIMEZONE);
$this->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->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
}
// ======================
@@ -47,6 +47,11 @@ class Consolidation extends Base {
case "run":
+ $XSLParms = array();
+ $permit_record_count = 0;
+ $processed_record_count = 0;
+ $connection = null;
+
$sql_insert = "insert into rdiconsolidations
( rdiconsolidation_permit_facts_id,
@@ -85,150 +90,73 @@ class Consolidation extends Base {
rdiconsolidation_ytd_value,
rdiconsolidation_12mth_prev_permits,
rdiconsolidation_date )
-
- values ( :rdiconsolidation_permit_facts_id,
- :rdiconsolidation_entry_date_str,
- :rdiconsolidation_entry_date,
- :rdiconsolidation_permit_number,
- :rdiconsolidation_permit_date_str,
- :rdiconsolidation_permit_date,
- :rdiconsolidation_project_addr,
- :rdiconsolidation_sub_div_name,
- :rdiconsolidation_project_type,
- :rdiconsolidation_company,
- :rdiconsolidation_address,
- :rdiconsolidation_city,
- :rdiconsolidation_state,
- :rdiconsolidation_zip,
- :rdiconsolidation_phone,
- :rdiconsolidation_project_city,
- :rdiconsolidation_project_state,
- :rdiconsolidation_size,
- :rdiconsolidation_units,
- :rdiconsolidation_building_type,
- :rdiconsolidation_value,
- :rdiconsolidation_work_type,
- :rdiconsolidation_county,
- :rdiconsolidation_lot,
- :rdiconsolidation_dist_ll,
- :rdiconsolidation_ct1,
- :rdiconsolidation_owner_name,
- :rdiconsolidation_owner_address,
- :rdiconsolidation_owner_city,
- :rdiconsolidation_owner_state,
- :rdiconsolidation_owner_zip,
- :rdiconsolidation_owner_phone,
- :rdiconsolidation_ytd_permits,
- :rdiconsolidation_ytd_value,
- :rdiconsolidation_12mth_prev_permits,
- :rdiconsolidation_date ) ";
- $connection = $this->connect();
+ select coalesce(permit_permit_facts_id, 0),
+ coalesce(permit_entry_date_str, ''),
+ coalesce(permit_entry_date, '0000-00-00'),
+ coalesce(permit_permit_number, ''),
+ coalesce(permit_permit_date_str, ''),
+ coalesce(permit_permit_date, '0000-00-00'),
+ coalesce(permit_project_addr, ''),
+ coalesce(permit_sub_div_name, ''),
+ coalesce(permit_project_type, ''),
+ coalesce(permit_company, ''),
+ coalesce(permit_address, ''),
+ coalesce(permit_city, ''),
+ coalesce(permit_state, ''),
+ coalesce(permit_zip, ''),
+ coalesce(permit_phone, ''),
+ coalesce(permit_project_city, ''),
+ coalesce(permit_project_state, ''),
+ coalesce(permit_size, 0),
+ coalesce(permit_units, 0),
+ coalesce(permit_building_type, 0),
+ coalesce(permit_value, 0),
+ coalesce(permit_work_type, 0),
+ coalesce(permit_county, ''),
+ coalesce(permit_lot, ''),
+ coalesce(permit_dist_ll, ''),
+ coalesce(permit_ct1, 0),
+ coalesce(permit_owner_name, ''),
+ coalesce(permit_owner_address, ''),
+ coalesce(permit_owner_city, ''),
+ coalesce(permit_owner_state, ''),
+ coalesce(permit_owner_zip, ''),
+ coalesce(permit_owner_phone, ''),
+ coalesce(permit_ytd_permits, 0),
+ coalesce(permit_ytd_value, 0),
+ coalesce(permit_12mth_prev_permits, 0),
+ current_date()
+ from permits";
- $connection->beginTransaction();
- $statement = $connection->prepare($sql_insert);
+ try {
- $rdi_records = $this->getRdiTable();
- $rdi_record_count = $rdi_records->count();
+ $connection = $this->connect();
- $processed_record_count = 0;
+ $connection->beginTransaction();
- foreach ($rdi_records as $record) {
+ $permit_record_count = (integer) $connection->query("select count(*) from permits")->fetchColumn();
+ $processed_record_count = (integer) $connection->exec($sql_insert);
- $rdiconsolidation_permit_facts_id = (integer) $record->permit_facts_id ?: 0;
- $rdiconsolidation_entry_date_str = (integer) $record->entry_date_str ?: "";
- $rdiconsolidation_entry_date = (string) $record->entry_date ?: "0000-00-00";
- $rdiconsolidation_permit_number = (string) $record->permit_number ?: "";
- $rdiconsolidation_permit_date_str = (string) $record->permit_date_str ?: "";
- $rdiconsolidation_permit_date = (string) $record->permit_date ?: "0000-00-00";
- $rdiconsolidation_project_addr = (string) $record->project_addr ?: "";
- $rdiconsolidation_sub_div_name = (string) $record->sub_div_name ?: "";
- $rdiconsolidation_project_type = (string) $record->project_type ?: "";
- $rdiconsolidation_company = (string) $record->company ?: "";
- $rdiconsolidation_address = (string) $record->address ?: "";
- $rdiconsolidation_city = (string) $record->city ?: "";
- $rdiconsolidation_state = (string) $record->state ?: "";
- $rdiconsolidation_zip = (string) $record->zip ?: "";
- $rdiconsolidation_phone = (string) $record->phone ?: "";
- $rdiconsolidation_project_city = (string) $record->project_city ?: "";
- $rdiconsolidation_project_state = (string) $record->project_state ?: "";
- $rdiconsolidation_size = (integer) $record->size ?: 0;
- $rdiconsolidation_units = (integer) $record->units ?: 0;
- $rdiconsolidation_building_type = (integer) $record->building_type ?: 0;
- $rdiconsolidation_value = (integer) $record->value ?: 0;
- $rdiconsolidation_work_type = (integer) $record->work_type ?: 0;
- $rdiconsolidation_county = (string) $record->county ?: "";
- $rdiconsolidation_lot = (string) $record->lot ?: "";
- $rdiconsolidation_dist_ll = (string) $record->dist_ll ?: "";
- $rdiconsolidation_ct1 = (integer) $record->ct1 ?: 0;
- $rdiconsolidation_owner_name = (string) $record->owner_name ?: "";
- $rdiconsolidation_owner_address = (string) $record->owner_address ?: "";
- $rdiconsolidation_owner_city = (string) $record->owner_city ?: "";
- $rdiconsolidation_owner_state = (string) $record->owner_state ?: "";
- $rdiconsolidation_owner_zip = (string) $record->owner_zip ?: "";
- $rdiconsolidation_owner_phone = (string) $record->owner_phone ?: "";
- $rdiconsolidation_ytd_permits = (integer) $record->ytd_permits ?: 0;
- $rdiconsolidation_ytd_value = (integer) $record->ytd_value ?: 0;
- $rdiconsolidation_12mth_prev_permits = (integer) $record->{"12mth_prev_permits"} ?: 0;
- $rdiconsolidation_date = date("Y-m-d");
-
- $statement->bindValue(":rdiconsolidation_permit_facts_id", $rdiconsolidation_permit_facts_id);
- $statement->bindValue(":rdiconsolidation_entry_date_str", $rdiconsolidation_entry_date_str);
- $statement->bindValue(":rdiconsolidation_entry_date", $rdiconsolidation_entry_date);
- $statement->bindValue(":rdiconsolidation_permit_number", $rdiconsolidation_permit_number);
- $statement->bindValue(":rdiconsolidation_permit_date_str", $rdiconsolidation_permit_date_str);
- $statement->bindValue(":rdiconsolidation_permit_date", $rdiconsolidation_permit_date);
- $statement->bindValue(":rdiconsolidation_project_addr", $rdiconsolidation_project_addr);
- $statement->bindValue(":rdiconsolidation_sub_div_name", $rdiconsolidation_sub_div_name);
- $statement->bindValue(":rdiconsolidation_project_type", $rdiconsolidation_project_type);
- $statement->bindValue(":rdiconsolidation_company", $rdiconsolidation_company);
- $statement->bindValue(":rdiconsolidation_address", $rdiconsolidation_address);
- $statement->bindValue(":rdiconsolidation_city", $rdiconsolidation_city);
- $statement->bindValue(":rdiconsolidation_state", $rdiconsolidation_state);
- $statement->bindValue(":rdiconsolidation_zip", $rdiconsolidation_zip);
- $statement->bindValue(":rdiconsolidation_phone", $rdiconsolidation_phone);
- $statement->bindValue(":rdiconsolidation_project_city", $rdiconsolidation_project_city);
- $statement->bindValue(":rdiconsolidation_project_state", $rdiconsolidation_project_state);
- $statement->bindValue(":rdiconsolidation_size", $rdiconsolidation_size);
- $statement->bindValue(":rdiconsolidation_units", $rdiconsolidation_units);
- $statement->bindValue(":rdiconsolidation_building_type", $rdiconsolidation_building_type);
- $statement->bindValue(":rdiconsolidation_value", $rdiconsolidation_value);
- $statement->bindValue(":rdiconsolidation_work_type", $rdiconsolidation_work_type);
- $statement->bindValue(":rdiconsolidation_county", $rdiconsolidation_county);
- $statement->bindValue(":rdiconsolidation_lot", $rdiconsolidation_lot);
- $statement->bindValue(":rdiconsolidation_dist_ll", $rdiconsolidation_dist_ll);
- $statement->bindValue(":rdiconsolidation_ct1", $rdiconsolidation_ct1);
- $statement->bindValue(":rdiconsolidation_owner_name", $rdiconsolidation_owner_name);
- $statement->bindValue(":rdiconsolidation_owner_address", $rdiconsolidation_owner_address);
- $statement->bindValue(":rdiconsolidation_owner_city", $rdiconsolidation_owner_city);
- $statement->bindValue(":rdiconsolidation_owner_state", $rdiconsolidation_owner_state);
- $statement->bindValue(":rdiconsolidation_owner_zip", $rdiconsolidation_owner_zip);
- $statement->bindValue(":rdiconsolidation_owner_phone", $rdiconsolidation_owner_phone);
- $statement->bindValue(":rdiconsolidation_ytd_permits", $rdiconsolidation_ytd_permits);
- $statement->bindValue(":rdiconsolidation_ytd_value", $rdiconsolidation_ytd_value);
- $statement->bindValue(":rdiconsolidation_12mth_prev_permits", $rdiconsolidation_12mth_prev_permits);
- $statement->bindValue(":rdiconsolidation_date", $rdiconsolidation_date);
-
- if (!$statement->execute()) {
-
- $connection->rollBack();
- $this->debug($connection->errorInfo()[2]);
+ if ($processed_record_count !== $permit_record_count) {
+ throw new RuntimeException("Record counts did not match. Rolling back database. Contact Support.");
}
- $processed_record_count++;
- }
-
- if ($processed_record_count !== $rdi_record_count) {
- $connection->rollBack();
- $XSLParms["CONSOLIDATION_ERROR"] = "Record Counts Did not match. Rolling Back Database. Contact Support.";
- } else {
$connection->commit();
- $this->executeSQL("truncate rdis");
+ $connection->exec("truncate permits");
+ } catch (Exception $e) {
+
+ if (($connection instanceof PDO) && $connection->inTransaction()) {
+ $connection->rollBack();
+ }
+
+ $XSLParms["CONSOLIDATION-ERROR"] = $e->getMessage();
}
- $XSLParms["RDI-RECORD-COUNT"] = $rdi_record_count;
+ $XSLParms["RDI-RECORD-COUNT"] = $permit_record_count;
$XSLParms["PROCESSED-RECORD-COUNT"] = $processed_record_count;
- $content = $this->applyXSL("", $this->getXSL("consolidationResults"), $XSLParms);
+ $content = $this->applyXSL("", $this->getXSL("consolidationResults"), $XSLParms);
+
$this->displayContent($content);
break;
@@ -239,16 +167,6 @@ class Consolidation extends Base {
}
}
- // ====================
- // Return an RDI Object
- // ====================
-
- public function getRdiTable() {
-
- $SQL = "SELECT * FROM permits";
-
- return $this->getTable("rdis", $SQL);
- }
}
?>
diff --git a/classes/Import.php b/classes/Import.php
index 49d5f32..5e4539a 100644
--- a/classes/Import.php
+++ b/classes/Import.php
@@ -45,7 +45,11 @@ class Import extends Base {
case "prompt":
- $content = $this->applyXSL("", $this->getXSL("uploadCSVFile"));
+ $import_type = filter_input(INPUT_POST, "import_type") ?: "incremental";
+
+ $XSLParms['IMPORT-TYPE'] = $import_type;
+
+ $content = $this->applyXSL("", $this->getXSL("uploadCSVFile"), $XSLParms);
$this->displayContent($content);
break;
@@ -54,6 +58,7 @@ class Import extends Base {
$XSLParms['UPLOAD_STATUS'] = "UPLOAD SUCCESSFUL";
$environment = (string) $this->getSettings()->Environment ?: "Production";
+ $upload_type = filter_input(INPUT_POST, 'upload_type') ?: "incremental";
if (empty($environment)) {
$this->logError("Invalid Environment ({$environment}). " . __METHOD__);
@@ -63,30 +68,57 @@ class Import extends Base {
// Process the Attachment
- if (!empty($_FILES)) {
+ if (empty($_FILES["csvfile"])) {
+ $this->displayNotice("No CSV file was uploaded.");
+ return;
+ }
- if (!is_dir($environment_directory)) {
- mkdir($environment_directory);
- }
+ if (!is_dir($environment_directory) && !mkdir($environment_directory, 0775, true)) {
+ $this->displayNotice("Unable to create the upload directory. Please contact Support.");
+ return;
+ }
- $tempname = $_FILES["csvfile"]["tmp_name"];
- $filename = $_FILES["csvfile"]["name"];
+ if ($_FILES["csvfile"]["error"] !== UPLOAD_ERR_OK) {
+ $this->displayNotice("The CSV file upload failed. Please try again.");
+ return;
+ }
- if (empty($tempname) or empty($filename)) {
- return;
- }
+ $tempname = $_FILES["csvfile"]["tmp_name"];
+ $filename = basename($_FILES["csvfile"]["name"]);
- if (!move_uploaded_file($tempname, "{$environment_directory}/{$filename}")) {
- $XSLParms['UPLOAD_STATUS'] = "UPLOAD FAILED";
- }
+ if (empty($tempname) or empty($filename)) {
+ $this->displayNotice("The uploaded CSV file could not be read. Please try again.");
+ return;
}
$file_directory = "{$environment_directory}/{$filename}";
- $import = $this->parseCSVFile($file_directory);
+ if (!move_uploaded_file($tempname, $file_directory)) {
+ $this->displayNotice("Unable to save the uploaded CSV file. Please contact Support.");
+ return;
+ }
- $content = $this->applyXSL("", $this->getXSL("uploadMessage"), $XSLParms);
- $this->displayContent($content);
+ if ($upload_type === 'incremental') {
+ $this->parseCSVFile($file_directory);
+ $content = $this->applyXSL("", $this->getXSL("uploadMessage"), $XSLParms);
+ $this->displayContent($content);
+ return;
+ }
+
+ if ($upload_type === 'full') {
+
+ $successful = $this->createImportRequest($file_directory);
+
+ if (!$successful) {
+ $this->displayNotice("An error occurred while creating the import request. Please contact Support.");
+ return;
+ }
+
+ $this->displayNotice("Your import has been queued. You will receive a notification when it is complete.");
+ return;
+ }
+
+ $this->displayNotice("Invalid upload type. Please contact Support.");
break;
}
@@ -143,73 +175,74 @@ class Import extends Base {
$County = (new Counties())->getCountiesByName($County)->record->county_serial;
$SQL = "INSERT INTO permits (
- permit_permit_facts_id,
- permit_entry_date,
- permit_permit_number,
- permit_permit_date,
- permit_project_addr,
- permit_sub_div_name,
- permit_project_type,
- permit_company,
- permit_address,
- permit_city,
- permit_state,
- permit_zip,
- permit_phone,
- permit_project_city,
- permit_project_state,
- permit_size,
- permit_units,
- permit_building_type,
- permit_value,
- permit_work_type,
- permit_county,
- permit_lot,
- permit_dist_ll,
- permit_ct1,
- permit_owner_name,
- permit_owner_address,
- permit_owner_city,
- permit_owner_state,
- permit_owner_zip,
- permit_owner_phone,
- permit_ytd_permits,
- permit_ytd_value,
- permit_12mth_prev_permits )
+ permit_permit_facts_id,
+ permit_entry_date,
+ permit_permit_number,
+ permit_permit_date,
+ permit_project_addr,
+ permit_sub_div_name,
+ permit_project_type,
+ permit_company,
+ permit_address,
+ permit_city,
+ permit_state,
+ permit_zip,
+ permit_phone,
+ permit_project_city,
+ permit_project_state,
+ permit_size,
+ permit_units,
+ permit_building_type,
+ permit_value,
+ permit_work_type,
+ permit_county,
+ permit_lot,
+ permit_dist_ll,
+ permit_ct1,
+ permit_owner_name,
+ permit_owner_address,
+ permit_owner_city,
+ permit_owner_state,
+ permit_owner_zip,
+ permit_owner_phone,
+ permit_ytd_permits,
+ permit_ytd_value,
+ permit_12mth_prev_permits )
+
VALUES (
- :permit_permit_facts_id,
- :permit_entry_date,
- :permit_permit_number,
- :permit_permit_date,
- :permit_project_addr,
- :permit_sub_div_name,
- :permit_project_type,
- :permit_company,
- :permit_address,
- :permit_city,
- :permit_state,
- :permit_zip,
- :permit_phone,
- :permit_project_city,
- :permit_project_state,
- :permit_size,
- :permit_units,
- :permit_building_type,
- :permit_value,
- :permit_work_type,
- :permit_county,
- :permit_lot,
- :permit_dist_ll,
- :permit_ct1,
- :permit_owner_name,
- :permit_owner_address,
- :permit_owner_city,
- :permit_owner_state,
- :permit_owner_zip,
- :permit_owner_phone,
- :permit_ytd_permits,
- :permit_ytd_value,
- :permit_12mth_prev_permits )";
+ :permit_permit_facts_id,
+ :permit_entry_date,
+ :permit_permit_number,
+ :permit_permit_date,
+ :permit_project_addr,
+ :permit_sub_div_name,
+ :permit_project_type,
+ :permit_company,
+ :permit_address,
+ :permit_city,
+ :permit_state,
+ :permit_zip,
+ :permit_phone,
+ :permit_project_city,
+ :permit_project_state,
+ :permit_size,
+ :permit_units,
+ :permit_building_type,
+ :permit_value,
+ :permit_work_type,
+ :permit_county,
+ :permit_lot,
+ :permit_dist_ll,
+ :permit_ct1,
+ :permit_owner_name,
+ :permit_owner_address,
+ :permit_owner_city,
+ :permit_owner_state,
+ :permit_owner_zip,
+ :permit_owner_phone,
+ :permit_ytd_permits,
+ :permit_ytd_value,
+ :permit_12mth_prev_permits )";
$statement = $connection->prepare($SQL);
@@ -255,6 +288,48 @@ class Import extends Base {
return true;
}
+ // =====================
+ // Create Import Request
+ // =====================
+
+ public function createImportRequest($filepath = "") {
+
+ if (!$filepath) {
+ return false;
+ }
+
+ $SQL = "insert into importjobs
+
+ ( importjob_file_path,
+ importjob_notified,
+ importjob_creator,
+ importjob_created )
+
+ VALUES ( :importjob_file_path,
+ :importjob_notified,
+ :importjob_creator,
+ :importjob_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":importjob_file_path", "../{$filepath}", PDO::PARAM_STR);
+ $statement->bindValue(":importjob_notified", false, PDO::PARAM_BOOL);
+ $statement->bindValue(":importjob_creator", $this->current_user_name, PDO::PARAM_STR);
+ $statement->bindValue(":importjob_created", $this->getTimestamp());
+
+ if (!$statement->execute()) {
+ return false;
+ }
+
+ $to = $this->getSettings()->DeveloperEmail;
+ $subject = "CSV Import Jobs Queued";
+ $message = "Import initialized successfully. Processing will start momentarily.";
+
+ (new Email())->sendEmail($to, $subject, $message);
+
+ return true;
+ }
+
// ========================
// Return an Formatted Date
// ========================
diff --git a/classes/ImportLargeCSV.php b/classes/ImportLargeCSV.php
new file mode 100644
index 0000000..048840d
--- /dev/null
+++ b/classes/ImportLargeCSV.php
@@ -0,0 +1,255 @@
+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;
+ }
+
+ // =====================
+ // Create Import Request
+ // =====================
+
+ public function createImportRequest() {
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $subscription = (new Subscriptions())->getSubscription($subscription_serial);
+
+ if ($subscription->count() === 0) {
+ $this->logError("Invalid Subscription ({$subscription_serial}): " . __METHOD__);
+ }
+
+ $import_type = filter_input(INPUT_POST, "import_type") ?: "";
+ $report_type = filter_input(INPUT_POST, "report_type") ?: "";
+
+ $importjob_import_type = str_replace(' ', '', $subscription->record->subscription_full_title) . "$import_type";
+ $importjob_file_name = str_replace(' ', '_', $subscription->record->subscription_full_title) . "_all_records.{$report_type}";
+// $importjob_file_name = str_replace('&', 'And', $subscription->record->subscription_full_title) . "_all_records.{$report_type}";
+
+ $SQL = "insert into importjobs
+
+ ( importjob_subscription,
+ importjob_import_type,
+ importjob_file_name,
+ importjob_file_type,
+ importjob_creator,
+ importjob_created )
+
+ VALUES ( :importjob_subscription,
+ :importjob_import_type,
+ :importjob_file_name,
+ :importjob_file_type,
+ :importjob_creator,
+ :importjob_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":importjob_subscription", $subscription_serial);
+ $statement->bindValue(":importjob_import_type", $importjob_import_type);
+ $statement->bindValue(":importjob_file_name", $importjob_file_name);
+ $statement->bindValue(":importjob_file_type", strtoupper($report_type));
+ $statement->bindValue(":importjob_creator", $this->current_user_serial);
+ $statement->bindValue(":importjob_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ $this->displayNotice("Your import has been queued. You will receive an notification when it is ready.");
+ }
+
+ // ============
+ // User Imports
+ // ============
+
+ public function usersImports() {
+
+ $imports = $this->getUsersImports();
+ $popovers = (new Popovers())->getPopovers();
+
+ $this->markImportsAsSeen();
+
+ $XML = $this->mergeXML($imports, "