2017-08-04 16:28: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 />.
*/
2017-08-04 16:28:16 +02:00
include_once __DIR__ . '/../../core.php' ;
2023-02-14 15:15:11 +01:00
use Carbon\Carbon ;
2018-12-29 11:42:53 +01:00
use Modules\Anagrafiche\Anagrafica ;
2022-05-13 13:23:15 +02:00
use Modules\Anagrafiche\Tipo as TipoAnagrafica ;
2018-12-29 12:03:22 +01:00
use Modules\Articoli\Articolo as ArticoloOriginale ;
2018-12-29 11:42:53 +01:00
use Modules\Fatture\Components\Articolo ;
2018-12-25 11:32:19 +01:00
use Modules\Fatture\Components\Descrizione ;
2018-12-29 12:03:22 +01:00
use Modules\Fatture\Components\Riga ;
2019-04-04 17:30:58 +02:00
use Modules\Fatture\Components\Sconto ;
2018-12-29 12:03:22 +01:00
use Modules\Fatture\Fattura ;
2019-08-29 14:28:05 +02:00
use Modules\Fatture\Stato ;
2018-12-29 12:03:22 +01:00
use Modules\Fatture\Tipo ;
2022-05-13 13:23:15 +02:00
use Modules\Iva\Aliquota ;
2023-11-28 15:21:47 +01:00
use Plugins\ExportFE\Interaction ;
2020-09-10 16:05:08 +02:00
use Util\XML ;
2018-08-09 10:14:26 +02:00
2017-09-22 15:19:59 +02:00
$module = Modules :: get ( $id_module );
2023-07-17 16:03:38 +02:00
$op = post ( 'op' );
2017-08-04 16:28:16 +02:00
if ( $module [ 'name' ] == 'Fatture di vendita' ) {
$dir = 'entrata' ;
} else {
$dir = 'uscita' ;
}
2023-07-17 16:03:38 +02:00
// Controllo se la fattura è già stata inviata allo SDI
2023-08-04 14:54:28 +02:00
$stato_fe = $dbo -> fetchOne ( 'SELECT codice_stato_fe FROM co_documenti WHERE id = ' . $fattura -> id );
2023-07-17 16:03:38 +02:00
$ops = [ 'update' , 'add_intervento' , 'manage_documento_fe' , 'manage_riga_fe' , 'manage_articolo' , 'manage_sconto' , 'manage_riga' , 'manage_descrizione' , 'unlink_intervento' , 'delete_riga' , 'copy_riga' , 'add_serial' , 'add_articolo' , 'edit-price' ];
2023-11-28 15:21:47 +01:00
if ( $dir === 'entrata' && in_array ( $stato_fe [ 'codice_stato_fe' ], [ 'WAIT' , 'RC' , 'MC' , 'QUEUE' , 'DT' , 'EC01' , 'NE' ]) && Interaction :: isEnabled () && in_array ( $op , $ops )) {
2024-01-15 15:30:45 +01:00
// Permetto sempre la modifica delle note aggiuntive e/o della data di competenza della fattura di vendita
2023-12-01 17:21:34 +01:00
if ( $op == 'update' && ( $fattura -> note_aggiuntive != post ( 'note_aggiuntive' ) || $fattura -> data_competenza != post ( 'data_competenza' ))) {
if ( $fattura -> note_aggiuntive != post ( 'note_aggiuntive' )) {
2023-11-28 13:45:04 +01:00
$fattura -> note_aggiuntive = post ( 'note_aggiuntive' );
$fattura -> save ();
flash () -> info ( tr ( 'Note interne modificate correttamente.' ));
}
2023-12-01 17:21:34 +01:00
if ( $fattura -> data_competenza != post ( 'data_competenza' )) {
2023-11-28 13:45:04 +01:00
$fattura -> data_competenza = post ( 'data_competenza' );
$fattura -> save ();
flash () -> info ( tr ( 'Data competenza modificata correttamente.' ));
}
2023-12-01 17:21:34 +01:00
} else {
2023-11-28 13:45:04 +01:00
flash () -> warning ( tr ( 'La fattura numero _NUM_ è già stata inviata allo SDI, non è possibile effettuare modifiche.' , [
'_NUM_' => $fattura -> numero_esterno ,
]));
}
2023-07-17 16:03:38 +02:00
$op = null ;
}
switch ( $op ) {
2017-08-04 16:28:16 +02:00
case 'add' :
$idanagrafica = post ( 'idanagrafica' );
2018-07-19 15:33:32 +02:00
$data = post ( 'data' );
2017-08-04 16:28:16 +02:00
$idtipodocumento = post ( 'idtipodocumento' );
2018-03-21 16:57:31 +01:00
$id_segment = post ( 'id_segment' );
2018-03-29 00:26:23 +02:00
2020-04-22 18:17:25 +02:00
if ( $dir == 'uscita' ) {
$numero_esterno = post ( 'numero_esterno' );
}
2018-09-25 16:47:44 +02:00
$anagrafica = Anagrafica :: find ( $idanagrafica );
$tipo = Tipo :: find ( $idtipodocumento );
2020-04-24 08:26:22 +02:00
2020-04-22 18:17:25 +02:00
$fattura = Fattura :: build ( $anagrafica , $tipo , $data , $id_segment , $numero_esterno );
2018-09-25 16:47:44 +02:00
2018-08-09 10:14:26 +02:00
$id_record = $fattura -> id ;
2017-08-04 16:28:16 +02:00
2022-12-01 16:38:04 +01:00
flash () -> info ( tr ( 'Fattura aggiunta correttamente!' ));
2017-08-04 16:28:16 +02:00
break ;
case 'update' :
2020-03-02 16:13:07 +01:00
$stato = Stato :: find ( post ( 'idstatodocumento' ));
$fattura -> stato () -> associate ( $stato );
2023-02-14 12:15:02 +01:00
$data = post ( 'data' );
2019-08-29 14:28:05 +02:00
2020-03-02 16:13:07 +01:00
$tipo = Tipo :: find ( post ( 'idtipodocumento' ));
$fattura -> tipo () -> associate ( $tipo );
2019-08-29 14:28:05 +02:00
2023-07-17 16:03:38 +02:00
$data_fattura_precedente = $dbo -> fetchOne ( '
SELECT
MAX ( DATA ) AS datamax
FROM
co_documenti
INNER JOIN co_statidocumento ON co_statidocumento . id = co_documenti . idstatodocumento
INNER JOIN co_tipidocumento ON co_documenti . idtipodocumento = co_tipidocumento . id
INNER JOIN zz_segments ON zz_segments . id = co_documenti . id_segment
WHERE
co_statidocumento . descrizione = " Emessa " AND co_tipidocumento . dir = " entrata " AND co_documenti . id_segment = ' . $fattura -> id_segment );
2024-01-15 15:30:45 +01:00
if (( setting ( 'Data emissione fattura automatica' ) == 1 ) && ( $dir == 'entrata' ) && ( $stato -> descrizione == 'Emessa' ) && Carbon :: parse ( $data ) -> lessThan ( Carbon :: parse ( $data_fattura_precedente [ 'datamax' ])) && ( ! empty ( $data_fattura_precedente [ 'datamax' ]))) {
2023-07-17 16:03:38 +02:00
$fattura -> data = $data_fattura_precedente [ 'datamax' ];
$fattura -> data_competenza = $data_fattura_precedente [ 'datamax' ];
flash () -> info ( tr ( 'Data di emissione aggiornata, come da impostazione!' ));
2020-03-02 16:13:07 +01:00
} else {
2023-07-17 16:03:38 +02:00
$fattura -> data = post ( 'data' );
$fattura -> data_competenza = post ( 'data_competenza' );
}
2019-05-10 02:50:01 +02:00
2023-07-17 16:03:38 +02:00
if ( $dir == 'entrata' ) {
$fattura -> data_registrazione = post ( 'data' );
} else {
$fattura -> data_registrazione = post ( 'data_registrazione' );
}
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
$fattura -> numero_esterno = post ( 'numero_esterno' );
$fattura -> note = post ( 'note' );
$fattura -> note_aggiuntive = post ( 'note_aggiuntive' );
$fattura -> idanagrafica = post ( 'idanagrafica' );
$fattura -> idagente = post ( 'idagente' );
$fattura -> idreferente = post ( 'idreferente' );
$fattura -> idpagamento = post ( 'idpagamento' );
$fattura -> id_banca_azienda = post ( 'id_banca_azienda' );
$fattura -> id_banca_controparte = post ( 'id_banca_controparte' );
$fattura -> idcausalet = post ( 'idcausalet' );
$fattura -> idspedizione = post ( 'idspedizione' );
$fattura -> idporto = post ( 'idporto' );
$fattura -> idaspettobeni = post ( 'idaspettobeni' );
$fattura -> idvettore = post ( 'idvettore' );
$fattura -> idsede_partenza = post ( 'idsede_partenza' );
$fattura -> idsede_destinazione = post ( 'idsede_destinazione' );
$fattura -> idconto = post ( 'idconto' );
$fattura -> split_payment = post ( 'split_payment' ) ? : 0 ;
$fattura -> is_fattura_conto_terzi = post ( 'is_fattura_conto_terzi' ) ? : 0 ;
$fattura -> n_colli = post ( 'n_colli' );
$fattura -> tipo_resa = post ( 'tipo_resa' );
$fattura -> peso = post ( 'peso' );
$fattura -> volume = post ( 'volume' );
$fattura -> peso_manuale = post ( 'peso_manuale' );
$fattura -> volume_manuale = post ( 'volume_manuale' );
$fattura -> rivalsainps = 0 ;
$fattura -> ritenutaacconto = 0 ;
$fattura -> iva_rivalsainps = 0 ;
$fattura -> id_ritenuta_contributi = post ( 'id_ritenuta_contributi' ) ? : null ;
$fattura -> codice_stato_fe = post ( 'codice_stato_fe' ) ? : null ;
// Informazioni per le fatture di acquisto
if ( $dir == 'uscita' ) {
$fattura -> numero = post ( 'numero' );
2023-07-17 14:15:41 +02:00
$fattura -> numero_esterno = post ( 'numero_esterno' );
2023-07-17 16:03:38 +02:00
$fattura -> idrivalsainps = post ( 'id_rivalsa_inps' );
$fattura -> idritenutaacconto = post ( 'id_ritenuta_acconto' );
}
2021-02-26 18:45:52 +01:00
2023-07-17 16:03:38 +02:00
// Operazioni sul bollo
if ( $dir == 'entrata' ) {
$bollo_automatico = post ( 'bollo_automatico' );
2023-11-27 16:30:49 +01:00
$fattura -> addebita_bollo = $bollo_automatico == 1 ? $bollo_automatico : post ( 'addebita_bollo' );
2023-07-17 16:03:38 +02:00
if ( empty ( $bollo_automatico )) {
$fattura -> bollo = post ( 'bollo' );
} else {
$fattura -> bollo = null ;
2023-07-17 14:15:41 +02:00
}
2023-07-17 16:03:38 +02:00
}
2022-02-16 15:56:36 +01:00
2023-07-17 16:03:38 +02:00
// Operazioni sulla dichiarazione d'intento
$dichiarazione_precedente = $fattura -> dichiarazione ;
$fattura -> id_dichiarazione_intento = post ( 'id_dichiarazione_intento' ) ? : null ;
// Flag pagamento ritenuta
$fattura -> is_ritenuta_pagata = post ( 'is_ritenuta_pagata' ) ? : 0 ;
$fattura -> setScontoFinale ( post ( 'sconto_finale' ), post ( 'tipo_sconto_finale' ));
2023-07-19 17:49:02 +02:00
$anagrafica = Anagrafica :: find ( $fattura -> idanagrafica );
2023-08-04 14:54:28 +02:00
if ( $anagrafica -> tipo === 'Privato' && $fattura -> is_fattura_conto_terzi ) {
2023-07-19 17:49:02 +02:00
flash () -> warning ( tr ( 'L\'anagrafica selezionata è del tipo "Privato", correggere la tipologia dalla scheda anagrafica!' ));
} else {
$results = $fattura -> save ();
$message = '' ;
flash () -> info ( tr ( 'Fattura modificata correttamente!' ));
}
2023-07-17 16:03:38 +02:00
foreach ( $results as $numero => $result ) {
foreach ( $result as $title => $links ) {
foreach ( $links as $link => $errors ) {
if ( empty ( $title )) {
flash () -> warning ( tr ( 'La fattura elettronica num. _NUM_ potrebbe avere delle irregolarità!' , [
'_NUM_' => $numero ,
]) . ' ' . tr ( 'Controllare i seguenti campi: _LIST_' , [
'_LIST_' => implode ( ', ' , $errors ),
]) . '.' );
} else {
$message .= '
< p >< b > '.$title.' '.$link.' </ b ></ p >
< ul > ' ;
foreach ( $errors as $error ) {
if ( ! empty ( $error )) {
$message .= '
< li > '.$error.' </ li > ' ;
2022-02-16 15:56:36 +01:00
}
2023-07-17 14:15:41 +02:00
}
2023-07-17 16:03:38 +02:00
$message .= '
</ ul > ' ;
2022-02-16 15:56:36 +01:00
}
2020-11-20 14:49:32 +01:00
}
}
2023-07-17 16:03:38 +02:00
}
2019-08-29 14:28:05 +02:00
2023-07-17 16:03:38 +02:00
if ( $message ) {
// Messaggi informativi sulle problematiche
$message = tr ( 'La fattura elettronica numero _NUM_ non è stata generata a causa di alcune informazioni mancanti' , [
'_NUM_' => $numero ,
]) . ':' . $message ;
2019-06-04 20:45:40 +02:00
2023-07-17 16:03:38 +02:00
flash () -> warning ( $message );
}
2020-03-02 16:13:07 +01:00
2023-07-17 16:03:38 +02:00
aggiorna_sedi_movimenti ( 'documenti' , $id_record );
// Controllo sulla presenza di fattura di acquisto con lo stesso numero secondario nello stesso periodo
$direzione = $fattura -> direzione ;
if ( $direzione == 'uscita' ) {
$count = Fattura :: where ( 'numero_esterno' , $fattura -> numero_esterno )
-> where ( 'id' , '!=' , $id_record )
-> where ( 'idanagrafica' , '=' , $fattura -> anagrafica -> id )
-> where ( 'data' , '>=' , $_SESSION [ 'period_start' ])
-> where ( 'data' , '<=' , $_SESSION [ 'period_end' ])
-> whereHas ( 'tipo' , function ( $query ) use ( $direzione ) {
$query -> where ( 'dir' , '=' , $direzione );
}) -> count ();
if ( ! empty ( $count )) {
flash () -> warning ( tr ( 'Esiste già una fattura con lo stesso numero secondario e la stessa anagrafica collegata!' ));
2020-03-02 16:13:07 +01:00
}
2023-07-17 16:03:38 +02:00
}
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
// Controllo sulla presenza di fattura di vendita con lo stesso numero nello stesso periodo
if ( $direzione == 'entrata' ) {
$count = Fattura :: where ( 'numero_esterno' , $fattura -> numero_esterno )
-> where ( 'id' , '!=' , $id_record )
-> where ( 'data' , '>=' , $_SESSION [ 'period_start' ])
-> where ( 'data' , '<=' , $_SESSION [ 'period_end' ])
2023-09-21 13:03:49 +02:00
-> where ( 'numero_esterno' , '!=' , '' )
2023-07-17 16:03:38 +02:00
-> whereHas ( 'tipo' , function ( $query ) use ( $direzione ) {
$query -> where ( 'dir' , '=' , $direzione );
}) -> count ();
if ( ! empty ( $count )) {
flash () -> warning ( tr ( 'Esiste già una fattura con lo stesso numero!' ));
2023-07-05 11:50:27 +02:00
}
}
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Ricalcolo scadenze
2019-03-08 16:59:55 +01:00
case 'ricalcola_scadenze' :
$fattura -> registraScadenze ( false , true );
break ;
2024-01-15 15:30:45 +01:00
// Ricalcolo scadenze
2019-03-15 12:16:20 +01:00
case 'controlla_totali' :
2020-11-13 16:12:29 +01:00
$totale_documento = null ;
2019-03-15 12:16:20 +01:00
try {
2020-09-10 16:05:08 +02:00
$xml = XML :: read ( $fattura -> getXML ());
2019-03-15 12:16:20 +01:00
2020-03-09 13:57:13 +01:00
// Totale basato sul campo ImportoTotaleDocumento
2020-09-10 16:05:08 +02:00
$dati_generali = $xml [ 'FatturaElettronicaBody' ][ 'DatiGenerali' ][ 'DatiGeneraliDocumento' ];
2023-07-31 17:28:46 +02:00
$totale_documento = 0 ;
2020-03-09 13:57:13 +01:00
2023-07-31 17:28:46 +02:00
$riepiloghi = $xml [ 'FatturaElettronicaBody' ][ 'DatiBeniServizi' ][ 'DatiRiepilogo' ];
if ( ! empty ( $riepiloghi ) && ! isset ( $riepiloghi [ 0 ])) {
$riepiloghi = [ $riepiloghi ];
}
2020-11-13 16:12:29 +01:00
2023-07-31 17:28:46 +02:00
foreach ( $riepiloghi as $riepilogo ) {
$totale_documento = sum ([ $totale_documento , $riepilogo [ 'ImponibileImporto' ], $riepilogo [ 'Imposta' ]]);
2020-03-09 13:57:13 +01:00
}
2023-07-31 17:28:46 +02:00
$totale_documento = abs ( $totale_documento );
2023-12-05 16:41:33 +01:00
$totale_documento = $dati_generali [ 'ImportoTotaleDocumento' ] ? $dati_generali [ 'ImportoTotaleDocumento' ] : $totale_documento ;
2019-03-15 12:16:20 +01:00
} catch ( Exception $e ) {
}
echo json_encode ([
2023-08-04 14:54:28 +02:00
'stored' => round ( $totale_documento , 2 ),
'calculated' => round ( $fattura -> totale , 2 ),
2019-03-15 12:16:20 +01:00
]);
2023-08-04 14:54:28 +02:00
2019-03-15 12:16:20 +01:00
break ;
2024-01-15 15:30:45 +01:00
// Elenco fatture in stato Bozza per il cliente
2020-03-16 10:04:49 +01:00
case 'fatture_bozza' :
$id_anagrafica = post ( 'id_anagrafica' );
$stato = Stato :: where ( 'descrizione' , 'Bozza' ) -> first ();
$fatture = Fattura :: vendita ()
-> where ( 'idanagrafica' , $id_anagrafica )
-> where ( 'idstatodocumento' , $stato -> id )
-> get ();
$results = [];
foreach ( $fatture as $result ) {
$results [] = Modules :: link ( 'Fatture di vendita' , $result -> id , reference ( $result ));
}
echo json_encode ( $results );
break ;
2024-01-15 15:30:45 +01:00
// Elenco fatture Scadute per il cliente
2021-06-28 17:14:54 +02:00
case 'fatture_scadute' :
$id_anagrafica = post ( 'id_anagrafica' );
$stato1 = Stato :: where ( 'descrizione' , 'Emessa' ) -> first ();
2022-06-15 15:01:06 +02:00
$stato2 = Stato :: where ( 'descrizione' , 'Parzialmente pagato' ) -> first ();
2021-06-28 17:14:54 +02:00
$fatture = Fattura :: vendita ()
-> select ( '*' , 'co_documenti.id AS id' , 'co_documenti.data AS data' )
2022-12-02 17:17:04 +01:00
-> where ( 'co_documenti.idanagrafica' , $id_anagrafica )
2021-06-28 17:14:54 +02:00
-> whereIn ( 'idstatodocumento' , [ $stato1 -> id , $stato2 -> id ])
-> join ( 'co_scadenziario' , 'co_documenti.id' , '=' , 'co_scadenziario.iddocumento' )
2023-08-04 14:54:28 +02:00
-> join ( 'co_tipidocumento' , 'co_tipidocumento.id' , '=' , 'co_documenti.idtipodocumento' )
2022-06-15 12:03:41 +02:00
-> whereRaw ( 'co_scadenziario.da_pagare > co_scadenziario.pagato' )
2021-06-28 17:14:54 +02:00
-> whereRaw ( 'co_scadenziario.scadenza < NOW()' )
-> groupBy ( 'co_scadenziario.iddocumento' )
-> get ();
$results = [];
foreach ( $fatture as $result ) {
2022-12-02 17:17:04 +01:00
$results [] = Modules :: link ( 'Fatture di vendita' , $result -> id , reference ( $result ));
2021-06-28 17:14:54 +02:00
}
echo json_encode ( $results );
break ;
2024-01-15 15:30:45 +01:00
// eliminazione documento
2017-08-04 16:28:16 +02:00
case 'delete' :
2019-07-23 15:39:00 +02:00
try {
$fattura -> delete ();
2017-09-05 17:31:58 +02:00
2019-07-23 15:39:00 +02:00
$dbo -> query ( 'DELETE FROM co_scadenziario WHERE iddocumento=' . prepare ( $id_record ));
$dbo -> query ( 'DELETE FROM co_movimenti WHERE iddocumento=' . prepare ( $id_record ));
2017-08-04 16:28:16 +02:00
2019-07-23 15:39:00 +02:00
// Azzeramento collegamento della rata contrattuale alla pianificazione
2020-02-17 18:43:49 +01:00
$dbo -> query ( 'UPDATE co_fatturazione_contratti SET iddocumento=0 WHERE iddocumento=' . prepare ( $id_record ));
2021-07-07 07:57:10 +02:00
2019-07-23 15:39:00 +02:00
flash () -> info ( tr ( 'Fattura eliminata!' ));
} catch ( InvalidArgumentException $e ) {
flash () -> error ( tr ( 'Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!' ));
2017-09-05 17:31:58 +02:00
}
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Duplicazione fattura
2017-08-04 16:28:16 +02:00
case 'copy' :
2020-02-27 16:19:07 +01:00
$new = $fattura -> replicate ();
2023-05-29 10:53:08 +02:00
$new -> id_autofattura = null ;
2020-02-27 16:19:07 +01:00
$new -> save ();
$id_record = $new -> id ;
2021-04-22 09:57:17 +02:00
$righe = $fattura -> getRighe () -> where ( 'id' , '!=' , $fattura -> id_riga_bollo );
2020-02-27 16:19:07 +01:00
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
2020-09-22 20:28:37 +02:00
$new_riga -> setDocument ( $new );
2020-02-27 16:19:07 +01:00
2021-03-01 14:46:13 +01:00
// Rimozione riferimenti (deprecati)
2020-02-27 16:19:07 +01:00
$new_riga -> idpreventivo = 0 ;
$new_riga -> idcontratto = 0 ;
$new_riga -> idintervento = 0 ;
$new_riga -> idddt = 0 ;
$new_riga -> idordine = 0 ;
if ( $new_riga -> isArticolo ()) {
$new_riga -> movimenta ( $new_riga -> qta );
2017-08-04 16:28:16 +02:00
}
2023-12-04 17:40:24 +01:00
$new_riga -> save ();
2017-08-04 16:28:16 +02:00
}
2020-02-27 16:19:07 +01:00
flash () -> info ( tr ( 'Fattura duplicata correttamente!' ));
2017-08-04 16:28:16 +02:00
break ;
case 'reopen' :
if ( ! empty ( $id_record )) {
2023-02-24 11:16:41 +01:00
$stato = Stato :: where ( 'descrizione' , 'Bozza' ) -> first ();
$fattura -> stato () -> associate ( $stato );
$fattura -> save ();
2022-12-02 19:14:25 +01:00
$stato = Stato :: where ( 'descrizione' , 'Emessa' ) -> first ();
2022-04-19 11:55:52 +02:00
$fattura -> stato () -> associate ( $stato );
$fattura -> save ();
2019-07-25 17:20:24 +02:00
flash () -> info ( tr ( 'Fattura riaperta!' ));
2017-08-04 16:28:16 +02:00
}
break ;
2019-07-24 15:29:03 +02:00
case 'add_intervento' :
2019-02-21 12:55:18 +01:00
$id_intervento = post ( 'idintervento' );
2019-07-24 15:29:03 +02:00
2023-07-17 16:03:38 +02:00
if ( ! empty ( $id_record ) && $id_intervento !== null ) {
$copia_descrizione = post ( 'copia_descrizione' );
$intervento = $dbo -> fetchOne ( 'SELECT descrizione FROM in_interventi WHERE id = ' . prepare ( $id_intervento ));
if ( ! empty ( $copia_descrizione ) && ! empty ( $intervento [ 'descrizione' ])) {
$riga = Descrizione :: build ( $fattura );
$riga -> descrizione = $intervento [ 'descrizione' ];
$riga -> idintervento = $id_intervento ;
$riga -> save ();
}
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
aggiungi_intervento_in_fattura ( $id_intervento , $id_record , post ( 'descrizione' ), post ( 'idiva' ), post ( 'idconto' ), post ( 'id_rivalsa_inps' ), post ( 'id_ritenuta_acconto' ), post ( 'calcolo_ritenuta_acconto' ));
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( 'Intervento _NUM_ aggiunto!' , [
'_NUM_' => $idintervento ,
2018-09-26 15:37:46 +02:00
]));
2017-08-04 16:28:16 +02:00
}
break ;
2019-07-15 18:34:59 +02:00
case 'manage_documento_fe' :
$data = Filter :: getPOST ();
2023-07-17 16:03:38 +02:00
$ignore = [
'id_plugin' ,
'id_module' ,
'id_record' ,
'backto' ,
'hash' ,
'op' ,
'idriga' ,
'dir' ,
];
foreach ( $ignore as $name ) {
unset ( $data [ $name ]);
}
$fattura -> dati_aggiuntivi_fe = $data ;
$fattura -> save ();
flash () -> info ( tr ( 'Dati FE aggiornati correttamente!' ));
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
break ;
case 'manage_riga_fe' :
$id_riga = post ( 'id_riga' );
if ( $id_riga != null ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
$riga = $riga ? : Descrizione :: find ( $id_riga );
$riga = $riga ? : Sconto :: find ( $id_riga );
$data = Filter :: getPOST ();
2019-07-15 18:34:59 +02:00
$ignore = [
'id_plugin' ,
'id_module' ,
'id_record' ,
'backto' ,
'hash' ,
'op' ,
'idriga' ,
'dir' ,
];
foreach ( $ignore as $name ) {
unset ( $data [ $name ]);
}
2023-07-17 16:03:38 +02:00
$riga -> dati_aggiuntivi_fe = $data ;
$riga -> save ();
2019-07-15 18:34:59 +02:00
flash () -> info ( tr ( 'Dati FE aggiornati correttamente!' ));
}
2020-07-20 14:40:11 +02:00
break ;
2018-10-04 17:25:42 +02:00
case 'manage_articolo' :
if ( post ( 'idriga' ) != null ) {
$articolo = Articolo :: find ( post ( 'idriga' ));
} else {
$originale = ArticoloOriginale :: find ( post ( 'idarticolo' ));
2019-01-02 14:15:16 +01:00
$articolo = Articolo :: build ( $fattura , $originale );
2020-07-06 13:32:43 +02:00
$articolo -> id_dettaglio_fornitore = post ( 'id_dettaglio_fornitore' ) ? : null ;
2018-10-04 17:25:42 +02:00
}
2023-07-17 16:03:38 +02:00
$qta = post ( 'qta' );
2018-07-04 12:57:53 +02:00
2023-07-17 16:03:38 +02:00
$articolo -> descrizione = post ( 'descrizione' );
$articolo -> note = post ( 'note' );
$articolo -> um = post ( 'um' ) ? : null ;
2018-09-25 16:47:44 +02:00
2023-07-17 16:03:38 +02:00
$articolo -> id_iva = post ( 'idiva' );
$articolo -> idconto = post ( 'idconto' );
2018-11-21 17:45:06 +01:00
2023-07-17 16:03:38 +02:00
$articolo -> calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$articolo -> id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
$articolo -> ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
$articolo -> id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
2018-09-25 18:04:39 +02:00
2023-07-17 16:03:38 +02:00
$articolo -> costo_unitario = post ( 'costo_unitario' ) ? : 0 ;
$articolo -> setPrezzoUnitario ( post ( 'prezzo_unitario' ), post ( 'idiva' ));
$articolo -> setSconto ( post ( 'sconto' ), post ( 'tipo_sconto' ));
if ( $dir == 'entrata' ) {
$articolo -> setProvvigione ( post ( 'provvigione' ), post ( 'tipo_provvigione' ));
}
2018-07-25 12:34:54 +02:00
2023-07-17 16:03:38 +02:00
try {
$articolo -> qta = $qta ;
} catch ( UnexpectedValueException $e ) {
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
}
2018-09-26 15:37:46 +02:00
2023-07-17 16:03:38 +02:00
$articolo -> save ();
2019-03-29 12:46:17 +01:00
2023-07-17 16:03:38 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Articolo modificato!' ));
} else {
flash () -> info ( tr ( 'Articolo aggiunto!' ));
2023-07-17 14:15:41 +02:00
}
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
2019-03-29 12:46:17 +01:00
break ;
case 'manage_sconto' :
if ( post ( 'idriga' ) != null ) {
2019-04-04 17:12:32 +02:00
$sconto = Sconto :: find ( post ( 'idriga' ));
2019-03-29 12:46:17 +01:00
} else {
2019-04-04 17:12:32 +02:00
$sconto = Sconto :: build ( $fattura );
2019-03-29 12:46:17 +01:00
}
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
$sconto -> idconto = post ( 'idconto' );
2019-03-29 12:46:17 +01:00
2023-07-17 16:03:38 +02:00
$sconto -> calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$sconto -> id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
$sconto -> ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
$sconto -> id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
2019-03-29 12:46:17 +01:00
2023-07-17 16:03:38 +02:00
$sconto -> descrizione = post ( 'descrizione' );
$sconto -> note = post ( 'note' );
$sconto -> setScontoUnitario ( post ( 'sconto_unitario' ), post ( 'idiva' ));
$sconto -> save ();
2019-03-29 12:46:17 +01:00
2023-07-17 16:03:38 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Sconto/maggiorazione modificato!' ));
} else {
flash () -> info ( tr ( 'Sconto/maggiorazione aggiunto!' ));
2019-03-29 12:46:17 +01:00
}
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
2017-08-04 16:28:16 +02:00
break ;
2018-10-04 17:25:42 +02:00
case 'manage_riga' :
if ( post ( 'idriga' ) != null ) {
$riga = Riga :: find ( post ( 'idriga' ));
} else {
2019-01-02 14:15:16 +01:00
$riga = Riga :: build ( $fattura );
2018-10-04 17:25:42 +02:00
}
2023-07-17 16:03:38 +02:00
$qta = post ( 'qta' );
2019-02-12 15:00:08 +01:00
2023-07-17 16:03:38 +02:00
$riga -> descrizione = post ( 'descrizione' );
$riga -> note = post ( 'note' );
$riga -> um = post ( 'um' ) ? : null ;
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
$riga -> id_iva = post ( 'idiva' );
$riga -> idconto = post ( 'idconto' );
2018-11-21 17:45:06 +01:00
2023-07-17 16:03:38 +02:00
$riga -> calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$riga -> id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
$riga -> ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
$riga -> id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
$riga -> costo_unitario = post ( 'costo_unitario' ) ? : 0 ;
$riga -> setPrezzoUnitario ( post ( 'prezzo_unitario' ), post ( 'idiva' ));
$riga -> setSconto ( post ( 'sconto' ), post ( 'tipo_sconto' ));
if ( $dir == 'entrata' ) {
$riga -> setProvvigione ( post ( 'provvigione' ), post ( 'tipo_provvigione' ));
}
2018-12-29 11:42:53 +01:00
2023-07-17 16:03:38 +02:00
$riga -> qta = $qta ;
$riga -> save ();
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga modificata!' ));
} else {
flash () -> info ( tr ( 'Riga aggiunta!' ));
2018-10-04 17:25:42 +02:00
}
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
2023-08-04 14:54:28 +02:00
2018-09-26 15:37:46 +02:00
break ;
2018-10-04 17:25:42 +02:00
case 'manage_descrizione' :
2018-10-05 10:49:46 +02:00
if ( post ( 'idriga' ) != null ) {
$riga = Descrizione :: find ( post ( 'idriga' ));
} else {
2019-01-02 14:15:16 +01:00
$riga = Descrizione :: build ( $fattura );
2018-10-05 10:49:46 +02:00
}
2018-09-26 15:37:46 +02:00
$riga -> descrizione = post ( 'descrizione' );
2022-07-20 17:41:14 +02:00
$riga -> note = post ( 'note' );
2018-11-13 18:26:51 +01:00
2023-07-17 16:03:38 +02:00
$riga -> save ();
2023-07-17 14:15:41 +02:00
2023-07-17 16:03:38 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga descrittiva modificata!' ));
2018-11-12 12:18:23 +01:00
} else {
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( 'Riga descrittiva aggiunta!' ));
2023-07-17 14:15:41 +02:00
}
2023-08-04 14:54:28 +02:00
2018-01-18 19:03:06 +01:00
break ;
2017-08-04 16:28:16 +02:00
2024-01-15 15:30:45 +01:00
// Scollegamento intervento da documento
2017-08-04 16:28:16 +02:00
case 'unlink_intervento' :
2018-07-19 15:33:32 +02:00
if ( ! empty ( $id_record ) && post ( 'idriga' ) !== null ) {
2023-07-17 16:03:38 +02:00
$id_riga = post ( 'idriga' );
$type = post ( 'type' );
$riga = $fattura -> getRiga ( $type , $id_riga );
2020-01-24 12:33:50 +01:00
2023-07-17 16:03:38 +02:00
if ( ! empty ( $riga )) {
try {
$riga -> delete ();
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( 'Intervento _NUM_ rimosso!' , [
'_NUM_' => $idintervento ,
]));
} catch ( InvalidArgumentException $e ) {
flash () -> error ( tr ( 'Errore durante l\'eliminazione della riga!' ));
2020-01-24 12:33:50 +01:00
}
2017-08-04 16:28:16 +02:00
}
}
2023-08-04 14:54:28 +02:00
2017-08-04 16:28:16 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Scollegamento riga generica da documento
2019-10-01 18:32:06 +02:00
case 'delete_riga' :
2023-08-04 14:54:28 +02:00
$id_righe = ( array ) post ( 'righe' );
2023-07-17 16:03:38 +02:00
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
$riga = $riga ? : Descrizione :: find ( $id_riga );
$riga = $riga ? : Sconto :: find ( $id_riga );
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
try {
$riga -> delete ();
2017-08-04 16:28:16 +02:00
2023-07-17 16:03:38 +02:00
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
} catch ( InvalidArgumentException $e ) {
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
2019-07-23 15:39:00 +02:00
}
2023-07-17 16:03:38 +02:00
$riga = null ;
2023-12-01 17:21:34 +01:00
}
if ( count ( $id_righe ) == 1 ) {
flash () -> info ( tr ( 'Riga eliminata!' ));
} else {
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( 'Righe eliminate!' ));
2017-08-04 16:28:16 +02:00
}
2023-08-04 14:54:28 +02:00
2022-04-01 09:58:53 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Duplicazione riga
2022-04-01 09:58:53 +02:00
case 'copy_riga' :
2023-08-04 14:54:28 +02:00
$id_righe = ( array ) post ( 'righe' );
2023-07-17 16:03:38 +02:00
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
$riga = $riga ? : Descrizione :: find ( $id_riga );
$riga = $riga ? : Sconto :: find ( $id_riga );
2022-04-01 09:58:53 +02:00
2023-07-17 16:03:38 +02:00
$new_riga = $riga -> replicate ();
$new_riga -> setDocument ( $fattura );
$new_riga -> qta_evasa = 0 ;
2022-04-01 09:58:53 +02:00
2023-07-17 16:03:38 +02:00
if ( $new_riga -> isArticolo ()) {
$new_riga -> movimenta ( $new_riga -> qta );
2022-04-01 09:58:53 +02:00
}
2023-12-04 17:40:24 +01:00
$new_riga -> save ();
2023-07-17 16:03:38 +02:00
$riga = null ;
2022-04-01 09:58:53 +02:00
}
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( 'Righe duplicate!' ));
2017-08-04 16:28:16 +02:00
break ;
case 'add_serial' :
2018-10-04 17:25:42 +02:00
$articolo = Articolo :: find ( post ( 'idriga' ));
2017-08-04 16:28:16 +02:00
2018-07-19 15:33:32 +02:00
$serials = ( array ) post ( 'serial' );
2018-10-04 17:25:42 +02:00
$articolo -> serials = $serials ;
2017-09-05 17:31:58 +02:00
2017-08-04 16:28:16 +02:00
break ;
case 'update_position' :
2020-08-06 11:34:32 +02:00
$order = explode ( ',' , post ( 'order' , true ));
2018-10-30 10:27:44 +01:00
2020-08-06 11:34:32 +02:00
foreach ( $order as $i => $id_riga ) {
2021-02-23 11:40:27 +01:00
$dbo -> query ( 'UPDATE `co_righe_documenti` SET `order` = ' . prepare ( $i + 1 ) . ' WHERE id=' . prepare ( $id_riga ));
2017-08-04 16:28:16 +02:00
}
break ;
2018-06-26 09:41:43 +02:00
2024-01-15 15:30:45 +01:00
// Aggiunta di un documento esterno
2019-07-23 15:39:00 +02:00
case 'add_documento' :
2020-07-02 15:27:18 +02:00
$class = post ( 'class' );
2019-07-23 15:39:00 +02:00
$id_documento = post ( 'id_documento' );
2019-10-13 16:42:09 +02:00
2020-07-02 15:27:18 +02:00
// Individuazione del documento originale
2024-01-15 15:30:45 +01:00
if ( ! is_subclass_of ( $class , Common\Document :: class )) {
2020-07-02 15:27:18 +02:00
return ;
2019-02-14 17:49:58 +01:00
}
2020-07-02 15:27:18 +02:00
$documento = $class :: find ( $id_documento );
2018-06-25 11:44:06 +02:00
2020-07-06 13:19:20 +02:00
// Individuazione sede
$id_sede = ( $documento -> direzione == 'entrata' ) ? $documento -> idsede_destinazione : $documento -> idsede_partenza ;
$id_sede = $id_sede ? : $documento -> idsede ;
$id_sede = $id_sede ? : 0 ;
2019-02-14 17:49:58 +01:00
// Creazione della fattura al volo
if ( post ( 'create_document' ) == 'on' ) {
2021-09-16 11:57:07 +02:00
$tipo = Tipo :: find ( post ( 'idtipodocumento' ));
2019-02-14 17:49:58 +01:00
2019-07-23 15:39:00 +02:00
$fattura = Fattura :: build ( $documento -> anagrafica , $tipo , post ( 'data' ), post ( 'id_segment' ));
2020-09-09 11:44:14 +02:00
2021-03-15 16:39:32 +01:00
if ( ! empty ( $documento -> idpagamento )) {
2021-03-09 18:36:28 +01:00
$fattura -> idpagamento = $documento -> idpagamento ;
2021-03-15 16:39:32 +01:00
} else {
2021-03-09 18:36:28 +01:00
$fattura -> idpagamento = setting ( 'Tipo di pagamento predefinito' );
}
2021-03-15 16:39:32 +01:00
2023-01-18 15:08:16 +01:00
$idsede = ( $documento -> idsede_destinazione ? $documento -> idsede_destinazione : $documento -> idsede );
$fattura -> idsede_destinazione = $idsede ;
2019-07-23 15:39:00 +02:00
$fattura -> id_ritenuta_contributi = post ( 'id_ritenuta_contributi' ) ? : null ;
2021-04-20 17:12:04 +02:00
$fattura -> idreferente = $documento -> idreferente ;
2022-05-19 17:42:41 +02:00
$fattura -> idagente = $documento -> idagente ;
2020-09-09 11:44:14 +02:00
2019-02-14 17:49:58 +01:00
$fattura -> save ();
$id_record = $fattura -> id ;
}
2021-04-06 15:10:55 +02:00
if ( ! empty ( $documento -> sconto_finale )) {
$fattura -> sconto_finale = $documento -> sconto_finale ;
2021-04-12 15:51:27 +02:00
} elseif ( ! empty ( $documento -> sconto_finale_percentuale )) {
2021-04-06 15:10:55 +02:00
$fattura -> sconto_finale_percentuale = $documento -> sconto_finale_percentuale ;
}
$fattura -> save ();
2019-07-23 15:39:00 +02:00
$calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
$ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
$id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
2019-02-26 21:20:05 +01:00
$id_conto = post ( 'id_conto' );
2019-02-15 09:25:56 +01:00
2019-07-23 15:39:00 +02:00
$righe = $documento -> getRighe ();
2019-02-14 17:49:58 +01:00
foreach ( $righe as $riga ) {
if ( post ( 'evadere' )[ $riga -> id ] == 'on' ) {
$qta = post ( 'qta_da_evadere' )[ $riga -> id ];
2021-03-29 15:52:43 +02:00
$articolo = ArticoloOriginale :: find ( $riga -> idarticolo );
2019-02-14 17:49:58 +01:00
2020-07-19 15:11:50 +02:00
$copia = $riga -> copiaIn ( $fattura , $qta );
2019-02-14 17:49:58 +01:00
2021-03-31 22:03:55 +02:00
$copia -> id_conto = ( $documento -> direzione == 'entrata' ? ( $articolo -> idconto_vendita ? : $id_conto ) : ( $articolo -> idconto_acquisto ? : $id_conto ));
2019-02-15 09:25:56 +01:00
$copia -> calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ;
2019-02-26 20:55:00 +01:00
$copia -> id_ritenuta_acconto = $id_ritenuta_acconto ;
$copia -> id_rivalsa_inps = $id_rivalsa_inps ;
2019-07-23 15:39:00 +02:00
$copia -> ritenuta_contributi = $ritenuta_contributi ;
2019-02-15 09:25:56 +01:00
2019-02-14 17:49:58 +01:00
// Aggiornamento seriali dalla riga dell'ordine
if ( $copia -> isArticolo ()) {
$serials = is_array ( post ( 'serial' )[ $riga -> id ]) ? post ( 'serial' )[ $riga -> id ] : [];
$copia -> serials = $serials ;
2018-06-25 11:44:06 +02:00
}
2019-02-26 21:20:05 +01:00
$copia -> save ();
2019-02-14 17:49:58 +01:00
}
}
2020-09-09 11:44:14 +02:00
// Modifica finale dello stato
if ( post ( 'create_document' ) == 'on' ) {
$fattura -> idstatodocumento = post ( 'id_stato' );
$fattura -> save ();
}
2019-02-14 17:49:58 +01:00
ricalcola_costiagg_fattura ( $id_record );
2020-07-02 15:27:18 +02:00
// Messaggio informativo
$message = tr ( '_DOC_ aggiunto!' , [
2022-02-18 16:24:03 +01:00
'_DOC_' => $fattura -> getReference (),
2020-07-02 15:27:18 +02:00
]);
2019-07-23 15:39:00 +02:00
flash () -> info ( $message );
2018-06-25 11:44:06 +02:00
break ;
2018-07-03 17:28:02 +02:00
2024-01-15 15:30:45 +01:00
// Nota di credito
2018-07-05 17:56:38 +02:00
case 'nota_credito' :
2019-12-13 15:56:52 +01:00
$id_documento = post ( 'id_documento' );
$fattura = Fattura :: find ( $id_documento );
2018-07-03 17:28:02 +02:00
$id_segment = post ( 'id_segment' );
2018-08-21 10:11:30 +02:00
$data = post ( 'data' );
2018-07-03 17:28:02 +02:00
2023-07-17 16:03:38 +02:00
$anagrafica = $fattura -> anagrafica ;
$tipo = Tipo :: where ( 'descrizione' , 'Nota di credito' ) -> where ( 'dir' , 'entrata' ) -> first ();
$nota = Fattura :: build ( $anagrafica , $tipo , $data , $id_segment );
$nota -> ref_documento = $fattura -> id ;
$nota -> idconto = $fattura -> idconto ;
$nota -> idpagamento = $fattura -> idpagamento ;
$nota -> id_banca_azienda = $fattura -> id_banca_azienda ;
$nota -> id_banca_controparte = $fattura -> id_banca_controparte ;
$nota -> idsede_partenza = $fattura -> idsede_partenza ;
$nota -> idsede_destinazione = $fattura -> idsede_destinazione ;
$nota -> split_payment = $fattura -> split_payment ;
$nota -> save ();
$righe = $fattura -> getRighe ();
foreach ( $righe as $riga ) {
if ( post ( 'evadere' )[ $riga -> id ] == 'on' and ! empty ( post ( 'qta_da_evadere' )[ $riga -> id ])) {
$qta = post ( 'qta_da_evadere' )[ $riga -> id ];
2018-07-03 17:28:02 +02:00
2023-07-17 16:03:38 +02:00
$copia = $riga -> copiaIn ( $nota , $qta );
$copia -> ref_riga_documento = $riga -> id ;
2018-07-03 17:28:02 +02:00
2023-07-17 16:03:38 +02:00
// Aggiornamento seriali dalla riga della fattura
if ( $copia -> isArticolo ()) {
$serials = is_array ( post ( 'serial' )[ $riga -> id ]) ? post ( 'serial' )[ $riga -> id ] : [];
$copia -> serials = $serials ;
2018-07-03 17:28:02 +02:00
}
2023-07-17 16:03:38 +02:00
$copia -> save ();
2019-02-12 17:21:27 +01:00
}
2023-07-17 16:03:38 +02:00
}
2018-07-03 17:28:02 +02:00
2023-07-17 16:03:38 +02:00
$stato = Stato :: find ( post ( 'id_stato' ));
$nota -> stato () -> associate ( $stato );
$nota -> save ();
2022-06-13 16:16:37 +02:00
2023-07-17 16:03:38 +02:00
$id_record = $nota -> id ;
aggiorna_sedi_movimenti ( 'documenti' , $id_record );
2019-02-12 17:21:27 +01:00
2018-09-28 09:30:46 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Autofattura
2022-05-13 13:23:15 +02:00
case 'autofattura' :
$fattura = Fattura :: find ( $id_record );
2023-10-19 15:37:19 +02:00
$imponibile = 0 ;
$sconto = 0 ;
2023-10-27 10:35:05 +02:00
2022-05-13 13:23:15 +02:00
$id_segment = post ( 'id_segment' );
$data = date ( 'Y-m-d' );
$anagrafica = $fattura -> anagrafica ;
$tipo = Tipo :: find ( post ( 'idtipodocumento' ));
$iva = Aliquota :: find ( setting ( 'Iva predefinita' ));
2023-09-15 15:12:46 +02:00
2023-10-03 16:29:12 +02:00
$imponibile = $database -> table ( 'co_righe_documenti' )
2024-02-08 13:10:46 +01:00
-> join ( 'co_iva' , 'co_iva.id' , '=' , 'co_righe_documenti.idiva' )
-> where ( 'co_righe_documenti.iddocumento' , $fattura -> id )
-> whereIn ( 'co_iva.codice_natura_fe' , [ 'N2' , 'N2.1' , 'N2.2' , 'N3' , 'N3.1' , 'N3.2' , 'N3.3' , 'N3.4' , 'N3.5' , 'N3.6' , 'N6' , 'N6.1' , 'N6.2' , 'N6.3' , 'N6.4' , 'N6.5' , 'N6.6' , 'N6.7' , 'N6.8' , 'N6.9' ])
-> sum ( 'subtotale' );
2023-09-15 15:12:46 +02:00
2023-10-03 16:29:12 +02:00
$sconto = $database -> table ( 'co_righe_documenti' )
2024-02-08 13:10:46 +01:00
-> join ( 'co_iva' , 'co_iva.id' , '=' , 'co_righe_documenti.idiva' )
-> where ( 'co_righe_documenti.iddocumento' , $fattura -> id )
-> whereIn ( 'co_iva.codice_natura_fe' , [ 'N2' , 'N2.1' , 'N2.2' , 'N3' , 'N3.1' , 'N3.2' , 'N3.3' , 'N3.4' , 'N3.5' , 'N3.6' , 'N6' , 'N6.1' , 'N6.2' , 'N6.3' , 'N6.4' , 'N6.5' , 'N6.6' , 'N6.7' , 'N6.8' , 'N6.9' ])
-> sum ( 'sconto' );
2023-10-03 16:29:12 +02:00
2023-10-05 10:26:57 +02:00
$totale_imponibile = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' ) ? ( $imponibile - $sconto ) + (( $imponibile - $sconto ) * $iva -> percentuale / 100 ) : ( $imponibile - $sconto );
2022-09-01 15:38:31 +02:00
$totale_imponibile = $fattura -> tipo -> reversed == 1 ? - $totale_imponibile : $totale_imponibile ;
2022-05-13 13:23:15 +02:00
$autofattura = Fattura :: build ( $anagrafica , $tipo , $data , $id_segment );
$autofattura -> idconto = $fattura -> idconto ;
$autofattura -> idpagamento = $fattura -> idpagamento ;
$autofattura -> is_fattura_conto_terzi = 1 ;
2022-07-15 12:00:35 +02:00
$autofattura -> ref_documento = $fattura -> id ;
2022-05-13 13:23:15 +02:00
$autofattura -> save ();
$riga = Riga :: build ( $autofattura );
$riga -> descrizione = $tipo -> descrizione ;
$riga -> id_iva = $iva -> id ;
$riga -> idconto = setting ( 'Conto per autofattura' ) ? : setting ( 'Conto predefinito fatture di vendita' );
$riga -> setPrezzoUnitario ( $totale_imponibile , $iva -> id );
$riga -> qta = 1 ;
$riga -> save ();
// Aggiunta tipologia cliente se necessario
if ( ! $anagrafica -> isTipo ( 'Cliente' )) {
2024-02-06 17:36:05 +01:00
$tipo_cliente = ( new TipoAnagrafica ()) -> getByName ( 'Cliente' ) -> id_record ;
2024-02-05 17:07:33 +01:00
$tipi = $anagrafica -> tipi -> pluck ( 'id' ) -> toArray ();
2024-02-06 11:36:09 +01:00
$tipi [] = $tipo_cliente ;
2022-05-13 13:23:15 +02:00
$anagrafica -> tipologie = $tipi ;
$anagrafica -> save ();
}
$fattura -> id_autofattura = $autofattura -> id ;
$fattura -> save ();
$id_module = Modules :: get ( 'Fatture di vendita' )[ 'id' ];
$id_record = $autofattura -> id ;
break ;
2018-09-28 09:30:46 +02:00
case 'transform' :
$fattura -> id_segment = post ( 'id_segment' );
2019-07-31 18:28:50 +02:00
$fattura -> data = post ( 'data' );
2021-07-16 16:47:30 +02:00
$fattura -> data_registrazione = post ( 'data' );
$fattura -> data_competenza = post ( 'data' );
2018-09-28 09:30:46 +02:00
$fattura -> save ();
2022-06-16 11:06:51 +02:00
break ;
2023-08-04 14:54:28 +02:00
case 'controlla_serial' :
2023-06-26 15:12:43 +02:00
if ( post ( 'is_rientrabile' )) {
// Controllo che i serial entrati e usciti siano uguali in modo da poterli registrare nuovamente.
$serial_uscita = $dbo -> fetchOne ( 'SELECT COUNT(id) AS `tot` FROM mg_prodotti WHERE serial=' . prepare ( post ( 'serial' )) . ' AND dir="uscita" AND id_articolo=' . prepare ( post ( 'id_articolo' )))[ 'tot' ];
$serial_entrata = $dbo -> fetchOne ( 'SELECT COUNT(id) AS `tot` FROM mg_prodotti WHERE serial=' . prepare ( post ( 'serial' )) . ' AND dir="entrata" AND id_articolo=' . prepare ( post ( 'id_articolo' )))[ 'tot' ];
$has_serial = $serial_entrata != $serial_uscita ;
} else {
$has_serial = $dbo -> fetchOne ( 'SELECT id FROM mg_prodotti WHERE serial=' . prepare ( post ( 'serial' )) . ' AND dir="uscita" AND id_articolo=' . prepare ( post ( 'id_articolo' )) . ' AND (id_riga_documento IS NOT NULL OR id_riga_ordine IS NOT NULL OR id_riga_ddt IS NOT NULL)' )[ 'id' ];
}
2023-08-04 14:54:28 +02:00
2022-06-16 11:06:51 +02:00
echo json_encode ( $has_serial );
2023-08-04 14:54:28 +02:00
2023-02-17 12:33:45 +01:00
break ;
case 'add_articolo' :
$id_articolo = post ( 'id_articolo' );
$barcode = post ( 'barcode' );
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
if ( ! empty ( $barcode )) {
2023-08-04 14:54:28 +02:00
$id_articolo = $dbo -> selectOne ( 'mg_articoli' , 'id' , [ 'deleted_at' => null , 'attivo' => 1 , 'barcode' => $barcode ])[ 'id' ];
2023-07-17 16:03:38 +02:00
}
2023-02-24 13:01:23 +01:00
2023-07-17 16:03:38 +02:00
if ( ! empty ( $id_articolo )) {
$permetti_movimenti_sotto_zero = setting ( 'Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita' );
$qta_articolo = $dbo -> selectOne ( 'mg_articoli' , 'qta' , [ 'id' => $id_articolo ])[ 'qta' ];
2023-02-17 12:33:45 +01:00
2023-07-17 16:03:38 +02:00
$originale = ArticoloOriginale :: find ( $id_articolo );
2023-02-17 12:33:45 +01:00
2023-07-17 16:03:38 +02:00
if ( $qta_articolo <= 0 && ! $permetti_movimenti_sotto_zero && ! $originale -> servizio && $dir == 'entrata' ) {
$response [ 'error' ] = tr ( 'Quantità a magazzino non sufficiente' );
echo json_encode ( $response );
} else {
$articolo = Articolo :: build ( $fattura , $originale );
$qta = 1 ;
2023-07-17 14:15:41 +02:00
2023-07-17 16:03:38 +02:00
$articolo -> descrizione = $originale -> descrizione ;
$articolo -> um = $originale -> um ;
$articolo -> qta = 1 ;
$articolo -> costo_unitario = $originale -> prezzo_acquisto ;
2023-02-17 12:33:45 +01:00
2023-07-17 16:03:38 +02:00
$id_conto = ( $dir == 'entrata' ) ? setting ( 'Conto predefinito fatture di vendita' ) : setting ( 'Conto predefinito fatture di acquisto' );
if ( $dir == 'entrata' && ! empty ( $originale -> idconto_vendita )) {
$id_conto = $originale -> idconto_vendita ;
} elseif ( $dir == 'uscita' && ! empty ( $originale -> idconto_acquisto )) {
$id_conto = $originale -> idconto_acquisto ;
}
$articolo -> idconto = $id_conto ;
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
if ( $dir == 'entrata' ) {
2023-10-27 10:35:05 +02:00
// L'aliquota dell'articolo ha precedenza solo se ha aliquota a 0, altrimenti anagrafica -> articolo -> impostazione
2023-10-06 13:21:37 +02:00
if ( $originale -> idiva_vendita ) {
$aliquota_articolo = floatval ( Aliquota :: find ( $originale -> idiva_vendita ) -> percentuale );
}
$id_iva = ( $fattura -> anagrafica -> idiva_vendite && ( ! $originale -> idiva_vendita || $aliquota_articolo != 0 ) ? $fattura -> anagrafica -> idiva_vendite : $originale -> idiva_vendita ) ? : setting ( 'Iva predefinita' );
2023-07-17 16:03:38 +02:00
} else {
2023-12-18 12:42:23 +01:00
$id_iva = ( $fattura -> anagrafica -> idiva_acquisti ? $fattura -> anagrafica -> idiva_acquisti : ( $originale -> idiva_vendita ? $originale -> idiva_vendita : setting ( 'Iva predefinita' )));
2023-07-17 16:03:38 +02:00
}
$id_anagrafica = $fattura -> idanagrafica ;
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
2023-08-04 14:54:28 +02:00
2023-07-17 16:03:38 +02:00
// CALCOLO PREZZO UNITARIO
2023-12-29 16:15:38 +01:00
$prezzo_consigliato = getPrezzoConsigliato ( $id_anagrafica , $dir , $id_articolo );
$prezzo_unitario = $prezzo_consigliato [ 'prezzo_unitario' ];
$sconto = $prezzo_consigliato [ 'sconto' ];
2023-03-09 17:45:09 +01:00
2023-07-17 16:03:38 +02:00
if ( $dir == 'entrata' ) {
$prezzo_unitario = $prezzo_unitario ? : ( $prezzi_ivati ? $originale -> prezzo_vendita_ivato : $originale -> prezzo_vendita );
} else {
$prezzo_unitario = $prezzo_unitario ? : $originale -> prezzo_acquisto ;
}
2023-03-09 17:45:09 +01:00
2023-09-08 10:33:30 +02:00
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
$join = ( $dir == 'entrata' ? 'id_piano_sconto_vendite' : 'id_piano_sconto_acquisti' );
$piano_sconto = $dbo -> fetchOne ( 'SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.' . $join . '=mg_piani_sconto.id WHERE idanagrafica=' . prepare ( $id_anagrafica ));
if ( ! empty ( $piano_sconto )) {
$sconto = parseScontoCombinato ( $piano_sconto [ 'prc_guadagno' ] . '+' . $sconto );
}
2023-09-21 16:26:22 +02:00
2023-07-17 16:03:38 +02:00
$provvigione = $dbo -> selectOne ( 'an_anagrafiche' , 'provvigione_default' , [ 'idanagrafica' => $fattura -> idagente ])[ 'provvigione_default' ];
2023-02-17 12:33:45 +01:00
2023-07-17 16:03:38 +02:00
$articolo -> setPrezzoUnitario ( $prezzo_unitario , $id_iva );
$articolo -> setSconto ( $sconto , 'PRC' );
$articolo -> setProvvigione ( $provvigione ? : 0 , 'PRC' );
$articolo -> save ();
2023-02-17 12:33:45 +01:00
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( 'Nuovo articolo aggiunto!' ));
2023-02-17 12:33:45 +01:00
}
2023-07-17 16:03:38 +02:00
} else {
$response [ 'error' ] = tr ( 'Nessun articolo corrispondente a magazzino' );
echo json_encode ( $response );
2023-02-17 12:33:45 +01:00
}
2023-04-20 15:22:29 +02:00
break ;
2024-01-15 15:30:45 +01:00
// Controllo se impostare anagrafica azienda in base a tipologia documento
2023-04-20 15:22:29 +02:00
case 'check_tipodocumento' :
$idtipodocumento = post ( 'idtipodocumento' );
2023-08-04 14:54:28 +02:00
$tipologie = Tipo :: wherein ( 'codice_tipo_documento_fe' , [ 'TD21' , 'TD27' ]) -> where ( 'dir' , 'entrata' ) -> get () -> pluck ( 'id' ) -> toArray ();
2023-04-20 15:22:29 +02:00
$azienda = Anagrafica :: find ( setting ( 'Azienda predefinita' ));
$result = false ;
if ( in_array ( $idtipodocumento , $tipologie )) {
// Aggiunta tipologia cliente se necessario
if ( ! $azienda -> isTipo ( 'Cliente' )) {
2024-02-06 17:36:05 +01:00
$tipo_cliente = ( new TipoAnagrafica ()) -> getByName ( 'Cliente' ) -> id_record ;
2024-02-05 17:07:33 +01:00
$tipi = $azienda -> tipi -> pluck ( 'id' ) -> toArray ();
2024-02-06 11:36:09 +01:00
$tipi [] = $tipo_cliente ;
2023-04-20 15:22:29 +02:00
$azienda -> tipologie = $tipi ;
$azienda -> save ();
}
$result = [
'id' => $azienda -> id ,
2023-08-04 14:54:28 +02:00
'ragione_sociale' => $azienda -> ragione_sociale ,
2023-04-20 15:22:29 +02:00
];
}
echo json_encode ( $result );
2018-07-03 17:28:02 +02:00
break ;
2023-04-27 14:35:02 +02:00
case 'edit-price' :
2023-09-25 16:53:28 +02:00
$righe = ( array ) post ( 'righe' );
2023-05-04 09:57:01 +02:00
$numero_totale = 0 ;
2023-04-27 14:35:02 +02:00
2023-07-17 16:03:38 +02:00
foreach ( $righe as $riga ) {
2024-01-15 15:30:45 +01:00
if ( $riga [ 'id' ] != null ) {
2023-07-17 16:03:38 +02:00
$articolo = Articolo :: find ( $riga [ 'id' ]);
}
2023-08-04 14:54:28 +02:00
2023-09-25 16:53:28 +02:00
if ( $articolo -> prezzo_unitario != $riga [ 'price' ]) {
2023-07-17 16:03:38 +02:00
$articolo -> setPrezzoUnitario ( $riga [ 'price' ], $articolo -> idiva );
$articolo -> save ();
++ $numero_totale ;
}
}
2023-05-04 09:57:01 +02:00
2023-07-17 16:03:38 +02:00
if ( $numero_totale > 1 ) {
flash () -> info ( tr ( '_NUM_ prezzi modificati!' , [
'_NUM_' => $numero_totale ,
]));
2023-08-04 14:54:28 +02:00
} elseif ( $numero_totale == 1 ) {
2023-07-17 16:03:38 +02:00
flash () -> info ( tr ( '_NUM_ prezzo modificato!' , [
'_NUM_' => $numero_totale ,
2023-05-04 09:57:01 +02:00
]));
} else {
2023-07-17 16:03:38 +02:00
flash () -> warning ( tr ( 'Nessun prezzo modificato!' ));
2023-04-28 14:44:35 +02:00
}
2023-09-25 16:53:28 +02:00
break ;
case 'update-price' :
$id_anagrafica = $fattura -> idanagrafica ;
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
$numero_totale = 0 ;
$id_righe = ( array ) post ( 'righe' );
foreach ( $id_righe as $id_riga ) {
$riga = Articolo :: find ( $id_riga ) ? : Riga :: find ( $id_riga );
// CALCOLO PREZZO UNITARIO
$prezzo_unitario = 0 ;
$sconto = 0 ;
if ( $riga -> isArticolo ()) {
2023-12-29 16:15:38 +01:00
$id_articolo = $riga -> idarticolo ;
$prezzo_consigliato = getPrezzoConsigliato ( $id_anagrafica , $dir , $id_articolo );
$prezzo_unitario = $prezzo_consigliato [ 'prezzo_unitario' ];
$sconto = $prezzo_consigliato [ 'sconto' ];
2023-09-25 16:53:28 +02:00
if ( $dir == 'entrata' ) {
$prezzo_unitario = $prezzo_unitario ? : ( $prezzi_ivati ? $riga -> articolo -> prezzo_vendita_ivato : $riga -> articolo -> prezzo_vendita );
$riga -> costo_unitario = $riga -> articolo -> prezzo_acquisto ;
} else {
$prezzo_unitario = $prezzo_unitario ? : $riga -> articolo -> prezzo_acquisto ;
}
$riga -> setPrezzoUnitario ( $prezzo_unitario , $riga -> idiva );
}
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
$join = ( $dir == 'entrata' ? 'id_piano_sconto_vendite' : 'id_piano_sconto_acquisti' );
$piano_sconto = $dbo -> fetchOne ( 'SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.' . $join . '=mg_piani_sconto.id WHERE idanagrafica=' . prepare ( $id_anagrafica ));
if ( ! empty ( $piano_sconto )) {
$sconto = parseScontoCombinato ( $piano_sconto [ 'prc_guadagno' ] . '+' . $sconto );
}
$riga -> setSconto ( $sconto , 'PRC' );
$riga -> save ();
++ $numero_totale ;
}
if ( $numero_totale > 1 ) {
flash () -> info ( tr ( '_NUM_ prezzi modificati!' , [
'_NUM_' => $numero_totale ,
]));
} elseif ( $numero_totale == 1 ) {
flash () -> info ( tr ( '_NUM_ prezzo modificato!' , [
'_NUM_' => $numero_totale ,
]));
} else {
flash () -> warning ( tr ( 'Nessun prezzo modificato!' ));
}
2023-05-04 09:07:34 +02:00
2023-04-27 14:35:02 +02:00
break ;
2023-09-29 15:34:02 +02:00
case 'update_inline' :
$id_riga = post ( 'riga_id' );
$riga = $riga ? : Riga :: find ( $id_riga );
$riga = $riga ? : Articolo :: find ( $id_riga );
2023-10-06 12:45:32 +02:00
$riga = $riga ? : Sconto :: find ( $id_riga );
2023-09-29 15:34:02 +02:00
if ( ! empty ( $riga )) {
2023-10-06 12:45:32 +02:00
if ( $riga -> isSconto ()) {
$riga -> setScontoUnitario ( post ( 'sconto' ), $riga -> idiva );
} else {
$riga -> qta = post ( 'qta' );
$riga -> setPrezzoUnitario ( post ( 'prezzo' ), $riga -> idiva );
$riga -> setSconto ( post ( 'sconto' ), post ( 'tipo_sconto' ));
$riga -> costo_unitario = post ( 'costo' ) ? : 0 ;
}
2023-09-29 15:34:02 +02:00
$riga -> save ();
flash () -> info ( tr ( 'Riga aggiornata!' ));
}
2023-10-05 10:26:57 +02:00
break ;
2018-07-03 17:28:02 +02:00
}
2018-07-05 17:56:38 +02:00
// Nota di debito
2018-07-03 17:28:02 +02:00
if ( get ( 'op' ) == 'nota_addebito' ) {
2018-08-21 10:11:30 +02:00
$rs_segment = $dbo -> fetchArray ( " SELECT * FROM zz_segments WHERE predefined_addebito='1' " );
2018-09-28 17:29:59 +02:00
if ( ! empty ( $rs_segment )) {
2018-08-21 10:11:30 +02:00
$id_segment = $rs_segment [ 0 ][ 'id' ];
2018-08-29 18:15:12 +02:00
} else {
$id_segment = $record [ 'id_segment' ];
2018-08-21 10:11:30 +02:00
}
2018-07-03 17:28:02 +02:00
2018-10-25 16:57:39 +02:00
$anagrafica = $fattura -> anagrafica ;
2018-09-28 17:29:59 +02:00
$tipo = Tipo :: where ( 'descrizione' , 'Nota di debito' ) -> where ( 'dir' , 'entrata' ) -> first ();
$data = $fattura -> data ;
2019-01-02 14:15:16 +01:00
$nota = Fattura :: build ( $anagrafica , $tipo , $data , $id_segment );
2018-09-28 17:29:59 +02:00
$nota -> ref_documento = $fattura -> id ;
$nota -> idconto = $fattura -> idconto ;
$nota -> idpagamento = $fattura -> idpagamento ;
2020-09-17 10:17:39 +02:00
$nota -> id_banca_azienda = $fattura -> id_banca_azienda ;
$nota -> id_banca_controparte = $fattura -> id_banca_controparte ;
2019-05-29 19:17:57 +02:00
$nota -> idsede_partenza = $fattura -> idsede_partenza ;
$nota -> idsede_destinazione = $fattura -> idsede_destinazione ;
2018-09-28 17:29:59 +02:00
$nota -> save ();
2018-07-03 17:28:02 +02:00
2018-09-28 17:29:59 +02:00
$id_record = $nota -> id ;
2019-05-29 19:17:57 +02:00
aggiorna_sedi_movimenti ( 'documenti' , $id_record );
2017-08-04 16:28:16 +02:00
}