package com.fp.armas.rules.save.solicitudimportacion; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import com.fp.common.helper.Constant; import com.fp.dto.rules.TransactionRule; import com.fp.dto.save.SaveRequest; import com.fp.persistence.commondb.PersistenceHelper; import com.fp.persistence.commondb.helper.FormatDates; import com.fp.persistence.parmas.fun.TarmCarga; import com.fp.persistence.parmas.fun.TarmCargaDetalle; import com.fp.persistence.parmas.fun.TarmRegistroArmas; import com.fp.persistence.parmas.fun.TarmTotalPersona; import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo; import com.fp.persistence.parmas.soli.TarmArmas; import com.fp.persistence.parmas.soli.TarmSolicitud; import com.fp.persistence.parmas.soli.TarmSolicitudArmas; import com.fp.persistence.parmas.soli.TarmSolicitudArmasKey; import com.fp.persistence.pcustomer.gene.TcustPersonAddress; import com.fp.sessionbeans.helper.Sequence; /** * Realiza el mantenimiento de totales y maestro detalle del ingreso * @author fpazmino * */ public class PreviaImportacionDesgloce extends TransactionRule { private static final long serialVersionUID = 1L; private static final String JPQL_TIPOARMAEXPLOSIVO = "from TarmTipoArmaExplosivo tae" + " where tae.pk = :pk"; private static final String JPQL_DIRECCION_PRINCIPAL="from TcustPersonAddress o WHERE o.pk.personcode=:personcode AND o.pk.dateto=:dateto AND o.principal=:principal"; private static final String JPQL_ULTIMO_TOTAL_PERSONA = "from TarmTotalPersona o where o.personcodigo=:personcode AND o.clase=:clase AND o.tipoarmaexplosivo=:tipoarmaexplosivo AND o.unidadmedidapeso=:unidadmedidapeso AND o.fecha = (Select max(tp.fecha) from TarmTotalPersona tp where tp.personcodigo=:personcode AND tp.clase=:clase AND tp.tipoarmaexplosivo=:tipoarmaexplosivo AND tp.unidadmedidapeso=:unidadmedidapeso)"; private static final String JPQL_ARMAS_CARGA_IMPORTACION = "from TarmArmas arm WHERE arm.pk in (Select cd.carma from TarmCargaDetalle cd where cd.ccarga = (Select c.pk from TarmCarga c where c.aucp=:aucp))"; private static final String JPQL_CARGA = "from TarmCarga c WHERE c.aucp=:aucp"; /** * Completa desgloce de las armas de fuego y armas no letales. Afecta totales. */ @Override @SuppressWarnings("unchecked") public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception { try { System.out.println("INGRESA A DESGLOCE DESADUANIZACION"); Boolean requiereDesgloce = (Boolean) pSaveRequest.get("REQUIEREDESGLOCE"); if(requiereDesgloce){ EntityManager pEntityManager=PersistenceHelper.getEntityManager(); TarmSolicitud solicitud = (TarmSolicitud) pSaveRequest.get("SOLICITUD"); String aucp = solicitud.getAucp(); List listaArmas=consultarArmasPorAucp(pEntityManager, aucp); String personcode = solicitud.getPersoncode().toString(); // Actualiza el estado de desaduanizacion TarmCarga carga = actualizarEstadoCarga(pEntityManager, aucp); // Desglozar armas for(TarmArmas armasObj : listaArmas){ TarmTipoArmaExplosivo tipoArmaExplosivoObj = findTipoArmaExpByCTipoArmaExp(pEntityManager, armasObj.getCtipoarmaexplosivo()); Integer cantidadArmas = armasObj.getCantidad(); // Afectacion en la tabla de totales actualizarTotalPersona(pEntityManager, tipoArmaExplosivoObj, personcode, new BigDecimal(cantidadArmas)); // 0010000001 ARMA DE FUEGO, 0010000008 ARMAS NO LETALES if((tipoArmaExplosivoObj.getClase().equals("0010000001") || tipoArmaExplosivoObj.getClase().equals("0010000008")) && armasObj.getCantidad()>1){ // Grabamos 1 registro un total de N veces segun determine la cantidad for(int i=0; i consultarArmasPorAucp(EntityManager pEntityManager, String aucp) throws Exception { Query qry = pEntityManager.createQuery(PreviaImportacionDesgloce.JPQL_ARMAS_CARGA_IMPORTACION); qry.setParameter("aucp", aucp); ListresultList = qry.getResultList(); if(resultList!=null && resultList.size()>0){ return (List) qry.getResultList(); }else{ return null; } } /** * Encuentra una lista de articulos por codigo de importacion (aucp) * @param pEntityManager * @param aucp * @return * @throws Exception */ @SuppressWarnings("unchecked") public static TarmCarga actualizarEstadoCarga(EntityManager pEntityManager, String aucp) throws Exception { Query qry = pEntityManager.createQuery(PreviaImportacionDesgloce.JPQL_CARGA); qry.setParameter("aucp", aucp); ListresultList = qry.getResultList(); TarmCarga carga = null; if(resultList!=null && resultList.size()>0){ carga = resultList.get(0); carga.setEsdesaduanizado("S"); pEntityManager.merge(carga); } return carga; } /** * Encuentra una lista de tipo de armas y explosivos * @param pEntityManager * @param pk * @return * @throws Exception */ public static TarmTipoArmaExplosivo findTipoArmaExpByCTipoArmaExp(EntityManager pEntityManager, String pk) throws Exception { Query qry = pEntityManager.createQuery(PreviaImportacionDesgloce.JPQL_TIPOARMAEXPLOSIVO); qry.setParameter("pk", pk); ListresultList = qry.getResultList(); if(resultList!=null && resultList.size()>0){ return (TarmTipoArmaExplosivo) qry.getResultList().get(0); }else{ return null; } } /** * Actualizar tabla TarmTotalPersona * @param pEntityManager * @param EntityManager pEntityManager, TarmTipoArmaExplosivo tipoArmaExplosivo, String personcode, BigDecimal cantidadPeso * @return void * @throws Exception */ public void actualizarTotalPersona(EntityManager pEntityManager, TarmTipoArmaExplosivo tipoArmaExplosivo, String personcode, BigDecimal cantidadPeso) throws Exception { Query qry = pEntityManager.createQuery(PreviaImportacionDesgloce.JPQL_ULTIMO_TOTAL_PERSONA); qry.setParameter("personcode", Integer.valueOf(personcode)); qry.setParameter("clase", tipoArmaExplosivo.getClase()); qry.setParameter("tipoarmaexplosivo", tipoArmaExplosivo.getTipoarmaexplosivo()); qry.setParameter("unidadmedidapeso", tipoArmaExplosivo.getUnidadmedidapeso()); ListresultList = qry.getResultList(); String cTotalPersona = getCodigoTotalPersona(); if(resultList!=null && resultList.size()>0){ TarmTotalPersona totalPersonaAnterior = resultList.get(0); // Actualiza la tabla de totales cuando existen datos anteriores TarmTotalPersona totalPersona = new TarmTotalPersona(); totalPersona.setClase(tipoArmaExplosivo.getClase()); totalPersona.setClasecodigo("CLASE"); totalPersona.setTipoarmaexplosivo(tipoArmaExplosivo.getTipoarmaexplosivo()); totalPersona.setTipoarmaexplosivocodigo("TIPOARMAEXPLOSIVO"); totalPersona.setUnidadmedidapeso(tipoArmaExplosivo.getUnidadmedidapeso()); totalPersona.setUnidadmedidapesocodigo("UNIDADMEDIDA"); totalPersona.setPersoncodigo(Integer.valueOf(personcode)); totalPersona.setSaldoanterior(totalPersonaAnterior.getTotal()); totalPersona.setCantidadmovimiento(cantidadPeso); totalPersona.setTotal(totalPersonaAnterior.getTotal().add(cantidadPeso)); totalPersona.setFecha(new Timestamp(new Date().getTime())); totalPersona.setIngresoegreso("ING"); totalPersona.setIngresoegresocodigo("ESINGRESOEGRESO"); totalPersona.setPk(cTotalPersona); pEntityManager.detach(totalPersona); pEntityManager.persist(totalPersona); System.out.println("Saldoanterior,"+totalPersona.getSaldoanterior()+",Cantidadmovimiento,"+totalPersona.getCantidadmovimiento()+",Total,"+totalPersona.getTotal()+",fecha,"+totalPersona.getFecha()); }else{ // Actualiza la tabla de totales cuando NO existen datos anteriores TarmTotalPersona totalPersona = new TarmTotalPersona(); totalPersona.setClase(tipoArmaExplosivo.getClase()); totalPersona.setClasecodigo("CLASE"); totalPersona.setTipoarmaexplosivo(tipoArmaExplosivo.getTipoarmaexplosivo()); totalPersona.setTipoarmaexplosivocodigo("TIPOARMAEXPLOSIVO"); totalPersona.setUnidadmedidapeso(tipoArmaExplosivo.getUnidadmedidapeso()); totalPersona.setUnidadmedidapesocodigo("UNIDADMEDIDA"); totalPersona.setPersoncodigo(Integer.valueOf(personcode)); totalPersona.setSaldoanterior(BigDecimal.ZERO); totalPersona.setCantidadmovimiento(cantidadPeso); totalPersona.setTotal(cantidadPeso); totalPersona.setFecha(new Timestamp(new Date().getTime())); totalPersona.setIngresoegreso("ING"); totalPersona.setIngresoegresocodigo("ESINGRESOEGRESO"); totalPersona.setPk(cTotalPersona); pEntityManager.persist(totalPersona); System.out.println("Saldoanterior,"+totalPersona.getSaldoanterior()+",Cantidadmovimiento,"+totalPersona.getCantidadmovimiento()+",Total,"+totalPersona.getTotal()+",fecha,"+totalPersona.getFecha()); } } /** * Obtiene la dirección principal de la persona * @param personcode * @return * @throws Exception */ @SuppressWarnings("unchecked") public TcustPersonAddress obtenerDireccionPrincipal(Integer personcode) throws Exception { TcustPersonAddress tcustPersonAddress = null; Query query = PersistenceHelper.getEntityManager().createQuery(JPQL_DIRECCION_PRINCIPAL); query.setParameter("personcode", personcode); query.setParameter("dateto", FormatDates.getDefaultExpiryTimestamp()); query.setParameter("principal", Constant.STR_Y); List ltcustPersonAddresses = query.getResultList(); if(ltcustPersonAddresses != null && !ltcustPersonAddresses.isEmpty()){ tcustPersonAddress = ltcustPersonAddresses.iterator().next(); } return tcustPersonAddress; } /** * Metodo que devuelve el codigo de un arma * @return * @throws Exception */ private String getCodigoArmas() throws Exception { Sequence sequence = new Sequence(); String codigoArma = sequence.getNextValue("CARMA").toString(); return codigoArma; } /** * Metodo que devuelve el codigo de un totalpersona * @return * @throws Exception */ private String getCodigoTotalPersona() throws Exception { Sequence sequence = new Sequence(); String cTotalPersona = sequence.getNextValue("TARMTOTALPERSONA").toString(); return cTotalPersona; } /** * Metodo que devuelve el codigo de una carga detalle * @return * @throws Exception */ private String getCodigoCargaDetalle() throws Exception { Sequence sequence = new Sequence(); String cCarga = sequence.getNextValue("CARGADETALLE").toString(); return cCarga; } }