2018-09-24 18:10:16 +02: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-09-24 18:10:16 +02:00
include_once __DIR__ . '/../../core.php' ;
2020-09-16 15:57:49 +02:00
use Modules\DDT\DDT ;
use Modules\Ordini\Ordine ;
2018-11-30 15:33:25 +01:00
use Plugins\ImportFE\FatturaElettronica ;
use Plugins\ImportFE\Interaction ;
2019-07-22 15:45:36 +02:00
$file = null ;
2018-09-24 18:10:16 +02:00
switch ( filter ( 'op' )) {
2019-07-24 17:17:54 +02:00
case 'list' :
$list = Interaction :: getRemoteList ();
echo json_encode ( $list );
break ;
2018-09-24 18:10:16 +02:00
case 'save' :
2019-11-15 15:11:20 +01:00
$temp_name = $_FILES [ 'blob' ][ 'tmp_name' ];
$name = $_FILES [ 'blob' ][ 'name' ];
2020-10-29 16:48:37 +01:00
if ( string_ends_with ( $name , '.zip' )) {
2019-11-15 15:11:20 +01:00
$directory = FatturaElettronica :: getImportDirectory ();
Util\Zip :: extract ( $temp_name , $directory );
// Redirect forzato per l'importazione
echo json_encode ([
'id' => 1 ,
]);
exit ();
} else {
$content = file_get_contents ( $temp_name );
$file = FatturaElettronica :: store ( $_FILES [ 'blob' ][ 'name' ], $content );
}
2018-09-25 11:55:52 +02:00
2019-07-10 15:02:09 +02:00
// no break
2018-11-30 15:33:25 +01:00
case 'prepare' :
2019-07-22 12:52:48 +02:00
if ( ! isset ( $file )) {
2019-07-22 15:45:36 +02:00
$name = filter ( 'name' );
2019-07-24 17:17:54 +02:00
$file = Interaction :: getInvoiceFile ( $name );
2019-07-22 11:35:44 +02:00
}
2018-09-24 18:10:16 +02:00
2019-07-24 17:39:11 +02:00
try {
if ( ! FatturaElettronica :: isValid ( $file )) {
echo json_encode ([
'already' => 1 ,
]);
return ;
2019-07-22 18:35:13 +02:00
}
2019-07-24 17:39:11 +02:00
} catch ( Exception $e ) {
}
// Individuazione ID fisico
$files = Interaction :: getFileList ();
foreach ( $files as $key => $value ) {
if ( $value [ 'name' ] == $file ) {
$index = $key ;
2019-07-22 18:35:13 +02:00
2019-07-24 17:39:11 +02:00
break ;
}
2018-11-30 15:33:25 +01:00
}
2018-09-24 18:10:16 +02:00
2019-07-24 17:39:11 +02:00
echo json_encode ([
'id' => $index + 1 ,
]);
2018-11-30 15:33:25 +01:00
break ;
2019-02-12 11:42:48 +01:00
case 'delete' :
2019-07-24 17:39:11 +02:00
$file_id = get ( 'file_id' );
2019-07-24 17:54:50 +02:00
$directory = FatturaElettronica :: getImportDirectory ();
2019-07-24 17:39:11 +02:00
$files = Interaction :: getFileList ();
$file = $files [ $file_id ];
2019-07-24 17:54:50 +02:00
if ( ! empty ( $file )) {
delete ( $directory . '/' . $file [ 'name' ]);
}
2019-07-24 17:39:11 +02:00
break ;
2019-07-24 17:54:50 +02:00
2019-07-24 17:39:11 +02:00
case 'download' :
$file_id = get ( 'file_id' );
2019-07-24 17:54:50 +02:00
$directory = FatturaElettronica :: getImportDirectory ();
2019-07-24 17:39:11 +02:00
$files = Interaction :: getFileList ();
$file = $files [ $file_id ];
2019-07-24 17:54:50 +02:00
if ( ! empty ( $file )) {
download ( $directory . '/' . $file [ 'name' ]);
}
2019-02-12 11:42:48 +01:00
break ;
2018-11-30 15:33:25 +01:00
case 'generate' :
2019-01-25 10:44:03 +01:00
$filename = post ( 'filename' );
2019-04-19 03:18:05 +02:00
$info = [
'id_pagamento' => post ( 'pagamento' ),
'id_segment' => post ( 'id_segment' ),
'id_tipo' => post ( 'id_tipo' ),
2019-07-22 11:35:44 +02:00
'ref_fattura' => post ( 'ref_fattura' ),
2019-05-17 05:56:10 +02:00
'data_registrazione' => post ( 'data_registrazione' ),
2019-04-19 03:18:05 +02:00
'articoli' => post ( 'articoli' ),
'iva' => post ( 'iva' ),
'conto' => post ( 'conto' ),
2020-02-24 18:30:05 +01:00
'tipo_riga_riferimento' => post ( 'tipo_riga_riferimento' ),
'id_riga_riferimento' => post ( 'id_riga_riferimento' ),
2021-02-18 17:46:38 +01:00
'tipo_riga_riferimento_vendita' => post ( 'tipo_riga_riferimento_vendita' ),
'id_riga_riferimento_vendita' => post ( 'id_riga_riferimento_vendita' ),
2019-04-19 03:18:05 +02:00
'movimentazione' => post ( 'movimentazione' ),
2019-10-18 16:40:15 +02:00
'crea_articoli' => post ( 'crea_articoli' ),
2021-02-04 13:19:14 +01:00
'is_ritenuta_pagata' => post ( 'is_ritenuta_pagata' ),
2019-04-19 03:18:05 +02:00
];
$fattura_pa = FatturaElettronica :: manage ( $filename );
2019-07-24 17:17:54 +02:00
$id_fattura = $fattura_pa -> save ( $info );
2018-09-24 18:10:16 +02:00
2019-07-24 17:17:54 +02:00
ricalcola_costiagg_fattura ( $id_fattura );
2019-07-25 17:20:24 +02:00
elimina_scadenze ( $id_fattura );
elimina_movimenti ( $id_fattura , 0 );
2021-01-29 12:21:58 +01:00
aggiungi_scadenza ( $id_fattura , post ( 'pagamento' ));
2019-07-24 17:17:54 +02:00
aggiungi_movimento ( $id_fattura , 'uscita' );
2018-10-29 22:23:29 +01:00
2018-11-30 15:33:25 +01:00
$fattura_pa -> delete ();
2020-09-16 09:14:00 +02:00
// Aggiorno la tipologia di anagrafica fornitore
2020-09-16 15:57:49 +02:00
$anagrafica = $database -> fetchOne ( 'SELECT idanagrafica FROM co_documenti WHERE co_documenti.id=' . prepare ( $id_fattura ));
$rs_t = $database -> fetchOne ( " SELECT * FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica=(SELECT an_tipianagrafiche.idtipoanagrafica FROM an_tipianagrafiche WHERE an_tipianagrafiche.descrizione='Fornitore') AND idanagrafica= " . prepare ( $anagrafica [ 'idanagrafica' ]));
2019-11-13 11:02:45 +01:00
2020-09-16 09:14:00 +02:00
// Se non trovo corrispondenza aggiungo all'anagrafica la tipologia fornitore
2019-12-05 15:50:13 +01:00
if ( empty ( $rs_t )) {
2020-09-16 15:57:49 +02:00
$database -> query ( " INSERT INTO an_tipianagrafiche_anagrafiche (idtipoanagrafica, idanagrafica) VALUES ((SELECT an_tipianagrafiche.idtipoanagrafica FROM an_tipianagrafiche WHERE an_tipianagrafiche.descrizione='Fornitore'), " . prepare ( $anagrafica [ 'idanagrafica' ]) . ')' );
2019-11-13 11:02:45 +01:00
}
2019-02-14 10:58:43 +01:00
// Processo il file ricevuto
if ( Interaction :: isEnabled ()) {
2019-07-24 17:17:54 +02:00
$process_result = Interaction :: processInvoice ( $filename );
2019-02-14 10:58:43 +01:00
if ( $process_result != '' ) {
flash () -> error ( $process_result );
2020-09-23 17:53:19 +02:00
redirect ( base_path () . '/controller.php?id_module=' . $id_module );
2019-07-22 11:35:44 +02:00
return ;
2019-02-14 10:58:43 +01:00
}
}
2019-07-24 17:17:54 +02:00
$files = Interaction :: getFileList ();
$file = $files [ $id_record - 1 ];
2018-09-26 12:06:24 +02:00
2019-07-24 17:17:54 +02:00
if ( get ( 'sequence' ) == null ) {
2020-09-23 17:53:19 +02:00
redirect ( base_path () . '/editor.php?id_module=' . $id_module . '&id_record=' . $id_fattura );
2019-07-24 17:17:54 +02:00
} elseif ( ! empty ( $file )) {
2020-09-23 17:53:19 +02:00
redirect ( base_path () . '/editor.php?id_module=' . $id_module . '&id_plugin=' . $id_plugin . '&id_record=' . $id_record . '&sequence=1' );
2019-07-24 17:17:54 +02:00
} else {
flash () -> info ( tr ( 'Tutte le fatture salvate sono state importate!' ));
2020-09-23 17:53:19 +02:00
redirect ( base_path () . '/controller.php?id_module=' . $id_module );
2019-07-24 17:17:54 +02:00
}
2018-09-26 12:06:24 +02:00
break ;
2019-04-19 18:50:16 +02:00
case 'process' :
$name = get ( 'name' );
// Processo il file ricevuto
if ( Interaction :: isEnabled ()) {
2019-07-24 17:17:54 +02:00
$process_result = Interaction :: processInvoice ( $name );
2019-07-10 15:02:09 +02:00
if ( ! empty ( $process_result )) {
2019-04-19 18:50:16 +02:00
flash () -> error ( $process_result );
}
}
break ;
2020-02-24 12:21:47 +01:00
case 'compile' :
2021-03-04 14:01:14 +01:00
// Gestione del caso di anagrafica inesistente
2020-03-13 10:27:20 +01:00
if ( empty ( $anagrafica )) {
echo json_encode ([]);
return ;
}
2020-02-24 12:21:47 +01:00
$fatture = $anagrafica -> fattureAcquisto ()
-> contabile ()
2020-11-09 18:51:46 +01:00
-> orderBy ( 'created_at' , 'DESC' )
2020-02-24 12:21:47 +01:00
-> take ( 10 )
-> get ();
$righe = collect ();
foreach ( $fatture as $fattura ) {
$righe -> push ( $fattura -> righe );
$righe -> push ( $fattura -> articoli );
}
$righe = $righe -> flatten ();
2021-03-04 14:01:14 +01:00
// Gestione del caso di anagrafica senza fatture o con fatture senza righe
if ( $fatture -> isEmpty () || $righe -> isEmpty ()) {
echo json_encode ([]);
return ;
}
2020-02-24 12:21:47 +01:00
// Ricerca del tipo di documento più utilizzato
$tipi = $fatture -> groupBy ( function ( $item , $key ) {
return $item -> tipo -> id ;
}) -> transform ( function ( $item , $key ) {
return $item -> count ();
});
$id_tipo = $tipi -> sort () -> keys () -> last ();
// Ricerca del tipo di pagamento più utilizzato
$pagamenti = $fatture -> mapToGroups ( function ( $item , $key ) {
return [ $item -> pagamento -> id => $item -> pagamento ];
});
$id_pagamento = $pagamenti -> map ( function ( $item , $key ) {
return $item -> count ();
}) -> sort () -> keys () -> last ();
$pagamento = $pagamenti [ $id_pagamento ] -> first ();
// Ricerca del conto più utilizzato
$conti = $righe -> groupBy ( function ( $item , $key ) {
return $item -> idconto ;
}) -> transform ( function ( $item , $key ) {
return $item -> count ();
});
$id_conto = $conti -> sort () -> keys () -> last ();
2020-09-16 15:57:49 +02:00
$conto = $database -> fetchOne ( 'SELECT * FROM co_pianodeiconti3 WHERE id = ' . prepare ( $id_conto ));
2020-02-24 12:21:47 +01:00
// Ricerca dell'IVA più utilizzata secondo percentuali
$iva = [];
$percentuali_iva = $righe -> groupBy ( function ( $item , $key ) {
return $item -> aliquota -> percentuale ;
});
foreach ( $percentuali_iva as $key => $values ) {
$aliquote = $values -> mapToGroups ( function ( $item , $key ) {
return [ $item -> aliquota -> id => $item -> aliquota ];
});
$id_aliquota = $aliquote -> map ( function ( $item , $key ) {
return $item -> count ();
}) -> sort () -> keys () -> last ();
$aliquota = $aliquote [ $id_aliquota ] -> first ();
$iva [ $key ] = [
'id' => $aliquota -> id ,
'descrizione' => $aliquota -> descrizione ,
];
}
echo json_encode ([
'id_tipo' => $id_tipo ,
'pagamento' => [
'id' => $pagamento -> id ,
'descrizione' => $pagamento -> descrizione ,
],
'conto' => [
'id' => $conto [ 'id' ],
'descrizione' => $conto [ 'descrizione' ],
],
'iva' => $iva ,
]);
break ;
2020-09-16 15:57:49 +02:00
case 'riferimenti-automatici' :
if ( empty ( $anagrafica )) {
echo json_encode ([]);
return ;
}
$results = [];
// Iterazione sulle singole righe
$righe = $fattura_pa -> getRighe ();
foreach ( $righe as $key => $riga ) {
$collegamento = null ;
// Visualizzazione codici articoli
$codici = $riga [ 'CodiceArticolo' ] ? : [];
$codici = ! empty ( $codici ) && ! isset ( $codici [ 0 ]) ? [ $codici ] : $codici ;
// Ricerca dell'articolo collegato al codice
$id_articolo = null ;
foreach ( $codici as $codice ) {
if ( ! empty ( $anagrafica ) && empty ( $id_articolo )) {
$id_articolo = $database -> fetchOne ( 'SELECT id_articolo AS id FROM mg_fornitore_articolo WHERE codice_fornitore = ' . prepare ( $codice [ 'CodiceValore' ]) . ' AND id_fornitore = ' . prepare ( $anagrafica -> id ))[ 'id' ];
}
if ( empty ( $id_articolo )) {
$id_articolo = $database -> fetchOne ( 'SELECT id FROM mg_articoli WHERE codice = ' . prepare ( $codice [ 'CodiceValore' ]))[ 'id' ];
}
if ( ! empty ( $id_articolo )) {
break ;
}
}
$query = " SELECT dt_righe_ddt.id, dt_righe_ddt.idddt AS id_documento, dt_righe_ddt.is_descrizione, dt_righe_ddt.idarticolo, dt_righe_ddt.is_sconto, 'ddt' AS ref,
CONCAT ( 'DDT num. ' , IF ( numero_esterno != '' , numero_esterno , numero ), ' del ' , DATE_FORMAT ( data , '%d/%m/%Y' ), ' [' , ( SELECT descrizione FROM dt_statiddt WHERE id = idstatoddt ) , ']' ) AS opzione
FROM dt_righe_ddt
INNER JOIN dt_ddt ON dt_ddt . id = dt_righe_ddt . idddt
WHERE dt_ddt . idanagrafica = " .prepare( $anagrafica->id ). " AND | where_ddt |
UNION SELECT or_righe_ordini . id , or_righe_ordini . idordine AS id_documento , or_righe_ordini . is_descrizione , or_righe_ordini . idarticolo , or_righe_ordini . is_sconto , 'ordine' AS ref ,
CONCAT ( 'Ordine num. ' , IF ( numero_esterno != '' , numero_esterno , numero ), ' del ' , DATE_FORMAT ( data , '%d/%m/%Y' ), ' [' , ( SELECT descrizione FROM or_statiordine WHERE id = idstatoordine ) , ']' ) AS opzione
FROM or_righe_ordini
INNER JOIN or_ordini ON or_ordini . id = or_righe_ordini . idordine
WHERE or_ordini . idanagrafica = " .prepare( $anagrafica->id ).' AND |where_ordini|';
// Ricerca di righe DDT/Ordine con stesso Articolo
if ( ! empty ( $id_articolo )) {
$query_articolo = replace ( $query , [
'|where_ddt|' => 'dt_righe_ddt.idarticolo = ' . prepare ( $id_articolo ),
'|where_ordini|' => 'or_righe_ordini.idarticolo = ' . prepare ( $id_articolo ),
]);
$collegamento = $database -> fetchOne ( $query_articolo );
}
// Ricerca di righe DDT/Ordine per stessa descrizione
if ( empty ( $collegamento )) {
$query_descrizione = replace ( $query , [
'|where_ddt|' => 'dt_righe_ddt.descrizione = ' . prepare ( $riga [ 'Descrizione' ]),
'|where_ordini|' => 'or_righe_ordini.descrizione = ' . prepare ( $riga [ 'Descrizione' ]),
]);
$collegamento = $database -> fetchOne ( $query_descrizione );
}
// Ricerca di righe DDT/Ordine per stesso importo
if ( empty ( $collegamento )) {
$query_descrizione = replace ( $query , [
'|where_ddt|' => 'dt_righe_ddt.prezzo_unitario = ' . prepare ( $riga [ 'PrezzoUnitario' ]),
'|where_ordini|' => 'or_righe_ordini.prezzo_unitario = ' . prepare ( $riga [ 'PrezzoUnitario' ]),
]);
$collegamento = $database -> fetchOne ( $query_descrizione );
}
if ( ! empty ( $collegamento )) {
// Individuazione del documento
$documento = $collegamento [ 'ref' ] == 'ddt' ? DDT :: find ( $collegamento [ 'id_documento' ]) : Ordine :: find ( $collegamento [ 'id_documento' ]);
// Individuazione della classe di gestione per la riga
$namespace = $collegamento [ 'ref' ] == 'ddt' ? 'Modules\\DDT\\Components\\' : 'Modules\\Ordini\\Components\\' ;
if ( ! empty ( $collegamento [ 'idarticolo' ])) {
$type = 'Articolo' ;
} elseif ( ! empty ( $collegamento [ 'is_sconto' ])) {
$type = 'Sconto' ;
} elseif ( ! empty ( $collegamento [ 'is_descrizione' ])) {
$type = 'Descrizione' ;
} else {
$type = 'Riga' ;
}
// Ricerca della riga
$riga = $documento -> getRiga ( $namespace . $type , $collegamento [ 'id' ]);
2020-09-22 20:28:37 +02:00
$riga_origine = $riga -> getOriginalComponent ();
2020-09-16 15:57:49 +02:00
// Compilazione dei dati
$results [ $key ] = [
'documento' => [
'tipo' => $collegamento [ 'ref' ],
'id' => $collegamento [ 'id_documento' ],
'descrizione' => reference ( $documento , tr ( 'Origine' )),
'opzione' => $collegamento [ 'opzione' ],
],
'riga' => [
'tipo' => get_class ( $riga ),
'id' => $riga -> id ,
'descrizione' => $riga -> descrizione ,
'qta' => $riga -> qta ,
'um' => $riga -> um ,
'prezzo_unitario' => $riga -> prezzo_unitario ? : $riga_origine -> prezzo_unitario ,
'id_iva' => $riga -> id_iva ,
'iva_percentuale' => $riga -> aliquota -> percentuale ,
],
];
}
}
echo json_encode ( $results );
break ;
2018-09-24 18:10:16 +02:00
}