it.govpay.web.console.pagamenti.service.DistintaService.java Source code

Java tutorial

Introduction

Here is the source code for it.govpay.web.console.pagamenti.service.DistintaService.java

Source

/*
 * GovPay - Porta di Accesso al Nodo dei Pagamenti SPC 
 * http://www.gov4j.it/govpay
 * 
 * Copyright (c) 2014-2015 Link.it srl (http://www.link.it).
 * Copyright (c) 2014-2015 TAS S.p.A. (http://www.tasgroup.it).
 * 
 * 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 it.govpay.web.console.pagamenti.service;

import it.govpay.ejb.core.ejb.AnagraficaEJB;
import it.govpay.ejb.core.ejb.DistintaEJB;
import it.govpay.ejb.core.ejb.PendenzaEJB;
import it.govpay.ejb.core.filter.DistintaFilter;
import it.govpay.ejb.core.model.DistintaModel;
import it.govpay.ejb.core.model.DistintaModel.EnumStatoDistinta;
import it.govpay.ejb.core.model.EnteCreditoreModel;
import it.govpay.ejb.core.model.EsitoPagamentoDistinta;
import it.govpay.ejb.core.model.PagamentoModel.EnumStatoPagamento;
import it.govpay.ejb.core.model.PendenzaModel;
import it.govpay.ejb.ndp.ejb.AnagraficaDominioEJB;
import it.govpay.ejb.ndp.ejb.DocumentiEJB;
import it.govpay.ejb.ndp.model.impl.RPTModel;
import it.govpay.ejb.ndp.model.impl.RTModel;
import it.govpay.web.console.pagamenti.bean.DistintaBean;
import it.govpay.web.console.pagamenti.form.DistintaSearchForm;
import it.govpay.web.console.pagamenti.iservice.IDistintaService;
import it.govpay.web.console.pagamenti.model.PagamentoModel;
import it.govpay.web.console.pagamenti.model.PagamentoModel.DettaglioPagamento;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.Logger;
import org.openspcoop2.generic_project.exception.ServiceException;
import org.openspcoop2.generic_project.web.form.CostantiForm;
import org.openspcoop2.generic_project.web.impl.jsf1.input.SelectItem;
import org.openspcoop2.generic_project.web.input.DateTime;
import org.openspcoop2.generic_project.web.input.SelectList;
import org.openspcoop2.generic_project.web.service.BaseService;

@Named("distintaService")
@Singleton
public class DistintaService extends BaseService<DistintaSearchForm> implements IDistintaService, Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Inject
    private transient Logger log;

    @Inject
    DistintaEJB distintaEjb;

    @Inject
    PendenzaEJB pendenzaEjb;

    @Inject
    AnagraficaEJB anagraficaEjb;

    @Inject
    AnagraficaDominioEJB anagraficaDominioEjb;

    @Inject
    DocumentiEJB documentiEjb;

    @PostConstruct
    private void init() {
        log.debug("Init DistintaService completato. ID[" + this.toString() + "]");
    }

    @Override
    @Inject
    @Named("distintaSearchForm")
    public void setForm(DistintaSearchForm form) {
        super.setForm(form);
        log.debug("Set distintaSearchForm completato. IDForm[" + form.hashCode() + "]");
    }

    @Override
    public List<DistintaBean> findAll(int start, int limit) throws ServiceException {
        List<DistintaBean> lst = new ArrayList<DistintaBean>();
        try {
            log.debug("findAll Distinte Offset[" + start + "] Limit[" + limit + "] in corso...");
            DistintaFilter filtro = getFiltro(start, limit, this.form);
            lst = _findAll(filtro);
            log.debug("findAll Distinte Offset[" + start + "] Limit[" + limit + "] completata.");

        } catch (Exception e) {
            log.error("Si e' verificato un errore durante la findAll Distinte Offset[" + start + "] Limit[" + limit
                    + "]: " + e.getMessage(), e);
        }
        return lst;
    }

    @Override
    public int totalCount() throws ServiceException {
        try {
            log.debug("Count Distinte in corso...");
            DistintaFilter filtro = getFiltro(null, null, this.form);
            int cnt = this.distintaEjb.countAllDistinte(filtro);
            log.debug("Count Distinte completata trovate[" + cnt + "].");
            return cnt;
        } catch (Exception e) {
            log.error("Si e' verificato un errore durante la count delle distinte: " + e.getMessage(), e);
        }

        return 0;
    }

    @Override
    public void store(DistintaBean obj) throws ServiceException {
    }

    @Override
    public void deleteById(Long key) throws ServiceException {
    }

    @Override
    public void delete(DistintaBean obj) throws ServiceException {
    }

    @Override
    public DistintaBean findById(Long key) throws ServiceException {
        try {
            log.debug("findById Distinta in corso...");
            DistintaBean bean = findPagamentoById(key);
            log.debug("findById Distinta completata.");
            return bean;
        } catch (Exception e) {
            log.error("Si e' verificato un errore durante la findById Distinta: " + e.getMessage(), e);
        }
        return null;
    }

    private DistintaBean findPagamentoById(Long key) throws ServiceException {
        try {
            log.debug("findById Pagamento in corso...");

            DistintaModel distintaById = this.distintaEjb.findDistintaById(key);

            log.debug("findById Pagamento completata.");
            if (distintaById != null) {
                List<PendenzaModel> pendenze = pendenzaEjb.getPendenze(key);
                EsitoPagamentoDistinta esitoPagamento = this.distintaEjb.getEsitoPagamentoDistinta(key);
                EnteCreditoreModel enteCreditore = anagraficaEjb
                        .getCreditoreByIdLogico(esitoPagamento.getIdentificativoFiscaleCreditore());
                PagamentoModel pagamento = new PagamentoModel();
                pagamento.setAutenticazione(distintaById.getAutenticazione().toString());
                pagamento.setCcp(distintaById.getCodTransazionePsp());
                pagamento.setDebitore(pendenze.get(0).getDebitore());
                pagamento.setEnteCreditore(enteCreditore);
                pagamento.setGatewayPagamento(anagraficaEjb.getValidGateway(distintaById.getIdGatewayPagamento()));
                pagamento.setIbanAddebito(distintaById.getIbanAddebito());
                pagamento.setImportoDovuto(distintaById.getImportoTotale());
                pagamento.setImportoVersato(esitoPagamento.getImportoTotalePagato());
                pagamento.setIuv(distintaById.getIuv());
                pagamento.setStato(esitoPagamento.getStato().getDescrizione());
                pagamento.setTributo(anagraficaEjb.getTributoById(enteCreditore.getIdEnteCreditore(),
                        pendenze.get(0).getCodiceTributo()));
                pagamento.setVersante(distintaById.getSoggettoVersante());

                List<DettaglioPagamento> dettagliPagamento = new ArrayList<PagamentoModel.DettaglioPagamento>();

                for (it.govpay.ejb.core.model.PagamentoModel pagamentoEjbModel : distintaById.getPagamenti()) {
                    PendenzaModel pendenzaModel = null;
                    for (PendenzaModel pendenzaModelAct : pendenze) {
                        if (pendenzaModelAct.getCondizioniPagamento().get(0).getIdCondizione()
                                .equals(pagamentoEjbModel.getIdCondizionePagamento())) {
                            pendenzaModel = pendenzaModelAct;
                        }
                    }
                    DettaglioPagamento dettaglio = pagamento.new DettaglioPagamento();
                    dettaglio.setAnnoRiferimento(pendenzaModel.getAnnoRiferimento());
                    dettaglio.setCausale(pendenzaModel.getCondizioniPagamento().get(0).getCausale());
                    dettaglio.setDataRicevuta(pagamentoEjbModel.getDataPagamento());
                    dettaglio.setIbanAccredito(pendenzaModel.getCondizioniPagamento().get(0).getIbanBeneficiario());
                    dettaglio.setIdentificativo(pendenzaModel.getCondizioniPagamento().get(0).getIdPagamentoEnte());
                    dettaglio.setImportoDovuto(pendenzaModel.getCondizioniPagamento().get(0).getImportoTotale());
                    if (pagamentoEjbModel.getStato().equals(EnumStatoPagamento.ES))
                        dettaglio.setImportoVersato(pagamentoEjbModel.getImportoPagato());
                    else
                        dettaglio.setImportoVersato(BigDecimal.ZERO);
                    dettaglio.setIur(pagamentoEjbModel.getIdRiscossionePSP());
                    dettaglio.setStato(pagamentoEjbModel.getStato().getDescrizione());
                    dettagliPagamento.add(dettaglio);
                }

                pagamento.setDettagliPagamento(dettagliPagamento);

                RPTModel rptModel = documentiEjb.recuperaRPT(enteCreditore.getIdFiscale(), distintaById.getIuv(),
                        distintaById.getCodTransazionePsp());
                if (rptModel != null) {
                    pagamento.setRpt(rptModel.getBytes());
                }

                RTModel rtModel = documentiEjb.recuperaRT(enteCreditore.getIdFiscale(), distintaById.getIuv(),
                        distintaById.getCodTransazionePsp());
                if (rtModel != null) {
                    pagamento.setRt(rtModel.getBytes());
                }

                DistintaBean bean = new DistintaBean();

                bean.setDTO(distintaById);
                bean.setDTO(pagamento);

                return bean;
            }
        } catch (Exception e) {
            log.error("Si e' verificato un errore durante la findById Distinta: " + e.getMessage(), e);
        }
        return null;
    }

    @Override
    public List<DistintaBean> findAll() throws ServiceException {
        List<DistintaBean> lst = new ArrayList<DistintaBean>();

        try {
            log.debug("findAll Distinte in corso...");
            DistintaFilter filtro = getFiltro(null, null, this.form);
            lst = _findAll(filtro);
            log.debug("findAll Distinte completata.");

        } catch (Exception e) {
            log.error("Si e' verificato un errore durante la findAll Distinte: " + e.getMessage(), e);
        }

        return lst;
    }

    @Override
    public List<DistintaBean> findAll(DistintaSearchForm form) throws ServiceException {
        List<DistintaBean> lst = new ArrayList<DistintaBean>();

        try {
            log.debug("findAll Distinte in corso...");
            DistintaFilter filtro = getFiltro(null, null, form);
            lst = _findAll(filtro);
            log.debug("findAll Distinte completata.");

        } catch (Exception e) {
            log.error("Si e' verificato un errore durante la findAll Distinte: " + e.getMessage(), e);
        }

        return lst;
    }

    private List<DistintaBean> _findAll(DistintaFilter filtro) throws Exception {
        List<DistintaBean> lst = new ArrayList<DistintaBean>();
        List<DistintaModel> distinte = this.distintaEjb.findAllDistinte(filtro);

        if (distinte != null && distinte.size() > 0) {
            for (DistintaModel distinta : distinte) {
                List<PendenzaModel> pendenze = pendenzaEjb.getPendenze(distinta.getIdDistinta());
                EnteCreditoreModel enteCreditore = anagraficaEjb
                        .getCreditoreByIdLogico(distinta.getIdentificativoFiscaleCreditore());
                PagamentoModel pagamento = new PagamentoModel();
                pagamento.setEnteCreditore(enteCreditore);
                pagamento.setImportoDovuto(distinta.getImportoTotale());
                pagamento.setIuv(distinta.getIuv());
                pagamento.setStato(distinta.getStato().getDescrizione());
                pagamento.setTributo(anagraficaEjb.getTributoById(enteCreditore.getIdEnteCreditore(),
                        pendenze.get(0).getCodiceTributo()));
                pagamento.setDebitore(pendenze.get(0).getDebitore());

                DistintaBean bean = new DistintaBean();
                bean.setDTO(distinta);
                bean.setDTO(pagamento);
                lst.add(bean);
            }
        }
        return lst;
    }

    private DistintaFilter getFiltro(Integer start, Integer limit, DistintaSearchForm form) {
        DistintaFilter filtro = new DistintaFilter();

        log.debug("Imposto filtro ricerca distinte");

        filtro.setOffset(start);
        filtro.setLimit(limit);

        log.debug("Offset[" + start + "], Limit[" + limit + "]");

        //Imposto le date
        //impostaDate(form, filtro);
        log.debug("Imposta date [DISABILITATO]");

        // cfentecreditore
        filtro.setCfEnteCreditore(form.getCfEnteCreditore().getValue());
        log.debug("CF Ente Creditore[" + form.getCfEnteCreditore().getValue() + "]");

        // cfversanteDebitore
        filtro.setCfVersanteODebitore(form.getCfVersanteODebitore().getValue());
        log.debug("CFVersanteODebitore[" + form.getCfVersanteODebitore().getValue() + "]");

        // listaenti
        filtro.setIdentificativiEnteCreditore(form.getIdentificativiEnteCreditore());
        log.debug("IDEnteCreditore[" + form.getIdentificativiEnteCreditore() + "]");

        // stato
        SelectList<SelectItem> stato = form.getStatoDistinta();
        String periodo = stato.getValue() != null ? stato.getValue().getValue() : CostantiForm.NON_SELEZIONATO;

        if (!StringUtils.isEmpty(periodo) && !periodo.equals(CostantiForm.NON_SELEZIONATO)) {
            EnumStatoDistinta statoD = EnumStatoDistinta.valueOf(periodo);
            filtro.setStato(statoD);
        }

        filtro.setIuv(form.getIuv().getValue());
        log.debug("IDEnteCreditore[" + form.getIuv() + "]");

        return filtro;
    }

    private void impostaDate(DistintaSearchForm form, DistintaFilter filtro) {
        SelectList<SelectItem> dataPeriodo = form.getDataPeriodo();
        DateTime data = form.getData();

        Date dataInizio = data.getValue();
        Date dataFine = data.getValue2();

        String periodo = dataPeriodo.getValue() != null ? dataPeriodo.getValue().getValue()
                : DistintaSearchForm.DATA_PERIODO_ULTIMA_SETTIMANA;

        Calendar today = Calendar.getInstance();
        today.set(Calendar.HOUR_OF_DAY, 23);
        today.set(Calendar.MINUTE, 59);
        today.clear(Calendar.SECOND);
        today.clear(Calendar.MILLISECOND);

        //ultima settimana
        if (DistintaSearchForm.DATA_PERIODO_ULTIMA_SETTIMANA.equals(periodo)) {
            Calendar lastWeek = (Calendar) today.clone();
            Calendar c = Calendar.getInstance();
            dataFine = c.getTime();
            lastWeek.set(Calendar.HOUR_OF_DAY, 0);
            lastWeek.set(Calendar.MINUTE, 0);
            lastWeek.add(Calendar.DATE, -7);
            dataInizio = lastWeek.getTime();

        } else if (DistintaSearchForm.DATA_PERIODO_ULTIMO_MESE.equals(periodo)) {
            Calendar lastMonth = (Calendar) today.clone();

            // prendo la data corrente
            dataFine = Calendar.getInstance().getTime();

            // la data inizio rimane uguale sia per giornaliero che per orario
            lastMonth.set(Calendar.HOUR_OF_DAY, 0);
            lastMonth.set(Calendar.MINUTE, 0);
            lastMonth.add(Calendar.DATE, -30);
            dataInizio = lastMonth.getTime();

        } else if (DistintaSearchForm.DATA_PERIODO_ULTIMI_TRE_MESI.equals(periodo)) {
            Calendar lastyear = (Calendar) today.clone();

            dataFine = Calendar.getInstance().getTime();

            lastyear.set(Calendar.HOUR_OF_DAY, 0);
            lastyear.set(Calendar.MINUTE, 0);
            lastyear.add(Calendar.DATE, -90);
            dataInizio = lastyear.getTime();

        } else {
            // personalizzato
            dataInizio = data.getValue();
            dataFine = data.getValue2();
        }

        if (dataInizio != null) {
            log.debug("Data inizio[" + dataInizio + "]");
            filtro.setDataInizio(dataInizio);
        }

        if (dataFine != null) {
            log.debug("Data Fine[" + dataFine + "]");
            filtro.setDataFine(dataFine);
        }
    }

    @Override
    public boolean exists(DistintaBean arg0) throws ServiceException {
        return false;
    }

}