From 7eb3e594e0193f13d62793158634919b8735342e Mon Sep 17 00:00:00 2001 From: Simone Esposito Date: Tue, 24 Dec 2024 13:05:18 +0100 Subject: [PATCH] add db layer --- .gitignore | 5 + Dockerfile | 67 +--- bootstrap.php | 54 +++ composer.json | 26 +- src/database/AbstractSingleRow.php | 508 ++++++++++++++++++++++++++++ src/database/SingleRowException.php | 8 + tests/phpunit.xml | 220 ------------ 7 files changed, 605 insertions(+), 283 deletions(-) create mode 100644 bootstrap.php create mode 100644 src/database/AbstractSingleRow.php create mode 100644 src/database/SingleRowException.php diff --git a/.gitignore b/.gitignore index 5510fcf1..becb9789 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,11 @@ obj/ /src/vendor/ /src/vendor/**/.git /src/tests/.phpunit.result.cache +/vendor/ +/vendor/**/.git +/tests/.phpunit.result.cache old/ trash/ +composer.lock +.*env diff --git a/Dockerfile b/Dockerfile index 0f0a3de2..51d463d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,54 +1,15 @@ -FROM php:8.2-fpm - - -RUN apt -y update -y && apt -y upgrade && apt -y install git libpq-dev libzip-dev zip libmemcached-dev && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && docker-php-ext-install pdo pdo_pgsql pgsql && docker-php-ext-install zip -RUN cd /tmp && curl -k https://getcomposer.org/installer -o composer-setup.php && php composer-setup.php && mv composer.phar /usr/local/bin/composer && rm -f composer-setup.php - -RUN pecl install memcached && docker-php-ext-enable memcached && mv /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini - -USER root:root +FROM composer:latest as composer +RUN mkdir -p /tmp/repo +COPY . /tmp/repo/ +WORKDIR /tmp/repo +RUN composer install --no-dev -# git clone del progetto che deve andare a finire in /var/www/html/crawler -# run del comando composer install dalla directory /var/www/html/crawler - -# from https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md -# remove all .git directory from installed dependencies -# find vendor/ -type d -name ".git" -exec rm -rf {} \; -# -# Add a .gitignore rule (/vendor/**/.git) - - -# valutare questo dockerfile -## Uso una build per effettuare il clone del repository. Il comando git non mi servirà più quindi è inutile installarlo nella build finale -## FROM alpine:latest as git_repo -## RUN apk upgrade && apk update && apk add git -## WORKDIR /tmp -## RUN git clone https://github.com/pagopa/pagopa-qi-log-crawler -## -## -## -## -## Uso la build di composer nella quale copio il repository precedentemente clonato, e lancio il composer install -## Anche in questo caso composer serve solo per effettuare il download delle dipendenze, quindi è inutile installarlo nella build finale -## FROM composer:latest as composer -## RUN mkdir -p /tmp/repo -## COPY --from=git_repo /tmp/pagopa-qi-log-crawler/src /tmp/repo/ -## WORKDIR /tmp/repo -## RUN composer install -## -## Uso php-fpm ed installo alcuni modulo (forse libzip si può eliminare , serviva a composer) -## FROM php:8.2-fpm -## RUN apt -y update && \ -## apt -y upgrade && \ -## apt -y install libpq-dev libzip-dev zip libmemcached-dev cron && \ -## docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \ -## docker-php-ext-install pdo pdo_pgsql pgsql zip && \ -## pecl install memcached && \ -## docker-php-ext-enable memcached && \ -## /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini && \ -## mkdir -p /var/www/html/sherlock -## COPY --from=composer /tmp/repo/ /var/www/html/sherlock -## -## -## valutare https://packagist.org/packages/predis/predis per la connessione a Redis. -## se si usa redis eliminare dalla build le dipendenze di memcache \ No newline at end of file +FROM php:8.2-fpm +COPY --from=composer /tmp/repo /var/www/html +RUN apt -y update && \ + apt -y upgrade && \ + apt -y install curl libpq-dev libzip-dev zip && \ + docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \ + docker-php-ext-install pdo pdo_pgsql pgsql && \ + docker-php-ext-install zip && \ + mv /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini \ No newline at end of file diff --git a/bootstrap.php b/bootstrap.php new file mode 100644 index 00000000..ea464aaf --- /dev/null +++ b/bootstrap.php @@ -0,0 +1,54 @@ +load(); + +use Illuminate\Database\Capsule\Manager as Capsule; + +$data = [ + 'config_instance' => + [ + 'driver' => $_ENV['DB_CONFIG_INSTANCE_DRIVER'], + 'host' => $_ENV['DB_CONFIG_INSTANCE_HOST'], + 'port' => $_ENV['DB_CONFIG_INSTANCE_PORT'], + 'database' => $_ENV['DB_CONFIG_INSTANCE_DATABASE'], + 'username' => $_ENV['DB_CONFIG_INSTANCE_USERNAME'], + 'password' => $_ENV['DB_CONFIG_INSTANCE_PASSWORD'], + 'charset' => $_ENV['DB_CONFIG_INSTANCE_CHARSET'], + 'collation' => $_ENV['DB_CONFIG_INSTANCE_COLLATION'], + ], + 'data_instance' => + [ + 'driver' => $_ENV['DB_DATA_INSTANCE_DRIVER'], + 'host' => $_ENV['DB_DATA_INSTANCE_HOST'], + 'port' => $_ENV['DB_DATA_INSTANCE_PORT'], + 'database' => $_ENV['DB_DATA_INSTANCE_DATABASE'], + 'username' => $_ENV['DB_DATA_INSTANCE_USERNAME'], + 'password' => $_ENV['DB_DATA_INSTANCE_PASSWORD'], + 'charset' => $_ENV['DB_DATA_INSTANCE_CHARSET'], + 'collation' => $_ENV['DB_DATA_INSTANCE_COLLATION'], + ], + 'history_instance' => + [ + 'driver' => $_ENV['DB_HISTORY_INSTANCE_DRIVER'], + 'host' => $_ENV['DB_HISTORY_INSTANCE_HOST'], + 'port' => $_ENV['DB_HISTORY_INSTANCE_PORT'], + 'database' => $_ENV['DB_HISTORY_INSTANCE_DATABASE'], + 'username' => $_ENV['DB_HISTORY_INSTANCE_USERNAME'], + 'password' => $_ENV['DB_HISTORY_INSTANCE_PASSWORD'], + 'charset' => $_ENV['DB_HISTORY_INSTANCE_CHARSET'], + 'collation' => $_ENV['DB_HISTORY_INSTANCE_COLLATION'], + ] +]; + +$capsule = new Capsule; +foreach($data as $name => $config) +{ + $capsule->addConnection($config, $name); +} + +$capsule->setAsGlobal(); +$capsule->bootEloquent(); \ No newline at end of file diff --git a/composer.json b/composer.json index ad74c135..90d650ef 100644 --- a/composer.json +++ b/composer.json @@ -1,15 +1,21 @@ { - "name": "$vendor_name$/$package_name$", - "description": "$description$", - "minimum-stability": "$stability$", - "license": "$license$", - "authors": [ - { - "name": "$author$", - "email": "$email$" + "name" : "pagopa/crawler", + "author": "Simone Esposito", + "autoload": { + "psr-4": { + "pagopa\\sert\\": "src/" } - ], + }, "require": { - $END$ + "illuminate/database": "10.39.0", + "predis/predis": "v2.2.2", + "vlucas/phpdotenv": "v5.6.1", + "ext-xmlreader": "*", + "ext-simplexml": "*", + "ext-libxml": "*", + "ext-pdo": "*" + }, + "require-dev": { + "phpunit/phpunit": "11.0.1" } } \ No newline at end of file diff --git a/src/database/AbstractSingleRow.php b/src/database/AbstractSingleRow.php new file mode 100644 index 00000000..979ade5e --- /dev/null +++ b/src/database/AbstractSingleRow.php @@ -0,0 +1,508 @@ +AbstractSingleRow + *

+ * La classe AbstractSingleRow rappresenta una riga singola di una tabella in un database. + * Offre funzionalità per la gestione di operazioni comuni sui database come insert e update, + * inclusa la preparazione dei dati e dei parametri di bind associati. + *

+ *

Esempi di utilizzo

+ *

1. Inserimento di una nuova riga

+ * + * + * // extend & configure AbstractSingleRow + * class MyRow extends AbstractSingleRow { + * protected string $table = 'MyTable'; + * + * protected array $primary_keys = array('id', 'date_event'); + * + * protected array $need_primary_keys = array('date_event'); + * + * } + * + * + * + * $row = new MyRow(); + * $row->setReadyColumnValue('colonna1', 'valore1') + * ->setReadyColumnValue('colonna2', 'valore2') + * ->setReadyColumnValue('date_event', '2024-12-01') + * ->insert(); + * $row->getQueryString(); // Restituisce la query SQL completa INSERT INTO MyTable (date_event, colonna1, colonna2) values (:date_event, :colonna1, :colonna2) + * $row->getBindParams(); Restituisce i parametri di binding // array(':date_event' => '2024-12-01', ':colonna1' => 'valore1', ':colonna2' => 'valore2') + * + * + *

2. Aggiornamento di una riga esistente

+ * + * + * $row = MyRow::createFromRow(array('id' => 10993, 'date_event' => '2024-12-01', 'colonna1' => 'valore1', 'colonna2' => 'valore2')) + * $row->setReadyColumnValue('colonna1', 'nuovoValore') + * ->update(); + * $row->getQueryString(); // Restituisce la query SQL per l'aggiornamento UPDATE MyTable SET colonna1 = :colonna1 WHERE id = :id AND date_event = :date_event + * $row->getBindParams(); // Restituisce i parametri di binding array(':id' => 10993, ':date_event' => '2024-12-01', ':colonna1' => 'nuovoValore'); + * + * + * + */ +class AbstractSingleRow +{ + + /** + * Nome della tabella + * @var string + */ + protected string $table; + + + /** + * Contiene le primary keys della tabella appartenente a questa riga + * @var array + */ + protected array $primary_keys = []; + + + /** + * Contiene le primary keys sufficienti ad una insert. + * Usata per quelle insert dove una primary keys equivale ad una sequence e non è necessario + * indicarla nella query + * @var array + */ + protected array $need_primary_keys = []; + + + /** + * Dati da utilizzare nel caso in cui si conoscano già i dati della riga + * @var array + */ + protected array $data = []; + + + /** + * Valori da inserire e/o aggiornare (insert/update)) + * @var array + */ + protected array $newData = []; + + + /** + * Unique id + * @var string + */ + protected string $unique; + + + /** + * Indica se i valori per lo statement sono già stati preparati + * @var bool + */ + protected bool $alreadyGenerated = false; + + + /** + * Contiene la query elaborata + * @var string + */ + + protected string $query; + + + /** + * Contiene i bindParams per le operazioni di insert/update + * @var array + */ + protected array $bindParams = []; + + + /** + * Costruttore della classe. + * @param string $table + * @param array $primary_keys + * @param array $need_primary_keys + */ + public function __construct(string $table = '', array $primary_keys = [], array $need_primary_keys = []) + { + $this->setTable($table); + $this->setPrimaryKeys($primary_keys); + $this->setNeededPrimaryKeys($need_primary_keys); + $this->unique = uniqid(); + + } + + /** + * Imposta il nome della tabella + * @param string $table + * @return $this + */ + public function setTable(string $table) : self + { + if ($table !== '') + { + $this->table = $table; + } + return $this; + } + + /** + * Restituisce il nome della tabella + * @return string + */ + public function getTable() : string + { + return $this->table; + } + + /** + * Imposta le primary keys della riga + * @param array $primary_keys + * @return $this + */ + public function setPrimaryKeys(array $primary_keys) : self + { + if (count($primary_keys) > 0) + { + $this->primary_keys = $primary_keys; + } + return $this; + } + + /** + * Restituisce le primary keys della riga + * @return array + */ + public function getPrimaryKeys() : array + { + return $this->primary_keys; + } + + /** + * Configura le primary key sufficienti per una insert + * @param array $need_primary_keys + * @return $this + */ + public function setNeededPrimaryKeys(array $need_primary_keys) : self + { + if (count($need_primary_keys) > 0) + { + $this->need_primary_keys = $need_primary_keys; + } + return $this; + } + + /** + * Restituisce le primary key sufficienti per una insert + * @return array + */ + public function getNeededPrimaryKeys() : array + { + return $this->need_primary_keys; + } + + /** + * Imposta i dati della riga se già si conoscono + * @param array $data + * @return $this + */ + public function setData(array $data) : self + { + if (count($data) > 0) + { + $this->data = $data; + } + return $this; + } + + /** + * Restituisce i dati della riga se si conoscono + * @return array + */ + public function getData() : array + { + return $this->data; + } + + /** + * Restituisce il valore di una colonna della riga + * @param string $column + * @return mixed + */ + public function getColumn(string $column) : mixed + { + return (array_key_exists($column, $this->data)) ? $this->data[$column] : null; + } + + /** + * Configura il valore di una colonna (non configura il valore da inserire/modificare) + * @param string $column + * @param mixed $value + * @return $this + */ + public function setColumn(string $column, mixed $value) : self + { + $this->data[$column] = $value; + return $this; + } + + /** + * Restituisce il valore di una colonna pronta per l'aggiornamento/inserimento + * @param string $column + * @return mixed + */ + public function getReadyColumnValue(string $column) : mixed + { + return (array_key_exists($column, $this->newData)) ? $this->newData[$column] : null; + } + + /** + * Configura il valore di una colonna pronta per l'aggiornamento/inserimento + * @param string $column + * @param mixed $value + * @return $this + */ + public function setReadyColumnValue(string $column, mixed $value) : self + { + $this->newData[$column] = $value; + $this->alreadyGenerated = false; + return $this; + } + + + /** + * Rimuove una colonna dalla lista dei valori pronti per l'aggiornamento/inserimento + * @param string $column + * @return $this + */ + public function removeReadyColumnValue(string $column) : self + { + if (array_key_exists($column, $this->newData)) + { + unset($this->newData[$column]); + } + $this->alreadyGenerated = false; + return $this; + } + + /** + * Restituisce tutta la riga + * @return array + */ + public function getRow() : array + { + return $this->data; + } + + /** + * Restituisce un id univoco usato per le colonne nelle operazioni di bind dei valori + * @return string + */ + public function getUnique() : string + { + return $this->unique; + } + + /** + * Verifica se nell'array dei dati da aggiornare sono presenti le primary key per una update + * @return void + * @throws \Exception + */ + public function checkPrimaryKeys() : void + { + foreach($this->getPrimaryKeys() as $primaryKey) + { + if (!array_key_exists($primaryKey, $this->newData)) + { + throw new \Exception(sprintf("Primary key '%s' does not exist", $primaryKey)); + } + } + } + + /** + * Verifica se nell'array di dati da inserire sono presenti le primary key per una insert + * @return void + * @throws SingleRowException + */ + public function checkNeedPrimaryKeys() : void + { + foreach($this->getNeededPrimaryKeys() as $column) + { + if (!array_key_exists($column, $this->newData)) + { + throw new SingleRowException(sprintf("Need Column '%s' does not exist", $column)); + } + } + } + + /** + * Prepara i dati (statement e bind values) per una operazione di inserimento + * @return $this + */ + public function insert() : self + { + // insert into table_name(column_1, column_2, column_3) values(value_1, value_2, value_3) + + if ($this->alreadyGenerated) + { + return $this; + } + try { + $this->checkNeedPrimaryKeys(); + // dato che le colonne necessarie all'insert ci sono, creo i bindParams + $value_binds = []; + foreach($this->newData as $column => $value) + { + $value_binds[sprintf(':%s_%s', $this->getUnique(), $column)] = $value; + } + + $query = sprintf('INSERT INTO %s(%s) VALUES(%s)', + $this->getTable(), + implode(',', array_keys($this->newData)), + implode(', ', array_keys($value_binds))); + $this->query = $query; + $this->bindParams = $value_binds; + $this->alreadyGenerated = true; + } + catch (\Exception $e) + { + echo sprintf('Exception: %s -> %s', get_class($e), $e->getMessage()); + } + + return $this; + } + + + /** + * Prepara i dati per una operazione di aggiornamento + * @return $this + */ + public function update() : self + { + if ($this->alreadyGenerated) + { + return $this; + } + + try { + $this->checkPrimaryKeys(); + // remove primary keys from newData + $newData = $this->newData; + $pkValues = []; + $value_binds = []; + foreach($this->getPrimaryKeys() as $primaryKey) + { + // creo i bind per le primary key + $bindValue = sprintf(':%s_%s', $this->getUnique(), $primaryKey); + $pkValues[] = sprintf('%s = %s', $primaryKey, $bindValue); + $value_binds[$bindValue] = $newData[$primaryKey]; + unset($newData[$primaryKey]); + } + if (count($newData) == 0) + { + throw new \Exception(sprintf("No value(s) to add in '%s'", $this->getTable())); + } + $setValues = []; + foreach($newData as $column => $value) + { + // creo i bind per le colonne da modificare + $bindValue = sprintf(':%s_%s', $this->getUnique(), $column); + $setValues[] = sprintf('%s = %s',$column, $bindValue); // contiene tutte le colonne da aggiornare + $value_binds[$bindValue] = $value; + } + + $query = sprintf('UPDATE %s SET %s WHERE %s', + $this->getTable(), + implode(' , ', $setValues), + implode(' AND ', $pkValues)); + + $this->query = $query; + $this->bindParams = $value_binds; + } + catch (\Exception $e) + { + echo sprintf('Exception: %s -> %s', get_class($e), $e->getMessage()); + } + return $this; + } + + /** + * Restituisce la query da effettuare (compresa di bindColumn e bindValue) + * @return string + */ + public function getQueryString() : string + { + return $this->query; + } + + /** + * Restituisce la lista dei bind params + * @return array + */ + public function getBindParams() : array + { + return $this->bindParams; + } + + + /** + * Restituisce un array contenente la query e i bind params + * @return array + */ + public function getQueryAndBindParams() : array + { + return [ + 'query' => $this->getQueryString(), + 'bindParams' => $this->getBindParams(), + ]; + } + + /** + * Configura il valore di una colonna pronta per l'aggiornamento/inserimento + * @param string $column + * @param mixed $value + * @return void + */ + public function __set(string $column, mixed $value) : void + { + $this->newData[$column] = $value; + $this->alreadyGenerated = false; + } + + /** + * Restituisce il valore di una colonna pronta per l'aggiornamento/inserimento + * @param string $column + * @return mixed + */ + public function __get(string $column) : mixed + { + if (array_key_exists($column, $this->newData)) + { + return $this->newData[$column]; + } + return null; + } + + + /** + * Crea una classe static::class con dati già al suo interno + * @throws \ReflectionException + * @throws SingleRowException + */ + public static function createFromRow(array $row) : static + { + if (static::class === AbstractSingleRow::class) + { + throw new SingleRowException(sprintf("Non puoi creare oggetti di tipo %s", AbstractSingleRow::class)); + } + + $className = static::class; + $reflect = new ReflectionClass($className); + $instance = $reflect->newInstanceWithoutConstructor(); + $dataProperty = $reflect->getProperty('data'); + $dataProperty->setValue($instance, $row); + return $instance; + } + +} \ No newline at end of file diff --git a/src/database/SingleRowException.php b/src/database/SingleRowException.php new file mode 100644 index 00000000..325fab69 --- /dev/null +++ b/src/database/SingleRowException.php @@ -0,0 +1,8 @@ + - - - - - - - process/crawler/sendPaymentOutcomeV2/T00072_WorkflowWithSPOV2_ModUnico.php - - - process/crawler/activatePaymentNotice/SingleEvent/T00001_CreateAttemptAllInfoInEvent.php - process/crawler/activatePaymentNotice/SingleEvent/T00002_CreateAttemptNotAllInfoInEvent.php - process/crawler/activatePaymentNotice/SingleEvent/T00003_CreatePaymentAllInfoInEvent.php - process/crawler/activatePaymentNotice/SingleEvent/T00004_CreatePaymentNotAllInfoInEvent.php - process/crawler/activatePaymentNotice/SingleEvent/T00005_CreateNoPaymentNoInfo.php - process/crawler/activatePaymentNotice/SingleEvent/T00006_CreateAttemptAlreadyPresentInAnotherDayAllInfo.php - process/crawler/activatePaymentNotice/SingleEvent/T00007_CreateAttemptAlreadyPresentInAnotherDayNotAllInfo.php - process/crawler/activatePaymentNotice/SingleEvent/T00008_CreatePaymentAlreadyPresenteInAnotherDayAllInfoInEvent.php - process/crawler/activatePaymentNotice/SingleEvent/T00009_CreatePaymentAlreadyPresenteInAnotherDayNotAllInfoInEvent.php - process/crawler/activatePaymentNotice/BothEvents/T00011_CreateAttemptReqRespOneTransferAllInfoEvent.php - process/crawler/activatePaymentNotice/BothEvents/T00012_CreateAttemptReqRespTwoTransferAllInfoEvent.php - process/crawler/activatePaymentNotice/BothEvents/T00013_CreateAttemptReqRespOneTransferNotAllInfoEvent.php - process/crawler/activatePaymentNotice/BothEvents/T00014_CreateAttemptReqRespTwoTransferNotAllInfoEvent.php - process/crawler/activatePaymentNotice/BothEvents/T00015_CreatePaymentReqRespWithAllInfoAndFaultCode.php - process/crawler/activatePaymentNotice/BothEvents/T00016_CreateAttemptWith3TransferAndMetadata.php - process/crawler/nodoInviaCarrelloRPT/SingleEvent/T00020_CreateAttemptOneRPTOneTransfer.php - process/crawler/nodoInviaCarrelloRPT/SingleEvent/T00021_CreateAttemptOneRPTTwoTransfer.php - process/crawler/nodoInviaCarrelloRPT/SingleEvent/T00022_CreateAttemptTwoRPTTwoTransfer.php - process/crawler/nodoInviaCarrelloRPT/SingleEvent/T00023_CreateAttemptTwoRPTFirstRpt2TransferSecondRpt2Transfer1Bollo.php - process/crawler/nodoInviaCarrelloRPT/BothEvents/T00024_CreateAttemptOneRPT1TransferSameData.php - process/crawler/nodoInviaCarrelloRPT/BothEvents/T00025_CreateAttemptOneRPT2TransferSameData.php - process/crawler/nodoInviaCarrelloRPT/BothEvents/T00026_CreateAttemptTwoRPTTwoTransferForRPTSameData.php - process/crawler/nodoInviaCarrelloRPT/BothEvents/T00027_CreateAttemptTwoRPTTwoTransferForRPTWithResponseDifferentData.php - process/crawler/nodoInviaCarrelloRPT/BothEvents/T00028_CreateAttemptOneRPTTwoTransferWithFaultCodeInResponse.php - process/crawler/nodoInviaCarrelloRPT/BothEvents/T00029_CreateAttemptOneRPTTwoTransferWithSessionIdOriginalNotFound.php - process/crawler/sendPaymentOutcome/T00030_WorkflowPaymentMod3New2TransferSPOOK.php - process/crawler/sendPaymentOutcome/T00031_WorkflowPaymentMod3New2TransferSPOKO.php - process/crawler/sendPaymentOutcome/T00032_WorkflowPaymentMod3New2TransferSPOOKAndKO.php - process/crawler/sendPaymentOutcome/T00033_WorkflowPaymentMod3New1TransferMultipleSPOOK.php - process/crawler/sendPaymentOutcome/T00034_WorkflowPaymentMod3New1TransferSPOAnotherDay.php - process/crawler/pspInviaCarrelloRPT/T00040_UpdatePspWithNodoInviaCarrelloRPT_1_RPT.php - process/crawler/pspInviaCarrelloRPT/T00041_UpdatePspWithNodoInviaCarrelloRPT_1_RPT_FaultCode.php - process/crawler/pspInviaCarrelloRPT/T00042_UpdatePspWithNodoInviaCarrelloRPT_2_RPT.php - process/crawler/pspInviaCarrelloRPTCarte/T00043_UpdatePspWithNodoInviaCarrelloRPT_1_RPT_ExtraInfo.php - process/crawler/nodoInviaRPT/T00044_nodoInviaRPT_NoPreviousAttivaRPT.php - process/crawler/nodoAttivaRPT/T00045_nodoAttivaRPT_PreviousAttivaRPT.php - process/crawler/nodoAttivaRPT/T00046_nodoAttivaRPT_PreviousAttivaRPT_FaultCode.php - process/crawler/pspNotifyPayment/T00047_WorkFlow_WithPspNotifyPayment_CreditCard.php - process/crawler/pspNotifyPayment/T00048_WorkFlow_WithPspNotifyPayment_BancomatPay.php - process/crawler/pspNotifyPayment/T00049_WorkFlow_WithPspNotifyPayment_Paypal.php - process/crawler/nodoInviaRT/T00050_nodoInviaRT_Cart1RPT.php - process/crawler/nodoInviaRT/T00051_nodoInviaRT_Cart2RPT.php - process/crawler/paaInviaRT/T00052_paaInviaRT_Cart2RPT.php - process/crawler/activateIOPayment/T00053_activateIOPaymentNotice_2Transfer.php - process/crawler/activatePaymentNoticeV2/T00054_activatePaymentNoticeV2_2Transfer.php - process/crawler/activatePaymentNoticeV2/T00055_activatePaymentNoticeV2_MetadataTransferPayment.php - process/crawler/activatePaymentNoticeV2/T00056_activatePaymentNoticeV2_TransferWithBollo.php - process/crawler/activatePaymentNoticeV2/T00057_activatePaymentNoticeV2_WithFault.php - process/crawler/pspNotifyPaymentV2/T00058_pspNotifyPaymentV2_2Payment.php - process/crawler/nodoChiediInformazioniPagamento/T00059_WorkFlowWithNodoChiediInformazioniPagamento.php - process/crawler/nodoInoltraEsitoPagamentoCarta/T00060_WorkFlowWithNodoInoltraEsitoPagamento.php - process/crawler/nodoChiediAvanzamentoPagamento/T00061_WorkFlowWithNodoChiediAvanzamentoPagamento.php - process/crawler/closePaymentV1/T00062_WorkFlowWithClosePaymentV1.php - process/crawler/cdInfoWisp/T00063_WorkFlowWithCdInfoWisp.php - process/crawler/nodoInoltraEsitoPagamentoPayPal/T00064_WorkFlowWithNodoInoltraEsitoPagamentoPayPal.php - process/crawler/nodoNotificaAnnullamento/T00065_WorkflowWithAnnulloCarrelloRPT.php - process/crawler/nodoInoltraPagamentoMod1/T00066_WorkflowWithInoltroPagamentoMod1.php - process/crawler/nodoChiediCopiaRT/T00067_WorkflowWithNodoChiediCopiaRT.php - process/crawler/paGetPayment/T00068_WorkflowWithpaGetPayment.php - process/crawler/paSendRT/T00069_WorkflowWithpaSendRT.php - process/crawler/paGetPaymentV2/T00070_WorkflowWithPaGetPaymentV2.php - process/crawler/sendPaymentOutcomeV2/T00071_WorkflowWithSPOV2_Mod3.php - process/crawler/sendPaymentOutcomeV2/T00072_WorkflowWithSPOV2_ModUnico.php - - - - pagopa/methods/objects/RTTest.php - - - pagopa/database/SingleRowTest.php - pagopa/methods/req/activatePaymentNoticeTest.php - pagopa/methods/req/nodoInviaCarrelloRPTTest.php - pagopa/methods/req/sendPaymentOutcomeTest.php - pagopa/methods/req/pspInviaCarrelloRPTTest.php - pagopa/methods/req/pspInviaCarrelloRPTCarteTest.php - pagopa/methods/req/nodoInviaRPTTest.php - pagopa/methods/req/nodoAttivaRPTTest.php - pagopa/methods/req/pspNotifyPaymentTest.php - pagopa/methods/req/nodoInviaRTTest.php - pagopa/methods/req/paaInviaRTTest.php - pagopa/methods/req/activateIOPaymentTest.php - pagopa/methods/req/activatePaymentNoticeV2Test.php - pagopa/methods/req/pspNotifyPaymentV2Test.php - pagopa/methods/req/closePaymentV2Test.php - pagopa/methods/req/closePaymentV1Test.php - pagopa/methods/req/nodoChiediInformazioniPagamentoTest.php - pagopa/methods/req/nodoInoltraEsitoPagamentoCartaTest.php - pagopa/methods/req/nodoChiediAvanzamentoPagamentoTest.php - pagopa/methods/req/cdInfoWispTest.php - pagopa/methods/req/nodoInoltraEsitoPagamentoPayPalTest.php - pagopa/methods/req/nodoNotificaAnnullamentoTest.php - pagopa/methods/req/nodoInoltraPagamentoMod1Test.php - pagopa/methods/req/nodoChiediCopiaRTTest.php - pagopa/methods/req/paGetPaymentTest.php - pagopa/methods/req/paSendRTTest.php - pagopa/methods/req/paGetPaymentV2Test.php - pagopa/methods/req/sendPaymentOutcomeV2Test.php - - - pagopa/methods/resp/activatePaymentNoticeTest.php - pagopa/methods/resp/nodoInviaCarrelloRPTTest.php - pagopa/methods/resp/sendPaymentOutcomeTest.php - pagopa/methods/resp/pspInviaCarrelloRPTTest.php - pagopa/methods/resp/pspInviaCarrelloRPTCarteTest.php - pagopa/methods/resp/nodoInviaRPTTest.php - pagopa/methods/resp/nodoAttivaRPTTest.php - pagopa/methods/resp/pspNotifyPaymentTest.php - pagopa/methods/resp/nodoInviaRTTest.php - pagopa/methods/resp/paaInviaRTTest.php - pagopa/methods/resp/activateIOPaymentTest.php - pagopa/methods/resp/activatePaymentNoticeV2Test.php - pagopa/methods/resp/pspNotifyPaymentV2Test.php - pagopa/methods/resp/closePaymentV2Test.php - pagopa/methods/resp/closePaymentV1Test.php - pagopa/methods/resp/nodoChiediInformazioniPagamentoTest.php - pagopa/methods/resp/nodoInoltraEsitoPagamentoCartaTest.php - pagopa/methods/resp/nodoChiediAvanzamentoPagamentoTest.php - pagopa/methods/resp/cdInfoWispTest.php - pagopa/methods/resp/nodoInoltraEsitoPagamentoPayPalTest.php - pagopa/methods/resp/nodoNotificaAnnullamentoTest.php - pagopa/methods/resp/nodoInoltraPagamentoMod1Test.php - pagopa/methods/resp/nodoChiediCopiaRTTest.php - pagopa/methods/resp/paGetPaymentTest.php - pagopa/methods/resp/paSendRTTest.php - pagopa/methods/resp/paGetPaymentV2Test.php - pagopa/methods/resp/sendPaymentOutcomeV2Test.php - - - - pagopa/events/req/activatePaymentNoticeTest.php - pagopa/events/req/nodoInviaCarrelloRPTTest.php - pagopa/events/req/sendPaymentOutcomeTest.php - pagopa/events/req/pspInviaCarrelloRPTTest.php - pagopa/events/req/pspInviaCarrelloRPTCarteTest.php - pagopa/events/req/nodoInviaRPTTest.php - pagopa/events/req/nodoAttivaRPTTest.php - pagopa/events/req/pspNotifyPaymentTest.php - pagopa/events/req/nodoInviaRTTest.php - pagopa/events/req/paaInviaRTTest.php - pagopa/events/req/activateIOPaymentTest.php - pagopa/events/req/activatePaymentNoticeV2Test.php - pagopa/events/req/pspNotifyPaymentV2Test.php - pagopa/events/req/closePaymentV2Test.php - pagopa/events/req/closePaymentV1Test.php - pagopa/events/req/nodoChiediInformazioniPagamentoTest.php - pagopa/events/req/nodoInoltraEsitoPagamentoCartaTest.php - pagopa/events/req/nodoChiediAvanzamentoPagamentoTest.php - pagopa/events/req/cdInfoWispTest.php - pagopa/events/req/nodoInoltraEsitoPagamentoPayPalTest.php - pagopa/events/req/nodoNotificaAnnullamentoTest.php - pagopa/events/req/nodoInoltraPagamentoMod1Test.php - pagopa/events/req/nodoChiediCopiaRTTest.php - pagopa/events/req/paGetPaymentTest.php - pagopa/events/req/paSendRTTest.php - pagopa/events/req/paGetPaymentV2Test.php - pagopa/events/req/sendPaymentOutcomeV2Test.php - - - pagopa/events/resp/activatePaymentNoticeTest.php - pagopa/events/resp/nodoInviaCarrelloRPTTest.php - pagopa/events/resp/sendPaymentOutcomeTest.php - pagopa/events/resp/pspInviaCarrelloRPTTest.php - pagopa/events/resp/pspInviaCarrelloRPTCarteTest.php - pagopa/events/resp/nodoInviaRPTTest.php - pagopa/events/resp/nodoAttivaRPTTest.php - pagopa/events/resp/pspNotifyPaymentTest.php - pagopa/events/resp/nodoInviaRTTest.php - pagopa/events/resp/paaInviaRTTest.php - pagopa/events/resp/activateIOPaymentTest.php - pagopa/events/resp/pspNotifyPaymentV2Test.php - pagopa/events/resp/closePaymentV2Test.php - pagopa/events/resp/closePaymentV1Test.php - pagopa/events/resp/nodoChiediInformazioniPagamentoTest.php - pagopa/events/resp/nodoInoltraEsitoPagamentoCartaTest.php - pagopa/events/resp/nodoChiediAvanzamentoPagamentoTest.php - pagopa/events/resp/cdInfoWispTest.php - pagopa/events/resp/nodoInoltraEsitoPagamentoPayPalTest.php - pagopa/events/resp/nodoNotificaAnnullamentoTest.php - pagopa/events/resp/nodoInoltraPagamentoMod1Test.php - pagopa/events/resp/nodoChiediCopiaRTTest.php - pagopa/events/resp/paGetPaymentTest.php - pagopa/events/resp/paSendRTTest.php - pagopa/events/resp/paGetPaymentV2Test.php - pagopa/events/resp/sendPaymentOutcomeV2Test.php - - - process/normal/T0001.php - process/normal/T0002.php - process/normal/T0003.php - process/normal/T0004.php - process/normal/T0005.php - process/normal/T0006.php - process/normal/T0007.php - process/normal/T0008.php - process/normal/T0009.php - process/normal/T0010.php - process/normal/T0011.php - process/normal/T0012.php - process/normal/T0013.php - process/normal/T0014.php - process/normal/T0015.php - process/normal/T0016.php - process/normal/T0017.php - process/normal/T0018.php - process/normal/T0019.php - - - - - process/cache/TestAnalysisActivatePaymentNoticeReq.php - process/cache/TestAnalysisActivatePaymentNoticeResp.php \ No newline at end of file