Skip to content

Commit

Permalink
Issue #341
Browse files Browse the repository at this point in the history
Corretta gestione dello stato del pagamento_portale durante le fasi di modifica dello stato delle RPT.
  • Loading branch information
pintorig committed Jun 30, 2021
1 parent 4743a4e commit 46f6b0f
Show file tree
Hide file tree
Showing 6 changed files with 235 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ And headers spidHeaders
And request pagamentoPost
When method post
Then status 502
And match response == { id: '#notnull', location: '#notnull', categoria : 'PAGOPA', codice : 'PAA_NODO_INDISPONIBILE', descrizione: '#notnull' }
And match response == { id: '#notnull', location: '#notnull', categoria : 'PAGOPA', codice : 'PAA_NODO_INDISPONIBILE', descrizione: '#notnull' , dettaglio: '#notnull'}

Given url pagamentiBaseurl
And path '/pagamenti/', response.id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,149 @@ And headers spidHeaders
And request pagamentoPost
When method post
Then status 502
And match response == { id: '#notnull', location: '#notnull', categoria : 'PAGOPA', codice : 'PAA_NODO_INDISPONIBILE', descrizione: '#notnull' }
And match response == { id: '#notnull', location: '#notnull', categoria : 'PAGOPA', codice : 'PAA_NODO_INDISPONIBILE', descrizione: '#notnull', dettaglio: '#notnull' }

Given url pagamentiBaseurl
And path '/pagamenti/', response.id
And headers basicAutenticationHeader
When method get
Then status 200
And match response.stato == 'FALLITO'

Given url pagamentiBaseurl
And path '/rpp'
And param idPendenza = idPendenza
And param idA2A = pendenza.idA2A
And headers basicAutenticationHeader
When method get
Then status 200
And match response ==
"""
{
numRisultati: 1,
numPagine: 1,
risultatiPerPagina: 25,
pagina: 1,
prossimiRisultati: '##null',
risultati: '#[1]'
}
"""
And match response.risultati[0].pendenza.idPendenza == '#(""+idPendenza)'
And match response.risultati[0].rt == '#notpresent'
And match response.risultati[0].stato == 'RPT_ERRORE_INVIO_A_NODO'

* callonce read('classpath:utils/govpay-op-acquisisci-verifica-transazioni-pendenti.feature')

Given url pagamentiBaseurl
And path '/rpp'
And param idPendenza = idPendenza
And param idA2A = pendenza.idA2A
And headers basicAutenticationHeader
When method get
Then status 200
And match response ==
"""
{
numRisultati: 1,
numPagine: 1,
risultatiPerPagina: 25,
pagina: 1,
prossimiRisultati: '##null',
risultati: '#[1]'
}
"""
And match response.risultati[0].pendenza.idPendenza == '#(""+idPendenza)'
And match response.risultati[0].rt == '#notpresent'
And match response.risultati[0].stato == 'RPT_ERRORE_INVIO_A_NODO'

Scenario: Nodo dei pagamenti in errore 2

* def intermediario = read('classpath:configurazione/v1/msg/intermediario.json')

Given url backofficeBaseurl
And path 'intermediari', idIntermediario
And headers gpAdminBasicAutenticationHeader
And request intermediario
When method put
Then assert responseStatus == 200 || responseStatus == 201

* call read('classpath:configurazione/v1/operazioni-resetCache.feature')

* def idPendenza = getCurrentTimeMillis()
* def pendenza = read('classpath:test/api/pendenza/v2/pendenze/put/msg/pendenza-put_monovoce_riferimento.json')
* set pendenza.importo = 999.01
* set pendenza.voci[0].importo = 999.01

* def basicAutenticationHeader = getBasicAuthenticationHeader( { username: idA2A, password: pwdA2A } )
Given url pendenzeBaseurl
And path 'pendenze', idA2A, idPendenza
And headers basicAutenticationHeader
And request pendenza
When method put
Then status 201

* def numeroAvviso = response.numeroAvviso
* def pagamentiBaseurl = getGovPayApiBaseUrl({api: 'pagamento', versione: 'v2', autenticazione: 'spid'})
* def pagamentoPost = read('classpath:test/api/pagamento/v2/pagamenti/post/msg/pagamento-post_riferimento_pendenza.json')

Given url pagamentiBaseurl
And path '/pagamenti'
And headers spidHeaders
And request pagamentoPost
When method post
Then status 502
And match response == { id: '#notnull', location: '#notnull', categoria : 'PAGOPA', codice : 'PAA_NODO_INDISPONIBILE', descrizione: '#notnull' , dettaglio: '#notnull' }

Given url pagamentiBaseurl
And path '/pagamenti/', response.id
And headers basicAutenticationHeader
When method get
Then status 200
And match response.stato == 'FALLITO'

Given url pagamentiBaseurl
And path '/rpp'
And param idPendenza = idPendenza
And param idA2A = pendenza.idA2A
And headers basicAutenticationHeader
When method get
Then status 200
And match response ==
"""
{
numRisultati: 1,
numPagine: 1,
risultatiPerPagina: 25,
pagina: 1,
prossimiRisultati: '##null',
risultati: '#[1]'
}
"""
And match response.risultati[0].pendenza.idPendenza == '#(""+idPendenza)'
And match response.risultati[0].rt == '#notpresent'
And match response.risultati[0].stato == 'RPT_ATTIVATA'

* callonce read('classpath:utils/govpay-op-acquisisci-verifica-transazioni-pendenti.feature')

Given url pagamentiBaseurl
And path '/rpp'
And param idPendenza = idPendenza
And param idA2A = pendenza.idA2A
And headers basicAutenticationHeader
When method get
Then status 200
And match response ==
"""
{
numRisultati: 1,
numPagine: 1,
risultatiPerPagina: 25,
pagina: 1,
prossimiRisultati: '##null',
risultati: '#[1]'
}
"""
And match response.risultati[0].pendenza.idPendenza == '#(""+idPendenza)'
And match response.risultati[0].rt == '#notpresent'
And match response.risultati[0].stato == 'RPT_ERRORE_INVIO_A_NODO'

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Feature: Acquisizione delle rendicontazioni

Background:

* def basicAutenticationHeader = getBasicAuthenticationHeader( { username: govpay_backoffice_user, password: govpay_backoffice_password } )
* def backofficeBaseurl = getGovPayApiBaseUrl({api: 'backoffice', versione: 'v1', autenticazione: 'basic'})

Scenario:

Given url backofficeBaseurl
And path 'operazioni', 'recuperoRptPendenti'
And headers basicAutenticationHeader
When method get
Then assert responseStatus == 200
2 changes: 1 addition & 1 deletion jars/core/src/main/java/it/govpay/core/business/Rpt.java
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ public List<it.govpay.bd.model.Rpt> avviaTransazione(List<Versamento> versamenti
}
ctx.getApplicationLogger().log("rpt.invioRecoveryStatoRPTFail", ee.getMessage());
log.warn("Errore nella richiesta di stato RPT: " + ee.getMessage() + ". Recupero stato fallito.");
this.updateStatoRpt(rpts, StatoRpt.RPT_ERRORE_INVIO_A_NODO, "Impossibile comunicare con il Nodo dei Pagamenti SPC: " + e.getMessage(), pagamentoPortale, null);
this.updateStatoRpt(rpts, StatoRpt.RPT_ERRORE_INVIO_A_NODO, "Impossibile comunicare con il Nodo dei Pagamenti SPC: " + e.getMessage(), pagamentoPortale, e);
throw new GovPayException(EsitoOperazione.NDP_000, e, "Errore nella consegna della richiesta di pagamento al Nodo dei Pagamenti");
} finally {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@ public static void aggiornaPagamentoPortale(Long idPagamentoPortale, BasicBD bd)
int numeroEseguiti = 0;
int numeroNonEseguiti = 0;
int numeroFalliti = 0;
String descrizioneStato = null;
//int numeroResidui = 0;
for (int i = 0; i <findAll.size(); i++) {
Rpt rpt = findAll.get(i);
log.debug("RPT corrente ["+rpt.getId()+"] Stato ["+rpt.getStato()+ "] EsitoPagamento ["+rpt.getEsitoPagamento()+"]");
log.debug("AAAAA RPT corrente ["+rpt.getId()+"] Stato ["+rpt.getStato()+ "] EsitoPagamento ["+rpt.getEsitoPagamento()+"]");
StatoRpt stato = rpt.getStato();
if(it.govpay.model.Rpt.stati_pendenti.contains(stato)) {
// rpt.getEsitoPagamento() == null) {
Expand All @@ -78,7 +79,10 @@ public static void aggiornaPagamentoPortale(Long idPagamentoPortale, BasicBD bd)
|| stato.equals(StatoRpt.RPT_RIFIUTATA_PSP)) {
numeroFalliti ++;
}
else {
else if(stato.equals(StatoRpt.RPT_ERRORE_INVIO_A_NODO)) {
descrizioneStato = "Errore nella spedizione della richiesta di pagamento a pagoPA";
numeroFalliti ++;
} else {
if(rpt.getEsitoPagamento() != null) {
if(rpt.getEsitoPagamento().equals(EsitoPagamento.PAGAMENTO_ESEGUITO)) {
numeroEseguiti ++;
Expand All @@ -94,7 +98,7 @@ public static void aggiornaPagamentoPortale(Long idPagamentoPortale, BasicBD bd)
}
}

log.debug("Esito analisi rpt Update ["+updateStato+"] #OK ["+numeroEseguiti+"], #KO ["+numeroNonEseguiti+"], #Fallite ["+numeroFalliti+"]");
log.debug("AAAAA Esito analisi rpt Update ["+updateStato+"] #OK ["+numeroEseguiti+"], #KO ["+numeroNonEseguiti+"], #Fallite ["+numeroFalliti+"]");

if(updateStato) {
if(numeroFalliti == findAll.size()) {
Expand All @@ -110,14 +114,14 @@ public static void aggiornaPagamentoPortale(Long idPagamentoPortale, BasicBD bd)
pagamentoPortale.setStato(STATO.ESEGUITO_PARZIALE);
pagamentoPortale.setCodiceStato(CODICE_STATO.PAGAMENTO_PARZIALMENTE_ESEGUITO);
}

pagamentoPortale.setDescrizioneStato(descrizioneStato);

} else {
pagamentoPortale.setStato(STATO.IN_CORSO);
pagamentoPortale.setCodiceStato(CODICE_STATO.PAGAMENTO_IN_ATTESA_DI_ESITO);
}

log.debug("Nuovo Stato ["+pagamentoPortale.getStato()+"]");
log.debug("AAAAA Nuovo Stato ["+pagamentoPortale.getStato()+"]");

pagamentiPortaleBD.updatePagamento(pagamentoPortale, false, true);

Expand Down
72 changes: 72 additions & 0 deletions jars/core/src/main/java/it/govpay/core/utils/RptUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,15 @@
import it.govpay.bd.model.Dominio;
import it.govpay.bd.model.Evento;
import it.govpay.bd.model.Notifica;
import it.govpay.bd.model.PagamentoPortale;
import it.govpay.bd.model.Rpt;
import it.govpay.bd.model.Stazione;
import it.govpay.bd.model.UnitaOperativa;
import it.govpay.bd.model.PagamentoPortale.CODICE_STATO;
import it.govpay.bd.model.PagamentoPortale.STATO;
import it.govpay.bd.model.eventi.DatiPagoPA;
import it.govpay.bd.pagamento.EventiBD;
import it.govpay.bd.pagamento.PagamentiPortaleBD;
import it.govpay.bd.pagamento.RptBD;
import it.govpay.core.beans.EsitoOperazione;
import it.govpay.core.exceptions.GovPayException;
Expand Down Expand Up @@ -223,6 +227,8 @@ public static boolean aggiornaRptDaNpD(Intermediario intermediario, Rpt rpt) thr

rptBD.setAtomica(false);

rptBD.setAutoCommit(false);

rptBD.enableSelectForUpdate();

Rpt rpt_attuale = rptBD.getRpt(rpt.getId());
Expand All @@ -240,7 +246,31 @@ public static boolean aggiornaRptDaNpD(Intermediario intermediario, Rpt rpt) thr
rpt.setDescrizioneStato("Stato aggiornato in fase di recupero pendenti.");

rptBD.disableSelectForUpdate();

//aggiorno lo stato del pagamento portale
Long idPagamentoPortale = rpt.getIdPagamentoPortale();
if(idPagamentoPortale != null) {
PagamentoPortaleUtils.aggiornaPagamentoPortale(idPagamentoPortale, rptBD);
}

rptBD.commit();
} catch (ServiceException e) {
if(!rptBD.isAutoCommit()) {
rptBD.rollback();
}

throw e;
} catch (NotFoundException e) {
if(!rptBD.isAutoCommit()) {
rptBD.rollback();
}

throw e;
} finally {
if(!rptBD.isAutoCommit()) {
rptBD.setAutoCommit(false);
}

if(rptBD != null)
rptBD.closeConnection();
}
Expand Down Expand Up @@ -322,6 +352,8 @@ public static boolean aggiornaRptDaNpD(Intermediario intermediario, Rpt rpt) thr

rptBD.setAtomica(false);

rptBD.setAutoCommit(false);

rptBD.enableSelectForUpdate();
// Controllo che lo stato sia ancora quello originale per il successivo aggiornamento
Rpt rpt_attuale = rptBD.getRpt(rpt.getId());
Expand All @@ -331,8 +363,34 @@ public static boolean aggiornaRptDaNpD(Intermediario intermediario, Rpt rpt) thr
return false;
}
rptBD.updateRpt(rpt.getId(), StatoRpt.RPT_ERRORE_INVIO_A_NODO, "Stato sul nodo: PPT_RPT_SCONOSCIUTA", null, null,null);

rptBD.disableSelectForUpdate();
//aggiorno lo stato del pagamento portale
Long idPagamentoPortale = rpt.getIdPagamentoPortale();
if(idPagamentoPortale != null) {
PagamentoPortaleUtils.aggiornaPagamentoPortale(idPagamentoPortale, rptBD);
}

rptBD.commit();
} catch (ServiceException e) {
if(!rptBD.isAutoCommit()) {
rptBD.rollback();
}

throw e;
} catch (NotFoundException e) {
if(!rptBD.isAutoCommit()) {
rptBD.rollback();
}

throw e;
} finally {


if(!rptBD.isAutoCommit()) {
rptBD.setAutoCommit(false);
}

if(rptBD != null)
rptBD.closeConnection();
}
Expand Down Expand Up @@ -528,6 +586,8 @@ public static boolean aggiornaRptDaNpD(Intermediario intermediario, Rpt rpt) thr

rptBD2.setAtomica(false);

rptBD2.setAutoCommit(false);

rptBD2.enableSelectForUpdate();

Rpt rpt_attuale = rptBD2.getRpt(rpt.getId());
Expand All @@ -542,6 +602,18 @@ public static boolean aggiornaRptDaNpD(Intermediario intermediario, Rpt rpt) thr
rpt.setStato(nuovoStato);
rpt.setDescrizioneStato("Stato acquisito da Nodo dei Pagamenti");
rptBD2.disableSelectForUpdate();

// aggiornamento del pagamento portale
Long idPagamentoPortale = rpt.getIdPagamentoPortale();
if(idPagamentoPortale != null) {
PagamentoPortaleUtils.aggiornaPagamentoPortale(idPagamentoPortale, rptBD2);
}

rptBD2.commit();
}catch(ServiceException e) {
if(!rptBD2.isAutoCommit())
rptBD2.rollback();
throw e;
} finally {
if(rptBD2 != null)
rptBD2.closeConnection();
Expand Down

0 comments on commit 46f6b0f

Please sign in to comment.