contract; return true; } public function init() { $this->errors["voicenumberblock_voicenumber"] = []; // get voip routing for number $this->getVoipRouting(); } private function getVoipRouting() { if(is_array($this->contract->configvalues)) { // look in contract config if(array_key_exists("voip_routing",$this->contract->configvalues) && $this->contract->configvalues['voip_routing']->value->string) { $this->voip_routing = $this->contract->configvalues['voip_routing']->value->string; } else { // else take first value (default) $typedata = $this->contract->configvalues['voip_routing']->getTypedataArray(); $this->voip_routing = $typedata[0]; } } return $this->voip_routing; } public function beforeSave() { // checking before save, to return errors before saving anything return $this->checkNewNumbers(); } public function afterSave() { // checking again, just to be sure $this->checkNewNumbers(); // load voip routing again, in case it changed with the same config update $this->getVoipRouting(); if(count($this->errors["voicenumberblock_voicenumber"])) { return false; } foreach($this->create_numbers as $voicenumberblock_id => $numbers) { foreach($numbers as $number){ $voicenumber = VoicenumberModel::getFirst(['number' => $number]); if(!$voicenumber) { if($voicenumberblock_id == "none") { $voicenumberblock_id = null; } $this->log->debug("creating voicenumber $number in block $voicenumberblock_id"); $voicenumber = VoicenumberModel::create([ 'voicenumberblock_id' => $voicenumberblock_id, "contract_id" => $this->contract->id, 'active' => 1, 'activated_date' => date('U'), 'routing' => $this->voip_routing, 'number' => $number, 'disabled' => 0 ]); if(!$voicenumber->save()) { $this->errors["voicenumberblock_voicenumber"][] = "Error saving new number $number"; } } } } foreach($this->update_numbers as $number) { $voicenumber = VoicenumberModel::getFirst(['number' => $number]); $this->log->debug("creating voicenumber $number in block $voicenumberblock_id"); $voicenumber->update([ "contract_id" => $this->contract->id, 'active' => 1, 'activated_date' => date('U'), 'routing' => $this->voip_routing, 'disabled' => 0 ]); if(!$voicenumber->save()) { $this->errors["voicenumberblock_voicenumber"][] = "Error saving existing number $number"; } } if(count($this->errors["voicenumberblock_voicenumber"])) { return false; } return true; } /* * TODO: Check if contract was canceled, then set lock and lock_reason to reserved * => should go into beforeCancel event */ public function checkNewNumbers() { $this->log->debug(":: In Contractconfig_Hook_Voicenumberblock->afterSave()"); // check if number was saved if(!array_key_exists("voicenumber", $this->configitems)) { $this->log->debug("configitem voicenumber does not exists"); return true; } $item = $this->configitems['voicenumber']; //var_dump($item);exit; if($item->value->json) { $numbers = json_decode($item->value->json); } if(!is_array($numbers) || !count($numbers)) { return true; } foreach($numbers as $number) { if(!$number) { $this->log->debug("Keine nummer gespeichert"); continue; } $this->log->debug("Nummer: $number"); // check if Voicenumber exists $voicenumberblock = Voicenumberblock::findBlock($number); if(!$voicenumberblock) { // XXX: Create without block! //$this->errors["voicenumberblock_voicenumber"][] = "Ungültige Rufnummer $number: Kein aktiver Rufnummernblock gefunden"; //continue; if(!array_key_exists("none", $this->create_numbers)) { $this->create_numbers["none"] = []; } $this->create_numbers["none"][] = $number; } else { if(!$voicenumberblock->isNumberInBlock($number)) { $this->errors["voicenumberblock_voicenumber"][] = "Ungültige Rufnummer $number: Bitte Rufnummernlänge kontrollieren! Block erlaubt ".$voicenumberblock->first ." bis ".$voicenumberblock->last; continue; } $voicenumber = VoicenumberModel::getFirst(['number' => $number]); if($voicenumber) { // check if number belongs to another contract if($voicenumber->contract_id) { if($voicenumber->contract_id == $this->contract->id) { // belongs to our contract already => no changes needed continue; } $this->errors["voicenumberblock_voicenumber"][] = "Ungültige Rufnummer $number: Rufnummer gehört zu bestehendem contract ".$voicenumber->contract_id; continue; } // check if number is locked if($voicenumber->disabled) { $this->errors["voicenumberblock_voicenumber"][] = "Ungültige Rufnummer $number: Rufnummer ist gesperrt ".$voicenumber->contract_id; continue; } // check if number was ported out if($voicenumber->ported_out) { $this->errors["voicenumberblock_voicenumber"][] = "Ungültige Rufnummer $number: Rufnummer wurde rausportiert ".$voicenumber->contract_id; continue; } $this->update_numbers[] = $number; } else { if(!array_key_exists($voicenumberblock->id, $this->create_numbers)) { $this->create_numbers[$voicenumberblock->id] = []; } $this->create_numbers[$voicenumberblock->id][] = $number; } } } if(count($this->errors["voicenumberblock_voicenumber"])) { return false; } return true; } public function beforeCancel() { } public function afterCancel() { } }