Security->check_auth_page('operator.php'); if($_SERVER['REQUEST_METHOD'] == 'POST'){ require_once '../includes/Validate.class.php'; $validate = new Validate($qls); $validate->returnData['success'] = array(); if ($validate->returnData['active'] == 'inactive') { echo json_encode($validate->returnData); return; } $data = json_decode($_POST['data'], true); validate($data, $validate, $qls); if (!count($validate->returnData['error'])){ $action = $data['action']; $cabinetID = $data['cabinetID']; $cabinet = $qls->App->envTreeArray[$cabinetID]; $cabinetSize = $cabinet['size']; $RUOrientation = $cabinet['ru_orientation']; $cabinetParentID = getCabinetParentID($cabinet['parent'], $qls); $topObject = $qls->SQL->fetch_assoc($qls->SQL->select('*', 'app_object', array('env_tree_id' => array('=', $cabinetID)), array('RU', 'DESC'), array(0,1))); $bottomObj = $qls->SQL->fetch_assoc($qls->SQL->select('*', 'app_object', array('env_tree_id' => array('=', $cabinetID), 'AND', 'parent_id' => array('=', 0)), array('RU', 'ASC'), array(0,1))); $bottomTemplate = $qls->App->templateArray[$bottomObj['template_id']]; $bottomRUSize = $bottomTemplate['templateRUSize']; $topOccupiedRU = $topObject['RU']; $bottomTopMinRU = $topOccupiedRU; $bottomOccupiedRU = $bottomObj['RU'] + $bottomRUSize; $RUDiff = $cabinetSize - $bottomOccupiedRU; $TopBottomMinRU = ($cabinetSize - $RUDiff) + 1; if($action == 'adj') { $attrLocalCabinet = $data['side'] == 'adjCabinetSelectL' ? 'right_cabinet_id' : 'left_cabinet_id'; $attrAdjCabinet = $data['side'] == 'adjCabinetSelectL' ? 'left_cabinet_id' : 'right_cabinet_id'; $localCabinetID = $cabinetID; $adjCabinetID = $data['adjCabinetID']; // Build array to loop through $adjacencyArray = array( array($localCabinetID, $attrLocalCabinet), array($adjCabinetID, $attrAdjCabinet) ); // Find and delete any existing adjacencies that this change supercedes foreach($adjacencyArray as $adjacencyEntry) { $adjacencyCabinetID = $adjacencyEntry[0]; $adjacencyCabinetAttr = $adjacencyEntry[1]; if(isset($qls->App->cabinetAdjacencyArray[$adjacencyCabinetID])) { $adjacencyEntry = $qls->App->cabinetAdjacencyArray[$adjacencyCabinetID]; $rowID = $adjacencyEntry['id']; if($adjacencyEntry[$adjacencyCabinetAttr] == $adjacencyCabinetID) { $qls->SQL->delete('app_cabinet_adj', array('id' => array('=', $rowID))); } } } // Do not insert adjacency entry if the entry was cleared if($adjCabinetID != 0) { $qls->SQL->insert('app_cabinet_adj', array($attrLocalCabinet, $attrAdjCabinet), array($localCabinetID, $adjCabinetID)); // Log history $localCab = $qls->App->envTreeArray[$localCabinetID]['nameString']; $adjCab = $qls->App->envTreeArray[$adjCabinetID]['name']; $actionString = 'Cabinet adjacency: '.$localCab.'/'.$adjCab.''; $qls->App->logAction(2, 1, $actionString); } else { // Log history $localCab = $qls->App->envTreeArray[$localCabinetID]['nameString']; $adjCabID = $qls->App->cabinetAdjacencyArray[$localCabinetID][$attrAdjCabinet]; $adjCab = $qls->App->envTreeArray[$adjCabID]['name']; $actionString = 'Cabinet adjacency: '.$localCab.'/'.$adjCab.''; $qls->App->logAction(2, 3, $actionString); } } else if($action == 'path') { $localCabinetID = $cabinetID; $adjCabinetID = $data['value']; $pathID = $data['pathID']; $query = $qls->SQL->select('*', 'app_cable_path', array('id' => array('=', $pathID))); $cablePath = $qls->SQL->fetch_assoc($query); $attrAdjCabinet = $cablePath['cabinet_a_id'] == $localCabinetID ? 'cabinet_b_id' : 'cabinet_a_id'; $qls->SQL->update('app_cable_path', array($attrAdjCabinet => $adjCabinetID), array('id' => array('=', $pathID))); // Log history $localCab = $qls->App->envTreeArray[$localCabinetID]['nameString']; $cablePath = $qls->App->cablePathArray[$pathID]; $originalAdjCabinetID = ($cablePath['cabinet_a_id'] == $localCabinetID) ? $cablePath['cabinet_b_id'] : $cablePath['cabinet_a_id']; $originalAdjCab = ($originalAdjCabinetID == 0) ? 'Empty' : $qls->App->envTreeArray[$originalAdjCabinetID]['name']; $adjCab = $qls->App->envTreeArray[$adjCabinetID]['name']; $actionString = 'Cable path peer: From '.$localCab.'/'.$originalAdjCab.' to '.$adjCab.''; $qls->App->logAction(2, 2, $actionString); } else if($action == 'distance') { $pathID = $data['pathID']; // Convert distance from meters to millimeters $distance = $data['distance']*1000; $qls->SQL->update('app_cable_path', array('distance' => $distance), array('id' => array('=', $pathID))); // Log history $cablePath = $qls->App->cablePathArray[$pathID]; $localCabID = ($cablePath['cabinet_a_id'] == 0) ? $cablePath['cabinet_b_id'] : $cablePath['cabinet_a_id']; $adjCabID = ($cablePath['cabinet_a_id'] == 0) ? $cablePath['cabinet_a_id'] : $cablePath['cabinet_b_id']; $localCab = $qls->App->envTreeArray[$localCabID]['nameString']; $adjCab = ($adjCabID == 0) ? 'Empty' : $qls->App->envTreeArray[$adjCabID]['name']; $originalLength = $qls->App->convertToHighestHalfMeter($cablePath['distance']); $newLength = $qls->App->convertToHighestHalfMeter($distance); $actionString = 'Cable path distance: '.$localCab.'/'.$adjCab.' from '.$originalLength.'m. to '.$newLength.'m.'; $qls->App->logAction(2, 2, $actionString); } else if($action == 'notes') { $pathID = $data['pathID']; $notes = $data['value']; $qls->SQL->update('app_cable_path', array('notes' => $notes), array('id' => array('=', $pathID))); // Log history $cablePath = $qls->App->cablePathArray[$pathID]; $localCabID = ($cablePath['cabinet_a_id'] == 0) ? $cablePath['cabinet_b_id'] : $cablePath['cabinet_a_id']; $adjCabID = ($cablePath['cabinet_a_id'] == 0) ? $cablePath['cabinet_a_id'] : $cablePath['cabinet_b_id']; $localCab = $qls->App->envTreeArray[$localCabID]['nameString']; $adjCab = ($adjCabID == 0) ? 'Empty' : $qls->App->envTreeArray[$adjCabID]['name']; $actionString = 'Cable path note: '.$localCab.'/'.$adjCab.''; $qls->App->logAction(2, 2, $actionString); } else if($action == 'delete') { $pathID = $data['pathID']; $qls->SQL->delete('app_cable_path', array('id' => array('=', $pathID))); // Log history $cablePath = $qls->App->cablePathArray[$pathID]; $localCabID = ($cablePath['cabinet_a_id'] == 0) ? $cablePath['cabinet_b_id'] : $cablePath['cabinet_a_id']; $adjCabID = ($cablePath['cabinet_a_id'] == 0) ? $cablePath['cabinet_a_id'] : $cablePath['cabinet_b_id']; $localCab = $qls->App->envTreeArray[$localCabID]['nameString']; $adjCab = ($adjCabID == 0) ? 'Empty' : $qls->App->envTreeArray[$adjCabID]['name']; $actionString = 'Cable path: '.$localCab.'/'.$adjCab.''; $qls->App->logAction(2, 3, $actionString); } else if($action == 'new') { $validate->returnData['success']['entranceMax'] = $cabinetSize; $validate->returnData['success']['localCabinets'] = getChildCabinets($cabinetID, $cabinetParentID, $qls); $qls->SQL->insert('app_cable_path', array('cabinet_a_id', 'path_entrance_ru', 'distance'), array($cabinetID, $cabinetSize, 1000)); $validate->returnData['success']['newID'] = $qls->SQL->insert_id(); // Log history $cabinetName = $qls->App->envTreeArray[$cabinetID]['nameString']; $actionString = 'Blank cable path: '.$cabinetName.''; $qls->App->logAction(2, 1, $actionString); } else if($action == 'RU') { $RUSize = $data['RUSize']; $validate->returnData['success']['size'] = $RUSize; $validate->returnData['success']['originalSize'] = $cabinetSize; $occupiedRUs = $qls->App->getCabinetOccupiedRUs($cabinetID); if($RUSize < $occupiedRUs['orientationSpecificMin']) { $errMsg = 'Invalid RU size.'; array_push($validate->returnData['error'], $errMsg); } if(!count($validate->returnData['error'])){ $qls->SQL->update('app_env_tree', array('size' => $RUSize), array('id' => array('=', $cabinetID))); if($RUOrientation) { $RUDiff = $cabinetSize - $RUSize; foreach($qls->App->objectByCabinetArray[$cabinetID] as $objID) { $obj = $qls->App->objectArray[$objID]; $objTemplateID = $obj['template_id']; $objTemplate = $qls->App->templateArray[$objTemplateID]; if($objTemplate['templateType'] == 'Standard') { $objRU = $obj['RU']; $newObjRU = $objRU - $RUDiff; $qls->SQL->update('app_object', array('RU' => $newObjRU), array('id' => array('=', $objID))); } } } // Log history $cabinetName = $qls->App->envTreeArray[$cabinetID]['nameString']; $originalRUSize = $qls->App->envTreeArray[$cabinetID]['size']; $actionString = 'Cabinet RU: '.$cabinetName.' from '.$originalRUSize.' to '.$RUSize.''; $qls->App->logAction(2, 2, $actionString); } } else if($action == 'RUOrientation') { $RUOrientation = $data['value']; $qls->SQL->update('app_env_tree', array('ru_orientation' => $RUOrientation), array('id' => array('=', $cabinetID))); $validate->returnData['success']['RUOrientation'] = $RUOrientation; $validate->returnData['success']['RUData'] = $qls->App->getCabinetOccupiedRUs($cabinetID, $RUOrientation); } else if($action == 'get') { $cabinets = getChildCabinets($cabinetID, $cabinetParentID, $qls); $validate->returnData['success']['path'] = array(); $result = $qls->SQL->select('*', 'app_cable_path', array('cabinet_a_id' => array('=', $cabinetID), 'OR', 'cabinet_b_id' => array('=', $cabinetID))); while ($row = $qls->SQL->fetch_assoc($result)) { $attrCabinet = $row['cabinet_a_id'] == $cabinetID ? 'cabinet_b_id' : 'cabinet_a_id'; array_push($validate->returnData['success']['path'], array( 'id' => $row['id'], 'cabinetID' => $row[$attrCabinet], 'distance' => $row['distance']*0.001, 'entrance' => $row['path_entrance_ru'], 'notes' => $row['notes'] )); } $validate->returnData['success']['allCabinets'] = $cabinets; $validate->returnData['success']['localCabinets'] = getLocalCabinets($cabinetID, $qls); //Gather adjacency data $result = $qls->SQL->select('*', 'app_cabinet_adj', 'left_cabinet_id = '.$cabinetID.' OR right_cabinet_id = '.$cabinetID); while($row = $qls->SQL->fetch_assoc($result)) { $attrAdjCabinetID = $row['left_cabinet_id'] == $cabinetID ? 'right_cabinet_id' : 'left_cabinet_id'; $attrAdjCabinetKey = $row['left_cabinet_id'] == $cabinetID ? 'adjRight' : 'adjLeft'; $validate->returnData['success'][$attrAdjCabinetKey]['cabinetID'] = $row[$attrAdjCabinetID]; $validate->returnData['success'][$attrAdjCabinetKey]['entranceRU'] = $row['entrance_ru']; } $validate->returnData['success']['cabName'] = $cabinet['name']; $validate->returnData['success']['cabSize'] = $cabinetSize; $validate->returnData['success']['entranceMax'] = $cabinetSize; $validate->returnData['success']['RUOrientation'] = $RUOrientation; $validate->returnData['success']['RUData'] = $qls->App->getCabinetOccupiedRUs($cabinetID); } else if($action == 'updateCabinetRUMin') { $validate->returnData['success']['RUData'] = $qls->App->getCabinetOccupiedRUs($cabinetID); } else if($action == 'getFloorplan') { // Retrieve floorplan data $query = $qls->SQL->select('*', 'app_env_tree', array('id' => array('=', $cabinetID))); $floorplan = $qls->SQL->fetch_assoc($query); $floorplanImg = $floorplan['floorplan_img']; if(isset($floorplanImg)) { $validate->returnData['success']['floorplanImg'] = $floorplanImg; } else { $validate->returnData['success']['floorplanImg'] = false; } // Retrieve portName data $compatibilityArray = array(); $query = $qls->SQL->select('*', 'app_object_compatibility'); while($row = $qls->SQL->fetch_assoc($query)) { $compatibilityArray[$row['template_id']][$row['side']][$row['depth']] = $row; } // Retrieve object data $floorplanObjectData = array(); if(isset($qls->App->objectByCabinetArray[$cabinetID])) { foreach($qls->App->objectByCabinetArray[$cabinetID] as $objectID) { $object = $qls->App->objectArray[$objectID]; $objectTemplateID = $object['template_id']; $type = $qls->App->compatibilityArray[$objectTemplateID][0][0]['templateType']; $tempArray = array( 'id' => $objectID, 'type' => $type, 'position_top' => $object['position_top'], 'position_left' => $object['position_left'], 'html' => $qls->App->floorplanObjDetails[$type]['html'] ); array_push($floorplanObjectData, $tempArray); } } $validate->returnData['success']['floorplanObjectData'] = $floorplanObjectData; } else if($action == 'getFloorplanObjectPeerTable') { // Retrieve floorplan data $floorplan = $qls->App->envTreeArray[$cabinetID]; $floorplanImg = $floorplan['floorplan_img']; if(isset($floorplanImg)) { $validate->returnData['success']['floorplanImg'] = $floorplanImg; } else { $validate->returnData['success']['floorplanImg'] = false; } // Retrieve object data $floorplanObjectData = array(); $floorplanObjectPeerTable = array(); $query = $qls->SQL->select('*', 'app_object', array('env_tree_id' => array('=', $cabinetID))); while($object = $qls->SQL->fetch_assoc($query)) { $objectID = $object['id']; $objectName = $object['name']; $type = $qls->App->compatibilityArray[$object['template_id']][0][0]['templateType']; if($peerRecord = $qls->App->peerArrayWalljack[$objectID]) { foreach($peerRecord as $peer) { $peerEntryID = $peer['rowID']; $peerID = $peer['id']; $peerFace = $peer['face']; $peerDepth = $peer['depth']; $peerPort = $peer['port']; $selfPortID = $peer['selfPortID']; $portFlags = $qls->App->getPortFlags($objectID, 0, 0, $selfPortID); $peerTemplateID = $qls->App->objectArray[$peerID]['template_id']; $peerCompatibility = $qls->App->compatibilityArray[$peerTemplateID][$peerFace][$peerDepth]; $peerPortNameFormat = $peerCompatibility['portNameFormat']; $peerPortLayoutX = $peerCompatibility['portLayoutX']; $peerPortLayoutY = $peerCompatibility['portLayoutY']; $peerPortTotal = $peerPortLayoutX * $peerPortLayoutY; $peerPortNameFormat = json_decode($peerPortNameFormat, true); $peerPortName = $qls->App->generatePortName($peerPortNameFormat, $peerPort, $peerPortTotal); $objectPeerTableArray = array( 'objID' => $objectID, 'objName' => $objectName, 'peerPortName' => $peerPortName.$portFlags, 'peerEntryID' => $peerEntryID, 'portID' => $peer['selfPortID'] ); array_push($floorplanObjectPeerTable, $objectPeerTableArray); } } else { if($type == 'walljack') { $peerPortName = 'None'; $portID = null; } else { $portFlags = $qls->App->getPortFlags($objectID, 0, 0, 0); $peerPortName = 'NIC1'.$portFlags; $portID = 0; } $objectPeerTableArray = array( 'objID' => $objectID, 'objName' => $objectName, 'peerPortName' => $peerPortName, 'peerEntryID' => 0, 'portID' => $portID ); array_push($floorplanObjectPeerTable, $objectPeerTableArray); } } $validate->returnData['success']['floorplanObjectPeerTable'] = $floorplanObjectPeerTable; } else if($action == 'trunkPeer') { $valueArray = explode('-', $data['value']); $elementType = $valueArray[0]; $elementID = $valueArray[1]; $elementFace = $valueArray[2]; $elementDepth = $valueArray[3]; $elementPortIndex = $valueArray[4]; $objectID = $data['objectID']; $objectFace = $data['objectFace']; $objectDepth = $data['objectDepth']; $query = $qls->SQL->select('*', 'app_object', array('id' => array('=', $objectID))); $object = $qls->SQL->fetch_assoc($query); $query = $qls->SQL->select('partitionFunction', 'app_object_compatibility', array('template_id' => array('=', $object['template_id']))); $partitionFunction = $qls->SQL->fetch_assoc($query); $objectEndpoint = $partitionFunction['partitionFunction'] == 'Endpoint' ? 1 : 0; $query = $qls->SQL->select('*', 'app_object', array('id' => array('=', $elementID))); $element = $qls->SQL->fetch_assoc($query); $query = $qls->SQL->select('partitionFunction', 'app_object_compatibility', array('template_id' => array('=', $element['template_id']))); $partitionFunction = $qls->SQL->fetch_assoc($query); $elementEndpoint = $partitionFunction['partitionFunction'] == 'Endpoint' ? 1 : 0; // Validate trunk peers are not both endpoints if($objectEndpoint == 1 and $elementEndpoint == 1) { $errMsg = 'Cannot trunk between two endpoints.'; array_push($validate->returnData['error'], $errMsg); } // Validate endpoint peer is not connected or populated $endpointConnected = false; if($objectEndpoint == 1) { if(isset($qls->App->peerArrayStandard[$objectID][$objectFace][$objectDepth]) or isset($qls->App->populatedPortArray[$objectID][$objectFace][$objectDepth])) { $endpointConnected = true; } } else if ($elementEndpoint == 1) { if(isset($qls->App->peerArrayStandard[$elementID][$elementFace][$elementDepth]) or isset($qls->App->populatedPortArray[$elementID][$elementFace][$elementDepth])) { $endpointConnected = true; } } if($endpointConnected === true) { $errMsg = 'Cannot trunk endpoint that is populated or connected.'; array_push($validate->returnData['error'], $errMsg); } // Validate trunk peers are not connected to each other if(isset($qls->App->inventoryArray[$objectID][$objectFace][$objectDepth])) { $peersConnected = false; foreach($qls->App->inventoryArray[$objectID][$objectFace][$objectDepth] as $objPort) { foreach($objPort as $objConnection) { if($objConnection['id'] == $elementID and $objConnection['face'] == $elementFace and $objConnection['depth'] == $elementDepth) { $peersConnected = true; } } } if($peersConnected) { $errMsg = 'Cannot trunk partitions that are connected to each other.'; array_push($validate->returnData['error'], $errMsg); } } if(!count($validate->returnData['error'])) { $qls->SQL->delete('app_object_peer', array('a_id' => array('=', $objectID), 'AND', 'a_face' => array('=', $objectFace), 'AND', 'a_depth' => array('=', $objectDepth))); $qls->SQL->delete('app_object_peer', array('b_id' => array('=', $objectID), 'AND', 'b_face' => array('=', $objectFace), 'AND', 'b_depth' => array('=', $objectDepth))); $qls->SQL->delete('app_object_peer', array('a_id' => array('=', $elementID), 'AND', 'a_face' => array('=', $elementFace), 'AND', 'a_depth' => array('=', $elementDepth))); $qls->SQL->delete('app_object_peer', array('b_id' => array('=', $elementID), 'AND', 'b_face' => array('=', $elementFace), 'AND', 'b_depth' => array('=', $elementDepth))); $qls->SQL->insert( 'app_object_peer', array( 'a_id', 'a_face', 'a_depth', 'a_endpoint', 'b_id', 'b_face', 'b_depth', 'b_endpoint' ), array( $objectID, $objectFace, $objectDepth, $objectEndpoint, $elementID, $elementFace, $elementDepth, $elementEndpoint ) ); } $validate->returnData['success']['trunkFlatPath'] = $qls->App->buildTrunkFlatPath($elementID, $elementFace, $elementDepth); } else if($action == 'trunkFloorplanPeer') { $objectID = $data['objectID']; $templateID = $qls->App->objectArray[$objectID]['template_id']; $templateFunction = $qls->App->templateArray[$templateID]['templateFunction']; $value = $data['value']; $addArray = array(); $deleteArray = array(); $portIDArray = array(); $peerPortArray = array(); // Find Deletes if(isset($qls->App->peerArrayWalljack[$objectID])) { foreach($qls->App->peerArrayWalljack[$objectID] as $walljackPeerEntry) { array_push($portIDArray, $walljackPeerEntry['selfPortID']); $delete = true; foreach($value as $peer) { $peerArray = explode('-', $peer); $peerType = $peerArray[0]; $peerID = $peerArray[1]; $peerFace = $peerArray[2]; $peerDepth = $peerArray[3]; $peerPort = $peerArray[4]; if($walljackPeerEntry['id'] == $peerID and $walljackPeerEntry['face'] == $peerFace and $walljackPeerEntry['depth'] == $peerDepth and $walljackPeerEntry['port'] == $peerPort) { $delete = false; } } if($delete) { array_push($deleteArray, $walljackPeerEntry); } } } // Find Adds/Deletes foreach($value as $peer) { $peerArray = explode('-', $peer); $peerType = $peerArray[0]; $peerID = $peerArray[1]; $peerFace = $peerArray[2]; $peerDepth = $peerArray[3]; $peerPort = $peerArray[4]; $peerData = array( 'id' => $peerID, 'face' => $peerFace, 'depth' => $peerDepth, 'port' => $peerPort ); $peerEntry = $qls->App->peerArrayStandardFloorplan[$peerID][$peerFace][$peerDepth][$peerPort]; if($peerEntry) { if($peerEntry['id'] != $objectID) { array_push($deleteArray, $peerEntry); } } else { array_push($addArray, $peerData); } } // Delete peer entries foreach($deleteArray as $entry) { // Delete from inventory table if($inventoryPort = $qls->App->inventoryArray[$entry['id']][$entry['face']][$entry['depth']][$entry['port']]) { foreach($inventoryPort as $inventoryEntry) { $rowID = $inventoryEntry['rowID']; if($inventoryEntry['localEndID'] === 0 and $inventoryEntry['remoteEndID'] === 0) { // If this is an unmanaged connection, delete the entry $qls->SQL->delete('app_inventory', array('id' => array('=', $rowID))); } else { // If this is a managed connection, just clear the data $attrPrefix = $inventoryEntry['localAttrPrefix']; $set = array( $attrPrefix.'_object_id' => 0, $attrPrefix.'_object_face' => 0, $attrPrefix.'_object_depth' => 0, $attrPrefix.'_port_id' => 0 ); $qls->SQL->update('app_inventory', $set, array('id' => array('=', $rowID))); if(isset($qls->App->inventoryArray[$inventoryEntry['id']][$inventoryEntry['face']][$inventoryEntry['depth']][$inventoryEntry['port']])) { $qls->App->inventoryArray[$inventoryEntry['id']][$inventoryEntry['face']][$inventoryEntry['depth']][$inventoryEntry['port']]['id'] = 0; $qls->App->inventoryArray[$inventoryEntry['id']][$inventoryEntry['face']][$inventoryEntry['depth']][$inventoryEntry['port']]['face'] = 0; $qls->App->inventoryArray[$inventoryEntry['id']][$inventoryEntry['face']][$inventoryEntry['depth']][$inventoryEntry['port']]['depth'] = 0; $qls->App->inventoryArray[$inventoryEntry['id']][$inventoryEntry['face']][$inventoryEntry['depth']][$inventoryEntry['port']]['port'] = 0; } } } unset($qls->App->inventoryArray[$entry['id']][$entry['face']][$entry['depth']][$entry['port']]); } // Delete from populated port table if($populatedPortEntry = $qls->App->populatedPortArray[$entry['id']][$entry['face']][$entry['depth']][$entry['port']]) { $rowID = $populatedPortEntry['rowID']; $qls->SQL->delete('app_populated_port', array('id' => array('=', $rowID))); unset($qls->App->populatedPortArray[$entry['id']][$entry['face']][$entry['depth']][$entry['port']]); } // Delete from object peer table $qls->SQL->delete('app_object_peer', array('id' => array('=', $entry['rowID']))); unset($qls->App->peerArrayWalljack[$entry['selfID']]); } // If necessary, clear inventory table if($templateFunction == 'Endpoint') { if(isset($qls->App->inventoryArray[$objectID])) { foreach($qls->App->inventoryArray[$objectID] as $faceID => $face) { foreach($face as $depthID => $depth) { foreach($depth as $portID => $port) { $deleteEntry = false; foreach($port as $connection) { $rowID = $connection['rowID']; if($connection['localEndID'] == 0 and $connection['remoteEndID'] == 0) { // Delete entry if not managed cable $qls->SQL->delete('app_inventory', array('id' => array('=', $rowID))); $deleteEntry = true; } else { // Clear entry if managed cable $localAttrPrefix = $connection['localAttrPrefix']; $set = array( $localAttrPrefix.'_object_id' => 0, $localAttrPrefix.'_object_face' => 0, $localAttrPrefix.'_object_depth' => 0, $localAttrPrefix.'_port_id' => 0 ); $qls->SQL->update('app_inventory', $set, array('id' => array('=', $rowID))); } } if($deleteEntry) { unset($qls->App->inventoryArray[$objectID][$faceID][$depthID][$portID]); } } } } } } // Add peer entries foreach($addArray as $entry) { // Find first available port id $objectPortIndex = 0; $found = false; while($objectPortIndex < MAX_WALLJACK_PORTID and !$found) { if(!in_array($objectPortIndex, $portIDArray)) { array_push($portIDArray, $objectPortIndex); $found = true; } else { $objectPortIndex++; } } if($found) { $peerID = $entry['id']; $peerFace = $entry['face']; $peerDepth = $entry['depth']; $peerPortIndex = $entry['port']; $object = $qls->App->objectArray[$objectID]; $objectTemplateID = $object['template_id']; $objectTemplate = $qls->App->templateArray[$objectTemplateID]; $objectEndpoint = $objectTemplate['templateFunction'] == 'Endpoint' ? 1 : 0; $peer = $qls->App->objectArray[$peerID]; $peerTemplateID = $peer['template_id']; $peerTemplate = $qls->App->templateArray[$peerTemplateID]; $peerEndpoint = $peerTemplate['templateFunction'] == 'Endpoint' ? 1 : 0; $qls->SQL->insert( 'app_object_peer', array( 'a_id', 'a_face', 'a_depth', 'a_port', 'a_endpoint', 'b_id', 'b_face', 'b_depth', 'b_port', 'b_endpoint', 'floorplan_peer' ), array( $objectID, 0, 0, $objectPortIndex, $objectEndpoint, $peerID, $peerFace, $peerDepth, $peerPortIndex, $peerEndpoint, 1 ) ); } else { $errMsg = 'Could not find available walljack port ID.'; array_push($validate->returnData['error'], $errMsg); } } $trunkFlatPath = count($value) ? 'Yes' : 'No'; $validate->returnData['success']['trunkFlatPath'] = $trunkFlatPath; } else if($action == 'clearTrunkPeer') { $objectID = $data['objectID']; $objectFace = $data['objectFace']; $objectDepth = $data['objectDepth']; $objectPeerEntry = $qls->App->peerArray[$objectID][$objectFace][$objectDepth]; $peerID = $objectPeerEntry['peerID']; $peerFace = $objectPeerEntry['peerFace']; if($objectPeerEntry['floorplanPeer']) { $qls->SQL->delete('app_object_peer', array('a_id' => array('=', $objectID), 'AND', 'a_face' => array('=', $objectFace), 'AND', 'a_depth' => array('=', $objectDepth))); $qls->SQL->delete('app_object_peer', array('b_id' => array('=', $objectID), 'AND', 'b_face' => array('=', $objectFace), 'AND', 'b_depth' => array('=', $objectDepth))); } else { $objectPeerEntryID = $objectPeerEntry['id']; $qls->SQL->delete('app_object_peer', array('id' => array('=', $objectPeerEntryID))); } $validate->returnData['success']['trunkFlatPath'] = 'None'; $validate->returnData['success']['peerID'] = $peerID; $validate->returnData['success']['peerFace'] = $peerFace; } else if($action == 'clearFloorplanTrunkPeer') { $objectID = $data['objectID']; $qls->SQL->delete('app_object_peer', array('a_id' => array('=', $objectID))); $validate->returnData['success']['trunkFlatPath'] = 'None'; } else if($action == 'combinedTemplate') { $templateName = $data['name']; $categoryID = $data['category']; $parentObjID = $data['parentObjID']; $parentTemplateID = $qls->App->objectArray[$parentObjID]['template_id']; $childTemplateArray = array(); foreach($qls->App->insertArray[$parentObjID] as $insertObj) { $insertTemplateID = $insertObj['template_id']; $insertName = $insertObj['name']; $encX = $insertObj['insertSlotX']; $encY = $insertObj['insertSlotY']; $parentFace = $insertObj['parent_face']; $parentDepth = $insertObj['parent_depth']; $workingArray = array( 'templateID' => $insertTemplateID, 'name' => $insertName, 'encX' => $encX, 'encY' => $encY, 'parentFace' => $parentFace, 'parentDepth' => $parentDepth ); array_push($childTemplateArray, $workingArray); } $childTemplateJSON = json_encode($childTemplateArray); $qls->SQL->insert( 'app_combined_templates', array( 'templateName', 'template_id', 'templateCategory_id', 'childTemplateData' ), array( $templateName, $parentTemplateID, $categoryID, $childTemplateJSON ) ); } } echo json_encode($validate->returnData); } function validate($data, &$validate, &$qls){ $actionArray = array( 'get', 'adj', 'path', 'distance', 'notes', 'delete', 'new', 'RU', 'getFloorplan', 'getFloorplanObjectPeerTable', 'trunkPeer', 'trunkFloorplanPeer', 'clearTrunkPeer', 'clearFloorplanTrunkPeer', 'RUOrientation', 'updateCabinetRUMin', 'combinedTemplate' ); $action = $data['action']; if($validate->validateInArray($action, $actionArray, 'process action')) { $cabinetIDValidationArray = array( 'get', 'getFloorplan', 'getFloorplanObjectPeerTable', 'updateCabinetRUMin', 'adj', 'RU', 'new', 'RUOrientation' ); $cabinetValidationArray = array( 'adj', 'RUOrientation', 'RU', 'updateCabinetRUMin' ); if(in_array($action, $cabinetIDValidationArray)) { //Validate cabinet ID $cabinetID = $data['cabinetID']; $validCabinetID = $validate->validateCabinetID($cabinetID); } if(in_array($action, $cabinetValidationArray)) { if($validCabinetID) { if(isset($qls->App->envTreeArray[$cabinetID])) { if($qls->App->envTreeArray[$cabinetID]['type'] != 'cabinet') { $errMsg = 'Not a cabinet.'; array_push($validate->returnData['error'], $errMsg); } } else { $errMsg = 'Cabinet does not exist.'; array_push($validate->returnData['error'], $errMsg); } } } if($action == 'adj') { //Validate side $sideArray = array('adjCabinetSelectL', 'adjCabinetSelectR'); $validate->validateInArray($data['side'], $sideArray, 'adjacency side'); //Validate adjacent cabinet ID $adjCabinetID = $data['adjCabinetID']; $validate->validateObjectID($adjCabinetID); if($adjCabinetID == $cabinetID) { $errMsg = 'Cabinet cannot be adjacent to itself.'; array_push($validate->returnData['error'], $errMsg); } } else if($action == 'path') { //Validate path ID $pathID = $data['pathID']; $validate->validateObjectID($pathID); } else if($action == 'distance') { //Validate path ID $pathID = $data['pathID']; $validate->validateObjectID($pathID); } else if($action == 'entrance') { //Validate path ID $pathID = $data['pathID']; $validate->validateObjectID($pathID); } else if($action == 'notes') { //Validate path ID $pathID = $data['pathID']; $validate->validateObjectID($pathID); } else if($action == 'delete') { //Validate path ID $pathID = $data['pathID']; $validate->validateObjectID($pathID); } else if($action == 'trunkPeer') { // Validate Global ID $globalID = $data['value']; $validate->validateGlobalID($globalID); $globalIDArray = explode('-', $globalID); $elementID = $globalIDArray[1]; $objectID = $data['objectID']; if ($objectID == $elementID){ $errMsg = 'Cannot trunk port groups in the same object.'; array_push($validate->returnData['error'], $errMsg); } } else if($action == 'trunkFloorplanPeer') { $value = $data['value']; $peerPortArray = array(); // Validate peer port names are not similar foreach($value as $peer) { $peerArray = explode('-', $peer); $peerType = $peerArray[0]; $peerID = $peerArray[1]; $peerFace = $peerArray[2]; $peerDepth = $peerArray[3]; $peerPort = $peerArray[4]; $peerIsValid = (isset($qls->App->objectArray[$peerID])) ? true : false; if($peerIsValid) { $peer = $qls->App->objectArray[$peerID]; $peerTemplateID = $peer['template_id']; $peerPartIsValid = (isset($qls->App->compatibilityArray[$peerTemplateID][$peerFace][$peerDepth])) ? true : false; } else { $peerPartIsValid = false; } if($peerIsValid and $peerPartIsValid) { $peerObjPortName = $qls->App->generateObjectPortName($peerID, $peerFace, $peerDepth, $peerPort); $peerObjPortNameArray = explode('.', $peerObjPortName); $peerPortName = array_pop($peerObjPortNameArray); // Validate walljack portnames will be unique if(in_array($peerPortName, $peerPortArray)) { $errMsg = 'Cannot trunk floorplan object to multiple peer ports of the same name ('.$peerPortName.').'; array_push($validate->returnData['error'], $errMsg); } else { array_push($peerPortArray, $peerPortName); } // Validate peer is not a connected or populated endpoint if($qls->App->templateArray[$peerTemplateID]['templateFunction'] == 'Endpoint') { if(isset($qls->App->populatedPortArray[$peerID][$peerFace][$peerDepth][$peerPort]) or isset($qls->App->inventoryArray[$peerID][$peerFace][$peerDepth][$peerPort])) { $errMsg = 'Cannot trunk floorplan object to endpoint ports which are connected.'; array_push($validate->returnData['error'], $errMsg); } } } } } else if($action == 'clearTrunkPeer') { } else if($action == 'clearFloorplanTrunkPeer') { $objectID = $data['objectID']; $validate->validateObjectID($objectID); } else if($action == 'RU' or $action == 'new') { $result = $qls->SQL->select('*', 'app_env_tree', array('id' => array('=', $cabinetID))); if ($qls->SQL->num_rows($result) == 0) { $errMsg = 'Cabinet does not exist.'; array_push($validate->returnData['error'], $errMsg); } } else if($action == 'RUOrientation') { // Validate RU Orientation Value $RUOrientation = $data['value']; $RUOrientationArray = array(0, 1); $validate->validateInArray($RUOrientation, $RUOrientationArray, 'RU orientation value'); } else if($action == 'combinedTemplate') { // Validate template name $templateName = $data['name']; $validate->validateNameText($templateName, 'template name'); // Validate category ID $categoryID = $data['category']; $validate->validateCategoryID($categoryID); // Validate parent template ID $parentTemplateID = $data['parentObjID']; $validate->validateID($parentTemplateID, 'parent object ID'); $table = 'app_object_templates'; $where = array('templateName' => array('=', $templateName)); $errMsg = 'duplicate template name'; $validate->validateDuplicate($table, $where, $errMsg); $table = 'app_combined_templates'; $validate->validateDuplicate($table, $where, $errMsg); } } } function getCabinetParentID($cabinetParentID, &$qls){ $query = $qls->SQL->select('*', 'app_env_tree', array('id' => array('=', $cabinetParentID))); $cabinetParent = $qls->SQL->fetch_assoc($query); if($cabinetParent['type'] == 'pod') { return getCabinetParentID($cabinetParent['parent'], $qls); } return $cabinetParent['id']; } function getChildCabinets($cabinetID, $cabinetParentID, &$qls, $parentName='', $childCabinets=array()){ $query = $qls->SQL->select('*', 'app_env_tree', array('parent' => array('=', $cabinetParentID))); while($row = $qls->SQL->fetch_assoc($query)) { if($row['type'] == 'cabinet') { if($row['id'] != $cabinetID) { array_push($childCabinets, array('value' => $row['id'], 'text' => $parentName.'.'.$row['name'])); } } else { $separator = $parentName == '' ? '' : '.'; $parentName .= $separator.$row['name']; $childCabinets = getChildCabinets($cabinetID, $row['id'], $qls, $parentName, $childCabinets); $parentName = ''; } } return $childCabinets; } function getLocalCabinets($cabinetID, &$qls){ $localCabinetArray = array(); $query = $qls->SQL->select('*', 'app_env_tree', array('id' => array('=', $cabinetID))); $cabinet = $qls->SQL->fetch_assoc($query); $cabinetParentID = $cabinet['parent']; $query = $qls->SQL->select('*', 'app_env_tree', array('parent' => array('=', $cabinetParentID))); while($row = $qls->SQL->fetch_assoc($query)) { if($row['id'] != $cabinetID) { array_push($localCabinetArray, array('value' => $row['id'], 'text' => $row['name'])); } } array_push($localCabinetArray, array('text' => '----', 'children' => array(array('value' => 0, 'text' => 'Clear')))); return $localCabinetArray; } ?>