Skip to content

Commit

Permalink
Perfezionato controllo incasso duplicato
Browse files Browse the repository at this point in the history
  • Loading branch information
nardil committed Jul 21, 2021
1 parent 568254b commit 1e31073
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 42 deletions.
69 changes: 32 additions & 37 deletions jars/core/src/main/java/it/govpay/core/business/Incassi.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
import it.govpay.model.Incasso.StatoIncasso;
import it.govpay.model.Pagamento.Stato;
import it.govpay.model.Pagamento.TipoPagamento;
import it.govpay.model.Rendicontazione.EsitoRendicontazione;
import it.govpay.model.Rendicontazione.StatoRendicontazione;
import it.govpay.model.SingoloVersamento.StatoSingoloVersamento;
import it.govpay.model.Versamento.StatoVersamento;
Expand Down Expand Up @@ -215,13 +214,19 @@ public void verificaRiconciliazione(RichiestaIncassoDTO richiestaIncasso) throws
pagamentiBD.setAtomica(false);

try {
log.debug("Validazione riconciliazione per riversamento Singolo [Dominio: "+richiestaIncasso.getCodDominio()+", Iuv: "+iuv+"]...");
log.debug("Validazione riconciliazione per riversamento Singolo [Dominio:"+richiestaIncasso.getCodDominio()+", Iuv: "+iuv+"]...");
it.govpay.bd.model.Pagamento pagamento = pagamentiBD.getPagamento(richiestaIncasso.getCodDominio(), iuv);

// Controllo se il pagamento e' stato gia' riconciliato
if(pagamento.getIdIncasso() != null) {
Incasso incasso = incassiBD.getIncasso(pagamento.getIdIncasso());
throw new IncassiException(FaultType.PAGAMENTO_GIA_INCASSATO, "Il pagamento [Dominio:" + pagamento.getCodDominio() + " Iuv:" + pagamento.getIuv() + " Iur:" + pagamento.getIur() + "] risuta gia' riconciliato [Sct:"+incasso.getSct()+" Trn: "+incasso.getTrn()+"].");
}

if(richiestaIncasso.getImporto().doubleValue() != pagamento.getImportoPagato().doubleValue())
throw new IncassiException(FaultType.IMPORTO_ERRATO, "La richiesta di riconciliazione presenta un importo [" + richiestaIncasso.getImporto() + "] non corripondente a quello riscosso [" + pagamento.getImportoPagato().doubleValue() + "]");

log.debug("Validazione riconciliazione per riversamento Singolo [Dominio: "+richiestaIncasso.getCodDominio()+", Iuv: "+iuv+"] completata con successo.");
log.debug("Validazione riconciliazione per riversamento Singolo [Dominio:"+richiestaIncasso.getCodDominio()+", Iuv: "+iuv+"] completata con successo.");
} catch (NotFoundException nfe) {
ctx.getApplicationLogger().log("incasso.iuvNonTrovato", iuv);
throw new IncassiException(FaultType.PAGAMENTO_NON_TROVATO, "Lo IUV " + iuv + " estratto dalla causale di incasso non identifica alcun pagamento per il creditore " + richiestaIncasso.getCodDominio());
Expand All @@ -238,23 +243,31 @@ public void verificaRiconciliazione(RichiestaIncassoDTO richiestaIncasso) throws
frBD.setAtomica(false);

try {
log.debug("Validazione riconciliazione per riversamento cumulativo [Dominio: "+richiestaIncasso.getCodDominio()+", IdFlusso: "+idf+"]...");
log.debug("Validazione riconciliazione per riversamento cumulativo [Dominio:"+richiestaIncasso.getCodDominio()+", IdFlusso:"+idf+"]...");
// Cerco l'idf come case insensitive
// fr = frBD.getFr(idf, richiestaIncasso.isRicercaIdFlussoCaseInsensitive()); TODO come si gestisce ora?
fr = frBD.getFr(idf, false);

log.debug("Ricerca flusso per riversamento cumulativo [Dominio: "+richiestaIncasso.getCodDominio()+", IdFlusso: "+idf+"] completata.");
log.debug("Ricerca flusso per riversamento cumulativo [Dominio:"+richiestaIncasso.getCodDominio()+", IdFlusso:"+idf+"] completata.");

// Controllo se il flusso e' stato gia' riconciliato
if(fr.getIdIncasso() != null) {
Incasso incasso = incassiBD.getIncasso(fr.getIdIncasso());
throw new IncassiException(FaultType.FLUSSO_GIA_INCASSATO, "Il flusso [IdFlusso:"+idf+"] risuta gia' riconciliato [Sct:"+incasso.getSct()+" Trn:"+incasso.getTrn()+"].");
}


if(!fr.getStato().equals(StatoFr.ACCETTATA)) {
ctx.getApplicationLogger().log("incasso.frAnomala", idf);
throw new IncassiException(FaultType.FR_ANOMALA, "Il flusso di rendicontazione " + idf + " identificato dalla causale di incasso risulta avere delle anomalie");
throw new IncassiException(FaultType.FR_ANOMALA, "Il flusso di rendicontazione [IdFlusso:"+idf+"] identificato dalla causale di incasso risulta avere delle anomalie");
}

// Verifica importo pagato con l'incassato
if(fr.getImportoTotalePagamenti().doubleValue() != richiestaIncasso.getImporto().doubleValue()) {
ctx.getApplicationLogger().log("incasso.importoErrato", fr.getImportoTotalePagamenti().doubleValue() + "", richiestaIncasso.getImporto().doubleValue() + "");
throw new IncassiException(FaultType.IMPORTO_ERRATO, "L'importo del flusso di redicontazione [" + richiestaIncasso.getImporto() + "] non corriponde all'importo del riversamento [" + fr.getImportoTotalePagamenti().doubleValue() + "]");
}
log.debug("Validazione riconciliazione per riversamento cumulativo [Dominio: "+richiestaIncasso.getCodDominio()+", IdFlusso: "+idf+"] completata con successo.");
log.debug("Validazione riconciliazione per riversamento cumulativo [Dominio:"+richiestaIncasso.getCodDominio()+", IdFlusso: "+idf+"] completata con successo.");
} catch (NotFoundException nfe) {
ctx.getApplicationLogger().log("incasso.idfNonTrovato", idf);
throw new IncassiException(FaultType.IDF_NON_TROVATO, "L'identificativo " + idf + " estratto dalla causale di incasso non identifica alcun flusso di rendicontazione");
Expand All @@ -279,7 +292,7 @@ public RichiestaIncassoDTOResponse elaboraRiconciliazione(String codDomino, Stri
String causale = null;
String iuv = null;
String idf = null;
log.debug("Elaborazione riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] ...");
log.debug("Elaborazione riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] ...");

try {
if(gpContext.getEventoCtx().getDatiPagoPA() == null) {
Expand All @@ -292,18 +305,18 @@ public RichiestaIncassoDTOResponse elaboraRiconciliazione(String codDomino, Stri
incassiBD.enableSelectForUpdate();

try {
log.debug("Lettura riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] dal db...");
log.debug("Lettura riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] dal db...");
incasso = incassiBD.getIncasso(codDomino, idRiconciliazione);
richiestaIncassoResponse.setIncasso(incasso);
} catch (NotFoundException e) {
// non dovrebbe succedere perche' la coppia viene letta dal db
log.warn("La riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] non e' presente sul db: " + e.getMessage(), e);
log.warn("La riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] non e' presente sul db: " + e.getMessage(), e);
return richiestaIncassoResponse;
} catch (MultipleResultException e) {
throw new GovPayException(e);
}

log.debug("Lettura riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] dal db completata.");
log.debug("Lettura riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] dal db completata.");

// Validazione dati obbligatori
boolean iuvIdFlussoSet = incasso.getIuv() != null || incasso.getIdFlussoRendicontazione() != null;
Expand Down Expand Up @@ -342,7 +355,7 @@ public RichiestaIncassoDTOResponse elaboraRiconciliazione(String codDomino, Stri
incasso.setDataIncasso(new Date());
String descr = e.getMessage() + ": " + e.getDetails();

log.debug("Riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] Iuv ["+iuv+"], IdFlusso ["+idf+"], Causale ["+causale+"] completata con errore: " + descr);
log.debug("Riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] Iuv ["+iuv+"], IdFlusso ["+idf+"], Causale ["+causale+"] completata con errore: " + descr);

if(descr.length() > 255) {
descr = descr.substring(0, 252) + "...";
Expand Down Expand Up @@ -378,7 +391,7 @@ private RichiestaIncassoDTOResponse eseguiAcquisizioneRiconciliazione(RichiestaI
throws ServiceException, IncassiException, UtilsException, GovPayException {
GpContext gpContext = (GpContext) ctx.getApplicationContext();

log.debug("Riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] Iuv ["+iuv+"], IdFlusso ["+idf+"], Causale ["+causale+"] in corso...");
log.debug("Riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] Iuv ["+iuv+"], IdFlusso ["+idf+"], Causale ["+causale+"] in corso...");

PagamentiBD pagamentiBD = new PagamentiBD(incassiBD);
pagamentiBD.setAtomica(false);
Expand All @@ -397,14 +410,14 @@ private RichiestaIncassoDTOResponse eseguiAcquisizioneRiconciliazione(RichiestaI
// Riversamento singolo
if(iuv != null) {
try {
log.debug("Ricerca riconciliazione per riversamento Singolo [Dominio: "+codDomino+", Iuv: "+iuv+"]...");
log.debug("Ricerca riconciliazione per riversamento Singolo [Dominio:"+codDomino+", Iuv: "+iuv+"]...");
it.govpay.bd.model.Pagamento pagamento = pagamentiBD.getPagamento(incasso.getCodDominio(), iuv);

if(incasso.getImporto().doubleValue() != pagamento.getImportoPagato().doubleValue())
throw new IncassiException(FaultType.IMPORTO_ERRATO, "La richiesta di riconciliazione presenta un importo [" + incasso.getImporto() + "] non corripondente a quello riscosso [" + pagamento.getImportoPagato().doubleValue() + "]");

pagamenti.add(pagamento);
log.debug("Ricerca riconciliazione per riversamento Singolo [Dominio: "+codDomino+", Iuv: "+iuv+"] completata.");
log.debug("Ricerca riconciliazione per riversamento Singolo [Dominio:"+codDomino+", Iuv: "+iuv+"] completata.");
} catch (NotFoundException nfe) {
ctx.getApplicationLogger().log("incasso.iuvNonTrovato", iuv);
throw new IncassiException(FaultType.PAGAMENTO_NON_TROVATO, "Lo IUV " + iuv + " estratto dalla causale di incasso non identifica alcun pagamento per il creditore " + incasso.getCodDominio());
Expand All @@ -420,11 +433,11 @@ private RichiestaIncassoDTOResponse eseguiAcquisizioneRiconciliazione(RichiestaI
Fr fr = null;
if(idf != null) {
try {
log.debug("Ricerca flusso per riversamento cumulativo [Dominio: "+codDomino+", IdFlusso: "+idf+"]...");
log.debug("Ricerca flusso per riversamento cumulativo [Dominio:"+codDomino+", IdFlusso: "+idf+"]...");
// Cerco l'idf come case insensitive
fr = frBD.getFr(idf, ricercaIdFlussoCaseInsensitive);
richiestaIncassoResponse.setFr(fr);
log.debug("Ricerca flusso per riversamento cumulativo [Dominio: "+codDomino+", IdFlusso: "+idf+"] completata.");
log.debug("Ricerca flusso per riversamento cumulativo [Dominio:"+codDomino+", IdFlusso: "+idf+"] completata.");
if(!fr.getStato().equals(StatoFr.ACCETTATA)) {
ctx.getApplicationLogger().log("incasso.frAnomala", idf);
throw new IncassiException(FaultType.FR_ANOMALA, "Il flusso di rendicontazione " + idf + " identificato dalla causale di incasso risulta avere delle anomalie");
Expand Down Expand Up @@ -538,7 +551,7 @@ private RichiestaIncassoDTOResponse eseguiAcquisizioneRiconciliazione(RichiestaI
for(it.govpay.bd.model.Pagamento pagamento : pagamenti) {
if(Stato.INCASSATO.equals(pagamento.getStato())) {
ctx.getApplicationLogger().log("incasso.pagamentoGiaIncassato", pagamento.getCodDominio(), pagamento.getIuv(), pagamento.getIur());
throw new IncassiException(FaultType.PAGAMENTO_GIA_INCASSATO, "Uno dei pagamenti incassati [Dominio:" + pagamento.getCodDominio() + " Iuv:" + pagamento.getIuv() + " Iur:" + pagamento.getIur() + "] risuta gia' incassato.");
throw new IncassiException(FaultType.PAGAMENTO_GIA_INCASSATO, "Uno dei pagamenti [Dominio:" + pagamento.getCodDominio() + " Iuv:" + pagamento.getIuv() + " Iur:" + pagamento.getIur() + "] risuta gia' riconciliato.");
}
}

Expand Down Expand Up @@ -568,7 +581,7 @@ private RichiestaIncassoDTOResponse eseguiAcquisizioneRiconciliazione(RichiestaI
incassiBD.commit();
gpContext.getEventoCtx().setIdIncasso(incasso.getId());

log.debug("Riconciliazione [Dominio: "+codDomino+", Id: "+idRiconciliazione+"] Iuv ["+iuv+"], IdFlusso ["+idf+"], Causale ["+causale+"] completata con esito OK.");
log.debug("Riconciliazione [Dominio:"+codDomino+", Id: "+idRiconciliazione+"] Iuv ["+iuv+"], IdFlusso ["+idf+"], Causale ["+causale+"] completata con esito OK.");
} catch(Exception e) {
incassiBD.rollback();
throw new GovPayException(e);
Expand Down Expand Up @@ -758,24 +771,6 @@ public RichiestaIncassoDTOResponse richiestaIncasso(RichiestaIncassoDTO richiest
throw new GovPayException(e);
}

// // Controllo se l'idf o lo iuv sono gia' stati incassati in precedenti incassi
// IncassoFilter incassoFilter = incassiBD.newFilter();
// List<String> codDomini = new ArrayList<>();
// codDomini.add(richiestaIncasso.getCodDominio());
// incassoFilter.setCodDomini(codDomini);
// if(idf != null)
// incassoFilter.setCausale(idf);
// else
// incassoFilter.setCausale(iuv);
// List<Incasso> findAll = incassiBD.findAll(incassoFilter);
// if(findAll.size() != 0) {
// ctx.getApplicationLogger().log("incasso.causaleGiaIncassata", causale);
// if(idf != null)
// throw new IncassiException(FaultType.CAUSALE_GIA_INCASSATA, "Il flusso di rendicontazione [" + idf + "] indicato in causale risulta gia' incassato");
// else
// throw new IncassiException(FaultType.CAUSALE_GIA_INCASSATA, "Lo iuv [" + iuv + "] indicato in causale risulta gia' incassato");
// }

// Sto selezionando i pagamenti per impostarli come Incassati.
incassiBD.setupConnection(configWrapper.getTransactionID());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ public enum FaultType {
DUPLICATO("021409","Riconciliazione duplicata."),
DOMINIO_INESISTENTE("021410","Dominio inesistente."),
CAUSALE_GIA_INCASSATA("021411","Riversamento gia' riconciliato."),
IBAN_INESISTENTE("021412","Iban inesistente.");
IBAN_INESISTENTE("021412","Iban inesistente."),
FLUSSO_GIA_INCASSATO("021413","Flusso gia riconciliata.");

private String faultSubCode;
private String description;
Expand Down
8 changes: 4 additions & 4 deletions src/main/resources/filters/template.filter.properties
Original file line number Diff line number Diff line change
Expand Up @@ -174,16 +174,16 @@ it.govpay.context.aggiornamentoValiditaMandatorio=false
it.govpay.client.connectionTimeout=10000

# Indica il read timeout
it.govpay.client.readTimeout=180000
it.govpay.client.readTimeout=120000

# Indica il timeout di attesa di una connessione dal connection manager
it.govpay.client.connectionRequestTimeout=180000
it.govpay.client.connectionRequestTimeout=120000

# Indica il numero massimo di connessioni per Pool
it.govpay.client.numeroMassimoConnessioniPerPool=200
it.govpay.client.numeroMassimoConnessioniPerPool=500

# Indica il numero massimo di connessioni per Route di default
it.govpay.client.numeroMassimoConnessioniPerRouteDefault=20
it.govpay.client.numeroMassimoConnessioniPerRouteDefault=50


# Govpay API BackOffice
Expand Down

0 comments on commit 1e31073

Please sign in to comment.