730 precompilato + di uno snippet

  • Creatore Discussione Creatore Discussione marino51
  • Data di inizio Data di inizio

marino51

Utente Attivo
28 Feb 2013
3.205
207
63
Lombardia
Ieri 8 gennaio ho caricato con successo le mie (del professionista) "brave" 600 fatture, nel sito del Ministero delle Finanze
Le spese riportate nelle fatture, contribuiranno alla formazione del modello "730 precompilato".

con questo post vorrei indicare i passi che ho compiuto per arrivare al risultato positivo che ho ottenuto,
mi interessa che, chi ne ha bisogno, possa arrivare al mio stesso risultato positivo

non mi interessa parlare di php, soap o "stupidate" connesse,
bensì chi avesse soluzioni "facili" e le possa proporre, è ben accolto

questi i passi necessari,

1) occorre che il "proprietario" sia registrato nell'area riservata del "sistemaTS"
ottenendo le credenziali di accesso, necessarie anche per caricare i dati in modo automatico
http://sistemats1.sanita.finanze.it...home/sistema+ts+informa/730+-+spese+sanitarie

è bene orientarsi nei contenuti della pagina, soprattutto nel contenuto del "kit"

2) è estremamente importante che i dati delle fatture di cui si dispone, siano corretti,
occorre controllare allo "sfinimento" i codici fiscali dei "cittadini"
(ho anche controllato i dati in mio possesso con i registri iva del commercialista ottenendone quadratura, con modifiche da entrambe le parti)

occorre inoltre ripartire i costi delle fatture in detraibili e non detraibili
ho speso tempo lavorando con mezzi "facili" arrivando a,

3) creare una tabella (file) csv ovvero txt che contenga le righe che rappresentano ciascuna fattura,
con le colonne dei valori necessari, nella mia tabella vi erano molteplici colonne
per cui le ho selezionate,
PHP:
define ("_ColDocDate",		1);
define ("_ColDocNumber",	2);
define ("_ColFiscalCode",	8);
define ("_ColTotalEuro",	9);
define ("_ColNotRelevant1",	12);
define ("_ColNotRelevant2",	13);
define ("_ColNotRelevant3",	14);
le colonne chiamate "ColNotRelevant" sono i valori non detraibili che devono essere scorporati dal totale della fattura

Insisto molto sui controlli "a priori" perchè rendono la vita facile dopo

4) con il primo script "FattureGeneraFilesCFdaTXT.php", ho controllato nuovamente i codici fiscali verificando la rispondenza con il carattere di controllo
lo stesso script genera tanti file txt, quanti sono i codici fiscali diversi, per sottoporli alla crittografia

devono essere generati manualmente due file (blocco note),
inserendo rispettivamente il codice fiscale del proprietario ed il "PinCode", ottenuto al punto 1
deve essere inserito solo il valore senza "invio" o altri caratteri

i file sono chiamati "x_PROVAX00X00X000Y.txt" (per ciascun codife fiscale" e "x__PinCode.txt",
ho usato "x_" per raggrupparli della directory e riconoscerli/trovarli facilmente,

5) il kit, che si trova nella pagina del punto 1, contiene il certificato "_SanitelCF.cer" necessario alla crittografia
va recuperato e messo nella stessa dir dei file cf (underscore, aggiunto, serve per averlo in testa alla lista dei file

6) si può procedere alla crittografia di tutti i file con il batch "FattureOpenSSL.bat"
questo batch legge tutti i file "x_cf.txt" e per ciascuno crea il crittografato "x_cf.enc"
ho preferito fare "base64_encode" all'interno di php senza creare il file equivalente come si può vedere nel batch

7) ora si ottiene il file xml con tutti i dati richiesti "FattureGeneraXMLdaTXT.php"

ho preferito trattare separatamente 10 fatture e le rimanenti 590 al fine di non avere problemi con il caricamento "ufficiale"
attenzione, si possono fare tutti i caricamenti che si vogliono nel sistema di test che non esegue operazioni, salvo accettare il file
mentre è bene fare "un solo" caricamento "sicuro" nel sito "ufficiale" per non complicarsi la vita

8) zippare il file xml, il sito accetta solo file ".zip"
copiare dal kit i file "InvioTelematicoSpeseSanitarie730p.wsdl" e "InvioTelematicoSpeseSanitarie730p_schema1.xsd"
verificate all'interno del file "wsdl" la voce "<soap:address location=" (in fondo),
ho creato 2 file uno per "test" e uno per "effettivo" (ma forse non serve)

9) dove inviare il file, lo si vede dallo script "credenziali.php" lasciando "test=true" si manda il file al sistema di test,
convertendolo in FALSE lo si invia al sito "ufficiale"

FARE TUTTE LE PROVE DI INVIO NEL SITO DI TEST !

l'invio avviene con lo script "FattureInviaWsdl.php" indicando al suo interno il nome del file da inviare che resterà agli atti nella "ricevutapdf"

10) entrando nell'area riservata del sito, alla voce "ricevutapdf" ed indicando il protocollo di "accettazione" del file, si scarica il certificato comprovante l'invio con i dati sommari del contenuto del file
in caso di errori nei dati, si troverà anche il file "csv" con l'indicazione degli stessi

nel caso delle mie 600 fatture, ho havuto la segnalazione di 2 fatture con "IL CF CITTADINO NON PRESENTE IN ARCHIVIO"
quindi cf formalmente giusto ma ....

inutile dire che recuperato il cf, ho corretto manualmente (nel sito) le 2 fatture

poi ho stappato la solita "gazzosa" ....

ps :
la data di pagamento coincide con la data del documento, il professionista emette fattura solo al momento del pagamento
gli errori di "ortografia" degli script sono riportati nel log di php,
i messaggi e gli errori di esecuzione degli script sono riportati nel file "__TesseraSanitaria.log" che invito a consultare dopo ogni "run"
( win 7 - IE 11 - php 5.4.9 - openssl 1.0.2e)

ciao Marino


credenziali.php
PHP:
<?php
ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', FALSE);
ini_set('log_errors', TRUE);
ini_set('error_log', '__TesseraSanitaria.log');

ini_set("soap.wsdl_cache_enabled", "0");

error_log(".", 0);
error_log("main ".$_SERVER['PHP_SELF'], 0);

//---------- dati del professionista (medico)

define ("_name",			"Dr. *****");
define ("_cfProprietario",		"");
define ("_cfProprietarioCifrato",	"");
define ("_piProprietario",		"");

define ("_user",			"");
define ("_psw",				"");

define ("_NetworkUser",			"");
define ("_NetworkPsw",			"");

define ("_pincodeInviante",		"");
define ("_pincodeInvianteCifrato",	"");

//---------- dati del professionista (test)

define ("_TestUser",			"PROVAX00X00X000Y");
define ("_TestPsw",			"Salve123");
define ("_TestPincodeInviante",		"1234567890");
define ("_TestPincodeInvianteCifrato",	"HmhwvMEtyHOwDm5K3YEQ9RZiNAkJ+FvRwXodiABj9HpRbdQUaLa4cyYZU8YqaBsSs4Lq6u85uDci6xowmF7ZrVgLhZ83q4nSi8bSvVDPS5pPStBlOJfvo8AisqDiKdJvEPbkIhBVnbmf28gh28G/vQLkp2RgVEYinPA0LUCz8PQ=");

//---------- struttura delle fatture

define ("_ColDocDate",		1);
define ("_ColDocNumber",	2);
define ("_ColFiscalCode",	8);
define ("_ColTotalEuro",	9);
define ("_ColNotRelevant1",	12);
define ("_ColNotRelevant2",	13);
define ("_ColNotRelevant3",	14);

//---------- dati di riconoscimento / connessione / invio

$TEST = true;

if($TEST)
    {
    $login			= _TestUser;
    $password			= _TestPsw;
    $pincodeInvianteCifrato	= _TestPincodeInvianteCifrato;
    $cfProprietario		= _TestUser;

    $InvioTelematico		= "https://invioSS730pTest.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort"; 
    $DettaglioErrori		= "https://invioSS730pTest.sanita.finanze.it/EsitoStatoInviiWEB/DettaglioErrori730Service";
    $EsitoInvio			= "https://invioSS730pTest.sanita.finanze.it/EsitoStatoInviiWEB/EsitoInvioDatiSpesa730Service";
    $ricevutePdf		= "https://invioSS730pTest.sanita.finanze.it/Ricevute730ServiceWeb/ricevutePdf";
    $DocumentoSpesa		= "https://invioSS730pTest.sanita.finanze.it/DocumentoSpesa730pWeb/DocumentoSpesa730pPort";
    }
else
    {
    $login			= _user;
    $password			= _psw;
    $pincodeInvianteCifrato	= _pincodeInvianteCifrato;
    $cfProprietario		= _cfProprietario;

    $InvioTelematico		= "https://invioSS730p.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort"; 
    $DettaglioErrori		= "https://invioSS730p.sanita.finanze.it/EsitoStatoInviiWEB/DettaglioErrori730Service";
    $EsitoInvio			= "https://invioSS730p.sanita.finanze.it/EsitoStatoInviiWEB/EsitoInvioDatiSpesa730Service";
    $ricevutePdf		= "https://invioSS730p.sanita.finanze.it/Ricevute730ServiceWeb/ricevutePdf";
    $DocumentoSpesa		= "https://invioSS730p.sanita.finanze.it/DocumentoSpesa730pWeb/DocumentoSpesa730pPort";
    }

error_log("login                  : ".$login, 0);
error_log("password               : ".$password, 0);
error_log("pincodeInvianteCifrato : ".$pincodeInvianteCifrato, 0);
error_log("cfProprietario         : ".$cfProprietario, 0);

$SoapClientParam = array
    ( 
    "location"		=> "x", 
    "login"		=> $login, 
    "password"		=> $password, 
    "authentication"	=> SOAP_AUTHENTICATION_BASIC, 
    "trace"		=> false, 
    "exceptions"	=> false
    ); 
?>


FattureGeneraFilesCFdaTXT.php
PHP:
<?php
require_once 'Credenziali.php';

// crea tutti i files "x_PROVAX00X00X000Y.txt" per openssl, controlla cf con check digit

define ("_Fatture730",		"Fatture730_2015");	// nome del file da trattare ( .txt, .xml, .zip )

$file = fopen(_Fatture730.".txt", "r");

echo "<table border=4 cellpadding=4>";
while( !feof($file) )
    {
    $row = fgets($file);
    $col = explode(";", $row);
    if ( !empty($col[_ColFiscalCode]) )
        {
        $TotalEuro = $col[_ColTotalEuro] - $col[_ColNotRelevant1] - $col[_ColNotRelevant2] - $col[_ColNotRelevant3];

        $myfile = fopen("x_".$col[_ColFiscalCode].".txt", "w") or die("Unable to open file : ".$col[_ColFiscalCode]);
        fwrite($myfile, $col[_ColFiscalCode]);
        fclose($myfile);

        $cf = codicefiscale($col[_ColFiscalCode]);

        echo "<tr>";
        echo "<td>".$col[_ColFiscalCode]."</td>";
        echo "<td>".$col[_ColDocNumber]."</td>";
        echo "<td>".$col[_ColDocDate]."</td>";
        echo "<td>".$TotalEuro."</td>";
        echo "<td>".$cf."</td>";
        echo "</tr>";
        }
    }
echo "</table>";

fclose($file);

error_log("done ".$_SERVER['PHP_SELF'], 0);

function codicefiscale($cf){
  if( preg_match("/^[A-Z0-9]+\$/", $cf) != 1 )
    return "Il codice fiscale contiene dei caratteri non validi (sono valide lettere e cifre)";

  static $CFcalc = array(
    '0' => 1,
    '1' => 0,
    '2' => 5,
    '3' => 7,
    '4' => 9,
    '5' => 13,
    '6' => 15,
    '7' => 17,
    '8' => 19,
    '9' => 21,
    'A' => 1,
    'B' => 0,
    'C' => 5,
    'D' => 7,
    'E' => 9,
    'F' => 13,
    'G' => 15,
    'H' => 17,
    'I' => 19,
    'J' => 21,
    'K' => 2,
    'L' => 4,
    'M' => 18,
    'N' => 20,
    'O' => 11,
    'P' => 3,
    'Q' => 6,
    'R' => 8,
    'S' => 12,
    'T' => 14,
    'U' => 16,
    'V' => 10,
    'W' => 22,
    'X' => 25,
    'Y' => 24,
    'Z' => 23,
    'end' => 'end'
  );

  $s = 0;
  for( $i = 1; $i <= 13; $i += 2 ){
    $c = $cf[$i];
    if( strcmp($c, "0") >= 0 and strcmp($c, "9") <= 0 )
      $s += ord($c) - ord('0');
    else
      $s += ord($c) - ord('A');
  }
  for( $i = 0; $i <= 14; $i += 2 ){
    $c = $cf[$i];
    $s += $CFcalc[$c];
  }
  if( chr($s%26 + ord('A')) != $cf[15] ) 
    return "Il codice fiscale NON &egrave; riconosciuto ". chr($s%26 + ord('A'));
  return "";
}
?>


FattureOpenSSL.bat ( "MSdos, classica programmazione ad oggetti" )
Codice:
@echo off

c:
cd C:\Program_Files_Ext\openssl-1.0.2d

set BegDir=C:\Web_Sites\__Test\PHP\TEST\XML\FC

del %BegDir%\__OpenSSL.log 2>nul


rem set MySource=%BegDir%\x_PROVAX00X00X000Y
rem openssl.exe rsautl -encrypt -in %MySource%.txt -out %MySource%.enc -inkey %BegDir%\_SanitelCF.cer -certin -pkcs


FOR /R %BegDir% %%D IN (x_*.txt) DO (call :OpenSSL %%D)

pause

exit /b

:OpenSSL
  rem echo params: "%~0" "%~1" "%~n1" "%~2" "%~3" "%~nx0" "%~dpnx0%0" >>param.log

  set MySource=%BegDir%\%~n1

  rem echo %MySource% >>%BegDir%\__OpenSSL.log

  echo %MySource%

  openssl.exe rsautl -encrypt -in %MySource%.txt -out %MySource%.enc -inkey %BegDir%\_SanitelCF.cer -certin -pkcs

  rem openssl enc -base64 -A -in %MySource%.enc -out %MySource%.b64

  exit /b


FattureGeneraXMLdaTXT.php
PHP:
<?php
require_once 'Credenziali.php';

// crea il file .xml da inviare al Ministero delle Finanze

define ("_Fatture730",		"Fatture730_2015_2");	// nome del file da trattare ( .txt, .xml, .zip )

$encFC = GetEncFC(_cfProprietario);

$file = fopen(_Fatture730.'.txt', "r");

$xml=new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><precompilata
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="730_precompilata.xsd"></precompilata>');

    $opzionale1 = $xml->addChild('opzionale1', 'text');
    $opzionale2 = $xml->addChild('opzionale2', 'text');
    $opzionale3 = $xml->addChild('opzionale3', 'text');

    $proprietario = $xml->addChild('proprietario');

        $cfProprietario = $proprietario->addChild('cfProprietario', $encFC);

//  </proprietario>

$TotalDocs = 0;
$TotalEuro = 0;
while( !feof($file) )
    {
    $row = fgets($file);
    $col = explode(";", $row);
    if ( !empty($col[_ColFiscalCode]) )
        {
        $InvEuro = $col[_ColTotalEuro] - $col[_ColNotRelevant1] - $col[_ColNotRelevant2] - $col[_ColNotRelevant3];
        $InvEuro = number_format($InvEuro, 2, ".", "");

        $DocDate = DateTime::createFromFormat('d/m/Y', $col[_ColDocDate]);
        $DocDate = $DocDate->format('Y-m-d');

        $encFC = GetEncFC($col[_ColFiscalCode]);

        $TotalDocs += 1;
        $TotalEuro += $InvEuro;

    $documentoSpesa = $xml->addChild('documentoSpesa');

        $idSpesa = $documentoSpesa->addChild('idSpesa');

            $pIva = $idSpesa->addChild('pIva', _piProprietario);

            $dataEmissione = $idSpesa->addChild('dataEmissione', $DocDate);

            $numDocumentoFiscale = $idSpesa->addChild('numDocumentoFiscale');

                $dispositivo = $numDocumentoFiscale->addChild('dispositivo', '1');

                $numDocumento = $numDocumentoFiscale->addChild('numDocumento', $col[_ColDocNumber]);

//          </numDocumentoFiscale>

//      </idSpesa>

        $dataPagamento = $documentoSpesa->addChild('dataPagamento', $DocDate);

        $flagOperazione = $documentoSpesa->addChild('flagOperazione', 'I');

        $cfCittadino = $documentoSpesa->addChild('cfCittadino', $encFC);

        $voceSpesa = $documentoSpesa->addChild('voceSpesa');

            $tipoSpesa = $voceSpesa->addChild('tipoSpesa', 'SR');

            $importo = $voceSpesa->addChild('importo', $InvEuro);

//      </voceSpesa>

//  </documentoSpesa>
        }
    }

//</precompilata>

fclose($file);

Header('Content-type: text/xml');
print ($xml->asXML(_Fatture730.'.xml'));

error_log("Total Docs ".$TotalDocs, 0);
error_log("Total Euro ".$TotalEuro, 0);
error_log("done       ".$_SERVER['PHP_SELF'], 0);

function GetEncFC($encFile)
    {
    $encFC = file_get_contents( "C:/Web_Sites/__Test/PHP/TEST/XML/FC/x_".$encFile.".enc", FILE_USE_INCLUDE_PATH );
    $encFC = base64_encode($encFC);

    return $encFC;
    }
?>


FattureInviaWsdl.php
PHP:
<?php
require_once 'Credenziali.php';

// invia il file .zip al Ministero delle Finanze

define ("_Fatture730",		"Fatture730_2015_2");	// nome del file da trattare ( .txt, .xml, .zip )

echo "<p><h4>TRASFERIMENTO DELLE FATTURE PER IL 730 PRECOMPILATO AL MINISTERO</h4></p>";

error_log("carico in memoria il file "._FileDaInviare, 0);
$zipfile = implode("", file(_FileDaInviare)); 


$ws = 'InvioTelematicoSpeseSanitarie730p.wsdl';
error_log("definisco il file wsdl ".$ws, 0);
echo $ws."<p> </p>";

$SoapClientParam["location"] =	$InvioTelematico; 
error_log("definisco the soap server location ".$SoapClientParam["location"], 0);
echo $SoapClientParam["location"]."<p> </p>";


echo "<p><h4>INIZIO LA CONNESSIONE</h4></p>";

$client = new SoapClient($ws, $SoapClientParam);

error_log("ottengo la funzione da utilizzare per l'invio", 0);
$output = $client->__getFunctions();
//var_dump($output); echo "<p> </p>";

if(!empty($output)) echo "<p><h4>CONNESSIONE POSSIBILE</h4></p>";


echo "<p><h4>INIZIO TRASFERIMENTO DEL FILE</h4></p>";

error_log("inizio trasferimento del file", 0);
$output = $client->inviaFileMtom(Array
	(
	"nomeFileAllegato"		=> _FileDaInviare,
	"pincodeInvianteCifrato"	=> $pincodeInvianteCifrato,
	"documento"			=> $zipfile,
	"datiProprietario"		=> ( Array( "cfProprietario" => $cfProprietario ) )
	))
;

if(empty($output))
    {
    error_log("trasferimento terminato con errori", 0);
    echo "<p><h4>TRASFERIMENTO TERMINATO CON ERRORI</h4></p>";
    var_dump($output); echo "<p> </p>";
    }
else
    {
    error_log("trasferimento terminato", 0);
    echo "<p><h4>TRASFERIMENTO TERMINATO</h4></p>";

    $protocollo = $output->return->protocollo;
    echo $protocollo."<p> </p>";

    ReportOutput("protocollo");
    ReportOutput("dataAccoglienza");
    ReportOutput("nomeFileAllegato");
    ReportOutput("dimensioneFileAllegato");
    ReportOutput("codiceEsito");
    ReportOutput("descrizioneEsito");
    ReportOutput("idErrore");
    }

error_log("done ".$_SERVER['PHP_SELF'], 0);
echo "<p><h4>FINE DEL LAVORO</h4></p>";

function ReportOutput($var)
    {
    global $output;
    error_log($var." = ".$output->return->{$var}, 0);
    echo $var." = ".$output->return->{$var}."<br />";
    }
?>
 
Ultima modifica:
  • Like
Reactions: f107 and Aarc14
Grazie, sei un grande! È più di una settimana che cercavo di riuscire a far funzionare i webservices con php ma senza esito.
Ora finalmente funzionano.
Modificando il tuo codice, ho creato la pagina RicevuteWdsl.php che, partendo dal protocollo scarica e salva (se disponibile) la ricevuta pdf.
Domani sistemo il codice e lo pubblico qui.
Per chi fosse interessato ecco la funzione php che permette di cifrare i dati usando il certificato del kit
Codice:
function EncryptData($source)
{
  $fp=fopen("d:/sanitelCF.cer","r");
  $pub_key_string=fread($fp,8192);
  fclose($fp);
  $key_resource = openssl_get_publickey($pub_key_string);

  openssl_public_encrypt($source,$crypttext, $key_resource );
  /*uses the already existing key resource*/
  return(base64_encode($crypttext));
 
}
 
ciao grazie per il tuo suggerimento, applicandolo si può semplificare il processo,
ti chiedo però la cortesia di accertarti e confermare che la crittografia avviene come richiesto nella documentazione del sito "sistemaTS"
ho preferito usare il comando dos
Codice:
openssl.exe rsautl -encrypt -in %MySource%.txt -out %MySource%.enc -inkey %BegDir%\_SanitelCF.cer -certin -pkcs
proprio per riprodurre fedelmente quanto chiesto,
ricorda che se il codice fiscale del cittadino non è interpretato,
nel caso migliore vengono scartate tutte le fatture ... e va bene
ma nel caso peggiore, se le fatture vengono accettate potresti ritrovartele tutte con codice fiscale vuoto .... dovendo poi rincorrere il problema
ciao
Marino
 
Ciao e grazie mille per il post!!! E' stato fondamentale!

Sto provando a generare il file per leggere gli esiti dell'invio, ma ottengo il seguente messaggio

object(SoapFault)#2 (9) {
["message":protected]=>
string(30) "java.lang.NullPointerException"
["string":"Exception":private]=>

te avevi sviluppato qualcosa?

grazie mille
 
Come promesso eccoil file per scaricare le ricevute in pdf

RicevutaWdsl.php
PHP:
<?php // Scarica la ricevuta partendo dal protocollo
//************
// USO es:
//     Ricevuta.wdsl.php?protocollo=16011411394460118
//************

//***********
// INSERIRE IL PERCORSO FISICO DOVE SALVARE LE RICEVUTE
//
// ES. define("_percorsoRicevute", "D:/RICEVUTE//"); 
define("_percorsoRicevute", ""); 
//****************

require_once 'credenziali.php';
//$protocollo = '16011411394460118';
$protocollo=$_REQUEST['protocollo'];
echo "<p><h4>Ricevuta</h4></p>";





$ws = 'RicevutaPdf730Service.wsdl';
error_log("definisco il file wsdl ".$ws, 0);
echo $ws."<p> </p>";

$SoapClientParam["location"] =    $ricevutePdf; 
error_log("definisco the soap server location ".$SoapClientParam["location"], 0);
echo $SoapClientParam["location"]."<p> </p>";

echo "<p><h4>INIZIO LA CONNESSIONE</h4></p>";

$client = new SoapClient($ws, $SoapClientParam);

error_log("ottengo la funzione da utilizzare per l'invio", 0);
$output = $client->__getFunctions();
//var_dump($output); echo "<p> </p>";
if(!empty($output)) echo "<p><h4>CONNESSIONE POSSIBILE</h4></p>";

$output = $client->RicevutaPdf(Array
    (
	"DatiInputRichiesta"	=> ( Array(
    "pinCode"        => $pincodeInvianteCifrato,
	//"dataInizio"	=> "01/12/2015",
//	"dataFine"	=>"12/01/2016"
    "protocollo"	=> $protocollo,
	"opzionale1"	=>'0',
	"opzionale2"	=>'0',
	"opzionale3"	=>'0'
	))

    ))
;

if(empty($output))
    {
    error_log("Errore", 0);
    echo "<p><h4>ERRORI</h4></p>";
    var_dump($output); echo "<p> </p>";
    }
else
    {
    error_log("RICHIESTA RICEVUTA EFFETTUATA CON SUCCESSO", 0);
    echo "<p><h4>RICHIESTA RICEVUTA EFFETTUATA CON SUCCESSO</h4></p>";
	//var_dump($output); echo "<p> </p>";
	$esito = $output->DatiOutputRichiesta->esitoChiamata;
   // echo "esito".$esito."<p> </p>";
		

	if ($esito=="0"){
		error_log("E' PRESENTE UNA RICEVUTA DA SCARICARE PER IL PROTOCOLLO ".$protocollo, 0);
		$nomefile=_percorsoRicevute.$protocollo.".pdf";
		echo "<p><h4>E' PRESENTE UNA RICEVUTA DA SCARICARE PER IL PROTOCOLLO ".$protocollo."</h4></p>";
		// var_dump($output->DatiOutputRichiesta->esitiPositivi->dettagliEsito->pdf);
		
		$dati=$output->DatiOutputRichiesta->esitiPositivi->dettagliEsito->pdf;
		  if(!empty($dati)){
			  echo "<p><h4>SCARICO LA RICEVUTA E LA SALVO COME ".$nomefile."</h4></p>";
		  file_put_contents ( $nomefile ,$dati ); 
		  
//****************
// rimuovere i commenti qui sotto per  aprire direttamente il file	
//****************	  
//			header("Cache-Control: public");
//			header("Content-Description: File Transfer");
//			header("Content-Type: application/pdf");
//			header("Content-Disposition: attachment; filename=".$nomefile);
//			header("Content-Transfer-Encoding: binary");
//			readfile($nomefile);
		  echo "<p><h4>FATTO</h4></p>";
		  }
	}
	else{
		error_log("ERRORE: NON E' PRESENTE UNA RICEVUTA DA SCARICARE PER IL PROTOCOLLO ".$protocollo, 0);
		echo "<p><h4>ERRORE: NON E' PRESENTE UNA RICEVUTA DA SCARICARE PER IL PROTOCOLLO  ".$protocollo."</h4></p>";
	}//end esito
	}
?>
 
Ultima modifica:
e questo per scaricare il csv zippato contenete eventuali errori

ErroriWdsl.php

PHP:
<?php // SCarica il file .zip contenente il dettaglio degli errori partendo dal protocollo

//************
// USO es:
//    ErroriWsdl.php?protocollo=16011411394460118
//************

//***********
// INSERIRE IL PERCORSO FISICO DOVE SALVARE IL FILE ZIPPATO
//
// ES. define("_percorsoFileZip", "D:/RICEVUTE//"); 
define("_percorsoFileZip", ""); 
//****************

require_once 'credenziali.php';
//$protocollo = '16011510131262315';
$protocollo=$_REQUEST['protocollo'];
//echo $pincodeInvianteCifrato.'<br>';
//echo $protocollo;
echo "<p><h4>Errori</h4></p>";




$ws = 'DettaglioErrori730Service.wsdl';
error_log("definisco il file wsdl ".$ws, 0);
echo $ws."<p> </p>";

$SoapClientParam["location"] =    $DettaglioErrori; 
error_log("definisco the soap server location ".$SoapClientParam["location"], 0);
//echo $SoapClientParam["location"]."<p> </p>";

echo "<p><h4>INIZIO LA CONNESSIONE</h4></p>";

$client = new SoapClient($ws, $SoapClientParam);

error_log("ottengo la funzione da utilizzare per la richiesta", 0);
$output = $client->__getFunctions();
//var_dump($output); echo "<p> </p>";
if(!empty($output)) echo "<p><h4>CONNESSIONE POSSIBILE</h4></p>";

$output = $client->DettaglioErrori(Array
    (
	"DatiInputRichiesta"	=> ( Array(
    "pinCode"        => $pincodeInvianteCifrato,
    "protocollo"	=> $protocollo))


    ))
;

//print_r($output);
if(empty($output))
    {
    error_log("Errore", 0);
    echo "<p><h4>ERRORI</h4></p>";
    var_dump($output); echo "<p> </p>";
    }
else
    {
    error_log("RICHIESTA FILE EFFETTUATA CON SUCCESSO", 0);
    echo "<p><h4>RICHIESTA FILE EFFETTUATA CON SUCCESSO</h4></p>";
	//var_dump($output); echo "<p> </p>";
	$esito = $output->DatiOutputRichiesta->esitoChiamata;
    echo "esito".$esito."<p> </p>";
	
	
	

	if ($esito=="0"){
		error_log("E' PRESENTE UN FILE ERRORI DA SCARICARE PER IL PROTOCOLLO ".$protocollo, 0);
		$nomefile=_percorsoFileZip.$protocollo.".zip";
		echo "<p><h4>E' PRESENTE UN FILE ERRORI DA SCARICARE PER IL PROTOCOLLO ".$protocollo."</h4></p>";
		// var_dump($output->DatiOutputRichiesta->esitiPositivi->dettagliEsito->pdf);
		
		$dati=$output->DatiOutputRichiesta->esitiPositivi->dettagliEsito->csv;
		  if(!empty($dati)){
			  echo "<p><h4>SCARICO IL FILE E LA SALVO COME ".$nomefile."</h4></p>";
		  file_put_contents ( $nomefile ,$dati ); 
		  echo "<p><h4>FATTO</h4></p>";
		  
		  }
	}
	else{
		error_log("ERRORE: NON E' PRESENTE UN FILE ERRORI DA SCARICARE PER IL PROTOCOLLO ".$protocollo, 0);
		echo "<p><h4>ERRORE: NON E' PRESENTE UN FILE ERRORI DA SCARICARE PER IL PROTOCOLLO ".$protocollo."</h4></p>";
	}//end esito
	}
?>
 
Vedi l'allegato 730precompilato.zip

dopo aver esaurito gli invii, ho rivisto gli script in modo da archiviarli in "buono stato",
allego lo zip con la versione che andrò ad archiviare.

sono in dovere di ringraziare RUDYCOX per il suo preziosissimo apporto, i suoi script sono parte della "collezione"

variazioni rispetto alla prima stesura,

ho spostato tutte le definizioni nel file "credenziali.php",
ho mantenuto in ciascuno script la definizione del solo file "fatture" da trattare (dove necessario),
posizionandola all'inizio

nello stesso "credenziali.php" ho inserito i dati di prova anche nella sezione dei dati effettivi,
in modo che non ci siano dubbi sulle informazioni da immettere

ho messo il controllo degli errori con la verifica "if (is_soap_fault($output))"

ho aggiunto lo script "FattureInvioEsito.php",
che consente di riprendere alcuni dei dati contenuti nella ricevuta pdf,
nel caso si volesse memorizzarli in qualche modo

ho inserito le,
List of available SOAP functions
List of types described in the WSDL for the Web service
utili per sapere quali funzioni e quali dati sono previsti nei file ".wsdl" e ".xsd"

ho mantenuto la crittografia della prima versione (file batch) ma chi volesse adottare la variante
suggerita da RUDYCOX, non troverà difficoltà a farlo

alla prossima
Marino
 
PHP:
<?php

$TEST = true;

session_start();

ini_set('error_reporting', E_ALL | E_STRICT);

......


$protocollo = "12345678901234567";

if( !empty( $_SESSION['protocollo'] ) ) $protocollo = $_SESSION['protocollo'];

if( !empty( $_REQUEST['protocollo'] ) ) $protocollo = $_REQUEST['protocollo'];
?>

una banale modifica allo script "credenziali" per poter avere varietà nel passare il "protocollo"
come suggerito da RUDYCOX
ciao
Marino
 
Vedi l'allegato 730precompilatoInvioStruttura.zip

visto che c'è qualche persona in difficoltà per il trasferimento dei file relativi ad una struttura,
nel file allegato c'è un esempio funzionante,

html è il risultato
credenziali, è il solito modificato per accogliere i dati della struttura
FattureInviaWsdl è stato modificato l'invio con i parametri aggiuntivi per la struttura

saluti
Marino
 
Innanzitutto grazie ancora Marino! soprattutto per l'ordine che hai fatto nel codice...sono un casinista

Vorrei utilizzare questo spazio, solo per fare 2 considerazioni.
A parte il fatto di aver saputo solo venerdì che per il momento non sono tenuto a fare queste comunicazioni in quanto la mia struttura è privata NON accreditata, e questo dall'operatore numero xyznnn del numero verde e non dal preposto funzionario dell'ufficio dell'agenzia delle entrate cui mi ero rivolto la cui risposta era stata "si forse non lo deve fare, ma è meglio che lo faccia" (a voi i commenti)........,

ora,


  • vedendo la struttura del file xml contenente i dati, sembra che la comunicazione debba essere fatta a "riga ricevuta" e non a "totale ricevuta", o mi sbaglio? Il mio commercialista dice che quando comunica le spese sanitarie di una persona fisica per la detrazione comunica il totale e non il dettaglio delle singole prestazioni incluse nella ricevuta. Quale va usata quindi?

    Io al momento non posso loggarmi al portale e quindi non posso vedere cosa abbiano previsto se uno voglia utilizzare la modalità di trasmissione web, ovvero come è gestito l'inserimento e la trasmissione di una singola ricevuta
    es.
    ricevuta 1
    data 04/01/2016
    visita spec. cardiologica euro 100.00
    elettrocardiogramma euro 30.00
    totale ricevuta = euro 130.00

    va inserito 130.00 oppure 2 record uno da 100.00 ed uno da 30.00
    e nel caso di 130.00, va inserito 130.00 o 132.00 (importo del bollo)?

Dal punto di vista della programmazione a me non cambia molto visto che creo l'xml al volo interrogando un database, ma, viste le sanzioni, credo sia meglio farlo correttamente ;-)

  • E le note di credito? ne vogliamo parlare? L'operatore del numero verde dice che non esiste la possibilità di trasmissione di note di credito nè a storno totale nè - figuriamoci - a storno parziale per ricevute già trasmesse. Anzi il termine nota di credito l'ha lasciato senza parole, buio totale (??!!). Ma il flag R, a cosa serve quindi?
    Non è possibile usare V in quanto la ricevuta originale non cambia, ma ne viene invece emessa una ex-novo, di accredito.


Se qualcuno ha chiarimenti per quanto sopra, sono ben accetti.
 
Innanzitutto grazie ancora Marino! soprattutto per l'ordine che hai fatto nel codice...sono un casinista

Vorrei utilizzare questo spazio, solo per fare 2 considerazioni.
A parte il fatto di aver saputo solo venerdì che per il momento non sono tenuto a fare queste comunicazioni in quanto la mia struttura è privata NON accreditata, e questo dall'operatore numero xyznnn del numero verde e non dal preposto funzionario dell'ufficio dell'agenzia delle entrate cui mi ero rivolto la cui risposta era stata "si forse non lo deve fare, ma è meglio che lo faccia" (a voi i commenti)........,

ora,


  • vedendo la struttura del file xml contenente i dati, sembra che la comunicazione debba essere fatta a "riga ricevuta" e non a "totale ricevuta", o mi sbaglio? Il mio commercialista dice che quando comunica le spese sanitarie di una persona fisica per la detrazione comunica il totale e non il dettaglio delle singole prestazioni incluse nella ricevuta. Quale va usata quindi?

    Io al momento non posso loggarmi al portale e quindi non posso vedere cosa abbiano previsto se uno voglia utilizzare la modalità di trasmissione web, ovvero come è gestito l'inserimento e la trasmissione di una singola ricevuta
    es.
    ricevuta 1
    data 04/01/2016
    visita spec. cardiologica euro 100.00
    elettrocardiogramma euro 30.00
    totale ricevuta = euro 130.00

    va inserito 130.00 oppure 2 record uno da 100.00 ed uno da 30.00
    e nel caso di 130.00, va inserito 130.00 o 132.00 (importo del bollo)?

Dal punto di vista della programmazione a me non cambia molto visto che creo l'xml al volo interrogando un database, ma, viste le sanzioni, credo sia meglio farlo correttamente ;-)

  • E le note di credito? ne vogliamo parlare? L'operatore del numero verde dice che non esiste la possibilità di trasmissione di note di credito nè a storno totale nè - figuriamoci - a storno parziale per ricevute già trasmesse. Anzi il termine nota di credito l'ha lasciato senza parole, buio totale (??!!). Ma il flag R, a cosa serve quindi?
    Non è possibile usare V in quanto la ricevuta originale non cambia, ma ne viene invece emessa una ex-novo, di accredito.


Se qualcuno ha chiarimenti per quanto sopra, sono ben accetti.


Ciao, la commercialista della società odontoiatrica per cui lavoro dice che comunque il bollo va indicato con la sigla AA ( in quanto altre spese).

Quindi nel tuo caso

RS 100
RS 30
AA 2

( lei ha detto di indicare una riga sola con totale 130 e una con totale 2 per il bollo, ma io sono della tua stessa idea e preferisco esplicitare riga per riga, per evitare problemi)

Anche io mi domandavo come fare per le Note di credito, ovviamente le direttive sono alquanto blande e un po confusionarie.

Io avevo pensato di gestire le singole righe come rimborso (R) indicando l'identificativo del documento fiscale al quale fanno riferimento ( ovvero la fattura contenente quella riga che tu stai "restituendo" al paziente); ma a questo punto non saprei come comportarmi.

Certo è che il paziente poi non porterà a detrazione gli importi relativi a Note di Credito, in quanto, di fatto, soldi a lui restituiti, quindi in qualche modo penso che debbano essere inviati.

Spero che altri utenti ci chiariscano le idee, nel frattempo ringrazio di cuore te e Marino per gli script forniti
 
Innanzitutto grazie ancora Marino! soprattutto per l'ordine che hai fatto nel codice...sono un casinista

Vorrei utilizzare questo spazio, solo per fare 2 considerazioni.
A parte il fatto di aver saputo solo venerdì che per il momento non sono tenuto a fare queste comunicazioni in quanto la mia struttura è privata NON accreditata, e questo dall'operatore numero xyznnn del numero verde e non dal preposto funzionario dell'ufficio dell'agenzia delle entrate cui mi ero rivolto la cui risposta era stata "si forse non lo deve fare, ma è meglio che lo faccia" (a voi i commenti)........,

ora,


  • vedendo la struttura del file xml contenente i dati, sembra che la comunicazione debba essere fatta a "riga ricevuta" e non a "totale ricevuta", o mi sbaglio? Il mio commercialista dice che quando comunica le spese sanitarie di una persona fisica per la detrazione comunica il totale e non il dettaglio delle singole prestazioni incluse nella ricevuta. Quale va usata quindi?

    Io al momento non posso loggarmi al portale e quindi non posso vedere cosa abbiano previsto se uno voglia utilizzare la modalità di trasmissione web, ovvero come è gestito l'inserimento e la trasmissione di una singola ricevuta
    es.
    ricevuta 1
    data 04/01/2016
    visita spec. cardiologica euro 100.00
    elettrocardiogramma euro 30.00
    totale ricevuta = euro 130.00

    va inserito 130.00 oppure 2 record uno da 100.00 ed uno da 30.00
    e nel caso di 130.00, va inserito 130.00 o 132.00 (importo del bollo)?

Dal punto di vista della programmazione a me non cambia molto visto che creo l'xml al volo interrogando un database, ma, viste le sanzioni, credo sia meglio farlo correttamente ;-)

  • E le note di credito? ne vogliamo parlare? L'operatore del numero verde dice che non esiste la possibilità di trasmissione di note di credito nè a storno totale nè - figuriamoci - a storno parziale per ricevute già trasmesse. Anzi il termine nota di credito l'ha lasciato senza parole, buio totale (??!!). Ma il flag R, a cosa serve quindi?
    Non è possibile usare V in quanto la ricevuta originale non cambia, ma ne viene invece emessa una ex-novo, di accredito.


Se qualcuno ha chiarimenti per quanto sopra, sono ben accetti.

Tra l'altro, se emetto una Nota di Credito relativa ad un documento fiscale emesso nel 2014, come bisogna comportarsi?
Mistero totale..
 
ho l'informazione che, quest'anno non vi sono sanzioni per chi dovesse commettere errori,

esprimendo un pensiero semplice,
fornisco l'informazione che deve essere riportata sul 730 precompilato,
in modo da non vanificare quanto si sta facendo per aiutare la compilazione/presentazione del modello

quindi al momento, sono per fornire un documento di una sola riga con il totale da riportare sul 730,
ovviamente corretto nel valore e considerando le eventuali note di variazione (accredito/addebito)

in un certo senso stiamo compilando i vecchi "allegati" clienti/fornitori per chi li avesse incontrati

il prossimo anno saremo tutti più preparati
ciao
Marino

ps,
"Tra l'altro, se emetto una Nota di Credito relativa ad un documento fiscale emesso nel 2014, come bisogna comportarsi?
Mistero totale.. "
non proprio, dipende dalla data di "pagamento",
addebito con data di pagamento 2015 dovrebbe rientrare nelle spese sanitarie del 2015
accredito, nessun commento

ulteriore ps,
nel documento "730+Schema+dati+spesa+sanitaria+(01_12_2015).pdf" presente nel kit,
nella sezione "documentoSpesa" è abbastanza evidente come gestire le note di variazione
 
Ultima modifica:
Ciao Marino,
Innanzitutto ti ringrazio anch'io per questo tuo post illuminante !
Volevo poi chiederti qualche ulteriore informazione in merito alla crittografia dei CF, premettendo che è un argomento che conosco poco:
1) che "opensll" va installato su Windows 7 ? da dove lo posso scaricare ? Io ho trovato questo : https://slproweb.com/products/Win32OpenSSL.html . Va bene ?
2) nel tuo .bat ci sono delle righe "remmate": io le ho ignorato, giusto ?
3) eventualmente la versione PHP proposta da rudycox va bene o no ? ... perchè prima avevi scritto di verificare se la crittografia avviene come richiesto dal sistema TS (... come si verifica ?)

Grazie ancora e saluti !
 
io ho scaricato da qui la versione 1.0.2e
http://indy.fulgan.com/SSL/

il bat contiene righe commentate che ho usato per prove o per altri motivi, non sono importanti
se vuoi e ti serve puoi attivare la "base64" ma ho preferito farla da php

se guardi in fondo al bat c'è una riga dove viene richiamato il certificato "MEF.cer"
questa riga è copia/incolla del comando contenuto nel kit
"io non so ne leggere ne scrivere" per cui ho usato esattamente quel comando (aggiungendo uno spazio omesso nell'originale)

alla domanda come si verifica, scusa la risposta, "non so", in questo momento altri impegni
a me interessava il risultato ed ho impostato il tutto per ottenerlo

ciao
Marino
 
Ultima modifica:
richiesto dal sistema TS (... come si verifica ?)

per chiarire meglio (l'ora tarda del post precedente, mi ha fatto andare di fretta),

il requisito di crittografia é definito nel documento 20090625_DT_Comma_5.pdf alla pagina 13

per quanto concerne il controllo del codice crittografato,
è necessario disporre di un certificato che contenga la chiave di decriptazione,
al fine di effettuare il processo inverso per riottenere il codice in chiaro

ho letto in un qualche documento che, sogei mette a disposizione una chiave di prova
per effettuare il processo inverso (che permette quindi il controllo)
ma sinceramente, ora, non trovo più il documento (non era parte dei documenti della pagina del sito)
e quando ho cercato questo certificato "inverso" non l'ho trovato

il processo di controllo dovrebbe prevedere questi passi,

crittografia con openssl come stabilito nel documento citato,

crittografia con "metodo" php

processo inverso per entrambi con certificato apposito

ottenendo il codice in chiaro corretto per entrambi i sistemi,
si dovrebbe dire che il risultato php è uguale al risultato di openssl
(ma io non mi fido, ecco il motivo della mia soluzione bella o brutta che sia)

ciao
Marino
 
In merito alla criptazione con questa funzione

PHP:
function EncryptData($source)
{
  $fp=fopen("d:/sanitelCF.cer","r");
  $pub_key=fread($fp,8192);
  fclose($fp);
  openssl_public_encrypt($source,$crypttext, $pub_key );
  /*uses the already existing key resource*/
  return(base64_encode($crypttext));
}

Ho effettuato alcune prove e funziona.

Le prove che ho fatto sono:
1) creare il file xml con 3 cf reali criptati dalla funzione->zipparlo -> inviarlo tramite webservice : esito 3 documenti accettati
2) creare il file xml con 3 cf, 2 criptati dalla funzione + 1 copiato da un file di test->zipparlo -> inviarlo tramite webservice : esito 3 documenti accettati
3) creare il file xml con 3 cf criptati dalla funzione (di cui 1 PROVAX00X00X000Y)->zipparlo -> inviarlo tramite webservice : esito 2 accettati, 1 respinto con errore "IL CF CITTADINO NON PRESENTE IN ARCHIVIO"
4) usando un certificato in mio possesso con chiave pubblica RSA (1024bits) e di cui ho la chiave privata, ho fatto criptare dalla funzione php e scrivere il risultato in CF.enc (questo dovrebbe produrre la stessa cosa fatta da command-line ovvero dal batch)
PHP:
$source='PROVAX00X00X000Y';
//$fp=fopen("d:/sanitelCF.cer","r");
 $fp=fopen("d:/rui.crt","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_public_encrypt($source,$crypttext,$pub_key);
file_put_contents ( "d:/CF.enc" ,$crypttext );  //creo il file con i dati non codificati base64

Ho verificato che il CF.enc fosse scritto in binario.

da command line ho decriptato usando il seguente comando come riportato nel disciplinare:
Codice:
openssl.exe rsautl -decrypt -in  d:\CF.enc -out d:\CF.txt -inkey d:\rui.key -pkcs

all'interno del file CF.txt viene correttamente scritto il CF decriptato, ovvero: PROVAX00X00X000Y

quindi sembra tutto ok.

Se qualcuno riesce a farsi mandare il certificato di prova e relativa chiave privata del MEF (Ministero dell'economia e delle finanze) indicati da Marino e specificati nel "Disciplinare tecnico", posso fare una ulteriore prova.
I file nel disciplinare vengono indicati come MEF.cer (certificato) e MEFtest.key (la chiave privata)
 
Ultima modifica:
Ciao RudyCox,

sto facendo dei test di trasmissione che vanno a buon fine.
Ma quando cerco di ottenere la ricevuta PDF usando il tuo codice, ottengo sempre questa risposta:

INVIO LA RICHIESTA

1.6011919590572E+16
LA RICHIESTA HA AVUTO RISPOSTA

ERRORE: NON E' PRESENTE LA RICEVUTA PER IL PROTOCOLLO 1.6011919590572E+16

FINE DEL LAVORO

Quale può essere il problema ? ... cosa devo controllare ?

Grazie !
 
Buonasera a tutti,
grazie innanzitutto a chi ha scritto questi script e sta contribuendo a darmi delucidazioni sull'argomento.

Ho provato un po' le varie funzioni. Il webservice di invio file funziona correttamente (anche se mi restituisce continuamente l'errore "L'ALLEGATO NON E' UN FILE DI TIPO ZIP VALIDO: IL FILE NON E' STATO ACCOLTO")

Gli altri script che avete allegato (Invio Esito, Ricevuta Pdf,...) non mi funzionano e mi viene restituito un errore come se il wsdl del WebService non esistesse (es. Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "EsitoInvioDatiSpesa730Service.wsdl"). A voi funziona correttamente?

Inoltre potete darmi una mano a capire come è composto l'ambiente di test del sistema? Si tratta solo di richiamare url di webservice diversi o c'è una vera e proprio pannello nel sito del STS (come se fosse un utente reale)? Purtroppo, a parte i vostri esempi, non ho trovato molte informazioni a riguardo.

Grazie in anticipo ;)
 
x spongebob: controlla che alla fine del file credenziali.php siano presenti queste 2 righe dopo $protocollo = "12345678901234567";

PHP:
if( !empty( $_SESSION['protocollo'] ) ) $protocollo = $_SESSION['protocollo'];

if( !empty( $_REQUEST['protocollo'] ) ) $protocollo = $_REQUEST['protocollo'];
se nn ci sono, aggiungile.
poi potrai chiamare la pagina delle ricevute con FattureInvioRicevutaPdf.php?protocollo=[numero protocollo restituito dall'invio]

x Ezio88: devi copiare tutti i file *.wsdl e *.xsd (contenuti nel kit nelle cartelle "ServizioSincrono" e "ServiziRicevute") nella cartella dove risiedono i file php
il file da inviare, se hai usato gli ultimi script di marino, deve chiamarsi "Fatture730_2015_2.zip", deve risiedere nella cartella dei file php e deve contenere il solo file Fatture730_2015_2.xml


x Tutti: Gli script indicati in queste pagine funzionano tutti, ma al momento sono solo delle "basi" da cui partire. Vanno modificati in funzione delle proprie esigenze soprattutto per impostare alcune variabili. Es il nome del file zip, la cartella dove salvare le ricevute pdf, la cartella dove salvare i csv, etc
Marino ha fatto un grande lavoro, tutte le variabili usate, se non facilmente intuibili, hanno a fianco il commento di cosa impostano o a cosa servono.
Ogni volta che chiamate una pagina, viene scritto tutto il processo ed esito nel file "_TesseraSanitaria.log". Controllatelo per capire se e quali sono gli errori. Potete cancellarlo in quanto viene ricreato ad ogni nuova chiamata di qualsiasi pagina php.
 
Ultima modifica:

Discussioni simili