From 4af4622357e0a5058c72ade09f5732034770072d Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Mon, 18 Aug 2025 18:01:52 +0200 Subject: [PATCH 1/2] Snopp/Citycom Service Order Api --- .../Modules/Operationaldata/SnoppCitycom.php | 21 ++++++++- .../Api/v1/OperationaldataApicontroller.php | 1 + application/Preorder/Preorder.php | 44 ++++++++++++++++++- application/PreorderCtag/PreorderCtag.php | 5 +++ lib/Citycom/OanApiHelper.php | 13 +++++- scripts/adb-rimo-import/importer/citycom.php | 26 ++++++----- 6 files changed, 94 insertions(+), 16 deletions(-) diff --git a/application/Api/v1/Modules/Operationaldata/SnoppCitycom.php b/application/Api/v1/Modules/Operationaldata/SnoppCitycom.php index 7acdadf96..04c7fb9c8 100644 --- a/application/Api/v1/Modules/Operationaldata/SnoppCitycom.php +++ b/application/Api/v1/Modules/Operationaldata/SnoppCitycom.php @@ -56,6 +56,12 @@ class SnoppCitycom extends Modules\ApiControllerModule return \mfResponse::NotFound(["message" => "Home not found"]); } + // Home must have Status 300, else return deferred + if($wohneinheit->status->code < 300) { + return \mfResponse::Ok(["message" => "ONT not yet installed. Deferred", "activation_status" => "deferred"]); + } + + $cc_home_id = \Citycom_OanApiHelper::hausnummerExtrefToCitycomId($wohneinheit->extref); $data["up"] = $bb_up; $data["down"] = $bb_down; @@ -63,6 +69,14 @@ class SnoppCitycom extends Modules\ApiControllerModule $data["execution_date"] = ($execution_date) ? $execution_date->format("Y-m-d") : false; $data["services"] = CITYCOM_OAN_API_SERVICES_FOR_ORDER; + // check if mgmt ctag is set + // so we use the same ctag set for the real services + $mgmt_ctag = \PreorderCtag::getFirstActive(["preorder_id" => $preorder->id, "service_type" => "mgmt"]); + if($mgmt_ctag) { + $data["ctag_range_search"] = $mgmt_ctag->ctag; + } + + if($preorder->campaign->name == "Citycom - Graz") { $data["product_name"] = "Estmk Greenstream OAN $bb_down/$bb_up"; } @@ -71,13 +85,18 @@ class SnoppCitycom extends Modules\ApiControllerModule $cc_api_client = new \Citycom_OanApiClient(CITYCOM_OAN_API_USER, CITYCOM_OAN_API_PASS); $cc_api = new \Citycom_OanApiHelper($cc_api_client); + // order Service at Citycom and set Preorder to 500 Finished $services = $cc_api->orderServices($preorder, $cc_home_id, $data); if(!$services) { return \mfResponse::InternalServerError(["message" => "Error activating service"]); } + $preorder->setNewStatusCode(500); + $preorder->save(); + return \mfResponse::Ok(["message" => "Services ordered successfully", "activation_status" => "active"]); } -} \ No newline at end of file + +} diff --git a/application/Api/v1/OperationaldataApicontroller.php b/application/Api/v1/OperationaldataApicontroller.php index 86fa2e058..da17d35dc 100644 --- a/application/Api/v1/OperationaldataApicontroller.php +++ b/application/Api/v1/OperationaldataApicontroller.php @@ -50,6 +50,7 @@ class OperationaldataApicontroller extends mfBaseApicontroller $this->addRoute("/operationaldata/home/:id/connected", [$modules["Snopp"], "setPreorderConnected"], "POST"); $this->addRoute("/operationaldata/home/:id/active", [$modules["Snopp"], "setPreorderActive"], "POST"); + //$this->addRoute("/operationaldata/preorder/:id/orderServiceTest", [$modules["SnoppCitycom"], "orderServiceTest"], "POST"); $this->addRoute("/operationaldata/preorder/:id/orderService", [$modules["SnoppCitycom"], "orderService"], "POST"); } diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index d0565b985..c6c602367 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -671,6 +671,43 @@ class Preorder extends mfBaseModel { } + public function getFreeCtagsInSet($search_ctag) { + if(!$this->getProperty("adb_hausnummer")->vlan_stag) { + echo "no stag\n"; + return false; + } + + $stag = $this->adb_hausnummer->vlan_stag; + if(!$stag) { + return false; + } + + $ctags_per_home = 1; + + $network_name = ""; + if($this->adb_hausnummer->netzgebiet->source == "citycom-oan-api") { + $network_name = "citycom-oan"; + $ctags_per_home = count(CITYCOM_OAN_API_SERVICES_FOR_ORDER) + count(CITYCOM_OAN_API_SERVICES_FOR_RESERVATION); // Service VLANS + mgmt VLANS + } + + if(!$network_name) { + echo "no network\n"; + return false; + } + + // get start of ctag range + $first_ctag = $search_ctag - ($search_ctag % $ctags_per_home); + + $ctag_range = []; + for($i = $first_ctag; $i < $first_ctag + $ctags_per_home; $i++) { + if(!PreorderCtag::getFirstActive(["stag" => $stag, "ctag" => $i, "network" => $network_name])) { + $ctag_range[] = $i; + } + + } + return $ctag_range; + } + public function getNextFreeCtags() { if(!$this->getProperty("adb_hausnummer")->vlan_stag) { echo "no stag\n"; @@ -678,6 +715,10 @@ class Preorder extends mfBaseModel { } $stag = $this->adb_hausnummer->vlan_stag; + if(!$stag) { + return false; + } + $new_ctag = false; $ctags_per_home = 1; @@ -693,7 +734,7 @@ class Preorder extends mfBaseModel { return false; } - $last_ctag = PreorderCtag::getLast(["stag" => $stag, "network" => $network_name]); + $last_ctag = PreorderCtag::getLastActive(["stag" => $stag, "network" => $network_name]); if(!$last_ctag) { $new_ctag = $first_ctag; } else { @@ -988,6 +1029,7 @@ class Preorder extends mfBaseModel { if($status->code < $new_status->code) { $this->status_id = $new_status->id; } + return true; } public function getNetowner() { diff --git a/application/PreorderCtag/PreorderCtag.php b/application/PreorderCtag/PreorderCtag.php index a49d06c56..62eb0e910 100644 --- a/application/PreorderCtag/PreorderCtag.php +++ b/application/PreorderCtag/PreorderCtag.php @@ -219,6 +219,11 @@ class PreorderCtag extends mfBaseModel { return null; } + public static function getLastActive($filter) { + $filter["deleted"] = false; + return self::getLast($filter); + } + public static function getLast($filter) { $db = FronkDB::singleton(); diff --git a/lib/Citycom/OanApiHelper.php b/lib/Citycom/OanApiHelper.php index ae773fb5c..4fd0f7c66 100644 --- a/lib/Citycom/OanApiHelper.php +++ b/lib/Citycom/OanApiHelper.php @@ -94,6 +94,9 @@ class Citycom_OanApiHelper { $execution_date = date("Y-m-d"); } + if(array_key_exists("ctag_range_search", $data) && $data["ctag_range_search"]) { + $ctag_range_search = $data["ctag_range_search"]; + } $product_data = [ "up" => $up, @@ -113,10 +116,16 @@ class Citycom_OanApiHelper { $new_services = []; - $ctags = $preorder->getNextFreeCtags(); + if($ctag_range_search) { + $ctags = $preorder->getFreeCtagsInSet($ctag_range_search); + } else { + $ctags = $preorder->getNextFreeCtags(); + } + + $this->log->debug(print_r($ctags, true)); if(!$ctags) { - $this->log->error(__METHOD__.": No New Free Ctags (Preorder ".$preorder->id.")"); + $this->log->error(__METHOD__.": No Free Ctags (Preorder ".$preorder->id.")"); return false; } diff --git a/scripts/adb-rimo-import/importer/citycom.php b/scripts/adb-rimo-import/importer/citycom.php index f1ce5ee62..c6751bdcc 100644 --- a/scripts/adb-rimo-import/importer/citycom.php +++ b/scripts/adb-rimo-import/importer/citycom.php @@ -134,17 +134,19 @@ class CitycomImporter { $unit->save(); } - $status_300 = \ADBStatusModel::getFirst(["code" => 300]); - if(!$status_300) { - die("ADB Status 300 not found"); - } if($unit->status->code < 300) { + $status_300 = \ADBStatusModel::getFirst(["code" => 300]); + if(!$status_300) { + die("ADB Status 300 not found"); + } + $unit->status_id = $status_300->id; $unit->save(); } - $status_code_241 = \ADBStatusModel::getFirst(["code" => 241]); if($hausnummer->status->code < 241) { + $status_code_241 = \ADBStatusModel::getFirst(["code" => 241]); + $hausnummer->status_id = $status_code_241->id; $hausnummer->save(); } @@ -216,11 +218,11 @@ class CitycomImporter { if(!$unit) continue; $preorder = \PreorderModel::getFirst(["adb_wohneinheit_id" => $unit->id]); - if(!$preorder) continue; + if(!$preorder) { + continue; + } - - - if(property_exists($service, "ont") && !$service->ont && !$service->ont->id) { + if(property_exists($service, "ont") && $service->ont && $service->ont->id) { $pco = \PreorderCitycomOan::getFirst(["preorder_id" => $preorder->id]); if(!$pco) { $pco = \PreorderCitycomOan::create([ @@ -232,8 +234,8 @@ class CitycomImporter { $ont_gpid = $service->ont->fsan; if($ont_sn || $ont_gpid) { - $status_300 = \PreorderstatusModel::getFirst(["code" => 300]); if($preorder->status->code < 300) { + $status_300 = \PreorderstatusModel::getFirst(["code" => 300]); $preorder->status_id = $status_300->id; $preorder->save(); } @@ -254,11 +256,11 @@ class CitycomImporter { $ctag = \PreorderCtag::getFirstActive(["preorder_id" => $preorder->id, "stag" => $stag, "service_type" => $stypes[$service->service_type]]); //echo "====\n"; //echo $preorder->id." - ".$service->service_number." - ".$service->location->sublocation->id." - ".$service->service_type." - $stag\n"; - if($ctag->ext_id != $service->service_number) { + if($ctag && $ctag->ext_id != $service->service_number) { $ctag->ext_id = $service->service_number; $ctag->save(); } - if($ctag->ext_status != $service->state) { + if($ctag && $ctag->ext_status != $service->state) { $ctag->ext_status = $service->state; $ctag->save(); } From 2322226712c2460c1518ac9f864c28e4437739ac Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Mon, 18 Aug 2025 18:04:06 +0200 Subject: [PATCH 2/2] Snopp/Citycom Service Order Api --- lib/Citycom/OanApiClient.php | 2 +- lib/Citycom/OanApiHelper.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Citycom/OanApiClient.php b/lib/Citycom/OanApiClient.php index 24cac04c8..c0b7cb7c4 100644 --- a/lib/Citycom/OanApiClient.php +++ b/lib/Citycom/OanApiClient.php @@ -309,7 +309,7 @@ class Citycom_OanApiClient { return true; } - private function runApiRequest($url, $ctx_opts, $url_params = [], $page_num = 1) { + private function runApiRequest($url, $ctx_opts, $url_params = [], $page_num = 1) : mixed { $current_page = $page_num; $return_data = []; diff --git a/lib/Citycom/OanApiHelper.php b/lib/Citycom/OanApiHelper.php index 4fd0f7c66..75e37fce9 100644 --- a/lib/Citycom/OanApiHelper.php +++ b/lib/Citycom/OanApiHelper.php @@ -165,7 +165,7 @@ class Citycom_OanApiHelper { //continue; // register new Service with Citycom - /*$new_service = $this->api->createService($service_data); + $new_service = $this->api->createService($service_data); if(!$new_service) { $this->log->error(__METHOD__.": Error creating service"); @@ -182,9 +182,9 @@ class Citycom_OanApiHelper { "serial" => $new_service->ont->serial, "fsan" => $new_service->ont->fsan, ], - ];*/ + ]; - $service_return[] = [ + /*$service_return[] = [ "sublocation_id" => $sublocation_id, "service_number" => "30-fggreger-01", "service_type" => $ctag_service_type, @@ -193,7 +193,7 @@ class Citycom_OanApiHelper { "serial" => "ONT123456", "fsan" => "FSAN7890", ], - ]; + ];*/ // save ctag $ctag_data = $preorder_ctag_data;