package net.techreadiness.plugin.persistence.report;
import java.sql.SQLException;
import java.util.List;
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 org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository
@Scope("prototype")
public class StaffAndPersonnelSurveyDataRetrieverImpl extends BaseDataRetrieverImpl implements
StaffAndPersonnelSurveyDataRetriever {
@Inject
private CriteriaQuery<Map<String, String>> criteriaQuery;
@Override
public QueryResult<Map<String, String>> getSnapshotSurveyReportDataForOrg(Long snapshotWindowId, Long orgId,
String surveyQuestionTypeCode) throws SQLException {
QueryResult<Map<String, String>> result = getSurveyResults(snapshotWindowId, orgId, true, 0, 0,
getSql(surveyQuestionTypeCode, true));
return result;
}
@Override
public QueryResult<Map<String, String>> findSnapshotSurveyReportDataForChildOrgs(Long snapshotWindowId, Long orgId,
String surveyQuestionTypeCode, boolean retrieveAll, Integer startingRow, Integer numberOfRows)
throws SQLException {
return getSurveyResults(snapshotWindowId, orgId, retrieveAll, startingRow, numberOfRows,
getSql(surveyQuestionTypeCode, false));
}
private static String getSql(String surveyQuestionTypeCode, boolean singleOrg) {
StringBuilder sql = new StringBuilder();
sql.append("select ");
sql.append(" o.org_id orgId, ");
sql.append(" o.name orgName, ");
sql.append(" o.code orgCode, ");
sql.append(" o.local_code localOrgCode, ");
sql.append(" concat(po.name,' (',po.local_code,')') parentOrgName, ");
sql.append(" po.code parentOrgCode, ");
sql.append(" po.local_code parentLocalOrgCode, ");
sql.append(" date_format(sw.execute_date,'%M %d, %Y at %l:%i%p CT') createDate, ");
sql.append(" ifnull(so.data_entry_complete,'(missing)') dataEntryComplete,");
sql.append(" ifnull(so.school_type,'') schoolType,");
sql.append(" so.calc_survey_" + surveyQuestionTypeCode + "_display levelOfConcern,");
sql.append(" cast(so.calc_survey_" + surveyQuestionTypeCode + "_0to3 as char) levelOfConcernCount0to3,");
sql.append(" cast(so.calc_survey_" + surveyQuestionTypeCode + "_4to5 as char) levelOfConcernCount4to5,");
sql.append(" cast(so.calc_survey_" + surveyQuestionTypeCode + "_6to7 as char) levelOfConcernCount6to7,");
sql.append(" cast(so.calc_survey_" + surveyQuestionTypeCode + "_8to10 as char) levelOfConcernCount8to10,");
sql.append(" cast(round(ifnull(so.calc_survey_" + surveyQuestionTypeCode
+ "_average,0),2) as char) levelOfConcernAverageResponse");
sql.append(" from readiness.snapshot_org so");
sql.append(" join readiness.snapshot_window sw on sw.snapshot_window_id = so.snapshot_window_id");
sql.append(" join core.org_tree otree on otree.org_id=so.org_id");
sql.append(" join core.org o on o.org_id = otree.org_id");
sql.append(" left join core.org po on po.org_id = o.parent_org_id");
sql.append(" where ");
sql.append(" so.snapshot_window_id = :snapshotWindowId ");
sql.append(" and otree.ancestor_org_id = :parentOrgId ");
if (singleOrg) {
sql.append(" and otree.distance=0 ");
} else {
sql.append(" and otree.distance=1 ");
}
sql.append(" group by ");
sql.append(" o.org_id ");
sql.append(" order by ");
sql.append(" o.name");
return sql.toString();
}
private QueryResult<Map<String, String>> getSurveyResults(Long snapshotWindowId, Long orgId, boolean retrieveAll,
Integer startingRow, Integer numberOfRows, String sql) {
Criteria criteria = new Criteria();
criteria.getParameters().put("snapshotWindowId", snapshotWindowId);
criteria.getParameters().put("parentOrgId", orgId);
criteriaQuery.setBaseSubSelect(sql);
if (!retrieveAll) {
criteria.setFirstResults(startingRow);
criteria.setPageSize(numberOfRows);
}
QueryResult<Map<String, String>> result = criteriaQuery.getData(criteria, Map.class);
return result;
}
@Override
public List<Map<String, String>> retrieveSurveyQuestions() {
String sql = "select entity_field.code surveyQuestionCode " + " from core.option_list "
+ " INNER JOIN core.entity_field " + " USING (option_list_id) "
+ " where option_list.code = 'surveyRating'";
return getJdbcTemplate().query(sql, new Object[] {}, new ReadinessRowMapper());
}
}