diff --git a/Layout/default/PreorderProduct/Form.php b/Layout/default/PreorderProduct/Form.php
new file mode 100644
index 000000000..67cfb0251
--- /dev/null
+++ b/Layout/default/PreorderProduct/Form.php
@@ -0,0 +1,180 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/application/PreorderProduct/PreorderProduct.php b/application/PreorderProduct/PreorderProduct.php
new file mode 100644
index 000000000..f558929a6
--- /dev/null
+++ b/application/PreorderProduct/PreorderProduct.php
@@ -0,0 +1,296 @@
+$name == null) {
+
+ if($name == "preorder") {
+ $preorder = PreorderModel::getFirst(["id" => $this->preorder_id]);
+ if(!$preorder) {
+ $this->log->debug(__METHOD__ . ": Preorder " . $this->preorder_id . " not found");
+ return null;
+ }
+ $this->preorder = $preorder;
+ return $this->preorder;
+ }
+
+ if($name == "creator") {
+ $creator = mfValuecache::singleton()->get("Worker-id-".$this->create_by);
+ if($creator) {
+ $this->creator = $creator;
+ return $this->creator;
+ }
+ $this->creator = new User($this->create_by);
+
+ if(!$this->creator->id) {
+ return null;
+ }
+ mfValuecache::singleton()->set("Worker-id-".$this->create_by, $this->creator);
+ return $this->creator;
+ }
+
+ if($name == "editor") {
+ $editor = mfValuecache::singleton()->get("Worker-id-".$this->edit_by);
+ if($editor) {
+ $this->editor = $editor;
+ return $this->editor;
+ }
+ $this->editor = new User($this->edit_by);
+ if(!$this->editor->id) {
+ return null;
+ }
+ mfValuecache::singleton()->set("Worker-id-".$this->edit_by, $this->editor);
+ return $this->editor;
+ }
+
+ if($name == "product") {
+ $product = ProductModel::getFirst(["id" => $this->product_id]);
+ if(!$product) {
+ $this->log->debug(__METHOD__ . ": Product " . $this->product_id . " not found");
+ return null;
+ }
+ $this->product = $product;
+ return $this->product;
+ }
+ }
+ return parent::getProperty($name);
+ }
+
+ /********************************
+ * Begin static Model functions
+ */
+
+ public static function create(Array $data) {
+ $model = new ConstructionConsent();
+
+ $table_fields = [
+ "type", "name", "vatgroup_id", "price", "price_setup",
+ "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("ConstructionConsent", "*", "1 = 1 ORDER BY adb_hausnummer_id");
+ if($db->num_rows($res)) {
+ while($data = $db->fetch_object($res)) {
+ $items[] = new ConstructionConsent($data);
+ }
+ }
+ return $items;
+
+ }
+
+ public static function getFirst($filter) {
+ $db = FronkDB::singleton();
+
+ $where = self::getSqlFilter($filter);
+ $sql = "SELECT * FROM ConstructionConsent
+ WHERE $where
+ ORDER BY adb_hausnummer_id LIMIT 1";
+ //var_dump($sql);exit;
+ $res = $db->query($sql);
+ if($db->num_rows($res)) {
+ $data = $db->fetch_object($res);
+ $item = new ConstructionConsent($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 ConstructionConsent
+ LEFT JOIN ".ADDRESSDB_DBNAME.".view_hausnummer ON (ConstructionConsent.adb_hausnummer_id = view_hausnummer.hausnummer_id)
+ 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, $order = false) {
+ //var_dump($filter);exit;
+ $items = [];
+
+ if(!$order) {
+ $order = "adb_hausnummer_id ASC";
+ }
+
+ $db = FronkDB::singleton();
+
+ $where = self::getSqlFilter($filter);
+ $sql = "SELECT * FROM ConstructionConsent
+ LEFT JOIN ".ADDRESSDB_DBNAME.".view_hausnummer ON (ConstructionConsent.adb_hausnummer_id = view_hausnummer.hausnummer_id)
+ WHERE $where
+ ORDER BY $order";
+
+ 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'];
+ }
+ }
+
+ mfLoghandler::singleton()->debug($sql);
+
+ $res = $db->query($sql);
+ if($db->num_rows($res)) {
+ while($data = $db->fetch_object($res)) {
+ $items[$data->id] = new ConstructionConsent($data);
+ }
+ }
+
+ return $items;
+ }
+
+ private static function getSqlFilter($filter) {
+ $where = "1=1 ";
+
+ if(array_key_exists("project_id", $filter)) {
+ $project_id = $filter['project_id'];
+ if(is_numeric($project_id)) {
+ $where .= " AND ConstructionConsent.constructionconsentproject_id=$project_id";
+ }
+ }
+
+ if(array_key_exists("constructionconsentproject_id", $filter)) {
+ $constructionconsentproject_id = $filter['constructionconsentproject_id'];
+ if(is_numeric($constructionconsentproject_id)) {
+ $where .= " AND ConstructionConsent.constructionconsentproject_id=$constructionconsentproject_id";
+ }
+ }
+
+ if(array_key_exists("adb_wohneinheit_id", $filter)) {
+ $adb_wohneinheit_id = $filter['adb_wohneinheit_id'];
+ if(is_numeric($adb_wohneinheit_id)) {
+ $where .= " AND ConstructionConsent.adb_wohneinheit_id=$adb_wohneinheit_id";
+ }
+ }
+
+ if(array_key_exists("termination_id", $filter)) {
+ $termination_id = $filter['termination_id'];
+ if(is_numeric($termination_id)) {
+ $where .= " AND ConstructionConsent.termination_id=$termination_id";
+ }
+ }
+
+ if(array_key_exists("object_type", $filter)) {
+ $object_type = FronkDB::singleton()->escape($filter["object_type"]);
+ if($object_type) {
+ $where .= " AND object_type='$object_type'";
+ }
+ }
+
+ if(array_key_exists("ez", $filter)) {
+ $ez = FronkDB::singleton()->escape($filter["ez"]);
+ if($ez) {
+ $where .= " AND ez='$ez'";
+ }
+ }
+
+ if(array_key_exists("status", $filter)) {
+ $status = FronkDB::singleton()->escape($filter["status"]);
+ if($status) {
+ $where .= " AND status='$status'";
+ }
+ }
+
+ if(array_key_exists("result", $filter)) {
+ $result = FronkDB::singleton()->escape($filter["result"]);
+ if($result) {
+ $where .= " AND result='$result'";
+ }
+ }
+
+ if(array_key_exists("owner_name", $filter)) {
+ $owner_name = FronkDB::singleton()->escape($filter["owner_name"]);
+ if($owner_name) {
+ $where .= " AND owner_name like '%$owner_name%'";
+ }
+ }
+
+ if(array_key_exists("owner_street", $filter)) {
+ $owner_street = FronkDB::singleton()->escape($filter["owner_street"]);
+ if($owner_street) {
+ $where .= " AND owner_street like '%$owner_street%'";
+ }
+ }
+
+ if(array_key_exists("owner_zip", $filter)) {
+ $owner_zip = FronkDB::singleton()->escape($filter["owner_zip"]);
+ if($owner_zip) {
+ $where .= " AND owner_zip like '%$owner_zip%'";
+ }
+ }
+
+ if(array_key_exists("owner_city", $filter)) {
+ $owner_city = FronkDB::singleton()->escape($filter["owner_city"]);
+ if($owner_city) {
+ $where .= " AND owner_city like '%$owner_city%'";
+ }
+ }
+
+ if(array_key_exists("owner_country", $filter)) {
+ $owner_country = FronkDB::singleton()->escape($filter["owner_country"]);
+ if($owner_country) {
+ $where .= " AND owner_country like '%$owner_country%'";
+ }
+ }
+
+ if(array_key_exists("network", $filter)) {
+ $network = FronkDB::singleton()->escape($filter["network"]);
+ if($network) {
+ $where .= " AND view_hausnummer.netzgebiet_id=$network";
+ }
+ }
+
+
+
+ if(array_key_exists("add-where", $filter)) {
+ $where .= " ".$filter['add-where'];
+ }
+
+ //var_dump($filter, $where);exit;
+ return $where;
+ }
+
+}
\ No newline at end of file
diff --git a/application/PreorderProduct/PreorderProductController.php b/application/PreorderProduct/PreorderProductController.php
new file mode 100644
index 000000000..4f519e3f5
--- /dev/null
+++ b/application/PreorderProduct/PreorderProductController.php
@@ -0,0 +1,22 @@
+needlogin=true;
+ $me = new User();
+ $me->loadMe();
+ $this->me = $me;
+ $this->layout()->set("me",$me);
+
+ if(!$me->is(["Admin", "netowner", "salespartner"]) && !$me->can("Preorder")) {
+ $this->redirect("Dashboard");
+ }
+ }
+
+ protected function indexAction() {
+ $this->layout()->setTemplate("PreorderProduct/Index");
+
+ //$product =
+ }
+}
\ No newline at end of file