From 905a2d0ede40ece33f8cd59f5ad83298c8d24f9a Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Wed, 15 Jan 2025 17:14:49 +0100 Subject: [PATCH] Added Document upload to ConstructionConsent Owners --- .../ConstructionConsent/Consentform.pdf.php | 2 +- Layout/default/ConstructionConsent/View.php | 239 +++++++++++++++--- .../ConstructionConsentController.php | 2 +- .../ConstructionConsentFile.php | 8 +- .../ConstructionConsentOwner.php | 14 + .../ConstructionConsentOwnerController.php | 119 +++++++++ .../ConstructionConsentOwnerFile.php | 180 +++++++++++++ ..._create_contruction_consent_owner_file.php | 37 +++ 8 files changed, 557 insertions(+), 44 deletions(-) create mode 100644 application/ConstructionConsentOwnerFile/ConstructionConsentOwnerFile.php create mode 100644 db/migrations/20250115135530_create_contruction_consent_owner_file.php diff --git a/Layout/default/ConstructionConsent/Consentform.pdf.php b/Layout/default/ConstructionConsent/Consentform.pdf.php index dd0804b4a..5f32f2ddd 100644 --- a/Layout/default/ConstructionConsent/Consentform.pdf.php +++ b/Layout/default/ConstructionConsent/Consentform.pdf.php @@ -329,7 +329,7 @@

Übersichtsplan / Planskizze

file): ?> - + diff --git a/Layout/default/ConstructionConsent/View.php b/Layout/default/ConstructionConsent/View.php index 276add1bb..97ffbda5f 100644 --- a/Layout/default/ConstructionConsent/View.php +++ b/Layout/default/ConstructionConsent/View.php @@ -38,7 +38,7 @@ $pagination_entity_name = "Adressen";
-
+
@@ -127,7 +127,7 @@ $pagination_entity_name = "Adressen";
-
+
@@ -140,41 +140,71 @@ $pagination_entity_name = "Adressen"; owners) || !count($item->owners)): ?> Noch keine Besitzer bekannt - owners as $owner): ?> -
-
- - - - - - - - - - - - - - - - - - - - - - - -
Name:name?>
Anschrift: - street?>
- zip?> city?>
- country?> -
Telefon:phone?>
Fax:fax?>
Email:email?>
Anfragestatusstatus, "consent")?>
Anfrage Resultatresult) ? __($item->result, "consent") : ""?>
- $owner->id])?>"> Zustimmungserklärungsformular herunterladen -
-
- + + + + + + + + + owners as $owner): ?> + + + + + + + + + +
Name/AnschriftTelefon
Fax
Email
AnfragestatusErgebnis
+ $owner->id])?>" title="Zustimmungserklärungsformular herunterladen"> + + name?>
+ street?>
+ zip?> city?>
+ country?> +
+ phone?>
+ fax?>
+ email?> +
+ status, "consent")?> + + + result) ? __($owner->result, "consent") : ""?> + + +
+ files as $file): ?> + $file->file_id])?>"> filename?>
+ +
+ +
+ +
@@ -255,13 +285,146 @@ $pagination_entity_name = "Adressen";
+ + diff --git a/application/ConstructionConsent/ConstructionConsentController.php b/application/ConstructionConsent/ConstructionConsentController.php index 9e110303d..3a77154a9 100644 --- a/application/ConstructionConsent/ConstructionConsentController.php +++ b/application/ConstructionConsent/ConstructionConsentController.php @@ -167,7 +167,7 @@ class ConstructionConsentController extends mfBaseController { $this->layout()->set("consent", $cc); //return true; - $filename = $cc->createConsentFormPdf(); + $filename = $cc->createConsentFormPdf($owner); if(!$filename) { $this->layout()->setFlash("Beim Erstellen des PDFs ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", "error"); $this->redirect("ConstructionConsent", "View", ["id" => $cc->id]); diff --git a/application/ConstructionConsentFile/ConstructionConsentFile.php b/application/ConstructionConsentFile/ConstructionConsentFile.php index 8a04cf568..fdd2977ae 100644 --- a/application/ConstructionConsentFile/ConstructionConsentFile.php +++ b/application/ConstructionConsentFile/ConstructionConsentFile.php @@ -160,10 +160,10 @@ class ConstructionConsentFile extends mfBaseModel { $db = FronkDB::singleton(); //var_dump($filter);exit; - if(array_key_exists("mailtemplate_id", $filter)) { - $mailtemplate_id = $filter['mailtemplate_id']; - if(is_numeric($mailtemplate_id)) { - $where .= " AND ConstructionConsentFile.`mailtemplate_id` = $mailtemplate_id"; + if(array_key_exists("constructionconsent_id", $filter)) { + $constructionconsent_id = $filter['constructionconsent_id']; + if(is_numeric($constructionconsent_id)) { + $where .= " AND ConstructionConsentFile.`constructionconsent_id` = $constructionconsent_id"; } } diff --git a/application/ConstructionConsentOwner/ConstructionConsentOwner.php b/application/ConstructionConsentOwner/ConstructionConsentOwner.php index 94ad5b59f..b1d68c0cf 100644 --- a/application/ConstructionConsentOwner/ConstructionConsentOwner.php +++ b/application/ConstructionConsentOwner/ConstructionConsentOwner.php @@ -2,10 +2,24 @@ class ConstructionConsentOwner extends mfBaseModel { private $consent; + private $files; + private $result_file; + public function getProperty($name) { if($this->$name == null) { + if($name == "files") { + if(!$this->id) return null; + $files = ConstructionConsentOwnerFile::search(["constructionconsentowner_id" => $this->id]); + if(count($files)) { + foreach($files as $file) { + $this->files[$file->filename] = $file; + } + } + return $this->files; + } + if($name == "consent") { $consent = new ConstructionConsent($this->constructionconsent_id); if($consent->id) { diff --git a/application/ConstructionConsentOwner/ConstructionConsentOwnerController.php b/application/ConstructionConsentOwner/ConstructionConsentOwnerController.php index 8b69c2476..0f9bf12ef 100644 --- a/application/ConstructionConsentOwner/ConstructionConsentOwnerController.php +++ b/application/ConstructionConsentOwner/ConstructionConsentOwnerController.php @@ -16,6 +16,44 @@ class ConstructionConsentOwnerController extends mfBaseController } } + protected function uploadDocumentAction() { + $owner_id = $this->request->owner_id; + $filename = trim($this->request->name); + + $owner = new ConstructionConsentOwner($owner_id); + if(!$owner->id) { + $this->layout()->setFlash("Besitzer nicht gefunden!", "error"); + $this->redirect("ConstructionConsent"); + } + + if(is_array($_FILES) && array_key_exists("consentOwnerUpload", $_FILES) && !$_FILES['consentOwnerUpload']['error']) { + try { + // returns File object or throws Exception on error + $file = mfUpload::handleFormUpload("consentOwnerUpload", false, TT_CONSTRUCTIONCONSENT_FILE_UPLOAD_SUBFOLDER); + } catch (Exception $ex) { + $this->layout()->setFlash("Fehler beim Hochladen: " . $ex->getMessage(), "warning"); + return $this->editAction(); + } + + $ccof = ConstructionConsentOwnerFile::create([ + 'constructionconsentowner_id' => $owner->id, + 'file_id' => $file->id, + 'filename' => $filename, + ]); + + if(!$ccof->save()) { + $this->layout()->setFlash("Fehler beim Hochladen", "error"); + $this->redirect("ConstructionConsent", "View", ["id" => $owner->constructionconsent_id]); + } + + $this->layout()->setFlash("Datei erfolgreich hochgeladen", "success"); + $this->redirect("ConstructionConsent", "View", ["id" => $owner->constructionconsent_id]); + } + + $this->layout()->setFlash("Keine Datei ausgewählt", "info"); + $this->redirect("ConstructionConsent", "View", ["id" => $owner->constructionconsent_id]); + } + protected function saveAction() { $r = $this->request; @@ -67,4 +105,85 @@ class ConstructionConsentOwnerController extends mfBaseController $this->redirect("ConstructionConsent", "View", ["id" => $cc_id]); } + + protected function apiAction() { + if(!$this->me->is(["Admin"])) { + $this->redirect("Dashboard"); + } + $do = $this->request->do; + $data = []; + + switch($do) { + case "updateStatus": + $return = $this->updateStatusApi(); + break; + case "updateResult": + $return = $this->updateResultApi(); + break; + default: + $this->log->warn(__METHOD__ . ": Called API function '$do' does not exist"); + $return = false; + } + + if(!is_array($return) || !count($return)) { + $data = ["status" => "error"]; + $this->returnJson($data); + } + $data['status'] = "OK"; + $data['result'] = $return; + $this->returnJson($data); + } + + private function updateStatusApi() { + $owner_id = trim($this->request->id); + $new_status = trim($this->request->status); + + $owner = new ConstructionConsentOwner($owner_id); + if(!$owner->id) { + return false; + } + + if(!in_array($new_status, ["new", "requested", "answered"])) { + return false; + } + + $owner->status = $new_status; + if(!$owner->save()) { + return false; + } + + return ["message" => "Status saved successfully", "update" => ["id" => $owner->id, "status" => $owner->status, "status_text" => __($owner->status, "consent")]]; + } + + private function updateResultApi() { + $owner_id = trim($this->request->id); + $new_result = trim($this->request->result); + + $owner = new ConstructionConsentOwner($owner_id); + if(!$owner->id) { + return false; + } + + // allow empty result + if($new_result) { + if(!in_array($new_result, ["success", "failure"])) { + return false; + } + + $owner->result = $new_result; + } else { + $owner->result = null; + } + + if(!$owner->save()) { + return false; + } + + if($owner->result) { + return ["message" => "Result saved successfully", "update" => ["id" => $owner->id, "result" => $owner->result, "result_text" => __($owner->result, "consent")]]; + } else { + return ["message" => "Result saved successfully", "update" => ["id" => $owner->id, "result" => null, "result_text" => ""]]; + } + + } } \ No newline at end of file diff --git a/application/ConstructionConsentOwnerFile/ConstructionConsentOwnerFile.php b/application/ConstructionConsentOwnerFile/ConstructionConsentOwnerFile.php new file mode 100644 index 000000000..499e4e5f6 --- /dev/null +++ b/application/ConstructionConsentOwnerFile/ConstructionConsentOwnerFile.php @@ -0,0 +1,180 @@ +$name == null) { + + if($name == "creator") { + $user = mfValuecache::singleton()->get("Worker-id-" . $this->create_by); + if($user) { + $this->creator = $user; + return $this->creator; + } + $this->creator = new User($this->create_by); + if($this->creator->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->create_by, $this->creator); + } + return $this->creator; + } + + if($name == "editor") { + $this->editor = new User($this->edit_by); + return $this->editor; + } + + $classname = ucfirst($name); + $idfield = $name . "_id"; + $this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-" . $this->$idfield); + if(!$this->$name) { + $this->$name = new $classname($this->$idfield); + } + + if($this->$name->id) { + mfValuecache::singleton()->set("mfObjectmodel-$name-" . $this->$name->id, $this->$name); + return $this->$name; + } else { + return null; + } + } + + return $this->$name; + } + + /******************************** + * Begin static Model functions + */ + + public static function create(array $data) { + $model = new ConstructionConsentOwnerFile(); + + $table_fields = [ + "constructionconsentowner_id", "file_id", "filename", + "create_by", "edit_by", "create", "edit" + ]; + + foreach($data as $field => $value) { + if(in_array($field, $table_fields)) { + $model->$field = $value; + } + } + + $me = new User(); + $me->loadMe(); + + if($model->create_by === null) { + $model->create_by = $me->id; + } + if($model->edit_by === null) { + $model->edit_by = $me->id; + } + + return $model; + } + + public static function getAll() { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("ConstructionConsentOwnerFile", "*", "1 = 1 ORDER BY file_id"); + if($db->num_rows($res)) { + while($data = $db->fetch_object($res)) { + $items[] = new ConstructionConsentOwnerFile($data); + } + } + return $items; + + } + + public static function getFirst($filter = []) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("ConstructionConsentOwnerFile", "*", "$where ORDER BY file_id LIMIT 1"); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new ConstructionConsentOwnerFile($data); + if($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + + public static function count($filter) { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $sql = "SELECT COUNT(*) as cnt FROM `ConstructionConsentOwnerFile` + WHERE $where + "; + + mfLoghandler::singleton()->debug($sql); + $res = $db->query($sql); + if($db->num_rows($res)) { + $data = $db->fetch_object($res); + return $data->cnt; + } + return 0; + } + + public static function search($filter, $limit = false) { + $items = []; + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + + $sql = "SELECT ConstructionConsentOwnerFile.* FROM `ConstructionConsentOwnerFile` + WHERE $where + ORDER BY file_id + "; + + mfLoghandler::singleton()->debug($sql); + if(is_array($limit) && count($limit)) { + if(is_numeric($limit['start']) && is_numeric($limit['count'])) { + $sql .= " LIMIT " . $limit['start'] . ", " . $limit['count']; + } elseif(is_numeric($limit['count'])) { + $sql .= " LIMIT " . $limit['count']; + } + } + + $res = $db->query($sql); + if($db->num_rows($res)) { + while($data = $db->fetch_object($res)) { + $items[] = new ConstructionConsentOwnerFile($data); + } + } + return $items; + } + + private static function getSqlFilter($filter) { + $where = "1=1 "; + + $db = FronkDB::singleton(); + + //var_dump($filter);exit; + if(array_key_exists("constructionconsentowner_id", $filter)) { + $constructionconsentowner_id = $filter['constructionconsentowner_id']; + if(is_numeric($constructionconsentowner_id)) { + $where .= " AND ConstructionConsentOwnerFile.`constructionconsentowner_id` = $constructionconsentowner_id"; + } + } + + if(array_key_exists("file_id", $filter)) { + $file_id = $filter['file_id']; + if(is_numeric($file_id)) { + $where .= " AND ConstructionConsentOwnerFile.`file_id` = $file_id"; + } + } + + //var_dump($filter, $where);exit; + return $where; + } +} \ No newline at end of file diff --git a/db/migrations/20250115135530_create_contruction_consent_owner_file.php b/db/migrations/20250115135530_create_contruction_consent_owner_file.php new file mode 100644 index 000000000..f5503d05a --- /dev/null +++ b/db/migrations/20250115135530_create_contruction_consent_owner_file.php @@ -0,0 +1,37 @@ +getEnvironment() == "thetool") { + $table = $this->table("ConstructionConsentOwnerFile"); + $table->addColumn("constructionconsentowner_id", "integer", ["null" => false]); + $table->addColumn("file_id", "integer", ["null" => false]); + $table->addColumn("filename", "string", ["null" => false]); + $table->addColumn("create_by", "integer", ["null" => false]); + $table->addColumn("edit_by", "integer", ["null" => false]); + $table->addColumn("create", "integer", ["null" => false]); + $table->addColumn("edit", "integer", ["null" => false]); + $table->create(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + $this->table("ConstructionConsentOwnerFile")->drop()->save(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } +}