Files
thetool/application/AddressDB/AddressDB.php
2023-05-24 17:29:01 +02:00

314 lines
12 KiB
PHP

<?php
class AddressDB {
private $db;
private $log;
public $validation_error = [];
public static $wohneinheit_query = "select `Netzgebiet`.`id` AS `netzgebiet_id`,
`Netzgebiet`.`name` AS `netzgebiet`,
`Netzgebiet`.`extref` AS `netzgebiet_extref`,
`Gemeinde`.`id` AS `gemeinde_id`,
`Gemeinde`.`kennziffer` AS `gemeinde_kennziffer`,
`Gemeinde`.`code` AS `gemeinde_code`,
`Gemeinde`.`name` AS `gemeinde`,
`Ortschaft`.`id` AS `ortschaft_id`,
`Ortschaft`.`kennziffer` AS `ortschaft_kennziffer`,
`Ortschaft`.`name` AS `ortschaft`,
`Plz`.`plz` AS `plz`,
`Strasse`.`id` AS `strasse_id`,
`Strasse`.`kennziffer` AS `strasse_kennziffer`,
`Strasse`.`name` AS `strasse`,
`Hausnummer`.`id` AS `hausnummer_id`,
`Hausnummer`.`oaid` AS `oaid`,
`Hausnummer`.`adrcd` AS `adrcd`,
`Hausnummer`.`oaid` AS `hausnummer_oaid`,
`Hausnummer`.`hausnummer` AS `hausnummer`,
`Hausnummer`.`extref` AS `hausnummer_extref`,
`Hausnummer`.`unit_count` AS `unit_count`,
`Hausnummer`.`gps_lat` AS `gps_lat`,
`Hausnummer`.`gps_long` AS `gps_long`,
`Hausnummer`.`grund_nr` AS `grund_nr`,
`Hausnummer`.`rollout` AS `rollout`,
`Hausnummer`.`rollout_info` AS `rollout_info`,
`Hausnummer`.`freigabe` AS `freigabe`,
`Wohneinheit`.`id` AS `wohneinheit_id`,
`Wohneinheit`.`oaid` AS `wohneinheit_oaid`,
`Wohneinheit`.`extref` AS `wohneinheit_extref`,
`Wohneinheit`.`num` AS `num`,
`Wohneinheit`.`block` AS `block`,
`Wohneinheit`.`stiege` AS `stiege`,
`Wohneinheit`.`stock` AS `stock`,
`Wohneinheit`.`tuer` AS `tuer`,
`Wohneinheit`.`bezeichner` AS `bezeichner`,
`Wohneinheit`.`zusatz` AS `zusatz`
`Wohneinheit`.`nutzung` AS `nutzung`
from `Hausnummer`
left join `Netzgebiet` on (`Hausnummer`.`netzgebiet_id` = `Netzgebiet`.`id`)
left join `Plz` on (`Plz`.`id` = `Hausnummer`.`plz_id`)
left join `Strasse` on (`Strasse`.`id` = `Hausnummer`.`strasse_id`)
left join `Ortschaft` on (`Ortschaft`.`id` = `Hausnummer`.`ortschaft_id`)
left join `Gemeinde` on (`Gemeinde`.`id` = `Strasse`.`gemeinde_id`)
left join `Wohneinheit` on (`Wohneinheit`.`hausnummer_id` = `Hausnummer`.`id`)";
/*public static $wohneinheit_query = "select `Netzgebiet`.`id` AS `netzgebiet_id`,
`Netzgebiet`.`name` AS `netzgebiet`,
`Netzgebiet`.`extref` AS `netzgebiet_extref`,
`Gemeinde`.`id` AS `gemeinde_id`,
`Gemeinde`.`kennziffer` AS `gemeinde_kennziffer`,
`Gemeinde`.`code` AS `gemeinde_code`,
`Gemeinde`.`name` AS `gemeinde`,
`Ortschaft`.`id` AS `ortschaft_id`,
`Ortschaft`.`kennziffer` AS `ortschaft_kennziffer`,
`Ortschaft`.`name` AS `ortschaft`,
`Plz`.`plz` AS `plz`,
`Strasse`.`id` AS `strasse_id`,
`Strasse`.`kennziffer` AS `strasse_kennziffer`,
`Strasse`.`name` AS `strasse`,
`Hausnummer`.`id` AS `hausnummer_id`,
`Hausnummer`.`oaid` AS `hausnummer_oaid`,
`Hausnummer`.`hausnummer` AS `hausnummer`,
`Hausnummer`.`extref` AS `hausnummer_extref`,
`Hausnummer`.`grund_nr` AS `grund_nr`,
`Hausnummer`.`gps_lat` AS `gps_lat`,
`Hausnummer`.`gps_long` AS `gps_long`,
`Hausnummer`.`rollout` AS `rollout`,
`Hausnummer`.`rollout_info` AS `rollout_info`,
`Hausnummer`.`freigabe` AS `freigabe`,
`Wohneinheit`.`id` AS `wohneinheit_id`,
`Wohneinheit`.`oaid` AS `wohneinheit_oaid`,
`Wohneinheit`.`extref` AS `wohneinheit_extref`,
`Wohneinheit`.`num` AS `num`,
`Wohneinheit`.`block` AS `block`,
`Wohneinheit`.`stiege` AS `stiege`,
`Wohneinheit`.`stock` AS `stock`,
`Wohneinheit`.`tuer` AS `tuer`,
`Wohneinheit`.`bezeichner` AS `bezeichner`,
`Wohneinheit`.`zusatz` AS `zusatz` from `Hausnummer`
left join `Netzgebiet` on (`Hausnummer`.`netzgebiet_id` = `Netzgebiet`.`id`)
left join `Plz` on (`Plz`.`id` = `Hausnummer`.`plz_id`)
left join `Strasse` on (`Strasse`.`id` = `Hausnummer`.`strasse_id`)
left join `Ortschaft` on (`Ortschaft`.`id` = `Hausnummer`.`ortschaft_id`)
left join `Gemeinde` on (`Gemeinde`.`id` = `Strasse`.`gemeinde_id`)
left join `Wohneinheit` on (`Wohneinheit`.`hausnummer_id` = `Hausnummer`.`id`)";
*/
public function __construct() {
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$this->log = mfLoghandler::singleton();
}
public function import($input) {
$path = __DIR__."/Importer/";
$dir = opendir($path);
while(($file = readdir($dir)) !== false) {
if(substr($file, 0, 1) == ".") continue;
if(substr($file, -4) != ".php") continue;
if(!is_file($path.$file)) continue;
require_once $path.$file;
$classname = "AddressDB_Importer_".ucfirst(substr($file, 0, strlen($file)-4));
if(class_exists($classname)) {
$importer = new $classname();
if($importer->isValid($input)) {
return $importer->import();
}
}
}
}
/*
* methods to create or update an Address from strings
*/
public function createUpdateHausnummer($data) {
$netzgebiet = null;
$gemeinde = null;
$ortschaft = null;
$strasse = null;
$plz = null;
$hausnummer = null;
//var_dump($data);exit;
if(!array_key_exists("netzgebiet_id", $data)) {
return false;
}
foreach(["gemeinde", "ortschaft", "strasse", "plz"] as $field) {
$classname = "ADB".ucfirst($field);
$idfield = $field."_id";
if(!array_key_exists($field."_id", $data)) continue;
$$field = new $classname($data[$idfield]);
if(!${$field}->id) {
$$field = null;
}
}
$netzgebiet = new ADBNetzgebiet($data['netzgebiet_id']);
if(!$netzgebiet->id) {
$this->log->debug(__CLASS__."::".__METHOD__.": Missing netzgebiet_id");
return false;
}
if(!$gemeinde) {
// dont allow creating Gemeinden
$this->log->debug(__CLASS__."::".__METHOD__.": Missing Gemeinde");
return false;
}
if(!$ortschaft) {
// search by kennziffer
if(array_key_exists("ortschaft_kennziffer", $data) && $data['ortschaft_kennziffer']) {
$ortschaft = ADBOrtschaftModel::getFirst(['kennziffer' => $data['ortschaft_kennziffer']]);
}
if(!$ortschaft) {
// search by name
if(!array_key_exists("ortschaft", $data) || !$data['ortschaft']) return false;
$ortschaft = ADBOrtschaftModel::getFirst(['gemeinde_id' => $gemeinde->id, 'name' => $data['ortschaft']]);
}
if(!$ortschaft) {
// create Ortschaft
$ortschaft = ADBOrtschaftModel::create([
'gemeinde_id' => $gemeinde->id,
'kennziffer' => ($data['ortschaft_kennziffer']) ? $data['ortschaft_kennziffer'] : null,
'name' => $data['ortschaft']
]);
if(!$ortschaft->save()) {
$this->log->debug(__CLASS__."::".__METHOD__.": Cannot save Ortschaft");
return false;
}
}
}
if(!$strasse) {
// search by kennziffer
if(array_key_exists("strasse_kennziffer", $data) && $data['strasse_kennziffer']) {
$strasse = ADBStrasseModel::getFirst(['kennziffer' => $data['strasse_kennziffer']]);
}
if(!$strasse) {
// search by name
if(!array_key_exists("strasse", $data) || !$data['strasse']) return false;
$strasse = ADBStrasseModel::getFirst(['gemeinde_id' => $gemeinde->id, 'name' => $data['strasse']]);
}
if(!$strasse) {
// create Strasse
if(!array_key_exists("strasse", $data) || !$data['strasse']) return false;
$strasse = ADBStrasseModel::create([
'gemeinde_id' => $gemeinde->id,
'kennziffer' => ($data['strasse_kennziffer']) ? $data['strasse_kennziffer'] : null,
'name' => $data['strasse']
]);
if(!$strasse->save()) {
$this->log->debug(__CLASS__."::".__METHOD__.": Cannot save Strasse");
return false;
}
}
}
if(!$plz) {
// search by plz
if(!array_key_exists("plz", $data) || !$data['plz']) return false;
$plz = ADBPlzModel::getFirst(['gemeinde_id' => $gemeinde->id, 'plz' => $data['plz']]);
if(!$plz) {
// create PLZ
$plz = ADBPlzModel::create([
'gemeinde_id' => $gemeinde->id,
'plz' => $data['plz'],
'plzstring' => $data['plz']
]);
if(!$plz->save()) {
$this->log->debug(__CLASS__."::".__METHOD__.": Cannot save PLZ");
return false;
}
}
}
if(array_key_exists("hausnummer_id", $data)) {
// if hausnummer_id is set but empty => fail
if(!$data['hausnummer_id']) return false;
$hausnummer = new ADBHausnummer($data['hausnummer_id']);
if(!$hausnummer->id) {
return false;
}
}
$me = new User();
$me->loadMe();
// build hausnummer data
//$hausnummer_data['oaid'] = (array_key_exists("oaid", $data) && $data['oaid']) ? $data['oaid'] : null;
$hausnummer_data['adrcd'] = ($data['adrcd']) ? $data['adrcd'] : null;
$hausnummer_data['extref'] = ($data['extref']) ? $data['extref'] : null;
$hausnummer_data['netzgebiet_id'] = $netzgebiet->id;
$hausnummer_data['ortschaft_id'] = $ortschaft->id;
$hausnummer_data['plz_id'] = $plz->id;
$hausnummer_data['strasse_id'] = $strasse->id;
$hausnummer_data['hausnummer'] = $data['hausnummer'];
$hausnummer_data['grund_nr'] = $data['grund_nr'];
$hausnummer_data['gdaeigenschaft'] = $data['gdaeigenschaft'];
$hausnummer_data['meridian'] = $data['meridian'];
$hausnummer_data['rw'] = ($data['rw']) ? str_replace(",",".", $data['rw']) : null;
$hausnummer_data['hw'] = ($data['hw']) ? str_replace(",",".", $data['hw']) : null;
if($data['rw'] && !is_numeric($hausnummer_data['rw'])) {
$hausnummer_data['rw'] = null;
$this->validation_error[] = "RW nicht gespeichert: Keine Zahl";
}
if($data['hw'] && !is_numeric($hausnummer_data['hw'])) {
$hausnummer_data['hw'] = null;
$this->validation_error[] = "HW nicht gespeichert: Keine Zahl";
}
$hausnummer_data['gps_lat'] = ($data['gps_lat']) ? str_replace(",", ".", $data['gps_lat']) : null;
$hausnummer_data['gps_long'] = ($data['gps_long']) ? str_replace(",", ".", $data['gps_long']) : null;
$hausnummer_data['rollout'] = (trim($data['rollout'])) ? trim($data['rollout']) : null;
$hausnummer_data['rollout_info'] = (trim($data['rollout_info'])) ? trim($data['rollout_info']) : null;
$hausnummer_data['freigabe'] = json_encode($data['freigabe']);
$hausnummer_data['manual_add'] = date('U');
$hausnummer_data['manual_add_by'] = $me->id;
$hausnummer_data['manual_add_info'] = "thetool user ".$me->username." via AddressDB";
$hausnummer_data['manual_update'] = date('U');
$hausnummer_data['manual_update_by'] = $me->id;
$hausnummer_data['manual_update_info'] = "thetool user ".$me->username." via AddressDB";
//var_dump($hausnummer_data, $hausnummer);exit;
if(!$hausnummer) {
// create hausnummer
$hausnummer = ADBHausnummerModel::create($hausnummer_data);
} else {
// update hausnummer
$hausnummer->update($hausnummer_data);
}
$hausnummer_id = $hausnummer->save();
if(!$hausnummer_id) {
$this->log->debug(__CLASS__."::".__METHOD__.": Cannot save Hausnummer");
return false;
}
// create OAID
if(!$hausnummer->oaid) {
$hausnummer->oaid = $hausnummer->getNewOAID();
if(!$hausnummer->save()) {
$this->log->debug(__CLASS__."::".__METHOD__.": Cannot save Hausnummer OAID");
}
}
return $hausnummer_id;
}
public function updateHausnummer($hausnummer_id, $data) {
}
}