generarPDF.ReporteFlujosCliente.java Source code

Java tutorial

Introduction

Here is the source code for generarPDF.ReporteFlujosCliente.java

Source

/*
 * 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 generarPDF;

import controladores.ControladorCliente;
import controladores.ControladorFlujoFactura;
import entidades.Cliente;
import entidades.Flujo_Factura;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

/**
 *
 * @author cardel
 */
public class ReporteFlujosCliente {

    public ReporteFlujosCliente() {

    }

    public void guardarDocumentoDialogo(JDialog dialogo, ArrayList<Integer> flujosID, int cliente_id,
            Calendar fechaInicial, Calendar fechaFinal) {
        PDDocument documento = crearInformeMovimientosCliente(flujosID, cliente_id, fechaInicial, fechaFinal);
        JFileChooser fc = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo PDF", "pdf", "text");

        fc.setFileFilter(filter);

        fc.showSaveDialog(dialogo);
        if (fc.getSelectedFile() != null) {
            File selectedFile = fc.getSelectedFile();
            try {

                documento.save(selectedFile + ".pdf");
                JOptionPane.showMessageDialog(dialogo, "El archivo ha sido guardado en disco");

            } catch (Exception ex) {
                JOptionPane.showMessageDialog(dialogo, "El archivo no se puede leer!");
            }
        }

    }

    public void imprimirFlujo(ArrayList<Integer> flujosID, int cliente_id, Calendar fechaInicial,
            Calendar fechaFinal) {
        try {
            PDDocument document = crearInformeMovimientosCliente(flujosID, cliente_id, fechaInicial, fechaFinal);
            document.print();
            document.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error al crear la factura", "Error", JOptionPane.ERROR_MESSAGE);
        }

    }

    private PDDocument crearInformeMovimientosCliente(ArrayList<Integer> flujosID, int cliente_id,
            Calendar fechaInicial, Calendar fechaFinal) {

        try {

            ControladorCliente controladorCliente = new ControladorCliente();
            Cliente cliente = controladorCliente.obtenerClientePorID(cliente_id);

            PDDocument document = new PDDocument();

            PDPage pagina1 = new PDPage();
            document.addPage(pagina1);

            PDFont font = PDType1Font.HELVETICA_BOLD;
            PDFont fontNormal = PDType1Font.HELVETICA;

            PDPageContentStream contenido = new PDPageContentStream(document, pagina1);

            contenido.beginText();
            contenido.setFont(font, 16);
            contenido.moveTextPositionByAmount(30, 730);
            contenido.drawString("Reporte de movimientos del cliente");
            contenido.endText();

            contenido.beginText();
            contenido.setFont(font, 12);
            contenido.moveTextPositionByAmount(30, 700);
            contenido.drawString("Minimarket Barrio Nuevo.       NIT: 1234567898-9");
            contenido.endText();

            contenido.beginText();
            contenido.setFont(font, 12);
            contenido.moveTextPositionByAmount(30, 680);
            contenido.drawString("Calle Falsa 1 2 3");
            contenido.endText();

            Calendar fecha = new GregorianCalendar();
            //Obtenemos el valor del ao, mes, da,
            //hora, minuto y segundo del sistema
            //usando el mtodo get y el parmetro correspondiente
            int annio = fecha.get(Calendar.YEAR);
            int mes = fecha.get(Calendar.MONTH);
            int dia = fecha.get(Calendar.DAY_OF_MONTH);

            contenido.beginText();
            contenido.setFont(fontNormal, 11);
            contenido.moveTextPositionByAmount(30, 650);
            contenido.drawString("Fecha: " + annio + "/" + (mes + 1) + "/" + dia);
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 11);
            contenido.moveTextPositionByAmount(30, 635);
            contenido.drawString("Nombre: " + cliente.getNombre());
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 11);
            contenido.moveTextPositionByAmount(30, 620);
            contenido.drawString("Direccin: " + cliente.getDireccion());
            contenido.endText();

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(110, 590);

            SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
            String formattedInicial = formato.format(fechaInicial.getTime());
            String formattedFinal = formato.format(fechaFinal.getTime());

            contenido.drawString("DETALLE DE LOS MOVIMIENTOS entre: " + formattedInicial + " y " + formattedFinal);
            contenido.endText();

            //Dibujar lineas
            contenido.drawLine(30, 600, 500, 600);
            contenido.drawLine(30, 585, 500, 585);

            contenido.drawLine(30, 570, 500, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(60, 560);
            contenido.drawString("Factura");
            contenido.endText();
            contenido.drawLine(30, 550, 30, 570);
            contenido.drawLine(200, 550, 200, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(220, 560);
            contenido.drawString("Tipo flujo");
            contenido.endText();
            contenido.drawLine(300, 550, 300, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(320, 560);
            contenido.drawString("Fecha");
            contenido.endText();
            contenido.drawLine(380, 550, 380, 570);

            contenido.beginText();
            contenido.setFont(fontNormal, 12);
            contenido.moveTextPositionByAmount(400, 560);
            contenido.drawString("Valor");
            contenido.endText();
            contenido.drawLine(500, 550, 500, 570);
            contenido.drawLine(500, 550, 500, 570);

            contenido.drawLine(30, 550, 500, 550);

            int altura = 550;
            /*
             * Caben en la pagina
             * Primera pagina 14
             * Seguientes paginas 21
             * Footer cuenta como 3 mas
             */
            int indiceProductos = 0;
            double totalEspaciosNecesarios = flujosID.size() + 3 + 1;
            double totalPaginas = 1;

            if (Math.floor(totalEspaciosNecesarios / 17) == 0) {
                totalPaginas = 1;
            } else {
                totalEspaciosNecesarios -= 17;
                totalPaginas += (int) Math.ceil(totalEspaciosNecesarios / 21);
            }
            double abonos = 0.0;
            double deudas = 0.0;
            for (int i = 0; i < flujosID.size(); i++) {
                ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
                Flujo_Factura flujoFactura = controladorFlujoFactura
                        .getFlujo_Factura(" where flujo_id=" + flujosID.get(i));

                if (flujoFactura.getTipo_flujo().equals("abono")) {
                    abonos += flujoFactura.getValor();
                } else {
                    deudas += flujoFactura.getValor();
                }
            }
            //Primer pagina
            for (int i = 0; i < flujosID.size() && altura >= 30; i++) {
                //Imprime por paginas
                ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
                Flujo_Factura flujoFactura = controladorFlujoFactura
                        .getFlujo_Factura(" where flujo_id=" + flujosID.get(i));

                String facturaID = String.valueOf(flujoFactura.getFactura_id());

                if (facturaID.length() > 25) {
                    facturaID = facturaID.substring(0, 26);
                }

                String tipoFlujo = flujoFactura.getTipo_flujo();

                String fechaFlujo = flujoFactura.getFecha();
                fechaFlujo = fechaFlujo.substring(0, 10);
                String valorTotal = String.valueOf(flujoFactura.getValor());

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(40, altura - 15);
                contenido.drawString(String.valueOf(i + 1));
                contenido.endText();
                contenido.drawLine(30, altura, 30, altura - 30);
                contenido.drawLine(200, altura, 200, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(70, altura - 15);
                contenido.drawString(facturaID);
                contenido.endText();
                contenido.drawLine(70, altura, 70, altura - 30);
                contenido.drawLine(200, altura, 200, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(220, altura - 15);
                contenido.drawString(tipoFlujo);
                contenido.endText();
                contenido.drawLine(300, altura, 300, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(310, altura - 15);
                contenido.drawString(fechaFlujo);
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(valorTotal);
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenido.drawLine(30, altura - 30, 500, altura - 30);
                altura -= 30;
                indiceProductos = i + 1;
            }
            //Escribir footer si paginas es igual a 1
            if (totalPaginas == 1) {
                Double valor = abonos - deudas;

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(300, altura - 15);
                contenido.drawString("Abonado por el cliente");
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(String.valueOf(abonos));
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);

                //Linea inferior
                contenido.drawLine(300, altura, 300, altura - 30);
                contenido.drawLine(300, altura - 30, 500, altura - 30);

                altura -= 30;
                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(300, altura - 15);
                contenido.drawString("Prestado al cliente");
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(String.valueOf(deudas));
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenido.drawLine(300, altura, 300, altura - 30);
                contenido.drawLine(300, altura - 30, 500, altura - 30);
                altura -= 30;

                contenido.beginText();
                contenido.setFont(fontNormal, 12);
                contenido.moveTextPositionByAmount(300, altura - 15);
                contenido.drawString("Total flujos");
                contenido.endText();
                contenido.drawLine(380, altura, 380, altura - 30);

                contenido.beginText();
                contenido.setFont(font, 12);
                contenido.moveTextPositionByAmount(400, altura - 15);
                contenido.drawString(String.valueOf(valor));
                contenido.endText();
                contenido.drawLine(500, altura, 500, altura - 30);
                //Linea inferior
                contenido.drawLine(300, altura - 30, 500, altura - 30);
                contenido.drawLine(300, altura, 300, altura - 30);

            }

            //Siguientes paginas
            for (int j = 1; j < totalPaginas; j++) {
                altura = 650;
                PDPage paginaSiguiente = new PDPage();
                document.addPage(paginaSiguiente);

                PDPageContentStream contenidoSiguiente = new PDPageContentStream(document, paginaSiguiente);
                //Escribir paginas
                for (int i = indiceProductos; i < flujosID.size() && altura >= 30; i++) {
                    //Imprime por paginas
                    //Imprime por paginas
                    ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
                    Flujo_Factura flujoFactura = controladorFlujoFactura
                            .getFlujo_Factura(" where flujo_id=" + flujosID.get(i));

                    String facturaID = String.valueOf(flujoFactura.getFactura_id());

                    if (facturaID.length() > 25) {
                        facturaID = facturaID.substring(0, 26);
                    }

                    String tipoFlujo = flujoFactura.getTipo_flujo();

                    String fechaFlujo = flujoFactura.getFecha();
                    fechaFlujo = fechaFlujo.substring(0, 10);
                    String valorTotal = String.valueOf(flujoFactura.getValor());

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(40, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(i + 1));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(30, altura, 30, altura - 30);
                    contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(70, altura - 15);
                    contenidoSiguiente.drawString(facturaID);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(70, altura, 70, altura - 30);
                    contenidoSiguiente.drawLine(200, altura, 200, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(220, altura - 15);
                    contenidoSiguiente.drawString(tipoFlujo);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(300, altura, 300, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(310, altura - 15);
                    contenidoSiguiente.drawString(fechaFlujo);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(valorTotal);
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                    //Linea inferior
                    contenidoSiguiente.drawLine(30, altura - 30, 500, altura - 30);
                    altura -= 30;
                    indiceProductos = i + 1;
                }
                //Si no cabe mas cierre el flujo.
                if (indiceProductos < flujosID.size()) {
                    contenidoSiguiente.close();
                }
                //En ultima pagina escribir footer
                if (j == totalPaginas - 1 && altura >= 40) {
                    Double valor = abonos - deudas;

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(300, altura - 15);
                    contenidoSiguiente.drawString("Abonado por el cliente");
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(abonos));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);

                    //Linea inferior
                    contenidoSiguiente.drawLine(300, altura, 300, altura - 30);
                    contenidoSiguiente.drawLine(300, altura - 30, 500, altura - 30);

                    altura -= 30;
                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(300, altura - 15);
                    contenidoSiguiente.drawString("Prestado al cliente");
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(deudas));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                    //Linea inferior
                    contenidoSiguiente.drawLine(300, altura, 300, altura - 30);
                    contenidoSiguiente.drawLine(300, altura - 30, 500, altura - 30);
                    altura -= 30;

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(fontNormal, 12);
                    contenidoSiguiente.moveTextPositionByAmount(300, altura - 15);
                    contenidoSiguiente.drawString("Total flujo");
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(380, altura, 380, altura - 30);

                    contenidoSiguiente.beginText();
                    contenidoSiguiente.setFont(font, 12);
                    contenidoSiguiente.moveTextPositionByAmount(400, altura - 15);
                    contenidoSiguiente.drawString(String.valueOf(valor));
                    contenidoSiguiente.endText();
                    contenidoSiguiente.drawLine(500, altura, 500, altura - 30);
                    //Linea inferior
                    contenidoSiguiente.drawLine(300, altura - 30, 500, altura - 30);
                    contenidoSiguiente.drawLine(300, altura, 300, altura - 30);

                    contenidoSiguiente.close();
                } else {
                    contenidoSiguiente.close();
                }

                System.out.println("Pagina numero: " + j + " De  " + totalPaginas);

            }

            contenido.close();
            return document;

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Error al crear la factura ", "Error", JOptionPane.ERROR_MESSAGE);
            return null;
        }

    }

}