com.dominion.salud.pedicom.negocio.service.impl.PedidosExtServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.dominion.salud.pedicom.negocio.service.impl.PedidosExtServiceImpl.java

Source

/*
 * Copyright (C) 2016 Dominion Global
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.dominion.salud.pedicom.negocio.service.impl;

import com.dominion.salud.pedicom.negocio.configuration.RoutingDataSource;
import com.dominion.salud.pedicom.negocio.entities.BuzonErrores;
import com.dominion.salud.pedicom.negocio.entities.Pedidos;
import com.dominion.salud.pedicom.negocio.entities.PedidosExt;
import com.dominion.salud.pedicom.negocio.repositories.BuzonErroresRepository;
import com.dominion.salud.pedicom.negocio.service.PedidosExtService;
import com.dominion.salud.pedicom.negocio.tools.MAILService;
import com.dominion.salud.pedicom.negocio.tools.PDFService;
import java.io.ByteArrayInputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.transaction.Transactional;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 *
 * @author jcgonzalez
 */
@Service("pedidosExtService")
public class PedidosExtServiceImpl extends PedidosServiceImpl implements PedidosExtService {

    private static final Logger logger = LoggerFactory.getLogger(PedidosExtServiceImpl.class);

    @Autowired
    private BuzonErroresRepository buzonErroresRepository;

    @Autowired
    private PDFService pdfService;

    @Autowired
    private MAILService mailService;

    @Autowired
    private RoutingDataSource routingDataSource;

    @Override
    public List<PedidosExt> findExt(Pedidos ped) {

        List<Pedidos> peds = pedidosRepository.findTransNCentro(ped);
        List<PedidosExt> list = new ArrayList<>();

        for (Pedidos ped2 : peds) {
            list.add(new PedidosExt(ped2));
        }
        for (PedidosExt pedExt : list) {
            if (pedExt.getTransferido().equals("R")) {
                BuzonErrores buz = new BuzonErrores();
                buz.setModelo("99");
                buz.setTipo("99");
                buz.setParametros(pedExt.getCentros().getLinea() + "|" + pedExt.getPedidosPK().getNumPedido());
                try {
                    BuzonErrores be = buzonErroresRepository.findOneBuzonParams(buz);
                    pedExt.setMensaje(be.getMensaje());
                } catch (Exception e) {
                    pedExt.setMensaje("No hay descripcin para el error");
                    logger.debug(e.toString());
                }
            }
        }
        return list;
    }

    @Override
    public void emailDaemon() {
        List<Pedidos> listPedidos = findTransN();
        if (listPedidos != null && !listPedidos.isEmpty()) {
            logger.debug("     Numero de pedidos encontrados: " + listPedidos.size());
            for (Pedidos ped : listPedidos) {
                marcaTransferencia(ped);
            }
            sendByMailByPDF(listPedidos);
            logger.debug("ENVIO DE PEDIDOS AUTOMATIZADO FINALIZADO");
        } else {
            logger.debug("     No se han encontrado pedidos para enviar");
        }
    }

    @Transactional
    private void errorPedido(List<Pedidos> listPedsProveedor, Exception e) {
        try {
            for (Pedidos ped : listPedsProveedor) {
                BuzonErrores buz = new BuzonErrores();
                buz.setParametros(ped.getCentros().getLinea() + "|" + ped.getPedidosPK().getNumPedido());
                buz.setModelo("99");
                buz.setTipo("99");
                if (StringUtils.isBlank(e.getMessage())) {
                    buz.setMensaje(e.toString());
                } else {
                    buz.setMensaje(e.getMessage());
                }
                buz.setNivel(new Long(0));
                buzonErroresService.insertarBuzonErrores(buz);
                errorPedido(ped);
            }
        } catch (Exception ex) {
            logger.error(ex.toString());
        }
    }

    @Override
    public void sendByMailByPDF(List<Pedidos> listPedidos) {
        Connection con = null;
        try {
            con = routingDataSource.getConnection();
            logger.debug("     Conexion obtenida de bd con username " + con.getMetaData().getUserName());
            logger.debug("     Agrupando pedidos: " + listPedidos.size());
            Map<Integer, List<Pedidos>> map = sortPedidos(listPedidos);
            logger.debug("     Pedidos correctamente agrupados: " + map.size());
            Iterator<Integer> itMap = map.keySet().iterator();
            while (itMap.hasNext()) {
                Integer key = itMap.next();
                List<Pedidos> listPedsProveedor = new ArrayList<>();
                try {
                    listPedsProveedor = map.get(key);
                    prepararYenviarEmail(listPedsProveedor, con);
                } catch (Exception e) {
                    logger.error("     Error", e);
                    logger.error(e.toString());
                    logger.debug("     Actualizando pedidos a error");
                    errorPedido(listPedsProveedor, e);
                }
            }
            logger.debug("ENVIOS FINALIZADOS");
        } catch (SQLException ex) {
            logger.error("     Error", ex);
        } finally {
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException ex) {
                logger.error("Error :" + ex.getMessage());
            }
        }
    }

    /**
     * separa los pedidos por centro y proveedores
     *
     * @param peds un Pedido
     * @return un mapa con los pedidos separados por centro y proveedor
     */
    private Map<Integer, List<Pedidos>> sortPedidos(List<Pedidos> peds) {
        logger.debug("          Iniciando la separacion de pedidos por centro y proveedor");
        Map<Integer, List<Pedidos>> map = new HashMap<>();
        Integer key = -1;
        Integer temp1 = 0;
        String temp2 = "";
        for (Pedidos ped : peds) {
            if (ped.getCentros().getLinea() == temp1 && ped.getProveedor().getCodigo().equals(temp2)) {
                List<Pedidos> list = map.get(key);
                list.add(ped);
            } else {
                key++;
                List<Pedidos> list = new ArrayList<>();
                list.add(ped);
                map.put(key, list);
            }
            temp1 = ped.getCentros().getLinea();
            temp2 = ped.getProveedor().getCodigo();
        }
        logger.debug("          Finalizando la separacion de pedidos");
        return map;
    }

    private Map<Integer, List<Pedidos>> sortProveedor(List<Pedidos> peds) {
        logger.debug("          Iniciando la separacion de pedidos por centro y proveedor");
        Map<Integer, List<Pedidos>> map = new HashMap<>();
        Integer key = -1;
        Integer temp1 = 0;
        String temp2 = "";
        for (Pedidos ped : peds) {
            if (ped.getCentros().getLinea() == temp1 && ped.getProveedor().getCodigo().equals(temp2)) {
                List<Pedidos> list = map.get(key);
                list.add(ped);
            } else {
                key++;
                List<Pedidos> list = new ArrayList<>();
                list.add(ped);
                map.put(key, list);
            }
            temp1 = ped.getCentros().getLinea();
            temp2 = ped.getProveedor().getCodigo();
        }
        logger.debug("          Finalizando la separacion de pedidos");
        return map;
    }

    /**
     * envia pedidos a un proveedor y marca como transferidos los pedidos en
     * cuestion
     *
     * @param listPedsProveedor
     * @param con
     * @throws Exception
     */
    private void prepararYenviarEmail(List<Pedidos> listPedsProveedor, Connection con) throws Exception {
        logger.debug("     Generando PDF para adjuntar");
        ByteArrayInputStream in = pdfService.crearPDF(listPedsProveedor, con);
        logger.debug("     PDF para adjuntar generado correctamente");

        logger.debug("     Enviando correo al proveedor : (" + listPedsProveedor.get(0).getProveedor().getCodigo()
                + ") " + listPedsProveedor.get(0).getProveedor().getNombre());
        mailService.sendByMail(listPedsProveedor.get(0).getProveedor().getEMail(), in,
                listPedsProveedor.get(0).getCentros().getNombreCentro());
        logger.debug("     Correo enviado correctamente");

        logger.debug("     Actualizando pedidos a TRANSFERIDO");
        for (Pedidos ped : listPedsProveedor) {
            transferirPedido(ped);
        }
        logger.debug("     Actualizacion realiza correctamente");
    }

    @Override
    public void reenviarPedido(Pedidos[] ped) {
        logger.debug("Evio manual pedidos");
        List<Pedidos> peds = new ArrayList<>();
        Pedidos pedB = null;
        logger.debug("  Llegan " + ped.length + " pedidos a enviar, comprobando que se pueden enviar");
        for (Pedidos pedA : ped) {
            pedB = pedidosRepository.findOnePedido(pedA);
            if (!pedB.getTransferido().equals("T") && (!(pedB.getTransferido().equals("S")))) {
                peds.add(pedB);
            }
            if ((pedB.getEstado().equals("S") && pedB.getTransferido().equals("R"))) {
                try {
                    procesarReenvioErroneo(pedB);
                } catch (Exception e) {
                    logger.debug("  Fallo buzon errores" + e.toString());
                }
            }
        }

        logger.debug("  Se van a enviar " + peds.size());
        if (!peds.isEmpty()) {
            Collections.sort(peds, new Comparator<Pedidos>() {
                @Override
                public int compare(Pedidos ped2, Pedidos ped1) {
                    return ped1.getProveedor().getCodigo().compareTo(ped2.getProveedor().getCodigo());
                }
            });
            sendByMailByPDF(peds);
        }
    }

    private void procesarReenvioErroneo(Pedidos ped) {
        BuzonErrores buzonErrores = new BuzonErrores();
        buzonErrores.setTipo("99");
        buzonErrores.setModelo("99");
        buzonErrores.setParametros(ped.getPedidosPK().getCodCentro() + "|" + ped.getPedidosPK().getNumPedido());
        buzonErroresService.procesarBuzonErroresParams(buzonErrores);
    }

}