Skip to content

15. Esercizio pratico – versione 7

Image

15.1. Implémentation

In questa sede riprenderemo la versione 6 esternalizzando in un file di configurazione le costanti utilizzate negli script principali. Il file di configurazione sarà un file jSON il cui contenuto sarà il seguente:


{
    "rootDirectory": "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07",
    "databaseFilename": "Data/database.json",
    "taxAdminDataFileName": "Data/taxadmindata.json",
    "taxPayersDataFileName": "Data/taxpayersdata.json",
    "resultsFileName": "Data/results.json",
    "errorsFileName": "Data/errors.json",
    "dependencies": {
        "BaseEntity": "/../version-05/Entities/BaseEntity.php",
        "TaxAdminData": "/../version-05/Entities/TaxAdminData.php",
        "TaxPayerData": "/../version-05/Entities/TaxPayerData.php",
        "Database": "/../version-05/Entities/Database.php",
        "ExceptionImpots": "/../version-05/Entities/ExceptionImpots.php",
        "Utilitaires": "/../version-05/Utilities/Utilitaires.php",
        "InterfaceDao": "/../version-05/Dao/InterfaceDao.php",
        "TraitDao": "/../version-05/Dao/TraitDao.php",
        "InterfaceDao4TransferAdminData2Database": "/../version-05/Dao/InterfaceDao4TransferAdminData2Database.php",
        "DaoTransferAdminDataFromJsonFile2Database": "/../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php",        
        "DaoImpotsWithTaxAdminDataInDatabase": "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php",
        "InterfaceMetier": "/../version-05/Métier/InterfaceMetier.php",
        "Metier": "/../version-05/Métier/Metier.php"
    },
    "dependencies4calculate": [
        "BaseEntity",
        "TaxAdminData",
        "TaxPayerData",
        "Database",
        "ExceptionImpots",
        "Utilitaires",
        "InterfaceDao",
        "TraitDao",
        "DaoImpotsWithTaxAdminDataInDatabase",
        "InterfaceMetier",
        "Metier"],
    "dependencies4transfer": [
        "BaseEntity",
        "TaxAdminData",
        "Database",
        "ExceptionImpots",
        "Utilitaires",
        "InterfaceDao",
        "TraitDao",  
        "InterfaceDao4TransferAdminData2Database",
        "DaoTransferAdminDataFromJsonFile2Database"]
}

In questa configurazione:

  • riga 2: la cartella da cui vengono calcolati tutti i percorsi di questo file di configurazione;
  • righe 3-7: i percorsi di tutti i file jSON dell’applicazione;
  • righe 8-22: i percorsi di tutti i file dell’applicazione, nel formato [clé=>chemin];
  • righe 23-34: le dipendenze per il calcolo dell’imposta sotto forma di un elenco di chiavi del dizionario [dependencies] (righe 8-22);
  • righe 35-44: le dipendenze per il trasferimento nel database dei file jSON e [taxadmindata.json] sotto forma di un elenco di chiavi del dizionario [dependencies] (righe 8-22);

Lo script per il trasferimento nel database dell’amministrazione fiscale [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] diventa il seguente:


<?php

// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);

// spazio dei nomi
namespace Application;

// gestione degli errori tramite PHP
// ini_set("display_errors", "0");
//
// percorso del file di configurazione
define("CONFIG_FILENAME", "../Data/config.json");

// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// definizione delle costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");

//
try {
  // creazione del livello [dao]
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // trasferimento dei dati nel database
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // viene visualizzato l'errore
  print $ex->getMessage() . "\n";
}
// fine
print "Terminé\n";
exit;

Commenti

Il codice rimane quello indicato nel paragrafo «link». L’unica differenza consiste nell’utilizzo del file [config.json] al posto delle costanti alle righe 18-26;

  • riga 16: la funzione [file_get_contents] converte il file [config.json] in una stringa di caratteri. La funzione [json_decode] utilizza poi questa stringa per costruire il dizionario [$config]. Il secondo parametro [true] della funzione [json_decode] indica che si desidera creare un dizionario;
  • righe 19-22: si includono le dipendenze necessarie allo script di trasferimento dei dati dal file [taxadmindata.json] al database;
    • [$config["dependencies4transfer"]] è la tabella delle dipendenze necessarie allo script di trasferimento. Si tratta di un elenco di chiavi. I percorsi dei file da includere nel progetto si trovano nel dizionario [$config["dependencies"]];
    • $config["rootDirectory"] rappresenta il percorso con cui devono essere prefissati i file da includere;

Allo stesso modo, lo script per il calcolo dell’imposta diventa il seguente: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:


<?php

// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);

// spazio dei nomi
namespace Application;

// gestione degli errori tramite PHP
// ini_set("display_errors", "0");
//
// percorso del file di configurazione
define("CONFIG_FILENAME", "../Data/config.json");

// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);

// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}

// definizione delle costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXPAYERSDATA_FILENAME", "$rootDirectory/{$config["taxPayersDataFileName"]}");
define("RESULTS_FILENAME", "$rootDirectory/{$config["resultsFileName"]}");
define("ERRORS_FILENAME", "$rootDirectory/{$config["errorsFileName"]}");

//
try {
  // creazione del livello [dao]
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // creazione del livello [métier]
  $métier = new Metier($dao);
  // calcolo delle imposte in modalità batch
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // viene visualizzato l'errore
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// fine
print "Terminé\n";
exit;

15.2. Test [Codeception]

Questa versione, come le precedenti, è stata convalidata dai test [Codeception].

Image

15.2.1. Test del livello [dao]

Il test [DaoTest.php] è il seguente:


<?php

// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);

// spazio dei nomi
namespace Application;

// definizione delle costanti
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// percorso del file di configurazione
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// altre costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// test -----------------------------------------------------

class DaoTest extends \Codeception\Test\Unit {
  // TaxAdminData
  private $taxAdminData;

  public function __construct() {
    parent::__construct();
    // creazione del livello [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }

  // test
  public function testTaxAdminData() {

  }

}

Commenti

  • righe 9-21: definizione dell’ambiente di test. Utilizziamo lo stesso ambiente, senza il livello [métier], di quello utilizzato dallo script principale [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descritto nel paragrafo link;
  • righe 29-34: creazione del livello [dao];
  • riga 33: l’attributo [$this→taxAdminData] contiene i dati da testare;
  • righe 37-39: il metodo [testTaxAdminData] è quello descritto nel paragrafo link;

I risultati del test sono i seguenti:

Image

15.2.2. Test del livello [métier]

Il test [MetierTest.php] è il seguente:


<?php

// rigoroso rispetto dei tipi dichiarati dei parametri delle funzioni
declare (strict_types=1);

// spazio dei nomi
namespace Application;

// definizione delle costanti
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// percorso del file di configurazione
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// si recupera la configurazione
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// si includono le dipendenze necessarie allo script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
  require $rootDirectory . $config["dependencies"][$dependency];
}
// altre costanti
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// classe di test
class MetierTest extends \Codeception\Test\Unit {
  // livello business
  private $métier;

  public function __construct() {
    parent::__construct();
    // creazione del livello [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // creazione del livello [métier]
    $this->métier = new Metier($dao);
  }

  // test
  public function test1() {

  }

  -----------------------------------

  public function test11() {

  }

}

Commenti

  • righe 9-21: definizione dell'ambiente di test. Utilizziamo lo stesso ambiente utilizzato dallo script principale [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descritto nel paragrafo "link";
  • righe 28-34: costruzione del livello [dao];
  • riga 33: l’attributo [$this→métier] è un riferimento al livello [métier] da testare;
  • righe 37-45: i metodi [test1, test2…, test11] sono quelli descritti nel paragrafo "link";

I risultati del test sono i seguenti:

Image