comedor.actions.OperacionesComedorAction.java Source code

Java tutorial

Introduction

Here is the source code for comedor.actions.OperacionesComedorAction.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 comedor.actions;

import administracion.actions.GestorOperacionesDatosRestaurante;
import administracion.actions.GestorOperacionesGenero;
import administracion.modelo.Impuesto;
import administracion.modelo.Mesa;
import administracion.modelo.Producto;
import administracion.modelo.Restaurante;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import comedor.modelo.Cuenta;
import comedor.modelo.ProductoLineaPedido;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import pedidos.modelo.Extra;
import pedidos.modelo.Hamburguesa;
import pedidos.modelo.Pedido;

/**
 *
 * @author juang
 */
public class OperacionesComedorAction extends ActionSupport implements ServletRequestAware, ServletResponseAware {

    //Para interactuar con la JSP
    private List<Mesa> listaMesas;
    private Pedido pedido;
    private Cuenta cuenta;
    private List<Impuesto> listaImpuestos;

    //Uso interno
    private List<Producto> listaProductos;

    //Variables para gestionar la peticion
    private HttpServletRequest request;
    private HttpServletResponse response;
    private ServletOutputStream output;
    private InputStream respuesta;
    private String nombreDocumento;

    private String RUTA_CUENTAS;

    //Para gestionar la sesion
    private Map session = ActionContext.getContext().getSession();

    //Para gestionar las peticiones a BD
    private final GestorOperacionesDatosRestaurante godr = new GestorOperacionesDatosRestaurante();
    private final GestorOperacionesGenero gog = new GestorOperacionesGenero();
    private final GestorOperacionesComedor goc = new GestorOperacionesComedor();

    //Para gestionar la nevegacion del xml
    private String navegacion;

    @Override
    public String execute() throws Exception {
        int numeroMesa;

        //Obtenemos los datos del request
        String operacion = request.getParameter("operacion");

        switch (operacion) {
        case "cargarMesas":
            //Obtenemos el listado de mesas en BD
            listaMesas = godr.obtenerListadoMesas();
            listaProductos = gog.obtenerListaProductosActivos(); //Obtenemos los productos activos

            if (listaProductos != null) {
                session.put("listaProductosComedor", listaProductos);
            }

            navegacion = "CARGAR_MESAS";

            break;

        case "actualizarMesas":
            try {
                actualizarVistaMesas();
            } catch (Exception e) {
                System.out.println("OperacionesComedorAction. Error al actualizar la vista mesas: " + e);
            }

            navegacion = null;

            break;

        case "generarCuenta":
            //Recuperamos los parametros de la peticion
            numeroMesa = Integer.parseInt(request.getParameter("numeroMesa"));
            //Obtenemos pedido asociado a la mesa (numeroMesa)
            Pedido pedidoAux = goc.obtenerPedidoMesa(numeroMesa);
            //Con el id del pedido obtenemos los registros del pedido
            List<ProductoLineaPedido> listaLineasPedido = goc.obtenerLineasPedido(pedidoAux.getId());
            //Con los registros del pedido vamos "construyendo" los productos completos, creamos el pedido y los vamos aadiendo
            construirPedido(pedidoAux, listaLineasPedido);
            //Guardamos el pedido en sesion
            session.put("pedidoComedor", pedido);
            //Obtenemos los impuestos
            listaImpuestos = godr.obtenerImpuestos();
            //Guardamos impuestos en sesion
            session.put("listaImpuestosComedor", listaImpuestos);
            //Aadimos el registro del pedido a la BD (cuenta) y Actualizamos el estado de la mesa.
            cuenta = goc.generarCuenta(pedido, listaImpuestos);
            //Guardamos la cuenta en sesion
            session.put("cuentaComedor", cuenta);

            navegacion = "MOSTRAR_CUENTA";

            break;

        case "descargarCuenta":
            //Recuperamos el pedido de la sesion
            pedido = (Pedido) session.get("pedidoComedor");
            //Recuperamos la cuenta de la sesion
            cuenta = (Cuenta) session.get("cuentaComedor");
            //Recuperamos impuestos de la sesion
            listaImpuestos = (List<Impuesto>) session.get("listaImpuestosComedor");

            //Construimos la ruta donde almacenar el PDF
            String ruta = request.getServletContext().getInitParameter("RutaCuentas"); //Obtenemos del web.xml el parametro RutaCuentas            
            ruta = ruta.replaceAll("/", Matcher.quoteReplacement(File.separator)); //Recomponemos la ruta con el separtor adecuado al sistema operativo                  
            RUTA_CUENTAS = System.getProperty("catalina.base") + ruta; //Indicamos la ruta desde el CATALINA_BASE 

            //Asignamos el nombreDocumento
            SimpleDateFormat formatoNombreCuenta = new SimpleDateFormat("_yyyyMMdd_HHmmss_");
            nombreDocumento = "cuenta" + formatoNombreCuenta.format(cuenta.getFecha()) + cuenta.getId() + ".pdf";

            try {
                //Generamos el pdf con los datos del pedido
                crearPDF();
                //Asignamos el documento al flujo de respuesta      
                respuesta = new DataInputStream(new FileInputStream(RUTA_CUENTAS + nombreDocumento));

            } catch (IOException | DocumentException e) {
                System.err.println("OperacionesComedorAction. Error al crear el PDF: " + e);
                throw e;
            }

            //Limpiamos la sesion
            session.remove("pedidoComedor");
            session.remove("cuentaComedor");
            session.remove("listaImpuestosComedor");
            session.remove("listaProductosComedor");

            navegacion = "CUENTA";

            break;

        case "cuentaPagada":
            //Recuperamos los parametros de la peticion
            numeroMesa = Integer.parseInt(request.getParameter("numeroMesa"));
            //Actualizamos el estado de la mesa
            goc.actualizarEstadoMesaPendienteALibre(numeroMesa);

            try {
                actualizarVistaMesas();
            } catch (IOException e) {
                System.out.println("OperacionesComedorAction. Error al actualizar la vista mesas: " + e);
            }

            navegacion = null;

            break;
        }

        return navegacion;
    }

    private void actualizarVistaMesas() throws Exception {
        try {
            //Obtenemos el listado de mesas en BD
            listaMesas = godr.obtenerListadoMesas();

            //Configuramos el objeto para response
            response.setContentType("text/html; charset=iso-8859-1");
            output = response.getOutputStream(); //Obtenemos una referencia al objeto que nos permite escribir en la respuesta del servlet

            if (listaMesas != null) { //Si hemos obtenido un listado de mesas
                for (Mesa mesa : listaMesas) {
                    if (mesa.getEstado().equals("libre")) {
                        output.print("<div style='float: left; margin-right: 20px;'>");
                        output.print("<img alt=" + mesa.getNumero()
                                + " class='img-circle' width='140' height='140' style='background-color: green'>");
                        output.print("</div>");
                    } else if (mesa.getEstado().equals("ocupada")) {
                        output.print("<div style='float: left; margin-right: 20px;'>");
                        output.print("<img alt=" + mesa.getNumero()
                                + " class='img-circle' width='140' height='140' style='background-color: red'><br/><br/>");
                        output.print("<form class='formGenerarCuenta' action='OperacionesComedor' method='POST'>");
                        output.print("<input type='hidden' id='numeroMesa' name='numeroMesa' value='"
                                + mesa.getNumero() + "'/>");
                        output.print(
                                "<button type='submit' class='btn btn-default has-spinner' name='operacion' value='generarCuenta'>"
                                        + "<span class='spinner'><i class='glyphicon glyphicon-refresh spin'></i></span>"
                                        + getText("comedor.generarCuenta") + "</button>");
                        output.print("</form>");
                        output.print("</div>");
                    } else if (mesa.getEstado().equals("pendiente")) {
                        output.print("<div style='float: left; margin-right: 20px;'>");
                        output.print("<img alt=" + mesa.getNumero()
                                + " class='img-circle' width='140' height='140' style='background-color: yellow'><br/><br/>");
                        output.print(
                                "<button type='button' class='btn btn-default has-spinner' onclick='cuentaPagada(this, "
                                        + mesa.getNumero() + ")'>"
                                        + "<span class='spinner'><i class='glyphicon glyphicon-refresh spin'></i></span>"
                                        + getText("comedor.cuentaPagada") + "</button>");
                        output.print("</div>");
                    } else {
                        output.print("<div style='float: left; margin-right: 20px;'>");
                        output.print("<p><strong style='color: red;'>" + getText("comedor.error.cargarMesa")
                                + "</strong></p>");
                        output.print("</div>");
                    }
                }
            } else { //Si ha habido algun error y listaMesas es null
                output.print("<p><strong style='color: red;'>" + getText("comedor.error.cargarListaMesas")
                        + "</strong></p>");
            }
        } catch (Exception e) {
            System.out.println("OperacionesComedorAction. Error al montar la vista resultado: " + e);
            throw e;
        } finally {
            //Cerramos el flujo de respuesta del servlet
            output.flush();
            output.close();
        }
    }

    private void construirPedido(Pedido pedidoAux, List<ProductoLineaPedido> listaLineasPedido) {
        //Obtenemos la lista de productos de la sesion para poder obtener la info completa del producto a apartir de su id
        listaProductos = (List<Producto>) session.get("listaProductosComedor");
        //Contruimos el pedido
        pedido = new Pedido();
        //Le asignamos los parametros
        pedido.setId(pedidoAux.getId()); //Id
        pedido.setNumeroMesa(pedidoAux.getNumeroMesa()); //Numero de mesa
        pedido.setIdUsuario(pedidoAux.getIdUsuario()); //camarero
        //Lista de productos
        Hamburguesa h = null;
        double importe = 0;
        for (ProductoLineaPedido linea : listaLineasPedido) { //Recorremos las lineas del pedido
            Producto producto = obtenerProducto(linea.getIdProducto()); //Obtenemos la informacion completa del producto                 
            producto.setUnidades(linea.getUnidades()); //Asignamos el numero de unidades que quiere el cliente
            importe += (producto.getPrecio() * producto.getUnidades()); //Vamos obteniendo el importe del pedido
            if (producto instanceof Hamburguesa) { //Si el producto es de tipo hamburguesa
                h = (Hamburguesa) producto; //Hacemos que nuestra referecia hamburguesa apunte al objeto (sera de tipo Hamburguesa)
                pedido.getListaProductos().add(h); //Aadimos la hamburguesa al pedido
            } else if (producto instanceof Extra) { //Si el producto es de tipo extra
                h.getListaProductosExtra().add((Extra) producto); //h apuntara a la ultima hamburguesa por lo que los extras que vengan le pertenecen
            } else { //Si es de cualquier otro tipo
                pedido.getListaProductos().add(producto); //Aadimos el producto al pedido
            }
        }
        //Importe
        pedido.setImporte(importe);
    }

    private Producto obtenerProducto(int id) {
        Producto producto = null;
        for (Producto p : listaProductos) { //Recorremos la listaProductos
            if (p.getId() == id) { //Si encontramos el producto
                if ("Hamburguesa".equals(p.getCategoria())) { //Si el producto es de la categoria hamburguesa
                    //Creamos un objeto Hamburguesa y le asignamos los datos del producto que estamos analizando
                    Producto hamburguesa = new Hamburguesa();
                    hamburguesa.setId(p.getId());
                    hamburguesa.setNombre(p.getNombre());
                    hamburguesa.setPrecio(p.getPrecio());
                    hamburguesa.setDescripcion(p.getDescripcion());
                    hamburguesa.setActivo(p.isActivo());
                    hamburguesa.setCategoria(p.getCategoria());

                    producto = hamburguesa;
                } else if ("Extra".equals(p.getCategoria())) { //Si el producto es de la categoria extra
                    //Creamos un objeto Extra y le asignamos los datos del producto que estamos analizando
                    Producto extra = new Extra();
                    extra.setId(p.getId());
                    extra.setNombre(p.getNombre());
                    extra.setPrecio(p.getPrecio());
                    extra.setDescripcion(p.getDescripcion());
                    extra.setActivo(p.isActivo());
                    extra.setCategoria(p.getCategoria());

                    producto = extra;
                } else { //Si es de cualquier otra categoria
                    producto = p;
                }
                break; //Dejamos de iterar
            }
        }
        return producto;
    }

    private void crearPDF() throws IOException, DocumentException {
        Restaurante restaurante = godr.obtenerDatosRestaurante();

        //Creamos el directorio donde almacenar los pdf sino existe
        File file = new File(RUTA_CUENTAS); //Especificamos la ruta
        if (!file.exists()) { //Si el directorio no existe
            if (file.mkdir()) { //Creamos el directorio
                //Le asignamos los permisos 777
                file.setExecutable(true);
                file.setReadable(true);
                file.setExecutable(true);
            } else {
                System.err.println("Error al crear el directorio especificado");
                throw new IOException(); //Lanzamos una excepcion
            }
        }

        if (file.exists()) { //Si el directorio existe
            //Creamos el documento
            Document documento = new Document();
            //Creamos el OutputStream para el fichero pdf   
            FileOutputStream destino = new FileOutputStream(RUTA_CUENTAS + nombreDocumento);

            //Asociamos el FileOutputStream al Document
            PdfWriter.getInstance(documento, destino);
            //Abrimos el documento
            documento.open();

            //Aadimos el nombre del restaurante
            Font titulo = FontFactory.getFont(FontFactory.TIMES, 16, Font.BOLDITALIC);
            Chunk chunk = new Chunk(restaurante.getNombre(), titulo);
            Paragraph parrafo = new Paragraph(chunk);
            parrafo.setAlignment(Element.ALIGN_CENTER);
            documento.add(parrafo);
            //Aadimos la imagen
            String path = request.getServletContext().getRealPath("/img/elvis.png");
            Image foto = Image.getInstance(path);
            foto.scaleToFit(100, 100);
            foto.setAlignment(Chunk.ALIGN_MIDDLE);
            documento.add(foto);
            //Aadimos los datos del restaurante
            Font datos = FontFactory.getFont(FontFactory.TIMES, 12, Font.NORMAL);
            chunk = new Chunk(getText("cuenta.cif") + ": " + restaurante.getCif(), datos);
            documento.add(new Paragraph(chunk));
            chunk = new Chunk(getText("cuenta.direccion") + ": " + restaurante.getDireccion(), datos);
            documento.add(new Paragraph(chunk));
            chunk = new Chunk(getText("cuenta.telefono") + ": " + restaurante.getTelefono(), datos);
            documento.add(new Paragraph(chunk));
            //Aadimos los datos de la cuenta
            chunk = new Chunk(getText("cuenta.cuentaId") + ": " + cuenta.getId(), datos);
            documento.add(new Paragraph(chunk));
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
            chunk = new Chunk(getText("cuenta.fecha") + ": " + formatoFecha.format(cuenta.getFecha()), datos);
            documento.add(new Paragraph(chunk));
            SimpleDateFormat formtoHora = new SimpleDateFormat("HH:mm:ss");
            chunk = new Chunk(getText("cuenta.hora") + ": " + formtoHora.format(cuenta.getFecha()), datos);
            documento.add(new Paragraph(chunk));
            //Aadimos los datos del pedido
            //Obtenemos el usuario, es decir, del camarero con el nombre que tenemos registrado en la session 
            chunk = new Chunk(getText("cuenta.camarero") + ": " + session.get("usuario").toString(), datos);
            documento.add(new Paragraph(chunk));
            documento.add(new Chunk(Chunk.NEWLINE)); //Salto de linea        
            //Aadimos la tabla con los datos del pedido
            //Creamos una tabla
            PdfPTable tabla = new PdfPTable(4); //Especificamos el numero de columnas
            //Aadimos la cabecera de la tabla
            tabla.addCell(getText("cuenta.producto"));
            tabla.addCell(getText("cuenta.unidades"));
            tabla.addCell(getText("cuenta.pvp"));
            tabla.addCell(getText("cuenta.total"));
            for (Producto producto : pedido.getListaProductos()) {
                tabla.addCell(producto.getNombre());
                tabla.addCell(String.valueOf(producto.getUnidades()));
                tabla.addCell(String.valueOf(producto.getPrecio()));
                tabla.addCell(String.valueOf(producto.getPrecio() * producto.getUnidades()));

                if (producto instanceof Hamburguesa) {
                    Hamburguesa h = (Hamburguesa) producto;
                    for (Producto extra : h.getListaProductosExtra()) {
                        tabla.addCell("(E) " + extra.getNombre());
                        tabla.addCell(String.valueOf(extra.getUnidades()));
                        tabla.addCell(String.valueOf(extra.getPrecio()));
                        tabla.addCell(String.valueOf(extra.getPrecio() * extra.getUnidades()));
                    }
                }
            }
            //Aadimos la tabla al documento
            documento.add(tabla);
            documento.add(new Chunk(Chunk.NEWLINE)); //Salto de linea
            //Aadimos una tabla con los impuestos y el total a pagar
            tabla = new PdfPTable(3); //Especificamos el numero de columnas    
            tabla.addCell(getText("cuenta.baseImponible") + ": " + pedido.getImporte() + "");
            tabla.addCell("");
            tabla.addCell("");
            DecimalFormat formato = new DecimalFormat("#.##");
            for (Impuesto dato : listaImpuestos) {
                tabla.addCell("");
                tabla.addCell(dato.getNombre() + ": " + dato.getValor());
                double impuesto = (pedido.getImporte() * dato.getValor()) / 100;
                tabla.addCell(
                        getText("cuenta.impuesto") + " " + dato.getNombre() + ": " + formato.format(impuesto));
            }
            tabla.addCell(getText("cuenta.total") + ": " + cuenta.getCantidad() + "");
            tabla.addCell("");
            tabla.addCell("");
            //Aadimos la tabla al documento
            documento.add(tabla);

            //Cerramos el documento
            documento.close();

        } else { //Si el directoiro no existe
            System.err.println("OperacionesComedorAction. Error no existe el directorio especificado");
            throw new IOException(); //Lanzamos una excepcion
        }
    }

    @Override
    public void setServletRequest(HttpServletRequest hsr) {
        this.request = hsr;
    }

    @Override
    public void setServletResponse(HttpServletResponse hsr) {
        this.response = hsr;
    }

    public List<Mesa> getListaMesas() {
        return listaMesas;
    }

    public void setListaMesas(List<Mesa> listaMesas) {
        this.listaMesas = listaMesas;
    }

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public Cuenta getCuenta() {
        return cuenta;
    }

    public void setCuenta(Cuenta cuenta) {
        this.cuenta = cuenta;
    }

    public List<Impuesto> getListaImpuestos() {
        return listaImpuestos;
    }

    public void setListaImpuestos(List<Impuesto> listaImpuestos) {
        this.listaImpuestos = listaImpuestos;
    }

    public InputStream getRespuesta() {
        return respuesta;
    }

    public void setRespuesta(InputStream respuesta) {
        this.respuesta = respuesta;
    }

    public String getNombreDocumento() {
        return nombreDocumento;
    }

    public void setNombreDocumento(String nombreDocumento) {
        this.nombreDocumento = nombreDocumento;
    }
}