<?php

class OrderController 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", "salespartner"])) {
      $this->redirect("Dashboard");
    }
  }
  
  protected function indexAction() {
    $this->layout()->setTemplate("Order/Index");
    
    if($this->request->id && $this->me->is("Admin")) {
      $order = new Order($this->request->id);
      if($order->id) {
        $this->layout()->set("orders", [$order]);
        $this->layout()->set("highlight", $this->request->id);
        $this->layout()->set("mynetworks", NetworkModel::getAll());
        
        if($this->request->addJournal) {
          $this->layout()->set("addJournal", true);
        }
        
        return true;
      }
    }
    
    $filter = [];
    
    $this->layout->set("filter", $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 = [];
    
    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;
      }
    }
    //var_dump($order_search);exit;
    $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;
      }
    }
    
    if(!array_key_exists("network_linked_status", $order_search)) {
      $lonelyOrders = [];
      unset($order_search["network_id"]);
      $order_search['product_id'] = null;
      // orders without a product
      if($this->me->isAdmin()) {
        if(!$this->request->filter['network_id']) {
          $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;
        }
      }

      // orders with termination product not requiring termination_id
      $order_search['product_id'] = ">0";
      $order_search['termination_id'] = null;
      if($this->me->isAdmin()) {
        if(!$this->request->filter['network_id']) {
          $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)) {
          $o = new Order($order->id);
          $add = true;
          foreach($o->products as $p) {
            $attribs = $p->product->attributes;
            if(is_array($attribs) && count($attribs)) {
              if(array_key_exists(TT_ATTRIB_TERMINATION_REQUIRED_NAME, $attribs)
                && $attribs[TT_ATTRIB_TERMINATION_REQUIRED_NAME]->value == 1) {
                //$this->log->debug("found additional order where termination_required 0");
                //$lonelyOrders[$order->id] = $order;
                $add = false;
                break;
              }
            } else {
              $add = true;
            }
          }
          if($add) {
            $lonelyOrders[$order->id] = $order;
          }

          //$lonelyOrders[$order->id] = $order;
        }
      }
      
      $this->layout()->set("lonelyOrders", $lonelyOrders);
    }
    

    $this->layout()->set("orders", $orders);
    $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;
          $new_filter["termination_status_code"] = "<".TT_TERMSTATUS_CONNECTED;
        }
        if($status == "pipework_needed") {
          $new_filter["building_status_code"] = "<".TT_BUILDINGSTATUS_CONNECTED;
          $new_filter["termination_status_code"] = "<".TT_TERMSTATUS_CONNECTED;
        }
        
        if($status == "systemowner_action_status" && $this->me->is("Admin")) {
          $new_filter['network_linked_status'] = [];
          foreach(NetworkModel::getAll() as $network) {
            if($network->sytemowner_action_status) {
              $new_filter['network_linked_status'][$network->id] = $network->sytemowner_action_status;
            }
            if(!count($new_filter['network_linked_status'])) {
              unset($new_filter['network_linked_status']);
            }
          }
        }

      }
      
      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['partner_number'] = $r->partner_number;
    $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 time 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();
    }
    
    
    $ext_products = false;
    $int_products = false;
    
    //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"]);
        
        if($this->me->is("Admin") && $p["price_nne"]) {
          $product_data["price_nne"] = Layout::commaToDot($p["price_nne"]);
        } else {
          $product_data["price_nne"] = $prod->price_nne;
        }
        if($this->me->is("Admin") && $p["price_nbe"]) {
          $product_data["price_nbe"] = Layout::commaToDot($p["price_nbe"]);
        } else {
          $product_data["price_nbe"] = $prod->price_nbe;
        }
        
        $product_data["billing_delay"] = ($p["billing_delay"]) ? $p["billing_delay"] : 0;
        if($product_data["billing_delay"] > 6) {
          $product_data["billing_delay"] = 6;
        }
        $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) {
          $ext_products = true;
        } else {
          $int_products = true;
          
          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();
            }
          }
          
          // generate and send Service PIN
          // only if owner_id wasn't changed
          $this->log->debug("test");
          if(!$owner->spin && (!property_exists($order->_old_data, "owner_id") || $order->owner_id == $order->_old_data->owner_id)) {
            $this->log->debug(__CLASS__."::save(): creating new SPIN for ".$owner->getCompanyOrName()." (".$owner->id.")");
            $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'];
                
                // 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();
                  $this->log->info(__CLASS__."::save(): Sending new SPIN for ".$owner->getCompanyOrName()." (".$owner->id.")");
                }
                
              }
              
            }
          } else {
            $this->log->debug(__CLASS__."::save(): NOT creating new SPIN for ".$owner->getCompanyOrName()." (".$owner->id."): SPIN exists or owner of Order was changed");
          }
        }
      }
    }
    
    //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['subfolder'] = "documents";
      $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($ext_products && !$int_products) {
        if(!$order->sendExtBillinfoEmail()) {
          $this->layout()->setFlash("Beim Senden der externen Billing Benachrichtigung ist ein Fehler aufgetreten.", "warning");
        }
      }
      
      if($int_products) {
        if(!$order->sendIntBillinfoEmail()) {
          $this->layout()->setFlash("Beim Senden der Billing Benachrichtigung ist ein Fehler aufgetreten.", "warning");
        }
      }
      
      if($int_products && $ext_products) {
        $this->layout()->setFlash("Eigene und Fremdprodukte gefunden, nur interne Billing Benachrichtigung verschickt.", "warning");
      }
    }
    
    $this->layout()->setFlash("Bestellung erfolgreich gespeichert.", "success");
    $this->redirect("Order", "edit", ["id" => $new_id]);
    
  }
  
  protected function saveVorortterminAction() {
    if(!$this->me->is(["Admin","salespartner"])) {
      $this->layout()->setFlash("Keine Berechtigung", "error");
      $this->redirect("Order");
    }
    
    $r = $this->request;
    
    $order_id = $r->id;
    if(!is_numeric($order_id) || $order_id < 1) {
      $this->returnJson(["status" => "error", "order" => ['id' => $order_id]]);
    }
    
    $order = new Order($order_id);
    if(!$order->id) {
      $this->returnJson(["status" => "error", "order" => ['id' => $order_id]]);
    }
    
    $date = $r->install_date;
    if($date === null) {
      $this->returnJson(["status" => "error", "order" => ['id' => $order_id]]);
    }

    if($date) {
      $date = Layout::dateToInt($date);
      if(!$date) {
        $this->returnJson(["status" => "error", "order" => ['id' => $order_id]]);
      }
    } elseif($date === "") {
      $date = null;
    }
    
    if($date && !$order->install_date && is_array($order->terminations)) {
      $term = $order->terminations[0];
      if(!$term->getWorkflowvalue("pop_id")) {
        $this->returnJson(["status" => "error", "msg" => "Kein POP im Leitungsbau !", "order" => ['id' => $order_id]]);
      }
    }
    
    $order->install_date = $date;
    $order->cpeprovisioning_enabled = ($date) ? 1 : 0;
    $order->save();
    
    $this->returnJson(["status" => "OK", "order" => ['id' => $order_id, 'date' => ($date) ? date('d.m.Y', $date) : ""]]);
  }
  
  protected function saveCpeprovisioningAction() {
    if(!$this->me->is(["Admin","salespartner"])) {
      $this->layout()->setFlash("Keine Berechtigung", "error");
      $this->redirect("Order");
    }
    
    $r = $this->request;
    
    $order_id = $r->id;
    if(!is_numeric($order_id) || $order_id < 1) {
      $this->returnJson(["status" => "error", "msg" => "Fehler beim Speichern!", "order" => ['id' => $order_id]]);
    }
    
    $order = new Order($order_id);
    if(!$order->id) {
      $this->returnJson(["status" => "error", "msg" => "Fehler beim Speichern!", "order" => ['id' => $order_id]]);
    }
    
    $enabled = $r->enabled;
    if($enabled === null || !is_numeric($enabled)) {
      $this->returnJson(["status" => "error", "msg" => "Fehler beim Speichern!", "order" => ['id' => $order_id]]);
    }

    $term = $order->terminations[0];
    if($enabled && !$term->getWorkflowvalue("pop_id")) {
      $this->returnJson(["status" => "error", "msg" => "Kein POP im Leitungsbau !", "order" => ['id' => $order_id, "enabled" => 0]]);
    }
    
    $order->cpeprovisioning_enabled = ($enabled) ? 1 : 0;
    $order->save();
    
    $this->returnJson(["status" => "OK", "order" => ['id' => $order_id]]);
  }
  
  protected 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");
    }
  }
  
}
