Java tutorial
/* * 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); } }