2022-05-13 13:24:03 +02:00
< ? php
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
* Copyright ( C ) DevCode s . r . l .
*
* 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 />.
*/
include_once __DIR__ . '/../../core.php' ;
use Carbon\Carbon ;
use Modules\Fatture\Fattura ;
2024-03-20 16:15:37 +01:00
use Modules\Fatture\Stato ;
2024-03-22 15:52:24 +01:00
use Modules\Fatture\StatoFE ;
use Plugins\ExportFE\Interaction ;
2022-06-27 23:50:15 +02:00
use Util\XML ;
2022-05-13 13:24:03 +02:00
2022-05-26 15:45:49 +02:00
$services_enable = Interaction :: isEnabled ();
2024-03-20 11:13:28 +01:00
if ( $module -> getTranslation ( 'name' ) == 'Fatture di vendita' && $services_enable ) {
2022-05-13 13:24:03 +02:00
$documenti_scarto = [];
$documenti_invio = [];
2023-08-04 14:54:28 +02:00
$codici_scarto = [ 'EC02' , 'ERR' , 'ERVAL' , 'NS' ];
$codici_invio = [ 'GEN' , 'QUEUE' ];
2022-05-13 13:24:03 +02:00
$data_limite = ( new Carbon ()) -> subMonths ( 6 );
$data_limite_invio = ( new Carbon ()) -> subDays ( 10 );
2024-02-24 01:19:15 +01:00
2024-02-24 01:08:41 +01:00
// Verifica se la data cade di sabato o domenica
2024-02-24 01:19:15 +01:00
$giorno_settimana = $data_limite_invio -> dayOfWeek ;
2024-02-25 11:24:18 +01:00
if ( $giorno_settimana == Carbon :: WEDNESDAY ) {
2024-03-22 15:52:24 +01:00
$data_limite_invio -> addDays (); // Anticipa la data di 1 giorno se la data limite cade di sabato (con data fattura mercoledì)
2024-02-25 11:24:18 +01:00
} elseif ( $giorno_settimana == Carbon :: THURSDAY ) {
$data_limite_invio -> addDays ( 2 ); // Anticipa la data di 2 giorni se la data limite cade di domenica (con data fattura giovedì)
2024-02-24 01:08:41 +01:00
}
2022-05-31 17:54:17 +02:00
$data_setting = Carbon :: createFromFormat ( 'd/m/Y' , setting ( 'Data inizio controlli su stati FE' )) -> format ( 'Y-m-d' );
2022-05-13 13:24:03 +02:00
2023-08-04 14:54:28 +02:00
$documenti = Fattura :: where ( 'data' , '>' , $data_limite ) -> where ( 'data' , '>' , $data_setting ) -> whereIn ( 'codice_stato_fe' , [ 'EC02' , 'ERR' , 'ERVAL' , 'NS' , 'GEN' , 'QUEUE' ]) -> get ();
2022-06-27 23:50:15 +02:00
2022-05-13 13:24:03 +02:00
foreach ( $documenti as $documento ) {
2024-02-28 10:50:39 +01:00
$stato_fe = StatoFE :: find ( $documento -> codice_stato_fe ) -> id_record ;
2022-06-27 23:50:15 +02:00
2023-08-04 14:54:28 +02:00
if ( in_array ( $documento -> codice_stato_fe , $codici_scarto )) {
2022-06-27 23:50:15 +02:00
// In caso di NS verifico che non sia semplicemente un codice 00404 (Fattura duplicata)
2024-03-20 16:15:37 +01:00
if ( $documento -> codice_stato_fe == 'NS' && ( $documento -> stato != ( new Stato ()) -> getByField ( 'name' , 'Bozza' )) && ( $documento -> stato != ( new Stato ()) -> getByField ( 'name' , 'Non valida' ))) {
2022-06-27 23:50:15 +02:00
$ricevuta_principale = $documento -> getRicevutaPrincipale ();
2023-08-04 14:54:28 +02:00
2022-06-27 23:50:15 +02:00
if ( ! empty ( $ricevuta_principale )) {
$contenuto_ricevuta = XML :: readFile ( $ricevuta_principale -> filepath );
$lista_errori = $contenuto_ricevuta [ 'ListaErrori' ];
if ( $lista_errori ) {
$lista_errori = $lista_errori [ 0 ] ? $lista_errori : [ $lista_errori ];
$errore = $lista_errori [ 0 ][ 'Errore' ];
2023-08-04 14:54:28 +02:00
if ( $errore [ 'Codice' ] == '00404' ) {
2022-06-27 23:50:15 +02:00
return ;
}
}
}
}
2022-05-13 13:24:03 +02:00
$documenti_scarto [] = Modules :: link ( 'Fatture di vendita' , $documento -> id , tr ( '_ICON_ Fattura numero _NUM_ del _DATE_ : <b>_STATO_</b>' , [
'_ICON_' => '<i class="' . $stato_fe [ 'icon' ] . '"></i>' ,
'_NUM_' => $documento -> numero_esterno ,
'_DATE_' => dateFormat ( $documento -> data ),
'_STATO_' => $stato_fe [ 'descrizione' ],
]));
2022-11-03 10:47:42 +01:00
$show_avviso = $show_avviso ? : ( $documento -> data_stato_fe < ( new Carbon ()) -> subDays ( 4 ) ? 1 : 0 );
2022-05-13 13:24:03 +02:00
} elseif ( in_array ( $documento -> codice_stato_fe , $codici_invio )) {
2023-06-09 11:49:58 +02:00
$is_estera = false ;
2023-08-04 14:54:28 +02:00
2023-06-09 10:14:20 +02:00
if ( setting ( 'Rimuovi avviso fatture estere' )) {
2024-03-22 15:52:24 +01:00
$is_estera = $database -> fetchOne ( 'SELECT `idanagrafica` FROM `an_anagrafiche` INNER JOIN `an_nazioni` ON `an_anagrafiche`.`id_nazione` = `an_nazioni`.`id` LEFT JOIN `an_nazioni_lang` ON (`an_nazioni`.`id` = `an_nazioni_lang`.`id_record` AND `an_nazioni_lang`.`id_lang` = ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `an_nazioni_lang`.`name` != "Italia" AND `an_anagrafiche`.`idanagrafica` = ' . prepare ( $documento -> idanagrafica ));
2023-06-09 10:14:20 +02:00
}
2023-08-04 14:54:28 +02:00
2023-06-09 10:14:20 +02:00
if ( $documento -> data <= $data_limite_invio && ! $is_estera ) {
2024-02-25 11:24:18 +01:00
$documenti_invio [] = Modules :: link ( 'Fatture di vendita' , $documento -> id , tr ( '_ICON_ Fattura numero _NUM_ del _DATE_ : <b>_STATO_</b> _ANTICIPATA_' , [
2022-05-13 13:24:03 +02:00
'_ICON_' => '<i class="' . $stato_fe [ 'icon' ] . '"></i>' ,
'_NUM_' => $documento -> numero_esterno ,
'_DATE_' => dateFormat ( $documento -> data ),
'_STATO_' => $stato_fe [ 'descrizione' ],
2024-03-22 15:52:24 +01:00
'_ANTICIPATA_' => (( $documento -> data -> diffInDays ( $data_limite_invio ) < 10 ) ? '(Anticipata)' : '' ),
2022-05-13 13:24:03 +02:00
]));
}
}
}
2024-01-15 15:30:45 +01:00
// Controllo già presente sul plugin Ricevute FE
2022-05-13 13:24:03 +02:00
if ( sizeof ( $documenti_scarto ) > 0 ) {
echo '
< div class = " alert alert-danger " >
2023-08-04 14:54:28 +02:00
< i class = " fa fa-warning " ></ i > '.tr(' < b > ATTENZIONE :</ b > le seguenti fatture riscontrano problemi ').' :< ul > ' ;
foreach ( $documenti_scarto as $documento ) {
echo '
2022-05-13 13:24:03 +02:00
< li >< b > '.$documento.' </ b ></ li > ' ;
2023-08-04 14:54:28 +02:00
}
2022-05-13 13:24:03 +02:00
echo '
2022-11-03 10:47:42 +01:00
</ ul > ' ;
2023-08-04 14:54:28 +02:00
if ( $show_avviso ) {
echo tr ( 'Cosa fare in caso di fattura elettronica scartata? Dovrai correggere la fattura e inviarla di nuovo al SdI <b>entro 5 giorni dalla data di notifica dello scarto</b>, mantenendo lo stesso numero e data del documento.' );
}
2022-11-03 10:47:42 +01:00
echo '
2022-05-13 13:24:03 +02:00
</ div > ' ;
}
if ( sizeof ( $documenti_invio ) > 0 ) {
echo '
2024-02-24 01:08:41 +01:00
< div class = " alert push alert-warning " >
< h4 >< i class = " icon fa fa-clock-o " ></ i > '.tr(' Attenzione ').' </ h4 > '.tr(' Le seguenti fatture sono in attesa di essere inviate ').' :< ul > ' ;
2023-08-04 14:54:28 +02:00
foreach ( $documenti_invio as $documento ) {
echo '
2022-05-13 13:24:03 +02:00
< li >< b > '.$documento.' </ b ></ li > ' ;
2023-08-04 14:54:28 +02:00
}
2022-05-13 13:24:03 +02:00
echo '
</ ul >
</ div > ' ;
}
}