2018-12-14 12:50:44 +01:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright ( C ) DevCode s . r . l .
2020-09-07 15:04:06 +02:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*/
2018-12-14 12:50:44 +01:00
namespace Plugins\ReceiptFE ;
2020-09-08 10:38:27 +02:00
use Models\Upload ;
2018-12-14 12:50:44 +01:00
use Modules\Fatture\Fattura ;
2020-10-16 18:24:54 +02:00
use Modules\Fatture\Stato ;
2019-02-20 16:07:42 +01:00
use Plugins ;
2018-12-14 12:50:44 +01:00
use UnexpectedValueException ;
2018-12-29 12:03:22 +01:00
use Util\XML ;
2019-03-29 15:14:09 +01:00
use Util\Zip ;
2018-12-14 12:50:44 +01:00
/**
* Classe per la gestione della fatturazione elettronica in XML .
*
* @ since 2.4 . 2
*/
class Ricevuta
{
2019-02-20 16:07:42 +01:00
protected static $directory = null ;
/** @var array Percorso del file XML */
protected $file = null ;
/** @var array XML della ricevuta */
2018-12-14 12:50:44 +01:00
protected $xml = null ;
2019-02-20 16:07:42 +01:00
/** @var array XML della ricevuta */
2018-12-14 12:50:44 +01:00
protected $fattura = null ;
2019-02-20 16:07:42 +01:00
public function __construct ( $name )
2018-12-14 12:50:44 +01:00
{
2019-03-29 15:14:09 +01:00
$file = static :: getImportDirectory () . '/' . $name ;
2020-09-08 10:38:27 +02:00
// Estrazione implicita per il formato ZIP
2020-10-29 16:48:37 +01:00
if ( string_ends_with ( $name , '.zip' )) {
2019-03-29 15:14:09 +01:00
$original_file = $file ;
$extraction_dir = static :: getImportDirectory () . '/tmp' ;
Zip :: extract ( $file , $extraction_dir );
$name = basename ( $name , '.zip' ) . '.xml' ;
$file = static :: getImportDirectory () . '/' . $name ;
copy ( $extraction_dir . '/' . $name , $file );
delete ( $original_file );
delete ( $extraction_dir );
}
$this -> file = $file ;
2019-02-20 16:07:42 +01:00
$this -> xml = XML :: readFile ( $this -> file );
2018-12-14 12:50:44 +01:00
2019-02-20 16:07:42 +01:00
$filename = explode ( '.' , $name )[ 0 ];
2019-01-25 15:54:56 +01:00
$pieces = explode ( '_' , $filename );
2018-12-14 12:50:44 +01:00
2019-01-25 15:54:56 +01:00
$progressivo_invio = $pieces [ 1 ];
2018-12-14 12:50:44 +01:00
$this -> fattura = Fattura :: where ([
'progressivo_invio' => $progressivo_invio ,
]) -> first ();
if ( empty ( $this -> fattura )) {
throw new UnexpectedValueException ();
}
}
2020-09-08 10:38:27 +02:00
/**
* Funzione per gestire in modo autonomo il download , l ' importazione e il salvataggio di una specifica ricevuta identificata tramite nome .
*
* @ param string $name
* @ param bool $cambia_stato
*
* @ return Fattura | null
*/
public static function process ( $name , $cambia_stato = true )
{
Interaction :: getReceipt ( $name );
$fattura = null ;
try {
$receipt = new Ricevuta ( $name );
$receipt -> save ( $cambia_stato );
$fattura = $receipt -> getFattura ();
$receipt -> cleanup ();
Interaction :: processReceipt ( $name );
} catch ( UnexpectedValueException $e ) {
}
return $fattura ;
}
/**
* Salva il file indicato nella cartella temporanea per una futura elaborazione .
*
* @ param string $filename
* @ param string $content
*
* @ return string
*/
2019-02-20 16:07:42 +01:00
public static function store ( $filename , $content )
{
$directory = static :: getImportDirectory ();
$file = $directory . '/' . $filename ;
directory ( $directory );
file_put_contents ( $file , $content );
return $filename ;
}
2020-09-08 10:38:27 +02:00
/**
* Restituisce la cartella temporanea utilizzabile per il salvataggio della ricevuta .
*
* @ return string | null
*/
2019-02-20 16:07:42 +01:00
public static function getImportDirectory ()
{
if ( ! isset ( self :: $directory )) {
$plugin = Plugins :: get ( 'Ricevute FE' );
2020-09-23 13:36:37 +02:00
self :: $directory = base_dir () . '/' . $plugin -> upload_directory ;
2019-02-20 16:07:42 +01:00
}
return self :: $directory ;
}
2020-09-08 10:38:27 +02:00
/**
* @ param string $codice
*
* @ return Upload | null
*/
2019-02-20 16:07:42 +01:00
public function saveAllegato ( $codice )
{
2020-09-08 10:38:27 +02:00
$filename = basename ( $this -> file );
$fattura = $this -> getFattura ();
// Controllo sulla presenza della stessa ricevuta
2020-10-16 16:56:18 +02:00
$module = $fattura -> getModule ();
$upload_esistente = $module
2020-09-08 10:38:27 +02:00
-> uploads ( $fattura -> id )
2020-10-30 15:43:51 +01:00
-> where ( 'original_name' , $filename )
2020-09-08 10:38:27 +02:00
-> first ();
if ( ! empty ( $upload_esistente )) {
return $upload_esistente ;
}
2019-02-20 16:07:42 +01:00
2020-09-08 10:38:27 +02:00
// Registrazione del file XML come allegato
$upload = Upload :: build ( $this -> file , [
2019-02-20 16:07:42 +01:00
'category' => tr ( 'Fattura Elettronica' ),
'id_module' => $module -> id ,
2020-09-08 10:38:27 +02:00
'id_record' => $fattura -> id ,
2019-02-20 16:07:42 +01:00
'name' => tr ( 'Ricevuta _TYPE_' , [
'_TYPE_' => $codice ,
]),
2020-09-08 10:38:27 +02:00
'original' => $filename ,
]);
return $upload ;
2019-02-20 16:07:42 +01:00
}
2020-09-08 10:38:27 +02:00
/**
* Aggiorna lo stato della fattura relativa alla ricevuta in modo tale da rispecchiare i dati richiesti .
*
* @ param $codice
* @ param $id_allegato
*/
public function saveStato ( $codice , $id_allegato )
2019-02-20 16:07:42 +01:00
{
$fattura = $this -> getFattura ();
// Modifica lo stato solo se la fattura non è già stata consegnata (per evitare problemi da doppi invii)
2020-09-08 10:38:27 +02:00
// In realtà per le PA potrebbe esserci lo stato NE (che può contenere un esito positivo EC01 o negativo EC02) successivo alla RC, quindi aggiungo eccezione nel caso il nuovo codice della ricevuta sia NE.
2021-02-26 12:04:00 +01:00
if ( $fattura -> codice_stato_fe == 'RC' && $codice != 'EC01' && $codice != 'EC02' ) {
2020-06-04 16:37:40 +02:00
return ;
}
2019-02-20 16:07:42 +01:00
2019-03-12 17:00:05 +01:00
// Processo la ricevuta e salvo data ricezione, codice e messaggio
2019-02-20 16:07:42 +01:00
$descrizione = $this -> xml [ 'Destinatario' ][ 'Descrizione' ];
$data = $this -> xml [ 'DataOraRicezione' ];
2019-03-29 15:14:09 +01:00
2020-08-31 16:08:59 +02:00
$fattura -> data_stato_fe = $data ? date ( 'Y-m-d H:i:s' , strtotime ( $data )) : '' ;
2019-02-20 16:07:42 +01:00
$fattura -> codice_stato_fe = $codice ;
2019-03-29 15:14:09 +01:00
$fattura -> descrizione_ricevuta_fe = $descrizione ;
2020-09-08 10:38:27 +02:00
$fattura -> id_ricevuta_principale = $id_allegato ;
2019-03-29 15:14:09 +01:00
2019-02-20 16:07:42 +01:00
$fattura -> save ();
}
2020-09-08 10:38:27 +02:00
/**
* Effettua le operazioni di salvataggio della ricevuta nella fattura relativa .
*/
public function save ( $cambia_stato = true )
2019-02-20 16:07:42 +01:00
{
$name = basename ( $this -> file );
$filename = explode ( '.' , $name )[ 0 ];
$pieces = explode ( '_' , $filename );
2020-07-08 10:40:04 +02:00
$codice_stato = $pieces [ 2 ];
// Individuazione codice per il nome dell'allegato
$codice_nome = $codice_stato ;
if ( $codice_nome == 'NS' ) {
$lista_errori = $this -> xml [ 'ListaErrori' ];
$errore = $lista_errori [ 0 ] ? : $lista_errori ;
$codice_nome = $codice_nome . ' - ' . $errore [ 'Errore' ][ 'Codice' ];
}
2019-02-20 16:07:42 +01:00
2020-09-08 10:38:27 +02:00
$upload = $this -> saveAllegato ( $codice_nome );
2020-06-04 13:22:44 +02:00
2020-10-16 18:24:54 +02:00
// Correzione eventuale per lo stato della fattura in Bozza
$fattura = $this -> getFattura ();
if ( $fattura -> stato -> descrizione == 'Bozza' ) {
$stato_emessa = Stato :: where ( 'descrizione' , 'Emessa' ) -> first ();
$fattura -> stato () -> associate ( $stato_emessa );
$fattura -> save ();
}
// Controllo per il cambio di stato FE
2020-09-08 10:38:27 +02:00
if ( $cambia_stato ) {
// In caso di Notifica Esito il codice è definito dal nodo <Esito> della ricevuta
if ( $codice_stato == 'NE' ) {
$codice_stato = $this -> xml [ 'EsitoCommittente' ][ 'Esito' ];
}
2020-06-04 13:22:44 +02:00
2020-09-08 10:38:27 +02:00
$this -> saveStato ( $codice_stato , $upload -> id );
}
2019-02-20 16:07:42 +01:00
}
2020-09-08 10:38:27 +02:00
/**
* Restituisce la fattura identificata per la ricevuta .
*
* @ return Fattura | null
*/
2018-12-14 12:50:44 +01:00
public function getFattura ()
{
return $this -> fattura ;
}
2019-02-20 16:07:42 +01:00
2020-09-08 10:38:27 +02:00
/**
* Rimuove i file temporanei relativi alla ricevuta .
*/
public function cleanup ()
2019-02-20 16:07:42 +01:00
{
delete ( $this -> file );
}
2018-12-14 12:50:44 +01:00
}