diff --git a/dist/Programa Caja.jar b/dist/Programa Caja.jar index aaff2b2..ea37db6 100644 Binary files a/dist/Programa Caja.jar and b/dist/Programa Caja.jar differ diff --git a/src/danielcortes/xyz/controllers/InformesSideBarController.java b/src/danielcortes/xyz/controllers/InformesSideBarController.java index a02d14e..03dcde6 100644 --- a/src/danielcortes/xyz/controllers/InformesSideBarController.java +++ b/src/danielcortes/xyz/controllers/InformesSideBarController.java @@ -25,7 +25,7 @@ package danielcortes.xyz.controllers; import danielcortes.xyz.data.Configuration; -import danielcortes.xyz.informes.InformeEgresos; +import danielcortes.xyz.informes.InformeEgresosToExcel; import danielcortes.xyz.informes.InformeLibroDeVentasToExcel; import danielcortes.xyz.models.tipo_egreso.TipoEgreso; import danielcortes.xyz.utils.SaveFile; @@ -96,7 +96,7 @@ public class InformesSideBarController { return; } - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM YYYY"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy"); String formatedMonth = month.format(formatter); Path saveFile = new XLSFileChooser( @@ -106,8 +106,9 @@ public class InformesSideBarController { return; } - InformeEgresos informe = new InformeEgresos(tipoEgreso.getId(), month, saveFile); - Path generatedFile = informe.generarInforme(); + InformeEgresosToExcel informe = new InformeEgresosToExcel(tipoEgreso, month); + Workbook wb = informe.generarInforme(); + SaveFile.save(wb, saveFile); new InformeGeneratedConfirmation(saveFile).execute(); } diff --git a/src/danielcortes/xyz/data/DAOManager.java b/src/danielcortes/xyz/data/DAOManager.java index 693424f..32aaa96 100644 --- a/src/danielcortes/xyz/data/DAOManager.java +++ b/src/danielcortes/xyz/data/DAOManager.java @@ -36,8 +36,6 @@ import danielcortes.xyz.models.egreso.EgresoDAO; import danielcortes.xyz.models.egreso.SQLiteEgresoDAO; import danielcortes.xyz.models.estado_resultado.EstadoResultadoDAO; import danielcortes.xyz.models.estado_resultado.SQLiteEstadoResultadoDAO; -import danielcortes.xyz.models.informes.egresos.InformeEgresosContentDAO; -import danielcortes.xyz.models.informes.egresos.SQLiteInformeEgresosContentDAO; import danielcortes.xyz.models.ingreso.IngresoDAO; import danielcortes.xyz.models.ingreso.SQLiteIngresoDAO; import danielcortes.xyz.models.tipo_egreso.SQLiteTipoEgresoDAO; @@ -54,7 +52,6 @@ public class DAOManager { private static final DocumentosDAO documentosDAO; private static final EfectivoDAO efectivoDAO; private static final EgresoDAO egresoDAO; - private static final InformeEgresosContentDAO egresosContentDAO; private static final IngresoDAO ingresoDAO; private static final TipoEgresoDAO tipoEgresoDAO; private static final TipoIngresoDAO tipoIngresoDAO; @@ -67,7 +64,6 @@ public class DAOManager { documentosDAO = new SQLiteDocumentosDAO(); efectivoDAO = new SQLiteEfectivoDAO(); egresoDAO = new SQLiteEgresoDAO(); - egresosContentDAO = new SQLiteInformeEgresosContentDAO(); ingresoDAO = new SQLiteIngresoDAO(); tipoEgresoDAO = new SQLiteTipoEgresoDAO(); tipoIngresoDAO = new SQLiteTipoIngresoDAO(); @@ -95,9 +91,6 @@ public class DAOManager { return egresoDAO; } - public static InformeEgresosContentDAO getEgresosContentDAO() { - return egresosContentDAO; - } public static IngresoDAO getIngresoDAO() { return ingresoDAO; diff --git a/src/danielcortes/xyz/informes/InformeEgresos.java b/src/danielcortes/xyz/informes/InformeEgresos.java index d7017bf..ea7c8c2 100644 --- a/src/danielcortes/xyz/informes/InformeEgresos.java +++ b/src/danielcortes/xyz/informes/InformeEgresos.java @@ -1,324 +1,54 @@ -/* - * MIT License - * - * Copyright (c) 2018-2019 Daniel Cortes - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - package danielcortes.xyz.informes; -import danielcortes.xyz.models.caja.SQLiteCajaDAO; -import danielcortes.xyz.models.informes.egresos.InformeEgresosContent; -import danielcortes.xyz.models.informes.egresos.SQLiteInformeEgresosContentDAO; -import danielcortes.xyz.utils.Pair; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; +import danielcortes.xyz.data.DAOManager; +import danielcortes.xyz.models.caja.Caja; +import danielcortes.xyz.models.caja.CajaDAO; +import danielcortes.xyz.models.egreso.Egreso; +import danielcortes.xyz.models.egreso.EgresoDAO; +import danielcortes.xyz.models.tipo_egreso.TipoEgreso; +import java.time.LocalDate; import java.time.YearMonth; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.BorderExtent; -import org.apache.poi.ss.usermodel.BorderStyle; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.CreationHelper; -import org.apache.poi.ss.usermodel.FillPatternType; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.VerticalAlignment; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.ss.util.PropertyTemplate; public class InformeEgresos { - private final String[] titles = { - "FECHA", - "N°", - "DESCRIPCION", - "VALOR" - }; + private HashMap> informe; - private List informe; - private Path saveFile; - - //Filas donde se almacenaran los totales - private ArrayList totalRows; - //Filas donde se almacenaran los egresos. - private ArrayList dataRows; - //Fila que contiene el total final; - private Row totalFinal; - - - //Rango que corresponde a un dia de egresos; - private ArrayList> totalRange; - private Workbook wb; - private Sheet sheet; - private CreationHelper createHelper; - private HashMap styles; - - public InformeEgresos(int tipoEgresoId, YearMonth mes, Path saveFile) { - new SQLiteCajaDAO().createCajasForMonth(mes); - this.informe = new SQLiteInformeEgresosContentDAO() - .getInformeEgresosFactuasMateriaPrima(mes, tipoEgresoId); - this.saveFile = saveFile; - - this.wb = new HSSFWorkbook(); - this.sheet = wb.createSheet(); - this.createHelper = wb.getCreationHelper(); - - this.totalRows = new ArrayList<>(); - this.totalRange = new ArrayList<>(); - this.dataRows = new ArrayList<>(); - - this.styles = this.generateStyles(); + private InformeEgresos() { } - private void fillHeaders() { - Row titles = sheet.createRow(0); - - for (int x = 0; x < this.titles.length; x++) { - titles.createCell(x).setCellValue(this.titles[x]); - } + public List get(LocalDate localDate) { + return informe.get(localDate); } - private void fillData() { - int rowCounter = 1; - int dayStart = rowCounter; - int dayEnd; - - for (int informeID = 0; informeID < informe.size(); informeID++) { - InformeEgresosContent data = informe.get(informeID); - int cellCounter = 0; - Row dataRow = sheet.createRow(rowCounter); - dataRows.add(dataRow); - Date fecha = Date.from(data.getFecha().atStartOfDay(ZoneId.systemDefault()).toInstant()); - - dataRow.createCell(cellCounter++).setCellValue(fecha); - dataRow.createCell(cellCounter++).setCellValue(data.getNro()); - dataRow.createCell(cellCounter++).setCellValue(data.getDescripcion()); - dataRow.createCell(cellCounter).setCellValue(data.getValor()); - - // Comprueba si es que el siguiente elemento en la lista de informe es del siguiente dia, si es asi, agrega una linea con los totales diarios. - if (informeID + 1 >= informe.size() || !data.getFecha() - .equals(informe.get(informeID + 1).getFecha())) { - totalRows.add(sheet.createRow(rowCounter + 1)); - - dayEnd = rowCounter; - totalRange.add(new Pair<>(dayStart, dayEnd)); - dayStart = rowCounter + 2; - rowCounter++; - } - - rowCounter++; - } + private void put(LocalDate localDate, List egresos) { + informe.put(localDate, egresos); } - private void fillTotales() { - StringBuilder sumTotalFinal = new StringBuilder(); - - //Se aprovechara la iteracion para agregar los totales individuales y para construir la suma del total final - for (int x = 0; x < totalRows.size(); x++) { - Row row = totalRows.get(x); - Pair range = totalRange.get(x); - - row.createCell(2).setCellValue("TOTAL DIARIO"); - row.createCell(3) - .setCellFormula("SUM(D" + (range.getLeft() + 1) + ":D" + (range.getRight() + 1) + ")"); - - sumTotalFinal.append("D").append(row.getRowNum() + 1); - if (x + 1 != totalRows.size()) { - sumTotalFinal.append("+"); - } else { - this.totalFinal = sheet.createRow(row.getRowNum() + 1); - this.totalFinal.createCell(2).setCellValue("TOTAL MENSUAL"); - this.totalFinal.createCell(3).setCellFormula(sumTotalFinal.toString()); - } - } - - + public int size(){ + return informe.size(); } - private void freezeCells() { - this.sheet.createFreezePane(0, 1); - } + public static InformeEgresos generate(YearMonth mes, TipoEgreso tipoEgreso) { + InformeEgresos informeEgresos = new InformeEgresos(); + informeEgresos.informe = new HashMap<>(); - private void addBorders() { - int rows = this.totalRows.size() + this.dataRows.size() + 1; - PropertyTemplate pt = new PropertyTemplate(); + LocalDate currentDate = mes.atDay(1); + LocalDate endDatePlusOne = mes.atEndOfMonth().plusDays(1); - //Bordes Internos - pt.drawBorders(new CellRangeAddress(0, rows, 0, 3), BorderStyle.THIN, BorderExtent.ALL); + CajaDAO cajaDAO = DAOManager.getCajaDAO(); + EgresoDAO egresoDAO = DAOManager.getEgresoDAO(); - //Bordes de los Headers - pt.drawBorders(new CellRangeAddress(0, 0, 0, 3), BorderStyle.MEDIUM, BorderExtent.OUTSIDE); + while (currentDate.isBefore(endDatePlusOne)) { + Caja caja = cajaDAO.getByFecha(currentDate).orElse(Caja.EMPTY); - //Bordes de los Totales - for (Row row : this.totalRows) { - int index = row.getRowNum(); - pt.drawBorders(new CellRangeAddress(index, index, 0, 3), BorderStyle.NONE, BorderExtent.ALL); - pt.drawBorders(new CellRangeAddress(index, index, 0, 3), BorderStyle.MEDIUM, - BorderExtent.OUTSIDE); + List egresos = egresoDAO.getByTipoEgresoEnCaja(tipoEgreso, caja); + informeEgresos.put(currentDate, egresos); + + currentDate = currentDate.plusDays(1); } - //Borde del Total Final - pt.drawBorders( - new CellRangeAddress(this.totalFinal.getRowNum(), this.totalFinal.getRowNum(), 0, 3), - BorderStyle.NONE, BorderExtent.ALL); - pt.drawBorders( - new CellRangeAddress(this.totalFinal.getRowNum(), this.totalFinal.getRowNum(), 0, 3), - BorderStyle.MEDIUM, BorderExtent.OUTSIDE); - - //Borde externo - pt.drawBorders(new CellRangeAddress(0, rows, 0, 3), BorderStyle.MEDIUM, BorderExtent.OUTSIDE); - - pt.applyBorders(this.sheet); - } - - private void setStyles() { - //Estilo para el header - this.sheet.getRow(0).getCell(0).setCellStyle(this.styles.get("header")); - this.sheet.getRow(0).getCell(1).setCellStyle(this.styles.get("header")); - this.sheet.getRow(0).getCell(2).setCellStyle(this.styles.get("header")); - this.sheet.getRow(0).getCell(3).setCellStyle(this.styles.get("header")); - - //Estilo para el Total Final - this.totalFinal.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("gray")); - this.totalFinal.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("gray")); - this.totalFinal.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("gray")); - this.totalFinal.getCell(3).setCellStyle(this.styles.get("total_final")); - - //Estilo para las filas de datos - for (Row row : this.dataRows) { - row.getCell(0).setCellStyle(this.styles.get("date")); - row.getCell(1).setCellStyle(this.styles.get("regular")); - row.getCell(2).setCellStyle(this.styles.get("regular")); - row.getCell(3).setCellStyle(this.styles.get("money")); - } - - //Estilo para las filas de totales - for (Row row : this.totalRows) { - row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("not_so_gray")); - row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("not_so_gray")); - row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("not_so_gray")); - row.getCell(3, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) - .setCellStyle(this.styles.get("total")); - } - - //Setea el alto de las filas - this.sheet.getRow(0).setHeightInPoints(30); - this.totalFinal.setHeightInPoints(20); - for (Row row : this.dataRows) { - row.setHeightInPoints(15); - } - for (Row row : this.totalRows) { - row.setHeightInPoints(18); - } - - //Setea el ancho de las columnas - sheet.autoSizeColumn(0); - sheet.autoSizeColumn(1); - sheet.autoSizeColumn(2); - sheet.autoSizeColumn(3); - } - - private HashMap generateStyles() { - Font font = this.wb.createFont(); - font.setBold(true); - font.setColor(IndexedColors.WHITE.getIndex()); - - CellStyle regularStyle = this.wb.createCellStyle(); - - CellStyle grayStyle = this.wb.createCellStyle(); - grayStyle.setFont(font); - grayStyle.setVerticalAlignment(VerticalAlignment.CENTER); - grayStyle.setFillForegroundColor(IndexedColors.GREY_80_PERCENT.getIndex()); - grayStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - - CellStyle notSoGrayStyle = this.wb.createCellStyle(); - notSoGrayStyle.setFont(font); - notSoGrayStyle.setVerticalAlignment(VerticalAlignment.CENTER); - notSoGrayStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); - notSoGrayStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - - CellStyle dateStyle = this.wb.createCellStyle(); - dateStyle.setDataFormat(this.createHelper.createDataFormat().getFormat("dd/mm/yyyy")); - - CellStyle moneyStyle = this.wb.createCellStyle(); - moneyStyle - .setDataFormat(this.createHelper.createDataFormat().getFormat("\"$\"#,##0_);(\"$\"#,##0)")); - - CellStyle headerStyle = this.wb.createCellStyle(); - headerStyle.cloneStyleFrom(grayStyle); - headerStyle.setAlignment(HorizontalAlignment.CENTER); - - CellStyle totalStyle = this.wb.createCellStyle(); - totalStyle.cloneStyleFrom(notSoGrayStyle); - totalStyle - .setDataFormat(this.createHelper.createDataFormat().getFormat("\"$\"#,##0_);(\"$\"#,##0)")); - - CellStyle totalFinalStyle = this.wb.createCellStyle(); - totalFinalStyle.cloneStyleFrom(grayStyle); - totalFinalStyle - .setDataFormat(this.createHelper.createDataFormat().getFormat("\"$\"#,##0_);(\"$\"#,##0)")); - - HashMap styles = new HashMap<>(); - styles.put("regular", regularStyle); - styles.put("gray", grayStyle); - styles.put("not_so_gray", notSoGrayStyle); - styles.put("date", dateStyle); - styles.put("money", moneyStyle); - styles.put("header", headerStyle); - styles.put("total", totalStyle); - styles.put("total_final", totalFinalStyle); - - return styles; - } - - public Path generarInforme() { - fillHeaders(); - fillData(); - fillTotales(); - freezeCells(); - setStyles(); - addBorders(); - - try (OutputStream fileOut = Files.newOutputStream(this.saveFile)) { - wb.write(fileOut); - return this.saveFile; - } catch (IOException e) { - e.printStackTrace(); - } - return null; + return informeEgresos; } } diff --git a/src/danielcortes/xyz/informes/InformeEgresosToExcel.java b/src/danielcortes/xyz/informes/InformeEgresosToExcel.java new file mode 100644 index 0000000..bc99313 --- /dev/null +++ b/src/danielcortes/xyz/informes/InformeEgresosToExcel.java @@ -0,0 +1,302 @@ +/* + * MIT License + * + * Copyright (c) 2018-2019 Daniel Cortes + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package danielcortes.xyz.informes; + +import danielcortes.xyz.models.egreso.Egreso; +import danielcortes.xyz.models.tipo_egreso.TipoEgreso; +import danielcortes.xyz.utils.Pair; +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.BorderExtent; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.PropertyTemplate; + +public class InformeEgresosToExcel { + + private final String[] titles = { + "FECHA", + "N°", + "DESCRIPCION", + "VALOR" + }; + + private InformeEgresos informe; + private YearMonth mes; + + //Filas donde se almacenaran los totales + private ArrayList totalRows; + //Filas donde se almacenaran los egresos. + private ArrayList dataRows; + //Fila que contiene el total final; + private Row totalFinal; + + + //Rango que corresponde a un dia de egresos; + private ArrayList> totalRange; + private Workbook wb; + private Sheet sheet; + private CreationHelper createHelper; + private HashMap styles; + + public InformeEgresosToExcel(TipoEgreso tipoEgreso, YearMonth mes) { + this.informe = InformeEgresos.generate(mes, tipoEgreso); + this.mes = mes; + + this.wb = new HSSFWorkbook(); + this.sheet = wb.createSheet(); + this.createHelper = wb.getCreationHelper(); + + this.totalRows = new ArrayList<>(); + this.totalRange = new ArrayList<>(); + this.dataRows = new ArrayList<>(); + + this.styles = this.generateStyles(); + } + + private void fillHeaders() { + Row titles = sheet.createRow(0); + + for (int x = 0; x < this.titles.length; x++) { + titles.createCell(x).setCellValue(this.titles[x]); + } + } + + private void fillData() { + int currentRow = 1; + + LocalDate currentDay = mes.atDay(1); + LocalDate endDayPlusOne = mes.atEndOfMonth().plusDays(1); + + while (currentDay.isBefore(endDayPlusOne)) { + int firstRow = currentRow; + + Date fecha = Date.from(currentDay.atStartOfDay(ZoneId.systemDefault()).toInstant()); + List egresos = informe.get(currentDay); + + for (Egreso egreso : egresos) { + Row dataRow = sheet.createRow(currentRow); + this.dataRows.add(dataRow); + + dataRow.createCell(0).setCellValue(fecha); + dataRow.createCell(1).setCellValue(egreso.getNro()); + dataRow.createCell(2).setCellValue(egreso.getDescripcion()); + dataRow.createCell(3).setCellValue(egreso.getValor()); + + currentRow++; + } + + int lastRow = currentRow - 1; + + if (egresos.size() > 0) { + Row totalRow = sheet.createRow(currentRow++); + totalRows.add(totalRow); + totalRow.createCell(2).setCellValue("TOTAL DIARIO"); + totalRow.createCell(3) + .setCellFormula("SUM(D" + (firstRow + 1) + ":D" + (lastRow + 1) + ")"); + } + + currentDay = currentDay.plusDays(1); + } + } + + private void fillTotales() { + String operation = totalRows.stream().map(row -> "D" + (row.getRowNum() + 1)) + .reduce((a, b) -> String.join("+", a, b)).get(); + this.totalFinal = sheet.createRow(this.dataRows.get(this.dataRows.size()-1).getRowNum() + 2); + this.totalFinal.createCell(2).setCellValue("TOTAL MENSUAL"); + this.totalFinal.createCell(3).setCellFormula(operation); + + } + + private void freezeCells() { + this.sheet.createFreezePane(0, 1); + } + + private void addBorders() { + int rows = this.totalRows.size() + this.dataRows.size() + 1; + PropertyTemplate pt = new PropertyTemplate(); + + //Bordes Internos + pt.drawBorders(new CellRangeAddress(0, rows, 0, 3), BorderStyle.THIN, BorderExtent.ALL); + + //Bordes de los Headers + pt.drawBorders(new CellRangeAddress(0, 0, 0, 3), BorderStyle.MEDIUM, BorderExtent.OUTSIDE); + + //Bordes de los Totales + for (Row row : this.totalRows) { + int index = row.getRowNum(); + pt.drawBorders(new CellRangeAddress(index, index, 0, 3), BorderStyle.NONE, BorderExtent.ALL); + pt.drawBorders(new CellRangeAddress(index, index, 0, 3), BorderStyle.MEDIUM, + BorderExtent.OUTSIDE); + } + + //Borde del Total Final + pt.drawBorders( + new CellRangeAddress(this.totalFinal.getRowNum(), this.totalFinal.getRowNum(), 0, 3), + BorderStyle.NONE, BorderExtent.ALL); + pt.drawBorders( + new CellRangeAddress(this.totalFinal.getRowNum(), this.totalFinal.getRowNum(), 0, 3), + BorderStyle.MEDIUM, BorderExtent.OUTSIDE); + + //Borde externo + pt.drawBorders(new CellRangeAddress(0, rows, 0, 3), BorderStyle.MEDIUM, BorderExtent.OUTSIDE); + + pt.applyBorders(this.sheet); + } + + private void setStyles() { + //Estilo para el header + this.sheet.getRow(0).getCell(0).setCellStyle(this.styles.get("header")); + this.sheet.getRow(0).getCell(1).setCellStyle(this.styles.get("header")); + this.sheet.getRow(0).getCell(2).setCellStyle(this.styles.get("header")); + this.sheet.getRow(0).getCell(3).setCellStyle(this.styles.get("header")); + + //Estilo para el Total Final + this.totalFinal.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("gray")); + this.totalFinal.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("gray")); + this.totalFinal.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("gray")); + this.totalFinal.getCell(3).setCellStyle(this.styles.get("total_final")); + + //Estilo para las filas de datos + for (Row row : this.dataRows) { + row.getCell(0).setCellStyle(this.styles.get("date")); + row.getCell(1).setCellStyle(this.styles.get("regular")); + row.getCell(2).setCellStyle(this.styles.get("regular")); + row.getCell(3).setCellStyle(this.styles.get("money")); + } + + //Estilo para las filas de totales + for (Row row : this.totalRows) { + row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("not_so_gray")); + row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("not_so_gray")); + row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("not_so_gray")); + row.getCell(3, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellStyle(this.styles.get("total")); + } + + //Setea el alto de las filas + this.sheet.getRow(0).setHeightInPoints(30); + this.totalFinal.setHeightInPoints(20); + for (Row row : this.dataRows) { + row.setHeightInPoints(15); + } + for (Row row : this.totalRows) { + row.setHeightInPoints(18); + } + + //Setea el ancho de las columnas + sheet.autoSizeColumn(0); + sheet.autoSizeColumn(1); + sheet.autoSizeColumn(2); + sheet.autoSizeColumn(3); + } + + private HashMap generateStyles() { + Font font = this.wb.createFont(); + font.setBold(true); + font.setColor(IndexedColors.WHITE.getIndex()); + + CellStyle regularStyle = this.wb.createCellStyle(); + + CellStyle grayStyle = this.wb.createCellStyle(); + grayStyle.setFont(font); + grayStyle.setVerticalAlignment(VerticalAlignment.CENTER); + grayStyle.setFillForegroundColor(IndexedColors.GREY_80_PERCENT.getIndex()); + grayStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle notSoGrayStyle = this.wb.createCellStyle(); + notSoGrayStyle.setFont(font); + notSoGrayStyle.setVerticalAlignment(VerticalAlignment.CENTER); + notSoGrayStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); + notSoGrayStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle dateStyle = this.wb.createCellStyle(); + dateStyle.setDataFormat(this.createHelper.createDataFormat().getFormat("dd/mm/yyyy")); + + CellStyle moneyStyle = this.wb.createCellStyle(); + moneyStyle + .setDataFormat(this.createHelper.createDataFormat().getFormat("\"$\"#,##0_);(\"$\"#,##0)")); + + CellStyle headerStyle = this.wb.createCellStyle(); + headerStyle.cloneStyleFrom(grayStyle); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + + CellStyle totalStyle = this.wb.createCellStyle(); + totalStyle.cloneStyleFrom(notSoGrayStyle); + totalStyle + .setDataFormat(this.createHelper.createDataFormat().getFormat("\"$\"#,##0_);(\"$\"#,##0)")); + + CellStyle totalFinalStyle = this.wb.createCellStyle(); + totalFinalStyle.cloneStyleFrom(grayStyle); + totalFinalStyle + .setDataFormat(this.createHelper.createDataFormat().getFormat("\"$\"#,##0_);(\"$\"#,##0)")); + + HashMap styles = new HashMap<>(); + styles.put("regular", regularStyle); + styles.put("gray", grayStyle); + styles.put("not_so_gray", notSoGrayStyle); + styles.put("date", dateStyle); + styles.put("money", moneyStyle); + styles.put("header", headerStyle); + styles.put("total", totalStyle); + styles.put("total_final", totalFinalStyle); + + return styles; + } + + public Workbook generarInforme() { + fillHeaders(); + fillData(); + fillTotales(); + freezeCells(); + setStyles(); + addBorders(); + + return this.wb; + } +} diff --git a/src/danielcortes/xyz/models/egreso/EgresoDAO.java b/src/danielcortes/xyz/models/egreso/EgresoDAO.java index e425fe2..39df1bd 100644 --- a/src/danielcortes/xyz/models/egreso/EgresoDAO.java +++ b/src/danielcortes/xyz/models/egreso/EgresoDAO.java @@ -55,6 +55,8 @@ public abstract class EgresoDAO { public abstract List findByTipoEgreso(TipoEgreso tipoEgreso); + public abstract List getByTipoEgresoEnCaja(TipoEgreso tipoEgreso, Caja caja); + public abstract boolean insertEgreso(Egreso egreso); public abstract boolean updateEgreso(Egreso egreso); diff --git a/src/danielcortes/xyz/models/egreso/SQLiteEgresoDAO.java b/src/danielcortes/xyz/models/egreso/SQLiteEgresoDAO.java index cda16ee..d35cc03 100644 --- a/src/danielcortes/xyz/models/egreso/SQLiteEgresoDAO.java +++ b/src/danielcortes/xyz/models/egreso/SQLiteEgresoDAO.java @@ -150,6 +150,29 @@ public class SQLiteEgresoDAO extends EgresoDAO { return egresoList; } + @Override + public List getByTipoEgresoEnCaja(TipoEgreso tipoEgreso, Caja caja) { + List egresoList = new ArrayList<>(); + + if (caja == Caja.EMPTY) { + return egresoList; + } + + String query = "select * from egresos where tipo_egreso_id = ? and caja_id = ?"; + try (Connection conn = connectionHolder.getConnection()) { + try (PreparedStatement ps = conn.prepareStatement(query)) { + ps.setInt(1, tipoEgreso.getId()); + ps.setInt(2, caja.getId()); + try (ResultSet rs = ps.executeQuery()) { + egresoList = this.egresosFromResultSet(rs); + } + } + } catch (SQLException e) { + LOGGER.log(Level.SEVERE, e.toString(), e); + } + return egresoList; + } + @Override public boolean insertEgreso(Egreso egreso) { int updates; diff --git a/src/danielcortes/xyz/models/informes/egresos/InformeEgresosContent.java b/src/danielcortes/xyz/models/informes/egresos/InformeEgresosContent.java deleted file mode 100644 index e6ce691..0000000 --- a/src/danielcortes/xyz/models/informes/egresos/InformeEgresosContent.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2018-2019 Daniel Cortes - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package danielcortes.xyz.models.informes.egresos; - -import java.time.LocalDate; - -public class InformeEgresosContent { - - private LocalDate fecha; - private String nro; - private String descripcion; - private int valor; - - public LocalDate getFecha() { - return fecha; - } - - public void setFecha(LocalDate fecha) { - this.fecha = fecha; - } - - public String getNro() { - return nro; - } - - public void setNro(String nro) { - this.nro = nro; - } - - public String getDescripcion() { - return descripcion; - } - - public void setDescripcion(String descripcion) { - this.descripcion = descripcion; - } - - public int getValor() { - return valor; - } - - public void setValor(int valor) { - this.valor = valor; - } - - @Override - public String toString() { - return "InformeEgresosContent{" + - "fecha=" + fecha + - ", nro='" + nro + '\'' + - ", descripcion='" + descripcion + '\'' + - ", valor=" + valor + - '}'; - } -} diff --git a/src/danielcortes/xyz/models/informes/egresos/InformeEgresosContentDAO.java b/src/danielcortes/xyz/models/informes/egresos/InformeEgresosContentDAO.java deleted file mode 100644 index 062bde3..0000000 --- a/src/danielcortes/xyz/models/informes/egresos/InformeEgresosContentDAO.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2018-2019 Daniel Cortes - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package danielcortes.xyz.models.informes.egresos; - -import danielcortes.xyz.data.ConnectionHolder; -import java.time.YearMonth; -import java.util.List; - -public abstract class InformeEgresosContentDAO { - - protected ConnectionHolder connectionHolder; - - /** - * Genera el informe con nombre muy largo - * - * @param mes mes sobre el cual se quiere le informe - * @return lista del objeto que contiene los datos necesarios para el informe - */ - public abstract List getInformeEgresosFactuasMateriaPrima(YearMonth mes, - int tipoEgresoId); -} diff --git a/src/danielcortes/xyz/models/informes/egresos/SQLiteInformeEgresosContentDAO.java b/src/danielcortes/xyz/models/informes/egresos/SQLiteInformeEgresosContentDAO.java deleted file mode 100644 index d665216..0000000 --- a/src/danielcortes/xyz/models/informes/egresos/SQLiteInformeEgresosContentDAO.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2018-2019 Daniel Cortes - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package danielcortes.xyz.models.informes.egresos; - -import danielcortes.xyz.data.SQLiteConnectionHolder; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.time.LocalDate; -import java.time.YearMonth; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class SQLiteInformeEgresosContentDAO extends InformeEgresosContentDAO { - - private static final Logger LOGGER = Logger.getLogger(InformeEgresosContentDAO.class.getName()); - - private List list; - - public SQLiteInformeEgresosContentDAO() { - this.connectionHolder = new SQLiteConnectionHolder(); - } - - @Override - public List getInformeEgresosFactuasMateriaPrima(YearMonth mes, - int tipoEgresoId) { - list = new ArrayList<>(); - try (Connection conn = connectionHolder.getConnection()) { - - String query = "select caja.fecha as \"fecha\"," + - "egresos.nro as \"nro\"," + - "egresos.descripcion as \"descripcion\"," + - "egresos.valor as \"valor\"" + - "from egresos inner join caja on egresos.caja_id = caja.id " + - "where caja.fecha between date(?) and date(?) and egresos.tipo_egreso_id = ? " + - "order by caja.fecha;"; - - PreparedStatement ps = conn.prepareStatement(query); - ps.setString(1, mes.atDay(1).toString()); - ps.setString(2, mes.atEndOfMonth().toString()); - ps.setInt(3, tipoEgresoId); - ResultSet rs = ps.executeQuery(); - - LOGGER.log(Level.FINE, "QUERY: {0} | values: [{1},{2},{3}]", - new Object[]{mes.atDay(1), mes.atEndOfMonth(), tipoEgresoId}); - - this.fillInforme(rs); - } catch (SQLException e) { - LOGGER.log(Level.SEVERE, e.toString(), e); - } - return list; - } - - private void fillInforme(ResultSet rs) throws SQLException { - while (rs.next()) { - InformeEgresosContent content = new InformeEgresosContent(); - content.setFecha(LocalDate.parse(rs.getString("fecha"))); - content.setDescripcion(rs.getString("descripcion")); - content.setNro(rs.getString("nro")); - content.setValor(rs.getInt("valor")); - LOGGER.log(Level.FINER, "Se a creado: {0}", content); - list.add(content); - } - } -}