Intervento
diff --git a/modules/interventi/bulk.php b/modules/interventi/bulk.php
index 5ff9fddc4..b04939bc9 100644
--- a/modules/interventi/bulk.php
+++ b/modules/interventi/bulk.php
@@ -54,170 +54,94 @@ switch (post('op')) {
break;
- case 'creafatturavendita':
-
- $rs_idanagrafica = $dbo->fetchArray('SELECT idanagrafica FROM in_interventi WHERE id='.prepare($id_records[0]));
-
- $idanagrafica = $rs_idanagrafica[0]['idanagrafica'];
- $data = date('Y-m-d');
- $dir = 'entrata';
- $idtipodocumento = '2';
- $accodare = post('accodare');
-
- if (empty($_SESSION['module_'.Modules::get('Fatture di vendita')['id']]['id_segment'])) {
- $rs = $dbo->fetchArray('SELECT id FROM zz_segments WHERE predefined = 1 AND id_module = '.prepare(Modules::get('Fatture di vendita')['id']).'LIMIT 0,1');
- $_SESSION['module_'.Modules::get('Fatture di vendita')['id']]['id_segment'] = $rs[0]['id'];
- }
-
- $id_segment = $_SESSION['module_'.Modules::get('Fatture di vendita')['id']]['id_segment'];
-
- $numero = get_new_numerofattura($data);
-
- $numero_esterno = get_new_numerosecondariofattura($data);
- $idconto = setting('Conto predefinito fatture di vendita');
-
- $campo = ($dir == 'entrata') ? 'idpagamento_vendite' : 'idpagamento_acquisti';
-
- // Tipo di pagamento predefinito dall'anagrafica
- $query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT '.$campo.' AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')';
- $rs = $dbo->fetchArray($query);
- $idpagamento = $rs[0]['id'];
-
- // Se la fattura è di vendita e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni
- if ($dir == 'entrata' && $idpagamento == '') {
- $idpagamento = setting('Tipo di pagamento predefinito');
- }
-
+ case 'crea_fattura':
+ $id_documento_cliente = [];
$n_interventi = 0;
- //inserisco righe
- for ($i = 0; $i < sizeof($id_records); ++$i) {
- $idintervento = $id_records[$i];
+ $data = date('Y-m-d');
+ $dir = 'entrata';
+ $tipo_documento = $dbo->selectOne('co_tipidocumento', 'id', ['descrizione' => 'Fattura immediata di vendita'])['id'];
- $q = 'SELECT id, in_interventi.descrizione, in_interventi.codice,
- IFNULL( (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), data_richiesta) AS data,
- (SELECT costo_orario FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS costo_ore_unitario,
- (SELECT costo_km FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS costo_km_unitario,
- (SELECT SUM(prezzo_dirittochiamata) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS dirittochiamata,
- (SELECT SUM(km) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS km,
- (SELECT SUM(TIME_TO_SEC(TIMEDIFF(orario_fine, orario_inizio))) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS t1,
- (SELECT SUM(prezzo_ore_consuntivo) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_ore_consuntivo`,
- (SELECT SUM(prezzo_km_consuntivo) FROM in_interventi_tecnici GROUP BY idintervento HAVING idintervento=in_interventi.id) AS `tot_km_consuntivo`
- FROM in_interventi WHERE id="'.$idintervento.'" AND idanagrafica="'.$idanagrafica."\" AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento != 'NULL') ";
+ $id_iva = setting('Iva predefinita');
+ $id_conto = setting('Conto predefinito fatture di vendita');
- $rs = $dbo->fetchArray($q);
+ $accodare = post('accodare');
- if (count($rs) > 0) {
- //al primo ciclo preparo la fattura
- if ($n_interventi == 0) {
- //verifico se ho già fatture nello stato bozza per questo cliente
- $iddocumento = $dbo->fetchArray('SELECT co_documenti.id AS iddocumento FROM co_documenti INNER JOIN co_statidocumento ON co_documenti.idstatodocumento = co_statidocumento.id WHERE co_statidocumento.descrizione = \'Bozza\' AND idanagrafica = '.prepare($idanagrafica))[0]['iddocumento'];
+ $module_name = 'Fatture di vendita';
- //preparo fattura
- if (empty($iddocumento) or empty($accodare)) {
- $dbo->query('INSERT INTO co_documenti (numero, numero_esterno, idanagrafica, idconto, idtipodocumento, idpagamento, data, idstatodocumento, idsede, id_segment) VALUES ('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idconto).', '.prepare($idtipodocumento).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`='Bozza'), (SELECT idsede_fatturazione FROM an_anagrafiche WHERE idanagrafica=".prepare($idanagrafica).'), '.prepare($id_segment).')');
- $iddocumento = $dbo->lastInsertedID();
- } else {
- $numero_esterno = $dbo->fetchArray('SELECT numero_esterno FROM co_documenti WHERE id = '.prepare($iddocumento))[0]['numero_esterno'];
- }
+ // Segmenti
+ $id_fatture = Modules::get($module_name)['id'];
+ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) {
+ $segments = Modules::getSegments($id_fatture);
+ $_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null;
+ }
+ $id_segment = $_SESSION['module_'.$id_fatture]['id_segment'];
+
+ $interventi = $dbo->fetchArray('SELECT *, IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento = in_interventi.id), in_interventi.data_richiesta) AS data, in_statiintervento.descrizione AS stato FROM in_interventi INNER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento WHERE in_statiintervento.completato=1 AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND in_interventi.id NOT IN (SELECT idintervento FROM co_contratti_promemoria WHERE idintervento IS NOT NULL) AND in_interventi.id IN ('.implode(',', $id_records).')');
+
+ // Lettura righe selezionate
+ foreach ($interventi as $intervento) {
+ $id_anagrafica = $intervento['idanagrafica'];
+
+ $id_documento = $id_documento_cliente[$id_anagrafica];
+
+ // Se non c'è già una fattura appena creata per questo cliente, creo una fattura nuova
+ if (empty($id_documento)) {
+ if (!empty($accodare)) {
+ $documento = $dbo->fetchOne('SELECT co_documenti.id FROM co_documenti INNER JOIN co_statidocumento ON co_documenti.idstatodocumento = co_statidocumento.id WHERE co_statidocumento.descrizione = \'Bozza\' AND idanagrafica = '.prepare($id_anagrafica));
+
+ $id_documento = $documento['id'];
+ $id_documento_cliente[$id_anagrafica] = $id_documento;
}
- ++$n_interventi;
+ if (empty($id_documento)) {
+ $numero = get_new_numerofattura($data);
+ $numero_esterno = get_new_numerosecondariofattura($data);
- $subtot_consuntivo = $rs[0]['tot_ore_consuntivo'] + $rs[0]['tot_km_consuntivo'];
+ $campo = ($dir == 'entrata') ? 'idpagamento_vendite' : 'idpagamento_acquisti';
- //Calcolo sconto se è stato arrotondato il prezzo
- $subtot = $subtot_consuntivo;
- $sconto = 0;
+ // Tipo di pagamento predefinito dall'anagrafica
+ $query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT '.$campo.' AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($id_anagrafica).')';
+ $rs = $dbo->fetchArray($query);
+ $idpagamento = $rs[0]['id'];
- //Aggiungo un'eventuale sconto in base al listino del cliente
- if ($prc_sconto < 0) {
- $sconto += $subtot / 100 * abs($prc_sconto);
- }
-
- $descrizione = 'Intervento numero '.$rs[0]['codice'].' del '.date('d/m/Y', strtotime($rs[0]['data']))."\n".html_entity_decode($rs[0]['descrizione']);
-
- //Aggiunta impianti
- $rsi = $dbo->fetchArray('SELECT * FROM my_impianti_interventi INNER JOIN my_impianti ON my_impianti.id=my_impianti_interventi.idimpianto WHERE idintervento="'.$rs[0]['id'].'"');
- if (sizeof($rsi) > 0) {
- $descrizione .= "\nIMPIANTI:\n";
-
- for ($b = 0; $b < sizeof($rsi); ++$b) {
- $descrizione .= $rsi[$b]['matricola'].' - '.str_replace('"', '"', $rsi[$b]['nome'])."\n";
- }
- }
- //Aggiunta articoli utilizzati
- $rsa = $dbo->fetchArray('SELECT mg_articoli.descrizione, mg_articoli.codice, mg_articoli.prezzo_vendita, mg_articoli_interventi.qta, mg_articoli_interventi.sconto FROM mg_articoli_interventi INNER JOIN mg_articoli ON mg_articoli_interventi.idarticolo=mg_articoli.id WHERE idintervento="'.$rs[0]['id'].'"');
-
- if (sizeof($rsa) > 0) {
- $descrizione .= "\nARTICOLI UTILIZZATI:\n";
-
- for ($a = 0; $a < sizeof($rsa); ++$a) {
- $descrizione .= $rsa[$a]['codice'].' - '.$rsa[$a]['descrizione'].' (x'.number_format($rsa[$a]['qta'], 2, ',', '.').")\n";
- $subtot += $rsa[$a]['prezzo_vendita'];
- $sconto += $rsa[$a]['sconto'] * $rsa[$a]['qta'];
- }
- }
-
- //Aggiunta spese aggiuntive
- $rsa = $dbo->fetchArray('SELECT descrizione, qta, prezzo_vendita FROM in_righe_interventi WHERE idintervento="'.$rs[0]['id'].'"');
-
- if (sizeof($rsa) > 0) {
- $descrizione .= "\nALTRI COSTI:\n";
-
- for ($a = 0; $a < sizeof($rsa); ++$a) {
- $descrizione .= $rsa[$a]['descrizione'].' (x'.number_format($rsa[$a]['qta'], 2, ',', '.').")\n";
- $subtot += $rsa[$a]['prezzo'] * $rsa[$a]['qta'];
- $sconto += $rsa[$a]['sconto'];
- }
- }
-
- //Leggo l'anagrafica del cliente
- $rs = $dbo->fetchArray("SELECT idanagrafica, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento='".$rs[0]['id']."') AS data FROM `in_interventi` WHERE id='".$rs[0]['id']."'");
- $idanagrafica = $rs[0]['idanagrafica'];
- $data = $rs[0]['data'];
-
- //Calcolo iva
- $idiva = setting('Iva predefinita');
- $query = "SELECT * FROM co_iva WHERE id='".$idiva."'";
- $rs = $dbo->fetchArray($query);
-
- $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
- $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
- $desc_iva = $rs[0]['descrizione'];
-
- //Calcolo rivalsa inps
- $query = "SELECT * FROM co_rivalsainps WHERE id='".setting('Percentuale rivalsa INPS')."'";
- $rs = $dbo->fetchArray($query);
- $rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
-
- //Calcolo ritenuta d'acconto
- $query = "SELECT * FROM co_ritenutaacconto WHERE id='".setting("Percentuale ritenuta d'acconto")."'";
- $rs = $dbo->fetchArray($query);
- $ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale'];
-
- //Aggiunta riga intervento sul documento
- $query1 = "INSERT INTO co_righe_documenti( iddocumento, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto ) VALUES( \"$iddocumento\", \"$idintervento\", \"".$idiva."\", \"$desc_iva\", \"$iva\", \"$iva_indetraibile\", \"$descrizione\", \"$subtot\", \"".$sconto.'", "ore", "1", "'.setting('Percentuale rivalsa INPS').'", "'.$rivalsainps.'", "'.setting("Percentuale ritenuta d'acconto").'", "'.$ritenutaacconto.'" )';
- if ($dbo->query($query1)) {
- //Ricalcolo inps, ritenuta e bollo
- if ($dir == 'entrata') {
- ricalcola_costiagg_fattura($iddocumento);
- } else {
- ricalcola_costiagg_fattura($iddocumento, 0, 0, 0);
+ // Se alla non è stato associato un pagamento predefinito al cliente, leggo il pagamento dalle impostazioni
+ if (empty($idpagamento)) {
+ $idpagamento = setting('Tipo di pagamento predefinito');
}
- //Metto l'intervento in stato "Fatturato"
- $dbo->query("UPDATE in_interventi SET idstatointervento='FAT' WHERE id='$idintervento'");
+ // Creazione nuova fattura
+ $dbo->insert('co_documenti', [
+ 'numero' => $numero,
+ 'numero_esterno' => $numero_esterno,
+ 'idanagrafica' => $id_anagrafica,
+ 'idconto' => $id_conto,
+ 'idtipodocumento' => $tipo_documento,
+ 'idpagamento' => $idpagamento,
+ 'data' => $data,
+ 'id_segment' => $id_segment,
+ '#idstatodocumento' => "(SELECT `id` FROM `co_statidocumento` WHERE `descrizione`='Bozza')",
+ '#idsede' => 'IFNULL((SELECT idsede_fatturazione FROM an_anagrafiche WHERE idanagrafica='.prepare($id_anagrafica).'), 0)',
+ ]);
+
+ $id_documento = $dbo->lastInsertedID();
+ $id_documento_cliente[$id_anagrafica] = $id_documento;
+ ++$totale_n_ddt;
}
}
+
+ $descrizione = tr('Intervento numero _NUM_ del _DATE_ [_STATE_]', [
+ '_NUM_' => $intervento['codice'],
+ '_DATE_' => Translator::dateToLocale($intervento['data']),
+ '_STATE_' => $intervento['stato'],
+ ]);
+
+ aggiungi_intervento_in_fattura($intervento['id'], $id_documento, $descrizione, $id_iva, $id_conto);
+ $n_interventi++;
}
if ($n_interventi > 0) {
- flash()->info(tr('Fattura _NUM_ creata!', [
- '_NUM_' => $numero_esterno,
- ]));
-
- flash()->info(tr('_NUM_ interventi fatturati!', [
+ flash()->info(tr('_NUM_ interventi fatturati.', [
'_NUM_' => $n_interventi,
]));
} else {
@@ -239,7 +163,7 @@ return [
],
],
- 'creafatturavendita' => [
+ 'crea_fattura' => [
'text' => tr('Crea fattura'),
'data' => [
'title' => tr('Vuoi davvero generare le fatture per questi interventi?'),
diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php
index 3d2c93d35..2004cb936 100644
--- a/modules/interventi/modutil.php
+++ b/modules/interventi/modutil.php
@@ -340,3 +340,216 @@ function calcola_ore_intervento($orario_inizio, $orario_fine)
return $ore;
}
+
+function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto)
+{
+ $dbo = Database::getConnection();
+
+ // Leggo l'anagrafica del cliente
+ $rs = $dbo->fetchArray('SELECT idanagrafica, codice, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento).') AS data FROM `in_interventi` WHERE id='.prepare($id_intervento));
+ $idanagrafica = $rs[0]['idanagrafica'];
+ $data = $rs[0]['data'];
+ $codice = $rs[0]['codice'];
+
+ // Fatturo le ore di lavoro raggruppate per costo orario
+ $rst = $dbo->fetchArray('SELECT SUM( ROUND( TIMESTAMPDIFF( MINUTE, orario_inizio, orario_fine ) / 60, '.setting('Cifre decimali per quantità').' ) ) AS tot_ore, SUM(prezzo_ore_consuntivo) AS tot_prezzo_ore_consuntivo, SUM(sconto) AS tot_sconto, prezzo_ore_unitario FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento).' GROUP BY prezzo_ore_unitario');
+
+ // Aggiunta riga intervento sul documento
+ if (sizeof($rst) == 0) {
+ $_SESSION['warnings'][] = tr('L\'intervento _NUM_ non ha sessioni di lavoro!', [
+ '_NUM_' => $id_intervento,
+ ]);
+ } else {
+ for ($i = 0; $i < sizeof($rst); ++$i) {
+ $ore = $rst[$i]['tot_ore'];
+
+ // Calcolo iva
+ $query = 'SELECT * FROM co_iva WHERE id='.prepare($id_iva);
+ $rs = $dbo->fetchArray($query);
+
+ $sconto = $rst[$i]['tot_sconto'];
+ $subtot = $rst[$i]['tot_prezzo_ore_consuntivo'];
+ $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
+ $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
+ $desc_iva = $rs[0]['descrizione'];
+
+ // Calcolo rivalsa inps
+ $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(setting('Percentuale rivalsa INPS'));
+ $rs = $dbo->fetchArray($query);
+ $rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
+
+ // Calcolo ritenuta d'acconto
+ $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(setting("Percentuale ritenuta d'acconto"));
+ $rs = $dbo->fetchArray($query);
+ if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ $ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
+ } else {
+ $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
+ }
+
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare(setting('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $dbo->query($query);
+ }
+ }
+
+ $costi_intervento = get_costi_intervento($id_intervento);
+
+ // Fatturo i diritti di chiamata raggruppati per costo
+ $rst = $dbo->fetchArray('SELECT COUNT(id) AS qta, SUM(prezzo_dirittochiamata) AS tot_prezzo_dirittochiamata FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento).' AND prezzo_dirittochiamata > 0 GROUP BY prezzo_dirittochiamata');
+
+ // Aggiunta diritto di chiamata se esiste
+ for ($i = 0; $i < sizeof($rst); ++$i) {
+ // Calcolo iva
+ $query = 'SELECT * FROM co_iva WHERE id='.prepare($id_iva);
+ $rs = $dbo->fetchArray($query);
+
+ $iva = $rst[$i]['tot_prezzo_dirittochiamata'] / 100 * $rs[0]['percentuale'];
+ $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
+ $desc_iva = $rs[0]['descrizione'];
+
+ // Calcolo rivalsa inps
+ $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(setting('Percentuale rivalsa INPS'));
+ $rs = $dbo->fetchArray($query);
+ $rivalsainps = $rst[$i]['tot_prezzo_dirittochiamata'] / 100 * $rs[0]['percentuale'];
+
+ // Calcolo ritenuta d'acconto
+ $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(setting("Percentuale ritenuta d'acconto"));
+ $rs = $dbo->fetchArray($query);
+ $ritenutaacconto = $rst[$i]['tot_prezzo_dirittochiamata'] / 100 * $rs[0]['percentuale'];
+
+ $dbo->insert('co_righe_documenti', [
+ 'iddocumento' => $id_fattura,
+ 'idintervento' => $id_intervento,
+ 'idconto' => $id_conto,
+ 'idiva' => $id_iva,
+ 'desc_iva' => $desc_iva,
+ 'iva' => $iva,
+ 'iva_indetraibile' => $iva_indetraibile,
+ 'descrizione' => 'Diritto di chiamata',
+ 'subtotale' => $rst[$i]['tot_prezzo_dirittochiamata'],
+ 'sconto' => 0,
+ 'sconto_unitario' => 0,
+ 'tipo_sconto' => 'UNT',
+ 'um' => '-',
+ 'qta' => $rst[$i]['qta'],
+ 'idrivalsainps' => setting('Percentuale rivalsa INPS'),
+ 'rivalsainps' => $rivalsainps,
+ 'idritenutaacconto' => setting("Percentuale ritenuta d'acconto"),
+ 'ritenutaacconto' => $ritenutaacconto,
+ '#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).')',
+ ]);
+ }
+
+ // Collego in fattura eventuali articoli collegati all'intervento
+ $rs2 = $dbo->fetchArray('SELECT mg_articoli_interventi.*, idarticolo FROM mg_articoli_interventi INNER JOIN mg_articoli ON mg_articoli_interventi.idarticolo=mg_articoli.id WHERE idintervento='.prepare($id_intervento).' AND (idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_fattura).')) AND idintervento NOT IN(SELECT idintervento FROM co_contratti_promemoria WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_fattura).')) )');
+ for ($i = 0; $i < sizeof($rs2); ++$i) {
+ $riga = add_articolo_infattura($id_fattura, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $rs2[$i]['idiva'], $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $id_intervento, 0, $rs2[$i]['um']);
+
+ // Lettura lotto, serial, altro dalla riga dell'ordine
+ $dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($rs2[$i]['idarticolo']).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_intervento='.prepare($rs2[$i]['id']));
+ }
+
+ // Aggiunta spese aggiuntive come righe generiche
+ $query = 'SELECT * FROM in_righe_interventi WHERE idintervento='.prepare($id_intervento).' AND (idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_fattura).')) AND idintervento NOT IN(SELECT idintervento FROM co_contratti_promemoria WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_fattura).')) )';
+ $rsr = $dbo->fetchArray($query);
+ if (sizeof($rsr) > 0) {
+ for ($i = 0; $i < sizeof($rsr); ++$i) {
+ // Calcolo iva
+ $query = 'SELECT * FROM co_iva WHERE id='.prepare($rsr[$i]['idiva']);
+ $rs = $dbo->fetchArray($query);
+ $desc_iva = $rs[0]['descrizione'];
+
+ $subtot = $rsr[$i]['prezzo_vendita'] * $rsr[$i]['qta'];
+ $sconto = $rsr[$i]['sconto'];
+ $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
+ $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
+
+ // Calcolo rivalsa inps
+ $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(setting('Percentuale rivalsa INPS'));
+ $rs = $dbo->fetchArray($query);
+ $rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
+
+ // Calcolo ritenuta d'acconto
+ $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(setting("Percentuale ritenuta d'acconto"));
+ $rs = $dbo->fetchArray($query);
+ if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ $ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
+ } else {
+ $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
+ }
+
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare(setting('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $dbo->query($query);
+ }
+ }
+
+ // Aggiunta km come "Trasferta" (se c'è)
+ if ($costi_intervento['viaggio_addebito'] > 0) {
+ // Calcolo iva
+ $query = 'SELECT * FROM co_iva WHERE id='.prepare($id_iva);
+ $dati = $dbo->fetchArray($query);
+ $desc_iva = $dati[0]['descrizione'];
+
+ $subtot = $costi_intervento['viaggio_addebito'];
+ $sconto = $costi_intervento['viaggio_addebito'] - $costi_intervento['viaggio_scontato'];
+ $iva = ($subtot - $sconto) / 100 * $dati[0]['percentuale'];
+ $iva_indetraibile = $iva / 100 * $dati[0]['indetraibile'];
+
+ // Calcolo rivalsa inps
+ $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(setting('Percentuale rivalsa INPS'));
+ $dati = $dbo->fetchArray($query);
+ $rivalsainps = ($subtot - $sconto) / 100 * $dati[0]['percentuale'];
+
+ // Calcolo ritenuta d'acconto
+ $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(setting("Percentuale ritenuta d'acconto"));
+ $dati = $dbo->fetchArray($query);
+ if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ $ritenutaacconto = ($subtot - $sconto) / 100 * $dati[0]['percentuale'];
+ } else {
+ $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $dati[0]['percentuale'];
+ }
+
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare(setting('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $dbo->query($query);
+ }
+
+ // Aggiunta sconto
+ if (!empty($costi_intervento['sconto_globale'])) {
+ $subtot = -$costi_intervento['sconto_globale'];
+
+ // Calcolo iva
+ $query = 'SELECT * FROM co_iva WHERE id='.prepare($id_iva);
+ $rs = $dbo->fetchArray($query);
+ $desc_iva = $rs[0]['descrizione'];
+
+ $iva = ($subtot) / 100 * $rs[0]['percentuale'];
+ $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
+
+ // Calcolo rivalsa inps
+ $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(setting('Percentuale rivalsa INPS'));
+ $rs = $dbo->fetchArray($query);
+ $rivalsainps = ($subtot) / 100 * $rs[0]['percentuale'];
+
+ // Calcolo ritenuta d'acconto
+ $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(setting("Percentuale ritenuta d'acconto"));
+ $rs = $dbo->fetchArray($query);
+ if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ $ritenutaacconto = $subtot / 100 * $rs[0]['percentuale'];
+ } else {
+ $ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale'];
+ }
+
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare(setting('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $dbo->query($query);
+ }
+
+ // Ricalcolo inps, ritenuta e bollo
+ if ($dir == 'entrata') {
+ ricalcola_costiagg_fattura($id_fattura);
+ } else {
+ ricalcola_costiagg_fattura($id_fattura);
+ }
+
+ // Metto l'intervento in stato "Fatturato"
+ $dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Fatturato') WHERE id=".prepare($id_intervento));
+}
diff --git a/src/Backup.php b/src/Backup.php
index 58937db1c..ab4ddcae4 100644
--- a/src/Backup.php
+++ b/src/Backup.php
@@ -170,7 +170,7 @@ class Backup
$files = Symfony\Component\Finder\Finder::create()
->files()
->exclude($ignores['dirs'])
- ->ignoreDotFiles(true)
+ ->ignoreDotFiles(false)
->ignoreVCS(true)
->in(DOCROOT)
->in(self::getDatabaseDirectory());
diff --git a/templates/fatture/footer.php b/templates/fatture/footer.php
index 9700ba1d8..0f205cdf9 100644
--- a/templates/fatture/footer.php
+++ b/templates/fatture/footer.php
@@ -380,6 +380,26 @@ echo '
$dicitura_fissa_fattura$
-
+';
-$default_footer$';
+
+
+
+if ($options['hide_footer']) {
+
+ echo '
+
';
+
+}
+else{
+ echo '$default_footer$';
+}
\ No newline at end of file
diff --git a/templates/fatture/header.php b/templates/fatture/header.php
index 06cb5b34e..4f94a1795 100644
--- a/templates/fatture/header.php
+++ b/templates/fatture/header.php
@@ -1,10 +1,22 @@
+
';
+}else{
+ echo '
+
+ $default_header$';
+}
+
echo '
-
-$default_header$
-
diff --git a/update/2_4_1.sql b/update/2_4_1.sql
index 1c45a40ce..1384b1e35 100644
--- a/update/2_4_1.sql
+++ b/update/2_4_1.sql
@@ -487,3 +487,9 @@ UPDATE `zz_views` SET `query` = '\'Intervento\'' WHERE `id_module` = (SELECT `id
-- Flag per definire i segmenti di note di accredito e di addebito
ALTER TABLE `zz_segments` ADD `predefined_accredito` TINYINT(1) NOT NULL AFTER `predefined`, ADD `predefined_addebito` TINYINT(1) NOT NULL AFTER `predefined_accredito`;
+
+-- Fattura di vendita senza intestazione (per carta intestata)
+INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `main`, `default`, `enabled`) VALUES
+(NULL, (SELECT id FROM zz_modules WHERE name='Fatture di vendita'), 1, 'Fattura di vendita (senza intestazione)', 'Fattura di vendita (senza intestazione)', 'fatture', 'iddocumento', '{"hide_header":true, "hide_footer":true}', 'fa fa-print', '', '', 0, 0, 1, 1);
+UPDATE `zz_prints` SET `main` = '1' WHERE `name` = 'Fattura di vendita';
+