Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package comisionesafis.informes; import com.itextpdf.text.Document; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import comisionesafis.ParametrosBean; import java.io.FileOutputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; import utiles.Fechas; import utiles.Numeros; import utiles.Periodos; /** * * @author Santiago */ public class LiquidacionComisiones { Connection conexion; ParametrosBean pb; int paginaNum = 0; public LiquidacionComisiones(Connection conexion, ParametrosBean pb) { this.conexion = conexion; this.pb = pb; } public boolean generar() { // Abrimos el fichero de comisiones String sSQL = ""; Statement stmt; ResultSet rsAgentes; ResultSet rsRecibos; PdfPCell celda; boolean cabeceraColumnas; int filasPorPagina = 0; int fila = 0; PdfPTable table; Double dblTotal = 0.0; // Generamos la sentencia de Seleccin de Datos try { // Generamos el PDF Document documento = new Document(PageSize.A4, 80, 80, 50, 50); FileOutputStream salida = new FileOutputStream("LiquidacionComisiones.pdf"); PdfWriter writer = PdfWriter.getInstance(documento, salida); writer.setInitialLeading(0); // Obtenemos una instancia de nuestro manejador de eventos LiquidacionComisionesPie pie = new LiquidacionComisionesPie(); //Asignamos el manejador de eventos al escritor. writer.setPageEvent(pie); // Abrimos el Documento documento.open(); // SELECT para extraer todos los cdigos de los agentes con Recibos sSQL = "SELECT DISTINCT (CodAgente) AS Agente "; sSQL += " FROM ResumenComisiones"; sSQL += " ORDER BY CodAgente"; stmt = conexion.createStatement(); rsAgentes = stmt.executeQuery(sSQL); while (rsAgentes.next()) { if (sumaComisiones(rsAgentes.getString("Agente")) != 0) { paginaNum = 0; printCabecera1(documento); printCabeceraPelayo(documento); printCabecera2(documento, rsAgentes); // SELECT para extraer todos los Recibos de un agente sSQL = "SELECT * "; sSQL += " FROM Recibos"; sSQL += " WHERE CodAgente = '" + rsAgentes.getString("Agente") + "'"; stmt = conexion.createStatement(); rsRecibos = stmt.executeQuery(sSQL); // if(rsAgentes.getString("Agente").equals("10803")){ // System.out.println(""); // } // Creamos la tabla formateada table = creaTabla(); cabeceraColumnas = true; filasPorPagina = 42; dblTotal = 0.0; while (rsRecibos.next()) { if (Double.parseDouble(rsRecibos.getString("ImpComision")) != 0) { if (fila >= filasPorPagina) { // Salto de pgina // Imprimimos el contenido de la tabla documento.add(table); documento.newPage(); table = creaTabla(); saltoDePagina(documento, table, rsAgentes); fila = 1; filasPorPagina = 47; } else if (cabeceraColumnas) { // Primera pgina printCabeceraColumnas(table); cabeceraColumnas = false; fila = 1; } Font font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(rsRecibos.getString("NPoliza"), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(celda); celda = new PdfPCell( new Phrase(Fechas.fechaVencimiento(rsRecibos.getString("Fecha")), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(celda); celda = new PdfPCell(new Phrase(fondoRecibo(rsRecibos.getString("Descripcion")), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(celda); celda = new PdfPCell(new Phrase(rsRecibos.getString("Importe"), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_RIGHT); table.addCell(celda); celda = new PdfPCell(new Phrase(Numeros.formateaDosDecimales( Double.parseDouble(rsRecibos.getString("ImpComision"))), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_RIGHT); table.addCell(celda); dblTotal += Double.parseDouble(rsRecibos.getString("ImpComision")); fila++; } } if (fila >= filasPorPagina - 5) { documento.add(table); documento.newPage(); table = creaTabla(); } printResumenContable(table, dblTotal, rsAgentes.getString("Agente")); documento.add(table); documento.newPage(); } } documento.close(); return true; } catch (Exception e) { return false; } } private void printCabecera1(Document documento) { Paragraph parrafo; String patron = "dd/MM/yyyy"; SimpleDateFormat formato = new SimpleDateFormat(patron); String fecha = (formato.format(new Date())); Fechas objFecha = new Fechas(); try { paginaNum++; Font fontFecha = new Font(Font.FontFamily.COURIER, 7, Font.NORMAL); parrafo = new Paragraph(fecha, fontFecha); parrafo.setAlignment(Element.ALIGN_RIGHT); documento.add(parrafo); Font fontPaginaNum = new Font(Font.FontFamily.COURIER, 7, Font.NORMAL); parrafo = new Paragraph("Pgina " + Integer.toString(paginaNum), fontPaginaNum); parrafo.setAlignment(Element.ALIGN_RIGHT); documento.add(parrafo); Font fontLIQ03 = new Font(Font.FontFamily.COURIER, 7, Font.NORMAL); parrafo = new Paragraph("LIQ03_0202", fontLIQ03); parrafo.setAlignment(Element.ALIGN_RIGHT); documento.add(parrafo); Periodos fechaLiquidacion = new Periodos(pb.getFicheroComisiones()); Font fontTitulo = new Font(Font.FontFamily.COURIER, 12, Font.NORMAL); parrafo = new Paragraph("LIQUIDACIN DE COMISIONES: " + fechaLiquidacion.extraeMesTxtAnno(), fontTitulo); parrafo.setAlignment(Element.ALIGN_CENTER); documento.add(parrafo); } catch (Exception e) { System.out.println(e.getMessage()); } } private void printCabeceraPelayo(Document documento) { Paragraph parrafo; try { // Separadores parrafo = new Paragraph(" "); documento.add(parrafo); parrafo = new Paragraph(" "); documento.add(parrafo); Font fuente = new Font(Font.FontFamily.COURIER, 9, Font.NORMAL); parrafo = new Paragraph("PELAYO MUTUA DE SEGUROS", fuente); parrafo.setAlignment(Element.ALIGN_RIGHT); documento.add(parrafo); parrafo = new Paragraph("CL SANTA ENGRACIA, 67", fuente); parrafo.setAlignment(Element.ALIGN_RIGHT); documento.add(parrafo); // Separadores parrafo = new Paragraph(" "); documento.add(parrafo); parrafo = new Paragraph(" "); documento.add(parrafo); } catch (Exception e) { System.out.println(e.getMessage()); } } private void printCabecera2(Document documento, ResultSet rsAgentes) { String sSQL = ""; Statement stmt; ResultSet rsDatosAgente; try { // SELECT para extraer todos los cdigos de los agentes con Recibos sSQL = "SELECT * "; sSQL += " FROM Agentes"; sSQL += " WHERE CodAgente='" + rsAgentes.getString("Agente") + "'"; stmt = conexion.createStatement(); rsDatosAgente = stmt.executeQuery(sSQL); if (!rsDatosAgente.next()) { // Este error no debera darse System.out.println("Error: No hay datos para el agente " + rsAgentes.getString("Agente")); return; } // Generamos la cabecera //Font fuenteCabecera = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); float[] anchuras = { 3f, 1f, 5f }; PdfPTable table1 = new PdfPTable(anchuras); // Tipo de letra para la tabla Font font = new Font(Font.FontFamily.COURIER, 9, Font.NORMAL); PdfPCell celda = new PdfPCell(); // Sucursal/Delegacin celda = new PdfPCell(new Phrase("SUCURSAL/DELEGACIN", font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table1.addCell(celda); celda = new PdfPCell(new Phrase("02", font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table1.addCell(celda); celda = new PdfPCell(new Phrase("PELAYO MONDIALE VIDA", font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table1.addCell(celda); // No tenemos estos datos. Me pide Fernando que los quite // // Inspeccin // celda = new PdfPCell(new Phrase("INSPECCIN",font)); // celda.setBorder(Rectangle.NO_BORDER); // celda.setHorizontalAlignment(Element.ALIGN_LEFT); // table1.addCell(celda); // // celda = new PdfPCell(new Phrase("000001",font)); // celda.setBorder(Rectangle.NO_BORDER); // celda.setHorizontalAlignment(Element.ALIGN_LEFT); // table1.addCell(celda); // // celda = new PdfPCell(new Phrase("ACUERDO DE DISTRIBUCIN",font)); // celda.setBorder(Rectangle.NO_BORDER); // celda.setHorizontalAlignment(Element.ALIGN_LEFT); // table1.addCell(celda); // Agente celda = new PdfPCell(new Phrase("AGENTE", font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table1.addCell(celda); celda = new PdfPCell(new Phrase(rsDatosAgente.getString("CodAgente"), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table1.addCell(celda); celda = new PdfPCell(new Phrase(rsDatosAgente.getString("Nombre"), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); table1.addCell(celda); documento.add(table1); } catch (Exception e) { System.out.println(e.getMessage()); } } private void printCabeceraColumnas(PdfPTable table) { PdfPCell celda; Font font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("NUMERO DE PLIZA", font)); celda.setBorder(Rectangle.TOP + Rectangle.BOTTOM + Rectangle.LEFT); celda.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(celda); celda = new PdfPCell(new Phrase("FECHA DE VENCIMIENTO", font)); celda.setBorder(Rectangle.TOP + Rectangle.BOTTOM); celda.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(celda); celda = new PdfPCell(new Phrase("FORMA DE PAGO", font)); celda.setBorder(Rectangle.TOP + Rectangle.BOTTOM); celda.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(celda); celda = new PdfPCell(new Phrase("BASE COMISIN", font)); celda.setBorder(Rectangle.TOP + Rectangle.BOTTOM); celda.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(celda); celda = new PdfPCell(new Phrase("IMPORTE", font)); celda.setBorder(Rectangle.TOP + Rectangle.BOTTOM + Rectangle.RIGHT); celda.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(celda); } private PdfPTable creaTabla() { float[] anchuras = { 2f, 1f, 1f, 1f, 1f }; PdfPTable tabla = new PdfPTable(anchuras); tabla.setWidthPercentage(100); tabla.setSpacingBefore(4f); return tabla; } private void saltoDePagina(Document documento, PdfPTable tabla, ResultSet rsAgentes) { Paragraph parrafo; try { // Creamos la tabla formateada //tabla=creaTabla(); printCabecera1(documento); parrafo = new Paragraph(" "); documento.add(parrafo); printCabecera2(documento, rsAgentes); printCabeceraColumnas(tabla); } catch (Exception e) { System.out.println(e.getMessage()); } } private void printResumenContable(PdfPTable tabla, Double total, String codAgente) { ResultSet rsAgente; Statement stmt; String sSQL = ""; Double retencion; Double liquido; String patron = "dd/MM/yyyy"; SimpleDateFormat formato = new SimpleDateFormat(patron); String fecha = (formato.format(new Date())); String cuenta; try { // SELECT para extraer todos los cdigos de los agentes con Recibos sSQL = "SELECT * "; sSQL += " FROM Agentes"; sSQL += " WHERE CodAgente ='" + codAgente + "'"; stmt = conexion.createStatement(); rsAgente = stmt.executeQuery(sSQL); PdfPCell celda; Font font; // Primera fila de datos font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(" ", font)); celda.setColspan(3); celda.setBorder(Rectangle.TOP); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("TOTAL ", font)); celda.setBorder(Rectangle.TOP); celda.setHorizontalAlignment(Element.ALIGN_LEFT); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(Numeros.formateaDosDecimales(total), font)); celda.setBorder(Rectangle.TOP); celda.setHorizontalAlignment(Element.ALIGN_RIGHT); tabla.addCell(celda); // Segunda fila de datos font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(" ", font)); celda.setColspan(3); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("I.R.P.F. " + rsAgente.getString("RetencionPorcentaje") + "%", font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_LEFT); tabla.addCell(celda); retencion = total * (Double.parseDouble(rsAgente.getString("RetencionPorcentaje")) / 100); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(Numeros.formateaDosDecimales(retencion), font)); celda.setBorder(Rectangle.NO_BORDER); celda.setHorizontalAlignment(Element.ALIGN_RIGHT); tabla.addCell(celda); // Tercera fila de datos font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(" ", font)); celda.setColspan(3); celda.setBorder(Rectangle.BOTTOM); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("L?QUIDO ", font)); celda.setBorder(Rectangle.BOTTOM); celda.setHorizontalAlignment(Element.ALIGN_LEFT); tabla.addCell(celda); liquido = total - retencion; font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(Numeros.formateaDosDecimales(liquido), font)); celda.setBorder(Rectangle.BOTTOM); celda.setHorizontalAlignment(Element.ALIGN_RIGHT); tabla.addCell(celda); // Cuenta cuenta = rsAgente.getString("Banco") + " "; cuenta += rsAgente.getString("Sucursal") + " "; cuenta += rsAgente.getString("DC") + " "; cuenta += rsAgente.getString("Cuenta") + " "; font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("CTA n " + cuenta, font)); celda.setColspan(5); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); // Firma font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("En Madrid a " + fecha, font)); celda.setColspan(5); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("V.Bo. ", font)); celda.setColspan(5); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(" ", font)); celda.setColspan(5); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase(" ", font)); celda.setColspan(5); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); font = new Font(Font.FontFamily.COURIER, 8, Font.NORMAL); celda = new PdfPCell(new Phrase("PELAYO VIDA", font)); celda.setColspan(5); celda.setBorder(Rectangle.NO_BORDER); tabla.addCell(celda); } catch (Exception e) { System.out.println(e.getMessage()); } } private String fondoRecibo(String garantia) { if (garantia.startsWith("F")) return "FONDO"; if (garantia.startsWith("R")) return "RECIBO"; else return ""; } private double sumaComisiones(String codAgente) { String sSQL = ""; Statement stmt; ResultSet rsComisiones; try { // SELECT para extraer todos los Recibos de un agente sSQL = "SELECT SUM(TotalComisiones) AS Total "; sSQL += " FROM ResumenComisiones"; sSQL += " WHERE CodAgente = '" + codAgente + "'"; stmt = conexion.createStatement(); rsComisiones = stmt.executeQuery(sSQL); rsComisiones.next(); return rsComisiones.getDouble("Total"); } catch (Exception e) { System.out.println("Error " + e.getMessage()); return 0; } } }