py.una.pol.ii.tareaweb2.ejb.VentaLogic.java Source code

Java tutorial

Introduction

Here is the source code for py.una.pol.ii.tareaweb2.ejb.VentaLogic.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 py.una.pol.ii.tareaweb2.ejb;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.ejb.EJBTransactionRolledbackException;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;

import org.hibernate.exception.ConstraintViolationException;

import py.una.pol.ii.tareaweb2.helper.FiltersHelper;
import py.una.pol.ii.tareaweb2.model.Cliente;
import py.una.pol.ii.tareaweb2.model.Producto;
import py.una.pol.ii.tareaweb2.model.Venta;
import py.una.pol.ii.tareaweb2.model.VentaDetalle;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

@Stateless
@LocalBean
public class VentaLogic {

    @PersistenceContext(unitName = "AppPersistence")
    EntityManager entityManager;

    @EJB
    ClienteLogic clienteLogic;

    @EJB
    ProductoLogic productoLogic;

    @EJB
    VentaLogic ventaLogic;

    @Resource
    private EJBContext context;

    public List<Venta> filtrar(FiltersHelper filtros) {

        return entityManager.createQuery(filtros.filterQuery(), Venta.class).setFirstResult(filtros.getPage())
                .setMaxResults(filtros.getPageSize()).getResultList();

    }

    public Long countVentas(FiltersHelper filtros) {
        return entityManager.createQuery(filtros.countQuery(), Long.class).getSingleResult();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public String create(Venta venta) throws EJBTransactionRolledbackException {

        Cliente cliente = null;
        Long montoTotal = 0L;
        String errores = "";

        if ((cliente = clienteLogic.read(venta.getCliente().getId())) == null) {
            errores = errores + "Cliente invalido. ";
        }

        venta.setCliente(cliente);

        if (venta.getDetalles() == null || venta.getDetalles().isEmpty()) {
            errores = errores + "No contiene detalles. ";
        }

        for (VentaDetalle detalle : venta.getDetalles()) {

            detalle.setVenta(venta);

            if (detalle.getCantidad() <= 0) {
                errores = errores + "Cantidad menor o igual a 0. ";
            }

            Producto producto;
            if (detalle.getProducto() == null
                    || (producto = entityManager.find(Producto.class, detalle.getProducto().getId())) == null) {
                errores = errores + "Producto invalido. ";
            } else {
                Long nuevaCantidad = producto.getCantidad() - detalle.getCantidad();
                if (nuevaCantidad < 0) {
                    errores = errores + "Saldo Insuficiente (Producto " + producto.getId() + "). ";
                }
                producto.setCantidad(producto.getCantidad() - detalle.getCantidad());
                montoTotal += (detalle.getCantidad() * producto.getPrecioUnitario());
            }

        }
        venta.setMontoTotal(montoTotal);
        entityManager.persist(venta);

        if ("".equals(errores))
            return "Venta Creada --" + venta.getId();
        return errores;

    }

    public static class ClienteNotFoundException extends Exception {

        private static final long serialVersionUID = -9154044367057213272L;

        public ClienteNotFoundException() {
        }
    }

    public Venta read(Long id) {
        return entityManager.find(Venta.class, id);
    }

    public String ventaUnica(Venta venta) {
        String errores = "";

        errores = ventaLogic.create(venta);

        if (errores.contains("Cantidad menor o igual a 0. ")) {
            try {
                entityManager.flush();

            } catch (PersistenceException e) {
                Throwable t = e.getCause();
                while ((t != null) && !(t instanceof ConstraintViolationException)) {
                    t = t.getCause();
                }
                if (t instanceof ConstraintViolationException) {
                    errores = errores + " Violacin de restriccin.";

                } else {

                    errores = errores + " Error interno.";
                }
            }

            return errores;

        } else if (!errores.contains("--")) {
            context.setRollbackOnly();
        }

        return errores;
    }

    public String cargaMasiva(String path) throws FileNotFoundException, IOException {
        FileReader fr;
        BufferedReader br;
        File f;
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd")
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
        String line;
        String erroresDetectados = "";
        path = "/tmp/" + path;
        f = new File(path);
        fr = new FileReader(f);
        br = new BufferedReader(fr);
        int contadorErrores = 0;
        int contadorLineas = 0;
        boolean error = false;
        boolean constraintError = false;
        String respuesta;

        while (br.ready()) {
            line = br.readLine();
            contadorLineas++;
            Venta toPersist = new Venta();
            Venta fromJson;
            try {
                fromJson = gson.fromJson(line, Venta.class);
                if (fromJson.getCliente() == null || fromJson.getCliente().getId() == null) {
                    erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Cliente invalido\n";
                    error = true;
                    contadorErrores++;
                }
                if (fromJson.getFecha() == null) {
                    erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Fecha nula\n";
                    error = true;
                    contadorErrores++;
                }
                if (fromJson.getMontoTotal() == null) {
                    erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Monto Total nulo\n";
                    error = true;
                    contadorErrores++;
                }
                if (fromJson.getDetalles() == null || fromJson.getDetalles().isEmpty()) {
                    erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": No contiene detalles\n";
                    error = true;
                    contadorErrores++;
                }

                toPersist.setCliente(fromJson.getCliente());
                toPersist.setDetalles(fromJson.getDetalles());
                toPersist.setFactura(fromJson.getFactura());
                toPersist.setFecha(fromJson.getFecha());
                toPersist.setMontoTotal(fromJson.getMontoTotal());
                if (!error) {
                    try {
                        if (!(respuesta = ventaLogic.create(toPersist)).contains("Venta Creada --")) {
                            if (!constraintError && respuesta.contains("Cantidad menor o igual a 0. "))
                                constraintError = true;

                            erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": " + respuesta
                                    + "\n";
                            contadorErrores++;
                        }
                    } catch (Exception e) {
                        erroresDetectados = erroresDetectados + "Lnea " + contadorLineas
                                + ": Error al intentar persistir\n";
                        contadorErrores++;

                    }
                }
            } catch (Exception e) {
                erroresDetectados = erroresDetectados + "Lnea " + contadorLineas + ": Json malformado\n";
                contadorErrores++;

            }
            error = false;
        }
        br.close();
        System.out.println("Total de lneas: " + contadorLineas);
        System.out.println("Errores detectados: " + contadorErrores);
        System.out.println("Descripcin de los errores: " + erroresDetectados);

        if (constraintError) {

            try {
                entityManager.flush();// se fuerza a que ocurra el error de restriccion

            } catch (PersistenceException e) {
                Throwable t = e.getCause();
                while ((t != null) && !(t instanceof ConstraintViolationException)) {
                    t = t.getCause();
                }
                if (t instanceof ConstraintViolationException) {
                    erroresDetectados = erroresDetectados + "\n Violacin de restriccin atrapada.";

                } else {

                    erroresDetectados = erroresDetectados + " Error interno.";
                }

                return erroresDetectados;
            }

        } else if (contadorErrores > 0) {
            context.setRollbackOnly(); //al decir que haga rollback ya no se violara el constraint de la base de datos por lo que no podra capturarse directamente.
            return erroresDetectados;
        }
        return "Carga masiva Exitosa, " + contadorLineas + " ventas cargadas";
    }

}