2017-08-04 16:28:16 +02:00
< ? php
include_once __DIR__ . '/../../core.php' ;
2018-12-29 11:42:53 +01:00
use Modules\Anagrafiche\Anagrafica ;
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 ;
2019-08-29 14:28:05 +02:00
use Plugins\ExportFE\FatturaElettronica ;
2018-08-09 10:14:26 +02:00
2017-09-22 15:19:59 +02:00
$module = Modules :: get ( $id_module );
2017-08-04 16:28:16 +02:00
if ( $module [ 'name' ] == 'Fatture di vendita' ) {
$dir = 'entrata' ;
} else {
$dir = 'uscita' ;
}
switch ( post ( 'op' )) {
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
2018-09-25 16:47:44 +02:00
$anagrafica = Anagrafica :: find ( $idanagrafica );
$tipo = Tipo :: find ( $idtipodocumento );
2019-01-02 14:15:16 +01:00
$fattura = Fattura :: build ( $anagrafica , $tipo , $data , $id_segment );
2018-08-09 10:14:26 +02:00
$id_record = $fattura -> id ;
2017-08-04 16:28:16 +02:00
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Aggiunta fattura numero _NUM_!' , [
2018-08-09 10:14:26 +02:00
'_NUM_' => $fattura -> numero ,
2018-07-07 13:56:22 +02:00
]));
2017-08-04 16:28:16 +02:00
break ;
case 'update' :
2018-07-19 15:33:32 +02:00
if ( post ( 'id_record' ) !== null ) {
2019-08-29 14:28:05 +02:00
$stato_precedente = $fattura -> stato ;
$stato = Stato :: find ( post ( 'idstatodocumento' ));
$fattura -> stato () -> associate ( $stato );
$tipo = Tipo :: find ( post ( 'idtipodocumento' ));
$fattura -> tipo () -> associate ( $tipo );
2019-05-10 06:32:06 +02:00
$fattura -> data = post ( 'data' );
2019-11-13 19:07:24 +01:00
if ( $dir == 'entrata' ) {
$fattura -> data_registrazione = post ( 'data' );
} else {
$fattura -> data_registrazione = post ( 'data_registrazione' );
}
2019-05-17 05:56:10 +02:00
$fattura -> data_competenza = post ( 'data_competenza' );
2019-05-10 06:32:06 +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 -> idpagamento = post ( 'idpagamento' );
$fattura -> idbanca = post ( 'idbanca' );
$fattura -> idcausalet = post ( 'idcausalet' );
$fattura -> idspedizione = post ( 'idspedizione' );
$fattura -> idporto = post ( 'idporto' );
$fattura -> idaspettobeni = post ( 'idaspettobeni' );
$fattura -> idvettore = post ( 'idvettore' );
2019-05-29 19:17:57 +02:00
$fattura -> idsede_partenza = post ( 'idsede_partenza' );
$fattura -> idsede_destinazione = post ( 'idsede_destinazione' );
2019-05-10 06:32:06 +02:00
$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 -> rivalsainps = 0 ;
$fattura -> ritenutaacconto = 0 ;
$fattura -> iva_rivalsainps = 0 ;
2019-09-13 11:29:45 +02:00
$fattura -> id_ritenuta_contributi = post ( 'id_ritenuta_contributi' ) ? : null ;
2019-05-10 06:32:06 +02:00
$fattura -> codice_stato_fe = post ( 'codice_stato_fe' ) ? : null ;
2018-07-03 18:06:36 +02:00
2019-09-13 11:29:45 +02:00
// Informazioni per le fatture di acquisto
2017-08-04 16:28:16 +02:00
if ( $dir == 'uscita' ) {
2019-05-10 02:50:01 +02:00
$fattura -> numero = post ( 'numero' );
$fattura -> numero_esterno = post ( 'numero_esterno' );
2019-05-10 06:32:06 +02:00
$fattura -> idrivalsainps = post ( 'id_rivalsa_inps' );
$fattura -> idritenutaacconto = post ( 'id_ritenuta_acconto' );
2019-05-10 02:50:01 +02:00
}
2019-09-13 11:29:45 +02:00
// Operazioni sul bollo
2019-05-10 06:32:06 +02:00
$fattura -> addebita_bollo = post ( 'addebita_bollo' );
2019-05-10 02:50:01 +02:00
$bollo_automatico = post ( 'bollo_automatico' );
2019-05-10 06:32:06 +02:00
if ( empty ( $bollo_automatico )) {
2019-05-10 02:50:01 +02:00
$fattura -> bollo = post ( 'bollo' );
2019-05-10 06:32:06 +02:00
} else {
2019-05-10 02:50:01 +02:00
$fattura -> bollo = null ;
2017-08-04 16:28:16 +02:00
}
2019-09-13 11:29:45 +02:00
// Operazioni sulla dichiarazione d'intento
$dichiarazione_precedente = $fattura -> dichiarazione ;
$fattura -> id_dichiarazione_intento = post ( 'id_dichiarazione_intento' ) ? : null ;
2019-05-10 02:50:01 +02:00
$fattura -> save ();
2017-08-04 16:28:16 +02:00
2019-09-02 09:57:58 +02:00
if ( $stato_precedente -> descrizione == 'Bozza' && $stato [ 'descrizione' ] == 'Emessa' ) {
2019-08-29 17:25:41 +02:00
// Generazione automatica della Fattura Elettronica
$stato_fe = empty ( $fattura -> codice_stato_fe ) || in_array ( $fattura -> codice_stato_fe , [ 'GEN' , 'NS' , 'EC02' ]);
2019-08-29 14:28:05 +02:00
$checks = FatturaElettronica :: controllaFattura ( $fattura );
2019-09-02 09:57:58 +02:00
if ( $stato_fe && empty ( $checks )) {
2019-08-29 14:28:05 +02:00
try {
$fattura_pa = new FatturaElettronica ( $id_record );
$file = $fattura_pa -> save ( DOCROOT . '/' . FatturaElettronica :: getDirectory ());
flash () -> info ( tr ( 'Fattura elettronica generata correttamente!' ));
if ( ! $fattura_pa -> isValid ()) {
$errors = $fattura_pa -> getErrors ();
flash () -> warning ( tr ( 'La fattura elettronica potrebbe avere delle irregolarità!' ) . ' ' . tr ( 'Controllare i seguenti campi: _LIST_' , [
'_LIST_' => implode ( ', ' , $errors ),
]) . '.' );
}
} catch ( UnexpectedValueException $e ) {
}
2019-09-02 09:57:58 +02:00
} elseif ( ! empty ( $checks )) {
2019-08-29 14:28:05 +02:00
$message = tr ( 'La fattura elettronica non è stata generata a causa di alcune informazioni mancanti' ) . ':' ;
foreach ( $checks as $check ) {
$message .= '
< p >< b > '.$check[' name '].' '.$check[' link '].' </ b ></ p >
< ul > ' ;
foreach ( $check [ 'errors' ] as $error ) {
if ( ! empty ( $error )) {
$message .= '
< li > '.$error.' </ li > ' ;
}
}
$message .= '
</ ul > ' ;
}
flash () -> warning ( $message );
}
}
2019-05-29 19:17:57 +02:00
aggiorna_sedi_movimenti ( 'documenti' , $id_record );
2019-06-04 20:45:40 +02:00
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Fattura modificata correttamente!' ));
2017-08-04 16:28:16 +02:00
}
break ;
2019-03-08 16:59:55 +01:00
// Ricalcolo scadenze
case 'ricalcola_scadenze' :
$fattura -> registraScadenze ( false , true );
break ;
2019-03-15 12:16:20 +01:00
// Ricalcolo scadenze
case 'controlla_totali' :
try {
$xml = \Util\XML :: read ( $fattura -> getXML ());
$dati_generali = $xml [ 'FatturaElettronicaBody' ][ 'DatiGenerali' ][ 'DatiGeneraliDocumento' ];
$totale_documento = $dati_generali [ 'ImportoTotaleDocumento' ] ? : null ;
} catch ( Exception $e ) {
$totale_documento = null ;
}
echo json_encode ([
'stored' => $totale_documento ,
'calculated' => $fattura -> totale ,
]);
break ;
2017-08-04 16:28:16 +02:00
// eliminazione documento
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
$dbo -> query ( 'UPDATE co_ordiniservizio_pianificazionefatture SET iddocumento=0 WHERE iddocumento=' . prepare ( $id_record ));
2017-08-04 16:28:16 +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 ;
// Duplicazione fattura
case 'copy' :
if ( $id_record ) {
2018-06-26 09:41:43 +02:00
// Duplicazione righe
2018-04-03 12:30:12 +02:00
$righe = $dbo -> fetchArray ( 'SELECT * FROM co_righe_documenti WHERE iddocumento=' . prepare ( $id_record ));
// Lettura dati fattura attuale
$rs = $dbo -> fetchArray ( 'SELECT * FROM co_documenti WHERE id=' . prepare ( $id_record ));
2018-06-26 09:41:43 +02:00
$id_segment = $rs [ 0 ][ 'id_segment' ];
2017-08-04 16:28:16 +02:00
// Calcolo prossimo numero fattura
$numero = get_new_numerofattura ( date ( 'Y-m-d' ));
2018-06-26 09:41:43 +02:00
2017-08-04 16:28:16 +02:00
if ( $dir == 'entrata' ) {
$numero_esterno = get_new_numerosecondariofattura ( date ( 'Y-m-d' ));
} else {
$numero_esterno = '' ;
}
// Duplicazione intestazione
2019-05-29 19:17:57 +02:00
$dbo -> query ( 'INSERT INTO co_documenti(numero, numero_esterno, data, idanagrafica, idcausalet, idspedizione, idporto, idaspettobeni, idvettore, n_colli, idsede_partenza, idsede_destinazione, idtipodocumento, idstatodocumento, idpagamento, idconto, idrivalsainps, idritenutaacconto, rivalsainps, iva_rivalsainps, ritenutaacconto, bollo, note, note_aggiuntive, buono_ordine, id_segment) VALUES(' . prepare ( $numero ) . ', ' . prepare ( $numero_esterno ) . ', NOW(), ' . prepare ( $rs [ 0 ][ 'idanagrafica' ]) . ', ' . prepare ( $rs [ 0 ][ 'idcausalet' ]) . ', ' . prepare ( $rs [ 0 ][ 'idspedizione' ]) . ', ' . prepare ( $rs [ 0 ][ 'idporto' ]) . ', ' . prepare ( $rs [ 0 ][ 'idaspettobeni' ]) . ', ' . prepare ( $rs [ 0 ][ 'idvettore' ]) . ', ' . prepare ( $rs [ 0 ][ 'n_colli' ]) . ', ' . prepare ( $rs [ 0 ][ 'idsede_partenza' ]) . ', ' . prepare ( $rs [ 0 ][ 'idsede_destinazione' ]) . ', ' . prepare ( $rs [ 0 ][ 'idtipodocumento' ]) . ', (SELECT id FROM co_statidocumento WHERE descrizione=\'Bozza\'), ' . prepare ( $rs [ 0 ][ 'idpagamento' ]) . ', ' . prepare ( $rs [ 0 ][ 'idconto' ]) . ', ' . prepare ( $rs [ 0 ][ 'idrivalsainps' ]) . ', ' . prepare ( $rs [ 0 ][ 'idritenutaacconto' ]) . ', ' . prepare ( $rs [ 0 ][ 'rivalsainps' ]) . ', ' . prepare ( $rs [ 0 ][ 'iva_rivalsainps' ]) . ', ' . prepare ( $rs [ 0 ][ 'ritenutaacconto' ]) . ', ' . prepare ( $rs [ 0 ][ 'bollo' ]) . ', ' . prepare ( $rs [ 0 ][ 'note' ]) . ', ' . prepare ( $rs [ 0 ][ 'note_aggiuntive' ]) . ', ' . prepare ( $rs [ 0 ][ 'buono_ordine' ]) . ', ' . prepare ( $rs [ 0 ][ 'id_segment' ]) . ')' );
2017-08-04 16:28:16 +02:00
$id_record = $dbo -> lastInsertedID ();
2018-12-07 15:20:17 +01:00
// TODO: sistemare la duplicazione delle righe generiche e degli articoli, ignorando interventi, ddt, ordini, preventivi
2017-12-14 16:51:31 +01:00
foreach ( $righe as $riga ) {
2017-08-04 16:28:16 +02:00
// Scarico/carico nuovamente l'articolo da magazzino
2017-08-30 11:50:46 +02:00
if ( ! empty ( $riga [ 'idarticolo' ])) {
2018-01-03 11:40:51 +01:00
add_articolo_infattura ( $id_record , $riga [ 'idarticolo' ], $riga [ 'descrizione' ], $riga [ 'idiva' ], $riga [ 'qta' ], $riga [ 'subtotale' ], $riga [ 'sconto' ], $riga [ 'sconto_unitario' ], $riga [ 'tipo_sconto' ], $riga [ 'idintervento' ], $riga [ 'idconto' ], $riga [ 'um' ]);
} else {
2019-05-29 19:17:57 +02:00
$dbo -> query ( 'INSERT INTO co_righe_documenti(iddocumento, idordine, idddt, idintervento, idarticolo, idpreventivo, idcontratto, is_descrizione, idtecnico, idagente, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, um, qta, `order`) VALUES(' . prepare ( $id_record ) . ', 0, 0, 0, ' . prepare ( $riga [ 'idarticolo' ]) . ', ' . prepare ( $riga [ 'idpreventivo' ]) . ', ' . prepare ( $riga [ 'idcontratto' ]) . ', ' . prepare ( $riga [ 'is_descrizione' ]) . ', ' . prepare ( $riga [ 'idtecnico' ]) . ', ' . prepare ( $riga [ 'idagente' ]) . ', ' . prepare ( $riga [ 'idconto' ]) . ', ' . prepare ( $riga [ 'idiva' ]) . ', ' . prepare ( $riga [ 'desc_iva' ]) . ', ' . prepare ( $riga [ 'iva' ]) . ', ' . prepare ( $riga [ 'iva_indetraibile' ]) . ', ' . prepare ( $riga [ 'descrizione' ]) . ', ' . prepare ( $riga [ 'subtotale' ]) . ', ' . prepare ( $riga [ 'sconto' ]) . ', ' . prepare ( $riga [ 'sconto_unitario' ]) . ', ' . prepare ( $riga [ 'tipo_sconto' ]) . ', ' . prepare ( $riga [ 'idritenutaacconto' ]) . ', ' . prepare ( $riga [ 'ritenutaacconto' ]) . ', ' . prepare ( $riga [ 'idrivalsainps' ]) . ', ' . prepare ( $riga [ 'rivalsainps' ]) . ', ' . prepare ( $riga [ 'um' ]) . ', ' . prepare ( $riga [ 'qta' ]) . ', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=' . prepare ( $id_record ) . '))' );
2017-08-04 16:28:16 +02:00
}
}
// Ricalcolo inps, ritenuta e bollo (se la fattura non è stata pagata)
2019-04-19 20:47:55 +02:00
ricalcola_costiagg_fattura ( $id_record );
2019-05-29 19:17:57 +02:00
aggiorna_sedi_movimenti ( 'documenti' , $id_record );
2019-06-04 20:45:40 +02:00
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Fattura duplicata correttamente!' ));
2017-08-04 16:28:16 +02:00
}
break ;
case 'reopen' :
if ( ! empty ( $id_record )) {
2019-07-25 17:20:24 +02:00
$dbo -> query ( " UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Bozza') WHERE id= " . prepare ( $id_record ));
elimina_scadenze ( $id_record );
elimina_movimenti ( $id_record , 1 );
ricalcola_costiagg_fattura ( $id_record );
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
2019-02-21 12:55:18 +01: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 ();
}
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
2018-09-26 15:37:46 +02:00
flash () -> info ( tr ( 'Intervento _NUM_ aggiunto!' , [
2017-12-14 16:51:31 +01:00
'_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 ();
$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!' ));
break ;
case 'manage_riga_fe' :
2019-07-16 10:01:16 +02:00
$id_riga = post ( 'id_riga' );
2019-07-15 18:34:59 +02:00
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 ();
$ignore = [
'id_plugin' ,
'id_module' ,
'id_record' ,
'backto' ,
'hash' ,
'op' ,
'idriga' ,
'dir' ,
];
foreach ( $ignore as $name ) {
unset ( $data [ $name ]);
}
$riga -> dati_aggiuntivi_fe = $data ;
$riga -> save ();
flash () -> info ( tr ( 'Dati FE aggiornati correttamente!' ));
}
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 );
2018-10-04 17:25:42 +02:00
}
2018-09-26 15:37:46 +02:00
$qta = post ( 'qta' );
if ( ! empty ( $record [ 'is_reversed' ])) {
$qta = - $qta ;
}
2018-07-04 12:57:53 +02:00
2018-09-26 15:37:46 +02:00
$articolo -> descrizione = post ( 'descrizione' );
2019-02-12 15:00:08 +01:00
$articolo -> um = post ( 'um' ) ? : null ;
2018-09-25 16:47:44 +02:00
2018-09-26 15:37:46 +02:00
$articolo -> id_iva = post ( 'idiva' );
$articolo -> idconto = post ( 'idconto' );
2018-09-25 16:47:44 +02:00
2019-02-12 15:00:08 +01:00
$articolo -> calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$articolo -> id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
2019-04-12 01:11:32 +02:00
$articolo -> ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
2019-02-12 15:00:08 +01:00
$articolo -> id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
2018-11-21 17:45:06 +01:00
2019-02-15 12:12:44 +01:00
$articolo -> prezzo_unitario_acquisto = post ( 'prezzo_acquisto' ) ? : 0 ;
2018-11-21 17:45:06 +01:00
$articolo -> prezzo_unitario_vendita = post ( 'prezzo' );
2018-09-26 15:37:46 +02:00
$articolo -> sconto_unitario = post ( 'sconto' );
$articolo -> tipo_sconto = post ( 'tipo_sconto' );
2018-09-25 18:04:39 +02:00
2018-10-04 17:25:42 +02:00
try {
$articolo -> qta = $qta ;
2018-10-04 17:41:31 +02:00
} catch ( UnexpectedValueException $e ) {
2018-10-04 17:25:42 +02:00
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
}
2018-07-25 12:34:54 +02:00
2018-10-04 17:25:42 +02:00
$articolo -> save ();
2018-09-26 15:37:46 +02:00
2019-03-29 12:46:17 +01:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Articolo modificato!' ));
} else {
flash () -> info ( tr ( 'Articolo aggiunto!' ));
}
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
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
}
$sconto -> descrizione = post ( 'descrizione' );
$sconto -> id_iva = post ( 'idiva' );
$sconto -> idconto = post ( 'idconto' );
$sconto -> calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$sconto -> id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
2019-04-12 01:11:32 +02:00
$sconto -> ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
2019-03-29 12:46:17 +01:00
$sconto -> id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
$sconto -> sconto_unitario = post ( 'sconto_unitario' );
$sconto -> tipo_sconto = 'UNT' ;
$sconto -> save ();
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Sconto/maggiorazione modificato!' ));
} else {
2019-07-11 17:20:58 +02:00
flash () -> info ( tr ( 'Sconto/maggiorazione aggiunto!' ));
2019-03-29 12:46:17 +01:00
}
2017-08-04 16:28:16 +02:00
2018-10-04 17:25:42 +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
}
2018-09-26 15:37:46 +02:00
$qta = post ( 'qta' );
if ( ! empty ( $record [ 'is_reversed' ])) {
$qta = - $qta ;
}
2017-08-04 16:28:16 +02:00
2018-09-26 15:37:46 +02:00
$riga -> descrizione = post ( 'descrizione' );
2019-02-12 15:00:08 +01:00
$riga -> um = post ( 'um' ) ? : null ;
2018-09-26 15:37:46 +02:00
$riga -> id_iva = post ( 'idiva' );
$riga -> idconto = post ( 'idconto' );
2017-08-04 16:28:16 +02:00
2019-02-14 18:33:25 +01:00
$riga -> calcolo_ritenuta_acconto = post ( 'calcolo_ritenuta_acconto' ) ? : null ;
$riga -> id_ritenuta_acconto = post ( 'id_ritenuta_acconto' ) ? : null ;
2019-04-12 01:11:32 +02:00
$riga -> ritenuta_contributi = boolval ( post ( 'ritenuta_contributi' ));
2019-02-14 18:33:25 +01:00
$riga -> id_rivalsa_inps = post ( 'id_rivalsa_inps' ) ? : null ;
2018-11-21 17:45:06 +01:00
2019-02-15 12:12:44 +01:00
$riga -> prezzo_unitario_acquisto = post ( 'prezzo_acquisto' ) ? : 0 ;
2018-11-21 17:45:06 +01:00
$riga -> prezzo_unitario_vendita = post ( 'prezzo' );
2018-09-26 15:37:46 +02:00
$riga -> sconto_unitario = post ( 'sconto' );
$riga -> tipo_sconto = post ( 'tipo_sconto' );
2017-08-04 16:28:16 +02:00
2018-12-29 11:42:53 +01:00
$riga -> qta = $qta ;
2018-09-26 15:37:46 +02:00
$riga -> save ();
2017-08-04 16:28:16 +02:00
2018-10-04 17:25:42 +02:00
if ( post ( 'idriga' ) != null ) {
flash () -> info ( tr ( 'Riga modificata!' ));
} else {
flash () -> info ( tr ( 'Riga aggiunta!' ));
}
2017-08-04 16:28:16 +02:00
2018-09-26 15:37:46 +02:00
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
2017-08-04 16:28:16 +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' );
2018-11-13 18:26:51 +01:00
2018-11-12 15:27:26 +01:00
$riga -> save ();
2018-11-13 18:26:51 +01:00
if ( post ( 'idriga' ) != null ) {
2018-11-12 12:18:23 +01:00
flash () -> info ( tr ( 'Riga descrittiva modificata!' ));
} else {
flash () -> info ( tr ( 'Riga descrittiva aggiunta!' ));
}
2018-11-13 18:26:51 +01:00
2018-01-18 19:03:06 +01:00
break ;
2017-08-04 16:28:16 +02:00
// Scollegamento intervento da documento
case 'unlink_intervento' :
2018-07-19 15:33:32 +02:00
if ( ! empty ( $id_record ) && post ( 'idriga' ) !== null ) {
2019-07-24 15:29:03 +02:00
$id_riga = post ( 'idriga' );
2017-08-04 16:28:16 +02:00
2019-07-23 15:39:00 +02:00
$righe = $fattura -> getRighe ();
$riga = $righe -> find ( $id_riga );
2017-08-04 16:28:16 +02:00
2019-07-23 15:39:00 +02:00
$righe_intervento = $righe -> where ( 'idintervento' , $riga -> idintervento );
foreach ( $righe_intervento as $r ) {
$r -> delete ();
2017-08-04 16:28:16 +02:00
}
2019-07-23 15:39:00 +02:00
//$dbo->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE descrizione = 'Completato') WHERE id=".prepare($idintervento));
2017-08-04 16:28:16 +02:00
2018-07-19 17:29:21 +02:00
flash () -> info ( tr ( 'Intervento _NUM_ rimosso!' , [
2017-09-10 14:35:41 +02:00
'_NUM_' => $idintervento ,
2018-07-07 13:56:22 +02:00
]));
2017-08-04 16:28:16 +02:00
}
break ;
// Scollegamento riga generica da documento
2019-10-01 18:32:06 +02:00
case 'delete_riga' :
2019-07-22 18:35:13 +02:00
$id_riga = post ( 'idriga' );
2017-08-04 16:28:16 +02:00
2019-07-22 18:35:13 +02:00
if ( ! empty ( $id_riga )) {
$riga = $fattura -> getRighe () -> find ( $id_riga );
2019-07-23 15:39:00 +02:00
try {
$riga -> delete ();
2017-08-04 16:28:16 +02:00
2019-07-23 15:39:00 +02:00
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura ( $id_record );
2018-07-04 12:57:53 +02:00
2019-07-23 15:39:00 +02:00
flash () -> info ( tr ( 'Riga rimossa!' ));
} catch ( InvalidArgumentException $e ) {
flash () -> error ( tr ( 'Alcuni serial number sono già stati utilizzati!' ));
}
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' );
2017-08-04 16:28:16 +02:00
2018-10-04 17:25:42 +02:00
$articolo -> serials = $serials ;
$articolo -> save ();
2017-09-05 17:31:58 +02:00
2017-08-04 16:28:16 +02:00
break ;
case 'update_position' :
2018-11-30 16:10:15 +01:00
$orders = explode ( ',' , $_POST [ 'order' ]);
2018-10-30 10:27:44 +01:00
$order = 0 ;
2018-11-09 11:34:27 +01:00
foreach ( $orders as $idriga ) {
2018-10-30 10:27:44 +01:00
$dbo -> query ( 'UPDATE `co_righe_documenti` SET `order`=' . prepare ( $order ) . ' WHERE id=' . prepare ( $idriga ));
2018-11-30 16:10:15 +01:00
++ $order ;
2017-08-04 16:28:16 +02:00
}
break ;
2018-06-26 09:41:43 +02:00
2019-07-23 15:39:00 +02:00
// Aggiunta di un documento in fattura
case 'add_documento' :
$id_documento = post ( 'id_documento' );
$type = post ( 'type' );
2018-06-25 11:44:06 +02:00
2019-07-23 15:39:00 +02:00
$movimenta = true ;
2019-10-13 16:42:09 +02:00
$idsede = 0 ;
2019-07-23 15:39:00 +02:00
if ( $type == 'ordine' ) {
$documento = \Modules\Ordini\Ordine :: find ( $id_documento );
2019-10-13 16:42:09 +02:00
$idsede = $documento -> idsede ;
2019-07-23 15:39:00 +02:00
} elseif ( $type == 'ddt' ) {
$documento = \Modules\DDT\DDT :: find ( $id_documento );
2019-10-13 16:42:09 +02:00
$idsede = ( $documento -> direzione == 'entrata' ) ? $documento -> idsede_destinazione : $documento -> idsede_partenza ;
2019-07-23 15:39:00 +02:00
$movimenta = false ;
} elseif ( $type == 'preventivo' ) {
$documento = \Modules\Preventivi\Preventivo :: find ( $id_documento );
2019-10-13 16:42:09 +02:00
$idsede = $documento -> idsede ;
2019-07-23 15:39:00 +02:00
} elseif ( $type == 'contratto' ) {
$documento = \Modules\Contratti\Contratto :: find ( $id_documento );
2019-10-13 16:42:09 +02:00
$idsede = $documento -> idsede ;
2019-02-14 17:49:58 +01:00
}
2018-06-25 11:44:06 +02:00
2019-02-14 17:49:58 +01:00
// Creazione della fattura al volo
if ( post ( 'create_document' ) == 'on' ) {
2019-07-23 15:39:00 +02:00
$descrizione = ( $dir == 'entrata' ) ? 'Fattura immediata di vendita' : 'Fattura immediata di acquisto' ;
2019-02-14 17:49:58 +01:00
$tipo = Tipo :: where ( 'descrizione' , $descrizione ) -> first ();
2019-07-23 15:39:00 +02:00
$fattura = Fattura :: build ( $documento -> anagrafica , $tipo , post ( 'data' ), post ( 'id_segment' ));
$fattura -> idpagamento = $documento -> idpagamento ;
2019-10-13 16:42:09 +02:00
$fattura -> idsede_destinazione = $idsede ;
2019-07-23 15:39:00 +02:00
$fattura -> id_ritenuta_contributi = post ( 'id_ritenuta_contributi' ) ? : null ;
2019-02-14 17:49:58 +01:00
$fattura -> save ();
$id_record = $fattura -> id ;
}
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 ];
$copia = $riga -> copiaIn ( $fattura , $qta );
2019-02-26 20:55:00 +01:00
$copia -> id_conto = $id_conto ;
2019-02-14 17:49:58 +01:00
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 ()) {
2019-07-23 15:39:00 +02:00
if ( $movimenta ) {
$copia -> movimenta ( $copia -> qta );
}
2019-02-14 17:49:58 +01:00
$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
}
}
ricalcola_costiagg_fattura ( $id_record );
2019-07-23 15:39:00 +02:00
$message = '' ;
if ( $type == 'ordine' ) {
$message = tr ( 'Ordine _NUM_ aggiunto!' , [
'_NUM_' => $ordine -> numero ,
]);
} elseif ( $type == 'ddt' ) {
$message = tr ( 'DDT _NUM_ aggiunto!' , [
'_NUM_' => $ordine -> numero ,
]);
} elseif ( $type == 'preventivo' ) {
$message = tr ( 'Preventivo _NUM_ aggiunto!' , [
'_NUM_' => $ordine -> numero ,
]);
} elseif ( $type == 'contratto' ) {
$message = tr ( 'Contratto _NUM_ aggiunto!' , [
'_NUM_' => $ordine -> numero ,
]);
}
flash () -> info ( $message );
2018-06-25 11:44:06 +02:00
break ;
2018-07-03 17:28:02 +02:00
2018-07-05 17:56:38 +02:00
// Nota di credito
case 'nota_credito' :
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
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 credito' ) -> where ( 'dir' , 'entrata' ) -> first ();
2018-07-03 17:28:02 +02:00
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 ;
$nota -> idbanca = $fattura -> idbanca ;
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-04 12:57:53 +02:00
2019-02-12 17:21:27 +01:00
$righe = $fattura -> getRighe ();
foreach ( $righe as $riga ) {
if ( post ( 'evadere' )[ $riga -> id ] == 'on' ) {
$qta = post ( 'qta_da_evadere' )[ $riga -> id ];
2018-07-03 17:28:02 +02:00
2019-02-12 17:21:27 +01:00
$copia = $riga -> copiaIn ( $nota , - $qta );
$copia -> ref_riga_documento = $riga -> id ;
2018-07-03 17:28:02 +02:00
2019-02-12 17:21:27 +01:00
// Aggiornamento seriali dalla riga dell'ordine
if ( $copia -> isArticolo ()) {
$copia -> movimenta ( $copia -> qta );
2018-12-12 18:06:49 +01:00
2019-02-12 17:21:27 +01:00
$serials = is_array ( post ( 'serial' )[ $riga -> id ]) ? post ( 'serial' )[ $riga -> id ] : [];
2018-07-03 17:28:02 +02:00
2019-02-12 17:21:27 +01:00
$copia -> serials = $serials ;
$riga -> removeSerials ( $serials );
2018-07-03 17:28:02 +02:00
}
2019-02-26 21:20:05 +01:00
$copia -> save ();
2019-02-12 17:21:27 +01:00
}
}
2018-07-03 17:28:02 +02:00
2019-02-12 17:21:27 +01:00
$id_record = $nota -> id ;
2019-05-29 19:17:57 +02:00
aggiorna_sedi_movimenti ( 'documenti' , $id_record );
2019-02-12 17:21:27 +01:00
2018-09-28 09:30:46 +02:00
break ;
case 'transform' :
$fattura -> id_segment = post ( 'id_segment' );
2019-07-31 18:28:50 +02:00
$fattura -> data = post ( 'data' );
2018-09-28 09:30:46 +02:00
$fattura -> save ();
2018-07-03 17:28:02 +02:00
break ;
}
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 ;
$nota -> idbanca = $fattura -> idbanca ;
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
}