2017-09-06 11:59:47 +02:00
< ? php
include_once __DIR__ . '/../../core.php' ;
2019-03-07 17:16:42 +01:00
use Modules\Fatture\Fattura ;
2018-09-19 16:51:37 +02:00
use Util\Zip ;
2017-09-06 11:59:47 +02:00
switch ( post ( 'op' )) {
case 'export-bulk' :
$dir = DOCROOT . '/files/export_fatture/' ;
2017-09-13 15:38:47 +02:00
directory ( $dir . 'tmp/' );
2017-09-06 11:59:47 +02:00
2019-03-07 17:16:42 +01:00
$dir = slashes ( $dir );
$zip = slashes ( $dir . 'fatture_' . time () . '.zip' );
2017-09-07 16:51:14 +02:00
// Rimozione dei contenuti precedenti
$files = glob ( $dir . '/*.zip' );
foreach ( $files as $file ) {
2017-09-11 17:49:03 +02:00
delete ( $file );
2017-09-07 16:51:14 +02:00
}
2017-09-06 11:59:47 +02:00
// Selezione delle fatture da stampare
2018-07-18 15:20:10 +02:00
$fatture = $dbo -> fetchArray ( 'SELECT co_documenti.id, numero_esterno, data, ragione_sociale, co_tipidocumento.descrizione FROM co_documenti INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id IN(' . implode ( ',' , $id_records ) . ')' );
2017-09-06 11:59:47 +02:00
2018-07-18 15:20:10 +02:00
if ( ! empty ( $fatture )) {
foreach ( $fatture as $r ) {
2017-09-13 18:47:42 +02:00
$numero = ! empty ( $r [ 'numero_esterno' ]) ? $r [ 'numero_esterno' ] : $r [ 'numero' ];
$numero = str_replace ([ '/' , '\\' ], '-' , $numero );
2017-09-06 11:59:47 +02:00
2017-09-13 18:47:42 +02:00
// Gestione della stampa
$rapportino_nome = sanitizeFilename ( $numero . ' ' . $r [ 'data' ] . ' ' . $r [ 'ragione_sociale' ] . '.pdf' );
$filename = slashes ( $dir . 'tmp/' . $rapportino_nome );
2017-09-06 11:59:47 +02:00
2018-09-26 10:49:38 +02:00
$print = Prints :: getModulePredefinedPrint ( $id_module );
2018-06-26 14:30:26 +02:00
2018-06-29 15:57:12 +02:00
Prints :: render ( $print [ 'id' ], $r [ 'id' ], $filename );
2017-09-13 18:47:42 +02:00
}
2017-09-06 11:59:47 +02:00
2017-09-13 18:47:42 +02:00
// Creazione zip
if ( extension_loaded ( 'zip' )) {
2019-03-07 17:16:42 +01:00
Zip :: create ( $dir . 'tmp/' , $zip );
2017-09-06 11:59:47 +02:00
2017-09-13 18:47:42 +02:00
// Invio al browser dello zip
2019-03-07 17:16:42 +01:00
download ( $zip );
2017-09-06 11:59:47 +02:00
2017-09-13 18:47:42 +02:00
// Rimozione dei contenuti
delete ( $dir . 'tmp/' );
}
2017-09-06 12:50:44 +02:00
}
2017-09-06 11:59:47 +02:00
break ;
2018-03-19 19:07:32 +01:00
2019-03-07 17:16:42 +01:00
case 'delete-bulk' :
2019-05-16 04:52:16 +02:00
foreach ( $id_records as $id ) {
$dbo -> query ( 'DELETE FROM co_documenti WHERE id = ' . prepare ( $id ) . Modules :: getAdditionalsQuery ( $id_module ));
$dbo -> query ( 'DELETE FROM co_righe_documenti WHERE iddocumento=' . prepare ( $id ) . Modules :: getAdditionalsQuery ( $id_module ));
$dbo -> query ( 'DELETE FROM co_scadenziario WHERE iddocumento=' . prepare ( $id ) . Modules :: getAdditionalsQuery ( $id_module ));
$dbo -> query ( 'DELETE FROM mg_movimenti WHERE iddocumento=' . prepare ( $id ) . Modules :: getAdditionalsQuery ( $id_module ));
}
flash () -> info ( tr ( 'Fatture eliminate!' ));
2019-03-07 17:16:42 +01:00
break ;
case 'export-xml-bulk' :
$dir = DOCROOT . '/files/export_fatture/' ;
directory ( $dir . 'tmp/' );
$dir = slashes ( $dir );
$zip = slashes ( $dir . 'fatture_' . time () . '.zip' );
// Rimozione dei contenuti precedenti
$files = glob ( $dir . '/*.zip' );
foreach ( $files as $file ) {
delete ( $file );
}
2019-06-13 14:46:04 +02:00
// Selezione delle fatture da esportare
2019-05-10 17:30:00 +02:00
$fatture = $dbo -> fetchArray ( 'SELECT co_documenti.id, numero_esterno, data, ragione_sociale, co_tipidocumento.descrizione, co_tipidocumento.dir FROM co_documenti INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id WHERE co_documenti.id IN(' . implode ( ',' , $id_records ) . ')' );
2019-03-07 17:16:42 +01:00
$failed = [];
2019-06-13 14:46:04 +02:00
$added = 0 ;
2019-03-07 17:16:42 +01:00
if ( ! empty ( $fatture )) {
foreach ( $fatture as $r ) {
$fattura = Fattura :: find ( $r [ 'id' ]);
$include = true ;
try {
2019-03-28 13:00:49 +01:00
if ( $r [ 'dir' ] == 'entrata' ) {
$fe = new \Plugins\ExportFE\FatturaElettronica ( $fattura -> id );
$include = $fe -> isGenerated ();
} else {
$include = $fattura -> isFE ();
}
2019-03-07 17:16:42 +01:00
} catch ( UnexpectedValueException $e ) {
$include = false ;
2018-06-26 14:30:26 +02:00
}
2019-03-07 17:16:42 +01:00
if ( ! $include ) {
$failed [] = $fattura -> numero_esterno ;
} else {
2019-03-28 13:00:49 +01:00
if ( $r [ 'dir' ] == 'entrata' ) {
$src = $fe -> getFilename ();
$dst = $src ;
} else {
2019-04-04 17:30:58 +02:00
$src = basename ( $fattura -> uploads () -> where ( 'name' , 'Fattura Elettronica' ) -> first () -> filepath );
$dst = basename ( $fattura -> uploads () -> where ( 'name' , 'Fattura Elettronica' ) -> first () -> original );
2019-03-28 13:00:49 +01:00
}
2019-03-07 17:16:42 +01:00
2019-03-28 13:00:49 +01:00
$file = slashes ( $module -> upload_directory . '/' . $src );
$dest = slashes ( $dir . '/tmp/' . $dst );
2019-03-07 17:16:42 +01:00
$result = copy ( $file , $dest );
2019-06-13 14:46:04 +02:00
2019-03-07 17:16:42 +01:00
if ( $result ) {
2019-06-13 14:46:04 +02:00
$added ++ ;
2019-03-07 17:16:42 +01:00
operationLog ( 'export-xml-bulk' , [ 'id_record' => $r [ 'id' ]]);
} else {
$failed [] = $fattura -> numero_esterno ;
}
}
}
// Creazione zip
2019-06-13 14:46:04 +02:00
if ( extension_loaded ( 'zip' ) and ! empty ( $added ) ) {
2019-03-07 17:16:42 +01:00
Zip :: create ( $dir . 'tmp/' , $zip );
// Invio al browser il file zip
download ( $zip );
// Rimozione dei contenuti
delete ( $dir . 'tmp/' );
2018-06-26 14:30:26 +02:00
}
2019-03-07 17:16:42 +01:00
if ( ! empty ( $failed )) {
2019-06-13 14:46:04 +02:00
flash () -> warning ( tr ( 'Le fatture elettroniche _LIST_ non sono state incluse poichè non ancora generate o non presenti sul server' , [
2019-03-07 17:16:42 +01:00
'_LIST_' => implode ( ', ' , $failed ),
]));
}
}
2018-03-22 15:40:20 +01:00
break ;
2019-04-11 16:04:08 +02:00
case 'registra-contabile' :
2019-04-12 09:20:23 +02:00
//Generazione della descrizione del movimento
2019-04-13 00:09:48 +02:00
$rs_fatture = $dbo -> fetchArray ( 'SELECT *, co_documenti.id AS id, co_documenti.data AS data_doc FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id IN(' . implode ( ',' , $id_records ) . ')' );
2019-04-12 09:20:23 +02:00
//calcolo della descrizione
$descrizione_movimento = 'Pag. fatture num. ' ;
2019-04-13 00:09:48 +02:00
for ( $i = 0 ; $i < sizeof ( $rs_fatture ); ++ $i ) {
if ( $rs_fatture [ $i ][ 'numero_esterno' ] != '' ) {
$descrizione_movimento .= $rs_fatture [ $i ][ 'numero_esterno' ] . ' ' ;
} else {
$descrizione_movimento .= $rs_fatture [ $i ][ 'numero' ] . ' ' ;
2019-04-12 09:20:23 +02:00
}
}
$idmastrino = get_new_idmastrino ();
2019-04-15 09:57:38 +02:00
$importo_conto_aziendale = 0 ;
2019-04-13 00:09:48 +02:00
for ( $i = 0 ; $i < sizeof ( $rs_fatture ); ++ $i ) {
2019-04-12 09:20:23 +02:00
//Inserimento righe cliente
2019-04-13 00:09:48 +02:00
if ( $rs_fatture [ $i ][ 'dir' ] == 'entrata' ) {
$dir = 'entrata' ;
} else {
$dir = 'uscita' ;
2019-04-12 09:20:23 +02:00
}
$field = 'idconto_' . ( $dir == 'entrata' ? 'vendite' : 'acquisti' );
$idconto_aziendale = $dbo -> fetchArray ( 'SELECT ' . $field . ' FROM co_pagamenti WHERE id = (SELECT idpagamento FROM co_documenti WHERE id=' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ') GROUP BY descrizione' )[ 0 ][ $field ];
2019-04-13 00:09:48 +02:00
2019-04-12 09:20:23 +02:00
// Lettura conto di default
$idconto_aziendale = ! empty ( $idconto_aziendale ) ? $idconto_aziendale : setting ( 'Conto aziendale predefinito' );
2019-04-13 00:09:48 +02:00
$query = 'SELECT SUM(ABS(da_pagare-pagato)) AS rata FROM co_scadenziario WHERE iddocumento=' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ' GROUP BY iddocumento' ;
2019-04-12 09:20:23 +02:00
$rs = $dbo -> fetchArray ( $query );
$totale_pagato = $rs [ 0 ][ 'rata' ];
2019-04-15 09:57:38 +02:00
$importo_conto_aziendale += $totale_pagato ;
}
//Inserimento riga unica per conto aziendale
if ( $dir == 'entrata' ) {
$dbo -> query ( 'INSERT INTO co_movimenti(idmastrino, data, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', NOW(), ' . prepare ( $descrizione_movimento ) . ', ' . prepare ( $idconto_aziendale ) . ', ' . prepare ( $importo_conto_aziendale ) . ', 1)' );
} else {
$dbo -> query ( 'INSERT INTO co_movimenti(idmastrino, data, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', NOW(), ' . prepare ( $descrizione_movimento ) . ', ' . prepare ( $idconto_aziendale ) . ', ' . prepare ( - $importo_conto_aziendale ) . ', 1)' );
}
for ( $i = 0 ; $i < sizeof ( $rs_fatture ); ++ $i ) {
//Inserimento righe cliente
if ( $rs_fatture [ $i ][ 'dir' ] == 'entrata' ) {
$dir = 'entrata' ;
} else {
$dir = 'uscita' ;
}
$query = 'SELECT SUM(ABS(da_pagare-pagato)) AS rata FROM co_scadenziario WHERE iddocumento=' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ' GROUP BY iddocumento' ;
$rs = $dbo -> fetchArray ( $query );
$totale_pagato = $rs [ 0 ][ 'rata' ];
2019-04-12 09:20:23 +02:00
// conto crediti clienti
if ( $dir == 'entrata' ) {
// Se è la prima nota di una fattura leggo il conto del cliente
if ( $rs_fatture [ $i ][ 'id' ] != '' ) {
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id=' . prepare ( $rs_fatture [ $i ][ 'id' ]);
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'idconto_cliente' ];
} else {
$query = " SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo clienti' " ;
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'id' ];
}
}
// conto debiti fornitori
else {
// Se è la prima nota di una fattura leggo il conto del fornitore
if ( $rs_fatture [ $i ][ 'id' ] != '' ) {
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id=' . prepare ( $rs_fatture [ $i ][ 'id' ]);
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'idconto_fornitore' ];
} else {
$query = " SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo fornitori' " ;
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'id' ];
}
}
// Lettura causale movimento (documento e ragione sociale)
2019-04-15 09:57:38 +02:00
$importo_conto_controparte = $totale_pagato ;
2019-04-12 09:20:23 +02:00
if ( $dir == 'entrata' ) {
2019-04-13 00:09:48 +02:00
$dbo -> query ( 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', NOW(), ' . prepare ( $rs_fatture [ $i ][ 'data_doc' ]) . ', ' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ', ' . prepare ( $rs_fatture [ $i ][ 'idanagrafica' ]) . ', ' . prepare ( $descrizione_movimento ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare ( - $importo_conto_controparte ) . ', 1)' );
2019-04-12 09:20:23 +02:00
} else {
2019-04-13 00:09:48 +02:00
$dbo -> query ( 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', NOW(), ' . prepare ( $rs_fatture [ $i ][ 'data_doc' ]) . ', ' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ', ' . prepare ( $rs_fatture [ $i ][ 'idanagrafica' ]) . ', ' . prepare ( $descrizione_movimento ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare ( $importo_conto_controparte ) . ', 1)' );
2019-04-12 09:20:23 +02:00
}
aggiorna_scadenziario ( $rs_fatture [ $i ][ 'id' ], abs ( $totale_pagato ), date ( 'd/m/Y' ));
// Verifico se la fattura è stata pagata tutta, così imposto lo stato a "Pagato"
$query = 'SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento=' . prepare ( $rs_fatture [ $i ][ 'id' ]);
$rs = $dbo -> fetchArray ( $query );
// Aggiorno lo stato della fattura
if ( abs ( $rs [ 0 ][ 'tot_pagato' ]) == abs ( $rs [ 0 ][ 'tot_da_pagare' ])) {
$dbo -> query ( " UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Pagato') WHERE id= " . prepare ( $rs_fatture [ $i ][ 'id' ]));
} elseif ( abs ( $rs [ 0 ][ 'tot_pagato' ]) != abs ( $rs [ 0 ][ 'tot_da_pagare' ]) && abs ( $rs [ 0 ][ 'tot_pagato' ]) != '0' ) {
$dbo -> query ( " UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Parzialmente pagato') WHERE id= " . prepare ( $rs_fatture [ $i ][ 'id' ]));
} else {
$dbo -> query ( " UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Emessa') WHERE id= " . prepare ( $rs_fatture [ $i ][ 'id' ]));
}
// Aggiorno lo stato dei preventivi collegati alla fattura se ce ne sono
$query2 = 'SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento=' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ' AND NOT idpreventivo=0 AND idpreventivo IS NOT NULL' ;
$rs2 = $dbo -> fetchArray ( $query2 );
for ( $j = 0 ; $j < sizeof ( $rs2 ); ++ $j ) {
$dbo -> query ( " UPDATE co_preventivi SET idstato=(SELECT id FROM co_statipreventivi WHERE descrizione='Pagato') WHERE id= " . prepare ( $rs2 [ $j ][ 'idpreventivo' ]));
}
// Aggiorno lo stato dei contratti collegati alla fattura se ce ne sono
$query2 = 'SELECT idcontratto FROM co_righe_documenti WHERE iddocumento=' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ' AND NOT idcontratto=0 AND idcontratto IS NOT NULL' ;
$rs2 = $dbo -> fetchArray ( $query2 );
for ( $j = 0 ; $j < sizeof ( $rs2 ); ++ $j ) {
$dbo -> query ( " UPDATE co_contratti SET idstato=(SELECT id FROM co_staticontratti WHERE descrizione='Pagato') WHERE id= " . prepare ( $rs2 [ $j ][ 'idcontratto' ]));
}
// Aggiorno lo stato degli interventi collegati alla fattura se ce ne sono
$query2 = 'SELECT idintervento FROM co_righe_documenti WHERE iddocumento=' . prepare ( $rs_fatture [ $i ][ 'id' ]) . ' AND idintervento IS NOT NULL' ;
$rs2 = $dbo -> fetchArray ( $query2 );
for ( $j = 0 ; $j < sizeof ( $rs2 ); ++ $j ) {
$dbo -> query ( " UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Fatturato') WHERE id_preventivo= " . prepare ( $rs2 [ $j ][ 'idpreventivo' ]));
}
}
$database -> commitTransaction ();
header ( 'location:' . $rootdir . '/editor.php?id_module=' . Modules :: get ( 'Prima nota' )[ 'id' ] . '&id_record=' . $idmastrino );
exit ;
2019-04-12 01:11:32 +02:00
2019-04-11 16:04:08 +02:00
break ;
2017-09-06 11:59:47 +02:00
}
2019-05-13 17:01:43 +02:00
if ( App :: debug ()) {
2019-05-16 04:52:16 +02:00
$operations = [
2019-06-13 14:46:04 +02:00
'delete-bulk' => '<span><i class="fa fa-trash" ></i> ' . tr ( 'Elimina selezionati' ) . '</span>' ,
2019-05-16 04:52:16 +02:00
];
2019-05-13 17:01:43 +02:00
}
2018-03-19 19:07:32 +01:00
2019-05-13 17:01:43 +02:00
$operations [ 'registra-contabile' ] = [
2019-06-13 14:46:04 +02:00
'text' => '<span><i class="fa fa-calculator" ></i> ' . tr ( 'Registra contabile pagamento' ) . '</span>' ,
2019-04-11 16:04:08 +02:00
'data' => [
2019-06-13 14:46:04 +02:00
'title' => '' ,
'msg' => tr ( 'Vuoi aggiungere un movimento contabile per le fatture selezionate?<br><small>(le fatture dovranno essere nello stato <i class="fa fa-clock-o text-info" title="Emessa"></i> <small>Emessa</small> altrimenti non saranno processate)</small>' ),
2019-04-11 16:04:08 +02:00
'button' => tr ( 'Procedi' ),
'class' => 'btn btn-lg btn-warning' ,
'blank' => true ,
],
];
2019-06-13 14:46:04 +02:00
2019-03-07 17:16:42 +01:00
if ( $module -> name == 'Fatture di vendita' ) {
2019-05-13 17:01:43 +02:00
$operations [ 'export-bulk' ] = [
2019-06-13 14:46:04 +02:00
'text' => '<span class="' . (( ! extension_loaded ( 'zip' )) ? 'text-muted disabled' : '' ) . '"><i class="fa fa-file-archive-o" ></i> ' . tr ( 'Esporta stampe' ) . '</span>' ,
2017-09-06 11:59:47 +02:00
'data' => [
2019-06-13 14:46:04 +02:00
'title' => '' ,
'msg' => tr ( 'Vuoi davvero esportare i PDF delle fatture selezionate in un archivio ZIP?' ),
2017-09-06 11:59:47 +02:00
'button' => tr ( 'Procedi' ),
'class' => 'btn btn-lg btn-warning' ,
2017-09-07 16:51:14 +02:00
'blank' => true ,
2017-09-06 11:59:47 +02:00
],
2019-03-07 17:16:42 +01:00
];
}
2019-05-13 17:01:43 +02:00
$operations [ 'export-xml-bulk' ] = [
2019-06-13 14:46:04 +02:00
'text' => '<span class="' . (( ! extension_loaded ( 'zip' )) ? 'text-muted disabled' : '' ) . '"><i class="fa fa-file-archive-o" ></i> ' . tr ( 'Esporta XML' ) . '</span>' ,
2019-03-28 13:00:49 +01:00
'data' => [
2019-06-13 14:46:04 +02:00
'title' => '' ,
'msg' => tr ( 'Vuoi davvero esportare le fatture elettroniche selezionate in un archivio ZIP?' ),
2019-03-28 13:00:49 +01:00
'button' => tr ( 'Procedi' ),
'class' => 'btn btn-lg btn-warning' ,
'blank' => true ,
],
];
2019-05-13 17:01:43 +02:00
return $operations ;