Java tutorial
/* InvestmentUpdater.java * * Copyright (C) 2012 * * This file is part of project ohiggins-core * * This software 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 2 of the License, or * (at your option) any later version. * * This software 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. * * Authors:: Juan Luis Rodrguez Ponce (mailto:jlrodriguez@emergya.com) */ package com.emergya.siradmin.invest; import java.math.BigInteger; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.xml.rpc.ServiceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.geotools.geometry.GeometryBuilder; import org.geotools.geometry.jts.JTS; import org.geotools.geometry.jts.JTSFactoryFinder; import org.geotools.referencing.CRS; import org.geotools.referencing.operation.builder.MathTransformBuilder; import org.opengis.geometry.MismatchedDimensionException; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.emergya.ohiggins.dto.ChileindicaInversionDataDto; import com.emergya.ohiggins.dto.ChileindicaInversionFinanciamientoDataDto; import com.emergya.ohiggins.dto.ChileindicaRelacionIntrumentosDataDto; import com.emergya.ohiggins.model.ChileindicaInversionDataEntity.UpdateStatus; import com.emergya.ohiggins.service.ChileindicaInversionDataService; import com.emergya.siradmin.invest.client.investmentdata.ConsultaInversionPorLlaveGeorefResponse; import com.emergya.siradmin.invest.client.investmentdata.InversionData; import com.emergya.siradmin.invest.client.investmentdata.InversionFinanciamientoData; import com.emergya.siradmin.invest.client.investmentdata.InversionGeorefCoordenadasData; import com.emergya.siradmin.invest.client.investmentdata.InversionGeorefData; import com.emergya.siradmin.invest.client.investmentdata.RelacionInstrumentosData; import com.emergya.siradmin.invest.client.investmentdata.WSConsultaInversionPorLlaveGeoref; import com.emergya.siradmin.invest.client.keyquery.ConsultaLlavesResponse; import com.emergya.siradmin.invest.client.keyquery.LlavesInversionData; import com.emergya.siradmin.invest.client.keyquery.Respuesta; import com.emergya.siradmin.invest.client.keyquery.WSConsultaLlaves; import com.emergya.siradmin.invest.util.LlaveBean; import com.emergya.siradmin.invest.util.WSCallException; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.Point; @Service public class InvestmentUpdater { private enum GeometryType { PUNTO, LINEA } private static final Log LOGGER = LogFactory.getLog(InvestmentUpdater.class); @Autowired private WSConsultaLlaves wsConsultaLlaves; @Autowired private WSConsultaInversionPorLlaveGeoref wsConsultaInversion; @Autowired private ChileindicaInversionDataService service; public List<LlaveBean> getExistingKeysInChileindica(Integer ano, Integer codigoRegion) { LOGGER.info("Obteniendo llaves para del ao " + ano + " y la regin " + codigoRegion); try { List<LlaveBean> keys = null; ConsultaLlavesResponse response = wsConsultaLlaves.getWSConsultaLlavesPort().WSConsultaLlaves( BigInteger.valueOf(ano.longValue()), BigInteger.valueOf(codigoRegion.longValue())); Respuesta respuesta = response.getRespuesta(); if (!BigInteger.ZERO.equals(respuesta.getCodigoRespuesta())) { LOGGER.error( "El servicio web Consulta de llaves " + wsConsultaLlaves.getWSConsultaLlavesPortAddress() + " ha devuelto un cdigo de error " + respuesta.getCodigoRespuesta() + ". El mensaje de error fue: " + respuesta.getTextoRespuesta()); throw new WSCallException(respuesta.getCodigoRespuesta(), respuesta.getTextoRespuesta()); } if (response.getLlavesInversion() != null) { keys = new ArrayList<LlaveBean>(response.getLlavesInversion().length); for (LlavesInversionData projectKey : response.getLlavesInversion()) { LlaveBean key = new LlaveBean(); key.setAno(projectKey.getAno().intValue()); key.setRegion(codigoRegion); key.setcFicha(projectKey.getC_Ficha().intValue()); key.setcInstitucion(projectKey.getC_Institucion().intValue()); key.setcPreinversion(projectKey.getC_Preinversion().intValue()); BigInteger fechaRegistro = projectKey.getFechaRegistro(); if (fechaRegistro != null) { key.setFechaRegistro(fechaRegistro.intValue()); } boolean updatable = service.checkIfProjectMustBeUpdated(key.getRegion(), key.getAno(), key.getcInstitucion(), key.getcPreinversion(), key.getcFicha(), key.getFechaRegistro()); key.setUpdatable(updatable); keys.add(key); } return keys; } else { if (LOGGER.isInfoEnabled()) { LOGGER.info("El WS de consulta de llaves no ha devuelto datos para el ao " + ano + " y la regin " + codigoRegion); } return new ArrayList<LlaveBean>(); } } catch (RemoteException e) { LOGGER.error("Error llamando al servicio web " + wsConsultaLlaves.getWSConsultaLlavesPortAddress(), e); throw new WSCallException(e); } catch (ServiceException e) { LOGGER.error("Error llamando al servicio web " + wsConsultaLlaves.getWSConsultaLlavesPortAddress(), e); throw new WSCallException(e); } } public void getWsDataAndUpdateDB(List<LlaveBean> wsProjectList) { // 1. Get an iterator of all Chileindica // 2. Traverse the list of LlaveBean // 3. For every LlaveBean mark database element as no removable // 4. If llaveBean is Updatable, create or update element in DataBase. // 5. If there is any problem cheking with the web service, mark the // element as update error. List<Long> projectDbIds = service.getAllProjectDbIds(); Collections.sort(wsProjectList); for (Iterator<Long> iterator = projectDbIds.iterator(); iterator.hasNext();) { Long dbId = iterator.next(); ChileindicaInversionDataDto dto = (ChileindicaInversionDataDto) service.getById(dbId); LlaveBean keyToSearch = new LlaveBean(); keyToSearch.setAno(dto.getAno()); keyToSearch.setRegion(dto.getRegion()); keyToSearch.setcFicha(dto.getCFicha()); keyToSearch.setcInstitucion(dto.getCInstitucion()); keyToSearch.setcPreinversion(dto.getCPreinversion()); if (LOGGER.isInfoEnabled()) { LOGGER.info("Tratando proyecto existente BBDD " + keyToSearch); } // Buscamos si el proyecto existe entre las claves actuales int foundKeyIndex = Collections.binarySearch(wsProjectList, keyToSearch); if (foundKeyIndex >= 0) { LlaveBean foundKey = wsProjectList.get(foundKeyIndex); iterator.remove(); wsProjectList.remove(foundKeyIndex); if (LOGGER.isInfoEnabled()) { LOGGER.info("El proyecto sigue existiendo en el servicio web de consulta de llaves"); } // Si el proyecto ha sido actualizado en Chileindica recuperamos // los detalles del servicio web, borramos el proyecto original // de // la base de datos y creamos una entrada nueva en BD if (foundKey.isUpdatable()) { try { ConsultaInversionPorLlaveGeorefResponse response = this.wsConsultaInversion .getWSConsultaInversionPorLlaveGeorefPort() .WSConsultaInversionPorLlaveGeoref(BigInteger.valueOf(foundKey.getRegion()), BigInteger.valueOf(foundKey.getAno()), BigInteger.valueOf(foundKey.getcInstitucion()), BigInteger.valueOf(foundKey.getcPreinversion()), BigInteger.valueOf(foundKey.getcFicha())); com.emergya.siradmin.invest.client.investmentdata.Respuesta respuesta = response .getRespuesta(); BigInteger codRespuesta = respuesta.getCodigoRespuesta(); if (BigInteger.ZERO.equals(codRespuesta)) { // delete from DB and create new instance service.delete(dto); ChileindicaInversionDataDto updatedProject = createDtoFromWsResponse(response, foundKey); service.create(updatedProject); foundKey.setStatus(UpdateStatus.OK); if (LOGGER.isInfoEnabled()) { LOGGER.info("Proyecto en BBDD actualizado"); } } else { if (LOGGER.isInfoEnabled()) { LOGGER.info("Error obteniendo informacin del proyecto " + foundKey + ". Cdigo de repuesta = " + codRespuesta + ". Mensaje = " + respuesta.getTextoRespuesta()); } // Guardamos el proyecto en BBDD con estado error dto.setUpdateStatus(UpdateStatus.WS_ERROR); dto.setLastUpdateTry(Calendar.getInstance().getTime()); foundKey.setStatus(UpdateStatus.WS_ERROR); service.update(dto); } } catch (DataAccessException e) { if (LOGGER.isErrorEnabled()) { LOGGER.error("Error almacenando proyecto " + foundKey + " en base de datos", e); } foundKey.setStatus(UpdateStatus.DB_ERROR); } catch (RemoteException e) { // Guardamos el proyecto en BBDD con estado error dto.setUpdateStatus(UpdateStatus.WS_ERROR); dto.setLastUpdateTry(Calendar.getInstance().getTime()); service.update(dto); foundKey.setStatus(UpdateStatus.WS_ERROR); } catch (ServiceException e) { // Guardamos el proyecto en BBDD con estado error dto.setUpdateStatus(UpdateStatus.WS_ERROR); dto.setLastUpdateTry(Calendar.getInstance().getTime()); service.update(dto); foundKey.setStatus(UpdateStatus.WS_ERROR); } catch (Throwable e) { dto.setUpdateStatus(UpdateStatus.WS_ERROR); dto.setLastUpdateTry(Calendar.getInstance().getTime()); service.update(dto); foundKey.setStatus(UpdateStatus.WS_ERROR); } } else { if (LOGGER.isInfoEnabled()) { LOGGER.info("El proyecto no necesita ser actualizado en BBDD"); } } } else { // si el proyecto no ha sido devuleto por el WS Consulta de // llaves, se borra de la base de datos service.delete(dto); if (LOGGER.isInfoEnabled()) { LOGGER.info("Se elimina el proyecto por no existir en la consulta de llaves " + keyToSearch); } } } // En este punto los elementos que quedan en projectDbIds pueden ser // eliminados de la base de datos puesto que no han sido devueltos por // el servicio web de consulta de llaves // for (Long id : projectDbIds) { // service.deleteById(id); // } // Ahora se crean los proyectos que queden en la lista de llaves // devueltas // por el servicio web. for (LlaveBean llave : wsProjectList) { ConsultaInversionPorLlaveGeorefResponse response; try { response = this.wsConsultaInversion.getWSConsultaInversionPorLlaveGeorefPort() .WSConsultaInversionPorLlaveGeoref(BigInteger.valueOf(llave.getRegion()), BigInteger.valueOf(llave.getAno()), BigInteger.valueOf(llave.getcInstitucion()), BigInteger.valueOf(llave.getcPreinversion()), BigInteger.valueOf(llave.getcFicha())); com.emergya.siradmin.invest.client.investmentdata.Respuesta respuesta = response.getRespuesta(); BigInteger codRespuesta = respuesta.getCodigoRespuesta(); if (BigInteger.ZERO.equals(codRespuesta)) { ChileindicaInversionDataDto newProject = createDtoFromWsResponse(response, llave); service.create(newProject); llave.setStatus(UpdateStatus.OK); if (LOGGER.isInfoEnabled()) { LOGGER.info("Creada nueva entrada en BBDD"); } } else { if (LOGGER.isErrorEnabled()) { LOGGER.error( "Error obteniendo informacin del proyecto " + llave + ". Cdigo de repuesta = " + codRespuesta + ". Mensaje = " + respuesta.getTextoRespuesta()); } llave.setStatus(UpdateStatus.WS_ERROR); } } catch (DataAccessException e) { if (LOGGER.isErrorEnabled()) { LOGGER.error("Error almacenando proyecto " + llave + " en base de datos", e); } llave.setStatus(UpdateStatus.DB_ERROR); } catch (RemoteException e) { if (LOGGER.isErrorEnabled()) { LOGGER.error("Error obteniendo informacin del proyecto " + llave, e); } llave.setStatus(UpdateStatus.WS_ERROR); } catch (ServiceException e) { if (LOGGER.isErrorEnabled()) { LOGGER.error("Error obteniendo informacin del proyecto " + llave, e); } llave.setStatus(UpdateStatus.WS_ERROR); } catch (Throwable e) { if (LOGGER.isErrorEnabled()) { LOGGER.error("Error obteniendo informacin del proyecto " + llave, e); } llave.setStatus(UpdateStatus.WS_ERROR); } } } private ChileindicaInversionDataDto createDtoFromWsResponse(ConsultaInversionPorLlaveGeorefResponse response, LlaveBean key) { ChileindicaInversionDataDto dto = new ChileindicaInversionDataDto(); InversionData inversionData = response.getInversionData(); if (inversionData != null) { dto.setAno(getAsInteger(inversionData.getAno())); dto.setAsignacionDisponibleInversion(inversionData.getAsignacion_Disponible_Inversion()); dto.setcEtapaIdi(getAsInteger(inversionData.getC_Etapa_Idi())); dto.setcFicha(getAsInteger(inversionData.getC_Ficha())); dto.setcInstitucion(getAsInteger(inversionData.getC_Institucion())); dto.setCodigo(inversionData.getCodigo()); dto.setCostoTotalAjustadoInversion(inversionData.getCosto_Total_Ajustado_Inversion()); dto.setcPreinversion(getAsInteger(inversionData.getC_Preinversion())); dto.setcTipoCodigo(getAsInteger(inversionData.getC_Tipo_Codigo())); dto.setFechaRegistroChileindica(service.getValidDate(key.getFechaRegistro())); dto.setGastadoAnosAnterioresInversion(inversionData.getGastado_Anos_Anteriores_Inversion()); dto.setItemPresupuestario(inversionData.getItem_Presupuestario()); dto.setLastUpdateTry(new Date()); dto.setnEtapaIdi(inversionData.getN_Etapa_Idi()); dto.setNombreComuna(inversionData.getNombre_Comuna()); dto.setNombreInstitucionResponsable(inversionData.getNombre_Institucion_Responsable()); dto.setNombreItemPresupuestario(inversionData.getNombre_Item_Presupuestario()); dto.setNombreLocalidad(inversionData.getNombre_Localidad()); dto.setNombreProvincia(inversionData.getNombre_Provincia()); dto.setNombreProyecto(inversionData.getNombre_Proyecto()); dto.setNombreUnidadTecnica(inversionData.getNombre_Unidad_Tecnica()); dto.setnRegion(inversionData.getN_Region()); dto.setnTipoCodigo(inversionData.getN_Tipo_Codigo()); dto.setRegion(getAsInteger(inversionData.getRegion())); dto.setSaldoAnosRestantesInversion(inversionData.getSaldo_Anos_Restantes_Inversion()); dto.setSaldoPorAsignarInversion(inversionData.getSaldo_Por_Asignar_Inversion()); dto.setSaldoProximoAnoInversion(inversionData.getSaldo_Proximo_Ano_Inversion()); dto.setTotalAsignadoInversion(inversionData.getTotal_Asignado_Inversion()); dto.setTotalPagadoInversion(inversionData.getTotal_Pagado_Inversion()); dto.setUpdateStatus(UpdateStatus.OK); // Add InversionFinanciamentoData to DTO InversionFinanciamientoData[] ifds = response.getInversionFinanciamiento(); if (ifds != null) { for (InversionFinanciamientoData ifd : ifds) { ChileindicaInversionFinanciamientoDataDto fdto = buildInversionFinanciamientoDto(ifd); fdto.setInversionData(dto); dto.getFinanciamientosList().add(fdto); } } // Add RelacionInstrumentosData to DTO RelacionInstrumentosData[] rids = response.getRelacionInstrumentos(); if (rids != null) { for (RelacionInstrumentosData rid : rids) { ChileindicaRelacionIntrumentosDataDto rdto = buildRelacionInstrumentosDto(rid); rdto.setInversionData(dto); dto.getRelacionInstrumentosList().add(rdto); } } // Build GeometryInfo and add it to the DTO InversionGeorefData georefData = response.getInversionGeorefData(); InversionGeorefCoordenadasData[] coordenadas = response.getInversionGeorefCoordenadas(); if (georefData != null && georefData.getElementoGrafico() != null && georefData.getCodigoOGC() != null && coordenadas != null && coordenadas.length > 0) { Geometry geometry = buildGeometry(georefData, coordenadas); dto.setTheGeom(geometry); } } return dto; } private Geometry buildGeometry(InversionGeorefData georefData, InversionGeorefCoordenadasData[] coordenadas) { GeometryType gt = GeometryType.values()[getAsInteger(georefData.getElementoGrafico())]; int srs = getAsInteger(georefData.getCodigoOGC()); Geometry geom = null; try { switch (gt) { case PUNTO: geom = buildPoint(srs, coordenadas[0]); break; case LINEA: geom = buildLine(srs, coordenadas); default: break; } } catch (Exception e) { LOGGER.error("Error construyendo la geometra ", e); } return geom; } private Geometry buildLine(int srs, InversionGeorefCoordenadasData[] coordenadas) throws NoSuchAuthorityCodeException, FactoryException, MismatchedDimensionException, TransformException { CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:" + srs); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326", true); boolean lenient = true; // allow for some error due to different datums MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, lenient); GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); Arrays.sort(coordenadas, new Comparator<InversionGeorefCoordenadasData>() { public int compare(InversionGeorefCoordenadasData o1, InversionGeorefCoordenadasData o2) { return o1.getOrden().compareTo(o2.getOrden()); }; }); Coordinate[] coordinates = new Coordinate[coordenadas.length]; for (int i = 0; i < coordinates.length; i++) { InversionGeorefCoordenadasData igc = coordenadas[i]; int ejeX = Integer.valueOf(igc.getEjeX()); int ejeY = Integer.valueOf(igc.getEjeY()); Coordinate c = new Coordinate(ejeX, ejeY); coordinates[i] = c; } LineString ls = geometryFactory.createLineString(coordinates); ls.setSRID(srs); Geometry result = JTS.transform(ls, transform); result.setSRID(4326); return result; } private Geometry buildPoint(int srs, InversionGeorefCoordenadasData coordenada) throws NoSuchAuthorityCodeException, FactoryException, MismatchedDimensionException, TransformException { int ejeX = Integer.valueOf(coordenada.getEjeX()); int ejeY = Integer.valueOf(coordenada.getEjeY()); CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:" + srs); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326", true); boolean lenient = true; // allow for some error due to different datums MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, lenient); GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); Point p = geometryFactory.createPoint(new Coordinate(ejeX, ejeY)); p.setSRID(srs); Geometry result = JTS.transform(p, transform); result.setSRID(4326); return result; } private ChileindicaRelacionIntrumentosDataDto buildRelacionInstrumentosDto(RelacionInstrumentosData rid) { ChileindicaRelacionIntrumentosDataDto dto = new ChileindicaRelacionIntrumentosDataDto(); dto.setCodigoInstrumento(getAsInteger(rid.getCodigo_Instrumento())); dto.setEspecificacion(rid.getEspecificacion()); dto.setNombreInstrumento(rid.getNombre_Instrumento()); dto.setRelacionAsociadaCodigo(rid.getRelacion_Asociada_Codigo()); dto.setRelacionAsociadaNombre(rid.getRelacion_Asociada_Nombre()); dto.setRelacionPrincipalCodigo(rid.getRelacion_Principal_Codigo()); dto.setRelacionPrincipalNombre(rid.getRelacion_Principal_Nombre()); return dto; } /** * @param dto * @param ifd * @return */ private ChileindicaInversionFinanciamientoDataDto buildInversionFinanciamientoDto( InversionFinanciamientoData ifd) { ChileindicaInversionFinanciamientoDataDto fdto = new ChileindicaInversionFinanciamientoDataDto(); fdto.setArrastre(ifd.getArrastre()); fdto.setAsignacionDisponible(ifd.getAsignacionDisponible()); fdto.setAsignacionPresupuestaria(ifd.getAsignacionPresupuestaria()); fdto.setCostoTotalAjustado(ifd.getCostoTotalAjustado()); fdto.setCostoTotalCore(ifd.getCostoTotalCORE()); fdto.setCostoTotalEbi(ifd.getCostoTotalEBI()); fdto.setCostoTotalEbiActualizado(ifd.getCostoTotalEBIActualizado()); fdto.setCostoTotalEbiActualizadoMasDiezPorciento(ifd.getCostoTotalEBIActualizadoMasDiezPorciento()); fdto.setGastadoAnosAnteriores(ifd.getGastadoAnosAnteriores()); fdto.setNombreAsignacionPresupuestaria(ifd.getNombreAsignacionPresupuestaria()); fdto.setNombreFuenteFinanciamiento(ifd.getNombreFuenteFinanciamiento()); fdto.setSaldoAnosRestantes(ifd.getSaldoAnosRestantes()); fdto.setSaldoPorAsignar(ifd.getSaldoPorAsignar()); fdto.setSaldoProximoAno(ifd.getSaldoProximoAno()); fdto.setSolicitadoAno(ifd.getSolicitadoAno()); fdto.setTotalAsignado(ifd.getTotalAsignado()); fdto.setTotalContratado(ifd.getTotalContratado()); fdto.setTotalPagado(ifd.getTotalPagado()); fdto.setTotalProgramado(ifd.getTotalProgramado()); fdto.setEneroPagado(ifd.getEneroPagado()); fdto.setFebreroPagado(ifd.getFebreroPagado()); fdto.setMarzoPagado(ifd.getMarzoPagado()); fdto.setAbrilPagado(ifd.getAbrilPagado()); fdto.setMayoPagado(ifd.getMayoPagado()); fdto.setJunioPagado(ifd.getJunioPagado()); fdto.setJulioPagado(ifd.getJulioPagado()); fdto.setAgostoPagado(ifd.getAgostoPagado()); fdto.setSeptiembrePagado(ifd.getSeptiembrePagado()); fdto.setOctubrePagado(ifd.getOctubrePagado()); fdto.setNoviembrePagado(ifd.getNoviembrePagado()); fdto.setDiciembrePagado(ifd.getDiciembrePagado()); fdto.setEneroProgramado(ifd.getEneroProgramado()); fdto.setFebreroProgramado(ifd.getFebreroProgramado()); fdto.setMarzoProgramado(ifd.getMarzoProgramado()); fdto.setAbrilProgramado(ifd.getAbrilProgramado()); fdto.setMayoProgramado(ifd.getMayoProgramado()); fdto.setJunioProgramado(ifd.getJunioProgramado()); fdto.setJulioProgramado(ifd.getJulioProgramado()); fdto.setAgostoProgramado(ifd.getAgostoProgramado()); fdto.setSeptiembreProgramado(ifd.getSeptiembreProgramado()); fdto.setCodigoFuenteFinanciamiento(ifd.getCodigoFuenteFinanciamiento()); fdto.setOctubreProgramado(ifd.getOctubreProgramado()); fdto.setNoviembreProgramado(ifd.getNoviembreProgramado()); fdto.setDiciembreProgramado(ifd.getDiciembreProgramado()); return fdto; } private Integer getAsInteger(BigInteger source) { return source != null ? source.intValue() : null; } }