Files
thetool/application/Preordercampaign/PreordercampaignController.php
2023-07-20 11:34:11 +02:00

560 lines
17 KiB
PHP

<?php
class PreordercampaignController extends mfBaseController {
protected function init() {
$this->needlogin=true;
$me = new User();
$me->loadMe();
$this->me = $me;
$this->layout()->set("me",$me);
if(!$me->is(["Admin", "netowner", "salespartner"])) {
$this->redirect("Dashboard");
}
}
protected function indexAction() {
$this->layout()->setTemplate("Preordercampaign/Index");
$this->layout->set("filter", $this->request->filter);
$filter = [];
if($this->request->filter) {
$filter = $this->getPreparedFilter($this->request->filter);
}
// pagination defaults
$pagination = [];
$pagination['start'] = 0;
$pagination['count'] = 20;
$pagination['maxItems'] = 0;
if(is_numeric($this->request->s)) {
$pagination['start'] = intval($this->request->s);
}
$my_networks = [];
//var_dump($filter);exit;
if($this->me->is("Admin")) {
if(!is_array($filter['network_id']) && $filter['network_id']) {
$my_networks[] = new Network($filter['network_id']);
} else {
$my_networks = NetworkModel::getAll();
}
$this->layout()->set("mynetworks", NetworkModel::getAll());
$netowners = $this->getNetworkOwners($my_network_ids);
$this->layout()->set("netowners", $netowners);
} else {
$use_filter_network = false;
$my_networks = $this->me->myNetworks(["netowner", "salespartner"]);
//var_dump($my_networks);exit;
foreach($my_networks as $mn) {
if($mn->id == $filter['network_id']) {
$use_filter_network = true;
break;
}
}
$this->layout()->set("mynetworks", $my_networks);
if($use_filter_network) {
$my_networks = [];
$my_networks[] = new Network($filter['network_id']);
}
$my_network_ids = [];
foreach($my_networks as $network) {
$my_network_ids[] = $network->id;
}
$filter['network_id'] = $my_network_ids;
}
$campaigns = PreordercampaignModel::search($filter);
$this->layout()->set("campaigns", $campaigns);
}
private function getPreparedFilter($filter) {
$new_filter = [];
if(array_key_exists("netowner", $filter) && $filter['netowner']) {
if($this->me->is("Admin")) {
$owner_id = $filter['netowner'];
foreach(NetworkModel::search(['owner_id' => $owner_id]) as $network) {
$new_filter['network_id'][] = $network->id;
}
unset($filter['network_id']);
} else {
unset($filter['netowner']);
}
}
if(array_key_exists("name", $filter) && $filter['name']) {
$new_filter['name%'] = "%".$filter['name'];
unset($filter['name']);
}
if(array_key_exists("area", $filter) && $filter['area']) {
$new_filter['area%'] = "%".$filter['area'];
unset($filter['area']);
}
foreach($filter as $name => $value) {
$new_filter[$name] = $value;
}
return $new_filter;
}
private function getNetworkOwners() {
$owners = [];
$sql = "SELECT Address.* FROM Preordercampaign
LEFT JOIN Network ON (Preordercampaign.network_id = Network.id)
LEFT JOIN Address ON (Network.owner_id = Address.id)
GROUP BY Address.id
ORDER BY Address.company, Address.lastname, Address.firstname
";
$res = $this->db()->query($sql);
if($this->db()->num_rows($reso)) {
while($data = $this->db()->fetch_object($res)) {
$owners[] = new Address($data->id);
}
}
return $owners;
}
protected function addAction() {
if(!$this->me->is("Admin")) {
$this->redirect("Preordercampaign");
}
$this->layout()->setTemplate("Preordercampaign/Form");
if($this->me->isAdmin()) {
$this->layout()->set("networks", NetworkModel::getAll());
} else {
$this->layout()->set("networks", $this->me->my_networks);
}
$this->layout()->set("types", BuildingtypeModel::getAll());
$this->layout()->set("statuses", BuildingstatusModel::getAll());
$this->layout()->set("networksections", NetworksectionModel::getAll());
$this->layout()->set("adb_netzgebiete", ADBNetzgebietModel::getAll());
}
protected function editAction() {
if(!$this->me->is("Admin")) {
$this->redirect("Preordercampaign");
}
$id = $this->request->id;
if(!is_numeric($id) || !$id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$campaign = new Preordercampaign($id);
if(!$campaign->id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$this->layout()->set("campaign", $campaign);
return $this->addAction();
}
protected function saveAction() {
if(!$this->me->is("Admin")) {
$this->redirect("Preordercampaign");
}
$r = $this->request;
//var_dump($r);exit;
$id = $r->id;
if(is_numeric($id) && $id > 0) {
$mode = "edit";
$campaign = new Preordercampaign($id);
if(!$campaign->id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
} else {
$id = false;
$mode = "add";
}
$data = [];
$data['network_id'] = $r->network_id;
$data['name'] = $r->name;
$data['description'] = $r->description;
$data['area'] = $r->area;
$data['note'] = $r->note;
$data['homes_total'] = (int)$r->homes_total;
if($r->from) {
$data['from'] = self::dateToTimestamp($r->from);
}
if($r->to) {
$data['to'] = self::dateToTimestamp($r->to);
}
if($r->fulfillment == "thirdparty") {
$data['fulfillment'] = "thirdparty";
} elseif($r->fulfillment == "rimo") {
$data['fulfillment'] = "rimo";
} else {
$data['fulfillment'] = "thetool";
}
if($r->product_type == "setup_only") {
$data['product_type'] = "setup_only";
} elseif($r->product_type == "no_setup") {
$data['product_type'] = "no_setup";
} else {
$data['product_type'] = "all";
}
if(is_array($r->required_fields) && count($r->required_fields)) {
$rfields = [];
foreach(['contact_type'] as $afield) {
if(in_array($afield, $r->required_fields)) {
$rfields[] = "contact_type";
}
}
$data['required_preorder_fields'] = json_encode($rfields);
} else {
$data['required_preorder_fields'] = null;
}
if($r->district_is_city == 1) {
$data['district_is_city'] = 1;
} else {
$data['district_is_city'] = 0;
}
if($r->hausnummer_add_zusatz == 1) {
$data['hausnummer_add_zusatz'] = 1;
} else {
$data['hausnummer_add_zusatz'] = 0;
}
if($r->exist_is_error == 1) {
$data['exist_is_error'] = 1;
} else {
$data['exist_is_error'] = 0;
}
$data['edit_by'] = $this->me->id;
if($mode == "add") {
$data['create_by'] = $this->me->id;
$campaign = PreordercampaignModel::create($data);
} else {
$campaign->update($data);
}
$new_id = $campaign->save();
if(!$new_id) {
$this->layout()->setFlash("Fehler beim Speichern", "error");
$this->layout()->set("campaign", $campaign);
return $this->add();
}
if(is_array($r->types) && count($r->types)) {
$campaign->addTypes($r->types);
}
//var_dump($r->adb_netzgebiet_ids);exit;
foreach(PreordercampaignSalesclusterModel::search(['preordercampaign_id' => $campaign->id]) as $pcg) {
$pcg->delete();
}
//var_dump($r->adb_netzgebiet_ids);exit;
if(is_array($r->adb_netzgebiet_ids) && count($r->adb_netzgebiet_ids)) {
foreach($r->adb_netzgebiet_ids as $netzgebiet_id) {
$pcg = PreordercampaignSalesclusterModel::getFirst(['preordercampaign_id' => $campaign->id, 'salescluster_id' => $netzgebiet_id]);
if($pcg) continue;
$pcg = PreordercampaignSalesclusterModel::create(['preordercampaign_id' => $campaign->id, 'salescluster_id' => $netzgebiet_id]);
$pcg->save();
}
}
foreach(PreordercampaignApiuserModel::search(['preordercampaign_id' => $campaign->id]) as $pca) {
$pca->delete();
}
if(is_array($r->apiusers) && count($r->apiusers)) {
foreach($r->apiusers as $user_id) {
$pca = PreordercampaignApiuserModel::getFirst(['preordercampaign_id' => $campaign->id, 'worker_id' => $user_id]);
if($pca) continue;
$pca = PreordercampaignApiuserModel::create(['preordercampaign_id' => $campaign->id, 'worker_id' => $user_id]);
$pca->save();
}
}
foreach(PreordercampaignOriginhostnameModel::search(['preordercampaign_id' => $campaign->id]) as $origin) {
$origin->delete();
}
// var_dump($r->corsorigins);exit;
if($r->corsorigins) {
$origins = str_replace("\r", "\n", $r->corsorigins);
$origins = preg_replace("/\n+/", "\n", $origins);
$origins = explode("\n", $origins);
if(is_array($origins) && count($origins)) {
foreach($origins as $origin) {
$poh = PreordercampaignOriginhostnameModel::getFirst(['preordercampaign_id' => $campaign->id, 'hostname' => $origin]);
if($poh) continue;
$poh = PreordercampaignOriginhostnameModel::create(['preordercampaign_id' => $campaign->id, 'hostname' => $origin]);
$poh->save();
}
}
}
$this->layout()->setFlash("Vorbestellkampagne erfolgreich gespeichert.", "success");
//$this->redirect("Preordercampaign", "Edit", ['id' => $new_id]);
$this->redirect("Preordercampaign");
}
protected function downloadAddonServices() {
$id = $this->request->preordercampaign_id;
if(!is_numeric($id) || !$id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$campaign = new Preordercampaign($id);
if(!$campaign->id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$this->layout()->set("campaign", $campaign);
$preorders = PreorderModel::search(["preordercampaign_id" => $id, "add-where" => "AND JSON_LENGTH(addon_services) > 1"]);
if(!count($preorders)) {
$this->layout->setFlash("Keine Vorbestellungen mit bestellten Dienstleistungen gefunden.");
$this->redirect("Preordercampaign");
}
$csv = [];
foreach($preorders as $preorder) {
$sjson = json_decode($preorder->addon_services);
if(!$sjson) {
continue;
}
// address data and stuff
$general = [
"ucode" => $preorder->ucode,
"gemeinde" => $preorder->adb_hausnummer->ortschaft->gemeinde->name,
"plz" => $preorder->adb_hausnummer->plz->plzstring,
"ortschaft" => $preorder->adb_hausnummer->ortschaft->name,
"strasse" => $preorder->adb_hausnummer->strasse->name,
"hausnummer" => $preorder->adb_hausnummer->hausnummer,
"block" => "",
"stiege" => "",
"stock" => "",
"tuer" => "",
"zusatz" => "",
"address_info" => $preorder->address_info,
"contact_firma" => $preorder->company,
"contact_uid" => $preorder->uid,
"contact_firstname" => $preorder->firstname,
"contact_lastname" => $preorder->lastname,
"contact_street" => $preorder->street,
"contact_plz" => $preorder->zip,
"contact_ort" => $preorder->city,
"phone" => $preorder->phone,
"email" => $preorder->email,
];
if($preorder->adb_wohneinheit_id) {
$general["block"] = $preorder->adb_wohneinheit->block;
$general["stiege"] = $preorder->adb_wohneinheit->stiege;
$general["stock"] = $preorder->adb_wohneinheit->stock;
$general["tuer"] = $preorder->adb_wohneinheit->tuer;
$general["zusatz"] = $preorder->adb_wohneinheit->zusatz;
}
foreach($sjson as $service) {
if(!$service->ordered) continue;
$s = $general;
$s["service"] = $service->service;
$data = [];
foreach($service->data as $d) {
$data[] = (string)$d->name.": ".(is_bool($d->value) ? (int)$d->value : (string)$d->value);
}
$s["service_data"] = implode("; ", $data);
$csv[] = $s;
}
//var_dump($csv);exit;
$this->layout()->setTemplate("Preordercampaign/services.csv");
$this->layout()->set("csv", $csv);
}
}
protected function adminAction() {
$this->layout()->setTemplate("Preordercampaign/Admin");
$id = $this->request->id;
if(!is_numeric($id) || !$id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$campaign = new Preordercampaign($id);
if(!$campaign->id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$this->layout()->set("campaign", $campaign);
}
protected function createRimoWorkordersAction() {
$this->layout()->setTemplate("Preordercampaign/Admin");
$id = $this->request->id;
if(!is_numeric($id) || !$id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$campaign = new Preordercampaign($id);
if(!$campaign->id) {
$this->layout()->setFlash("Vorbestellkampagne nicht gefunden", "error");
$this->redirect("Preordercampaign");
}
$missing_units = [];
$missing_extrefs = [];
$workorders_created = 0;
$workorders_failed = 0;
foreach(PreorderModel::search(["preordercampaign_id" => $id, "workorder_export_date" => null, 'deleted' => 0]) as $preorder) {
if($preorder->workorder_export_date) {
$this->log->warning(__METHOD__.": workorder_export_date not null");
}
if($preorder->type == "interest") {
continue;
}
if(!$preorder->adb_wohneinheit_id) {
//echo "Keine Wohneinheit in Preorder (".$preorder->id.") ".$preorder->ucode." ".$preorder->oaid."\n";
$missing_units[] = $preorder;
continue;
}
$wohneinheit = new ADBWohneinheit($preorder->adb_wohneinheit_id);
if(!$wohneinheit->id) {
$this->log->error(__METHOD__.": Wohneinheit nicht gefunden (Preorder ".$preorder->id." ".$preorder->ucode." ".$preorder->oaid.")");
continue;
}
if(!$wohneinheit->extref) {
$missing_extrefs[] = $preorder;
continue;
}
if(!$preorder->oaid) {
if(!$wohneinheit->oaid) {
$wohneinheit->oaid = $wohneinheit->getNewOAID();
$wohneinheit->save();
}
$preorder->oaid = $wohneinheit->oaid;
$preorder->save();
}
$params['apiKey'] = RIMO_API_JSON_APIKEY;
$params["homeId"] = $wohneinheit->extref;
$params["firstName"] = trim($preorder->firstname);
$params["lastName"] = trim($preorder->lastname);
$params["company"] = trim($preorder->company);
$params["phone"] = trim($preorder->phone);
$params["email"] = trim($preorder->email);
$params["orderId"] = $preorder->ucode;
//$params["openAccessId"] = $preorder->oaid; // TODO: flag in campaign to include OAID or not
$ctx_opts = [
'http' => [
'method' => 'POST',
'header' => 'accept: application/json'
]
];
$qs = http_build_query($params);
//echo $qs."\n";
$createOrderEp = RIMO_API_JSON_URL.RIMO_API_JSON_EP_CREATE_WORKORDER;
$post_url = $createOrderEp."?".$qs;
$ctx = stream_context_create($ctx_opts);
$this->log->debug(__METHOD__.": Creating Workorder: $post_url");
$response = file_get_contents($post_url, false, $ctx);
if($response === false) {
echo "Fehler beim Exportieren der Workorder für Preorder ".$preorder->id." ".$preorder->ucode." ".$preorder->oaid."\n";
$workorders_failed++;
continue;
}
$preorder->workorder_export_date = date('U');
$preorder->workorder_export_data = $response;
$preorder->save();
$workorders_created++;
}
exit;
$errors = [];
$warnings = [];
if(count($missing_units)) {
$warnings[] = count($missing_units)." Vobestellungen ohne Wohneinheit";
}
if(count($missing_extrefs)) {
$warnings[] = count($missing_extrefs)." Wohneinheiten ohne extref (SDIHome_)";
}
if($workorders_failed) {
$errors[] = "$workorders_failed Workorders konnten nicht erstellt werden.";
}
if(count($errors)) {
$this->layout()->setFlash(implode("<br />\n", $errors), "error");
}
if(count($warnings)) {
$this->layout()->setFlash(implode("<br />\n", $warnings), "warning");
}
if($workorders_created) {
$this->layout()->setFlash("$workorders_created Workorders erfolgreich erstellt", "success");
} else {
$this->layout()->setFlash("Es konnten keine Workorders erstellt werden", "info");
}
$this->redirect("Preordercampaign", "Admin", ["id" => $id]);
}
}