package net.techreadiness.plugin.action.reports.device; import java.util.Collection; import java.util.Map; import javax.inject.Inject; import net.techreadiness.persistence.criteriaquery.Criteria; import net.techreadiness.persistence.criteriaquery.CriteriaQuery; import net.techreadiness.persistence.criteriaquery.QueryResult; import net.techreadiness.plugin.action.reports.ReportItemProviderImpl; import net.techreadiness.plugin.service.reports.MinimumRecommendedFlag; import net.techreadiness.plugin.service.reports.ReportsService; import net.techreadiness.service.common.DataGrid; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.google.common.collect.Lists; @Component @Qualifier("DeviceAssessmentItemProvider") public class DeviceAssessmentItemProviderImpl extends ReportItemProviderImpl { @Autowired CriteriaQuery<Map<String, String>> criteriaQuery; @Inject private ReportsService reportsService; @Override public Collection<Map<String, String>> getPage(DataGrid<Map<String, String>> grid) { if (org == null) { setTotalNumberOfItems(0); return Lists.newArrayList(); } if (consortium == null) { throw new IllegalStateException("No Data to Display. Please ensure the appropriate consortium is selected."); } if (org.getOrgTypeName().equals("School")) { QueryResult<Map<String, String>> results = retrieveSchoolDevices(snapshotWindow.getSnapshotWindowId(), grid.getFirstResult(), grid.getPageSize()); setTotalNumberOfItems(results.getTotalRowCount()); return results.getRows(); } QueryResult<Map<String, String>> results = reportsService.retrieveSummaryForChildOrgs( snapshotWindow.getSnapshotWindowId(), org.getOrgId(), minimumRecommendedFlag, false, grid.getFirstResult(), grid.getPageSize()); setTotalNumberOfItems(results.getTotalRowCount()); return results.getRows(); } private QueryResult<Map<String, String>> retrieveSchoolDevices(Long snapshotWindowId, Integer firstResult, Integer pageSize) { StringBuilder sb = new StringBuilder(); sb.append("select "); sb.append(" o.name orgName, "); sb.append(" o.code orgCode, "); sb.append(" o.local_code localOrgCode,"); sb.append(" concat(po.name,' (',po.local_code,')') parentOrgName, "); sb.append(" po.code parentOrgCode, "); sb.append(" po.local_code parentLocalOrgCode, "); sb.append(" sd.name,"); sb.append(" CAST(sd.count as CHAR(100)) count,"); sb.append(" ifnull(sc_operating_system.name,'(missing)') operatingSystem,"); sb.append(" ifnull(sc_memory.name,'(missing)') memory,"); sb.append(" ifnull(sc_display_size.name,'(missing)') monitorDisplaySize,"); sb.append(" ifnull(sc_screen_resolution.name,'(missing)') screenResolution,"); sb.append(" ifnull(sc_environment.name,'(missing)') environment,"); sb.append(" sd.environment_compliant environmentCompliance,"); if (minimumRecommendedFlag.equals(MinimumRecommendedFlag.MINIMUM)) { sb.append(" sd.min_compliant_operating_system operatingSystemCompliance,"); sb.append(" sd.min_compliant_memory memoryCompliance,"); sb.append(" sd.min_compliant_screen_resolution screenResolutionCompliance,"); sb.append(" sd.min_compliant_display_size monitorDisplaySizeCompliance"); } else { sb.append(" sd.rec_compliant_operating_system operatingSystemCompliance,"); sb.append(" sd.rec_compliant_memory memoryCompliance,"); sb.append(" sd.rec_compliant_screen_resolution screenResolutionCompliance,"); sb.append(" sd.rec_compliant_display_size monitorDisplaySizeCompliance"); } sb.append(" from readiness.snapshot_device sd"); sb.append(" join core.org o on o.org_id = sd.org_id"); sb.append(" join core.org po on po.org_id = o.parent_org_id"); sb.append(" left join readiness.snapshot_config sc_operating_system on sc_operating_system.snapshot_window_id = sd.snapshot_window_id "); sb.append(" and sc_operating_system.code ='operatingSystems' "); sb.append(" and sc_operating_system.value = sd.operating_system"); sb.append(" left join readiness.snapshot_config sc_memory on sc_memory.snapshot_window_id = sd.snapshot_window_id "); sb.append(" and sc_memory.code ='memory' "); sb.append(" and sc_memory.value = sd.memory"); sb.append(" left join readiness.snapshot_config sc_display_size on sc_display_size.snapshot_window_id = sd.snapshot_window_id "); sb.append(" and sc_display_size.code ='displaySize' "); sb.append(" and sc_display_size.value = sd.display_size"); sb.append(" left join readiness.snapshot_config sc_screen_resolution on sc_screen_resolution.snapshot_window_id = sd.snapshot_window_id "); sb.append(" and sc_screen_resolution.code ='screenResolutions' "); sb.append(" and sc_screen_resolution.value = sd.screen_resolution"); sb.append(" left join readiness.snapshot_config sc_environment on sc_environment.snapshot_window_id = sd.snapshot_window_id "); sb.append(" and sc_environment.code ='environment' "); sb.append(" and sc_environment.value = sd.environment"); sb.append(" where "); sb.append(" sd.snapshot_window_id = :snapshotWindowId "); sb.append(" and sd.org_id = :orgId"); criteriaQuery.setBaseSubSelect(sb.toString()); Criteria criteria = new Criteria(firstResult, pageSize); criteria.getParameters().put("snapshotWindowId", snapshotWindowId); criteria.getParameters().put("orgId", org.getOrgId()); return criteriaQuery.getData(criteria, Map.class); } @Override public Collection<Map<String, String>> export(ExportType exportType) { if (org == null) { setTotalNumberOfItems(0); return Lists.newArrayList(); } Collection<Map<String, String>> results; if (org.getOrgTypeName().equals("School")) { QueryResult<Map<String, String>> queryResults = retrieveSchoolDevices(snapshotWindow.getSnapshotWindowId(), null, null); results = queryResults.getRows(); if (exportType.equals(ExportType.csv)) { for (Map<String, String> map : results) { formatTBDandMissing("operatingSystemCompliance", "operatingSystem", map); formatTBDandMissing("memoryCompliance", "memory", map); formatTBDandMissing("monitorDisplaySizeCompliance", "monitorDisplaySize", map); formatTBDandMissing("screenResolutionCompliance", "screenResolution", map); formatTBDandMissing("environmentCompliance", "environment", map); } return results; } for (Map<String, String> map : results) { specialFormatPdf("operatingSystemCompliance", "operatingSystem", map); specialFormatPdf("memoryCompliance", "memory", map); specialFormatPdf("monitorDisplaySizeCompliance", "monitorDisplaySize", map); specialFormatPdf("screenResolutionCompliance", "screenResolution", map); specialFormatPdf("environmentCompliance", "environment", map); } } else { results = reportsService.retrieveSummaryForChildOrgs(snapshotWindow.getSnapshotWindowId(), org.getOrgId(), minimumRecommendedFlag, true, 0, 0).getRows(); for (Map<String, String> map : results) { if (exportType.equals(ExportType.pdf)) { formatTBD("devicePassingCount", "devicePassingCount", map); String percent = map.get("devicePassingPercent") == null ? "" : map.get("devicePassingPercent") .toUpperCase(); if (NumberUtils.toInt(map.get("deviceTbdCount")) > 0) { percent += " <span style=\"color: #9a9a9a\">TBD</span>"; } map.put("devicePassingPercent", percent); } else if (exportType.equals(ExportType.csv)) { String percent = map.get("devicePassingPercent") == null ? "" : map.get("devicePassingPercent") .toUpperCase(); if (NumberUtils.toInt(map.get("deviceTbdCount")) > 0) { percent += " TBD"; } map.put("devicePassingPercent", percent); } if (exportType.equals(ExportType.csv) && org.getOrgTypeName().equals("District")) { if (map.get("schoolType") != null) { map.put("schoolType", SCHOOL_TYPE.get(map.get("schoolType")) == null ? map.get("schoolType") : SCHOOL_TYPE.get(map.get("schoolType"))); } } } } return results; } protected void specialFormatPdf(String complianceKey, String dataKey, Map<String, String> data) { StringBuilder sb = new StringBuilder(); if (data.get(complianceKey) != null && data.get(dataKey).startsWith("<")) { String originalDataKey = data.get(dataKey); String newDataKey = originalDataKey.replaceAll("<", "<"); data.put(dataKey, newDataKey); } if (data.get(dataKey) != null && data.get(complianceKey) != null) { if (data.get(complianceKey).equals("no") && !data.get(dataKey).equals("(missing)")) { sb.append("<span style=\"color: red\">"); sb.append("("); sb.append(data.get(dataKey)); sb.append(")"); sb.append("</span>"); data.put(dataKey, sb.toString()); } else { if (data.get(dataKey).equals("(missing)")) { sb.append("<span style=\"color: red\">"); sb.append(data.get(dataKey)); sb.append("</span>"); data.put(dataKey, sb.toString()); } } } if (data.get(complianceKey) != null && data.get(complianceKey).equals("TBD")) { sb.append(data.get(dataKey)); sb.append("<span style=\"color: #9a9a9a\">").append(" ").append("TBD</span>"); data.put(dataKey, sb.toString()); } } }