Miglioramento fatturazione bulk interventi

This commit is contained in:
Thomas Zilio 2018-08-31 12:33:48 +02:00
parent 629c5a0ec4
commit ffd1c3f576
3 changed files with 345 additions and 415 deletions

View File

@ -69,12 +69,11 @@ switch (post('op')) {
case 'update': case 'update':
if (isset($post['id_record'])) { if (isset($post['id_record'])) {
include_once Modules::filepath($module['name'], 'modutil.php');
include_once Modules::filepath($module['name'], 'modutil.php');
$idstatodocumento = post('idstatodocumento'); $idstatodocumento = post('idstatodocumento');
$idpagamento = post('idpagamento'); $idpagamento = post('idpagamento');
$totale_imponibile = get_imponibile_fattura($id_record); $totale_imponibile = get_imponibile_fattura($id_record);
$totale_fattura = get_totale_fattura($id_record); $totale_fattura = get_totale_fattura($id_record);
@ -151,21 +150,20 @@ switch (post('op')) {
} }
// Elimino la scadenza e tutti i movimenti, poi se la fattura è emessa le ricalcolo // Elimino la scadenza e tutti i movimenti, poi se la fattura è emessa le ricalcolo
if ($rs[0]['descrizione'] == 'Bozza' or $rs[0]['descrizione'] == 'Annullata' ) { if ($rs[0]['descrizione'] == 'Bozza' or $rs[0]['descrizione'] == 'Annullata') {
elimina_scadenza($id_record); elimina_scadenza($id_record);
elimina_movimento($id_record, 0); elimina_movimento($id_record, 0);
//elimino movimento anche prima nota (se pagata o parzialmente pagata) // elimino movimento anche prima nota (se pagata o parzialmente pagata)
elimina_movimento($id_record, 1); elimina_movimento($id_record, 1);
} elseif ($rs[0]['descrizione'] == 'Emessa') { } elseif ($rs[0]['descrizione'] == 'Emessa') {
elimina_scadenza($id_record); elimina_scadenza($id_record);
elimina_movimento($id_record, 0); elimina_movimento($id_record, 0);
} elseif ( ($rs[0]['descrizione'] == 'Pagato' or $rs[0]['descrizione'] == 'Parzialmente pagato') and ($dbo->fetchNum("SELECT id FROM co_scadenziario WHERE iddocumento = ".prepare($id_record)) == 0)) { } elseif (($rs[0]['descrizione'] == 'Pagato' or $rs[0]['descrizione'] == 'Parzialmente pagato') and ($dbo->fetchNum("SELECT id FROM co_scadenziario WHERE iddocumento = ".prepare($id_record)) == 0)) {
//aggiungo la scadenza come già pagata // aggiungo la scadenza come già pagata
aggiungi_scadenza($id_record, $pagamento, 1); aggiungi_scadenza($id_record, $pagamento, 1);
aggiungi_movimento($id_record, $dir); aggiungi_movimento($id_record, $dir);
}
}
// Se la fattura è in stato "Emessa" posso inserirla in scadenzario e aprire il mastrino cliente // Se la fattura è in stato "Emessa" posso inserirla in scadenzario e aprire il mastrino cliente
if ($rs[0]['descrizione'] == 'Emessa') { if ($rs[0]['descrizione'] == 'Emessa') {
@ -288,223 +286,11 @@ switch (post('op')) {
$idiva = post('idiva'); $idiva = post('idiva');
$idconto = post('idconto'); $idconto = post('idconto');
// Leggo l'anagrafica del cliente aggiungi_intervento_in_fattura($idintervento, $id_record, $descrizione, $idiva, $idconto);
$rs = $dbo->fetchArray('SELECT idanagrafica, codice, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento='.prepare($idintervento).') AS data FROM `in_interventi` WHERE id='.prepare($idintervento));
$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, '.get_var('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($idintervento).' 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_' => $idintervento,
]);
} else {
for ($i = 0; $i < sizeof($rst); ++$i) {
$ore = $rst[$i]['tot_ore'];
// Calcolo iva
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
$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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
if (get_var("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_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}
}
$costi_intervento = get_costi_intervento($idintervento);
//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($idintervento).' 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($idiva);
$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(get_var('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(get_var("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_record,
'idintervento' => $idintervento,
'idconto' => $idconto,
'idiva' => $idiva,
'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' => get_var('Percentuale rivalsa INPS'),
'rivalsainps' => $rivalsainps,
'idritenutaacconto' => get_var("Percentuale ritenuta d'acconto"),
'ritenutaacconto' => $ritenutaacconto,
'#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).')',
]);
}
// 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($idintervento).' AND (idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_contratti_promemoria WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )');
for ($i = 0; $i < sizeof($rs2); ++$i) {
$riga = add_articolo_infattura($id_record, $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'], $idintervento, 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($idintervento).' AND (idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_contratti_promemoria WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )';
$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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
if (get_var("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_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.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(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$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($idiva);
$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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$dati = $dbo->fetchArray($query);
if (get_var("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_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.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(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$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($idiva);
$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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
if (get_var("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_record).', NULL, '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record);
}
// Metto l'intervento in stato "Fatturato"
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Fatturato') WHERE id=".prepare($idintervento));
$_SESSION['infos'][] = tr('Intervento _NUM_ aggiunto!', [ $_SESSION['infos'][] = tr('Intervento _NUM_ aggiunto!', [
'_NUM_' => $idintervento, '_NUM_' => $idintervento,
]); ]);
/*
else {
$_SESSION['errors'][] = tr("Errore durante l'inserimento dell'intervento _NUM_ in fattura!", [
'_NUM_' => $idintervento,
]);
}*/
} }
break; break;
@ -562,7 +348,7 @@ switch (post('op')) {
$sconto = $riga['sconto']; $sconto = $riga['sconto'];
//Ricalcolo ritenuta per ogni singola riga // Ricalcolo ritenuta per ogni singola riga
if (get_var("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') { if (get_var("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
$ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; $ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
} else { } else {
@ -602,14 +388,14 @@ switch (post('op')) {
// Aggiunta riga preventivo sul documento // Aggiunta riga preventivo sul documento
$query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, is_preventivo, idconto, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, `order`) VALUES('.prepare($id_record).', '.prepare($idpreventivo).', "1", '.prepare($idconto).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; $query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, is_preventivo, idconto, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, `order`) VALUES('.prepare($id_record).', '.prepare($idpreventivo).', "1", '.prepare($idconto).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query); $dbo->query($query);
// Scarico gli articoli nel preventivo // Scarico gli articoli nel preventivo
$righe = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE idpreventivo='.prepare($idpreventivo)); $righe = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE idpreventivo='.prepare($idpreventivo));
foreach ($righe as $key => $riga) { foreach ($righe as $key => $riga) {
if (!empty($riga['idarticolo'])) { if (!empty($riga['idarticolo'])) {
add_movimento_magazzino($riga['idarticolo'], -$riga['qta'], ['iddocumento' => $id_record]); add_movimento_magazzino($riga['idarticolo'], -$riga['qta'], ['iddocumento' => $id_record]);
} }
} }
} }
// Aggiorno lo stato degli interventi collegati al preventivo se ce ne sono // Aggiorno lo stato degli interventi collegati al preventivo se ce ne sono
@ -691,8 +477,8 @@ switch (post('op')) {
$_SESSION['infos'][] = tr('Contratto _NUM_ aggiunto!', [ $_SESSION['infos'][] = tr('Contratto _NUM_ aggiunto!', [
'_NUM_' => $numero, '_NUM_' => $numero,
]); ]);
//Scalo le qta degli articoli nel contratto // Scalo le qta degli articoli nel contratto
$righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto)); $righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto));
foreach ($righe as $key => $riga) { foreach ($righe as $key => $riga) {
if (!empty($riga['idarticolo'])) { if (!empty($riga['idarticolo'])) {
@ -725,9 +511,9 @@ switch (post('op')) {
$idiva = post('idiva'); $idiva = post('idiva');
$idconto = post('idconto'); $idconto = post('idconto');
$idum = post('um'); $idum = post('um');
$idrivalsainps = post('idrivalsainps'); $idrivalsainps = post('idrivalsainps');
$idritenutaacconto = post('idritenutaacconto'); $idritenutaacconto = post('idritenutaacconto');
$calcolo_ritenutaacconto = post('calcolo_ritenutaacconto'); $calcolo_ritenutaacconto = post('calcolo_ritenutaacconto');
$qta = $post['qta']; $qta = $post['qta'];
if (!empty($records[0]['is_reversed'])) { if (!empty($records[0]['is_reversed'])) {
@ -741,10 +527,10 @@ switch (post('op')) {
$tipo_sconto = $post['tipo_sconto']; $tipo_sconto = $post['tipo_sconto'];
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario; $sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta; $sconto = $sconto * $qta;
add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $idconto, $idum, $idrivalsainps, $idritenutaacconto, $calcolo_ritenutaacconto); add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $idconto, $idum, $idrivalsainps, $idritenutaacconto, $calcolo_ritenutaacconto);
ricalcola_costiagg_fattura($id_record); ricalcola_costiagg_fattura($id_record);
$_SESSION['infos'][] = tr('Articolo aggiunto!'); $_SESSION['infos'][] = tr('Articolo aggiunto!');
} }
@ -989,7 +775,9 @@ switch (post('op')) {
// Aggiornamento seriali dalla riga dell'ordine // Aggiornamento seriali dalla riga dell'ordine
$serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : []; $serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : [];
$serials = array_filter($serials, function ($value) { return !empty($value); }); $serials = array_filter($serials, function ($value) {
return !empty($value);
});
$dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]); $dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
} }
@ -1070,7 +858,9 @@ switch (post('op')) {
// Aggiornamento seriali dalla riga dell'ordine // Aggiornamento seriali dalla riga dell'ordine
$serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : []; $serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : [];
$serials = array_filter($serials, function ($value) { return !empty($value); }); $serials = array_filter($serials, function ($value) {
return !empty($value);
});
$dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]); $dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
@ -1102,7 +892,7 @@ switch (post('op')) {
$numero_esterno = get_new_numerosecondariofattura($data); $numero_esterno = get_new_numerosecondariofattura($data);
$tipo_documento = 'Fattura immediata di vendita'; $tipo_documento = 'Fattura immediata di vendita';
//Info contratto // Info contratto
$rs_contratto = $dbo->fetchArray('SELECT * FROM co_contratti WHERE id='.prepare($idcontratto)); $rs_contratto = $dbo->fetchArray('SELECT * FROM co_contratti WHERE id='.prepare($idcontratto));
$idanagrafica = $rs_contratto[0]['idanagrafica']; $idanagrafica = $rs_contratto[0]['idanagrafica'];
$idpagamento = $rs_contratto[0]['idpagamento']; $idpagamento = $rs_contratto[0]['idpagamento'];
@ -1114,7 +904,7 @@ switch (post('op')) {
$dbo->query('INSERT INTO co_documenti(numero, numero_esterno, data, idanagrafica, idtipodocumento, idstatodocumento, idpagamento, idconto, id_segment) VALUES('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($data).', '.prepare($idanagrafica).', (SELECT id FROM co_tipidocumento WHERE descrizione='.prepare($tipo_documento)."), (SELECT id FROM co_statidocumento WHERE descrizione='Bozza'), ".prepare($idpagamento).', '.prepare($idconto).','.prepare($id_segment).')'); $dbo->query('INSERT INTO co_documenti(numero, numero_esterno, data, idanagrafica, idtipodocumento, idstatodocumento, idpagamento, idconto, id_segment) VALUES('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($data).', '.prepare($idanagrafica).', (SELECT id FROM co_tipidocumento WHERE descrizione='.prepare($tipo_documento)."), (SELECT id FROM co_statidocumento WHERE descrizione='Bozza'), ".prepare($idpagamento).', '.prepare($idconto).','.prepare($id_segment).')');
$id_record = $dbo->lastInsertedID(); $id_record = $dbo->lastInsertedID();
//Righe contratto // Righe contratto
$rs_righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto)); $rs_righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto));
for ($i = 0; $i < sizeof($rs_righe); ++$i) { for ($i = 0; $i < sizeof($rs_righe); ++$i) {
@ -1211,11 +1001,11 @@ switch (post('op')) {
} }
// Lettura interventi collegati // Lettura interventi collegati
//$query = 'SELECT id, idintervento FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idintervento IS NOT NULL'; // $query = 'SELECT id, idintervento FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idintervento IS NOT NULL';
//$rs = $dbo->fetchArray($query); // $rs = $dbo->fetchArray($query);
// Se ci sono degli interventi collegati li rimetto nello stato "Completato" // Se ci sono degli interventi collegati li rimetto nello stato "Completato"
//for ($i = 0; $i < sizeof($rs); ++$i) { // for ($i = 0; $i < sizeof($rs); ++$i) {
$dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id=".prepare($idintervento)); $dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id=".prepare($idintervento));
// Rimuovo dalla fattura gli articoli collegati all'intervento // Rimuovo dalla fattura gli articoli collegati all'intervento
@ -1223,9 +1013,9 @@ switch (post('op')) {
for ($j = 0; $j < sizeof($rs2); ++$j) { for ($j = 0; $j < sizeof($rs2); ++$j) {
rimuovi_articolo_dafattura($rs[0]['idarticolo'], $id_record, $rs[0]['idrigadocumento']); rimuovi_articolo_dafattura($rs[0]['idarticolo'], $id_record, $rs[0]['idrigadocumento']);
} }
//} // }
//rimuovo riga da co_righe_documenti // rimuovo riga da co_righe_documenti
$query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); $query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga);
$dbo->query($query); $dbo->query($query);
@ -1268,24 +1058,25 @@ switch (post('op')) {
$id_record = $rsp[0]['iddocumento']; $id_record = $rsp[0]['iddocumento'];
$idpreventivo = $rsp[0]['idpreventivo']; $idpreventivo = $rsp[0]['idpreventivo'];
$is_preventivo = $rsp[0]['is_preventivo']; $is_preventivo = $rsp[0]['is_preventivo'];
$idarticolo = $rsp[0]['idarticolo']; $idarticolo = $rsp[0]['idarticolo'];
//preventivo su unica riga, perdo il riferimento dell'articolo quindi lo vado a leggere da co_righe_preventivi // preventivo su unica riga, perdo il riferimento dell'articolo quindi lo vado a leggere da co_righe_preventivi
if ( empty($idarticolo) && $is_preventivo ){ if (empty($idarticolo) && $is_preventivo) {
//rimetto a magazzino gli articoli collegati al preventivo // rimetto a magazzino gli articoli collegati al preventivo
$rsa = $dbo->fetchArray('SELECT idarticolo, qta FROM co_righe_preventivi WHERE idpreventivo = '.prepare($idpreventivo)); $rsa = $dbo->fetchArray('SELECT idarticolo, qta FROM co_righe_preventivi WHERE idpreventivo = '.prepare($idpreventivo));
for ($i = 0; $i < sizeof($rsa); ++$i) { for ($i = 0; $i < sizeof($rsa); ++$i) {
if (!empty($rsa[$i]['idarticolo'])) if (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_record]); add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_record]);
} }
}else{ }
if ( !empty($idarticolo) ){ } else {
$rs5 = $dbo->fetchArray('SELECT idarticolo, id, qta FROM co_righe_documenti WHERE id = '.prepare($idriga).' AND idintervento IS NULL'); if (!empty($idarticolo)) {
$rs5 = $dbo->fetchArray('SELECT idarticolo, id, qta FROM co_righe_documenti WHERE id = '.prepare($idriga).' AND idintervento IS NULL');
rimuovi_articolo_dafattura($rs5[0]['idarticolo'], $id_record, $idriga); rimuovi_articolo_dafattura($rs5[0]['idarticolo'], $id_record, $idriga);
} }
} }
$query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); $query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga);
if ($dbo->query($query)) { if ($dbo->query($query)) {
@ -1362,12 +1153,13 @@ switch (post('op')) {
} }
} }
} }
//Riporto a magazzino gli articoli nelle righe del contratto // Riporto a magazzino gli articoli nelle righe del contratto
$rsa = $dbo->fetchArray("SELECT idarticolo, qta FROM co_righe_contratti WHERE idcontratto=".prepare($idcontratto)); $rsa = $dbo->fetchArray("SELECT idarticolo, qta FROM co_righe_contratti WHERE idcontratto=".prepare($idcontratto));
for ($i = 0; $i < sizeof($rsa); ++$i) { for ($i = 0; $i < sizeof($rsa); ++$i) {
if (!empty($rsa[$i]['idarticolo'])) if (!empty($rsa[$i]['idarticolo'])) {
add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_record]); add_movimento_magazzino($rsa[$i]['idarticolo'], $rsa[$i]['qta'], ['iddocumento' => $id_record]);
}
} }
// Ricalcolo inps, ritenuta e bollo // Ricalcolo inps, ritenuta e bollo
@ -1556,7 +1348,9 @@ switch (post('op')) {
// Aggiornamento seriali dalla riga dell'ordine // Aggiornamento seriali dalla riga dell'ordine
$serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : []; $serials = is_array($post['serial'][$i]) ? $post['serial'][$i] : [];
$serials = array_filter($serials, function ($value) { return !empty($value); }); $serials = array_filter($serials, function ($value) {
return !empty($value);
});
$dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => 'uscita', 'id_articolo' => $idarticolo], ['serial' => $serials]); $dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => 'uscita', 'id_articolo' => $idarticolo], ['serial' => $serials]);
$dbo->detach('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => 'entrata', 'id_articolo' => $idarticolo], ['serial' => $serials]); $dbo->detach('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => 'entrata', 'id_articolo' => $idarticolo], ['serial' => $serials]);
@ -1583,9 +1377,9 @@ switch (post('op')) {
// Nota di addebito // Nota di addebito
if (get('op') == 'nota_addebito') { if (get('op') == 'nota_addebito') {
$rs_segment = $dbo->fetchArray("SELECT * FROM zz_segments WHERE predefined_addebito='1'"); $rs_segment = $dbo->fetchArray("SELECT * FROM zz_segments WHERE predefined_addebito='1'");
if(sizeof($rs_segment)>0){ if (sizeof($rs_segment)>0) {
$id_segment = $rs_segment[0]['id']; $id_segment = $rs_segment[0]['id'];
}else{ } else {
$id_segment = $records[0]['id_segment']; $id_segment = $records[0]['id_segment'];
} }

View File

@ -54,170 +54,93 @@ switch (post('op')) {
break; break;
case 'creafatturavendita': case 'crea_fattura':
$id_documento_cliente = [];
$rs_idanagrafica = $dbo->fetchArray("SELECT idanagrafica FROM in_interventi WHERE id='".$id_records[0]."'");
$idanagrafica = $rs_idanagrafica[0]['idanagrafica'];
$data = date('Y-m-d');
$dir = 'entrata';
$idtipodocumento = '2';
$accodare = post('accodare');
if (empty($_SESSION['m'.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['m'.Modules::get('Fatture di vendita')['id']]['id_segment'] = $rs[0]['id'];
}
$id_segment = $_SESSION['m'.Modules::get('Fatture di vendita')['id']]['id_segment'];
$numero = get_new_numerofattura($data);
$numero_esterno = get_new_numerosecondariofattura($data);
$idconto = get_var('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 = get_var('Tipo di pagamento predefinito');
}
$n_interventi = 0; $n_interventi = 0;
//inserisco righe $data = date('Y-m-d');
for ($i = 0; $i < sizeof($id_records); ++$i) { $dir = 'entrata';
$idintervento = $id_records[$i]; $tipo_documento = $dbo->selectOne('co_tipidocumento', 'id', ['descrizione' => 'Fattura immediata di vendita'])['id'];
$q = 'SELECT id, in_interventi.descrizione, in_interventi.codice, $id_iva = get_var('Iva predefinita');
IFNULL( (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), data_richiesta) AS data, $id_conto = get_var('Conto predefinito fatture di vendita');
(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') ";
$rs = $dbo->fetchArray($q); $accodare = post('accodare');
if (count($rs) > 0) { $module_name = 'Fatture di vendita';
//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'];
//preparo fattura // Segmenti
if (empty($iddocumento) or empty($accodare)) { $id_fatture = Modules::get($module_name)['id'];
$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).')'); if (!isset($_SESSION['m'.$id_fatture]['id_segment'])) {
$iddocumento = $dbo->lastInsertedID(); $segments = Modules::getSegments($id_fatture);
} else { $_SESSION['m'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null;
$numero_esterno = $dbo->fetchArray('SELECT numero_esterno FROM co_documenti WHERE id = '.prepare($iddocumento))[0]['numero_esterno']; }
} $id_segment = $_SESSION['m'.$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 // Tipo di pagamento predefinito dall'anagrafica
$subtot = $subtot_consuntivo; $query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT '.$campo.' AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($id_anagrafica).')';
$sconto = 0; $rs = $dbo->fetchArray($query);
$idpagamento = $rs[0]['id'];
//Aggiungo un'eventuale sconto in base al listino del cliente // Se alla non è stato associato un pagamento predefinito al cliente, leggo il pagamento dalle impostazioni
if ($prc_sconto < 0) { if (empty($idpagamento)) {
$sconto += $subtot / 100 * abs($prc_sconto); $idpagamento = get_var('Tipo di pagamento predefinito');
}
$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('&quot;', '&amp;quot;', $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 = get_var('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='".get_var('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='".get_var("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", "'.get_var('Percentuale rivalsa INPS').'", "'.$rivalsainps.'", "'.get_var("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);
} }
//Metto l'intervento in stato "Fatturato" // Creazione nuova fattura
$dbo->query("UPDATE in_interventi SET idstatointervento='FAT' WHERE id='$idintervento'"); $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) { if ($n_interventi > 0) {
$_SESSION['infos'][] = tr('Fattura _NUM_.', [
'_NUM_' => $numero_esterno,
]);
$_SESSION['infos'][] = tr('_NUM_ interventi fatturati.', [ $_SESSION['infos'][] = tr('_NUM_ interventi fatturati.', [
'_NUM_' => $n_interventi, '_NUM_' => $n_interventi,
]); ]);
@ -240,7 +163,7 @@ return [
], ],
], ],
'creafatturavendita' => [ 'crea_fattura' => [
'text' => tr('Crea fattura'), 'text' => tr('Crea fattura'),
'data' => [ 'data' => [
'title' => tr('Vuoi davvero generare le fatture per questi interventi?'), 'title' => tr('Vuoi davvero generare le fatture per questi interventi?'),

View File

@ -315,3 +315,216 @@ function get_costi_intervento($id_intervento)
return $result; return $result;
} }
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, '.get_var('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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
if (get_var("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(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("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(get_var('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(get_var("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' => get_var('Percentuale rivalsa INPS'),
'rivalsainps' => $rivalsainps,
'idritenutaacconto' => get_var("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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
if (get_var("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(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$dati = $dbo->fetchArray($query);
if (get_var("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(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("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(get_var('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(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
if (get_var("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(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var("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));
}