package module.projects.presentationTier.vaadin.reportType; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import module.projects.presentationTier.vaadin.reportType.components.ReportViewerComponent; import module.projects.presentationTier.vaadin.reportType.components.TableSummaryComponent; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import pt.ist.bennu.core._development.PropertiesManager; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.terminal.ExternalResource; import com.vaadin.ui.Link; import com.vaadin.ui.Table; import com.vaadin.ui.Table.ColumnGenerator; public abstract class MovementsReportType extends ProjectReportType { final ReportViewerComponent reportViewer; TableSummaryComponent tableSummary; public MovementsReportType(Map<String, String> args) { super(args); reportViewer = new ReportViewerComponent(getQuery(), getCustomFormatter()); setColumnNames(reportViewer.getTable()); addComponent(reportViewer); } @Override public CustomTableFormatter getCustomFormatter() { return new CustomTableFormatter() { @Override public void format(Table table) { table.addGeneratedColumn(getMessage("financialprojectsreports.movements.column.details"), new ColumnGenerator() { @Override public Object generateCell(Table source, Object itemId, Object columnId) { Property paiIDMOV = source.getItem(itemId).getItemProperty("PAI_IDMOV"); Link detailsLink = new Link(getMessage("financialprojectsreports.movements.column.details"), new ExternalResource( "#projectsService?reportType=" + getChildReportName() + "&unit=" + getProjectID() + "&PAI_IDMOV=" + paiIDMOV)); detailsLink.setTargetName("_blank"); //line.addItemProperty(columnId, new ObjectProperty<Link>(detailsLink)); return detailsLink; } }); } }; } abstract protected String getChildReportName(); @Override protected ReportViewerComponent getReportViewer() { return reportViewer; } protected void setTableSummaryReport(TableSummaryComponent table) { tableSummary = table; addComponent(tableSummary); } @Override public void write(HSSFSheet sheet, HSSFFont headersFont) { reportViewer.write(sheet, headersFont); tableSummary.write(sheet, headersFont); Table t = reportViewer.getTable(); HashMap<String, ArrayList<ArrayList<Object>>> results = loadChildrenData(); for (Object itemId : t.getItemIds()) { Item item = t.getItem(itemId); String parentID = item.getItemProperty("PAI_IDMOV").getValue().toString(); int rowNum = sheet.getLastRowNum() + 2; HSSFRow row = sheet.createRow(rowNum++); HSSFCell cell = row.createCell(0); HSSFCellStyle style = sheet.getWorkbook().createCellStyle(); style.setFont(headersFont); cell.setCellStyle(style); cell.setCellValue(getTypeName() + " NÂș" + parentID); rowNum = reportViewer.writeHeader(sheet, headersFont); row = sheet.createRow(rowNum++); int i = 0; for (Object propertyId : item.getItemPropertyIds()) { Property p = item.getItemProperty(propertyId); cell = row.createCell(i++); if (p.getValue() instanceof BigDecimal) { BigDecimal number = (BigDecimal) p.getValue(); if (!propertyId.toString().equals("Rubrica")) { number = number.setScale(2, BigDecimal.ROUND_HALF_UP); } String englishFormula = "VALUE(\"" + number.toString() + "\")"; String portugueseFormula = "VALUE(\"" + number.toString().replace(".", ",") + "\")"; cell.setCellFormula("IF(ISERROR(" + portugueseFormula + "), " + englishFormula + ", " + portugueseFormula + ")"); } else { cell.setCellValue(p.getValue().toString()); } } rowNum++; cell = sheet.createRow(rowNum++).createCell(0); cell.setCellValue(getChildTypeName()); cell.setCellStyle(style); //write children data int cellCount = 0; row = sheet.createRow(rowNum++); for (String s : getChildQueryColumnsPresentationNames()) { cell = row.createCell(cellCount++); cell.setCellStyle(style); cell.setCellValue(s); } for (ArrayList<Object> entry : results.get(parentID)) { row = sheet.createRow(rowNum++); cellCount = 0; for (Object s : entry) { cell = row.createCell(cellCount++); if (s != null) { if (s instanceof BigDecimal) { String englishFormula = "VALUE(\"" + s.toString() + "\")"; String portugueseFormula = "VALUE(\"" + s.toString().replace(".", ",") + "\")"; cell.setCellFormula("IF(ISERROR(" + portugueseFormula + "), " + englishFormula + ", " + portugueseFormula + ")"); } else { cell.setCellValue(s.toString()); } } } } } sheet.createRow(sheet.getLastRowNum() + 2).createCell(0) .setCellValue(getMessage("financialprojectsreports.expensescalculationwarning")); } private HashMap<String, ArrayList<ArrayList<Object>>> loadChildrenData() { HashMap<String, ArrayList<ArrayList<Object>>> results = new HashMap<>(); String query = "select distinct"; //Add columns names to query query += "\"PAI_IDMOV\", "; List<String> queryColumns = getChildQueryColumns(); for (int i = 0; i < queryColumns.size() - 1; i++) { query += queryColumns.get(i) + ", "; } query += queryColumns.get(queryColumns.size() - 1) + " "; //Add table name and where clause query += "from " + getChildQueryTableName() + " where \"PAI_IDPROJ\"='" + getProjectCode() + "'"; query += "order by " + getOrderColumn(); //Maps PAI_IDMOV to list of children. Each children is represented as a list of attributes try { final String propPrefix = "db.mgp" + ReportViewerComponent.getHostPropertyPart(); Connection con = DriverManager.getConnection(ReportViewerComponent.getAlias(propPrefix), PropertiesManager.getProperty(propPrefix + ".user"), PropertiesManager.getProperty(propPrefix + ".pass")); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); //populate data structure with query result while (rs.next()) { String parentId = rs.getString("PAI_IDMOV"); ArrayList<ArrayList<Object>> parentEntry = results.get(parentId); if (parentEntry == null) { parentEntry = new ArrayList<ArrayList<Object>>(); results.put(parentId, parentEntry); } ArrayList<Object> currentdata = new ArrayList<Object>(); parentEntry.add(currentdata); for (String columnName : getChildResultColumns()) { currentdata.add(rs.getObject(columnName)); } } con.close(); } catch (Exception e) { e.printStackTrace(); } return results; } abstract protected String getOrderColumn(); abstract protected List<String> getChildQueryColumnsPresentationNames(); abstract protected List<String> getChildQueryColumns(); abstract protected String getChildQueryTableName(); abstract protected List<String> getChildResultColumns(); @Override public TableSummaryComponent getSummary() { return tableSummary; } public abstract void setColumnNames(Table table); public abstract String getTypeName(); public abstract String getChildTypeName(); }