Merge branch 'fronkdev' into 'master'

Snopp/Citycom Service Order Api

See merge request fronk/thetool!1643
This commit is contained in:
Frank Schubert
2025-08-18 16:04:48 +00:00
7 changed files with 99 additions and 21 deletions

View File

@@ -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"]);
}
}
}

View File

@@ -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");
}

View File

@@ -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() {

View File

@@ -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();

View File

@@ -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 = [];

View File

@@ -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;
}
@@ -156,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");
@@ -173,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,
@@ -184,7 +193,7 @@ class Citycom_OanApiHelper {
"serial" => "ONT123456",
"fsan" => "FSAN7890",
],
];
];*/
// save ctag
$ctag_data = $preorder_ctag_data;

View File

@@ -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();
}