/* * 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 com.qsoft.erp.dominio.util; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.qsoft.dao.exception.DaoException; import com.qsoft.util.constantes.CodigoRespuesta; import com.qsoft.util.constantes.ErrorTipo; import com.qsoft.util.ms.pojo.HeaderMS; import com.qsoft.erp.constantes.DetalleCatalogoEnum; import com.qsoft.erp.constantes.DominioConstantes; import com.qsoft.erp.constantes.EntidadEnum; import com.qsoft.erp.constantes.EstadoLiquidacionEnum; import com.qsoft.erp.dao.DaoGenerico; import com.qsoft.erp.dto.DetalleLiquidacionDTO; import com.qsoft.erp.dto.DocumentoDTO; import com.qsoft.erp.dto.EstadoLiquidacionDTO; import com.qsoft.erp.dto.LiquidacionDTO; import com.qsoft.erp.model.DetalleCatalogo; import com.qsoft.erp.model.DetalleLiquidacion; import com.qsoft.erp.model.Documento; import com.qsoft.erp.model.EstadoLiquidacion; import com.qsoft.erp.model.Liquidacion; import com.qsoft.erp.model.Usuario; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.ejb.EJB; import javax.ejb.Stateless; import static com.qsoft.erp.dominio.AccionGenerica.ACTUALIZA; import static com.qsoft.erp.dominio.AccionGenerica.CONSULTA; import static com.qsoft.erp.dominio.AccionGenerica.ELIMINA; import static com.qsoft.erp.dominio.AccionGenerica.GUARDA; import static com.qsoft.erp.dominio.AccionGenerica.ACTUALIZA_ONSITE; import static com.qsoft.erp.dominio.AccionGenerica.CANCELA; import com.qsoft.erp.dominio.exception.DominioExcepcion; import com.qsoft.erp.dominio.mapper.DetalleLiquidacionMapper; import com.qsoft.erp.constantes.SecuenciaEnum; import com.qsoft.erp.dto.TarifaLiquidacionDTO; import com.qsoft.erp.model.Poliza; import com.qsoft.erp.model.TarifaLiquidacion; import java.util.HashMap; import java.util.Objects; import javax.transaction.Transactional; /** * * @author james */ @Stateless public class LiquidacionUtil { @EJB private DominioUtil dominioUtil; @EJB private LiquidacionCalc liquidacionCalcs; @EJB private NotificadorUtil notificadorUtil; @EJB private SecuenciaUtil secuenciaUtil; @EJB private CatalogoUtil catalogoUtil; @PostConstruct public void postConstruct() { } /** * * @param header * @param datos * @return * @throws DominioExcepcion */ @Transactional(Transactional.TxType.REQUIRES_NEW) public List guardarLiquidacion(HeaderMS header, Map datos) throws DominioExcepcion { List data = new ArrayList<>(); DaoGenerico daoliq = new DaoGenerico<>(Liquidacion.class); DaoGenerico daousu = new DaoGenerico<>(Usuario.class); DaoGenerico daopol = new DaoGenerico<>(Poliza.class); for (Map.Entry entry : datos.entrySet()) { try { Liquidacion liq; System.out.println("==============> GUARDAR LIQUIDACION....."); liq = (Liquidacion) this.dominioUtil.getEntidad(EntidadEnum.Liquidacion.getMapper(), entry.getValue()); long cod = this.secuenciaUtil.getSecuencia(SecuenciaEnum.LIQMED); liq.setLiqNemonico(this.dominioUtil.getCodLiquidacion(cod)); Poliza pol = daopol.cargar(entry.getValue().getPolCodigo()); liq.setPolCodigo(pol); liq.setLiqFechaRegistro(new Date()); liq.setDocumentoCollection(this.crearDocumentos(liq, entry.getValue())); liq.setEstadoLiquidacionCollection(new ArrayList<>()); Usuario usuario = EstadoLiquidacionEnum.ESTLI.getUsuarioGenerico(); liq.getEstadoLiquidacionCollection().add(this.crearEstadoInicial(liq, usuario)); daoliq.guardar(liq); Usuario user = new Usuario(); user.setUsuUsuario(header.getUsuario()); user.setUsuEstado(DominioConstantes.ACTIVO); user = daousu.buscarUnico(user); this.notificadorUtil.notificarLiquidacion(user, liq); data.add(liq); } catch (DaoException ex) { throw new DominioExcepcion(ErrorTipo.FATAL, CodigoRespuesta.CODIGO_VALOR_NULO, "Error registrando liquidacion en BDD " + ex); } } return data; } /** * * @param header * @param datos * @param tipoAccion * @return * @throws DominioExcepcion */ @Transactional(Transactional.TxType.REQUIRES_NEW) public List actualizarLiquidacion(HeaderMS header, Map datos, int tipoAccion) throws DominioExcepcion { List data = new ArrayList<>(); DaoGenerico daoliq = new DaoGenerico<>(Liquidacion.class); for (Map.Entry entry : datos.entrySet()) { LiquidacionDTO liquidacion = entry.getValue(); Liquidacion liq = null; //TODO: aqui puede ser consulta por CONTRATO liq = daoliq.buscar(liquidacion.getLiqCodigo()); if (liq != null) { try { boolean saltoFlujo = false; EstadoLiquidacion estado = null; liq.getDocumentoCollection().addAll(this.crearDocumentos(liq, liquidacion)); if (tipoAccion != ACTUALIZA_ONSITE) { EstadoLiquidacion previo = null; for (EstadoLiquidacion es : liq.getEstadoLiquidacionCollection()) { if (Objects.equals(DominioConstantes.ACTIVO, es.getEslEstado())) { es.setEslEstado(DominioConstantes.INACTIVO); es.setEslFechaFin(new Date()); previo = es; } } if (liquidacion.getEstados() != null && !liquidacion.getEstados().isEmpty()) { System.out.println("=====> ATENCION? " + liq.getDetAtencion() + " => " + liquidacion.getDetAtencion()); Integer codAt = liq.getDetAtencion() != null && liq.getDetAtencion().getDetCodigo() != null ? liq.getDetAtencion().getDetCodigo() : liquidacion.getDetAtencion(); DetalleCatalogo atencion = this.catalogoUtil.cargar(codAt); saltoFlujo = atencion != null && atencion.getDetNemonico().equals(DetalleCatalogoEnum.ATHE.name()) || atencion != null && atencion.getDetNemonico().equals(DetalleCatalogoEnum.ATAH.name()) || atencion != null && atencion.getDetNemonico().equals(DetalleCatalogoEnum.ATHOS.name()); for (EstadoLiquidacionDTO es : liquidacion.getEstados()) { estado = this.crearEstado(liq, es, previo, saltoFlujo, tipoAccion); liq.getEstadoLiquidacionCollection().add(estado); } } } daoliq.actualizar(liq); if (estado != null && estado.getDetEstado().getDetNemonico().equalsIgnoreCase(EstadoLiquidacionEnum.ESTLIC.name()) && liq.getDetTipo().getDetNemonico().equalsIgnoreCase(DetalleCatalogoEnum.TIPLQPR.name()) && !saltoFlujo && tipoAccion == GUARDA) { System.out.println("PROCESAR LIQUIDACION PRESTADOR ESTLIC"); liq = this.liquidacionCalcs.procesarLiquidacion(liq, true); } if (estado != null && estado.getDetEstado().getDetNemonico().equalsIgnoreCase(EstadoLiquidacionEnum.ESTLQC.name()) && liq.getDetTipo().getDetNemonico().equalsIgnoreCase(DetalleCatalogoEnum.TIPLQPR.name()) && saltoFlujo && tipoAccion == GUARDA) { System.out.println("PROCESAR LIQUIDACION PRESTADOR ESTLQC"); liq = this.liquidacionCalcs.procesarLiquidacion(liq, false); } if (estado != null && estado.getDetEstado().getDetNemonico().equalsIgnoreCase(EstadoLiquidacionEnum.ESTLQC.name()) && !liq.getDetTipo().getDetNemonico().equalsIgnoreCase(DetalleCatalogoEnum.TIPLQPR.name()) && tipoAccion == GUARDA) { System.out.println("PROCESAR LIQUIDACION NO PRESTADOR ESTLQC"); liq = this.liquidacionCalcs.procesarLiquidacion(liq, false); } Usuario user = this.dominioUtil.getTitularLiquidacion(liq.getLiqCodigo()); if (tipoAccion != ACTUALIZA_ONSITE && estado != null) { this.notificadorUtil.notificarEstadoLiquidacion(liq, user, estado); } data.add(liq); } catch (DaoException ex) { throw new DominioExcepcion(ErrorTipo.FATAL, CodigoRespuesta.CODIGO_ERROR_GUARDA_BDD, "ERROR, " + ex); } } else { throw new DominioExcepcion(ErrorTipo.ERROR, CodigoRespuesta.CODIGO_VALOR_NULO, "ERROR, No existe la liquidacion con el codigo " + liquidacion.getLiqCodigo()); } } return data; } /** * @param header * @param entidades * @param tipoAccion * @return * @throws com.qsoft.erp.dominio.exception.DominioExcepcion */ @Transactional(Transactional.TxType.REQUIRES_NEW) public List procesarDetalleLiquidacion(HeaderMS header, List> entidades, int tipoAccion) throws DominioExcepcion { List data = new ArrayList<>(); for (Map ent : entidades) { DetalleLiquidacionDTO detalle = (DetalleLiquidacionDTO) dominioUtil.crearObjeto(DetalleLiquidacionDTO.class, ent); List lista = new ArrayList<>(); ObjectMapper maper = new ObjectMapper(); maper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); if (ent.containsKey("detalle")) { for (Object row : (List) ent.get("detalle")) { TarifaLiquidacionDTO col = (TarifaLiquidacionDTO) dominioUtil.crearObjeto(TarifaLiquidacionDTO.class, (Map) row); lista.add(col); } } detalle.setDetalle(lista); DetalleLiquidacion result = crudDetalle(detalle, tipoAccion); data.add(result); } return data; } /** * * @param detalle * @param tipoAccion * @return * @throws DominioExcepcion */ @Transactional(Transactional.TxType.REQUIRES_NEW) private DetalleLiquidacion crudDetalle(DetalleLiquidacionDTO detalle, int tipoAccion) throws DominioExcepcion { DaoGenerico daodel = new DaoGenerico<>(DetalleLiquidacion.class); DetalleLiquidacion result; result = DetalleLiquidacionMapper.INSTANCE.getEntidad(detalle); result.setTarifaLiquidacionCollection(this.crearTarifas(detalle, result)); switch (tipoAccion) { case CONSULTA: { throw new DominioExcepcion(ErrorTipo.ERROR, CodigoRespuesta.CODIGO_ERROR_GENERICO, "Operacion CONSULTA no soportada para el controlador de Accion"); } case GUARDA: { try { daodel.guardar(result); } catch (DaoException ex) { throw new DominioExcepcion(ErrorTipo.FATAL, CodigoRespuesta.CODIGO_ERROR_GUARDA_BDD, ex.toString()); } } break; case ACTUALIZA: { try { DaoGenerico daotar = new DaoGenerico<>(TarifaLiquidacion.class); for (TarifaLiquidacion tar : result.getTarifaLiquidacionCollection()) { daotar.actualizar(tar); } result = daodel.actualizar(result); } catch (DaoException ex) { throw new DominioExcepcion(ErrorTipo.FATAL, CodigoRespuesta.CODIGO_ERROR_ACTUALIZA_BDD, ex.toString()); } } break; case ELIMINA: { throw new DominioExcepcion(ErrorTipo.ERROR, CodigoRespuesta.CODIGO_ERROR_GENERICO, "Operacion ELIMINACION aun no permitida, debe eliminar la Liquidacion"); } } return result; } /** * * @return */ private EstadoLiquidacion crearEstadoInicial(Liquidacion liquidacion, Usuario usuario) throws DaoException { EstadoLiquidacion est = new EstadoLiquidacion(); est.setDetEstado(EstadoLiquidacionEnum.ESTLI.getDetalle()); est.setEslEstado(DominioConstantes.ACTIVO); est.setEslFechaInicio(new Date()); est.setEslMensaje(DominioConstantes.MENSAJE_AUTO); est.setLiqCodigo(liquidacion); est.setUsuCodigo(usuario); return est; } /** * * @param liquida * @param liquidacion * @throws DaoException */ private EstadoLiquidacion crearEstado(Liquidacion liquida, EstadoLiquidacionDTO estadoDto, EstadoLiquidacion previo, boolean saltoFlujo, int tipoAccion) throws DaoException { EstadoLiquidacion estado = new EstadoLiquidacion(); DetalleCatalogo est = new DetalleCatalogo(); if (tipoAccion == GUARDA) { //TODO: Avanza estado if (liquida.getDetTipo().getDetNemonico().equalsIgnoreCase(DetalleCatalogoEnum.TIPLQPR.name()) && previo.getDetEstado().getDetNemonico().equals(EstadoLiquidacionEnum.ESTLI.name()) && !saltoFlujo) { est = EstadoLiquidacionEnum.ESTLIC.getDetalle(); } else { est = EstadoLiquidacionEnum.getSiguiente(previo.getDetEstado().getDetCodigo(), true); } } else if (tipoAccion == ACTUALIZA) {//TODO: Retroceder estado, siempre retrocede al usuario previo if (liquida.getDetTipo().getDetNemonico().equalsIgnoreCase(DetalleCatalogoEnum.TIPLQPR.name()) && previo.getDetEstado().getDetNemonico().equals(EstadoLiquidacionEnum.ESTLIC.name()) && !saltoFlujo) { est = EstadoLiquidacionEnum.ESTLI.getDetalle(); } else { est = EstadoLiquidacionEnum.getSiguiente(previo.getDetEstado().getDetCodigo(), false); } if (est != null && est.getDetNemonico().equalsIgnoreCase(EstadoLiquidacionEnum.ESTALI.name())) { estado.setUsuCodigo(this.dominioUtil.getTitularLiquidacion(liquida.getLiqCodigo())); } } else if (tipoAccion == CANCELA) { est = EstadoLiquidacionEnum.ESTCAN.getDetalle(); estado.setUsuCodigo(previo.getUsuCodigo()); } else { throw new DaoException("Especificar si desea avanzar o retroceder de estado"); } for (EstadoLiquidacion esli : liquida.getEstadoLiquidacionCollection()) { if (esli.getDetEstado().getDetNemonico().equals(est.getDetNemonico())) { estado.setUsuCodigo(esli.getUsuCodigo()); } } if (estado.getUsuCodigo() == null || estado.getUsuCodigo().getUsuCodigo() == null) { EstadoLiquidacionEnum enu = EstadoLiquidacionEnum.valueOf(est.getDetNemonico()); System.out.println("No hay usuario, vamos a obtener el generico " + enu); estado.setUsuCodigo(enu.getUsuarioGenerico()); } estado.setDetEstado(est); estado.setEslFechaInicio(new Date()); estado.setEslEstado(DominioConstantes.ACTIVO); estado.setEslMensaje(estadoDto.getEslMensaje()); estado.setLiqCodigo(liquida); return estado; } public HashMap obtenerTodosDocumentosLiquidacion(Integer liqCodigo) throws DaoException, DominioExcepcion{ DaoGenerico daoliq = new DaoGenerico<>(Liquidacion.class); DaoGenerico daodoc = new DaoGenerico<>(Documento.class); HashMap result = new HashMap<>(); Liquidacion liquidacion = daoliq.buscarUnico(new Liquidacion(liqCodigo)); //List result = new ArrayList<>(); if(liquidacion == null){ throw new DominioExcepcion(ErrorTipo.ERROR, CodigoRespuesta.CODIGO_ERROR_CONSULTA_BDD, "No se encontro la liquidacion para el codigo enviado"); } Documento documentoPlantilla = new Documento(); documentoPlantilla.setDocEstado(DominioConstantes.ACTIVO); documentoPlantilla.setLiqCodigo(liquidacion); List lstDocumentos = daodoc.buscarLista(documentoPlantilla); if(lstDocumentos == null || lstDocumentos.isEmpty()){ throw new DominioExcepcion(ErrorTipo.ERROR, CodigoRespuesta.CODIGO_ERROR_CONSULTA_BDD, String.format("No se ha encontrado documentos para la liquidacion %s", liquidacion.getLiqNemonico())); } File archivoZip = procesarZipLiquidacion(liquidacion, lstDocumentos); result.put("nombre",archivoZip.getName()); result.put("documento",dominioUtil.getArchivo(archivoZip.getAbsolutePath())); archivoZip.delete(); return result; } private File procesarZipLiquidacion(Liquidacion liquidacion, List lstDocumentos){ String url = DetalleCatalogoEnum.URLLIQ.getDetalle().getDetOrigen(); Documento primero = lstDocumentos.get(0); String nemonico = liquidacion.getLiqNemonico(); String urlTmp = String.format("tmp", nemonico); String folderPrimero = primero.getDocUrl(); String folderAnio[] = folderPrimero.split("/".concat(primero.getDocNombre())); String folderArchivoPosible = folderAnio[0]; File zip = dominioUtil.crearZip(folderArchivoPosible, liquidacion.getLiqNemonico().concat(".zip"), true); // /data/wmp/liquidacion/2020/LQ0000000080/img076.pdf return zip; } /** * * @param liquidacion */ private List crearDocumentos(Liquidacion liquida, LiquidacionDTO liquidacion) throws DaoException { List documentos = new ArrayList<>(); if (liquidacion.getDocumentos() != null) { for (DocumentoDTO doc : liquidacion.getDocumentos()) { Documento dcto = (Documento) dominioUtil.getEntidad(EntidadEnum.Documento.getMapper(), doc); dcto.setDetTipo(DetalleCatalogoEnum.HABIL.getDetalle()); dcto.setDocEstado(DominioConstantes.ACTIVO); dcto.setLiqCodigo(liquida); dcto.setPolCodigo(liquida.getPolCodigo()); String url = this.grabaDocumento(doc, liquida.getLiqNemonico()); dcto.setDocUrl(url); documentos.add(dcto); } } return documentos; } /** * * @param doc * @param contrato * @param liquidacion * @return */ private String grabaDocumento(DocumentoDTO doc, String liquidacion) { String url = DetalleCatalogoEnum.URLLIQ.getDetalle().getDetOrigen(); int year = Calendar.getInstance().get(Calendar.YEAR); url = String.format(url, "" + year, liquidacion); File file = new File(url); try { file.mkdirs(); url = url.concat(doc.getDocNombre()); FileOutputStream writer; writer = new FileOutputStream(new File(url)); writer.write(doc.getData()); writer.close(); } catch (IOException | NullPointerException ex) { url = null; } return url; } /** * * @param detalleDTO * @return * @throws DaoException */ private List crearTarifas(DetalleLiquidacionDTO detalleDTO, DetalleLiquidacion detalle) { List data = new ArrayList<>(); for (TarifaLiquidacionDTO tarDto : detalleDTO.getDetalle()) { TarifaLiquidacion tarifa = (TarifaLiquidacion) dominioUtil.getEntidad(EntidadEnum.TarifaLiquidacion.getMapper(), tarDto); tarifa.setDelCodigo(detalle); data.add(tarifa); } System.out.println("=========> TARIFAS " + data); return data; } }