/** * Compute the full inventory on devices in the data centers and return the data * center summary statistics * * @param PHPExcel_Worksheet $worksheet * @param array $DProps properties defined for the Excel document * @return (array|array|array|boolean)[] * statistics array, device inventory, cabinet inventory */ function computeSheetBodyDCInventory($DProps) { global $person; global $sessID; $dc = new DataCenter(); $cab = new Cabinet(); $device = new Device(); $invData = array(); $invCab = array(); $sheetColumns = $DProps['DC Inventory']['Columns']; $cabinetColumns = $DProps['Rack Inventory']['Columns']; $devTemplates = DeviceTemplate::getTemplateListIndexedbyID(); $deptList = Department::GetDepartmentListIndexedbyID(); $contactList = $person->GetUserList('indexed'); $limitedUser = false; $dcList = $dc->GetDCList(); $Stats = array(); // A little code to update the counter $percentDone = 0; $sectionMaxPercent = 40; $incrementalPercent = 1 / sizeof($dcList) * $sectionMaxPercent; foreach ($dcList as $dc) { $dcContainerList = $dc->getContainerList(); $dcStats = array(); $cab->DataCenterID = $dc->DataCenterID; $dcStats['Fl_Spc'] = $dc->SquareFootage; $dcStats['DesignPower'] = $dc->MaxkW; $dcStats['Watts'] = 0; $dcStats['Rk_Num'] = 0; $dcStats['Rk_UtT'] = 0; $dcStats['Rk_UtU'] = 0; $dcStats['Rk_UtE'] = 0; $dcStats['Rk_Res'] = 0; $cabList = $cab->ListCabinetsByDC(); if (count($cabList) == 0) { // empty data center room $devSpec = makeEmptySpec($sheetColumns, $dcContainerList); $devSpec['DC Name'] = $dc->Name; $invData[] = $devSpec; } else { foreach ($cabList as $cab) { if (!$person->ReadAccess and $cab->AssignedTo == 0 or $cab->AssignedTo > 0 and !$person->canRead($cab->AssignedTo)) { // User is not allowed to see anything in here $limitedUser = true; continue; } $zoneName = getZoneName($cab); $rowName = getRowName($cab); addRackStat($invCab, $cab, $cabinetColumns, $dc, $dcContainerList); $cab_height = $cab->CabinetHeight; if (mb_strtoupper($cab->Model) == 'RESERVED') { $dcStats['Rk_Res']++; } else { $dcStats['Rk_Num']++; } $dcStats['Rk_UtT'] += $cab_height; $device->Cabinet = $cab->CabinetID; $device_list = $device->ViewDevicesByCabinet(); // empty cabinet if (count($device_list) == 0 && $cab->CabinetHeight > 0) { $dcStats['Rk_UtE'] += $cab_height; $devSpec = makeEmptySpec($sheetColumns, $dcContainerList); $devSpec['Zone'] = $zoneName; $devSpec['Row'] = $rowName; $devSpec['DC Name'] = $dc->Name; $devSpec['Cabinet'] = $cab->Location; $devSpec['Position'] = 1; $devSpec['Height'] = $cab->CabinetHeight; $devSpec['Device'] = '__EMPTY'; $invData[] = $devSpec; } else { usort($device_list, 'cmpDevPos'); $low_idx = 1; foreach ($device_list as $dev) { if ($low_idx < $dev->Position) { // range of empty slots if ($dev->Position <= $cab_height) { $height = $dev->Position - $low_idx; } else { $height = $cab_height - $low_idx + 1; } if ($height > 0) { $dcStats['Rk_UtE'] += $height; $devSpec = makeEmptySpec($sheetColumns, $dcContainerList); ${$devSpec}['Zone'] = $zoneName; $devSpec['Row'] = $rowName; $devSpec['DC Name'] = $dc->Name; $devSpec['Cabinet'] = $cab->Location; $devSpec['Position'] = $low_idx; $devSpec['Height'] = $height; $devSpec['Device'] = '__EMPTY'; $invData[] = $devSpec; } $low_idx = $dev->Position; } // device in cabinet $reserved = $dev->Reservation ? 'reserved' : null; list($manufacturer, $model) = getDeviceTemplateName($devTemplates, $dev); $devSpec = makeEmptySpec($sheetColumns, $dcContainerList); $devSpec['DevID'] = $dev->DeviceID; $devSpec['Zone'] = $zoneName; $devSpec['Row'] = $rowName; $devSpec['DC Name'] = $dc->Name; $devSpec['Cabinet'] = $cab->Location; $devSpec['Position'] = $dev->Position; $devSpec['Half Depth'] = getDeviceDepthPos($dev); $devSpec['Height'] = $dev->Height; $devSpec['Device'] = $dev->Label; $devSpec['Parent Device'] = null; $devSpec['Manufacturer'] = $manufacturer; $devSpec['Model'] = $model; $devSpec['Device Type'] = $dev->DeviceType; $devSpec['Asset Number'] = $dev->AssetTag; $devSpec['Serial No.'] = $dev->SerialNo; $devSpec['Install Date'] = $dev->InstallDate; $devSpec['Warranty End'] = $dev->WarrantyExpire; $devSpec['Owner'] = getOwnerName($dev, $deptList); $devSpec['Power (W)'] = $dev->NominalWatts; $devSpec['Reservation'] = $reserved; $devSpec['Contact'] = getContactName($contactList, $dev->PrimaryContact); $devSpec['Tags'] = getTagsString($dev); $devSpec['Notes'] = html_entity_decode(strip_tags($dev->Notes), ENT_COMPAT, 'UTF-8'); $invData[] = $devSpec; $dcStats['Watts'] += $dev->NominalWatts; // devices can be installed at the same position and // could be of different height; count only the free // rack units which are not covered by any device if ($low_idx == $dev->Position) { $low_idx += $dev->Height; $dcStats['Rk_UtU'] += $dev->Height; } else { $rest_height = $dev->Position + $dev->Height - $low_idx; $rest_height = $rest_height > 0 ? $rest_height : 0; $low_idx += $rest_height; $dcStats['Rk_UtU'] += $rest_height; } if ($dev->DeviceType == 'Chassis') { list($watts, $invData) = computeDeviceChildren($sheetColumns, $invData, $dev, $dc->Name, $cab, $devTemplates, $deptList, $contactList, $dcContainerList); $dcStats['Watts'] += $watts; } } if ($low_idx <= $cab->CabinetHeight) { // empty range at the top of the cabinet, $low_idx is // the potentially free location $height = $cab->CabinetHeight - $low_idx + 1; $dcStats['Rk_UtE'] += $height; $devSpec = makeEmptySpec($sheetColumns, $dcContainerList); $devSpec['Zone'] = $zoneName; $devSpec['Row'] = $rowName; $devSpec['DC Name'] = $dc->Name; $devSpec['Cabinet'] = $cab->Location; $devSpec['Position'] = $low_idx; $devSpec['Height'] = $height; $devSpec['Device'] = '__EMPTY'; $invData[] = $devSpec; } } } } assignStatsVal($Stats, $dc, $dcStats); $percentDone += $incrementalPercent; JobQueue::updatePercentage($sessID, $percentDone); } return array($Stats, $invData, $invCab, $limitedUser); }