needlogin=true; $me = new User(); $me->loadMe(); $this->me = $me; $this->layout()->set("me",$me); if(!$me->is(["Admin", "salespartner"])) { $this->redirect("Dashboard"); } } protected function indexAction() { $this->layout()->setTemplate("Order/Index"); //$this->layout()->set("orders", OrderModel::getAll()); $filter = []; $this->layout->set("filter", $this->request->filter); //if($this->request->filter) { $filter = $this->getPreparedFilter($this->request->filter); //} //var_dump($filter);exit; // 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 = []; if($this->me->is("Admin")) { $my_networks = NetworkModel::getAll(); $this->layout()->set("mynetworks", $my_networks); /* if(!count($filter)) { $this->layout()->set("orders", OrderModel::getAll()); return true; }*/ if($filter['network_id']) { //$this->layout()->set("orders", OrderModel::search(['network_id' => $filter['network_id']])); $my_networks = []; $my_networks[] = new Network($filter['network_id']); } } else { $my_networks = $this->me->myNetworks("salespartner"); if(array_key_exists("network_id", $filter)) { $use_filter_network = false; foreach($my_networks as $mn) { if($mn->id == $filter['network_id']) { $use_filter_network = true; continue; } } if($use_filter_network) { $my_networks = []; $my_networks[] = new Network($filter['network_id']); } } $this->layout()->set("mynetworks", $this->me->my_networks); } unset($filter['network_id']); // get Orders in my networks $my_network_ids = []; $orders = []; //var_dump($this->me->my_networks);exit; foreach($my_networks as $network) { $my_network_ids[] = $network->id; } $order_search = [ 'network_id' => $my_network_ids ]; if(is_array($filter) && count($filter)) { foreach($filter as $name => $value) { $order_search[$name] = $value; } } $pagination['maxItems'] = OrderModel::count($order_search); foreach(OrderModel::search($order_search, $pagination) as $order) { if(!array_key_exists($order->id, $orders)) { $orders[$order->id] = $order; } } $lonelyOrders = []; //if(!count($filter)) { unset($order_search["network_id"]); $order_search['product_id'] = null; if($this->me->isAdmin()) { $lonelies = OrderModel::search($order_search); } else { $order_search['create_by'] = $this->me->id; $lonelies = OrderModel::search($order_search); } foreach($lonelies as $order) { if(!array_key_exists($order->id, $orders)) { $lonelyOrders[$order->id] = $order; } } //} $this->layout()->set("orders", $orders); $this->layout()->set("lonelyOrders", $lonelyOrders); $this->layout()->set("pagination", $pagination); } private function getPreparedFilter($filter) { $new_filter = []; if(is_array($filter) && count($filter)) { if(is_numeric($filter['networksection_id']) && $filter['networksection_id']) { $section = new Networksection($filter['networksection_id']); if($section->id) { $filter['network_id'] = $section->network_id; } } if(array_key_exists("termination_status", $filter)) { $status = $filter['termination_status']; if($status == "term_connected") { $new_filter["termination_status_code"] = ">=".TT_TERMSTATUS_CONNECTED; } if($status == "building_connected") { $new_filter["building_status_code"] = ">=".TT_BUILDINGSTATUS_CONNECTED; } if($status == "pipework_needed") { $new_filter["building_status_code"] = "<".TT_BUILDINGSTATUS_CONNECTED; } } if(array_key_exists("finished", $filter)) { if($filter["finished"] == "1") { $new_filter["finish_date"] = true; } else { $new_filter["finish_date"] = false; } } //var_dump($new_filter);exit; foreach($filter as $name => $value) { $new_filter[$name] = $value; } } else { $new_filter["finish_date"] = false; } return $new_filter; } protected function addAction() { // TODO: filter by network permissions $this->layout()->setTemplate("Order/Form"); if($this->me->is("Admin")) { $this->layout()->set("addresses", AddressModel::search(['parents_only' => 1])); $this->layout()->set("products", ProductModel::getAll()); $this->layout()->set("terminations", TerminationModel::getAll()); } else { // get all salespartner addresses of my networks $network_ids = []; $addresses = []; // get users from salespartner addresses of my networks $users = []; foreach($this->me->my_networks as $network) { $network_ids[] = $network->id; $tmp_users = $network->getAddressUsersByAddresstype("salespartner"); foreach($tmp_users as $user) { if(!in_array($user->id, $users)) { $users[] = $user->id; } } } // get addresses from salespartner address' user ids $addresses = AddressModel::search(["create_by" => $users]); $this->layout()->set("addresses", $addresses); // get terminations in my networks $terms = TerminationModel::search(["network_id" => $network_ids]); $this->layout()->set("terminations", $terms); // get products assigned to my networks $products = []; foreach(ProductNetworkModel::search(["network_id" => $network_ids]) as $pn) { if(!array_key_exists($pn->product_id, $products)) $products[$pn->product_id] = $pn->product; } $this->layout()->set("products", $products); } } protected function editAction() { $order_id = $this->request->id; $order = new Order($order_id); if(!$order->id) { $this->layout()->setFlash("Bestellung nicht gefunden.", "error"); $this->redirect("Order"); } $this->layout()->set("order", $order); return $this->addAction(); } protected function saveAction() { $r = $this->request; //var_dump($r->products); //var_dump($r); //exit; $id = $r->id; if(is_numeric($id) && $id > 0) { $mode = "edit"; $order = new Order($id); if(!$order->id) { $this->layout()->setFlash("Bestellung nicht gefunden", "error"); $this->redirect("Order"); } } else { $id = false; $mode = "add"; } // validate owner $owner = false; if(!$r->owner_id) { $this->layout()->setFlash("Bitte Vertragsinhaber auswählen oder eintragen.", "error"); $this->layout()->set("order", $r); return $this->add(); } if(is_numeric($r->owner_id)) { $owner = new Address($r->owner_id); if(!$owner->id) { $this->layout()->setFlash("Ungültiger Vertragsinhaber.", "error"); $this->layout()->set("order", $r); return $this->add(); } } elseif($r->owner_id == "new") { if(!$r->owner_company && !($r->owner_firstname && $r->owner_lastname)) { $this->layout()->setFlash("Fehler in Vertragsinhaber: Firmenname oder Vor- und Nachname benötigt."); $this->layout()->set("order", $r); return $this->add(); } foreach(["street", "zip", "city", "phone", "email"] as $required) { if(!$r->{"owner_$required"}) { $this->layout()->setFlash("Fehler in Vertragsinhaber: Bitte alle benötigten Felder ausfüllen."); $this->layout()->set("order", $r); return $this->add(); } } } else { $this->layout()->setFlash("Ungültiger Vertragsinhaber."); $this->layout()->set("order", $r); return $this->add(); } // validate billindaddress $billingaddress = false; if($r->billingaddress_id) { // billingaddress can be empty if(is_numeric($r->billingaddress_id)) { $billingaddress = new Address($r->billingaddress_id); if(!$billingaddress->id) { $this->layout()->setFlash("Ungültiger Rechnungsempfänger.", "error"); $this->layout()->set("order", $r); return $this->add(); } } elseif($r->billingaddress_id == "new") { if(!$r->billing_company && !($r->billingr_firstname && $r->billing_lastname)) { $this->layout()->setFlash("Fehler in Rechnungsqmpfänger: Firmenname oder Vor- und Nachname benötigt."); $this->layout()->set("order", $r); return $this->add(); } foreach(["street", "zip", "city", "phone", "email"] as $required) { if(!$r->{"owner_$required"}) { $this->layout()->setFlash("Fehler in Rechnungsempfänger: Bitte alle benötigten Felder ausfüllen."); $this->layout()->set("order", $r); return $this->add(); } } } else { $this->layout()->setFlash("Ungültiger Rechnungsempfänger."); $this->layout()->set("order", $r); return $this->add(); } } // validate sepa if(!$r->billing_type) { $this->layout()->setFlash("Ungültige Verrechnungsart."); $this->layout()->set("order", $r); return $this->add(); } if($r->billing_type == "sepa") { foreach(['bank', 'owner', 'iban', 'bic'] as $required) { if(!$r->{"bank_account_$required"}) { $this->layout()->setFlash("Bitte Bankdaten für SEPA ausfüllen."); $this->layout()->set("order", $r); return $this->add(); } } } // create objects for saving (if new) but don't save yet $owner_data = []; $billing_data = []; $request = $r->get(); foreach($request as $field => $value) { $m = []; if(preg_match('/([a-z0-9]+)_(.+)/i', $field, $m)) { if($m[1] == "owner" && !$owner) { $owner_data[$m[2]] = $value; } if($m[1] == "billing" && !$billingaddress) { $billing_data[$m[2]] = $value; } } } if(!$owner) { $owner = AddressModel::create($owner_data); } if(!$billingaddress) { $billingaddress = AddressModel::create($billing_data); } // create or save Order object $order_data = []; if(is_numeric($r->owner_id)) { $order_data['owner_id'] = $r->owner_id; } if(is_numeric($r->billingaddress_id)) { $order_data['billingaddress_id'] = $r->billingaddress_id; } if($r->billing_type == "sepa") { $order_data['billing_type'] = "sepa"; } else { $order_data['billing_type'] = "invoice"; } $order_data['bank_account_bank'] = $r->bank_account_bank; $order_data['bank_account_owner'] = $r->bank_account_owner; $order_data['bank_account_iban'] = $r->bank_account_iban; $order_data['bank_account_bic'] = $r->bank_account_bic; $order_data['allow_contact'] = ($r->allow_contact) ? 1 : 0; $order_data['allow_spin'] = ($r->allow_spin) ? 1 : 0; $order_data['note'] = $r->note; $order_data['order_date'] = Layout::dateToInt($r->order_date); if($r->finish_after) { $order_data['finish_after'] = Layout::dateToInt($r->finish_after); if(!$r->finish_after_comment) { $this->layout()->setFlash("Bitte Verzögerungsgrund angeben.", "warn"); $this->layout()->set("order", $r); return $this->add(); } $order_data['finish_after_comment'] = $r->finish_after_comment; } $send_to_bill_email = false; $order_data['edit_by'] = $this->me->id; //var_dump($r); if($r->order_finished == "1" && $this->me->is("Admin", "netoperator")) { if($r->finish_date) { $order_data['finish_date'] = Layout::dateToInt($r->finish_date); } else { $order_data['finish_date'] = date("U"); } if(!$order->finish_date) { // first same finishing order $send_to_bill_email = true; } } //var_dump($order_data);exit; if($mode == "add") { $order = OrderModel::create($order_data); } else { $order->update($order_data); } /* var_dump($order); var_dump($owner); var_dump($billingaddress); exit;*/ if(!$owner || !$billingaddress) { $this->layout()->setFlash("Fehler beim Speichern", "error"); $this->layout()->set("order", $order); return $this->add(); } $new_id = $order->save(); if(!$new_id) { $this->layout()->setFlash("Fehler beim Speichern", "error"); $this->layout()->set("order", $order); return $this->add(); } // save owner and billingaddress if new if($r->owner_id == "new") { $owner_id = $owner->save(); if(!$owner_id) { $this->layout()->setFlash("Fehler beim Speichern des Inhabers", "error"); $this->redirect("Order", "edit", ['id' => $new_id]); } $order->owner_id = $owner_id; $order->save(); } if($r->billingaddress_id == "new") { $billingaddress_id = $billingaddress->save(); if(!$billingaddress_id) { $this->layout()->setFlash("Fehler beim Speichern des Rechnungsempfängers", "error"); $this->redirect("Order", "edit", ['id' => $new_id]); } $owner->billingaddress_id = $billingaddress_id; $order->save(); } //var_dump($r->products);exit; // validate and add products if(is_array($r->products) && count($r->products)) { foreach($r->products as $product_id => $p) { //var_dump($p); if(!$product_id || !$p["product_id"]) { continue; } $prod = new Product($p['product_id']); if(!$prod->id) { $this->log->warn(__CLASS__."::save() Invalid product: ".$p['product_id']); } $product_data = []; $product_data["order_id"] = $new_id; $product_data["product_id"] = $p["product_id"]; $product_data['amount'] = (!empty($p['amount'])) ? $p['amount'] : 1; $product_data["pos"] = ($p["pos"]) ? $p['pos'] : $order->getNewPos(); $product_data["description"] = $p["description"]; $product_data["price"] = Layout::commaToDot($p["price"]); $product_data["price_setup"] = Layout::commaToDot($p["price_setup"]); $product_data["billing_delay"] = ($p["billing_delay"]) ? $p["billing_delay"] : 0; $product_data["billing_period"] = $p["billing_period"]; $require_term = false; if(array_key_exists(TT_ATTRIB_TERMINATION_REQUIRED_NAME, $prod->attributes) && $prod->attributes[TT_ATTRIB_TERMINATION_REQUIRED_NAME]->value == 1) { //var_dump($prod->attributes); $require_term = true; if(!$p['termination_id']) { $this->layout()->setFlash("Ein oder mehrere Produkte erfordern Anschluss.", "warn"); continue; } $product_data['termination_id'] = $p['termination_id']; } else { $product_data['termination_id'] = null; } if($product_id == "new") { $product = OrderProductModel::create($product_data); } else { $product = new OrderProduct($product_id); $product->update($product_data); } if(!$product->save()) { $this->log->warn("Unable to save OrderProduct:".print_r($product, true)); } // if product is not external and customer is new, create customer_number and service pin if(!$prod->external ) { if(!$owner->customer_number) { $last_num = AddressModel::getLastCustomerNumber(); $this->log->debug("last_num: $last_num"); if($last_num) { $new_num = $last_num + 1; } else { $new_num = TT_FIRST_CUSTNUM; } if(!AddressModel::search(['customer_number' => $new_num])) { $owner->customer_number = $new_num; $owner->save(); } } if(!$owner->spin) { $spin = $owner->generateServicePin(); if($spin && !AddressModel::search(['spin' => $spin])) { $owner->spin = $spin; if($owner->save()) { // render service pin PDF $pdf = new PdfForm("Emailtemplates/attachments/new_order_spin.pdf", ["owner" => $owner, "order" => $order]); $pdfpath = $pdf->render(); $tvalue = $pdf->getReturnedValues(); $pdfname = $tvalue['filename']; /*$pdf = new Layout(); $pdf->setTemplate("Emailtemplates/attachments/new_order.pdf"); $pdf->set("ressourcePathPrefix", BASEDIR."/public/"); $pdf->set("owner", $owner); $pdf->set("order", $order);*/ //var_dump($pdfpath);exit; // send email to customer // TODO template rendern auslagern nach Emailtempate klasse $tpl = new Layout(); $tpl->setTemplate("Emailtemplates/customer/new_order"); $tpl->set("owner", $owner); $body = $tpl->render(); $values = $tpl->getReturnedValue(); $subject = $values['subject']; $from = $values['from_email']; $from_name = $values['from_email_name']; $to = $owner->email; if(!$subject || !$from || !$from_name || !$to) { $this->log->warn("Service PIN Email not sent. (subject: '$subject', from: '$from', from_email: '$from_email', to: '$to')"); } else { $email = new Emailnotification(); $email->setSubject($subject); $email->setBody($body); $email->setFrom($from, $from_name); $email->setTo($to); $email->setHeader("X-Xinon-Oid", $order->id); $email->setHeader("X-Xinon-Pid", $product->id); $email->addAttachment($pdfpath, null, $pdfname, "application/pdf"); $email->send(); } } } } } } } //var_dump($_FILES['OrderFileUpload']);exit; // handle file upload if(array_key_exists("OrderFileUpload", $_FILES) && !$_FILES['OrderFileUpload']['error']) { //var_dump($_FILES);exit; $upload = new mfUpload("OrderFileUpload"); $upload->setSavepath(MFUPLOAD_FILE_SAVE_PATH."/documents"); $upload->save(); $file_data = []; $file_data['name'] = ($r->file_name) ? $r->file_name : $upload->getOriginalFilename(); $file_data['filename'] = ($r->file_filename) ? $r->file_filename : $upload->getOriginalFilename(); $file_data['store_filename'] = $upload->getFilename(); $file_data['orig_filename'] = $upload->getOriginalFilename(); $file = FileModel::create($file_data); $file_id = $file->save(); if(!$file_id) { $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); unlink($upload->getSavepath()."/".$upload->getFilename()); } else { $of = []; $of['order_id'] = $new_id; $of['file_id'] = $file_id; $of['name'] = $file->name; $of['description'] = $file->description; $orderfile = OrderFileModel::create($of); if(!$orderfile->save()) { $file->delete(); unlink($upload->getSavepath()."/".$upload->getFilename()); $this->layout()->setFlash("Dateiupload fehlgeschlagen", "warn"); } } } // send order finish email if($send_to_bill_email) { if(!$order->sendIntBillinfoEmail()) { $this->layout()->setFlash("Beim Senden der Billing Benachrichtigung ist ein Fehler aufgetreten.", "warning"); } } $this->layout()->setFlash("Bestellung erfolgreich gespeichert.", "success"); $this->redirect("Order", "edit", ["id" => $new_id]); } public function deleteAction() { if(!$this->me->is(["Admin","salespartner"])) { $this->layout()->setFlash("Keine Berechtigung", "error"); $this->redirect("Order"); } $id = $this->request->id; $order = new Order($id); if(!$order->id || $order->id != $id) { $this->layout()->setFlash("Bestellung nicht gefunden.", "error"); $this->redirect("Order"); } if(!$this->me->is("Admin")) { $my_network_ids = []; foreach($this->me->my_networks as $network) { $my_network_ids[] = $network->id; } if(!in_array($order->terminations[0]->building->network_id, $my_network_ids) ) { if($order->create_by != $this->me->id) { $this->layout()->setFlash("Keine Berechtigung", "error"); $this->redirect("Order"); } } } $order->deleteFiles(); $order->deletePositions(); // TODO: check if Product is unused $order->delete(); $this->layout()->setFlash("Bestellung gelöscht", "success"); $this->redirect("Order"); } protected function downloadServicePinAction() { $order_id = $this->request->id; if(!is_numeric($order_id) || !$order_id) { $this->layout->setFlash("Adresse nicht gefunden!"); $this->redirect("Order"); } $order = new Order($order_id); if(!$order->id) { $this->layout->setFlash("Bestellung nicht gefunden!"); $this->redirect("Order"); } $owner = $order->owner; if(!$owner->customer_number || !$owner->spin) { $this->layout->setFlash("Vertragsinhaber hat keine Kundennummer oder Service PIN!", "error"); $this->redirect("Order"); } // render service pin PDF $pdf = new PdfForm("Emailtemplates/attachments/new_order_spin.pdf", ["owner" => $owner, "order" => $order]); $pdfpath = $pdf->render(); $tvalue = $pdf->getReturnedValues(); $pdfname = $tvalue['filename']; $pdf->download($pdfname); } protected function sendServicePinAction() { $order_id = $this->request->id; if(!is_numeric($order_id) || !$order_id) { $this->layout->setFlash("Adresse nicht gefunden!"); $this->redirect("Order"); } $order = new Order($order_id); if(!$order->id) { $this->layout->setFlash("Bestellung nicht gefunden!"); $this->redirect("Order"); } $owner = $order->owner; if(!$owner->customer_number || !$owner->spin) { $this->layout->setFlash("Vertragsinhaber hat keine Kundennummer oder Service PIN!", "error"); $this->redirect("Order"); } // render service pin PDF $pdf = new PdfForm("Emailtemplates/attachments/new_order_spin.pdf", ["owner" => $owner, "order" => $order]); $pdfpath = $pdf->render(); $tvalue = $pdf->getReturnedValues(); $pdfname = $tvalue['filename']; // TODO template rendern auslagern nach Emailtempate klasse $tpl = new Layout(); $tpl->setTemplate("Emailtemplates/customer/new_order"); $tpl->set("owner", $owner); $body = $tpl->render(); $values = $tpl->getReturnedValue(); //var_dump($values);exit; $subject = $values['subject']; $from = $values['from_email']; $from_name = $values['from_email_name']; $to = $owner->email; if(!$subject || !$from || !$from_name || !$to) { $this->log->warn("Service PIN Email not sent. (subject: '$subject', from: '$from', from_email: '$from_name', to: '$to')"); $this->layout()->setFlash("Beim Email versenden ist ein Fehler aufgetreten.", "error"); $this->redirect("Order"); } else { $email = new Emailnotification(); $email->setSubject($subject); $email->setBody($body); $email->setFrom($from, $from_name); $email->setTo($to); $email->setHeader("X-Xinon-Oid", $order->id); $email->setHeader("X-Xinon-Pid", $product->id); $email->addAttachment($pdfpath, null, $pdfname, "application/pdf"); $email->send(); $this->layout()->setFlash("Service PIN wurde erfolgreich versendet.", "success"); $this->redirect("Order"); } } }