Aggiornamento seriali

Aggiornamento del sistema di gestione dei seriali, ora unficato e semplificato all'interno della tabella mg_prodotii.
Generalizzazione delle operazioni di trasferimento delle righe tra ordini, ddt e fatture (file modules/fatture/crea_documento.php)..
This commit is contained in:
Thomas Zilio 2017-09-05 17:31:58 +02:00
parent c56a36340d
commit 14ae98604d
37 changed files with 854 additions and 1858 deletions

View File

@ -240,7 +240,7 @@ switch ($module_name) {
// Elenco lotti in base all'articolo
elseif ($op == 'getlotti') {
$idarticolo = $get['idarticolo'];
$q = 'SELECT DISTINCT(lotto) FROM mg_prodotti WHERE idarticolo="'.$idarticolo.'" '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY lotto ASC';
$q = 'SELECT DISTINCT(lotto) FROM mg_prodotti WHERE id_articolo="'.$idarticolo.'" '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY lotto ASC';
$rs = $dbo->fetchArray($q);
$n = sizeof($rs);
@ -249,7 +249,7 @@ switch ($module_name) {
for ($i = 0; $i < $n; ++$i) {
$dir = 'entrata';
$qs = 'SELECT COUNT(serial) AS num_seriali FROM mg_prodotti WHERE idarticolo='.prepare($idarticolo).' AND lotto='.prepare($rs[$i]['lotto']).' '.
$qs = 'SELECT COUNT(serial) AS num_seriali FROM mg_prodotti WHERE id_articolo='.prepare($idarticolo).' AND lotto='.prepare($rs[$i]['lotto']).' '.
'AND (serial NOT IN(SELECT serial FROM co_righe_documenti INNER JOIN co_documenti ON co_righe_documenti.iddocumento = co_documenti.id INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento = co_tipidocumento.id WHERE lotto='.prepare($rs[$i]['lotto']).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '.
'AND serial NOT IN(SELECT serial FROM or_righe_ordini INNER JOIN or_ordini ON or_righe_ordini.idordine = or_ordini.id INNER JOIN or_tipiordine ON or_ordini.idtipoordine = or_tipiordine.id WHERE lotto='.prepare($rs[$i]['lotto']).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '.
'AND serial NOT IN(SELECT serial FROM dt_righe_ddt INNER JOIN dt_ddt ON dt_righe_ddt.idddt = dt_ddt.id INNER JOIN dt_tipiddt ON dt_ddt.idtipoddt = dt_tipiddt.id WHERE lotto='.prepare($rs[$i]['lotto']).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '.
@ -283,7 +283,7 @@ switch ($module_name) {
}
if ($dir == 'entrata') {
$q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE idarticolo='.prepare($idarticolo).' AND lotto='.prepare($lotto).
$q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE id_articolo='.prepare($idarticolo).' AND lotto='.prepare($lotto).
' AND (serial NOT IN(SELECT serial FROM co_righe_documenti INNER JOIN co_documenti ON co_righe_documenti.iddocumento = co_documenti.id INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento = co_tipidocumento.id WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).')'.
' AND serial NOT IN(SELECT serial FROM or_righe_ordini INNER JOIN or_ordini ON or_righe_ordini.idordine = or_ordini.id INNER JOIN or_tipiordine ON or_ordini.idtipoordine = or_tipiordine.id WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '.
' AND serial NOT IN(SELECT serial FROM dt_righe_ddt INNER JOIN dt_ddt ON dt_righe_ddt.idddt = dt_ddt.id INNER JOIN dt_tipiddt ON dt_ddt.idtipoddt = dt_tipiddt.id WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '.
@ -292,7 +292,7 @@ switch ($module_name) {
$rs = $dbo->fetchArray($q);
$n = sizeof($rs);
} else {
$q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE idarticolo='.prepare($idarticolo).' AND lotto='.prepare($lotto).' AND (serial NOT IN(SELECT serial FROM co_righe_documenti WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial ) AND serial NOT IN(SELECT serial FROM or_righe_ordini WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM dt_righe_ddt WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM mg_articoli_interventi WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) '.$additional_where_serial.' ) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY serial ASC';
$q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE id_articolo='.prepare($idarticolo).' AND lotto='.prepare($lotto).' AND (serial NOT IN(SELECT serial FROM co_righe_documenti WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial ) AND serial NOT IN(SELECT serial FROM or_righe_ordini WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM dt_righe_ddt WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM mg_articoli_interventi WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) '.$additional_where_serial.' ) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY serial ASC';
$rs = $dbo->fetchArray($q);
$n = sizeof($rs);
}
@ -314,7 +314,7 @@ switch ($module_name) {
$idarticolo = $get['idarticolo'];
$lotto = $get['lotto'];
$serial = $get['serial'];
$q = 'SELECT DISTINCT(altro) FROM mg_prodotti WHERE idarticolo="'.$idarticolo.'" AND lotto="'.$lotto.'" AND serial="'.$serial.'" AND (altro NOT IN(SELECT altro FROM co_righe_documenti WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM or_righe_ordini WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM dt_righe_ddt WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM mg_articoli_interventi WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro)) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY altro ASC';
$q = 'SELECT DISTINCT(altro) FROM mg_prodotti WHERE id_articolo="'.$idarticolo.'" AND lotto="'.$lotto.'" AND serial="'.$serial.'" AND (altro NOT IN(SELECT altro FROM co_righe_documenti WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM or_righe_ordini WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM dt_righe_ddt WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM mg_articoli_interventi WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro)) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY altro ASC';
$rs = $dbo->fetchArray($q);
$n = sizeof($rs);

View File

@ -232,6 +232,7 @@ switch ($op) {
if (!empty($search)) {
$search_fields[] = 'descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'codice LIKE '.prepare('%'.$search.'%');
}
$wh = '';
@ -522,7 +523,7 @@ switch ($op) {
if (Modules::getModule('Magazzino')['permessi'] != '-') {
$query = 'SELECT DISTINCT serial AS descrizione FROM mg_prodotti |where|';
$where[] = 'idarticolo='.prepare($superselect['idarticolo']);
$where[] = 'id_articolo='.prepare($superselect['idarticolo']);
$where[] = 'lotto='.prepare($superselect['lotto']);
foreach ($elements as $element) {
@ -540,7 +541,7 @@ switch ($op) {
if (Modules::getModule('Magazzino')['permessi'] != '-') {
$query = 'SELECT DISTINCT altro AS descrizione FROM mg_prodotti |where|';
$where[] = 'idarticolo='.prepare($superselect['idarticolo']);
$where[] = 'id_articolo='.prepare($superselect['idarticolo']);
$where[] = 'lotto='.prepare($superselect['lotto']);
$where[] = 'serial='.prepare($superselect['serial']);

View File

@ -68,7 +68,7 @@ if (file_exists($docroot.'/modules/'.$module_dir.'/add.php') && $module['permess
echo '
<button type="button" class="btn btn-primary" data-toggle="modal" data-title="'.tr('Aggiungi').'..." data-target="#bs-popup" data-href="add.php?id_module='.$id_module.'"><i class="fa fa-plus"></i></button>';
}
echo '
echo '
</a>
<a class="back-btn" href="controller.php?id_module='.$id_module.'"><i class="fa fa-chevron-left"></i> '.tr("Torna all'elenco").'</a>
</li>';
@ -122,6 +122,7 @@ $backto = filter('backto');
// Scelta del redirect dopo un submit
if (!empty($backto)) {
$hash = filter('hash');
$hash = !starts_with($hash, '#') ? '#'.$hash : $hash;
if ($backto == 'record-edit') {
redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash);
exit();

View File

@ -378,7 +378,7 @@ class Auth extends \Util\Singleton
{
$database = Database::getConnection();
if ($database->isInstalled()) {
if ($database->isInstalled() || !$database->fetchNum("SHOW TABLES LIKE 'zz_logs'")) {
return false;
}

View File

@ -862,11 +862,20 @@ function start_superselect() {
});
}
/**
* Reimposta i contenuti di un <select> creato con select2.
*/
jQuery.fn.selectClear = function () {
this.val([]).trigger("change");
return this;
};
/**
* Resetta i contenuti di un <select> creato con select2.
*/
jQuery.fn.selectReset = function () {
this.val('').trigger("change");
this.selectClear();
this.empty();
return this;
@ -1130,6 +1139,9 @@ String.prototype.toLocale = function () {
x[0] = x[0].split("").reverse().join("");
x[0] = x[0].replace(/(.{3})/g, "$1" + globals.thousands);
x[0] = x[0].split("").reverse().join("");
if(x[0][0] == globals.thousands){
x[0] = x[0].substr(1);
}
}
return x[0] + globals.decimals + x[1];

View File

@ -159,7 +159,7 @@ switch (post('op')) {
$n_prodotti = $n_lotti * $n_serial * $n_altro;
// Creo la query per le combinazioni prodotto con ogni combinazione
$query = 'INSERT INTO mg_prodotti(idarticolo, lotto, serial, altro) VALUES';
$query = 'INSERT INTO mg_prodotti(id_articolo, lotto, serial, altro) VALUES';
// Contatore prodotti da inserire
$c = 0;
@ -182,7 +182,7 @@ switch (post('op')) {
$insert = str_replace('|altro|', prepare($this_altro), $insert);
// Verifico che questa combinazione non esista già
$np = $dbo->fetchNum('SELECT id FROM mg_prodotti WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($this_lotto).' AND serial='.prepare($this_serial).' AND altro='.prepare($this_altro));
$np = $dbo->fetchNum('SELECT id FROM mg_prodotti WHERE id_articolo='.prepare($id_record).' AND lotto='.prepare($this_lotto).' AND serial='.prepare($this_serial).' AND altro='.prepare($this_altro));
if ($np == 0) {
$query .= $insert.', ';
++$c;
@ -227,10 +227,19 @@ switch (post('op')) {
}
break;
case 'delmovimento':
$idmovimento = post('idmovimento');
$query = 'DELETE FROM mg_movimenti WHERE id='.prepare($idmovimento);
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Movimento rimosso!');
}
break;
case 'delete':
$dbo->query('DELETE FROM mg_articoli WHERE id='.prepare($id_record));
$dbo->query('DELETE FROM mg_movimenti WHERE idarticolo='.prepare($id_record));
$dbo->query('DELETE FROM mg_prodotti WHERE idarticolo='.prepare($id_record));
$dbo->query('DELETE FROM mg_prodotti WHERE id_articolo='.prepare($id_record));
$dbo->query('DELETE FROM mg_articoli_automezzi WHERE idarticolo='.prepare($id_record));
$_SESSION['infos'][] = tr('Articolo eliminato!');

View File

@ -16,10 +16,10 @@ $search_serial = $get['search_serial'];
$search_altro = $get['search_altro'];
// Calcolo prossimo lotto e serial number
$rs = $dbo->fetchArray('SELECT MAX(lotto) AS max_lotto, MAX(serial) AS max_serial, MAX(altro) AS max_altro FROM mg_prodotti WHERE idarticolo='.prepare($id_record));
$max_lotto = $rs[0]['max_lotto'];
$rs = $dbo->fetchArray('SELECT MAX(lotto) AS max_lotto, MAX(serial) AS max_serial, MAX(altro) AS max_altro FROM mg_prodotti WHERE id_articolo='.prepare($id_record));
//$max_lotto = $rs[0]['max_lotto'];
$max_serial = $rs[0]['max_serial'];
$max_altro = $rs[0]['max_altro'];
//$max_altro = $rs[0]['max_altro'];
//$next_lotto = get_next_code($max_lotto);
$next_serial = get_next_code($max_serial);
@ -138,29 +138,27 @@ echo '
<div class="box-body">
<div class="text-right">
<small style="color:#f00;">';
// Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato
if (get_var("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) {
echo tr("La cancellazione decrementerà la quantità dell'articolo!");
} else {
echo tr("L'inserimento decrementerà la quantità dell'articolo!");
}
echo '
</small>
</div>';
// Conteggio totale prodotti
$rs = $dbo->fetchArray('SELECT COUNT(id) AS tot FROM mg_prodotti WHERE idarticolo='.prepare($id_record));
$rs = $dbo->fetchArray('SELECT COUNT(id) AS tot FROM mg_prodotti WHERE id_articolo='.prepare($id_record));
$tot_prodotti = $rs[0]['tot'];
// Visualizzazione di tutti i prodotti
$query = 'SELECT * FROM mg_prodotti WHERE idarticolo='.prepare($id_record).' AND lotto LIKE '.prepare('%'.$search_lotto.'%').' AND serial LIKE '.prepare('%'.$search_serial.'%').' AND altro LIKE '.prepare('%'.$search_altro.'%').' ORDER BY created_at DESC, lotto DESC, serial DESC, altro DESC';
if (!empty($get['show_all3']) && $search_lotto == '' && $search_serial == '' && $search_altro == '') {
$query .= ' LIMIT 0, 20';
}
$query = 'SELECT * FROM mg_prodotti WHERE id_articolo='.prepare($id_record).(!empty($search_serial) ? ' AND serial LIKE '.prepare('%'.$search_serial.'%') : '').' ORDER BY created_at DESC, lotto DESC, serial DESC, altro DESC';
$rs2 = $dbo->fetchArray($query);
echo '
echo '
<table class="table table-striped table-hover table-condensed table-bordered text-center datatables">
<thead>
<tr>
@ -168,129 +166,135 @@ $rs2 = $dbo->fetchArray($query);
<th id="th_Data di creazione">'.tr('Data di creazione').'</th>
<th id="th_Documento di vendita">'.tr('Documento di vendita').'</th>
<th id="th_Totale">'.tr('Totale').'</th>
<th></th>
<th class="text-center">#</th>
</tr>
</thead>
<tbody>';
for ($i = 0; $i < count($rs2); ++$i) {
for ($i = 0; $i < count($rs2); ++$i) {
echo '
<tr>
<td>'.$rs2[$i]['serial'].'</td>';
echo '
<td>'.Translator::timestampToLocale($rs2[$i]['created_at']).'</td>';
// Ricerca vendite
$vendite = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE dir=\'entrata\' AND id_articolo='.prepare($id_record).' AND serial='.prepare($rs2[$i]['serial']));
if (!empty($vendite)) {
echo '
<tr>
<td>';
<td>'.$rs2[$i]['serial'].'</td>';
$totali = [];
echo '
<td>'.Translator::timestampToLocale($rs2[$i]['created_at']).'</td>';
// Ricerca vendite su ddt
$query3 = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']);
$rs3 = $dbo->fetchArray($query3);
// Ricerca vendite su fatture
$query4 = 'SELECT *, ( SELECT descrizione FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS tipo_documento, ( SELECT `dir` FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS `dir`, ( SELECT numero FROM co_documenti WHERE id=iddocumento ) AS numero, ( SELECT numero_esterno FROM co_documenti WHERE id=iddocumento ) AS numero_esterno, ( SELECT data FROM co_documenti WHERE id=iddocumento ) AS data FROM co_righe_documenti WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']);
$rs4 = $dbo->fetchArray($query4);
// Ricerca inserimenti su ordini
$query5 = 'SELECT *, ( SELECT descrizione FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS tipo_documento, ( SELECT `dir` FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS `dir`, ( SELECT numero FROM or_ordini WHERE id=idordine ) AS numero, ( SELECT numero_esterno FROM or_ordini WHERE id=idordine ) AS numero_esterno, ( SELECT data FROM or_ordini WHERE id=idordine ) AS data FROM or_righe_ordini WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']);
$rs5 = $dbo->fetchArray($query5);
// Ricerca inserimenti su interventi
$query6 = 'SELECT mg_articoli_interventi.*, in_interventi.codice, ( SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=mg_articoli_interventi.idintervento LIMIT 0,1 ) AS data FROM mg_articoli_interventi JOIN in_interventi ON in_interventi.id = mg_articoli_interventi.idintervento WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']);
$rs6 = $dbo->fetchArray($query6);
if (!empty($rs3) || !empty($rs4) || !empty($rs5) || !empty($rs6)) {
foreach ($vendite as $vendita) {
// Venduto su fatture
if (!empty($rs4)) {
$numero = ($rs4[0]['numero_esterno'] != '') ? $rs4[0]['numero_esterno'] : $rs4[0]['numero'];
if (!empty($vendita['id_riga_documento'])) {
$module_id = Modules::getModule('Fatture di vendita')['id'];
$id = $rs4[0]['iddocumento'];
$documento = $rs4[0]['tipo_documento'];
$data = $rs4[0]['data'];
$subtotale = $rs4[0]['subtotale'];
$iva = $rs4[0]['iva'];
// Ricerca vendite su fatture
$query = 'SELECT *, ( SELECT descrizione FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS tipo_documento, ( SELECT `dir` FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS `dir`, ( SELECT numero FROM co_documenti WHERE id=iddocumento ) AS numero, ( SELECT numero_esterno FROM co_documenti WHERE id=iddocumento ) AS numero_esterno, ( SELECT data FROM co_documenti WHERE id=iddocumento ) AS data FROM co_righe_documenti WHERE co_righe_documenti.id='.prepare($vendita['id_riga_documento']);
$data = $dbo->fetchArray($query);
$id = $data[0]['iddocumento'];
}
// Venduto su ddt
elseif (!empty($rs3)) {
elseif (!empty($vendita['id_riga_ddt'])) {
$numero = ($rs3[0]['numero_esterno'] != '') ? $rs3[0]['numero_esterno'] : $rs3[0]['numero'];
$module_id = Modules::getModule('Ddt di vendita')['id'];
$id = $rs3[0]['idddt'];
$documento = $rs3[0]['tipo_documento'];
$data = $rs3[0]['data'];
$subtotale = $rs3[0]['subtotale'];
$iva = $rs3[0]['iva'];
$query = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE dt_righe_ddt.id='.prepare($vendita['id_riga_ddt']);
$data = $dbo->fetchArray($query);
$id = $data[0]['idddt'];
}
// Inserito su ordini
elseif (!empty($rs5)) {
$numero = ($rs5[0]['numero_esterno'] != '') ? $rs5[0]['numero_esterno'] : $rs5[0]['numero'];
elseif (!empty($vendita['id_riga_ordine'])) {
$module_id = Modules::getModule('Ordini cliente')['id'];
$id = $rs5[0]['idordine'];
$documento = $rs5[0]['tipo_documento'];
$data = $rs5[0]['data'];
$subtotale = $rs5[0]['subtotale'];
$iva = $rs5[0]['iva'];
// Ricerca inserimenti su ordini
$query = 'SELECT *, ( SELECT descrizione FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS tipo_documento, ( SELECT `dir` FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS `dir`, ( SELECT numero FROM or_ordini WHERE id=idordine ) AS numero, ( SELECT numero_esterno FROM or_ordini WHERE id=idordine ) AS numero_esterno, ( SELECT data FROM or_ordini WHERE id=idordine ) AS data FROM or_righe_ordini WHERE or_righe_ordini.id='.prepare($vendita['id_riga_ordine']);
$data = $dbo->fetchArray($query);
$id = $data[0]['idordine'];
}
// Inserito su intervento
elseif (!empty($rs6)) {
$numero = ($rs6[0]['numero_esterno'] != '') ? $rs6[0]['numero_esterno'] : $rs6[0]['numero'];
elseif (!empty($vendita['id_riga_intervento'])) {
$module_id = Modules::getModule('Interventi')['id'];
$id = $rs6[0]['idintervento'];
$documento = tr('Intervento').' '.$rs6[0]['codice'];
$data = $rs6[0]['data'];
$extra = str_replace('_QTA_', $rs6[0]['qta'], tr('(q.tà _QTA_)'));
$totale = $rs6[0]['prezzo_vendita'] * $rs6[0]['qta'];
// Ricerca inserimenti su interventi
$query = 'SELECT mg_articoli_interventi.*, in_interventi.codice, ( SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=mg_articoli_interventi.idintervento LIMIT 0,1 ) AS data FROM mg_articoli_interventi JOIN in_interventi ON in_interventi.id = mg_articoli_interventi.idintervento WHERE mg_articoli_interventi.id='.prepare($vendita['id_riga_intervento']);
$data = $dbo->fetchArray($query);
$id = $data[0]['idintervento'];
$data[0]['tipo_documento'] = tr('Intervento').' '.$data[0]['codice'];
$data[0]['subtotale'] = $data[0]['prezzo_vendita'] * $data[0]['qta'];
$data[0]['iva'] = 0;
$extra = str_replace('_QTA_', $data[0]['qta'], tr('(q.tà _QTA_)'));
}
if (empty($totale) && !empty($subtotale) && !empty($iva)) {
$totale = $subtotale + $iva;
}
$totali[] = [$data[0]['subtotale'], $data[0]['iva']];
$text = str_replace(['_DOC_', '_NUM_', '_DATE_'], [$documento, $numero, Translator::dateToLocale($data)], tr('_DOC_ n<sup>o</sup> _NUM_ del _DATE_')).(!empty($extra) ? ' '.$extra : '');
$numero = !empty($rs6[0]['numero_esterno']) ? $data[0]['numero_esterno'] : $data[0]['numero'];
$text = str_replace(['_DOC_', '_NUM_', '_DATE_', '_TOT_'], [$data[0]['tipo_documento'], $numero, Translator::dateToLocale($data[0]['data'])], tr('_DOC_ n<sup>o</sup> _NUM_ del _DATE_')).(!empty($extra) ? ' '.$extra : '');
echo '
<td>
'.Modules::link($module_id, $id, $text).'
</td>
'.Modules::link($module_id, $id, $text).'<br>';
}
<td class="text-center">
<span>&euro; '.Translator::numberToLocale($totale).'</span>';
echo '
</td>
<td class="text-center">';
foreach ($totali as $value) {
$subtotale = $value[0];
$iva = $value[1];
echo '
<span>&euro; '.Translator::numberToLocale($subtotale + $iva).'</span>';
if (!empty($subtotale) && !empty($iva)) {
echo '
<br/>
<small style="color:#555;">'.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).'</small>';
<small style="color:#555;">('.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).')</small>';
}
echo '
</td>
<td></td>';
<br>';
}
// Non venduto
else {
// Documento di vendita
echo '
<td></td>';
// Totale
echo '
<td></td>';
echo '
<td>
<a class="btn btn-danger btn-sm ask" data-backto="record-edit" data-op="delprodotto" data-idprodotto="'.$rs2[$i]['id'].'">
<i class="fa fa-trash"></i>
</a>
</td>';
}
echo '
</tr>';
</td>
<td></td>';
}
// Non venduto
else {
// Documento di vendita
echo '
<td></td>';
// Totale
echo '
<td></td>';
echo '
<td class="text-center">
<a class="btn btn-danger btn-sm ask" data-backto="record-edit" data-op="delprodotto" data-idprodotto="'.$rs2[$i]['id'].'">
<i class="fa fa-trash"></i>
</a>
</td>';
}
echo '
</tr>';
}
echo '
</tbody>
</table>
</div>

View File

@ -41,8 +41,9 @@ if (!empty($rs2)) {
<th class="text-center" width="100">'.tr('Q.').'</th>
<th width="720">'.tr('Causale').'</th>
<th>'.tr('Data').'</th>
<th class="text-center">#</th>
</tr>';
foreach($rs2 as $r){
foreach ($rs2 as $r) {
// Quantità
echo '
<tr>
@ -54,7 +55,21 @@ if (!empty($rs2)) {
// Data
echo '
<td>'.Translator::timestampToLocale($r['created_at']).'</td>
<td>'.Translator::timestampToLocale($r['created_at']).'</td>';
// Operazioni
echo '
<td class="text-center">';
if (Auth::admin()) {
echo '
<a class="btn btn-danger btn-sm ask" data-backto="record-edit" data-op="delmovimento" data-idmovimento="'.$r['id'].'">
<i class="fa fa-trash"></i>
</a>';
}
echo '
</td>
</tr>';
}
echo '

View File

@ -121,7 +121,7 @@ elseif ($get['op'] == 'addfattura') {
$iva_indetraibile = $importo / 100 * $rs2[0]['indetraibile'];
// Inserimento riga in fattura
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, descrizione, desc_iva, iva, iva_indetraibile, subtotale, um, qta, idgruppo, `order`) VALUES('.prepare($iddocumento).', '.prepare($descrizione).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($importo).", '-', 1, (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento)."), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento)."))");
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, descrizione, desc_iva, iva, iva_indetraibile, subtotale, um, qta, `order`) VALUES('.prepare($iddocumento).', '.prepare($descrizione).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($importo).", '-', 1, (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento)."))");
redirect($rootdir.'/editor.php?id_module='.Modules::getModule('Fatture di vendita')['id'].'&id_record='.$iddocumento.'&dir=entrata');
exit();

View File

@ -150,11 +150,7 @@ switch (post('op')) {
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
// Calcolo idgruppo per questo inserimento
$ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM dt_righe_ddt WHERE idddt = '.prepare($id_record));
$idgruppo = $ridgruppo[0]['idgruppo'];
add_articolo_inddt($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, $lotto, $serial, $altro, $idgruppo);
add_articolo_inddt($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto);
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_ddt($id_record);
@ -186,7 +182,7 @@ switch (post('op')) {
$iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
$query = 'INSERT INTO dt_righe_ddt(idddt, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))';
$query = 'INSERT INTO dt_righe_ddt(idddt, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))';
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Riga aggiunta!');
@ -224,12 +220,13 @@ switch (post('op')) {
for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) {
// Processo solo le righe da evadere
if ($post['evadere'][$i] == 'on') {
$idrigaordine = post('idrigaordine')[$i];
$idrigaordine = post('idriga')[$i];
$idarticolo = post('idarticolo')[$i];
$descrizione = post('descrizione')[$i];
$qta = $post['qta_da_evadere'][$i];
$um = post('um')[$i];
$abilita_serial = post('abilita_serial')[$i];
$subtot = $post['subtot'][$i] * $qta;
$sconto = $post['sconto'][$i];
@ -243,12 +240,12 @@ switch (post('op')) {
$rs = $dbo->fetchArray($q);
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
// Lettura lotto, serial, altro dalla riga dell'ordine
$q = 'SELECT lotto, serial, altro FROM or_righe_ordini WHERE id='.prepare($idrigaordine);
$rs = $dbo->fetchArray($q);
// Inserisco la riga in ddt
$dbo->query('INSERT INTO dt_righe_ddt(idddt, idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, lotto, serial, altro, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($rs[0]['lotto']).', '.prepare($rs[0]['serial']).', '.prepare($rs[0]['altro']).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))');
$dbo->query('INSERT INTO dt_righe_ddt(idddt, idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, abilita_serial, `order`) VALUES('.prepare($id_record).', '.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($abilita_serial).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))');
$riga = $dbo->lastInsertedID();
// Aggiornamento seriali dalla riga dell'ordine
$dbo->sync('mg_prodotti', ['id_riga_ddt' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => (array) $post['serial'][$i]]);
// Scalo la quantità dall'ordine
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaordine));
@ -277,24 +274,20 @@ switch (post('op')) {
$idriga = post('idriga');
$idarticolo = post('idarticolo');
if ($id_record != '' && $idarticolo != '') {
$res = rimuovi_articolo_daddt($idarticolo, $id_record, $idriga);
if (!rimuovi_articolo_daddt($idarticolo, $id_record, $idriga)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
if (!$res) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
// Ricalcolo inps, ritenuta e bollo
if ($post['dir'] == 'entrata') {
ricalcola_costiagg_ddt($id_record);
} else {
ricalcola_costiagg_ddt($id_record, 0, 0, 0);
}
$_SESSION['infos'][] = tr('Articolo rimosso!');
return;
}
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
ricalcola_costiagg_ddt($id_record);
} else {
ricalcola_costiagg_ddt($id_record, 0, 0, 0);
}
$_SESSION['infos'][] = tr('Articolo rimosso!');
break;
// Scollegamento riga generica da ddt
@ -347,13 +340,20 @@ switch (post('op')) {
$subtot = $prezzo * $qta;
// Lettura idarticolo dalla riga ddt
$rs = $dbo->fetchArray('SELECT idgruppo, idddt, abilita_serial, idarticolo, idordine, qta FROM dt_righe_ddt WHERE id='.prepare($idriga));
$rs = $dbo->fetchArray('SELECT idddt, abilita_serial, idarticolo, idordine, qta FROM dt_righe_ddt WHERE id='.prepare($idriga));
$idarticolo = $rs[0]['idarticolo'];
$idordine = $rs[0]['idordine'];
$old_qta = $rs[0]['qta'];
$idgruppo = $rs[0]['idgruppo'];
$idddt = $rs[0]['idddt'];
$abilita_serial = $rs[0]['abilita_serial'];
// Controllo per gestire i serial
if (!empty($idarticolo)) {
if (!controlla_seriali('id_riga_ddt', $idriga, $old_qta, $qta, $dir)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
}
// Calcolo iva
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
@ -363,40 +363,9 @@ switch (post('op')) {
$desc_iva = $rs[0]['descrizione'];
// Modifica riga generica sul ddt
$query = 'UPDATE dt_righe_ddt SET idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).' WHERE idgruppo='.prepare($idgruppo).' AND idddt='.prepare($idddt);
$query = 'UPDATE dt_righe_ddt SET idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga);
if ($dbo->query($query)) {
// Modifica della quantità
$dbo->query('UPDATE dt_righe_ddt SET qta='.prepare($qta).' WHERE idgruppo='.prepare($idgruppo));
// Modifica per gestire i serial
if (!empty($idarticolo)) {
$new_qta = $qta - $old_qta;
$new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta;
if (!empty($abilita_serial)) {
if ($old_qta < $qta) {
for ($i = 0; $i < $new_qta; ++$i) {
$dbo->query('INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) SELECT idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order` FROM dt_righe_ddt WHERE id='.prepare($idriga));
}
} else {
if ($dir == 'uscita') {
if ($new_qta > $dbo->fetchArray("SELECT COUNT(*) AS rimovibili FROM dt_righe_ddt WHERE serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idddt='.prepare($idddt))[0]['rimovibili']) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
} else {
$deletes = $dbo->fetchArray('SELECT id FROM dt_righe_ddt AS t WHERE idgruppo = '.prepare($idgruppo).' AND idddt='.prepare($idddt)." AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') ORDER BY serial ASC LIMIT ".$new_qta);
}
} else {
$deletes = $dbo->fetchArray('SELECT id FROM dt_righe_ddt AS t WHERE idgruppo = '.prepare($idgruppo).' AND idddt='.prepare($idddt).' ORDER BY serial ASC LIMIT '.$new_qta);
}
foreach ((array) $deletes as $delete) {
$dbo->query('DELETE FROM dt_righe_ddt WHERE id = '.prepare($delete['id']));
}
}
}
// Controlli aggiuntivi sulle quantità evase degli ordini
if (!empty($idordine) && $qta > 0) {
$rs = $dbo->fetchArray('SELECT qta_evasa, qta FROM or_righe_ordini WHERE idordine='.prepare($idordine).' AND idarticolo='.prepare($idarticolo));
@ -409,8 +378,7 @@ switch (post('op')) {
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = '.prepare($qta_ordine).' WHERE idordine='.prepare($idordine).' AND idarticolo='.prepare($idarticolo));
}
$new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta;
$new_qta = $qta - $old_qta;
$new_qta = ($dir == 'entrata') ? -$new_qta : $new_qta;
add_movimento_magazzino($idarticolo, $new_qta, ['idddt' => $id_record]);
}
@ -429,19 +397,18 @@ switch (post('op')) {
// eliminazione ddt
case 'delete':
if ($dir == 'uscita') {
$non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM dt_righe_ddt WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idddt=".prepare($id_record))[0]['non_rimovibili'];
if ($non_rimovibili != 0) {
// Se ci sono degli articoli collegati
$rs = $dbo->fetchArray('SELECT id, idarticolo FROM dt_righe_ddt WHERE idddt='.prepare($id_record));
foreach ($rs as $value) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_ddt', $value['id'], $dir);
if (!empty($non_rimovibili)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
}
// Se ci sono degli articoli collegati
$query = 'SELECT id, idarticolo FROM dt_righe_ddt WHERE idddt='.prepare($id_record);
$rs = $dbo->fetchArray($query);
for ($i = 0; $i < sizeof($rs); ++$i) {
rimuovi_articolo_daddt($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']);
}
@ -464,16 +431,18 @@ switch (post('op')) {
break;
case 'add_serial':
$idgruppo = $post['idgruppo'];
$serial = $post['serial'];
$idriga = $post['idriga'];
$idarticolo = $post['idarticolo'];
$q = 'SELECT * FROM dt_righe_ddt WHERE idddt='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id';
$rs = $dbo->fetchArray($q);
foreach ($rs as $i => $r) {
$dbo->query('UPDATE dt_righe_ddt SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id']));
$serials = (array) $post['serial'];
foreach ($serials as $key => $value) {
if (empty($value)) {
unset($serials[$key]);
}
}
$dbo->sync('mg_prodotti', ['id_riga_ddt' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
break;
case 'update_position':

View File

@ -1,108 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
if ($module['name'] == 'Ddt di vendita') {
$dir = 'entrata';
} else {
$dir = 'uscita';
}
$idarticolo = get('idarticolo');
$idgruppo = get('idgruppo');
$q2 = 'SELECT * FROM dt_righe_ddt INNER JOIN mg_articoli ON dt_righe_ddt.idarticolo=mg_articoli.id WHERE dt_righe_ddt.idddt='.prepare($id_record).' AND dt_righe_ddt.idgruppo='.prepare($idgruppo);
$rs2 = $dbo->fetchArray($q2);
echo '
<p>'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'</p>
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<input type="hidden" name="op" value="add_serial">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="idgruppo" value="'.$rs2[0]['idgruppo'].'">
<input type="hidden" name="dir" value="'.$dir.'">';
$serials = [];
$array = array_column($rs2, 'serial');
foreach ($array as $value) {
if (!empty($value)) {
$serials[] = $value;
}
}
if ($dir == 'entrata') {
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'ddt-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]}
</div>
</div>';
} else {
echo '
<p>'.tr('Inserisci i numeri seriali degli articoli aggiunti:').'</p>';
foreach ($array as $key => $serial) {
if ($key % 3 == 0) {
echo '
<div class="row">';
}
$res = $dbo->fetchArray("SELECT record FROM vw_serials WHERE dir='entrata' AND serial = ".prepare($serial));
echo '
<div class="col-md-4">
{[ "type": "text", "name": "serial[]", "value": "'.$serial.'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}';
if (!empty($res)) {
$pieces = explode('-', $res[0]['record']);
switch ($pieces[0]) {
case 'int':
$modulo = 'Interventi';
break;
case 'ddt':
$modulo = 'Ddt di vendita';
break;
case 'fat':
$modulo = 'Fatture di vendita';
break;
case 'ord':
$modulo = 'Ordini cliente';
break;
}
echo '
'.Modules::link($modulo, $pieces[1], tr('Visualizza vendita').' <i class="fa fa-external-link"></i>', null);
}
echo '
</div>';
if (($key + 1) % 3 == 0) {
echo '
</div>
<br>';
}
}
if (($key + 1) % 3 != 0) {
echo '
</div>';
}
}
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-barcode"></i> '.tr('Aggiorna').'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';

View File

@ -1,236 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
if ($_GET['dir'] == 'entrata') {
$dir = 'entrata';
$module_name = 'Fatture di vendita';
} else {
$dir = 'uscita';
$module_name = 'Fatture di acquisto';
}
$idddt = $get['idddt'];
// Info documento
$q = 'SELECT * FROM dt_ddt WHERE id='.prepare($idddt);
$rs = $dbo->fetchArray($q);
$numero = $rs[0]['numero'];
$idanagrafica = $rs[0]['idanagrafica'];
$idpagamento = $rs[0]['idpagamento'];
$idconto = $rs[0]['idconto'];
/*
Form di inserimento riga documento
*/
echo '
<p>'.str_replace('_NUM_', $numero, tr('Ddt numero _NUM_')).'</p>';
//Selezione articoli del ddt da portare nella fattura, escludo quelli completamente evasi
$query = 'SELECT *, (qta - qta_evasa) AS qta_rimanente FROM dt_ddt INNER JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt WHERE dt_ddt.id='.prepare($idddt).' HAVING qta_rimanente > 0';
$rs = $dbo->fetchArray($query);
if (!empty($rs)) {
echo '
<p>'.tr('Seleziona le righe che vuoi inserire nella fattura e la relativa quantità').'.</p><br/><br/>';
echo '
<form id="link_form" action="'.$rootdir.'/editor.php?id_module='.Modules::getModule($module_name)['id'].'&id_record='.$idddt.'" method="post">
<input type="hidden" name="idddt" value="'.$idddt.'">
<input type="hidden" name="idanagrafica" value="'.$idanagrafica.'">
<input type="hidden" name="idconto" value="'.$idconto.'">
<input type="hidden" name="idpagamento" value="'.$idpagamento.'">
<input type="hidden" name="op" value="fattura_da_ddt">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="dir" value="'.$dir.'">';
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "date", "label": "'.tr('Data fattura').'", "name": "data", "required": 1, "value": "-now-" ]}
</div>
</div>';
echo '
<div class="clearfix"></div>
<br>
<table class="table table-striped table-hover table-condensed">
<tr>
<th>'.tr('Descrizione').'</th>
<th width="10%%">'.tr('Q.').'</th>
<th width="15%">'.tr('Q. da evadere').'</th>
<th width="20%">'.tr('Subtot.').'</th>
<th width="10%">'.tr('Da evadere').'</th>
<th width="2%"></th>
</tr>';
$totale = 0.00;
foreach ($rs as $i => $r) {
// Descrizione
echo '
<tr>
<td>
<input type="hidden" name="idrigaddt[]" value="'.$r['id'].'" />
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo[]" value="'.$r['idarticolo'].'" />
<input type="hidden" id="descrizione_'.$i.'" name="descrizione[]"" value="'.$r['descrizione'].'" />
'.nl2br($r['descrizione']).'
<small>';
if ($r['lotto'] != '') {
echo '<br/>'.tr('Lotto').': '.$r['lotto'];
}
if ($r['serial'] != '') {
echo '<br/>'.tr('SN').': '.$r['serial'];
}
if ($r['altro'] != '') {
echo '<br/>'.$r['altro'];
}
echo '
</small>
</td>';
// Q.tà rimanente
echo '
<td id=truerimanente_'.$i.'">
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta'] - $r['qta_evasa']).'" />
<input type="hidden" id="um_'.$i.'" name="um[]" value="'.$r['um'].'" />
<p class="text-center">'.$r['qta_rimanente'].'</p>
</td>';
// Q.tà da evadere
echo '
<td>
<input class="form-control inputmask-decimal" type="text" id="qta_'.$i.'" name="qta_da_evadere[]" value="'.($r['qta'] - $r['qta_evasa']).'" onkeyup="ricalcola_subtotale_riga('.$i.');" />
</td>';
// Subtotale
$subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
$sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
$iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
echo '
<td>
<input type="hidden" id="subtot_'.$i.'" name="subtot[]" value="'.Translator::numberToLocale($r['subtotale'] / $r['qta']).'" />
<input type="hidden" id="sconto_'.$i.'" name="sconto[]" value="'.Translator::numberToLocale($r['sconto'] / $r['qta']).'" />
<input type="hidden" id="idiva_'.$i.'" name="idiva[]" value="'.$r['idiva'].'" />
<input type="hidden" id="iva_'.$i.'" name="iva[]" value="'.Translator::numberToLocale($r['iva'] / $r['qta']).'" />
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' &euro;</big><br/>
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).'</small>
</td>';
// Checkbox - da evadere?
echo '
<td>
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere[]" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />
</td>
</tr>';
$totale += $subtotale - $sconto + $iva;
}
// Totale
echo '
<tr>
<td colspan="4" align="right" class="text-right">
<b>Totale:</b>
</td>
<td class="text-right" colspan="2">
<big id="totale">'.Translator::numberToLocale($totale).' &euro;</big>
</td>
</tr>
</table>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" id="submit_btn" class="btn btn-primary pull-right">
<i class="fa fa-plus"></i> '.($dir == 'entrata' ? tr('Crea fattura di vendita') : tr('Crea fattura di acquisto')).'
</button>
</div>
</div>';
echo '
</form>';
} else {
echo '
<b>'.tr('Non ci sono articoli da evadere in questo ddt').'...</b>';
}
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';
?>
<script type="text/javascript">
function ricalcola_subtotale_riga( r ){
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
qta = $("#qta_"+r).val().toEnglish();
if( isNaN(qta) )
qta = 0;
qtamax = $("#qtamax_"+r).val().toEnglish();
if( isNaN(qtamax) )
qtamax = 0;
iva = $("#iva_"+r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if( qta>qtamax ){
qta = qtamax;
$('#qta_'+r).val( qta );
}
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
if( !$('#checked_'+r).is(':checked') )
qta = 0;
subtotale = (subtot*qta+iva*qta).toFixedLocale();
$("#subtotale_"+r).html(subtotale+" &euro;");
$("#subtotaledettagli_"+r).html( (subtot*qta).toFixed(2)+" + " + (iva*qta).toFixed(2) );
ricalcola_totale();
}
function ricalcola_totale(){
r = 0;
totale = 0.00;
$('input[id*=qta_]').each( function(){
qta = $(this).val().toEnglish();
if( !$('#checked_'+r).is(':checked') || isNaN(qta) )
qta = 0;
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
iva = $("#iva_"+r).val().toEnglish();
totale += subtot*qta+iva*qta;
r++;
});
$('#totale').html( (totale.toFixedLocale()) + " &euro;" );
if( totale==0 )
$('#submit_btn').hide();
else
$('#submit_btn').show();
}
</script>

View File

@ -157,7 +157,7 @@ if ($records[0]['stato'] != 'Evaso') {
if ($records[0]['stato'] != 'Evaso') {
?>
<a class="btn btn-sm btn-info" data-href="<?php echo $rootdir ?>/modules/ddt/creafattura.php?idddt=<?php echo $id_record ?>&dir=<?php echo $dir ?>" data-toggle="modal" data-title="Crea fattura" data-target="#bs-popup">
<a class="btn btn-sm btn-info" data-href="<?php echo $rootdir ?>/modules/fatture/crea_documento.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>&documento=fattura" data-toggle="modal" data-title="Crea fattura" data-target="#bs-popup">
<i class="fa fa-magic"></i> <?php echo tr('Crea fattura da ddt'); ?>...</i>
</a>
<?php

View File

@ -55,23 +55,19 @@ function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt)
global $dir;
// Leggo la quantità di questo articolo in ddt
$query = 'SELECT idgruppo, qta, subtotale FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
$query = 'SELECT qta, subtotale FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
$rs = $dbo->fetchArray($query);
$qta = floatval($rs[0]['qta']);
$subtotale = $rs[0]['subtotale'];
$idgruppo = $rs[0]['idgruppo'];
// Leggo l'idordine
$query = 'SELECT idordine FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
$rs = $dbo->fetchArray($query);
$idordine = $rs[0]['idordine'];
if ($dir == 'uscita') {
$non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM dt_righe_ddt WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idddt='.prepare($idddt))[0]['non_rimovibili'];
if ($non_rimovibili != 0) {
return false;
}
$non_rimovibili = seriali_non_rimuovibili('id_riga_ddt', $idrigaddt, $dir);
if (!empty($non_rimovibili)) {
return false;
}
// Ddt di vendita
@ -97,7 +93,7 @@ function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt)
$dbo->query($query);
// Elimino la riga dal ddt
$dbo->query('DELETE FROM `dt_righe_ddt` WHERE idgruppo='.prepare($idgruppo).' AND idddt='.prepare($idddt));
$dbo->query('DELETE FROM `dt_righe_ddt` WHERE id='.prepare($idrigaddt).' AND idddt='.prepare($idddt));
return true;
}
@ -274,7 +270,7 @@ function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto
* $qta float quantità dell'articolo nell'ordine
* $prezzo float prezzo totale degli articoli (prezzounitario*qtà).
*/
function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $lotto = '', $serial = '', $altro = '', $idgruppo = 0)
function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT')
{
global $dbo;
global $dir;
@ -300,20 +296,8 @@ function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $pr
if ($qta > 0) {
$rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo));
$qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1;
for ($i = 0; $i < $qta_in; ++$i) {
/*
$iva = $iva / $qta_in;
$qta = $qta / $qta_in;
$ubtotale = $subtotale / $qta_in;
$sconto = $sconto / $qta_in;
$iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile'];
*/
$dbo->query('INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, serial, um, idgruppo, `order`) VALUES ('.prepare($idddt).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($serial).', '.prepare($um).', '.prepare($idgruppo).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($idddt).'))');
}
$dbo->query('INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, um, `order`) VALUES ('.prepare($idddt).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($idddt).'))');
$idriga = $dbo->lastInsertedID();

View File

@ -19,31 +19,21 @@ echo '
/*
Articoli e righe generiche
*/
$q_art = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' GROUP BY idgruppo ORDER BY `order`';
$q_art = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' ORDER BY `order`';
$rs = $dbo->fetchArray($q_art);
if (!empty($rs)) {
foreach ($rs as $r) {
if (!empty($r['idarticolo'])) {
$qserial = 'SELECT * FROM dt_righe_ddt WHERE idddt='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']);
$rsserial = $dbo->fetchArray($qserial);
$mancanti = 0;
$serials = [];
if (!empty($r['abilita_serial'])) {
foreach ($rsserial as $seriali) {
$seriali['serial'] = trim($seriali['serial']);
if (!empty($seriali['serial'])) {
$serials[] = $seriali['serial'];
} else {
++$mancanti;
}
}
}
// Individuazione dei seriali
if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) {
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_ddt='.prepare($r['id'])), 'serial');
$mancanti = $r['qta'] - count($serials);
if ($mancanti > 0) {
$extra = 'class="warning"';
} else {
$mancanti = 0;
}
}
@ -60,20 +50,11 @@ if (!empty($rs)) {
echo '
<br><b><small class="text-danger">'.str_replace('_NUM_', $mancanti, tr('_NUM_ serial mancanti')).'</small></b>';
}
if (!empty($serials)) {
echo '
<br>'.tr('SN').': '.implode(', ', $serials);
}
} else {
if ($r['lotto'] != '') {
echo '<br>Lotto: '.$r['lotto'];
}
if ($r['serial'] != '') {
echo '<br>SN: '.$r['serial'];
}
if ($r['altro'] != '') {
echo '<br>'.$r['altro'];
}
}
} else {
echo nl2br($r['descrizione']);
@ -81,10 +62,20 @@ if (!empty($rs)) {
// Aggiunta riferimento a ordine
if (!empty($r['idordine'])) {
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM or_ordini WHERE id='.prepare($r['idordine']));
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data, dir FROM or_ordini JOIN or_tipiordine ON or_tipiordine.id = or_ordini.idtipoordine WHERE or_ordini.id='.prepare($r['idordine']));
$numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero'];
echo '<br>Rif. ordine n<sup>o</sup>'.$numero.' del '.Translator::dateToLocale($rso[0]['data']);
$ref = $rso[0]['dir'] == 'entrata' ? 'Ordini cliente' : 'Ordini fornitore';
$ref_id = $r['idordine'];
$descrizione = str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ordine _NUM_ del _DATE_'));
}
if(!empty($descrizione)){
echo '
<br>'.Modules::link($ref, $ref_id, $descrizione.' <i class="fa fa-external-link"></i>', $descrizione);
}
echo '
</td>';
@ -159,7 +150,7 @@ if (!empty($rs)) {
if (!empty($r['idarticolo']) && $r['abilita_serial']) {
echo "
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/ddt/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idgruppo='.$r['idgruppo'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
}
echo "

View File

@ -182,15 +182,24 @@ switch (post('op')) {
// eliminazione documento
case 'delete':
if ($dir == 'uscita') {
$non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM co_righe_documenti WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND iddocumento=".prepare($id_record))[0]['non_rimovibili'];
if ($non_rimovibili != 0) {
// Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino
$query = 'SELECT id, idarticolo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND NOT idarticolo=0 AND idpreventivo=0 AND idintervento IS NULL';
$rs = $dbo->fetchArray($query);
foreach ($rs as $value) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_documenti', $value['id'], $dir);
if (!empty($non_rimovibili)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
}
for ($i = 0; $i < sizeof($rs); ++$i) {
rimuovi_articolo_dafattura($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']);
}
// Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento"
$query = 'SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idpreventivo IS NOT NULL';
$rs = $dbo->fetchArray($query);
@ -207,14 +216,6 @@ switch (post('op')) {
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Completato') WHERE id=".prepare($rs[$i]['idintervento']));
}
// Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino
$query = 'SELECT id, idarticolo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND NOT idarticolo=0 AND idpreventivo=0 AND idintervento IS NULL';
$rs = $dbo->fetchArray($query);
for ($i = 0; $i < sizeof($rs); ++$i) {
rimuovi_articolo_dafattura($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']);
}
// Se delle righe sono state create da un ordine, devo riportare la quantità evasa nella tabella degli ordini al valore di prima, riaggiungendo la quantità che sto togliendo
$rs = $dbo->fetchArray('SELECT qta, descrizione, idarticolo, idordine, idiva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
foreach ($rs as $r) {
@ -267,11 +268,11 @@ switch (post('op')) {
// TODO: sistemare la duplicazione delle righe generiche e degli articoli, ingorando interventi, ddt, ordini, preventivi
/*
foreach ($righe as $riga) {
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idordine, idddt, idintervento, idarticolo, idpreventivo, idcontratto, idtecnico, idagente, idautomezzo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, um, qta, lotto, serial, altro, idgruppo, `order`) VALUES('.prepare($id_record).', 0, 0, 0, '.prepare($riga['idarticolo']).', '.prepare($riga['idpreventivo']).', '.prepare($riga['idcontratto']).', '.prepare($riga['idtecnico']).', '.prepare($riga['idagente']).', '.prepare($riga['idautomezzo']).', '.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['idritenutaacconto']).', '.prepare($riga['ritenutaacconto']).', '.prepare($riga['idrivalsainps']).', '.prepare($riga['rivalsainps']).', '.prepare($riga['um']).', '.prepare($riga['qta']).', '.prepare($riga['lotto']).', '.prepare($riga['serial']).', '.prepare($riga['altro']).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))');
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idordine, idddt, idintervento, idarticolo, idpreventivo, idcontratto, idtecnico, idagente, idautomezzo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, 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['idtecnico']).', '.prepare($riga['idagente']).', '.prepare($riga['idautomezzo']).', '.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['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).'))');
// Scarico/carico nuovamente l'articolo da magazzino
if (!empty($riga['idarticolo'])) {
add_articolo_infattura($id_record, $riga['idarticolo'], $riga['descrizione'], $riga['idiva'], $riga['qta'], $riga['subtotale'], 0, 0, 0);
add_articolo_infattura($id_record, $riga['idarticolo'], $riga['descrizione'], $riga['idiva'], $riga['qta'], $riga['subtotale']);
}
}
*/
@ -326,7 +327,10 @@ switch (post('op')) {
// 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_righe_contratti WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )');
for ($i = 0; $i < sizeof($rs2); ++$i) {
add_articolo_infattura($id_record, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $idiva, $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $idintervento, '', $rs2[$i]['serial']);
$riga = add_articolo_infattura($id_record, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $idiva, $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $idintervento);
// Lettura lotto, serial, altro dalla riga dell'ordine
$rs = $dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_intervento='.prepare($rs2[$i]['id']));
}
// Subtot
@ -358,7 +362,7 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).", 'km' ".prepare($km).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).", 'km' ".prepare($km).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}
@ -386,7 +390,7 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
$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, idgruppo, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).", 0, 0, 'UNT', ".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).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$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, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).", 0, 0, 'UNT', ".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).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}
}
@ -415,7 +419,7 @@ switch (post('op')) {
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
// Aggiunta riga intervento sul documento
$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, idgruppo, `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_unitario).', '.prepare($tipo_sconto).", '-', ".prepare($qta).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$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, `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_unitario).', '.prepare($tipo_sconto).", '-', ".prepare($qta).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
if ($dbo->query($query)) {
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
@ -496,7 +500,6 @@ switch (post('op')) {
'sconto' => $riga['sconto'],
'sconto_unitario' => $riga['sconto_unitario'],
'#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).')',
'#idgruppo' => '(SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).')',
'idritenutaacconto' => get_var("Percentuale ritenuta d'acconto"),
'ritenutaacconto' => $ritenutaacconto,
'idrivalsainps' => get_var('Percentuale rivalsa INPS'),
@ -509,7 +512,7 @@ switch (post('op')) {
}
} else {
// Aggiunta riga preventivo sul documento
$query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, idconto, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, `order`, idgruppo) VALUES('.prepare($id_record).', '.prepare($idpreventivo).', '.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).'), (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, 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).', '.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);
// Aggiorno lo stato degli interventi collegati al preventivo se ce ne sono
@ -580,7 +583,7 @@ switch (post('op')) {
$ritenutaacconto = ($prezzo - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
// Aggiunta riga contratto sul documento
$query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($idconto).', '.prepare($idiva).', '.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 rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($idconto).', '.prepare($idiva).', '.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 rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
if ($dbo->query($query)) {
$_SESSION['infos'][] = str_replace('_NUM_', $numero, tr('Contratto _NUM_ aggiunto!'));
@ -619,11 +622,7 @@ switch (post('op')) {
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
// Calcolo idgruppo per questo inserimento
$ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM co_righe_documenti WHERE iddocumento = '.prepare($id_record));
$idgruppo = $ridgruppo[0]['idgruppo'];
add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $lotto, $serial, $altro, $idgruppo, $idconto, $idum);
add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $idconto, $idum);
$_SESSION['infos'][] = tr('Articolo aggiunto!');
}
@ -664,12 +663,8 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
$ritenutaacconto = (($prezzo * $qta) + $rivalsainps) / 100 * $rs[0]['percentuale'];
// Calcolo idgruppo per questo inserimento
$ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM co_righe_documenti WHERE iddocumento = '.prepare($id_record));
$idgruppo = $ridgruppo[0]['idgruppo'];
// Aggiunta riga generica sul documento
$query = 'INSERT INTO co_righe_documenti(iddocumento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(post('idrivalsainps')).', '.prepare($rivalsainps).', '.prepare(post('idritenutaacconto')).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$query = 'INSERT INTO co_righe_documenti(iddocumento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(post('idrivalsainps')).', '.prepare($rivalsainps).', '.prepare(post('idritenutaacconto')).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Riga aggiunta!');
@ -705,13 +700,21 @@ switch (post('op')) {
$subtot = $prezzo * $qta;
// Lettura idarticolo dalla riga documento
$rs = $dbo->fetchArray('SELECT idgruppo, iddocumento, idarticolo, qta, abilita_serial FROM co_righe_documenti WHERE id='.prepare($idriga));
$rs = $dbo->fetchArray('SELECT iddocumento, idarticolo, qta, abilita_serial FROM co_righe_documenti WHERE id='.prepare($idriga));
$idarticolo = $rs[0]['idarticolo'];
$old_qta = $rs[0]['qta'];
$idgruppo = $rs[0]['idgruppo'];
$iddocumento = $rs[0]['iddocumento'];
$abilita_serial = $rs[0]['abilita_serial'];
// Controllo per gestire i serial
if (!empty($idarticolo)) {
if (!controlla_seriali('id_riga_documento', $idriga, $old_qta, $qta, $dir)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
}
// Calcolo iva
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
$rs = $dbo->fetchArray($query);
@ -730,42 +733,11 @@ switch (post('op')) {
$ritenutaacconto = (($prezzo * $qta) - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
// Modifica riga generica sul documento
$query = 'UPDATE co_righe_documenti SET idconto='.prepare($idconto).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', idritenutaacconto='.prepare(post('idritenutaacconto')).', ritenutaacconto='.prepare($ritenutaacconto).', idrivalsainps='.prepare(post('idrivalsainps')).', rivalsainps='.prepare($rivalsainps).' WHERE idgruppo='.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento);
$query = 'UPDATE co_righe_documenti SET idconto='.prepare($idconto).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', idritenutaacconto='.prepare(post('idritenutaacconto')).', ritenutaacconto='.prepare($ritenutaacconto).', idrivalsainps='.prepare(post('idrivalsainps')).', rivalsainps='.prepare($rivalsainps).', qta='.prepare($qta).' WHERE id='.prepare($idriga).' AND iddocumento='.prepare($iddocumento);
if ($dbo->query($query)) {
// Modifica della quantità
$dbo->query('UPDATE co_righe_documenti SET qta='.prepare($qta).' WHERE idgruppo='.prepare($idgruppo));
// Modifica per gestire i serial
if (!empty($idarticolo)) {
$new_qta = $qta - $old_qta;
$new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta;
if (!empty($abilita_serial)) {
if ($old_qta < $qta) {
for ($i = 0; $i < $new_qta; ++$i) {
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) SELECT iddocumento, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order` FROM co_righe_documenti WHERE id='.prepare($idriga));
}
} else {
if ($dir == 'uscita') {
if ($new_qta > $dbo->fetchArray("SELECT COUNT(*) AS rimovibili FROM co_righe_documenti WHERE serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND iddocumento='.prepare($iddocumento))[0]['rimovibili']) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
} else {
$deletes = $dbo->fetchArray('SELECT id FROM co_righe_documenti AS t WHERE idgruppo = '.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento)." AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') ORDER BY serial ASC LIMIT ".$new_qta);
}
} else {
$deletes = $dbo->fetchArray('SELECT id FROM co_righe_documenti AS t WHERE idgruppo = '.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento).' ORDER BY serial ASC LIMIT '.$new_qta);
}
foreach ((array) $deletes as $delete) {
$dbo->query('DELETE FROM co_righe_documenti WHERE id = '.prepare($delete['id']));
}
}
}
$new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta;
$new_qta = ($dir == 'entrata') ? -$new_qta : $new_qta;
add_movimento_magazzino($idarticolo, $new_qta, ['iddocumento' => $id_record]);
}
@ -809,7 +781,7 @@ switch (post('op')) {
for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) {
// Processo solo le righe da evadere
if ($post['evadere'][$i] == 'on') {
$idrigaddt = post('idrigaddt')[$i];
$idrigaddt = post('idriga')[$i];
$idarticolo = post('idarticolo')[$i];
$descrizione = post('descrizione')[$i];
$qta = $post['qta_da_evadere'][$i];
@ -819,7 +791,7 @@ switch (post('op')) {
$sconto = $sconto * $qta;
$idiva = post('idiva')[$i];
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM dt_righe_ddt WHERE id='.$idrigaddt;
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
$rsprc = $dbo->fetchArray($qprc);
$sconto_unitario = $rsprc[0]['sconto_unitario'];
@ -837,31 +809,19 @@ switch (post('op')) {
$rs = $dbo->fetchArray($q);
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
// Lettura lotto, serial, altro dalla riga dell'ordine
$q = 'SELECT lotto, serial, altro, descrizione FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
$rs = $dbo->fetchArray($q);
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
if (!empty($idarticolo)) {
$idiva_acquisto = $idiva;
$prezzo_acquisto = $subtot;
add_articolo_infattura($id_record, $idarticolo, $rs[0]['descrizione'], $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto, $rs[0]['lotto'], $rs[0]['serial'], $rs[0]['altro'], $rs[0]['idgruppo']);
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
// Aggiornamento seriali dalla riga dell'ordine
$dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => (array) $post['serial'][$i]]);
}
// Inserimento riga normale
elseif ($qta != 0) {
// Se la riga che sto inserendo è simile ad altre già inserite, aggiorno solo la quantità...
$query = 'SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND descrizione='.prepare($descrizione).' AND (subtotale/qta)='.($subtot / $qta).' AND um='.prepare($um).' AND sconto='.prepare($sconto / $qta).' AND idiva='.prepare($idiva);
$rs = $dbo->fetchArray($query);
if (sizeof($rs) > 0) {
$query = 'UPDATE co_righe_documenti SET qta=qta+'.$qta.' WHERE id='.prepare($rs[0]['id']);
}
// ...altrimenti aggiungo una nuova riga
else {
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
}
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}
@ -899,7 +859,7 @@ switch (post('op')) {
for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) {
// Processo solo le righe da evadere
if ($post['evadere'][$i] == 'on') {
$idrigaordine = post('idrigaordine')[$i];
$idrigaordine = post('idriga')[$i];
$idarticolo = post('idarticolo')[$i];
$descrizione = post('descrizione')[$i];
$qta = post('qta_da_evadere')[$i];
@ -926,15 +886,14 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
$desc_iva = $rs[0]['descrizione'];
// Lettura lotto, serial, altro dalla riga dell'ordine
$q = 'SELECT lotto, serial, altro, descrizione FROM or_righe_ordini WHERE id='.prepare($idrigaordine);
$rs = $dbo->fetchArray($q);
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
if (!empty($idarticolo)) {
$idiva_acquisto = $idiva;
$prezzo_acquisto = $subtot;
$idriga = add_articolo_infattura($id_record, $idarticolo, $rs[0]['descrizione'], $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto, '0', $rs[0]['lotto'], $rs[0]['serial'], $rs[0]['altro']);
$idriga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
// Aggiornamento seriali dalla riga dell'ordine
$dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => (array) $post['serial'][$i]]);
// Imposto la provenienza dell'ordine
$dbo->query('UPDATE co_righe_documenti SET idordine='.prepare($idordine).' WHERE id='.prepare($idriga));
@ -942,7 +901,7 @@ switch (post('op')) {
// Inserimento riga normale
elseif ($qta != 0) {
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))');
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))');
$idriga = $dbo->lastInsertedID();
}
@ -958,7 +917,7 @@ switch (post('op')) {
// aggiungi righe da ddt
case 'add_ddt':
$idddt = $post['idddt'];
$idddt = $post['iddocumento'];
$rs = $dbo->fetchArray('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
$idconto = $rs[0]['idconto'];
@ -967,7 +926,7 @@ switch (post('op')) {
for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) {
// Processo solo le righe da evadere
if ($post['evadere'][$i] == 'on') {
$idrigaddt = post('idrigaddt')[$i];
$idrigaddt = post('idriga')[$i];
$idarticolo = post('idarticolo')[$i];
$descrizione = post('descrizione')[$i];
@ -997,20 +956,19 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
$desc_iva = $rs[0]['descrizione'];
// Lettura lotto, serial, altro dalla riga dell'ordine
$q = 'SELECT lotto, serial, altro, descrizione FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
$rs = $dbo->fetchArray($q);
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
if (!empty($idarticolo)) {
$idiva_acquisto = $idiva;
$prezzo_acquisto = $subtot;
add_articolo_infattura($id_record, $idarticolo, $rs[0]['descrizione'], $idiva_acquisto, $qta, $prezzo_acquisto, 0, 0, 'UNT', 0, $rs[0]['lotto'], $rs[0]['serial'], $rs[0]['altro'], 0, $idconto);
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, 0, 0, 'UNT', 0, $idconto);
// Lettura lotto, serial, altro dalla riga dell'ddt
$rs = $dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_ddt='.prepare($idrigaddt));
}
// Inserimento riga normale
elseif ($qta != 0) {
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}
@ -1031,13 +989,12 @@ switch (post('op')) {
$idriga = post('idriga');
// Lettura preventivi collegati
$query = 'SELECT idgruppo, iddocumento, idintervento FROM co_righe_documenti WHERE id='.prepare($idriga);
$query = 'SELECT iddocumento, idintervento FROM co_righe_documenti WHERE id='.prepare($idriga);
$rsp = $dbo->fetchArray($query);
$id_record = $rsp[0]['iddocumento'];
$idgruppo = $rsp[0]['idgruppo'];
$idintervento = $rsp[0]['idintervento'];
$query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo);
$query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga);
$dbo->query($query);
@ -1073,9 +1030,7 @@ switch (post('op')) {
$idriga = post('idriga');
$idarticolo = post('idarticolo');
$res = rimuovi_articolo_dafattura($idarticolo, $id_record, $idriga);
if (!$res) {
if (!rimuovi_articolo_dafattura($idarticolo, $id_record, $idriga)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
@ -1100,13 +1055,12 @@ switch (post('op')) {
$idriga = post('idriga');
// Lettura preventivi collegati
$query = 'SELECT idgruppo, iddocumento, idpreventivo FROM co_righe_documenti WHERE id='.prepare($idriga);
$query = 'SELECT iddocumento, idpreventivo FROM co_righe_documenti WHERE id='.prepare($idriga);
$rsp = $dbo->fetchArray($query);
$id_record = $rsp[0]['iddocumento'];
$idgruppo = $rsp[0]['idgruppo'];
$idpreventivo = $rsp[0]['idpreventivo'];
$query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo);
$query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga);
if ($dbo->query($query)) {
// Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento"
@ -1230,16 +1184,18 @@ switch (post('op')) {
break;
case 'add_serial':
$idgruppo = $post['idgruppo'];
$serial = $post['serial'];
$idriga = $post['idriga'];
$idarticolo = $post['idarticolo'];
$q = 'SELECT * FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id';
$rs = $dbo->fetchArray($q);
foreach ($rs as $i => $r) {
$dbo->query('UPDATE co_righe_documenti SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id']));
$serials = (array) $post['serial'];
foreach ($serials as $key => $value) {
if (empty($value)) {
unset($serials[$key]);
}
}
$dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
break;
case 'update_position':

View File

@ -37,6 +37,6 @@ echo '
$('#id_ddt').change( function(){
$('#righeddt').html('<i>Caricamento in corso...</i>');
$('#righeddt').load(globals.rootdir + '/modules/fatture/add_ddt_righe.php?id_module=' + globals.id_module + '&id_record=' + globals.id_record + '&idddt=' + $(this).find('option:selected').val());
$('#righeddt').load(globals.rootdir + '/modules/fatture/crea_documento.php?id_module=' + <?php echo Modules::getModule('Ddt di vendita')['id'] ?> + '&id_record=' + $(this).find('option:selected').val() + '&documento=fattura&op=add_ddt&iddocumento=' + globals.id_record);
});
</script>

View File

@ -1,216 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
if ($module['name'] == 'Fatture di vendita') {
$dir = 'entrata';
} else {
$dir = 'uscita';
}
$idddt = get('idddt');
// Info documento
$q = 'SELECT * FROM dt_ddt WHERE id='.prepare($idddt);
$rs = $dbo->fetchArray($q);
$numero = $rs[0]['numero'];
$idanagrafica = $rs[0]['idanagrafica'];
$idpagamento = $rs[0]['idpagamento'];
$idconto = $rs[0]['idconto'];
/*
Form di inserimento riga documento
*/
echo '
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<input type="hidden" name="op" value="add_ddt">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="dir" value="'.$dir.'">
<input type="hidden" name="idddt" value="'.$idddt.'">';
// Selezione righe ddt da portare nella fattura
$query = "SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice FROM dt_ddt INNER JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt WHERE dt_ddt.id=".prepare($idddt).' AND (qta - qta_evasa) > 0';
$rs = $dbo->fetchArray($query);
if (!empty($rs)) {
echo '
<p>'.tr('Seleziona le righe che vuoi inserire nella fattura e la quantità').':</p>
<table class="table table-striped table-hover table-condensed">
<tr>
<th>'.tr('Descrizione').'</th>
<th width="10%">'.tr('Q.').'</th>
<th width="20%" class="text-center">'.tr('Q. da evadere').'</th>
<th width="25%" class="text-right">'.tr('Subtot.').'</th>
<th width="15%" class="text-right">'.tr('Da evadere').'</th>
</tr>';
$totale = 0.00;
foreach ($rs as $i => $r) {
// Descrizione
echo '
<tr>
<td class="text-left">
<input type="hidden" name="idrigaddt[]" value="'.$r['id'].'"/>
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo[]" value="'.$r['idarticolo'].'"/>
<input type="hidden" id="descrizione_'.$i.'" name="descrizione[]" value="'.$r['descrizione'].'"/>';
if ($r['codice'] != '') {
echo '
<b>'.$r['codice'].'</b><br/>';
}
echo '
'.nl2br($r['descrizione']).'
<small>';
if ($r['lotto'] != '') {
echo '
<br/>Lotto: '.$r['lotto'];
}
if ($r['serial'] != '') {
echo '
<br/>SN: '.$r['serial'];
}
if ($r['altro'] != '') {
echo '
<br/>'.$r['altro'];
}
echo '
</small>
</td>';
// Q.tà rimanente
echo '
<td class="text-center" id="rimanente_'.$i.'">
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta'] - $r['qta_evasa']).'"/>
<input type="hidden" id="um_'.$i.'" name="um[]" value="'.$r['um'].'"/>
'.Translator::numberToLocale(($r['qta'] - $r['qta_evasa'])).'
</td>';
// Q.tà da evadere
echo '
<td class="text-left">
{[ "type": "number", "name": "qta_da_evadere[]", "id": "qta_'.$i.'", "value": "'.($r['qta'] - $r['qta_evasa']).'", "decimals": "qta", "extra": "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"" ]}
</td>';
// Subtotale
$subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
$sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
$iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
echo '
<td class="text-right">
<input type="hidden" id="subtot_'.$i.'" name="subtot[]" value="'.Translator::numberToLocale($r['subtotale'] / $r['qta']).'" />
<input type="hidden" id="sconto_'.$i.'" name="sconto[]" value="'.Translator::numberToLocale($r['sconto'] / $r['qta']).'" />
<input type="hidden" id="idiva_'.$i.'" name="idiva[]" value="'.$r['idiva'].'" />
<input type="hidden" id="iva_'.$i.'" name="iva[]" value="'.Translator::numberToLocale($r['iva'] / $r['qta']).'" />
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' &euro;</big><br/><small style="color:#777;" id="subtotaledettagli_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).'</small>
</td>';
// Checkbox - da evadere?
echo '
<td class="text-right">
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere[]" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />
</td>
</tr>';
$totale += $subtotale - $sconto + $iva;
}
// Totale
echo '
<tr>
<td colspan="4" align="right" class="text-right">
<b>Totale:</b>
</td>
<td class="text-right" colspan="2">
<big id="totale">'.Translator::numberToLocale($totale).' &euro;</big>
</td>
</tr>';
echo '
</table>';
} else {
echo '
<p>'.tr('Non ci sono articoli da evadere in questo ddt').'...</p>';
}
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';
?>
<script type="text/javascript">
function ricalcola_subtotale_riga( r ){
subtot = $("#subtot_" + r).val().toEnglish();
sconto = $("#sconto_" + r).val().toEnglish();
subtot = subtot - sconto;
qta = $("#qta_" + r).val().toEnglish();
if(isNaN(qta)) qta = 0;
qtamax = $("#qtamax_" + r).val().toEnglish();
if(isNaN(qtamax)) qtamax = 0;
iva = $("#iva_" + r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if(qta > qtamax){
qta = qtamax;
$('#qta_' + r).val(qta);
}
if(qta == 0) $('#checked_' + r).prop("checked", false);
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
if(!$('#checked_' + r).is(':checked')) qta = 0;
subtotale = (subtot * qta + iva * qta).toFixedLocale();
$("#subtotale_" + r).html(subtotale + " &euro;");
$("#subtotaledettagli_" + r).html((subtot * qta).toFixed(2) + " + " + (iva * qta).toFixed(2));
ricalcola_totale();
}
function ricalcola_totale(){
r = 0;
totale = 0.00;
$('input[id*=qta_]').each( function(){
qta = $(this).val().toEnglish();
if( !$('#checked_' + r).is(':checked') || isNaN(qta) )
qta = 0;
subtot = $("#subtot_" + r).val().toEnglish();
sconto = $("#sconto_" + r).val().toEnglish();
subtot = subtot-sconto;
iva = $("#iva_" + r).val().toEnglish();
totale += subtot*qta+iva*qta;
r++;
});
$('#totale').html( (totale.toFixedLocale()) + " &euro;" );
}
</script>

View File

@ -4,91 +4,123 @@ include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
if ($module['name'] == 'Fatture di vendita') {
// Controllo sulla direzione monetaria
$entrate = [
'Fatture di vendita',
'Ddt di vendita',
'Ordini cliente',
];
if (in_array($module['name'], $entrate)) {
$dir = 'entrata';
} else {
$dir = 'uscita';
}
$idarticolo = get('idarticolo');
$idgruppo = get('idgruppo');
$data = [
'fat' => [
'table' => 'co_righe_documenti',
'id' => 'iddocumento',
],
'ddt' => [
'table' => 'dt_righe_ddt',
'id' => 'idddt',
],
'ord' => [
'table' => 'or_righe_ordini',
'id' => 'idordine',
],
'int' => [
'table' => 'mg_articoli_interventi',
'id' => 'idintervento',
],
];
$q2 = 'SELECT * FROM co_righe_documenti INNER JOIN mg_articoli ON co_righe_documenti.idarticolo=mg_articoli.id WHERE co_righe_documenti.iddocumento='.prepare($id_record).' AND co_righe_documenti.idgruppo='.prepare($idgruppo);
$rs2 = $dbo->fetchArray($q2);
// Individuazione delle tabelle interessate
if (in_array($module['name'], ['Fatture di vendita', 'Fatture di acquisto'])) {
$modulo = 'fat';
} elseif (in_array($module['name'], ['Ddt di vendita', 'Ddt di acquisto'])) {
$modulo = 'ddt';
} elseif (in_array($module['name'], ['Ordini cliente', 'Ordini fornitore'])) {
$modulo = 'ord';
} else {
$modulo = 'int';
}
$table = $data[$modulo]['table'];
$id = $data[$modulo]['id'];
$riga = str_replace('id', 'id_riga_', $id);
$idarticolo = get('idarticolo');
$idriga = get('idriga');
$rs = $dbo->fetchArray('SELECT mg_articoli.codice, mg_articoli.descrizione, '.$table.'.qta FROM '.$table.' INNER JOIN mg_articoli ON '.$table.'.idarticolo=mg_articoli.id WHERE '.$table.'.'.$id.'='.prepare($id_record).' AND '.$table.'.id='.prepare($idriga));
echo '
<p>'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'</p>
<p>'.tr('Articolo').': '.$rs[0]['codice'].' - '.$rs[0]['descrizione'].'</p>
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<input type="hidden" name="op" value="add_serial">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="idgruppo" value="'.$rs2[0]['idgruppo'].'">
<input type="hidden" name="idriga" value="'.$idriga.'">
<input type="hidden" name="idarticolo" value="'.$idarticolo.'">
<input type="hidden" name="dir" value="'.$dir.'">';
$serials = [];
$array = array_column($rs2, 'serial');
foreach ($array as $value) {
if (!empty($value)) {
$serials[] = $value;
}
}
$info = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE serial IS NOT NULL AND '.$riga.'='.prepare($idriga));
$serials = array_column($info, 'serial');
if ($dir == 'entrata') {
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'fat-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]}
{[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir=\'entrata\' AND '.$riga.' != \''.$idriga.'\')", "extra": "data-maximum=\"'.intval($rs[0]['qta']).'\"" ]}
</div>
</div>';
} else {
echo '
<p>'.tr('Inserisci i numeri seriali degli articoli aggiunti:').'</p>';
foreach ($array as $key => $serial) {
if ($key % 3 == 0) {
for ($i = 0; $i < $rs[0]['qta']; ++$i) {
if ($i % 3 == 0) {
echo '
<div class="row">';
}
$res = $dbo->fetchArray("SELECT record FROM vw_serials WHERE dir='entrata' AND serial = ".prepare($serial));
$res = $dbo->fetchArray("SELECT * FROM mg_prodotti WHERE dir='entrata' AND serial = ".prepare($serials[$i]));
echo '
<div class="col-md-4">
{[ "type": "text", "name": "serial[]", "value": "'.$serial.'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}';
{[ "type": "text", "name": "serial[]", "value": "'.$serials[$i].'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}';
if(!empty($res)){
$pieces = explode('-', $res[0]['record']);
switch($pieces[0]){
case 'int':
$modulo = 'Interventi';
break;
case 'ddt':
$modulo = 'Ddt di vendita';
break;
case 'fat':
$modulo = 'Fatture di vendita';
break;
case 'ord':
$modulo = 'Ordini cliente';
break;
if (!empty($res)) {
if (!empty($res[0]['id_riga_intervento'])) {
$modulo = 'Interventi';
$pos = 'int';
} elseif (!empty($res[0]['id_riga_ddt'])) {
$modulo = 'Ddt di vendita';
$pos = 'ddt';
} elseif (!empty($res[0]['id_riga_documento'])) {
$modulo = 'Fatture di vendita';
$pos = 'fat';
} elseif (!empty($res[0]['id_riga_ordine'])) {
$modulo = 'Ordini cliente';
$pos = 'ord';
}
$r = $dbo->select($data[$pos]['table'], $data[$pos]['id'], ['id' => $res[0][str_replace('id', 'id_riga_', $data[$pos]['id'])]]);
echo '
'.Modules::link($modulo, $pieces[1], tr('Visualizza vendita').' <i class="fa fa-external-link"></i>', null);
'.Modules::link($modulo, $r[0][$data[$pos]['id']], tr('Visualizza vendita').' <i class="fa fa-external-link"></i>', null);
}
echo '
</div>';
if (($key + 1) % 3 == 0) {
if (($i + 1) % 3 == 0) {
echo '
</div>
<br>';
}
}
if (($key + 1) % 3 != 0) {
if ($i % 3 != 0) {
echo '
</div>';
}

View File

@ -0,0 +1,289 @@
<?php
include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
$data = [
'ddt' => [
'table' => 'dt_ddt',
'rows' => 'dt_righe_ddt',
'id' => 'idddt',
'condition' => '(id_riga_documento IS NOT NULL)',
],
'ord' => [
'table' => 'or_ordini',
'rows' => 'or_righe_ordini',
'id' => 'idordine',
'condition' => '(id_riga_ddt IS NOT NULL OR id_riga_documento IS NOT NULL)',
],
];
$documento = get('documento');
if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ordini fornitore') {
$pos = 'ord';
$op = ($documento == 'ddt') ? 'ddt_da_ordine' : 'fattura_da_ordine';
$head = tr('Ordine numero _NUM_');
} else {
$pos = 'ddt';
$op = 'fattura_da_ddt';
$head = tr('Ddt numero _NUM_');
}
$table = $data[$pos]['table'];
$rows = $data[$pos]['rows'];
$id = $data[$pos]['id'];
$row = str_replace('id', 'id_riga_', $id);
if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ddt di vendita') {
$dir = 'entrata';
} else {
$dir = 'uscita';
}
if ($module['name'] == 'Ordini cliente') {
$module_name = ($documento == 'ddt') ? 'Ddt di vendita' : 'Fatture di vendita';
} elseif ($module['name'] == 'Ordini fornitore') {
$module_name = ($documento == 'ddt') ? 'Ddt di acquisto' : 'Fatture di acquisto';
} elseif ($module['name'] == 'Ddt di acquisto') {
$module_name = 'Fatture di acquisto';
} elseif ($module['name'] == 'Ddt di vendita') {
$module_name = 'Fatture di vendita';
}
$op = !empty($get['op']) ? $get['op'] : $op;
$button = ($documento == 'ddt') ? tr('Crea ddt') : tr('Crea fattura');
$button = !empty($get['op']) ? tr('Aggiungi') : $button;
// Info documento
$rs = $dbo->fetchArray('SELECT * FROM '.$table.' WHERE id='.prepare($id_record));
$numero = !empty($rs[0]['numero_esterno']) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
$idanagrafica = $rs[0]['idanagrafica'];
$idpagamento = $rs[0]['idpagamento'];
$idconto = $rs[0]['idconto'];
/*
Form di inserimento riga documento
*/
echo '
<p>'.str_replace('_NUM_', $numero, $head).'.</p>';
// Selezione articoli dell'ordine da portare nel ddt
$rs = $dbo->fetchArray('SELECT *, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0');
if (!empty($rs)) {
echo '
<p>'.tr('Seleziona le righe che vuoi inserire nel documento e la quantità').'.</p>
<form action="'.$rootdir.'/editor.php?id_module='.Modules::getModule($module_name)['id'].(!empty($get['iddocumento']) ? '&id_record='.$get['iddocumento'] : '').'" method="post">
<input type="hidden" name="'.$id.'" value="'.$id_record.'">
<input type="hidden" name="idanagrafica" value="'.$idanagrafica.'">
<input type="hidden" name="idconto" value="'.$idconto.'">
<input type="hidden" name="idpagamento" value="'.$idpagamento.'">
<input type="hidden" name="iddocumento" value="'.$id_record.'">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="dir" value="'.$dir.'">';
if (empty($get['op'])) {
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]}
</div>
</div>';
}
echo '
<div class="clearfix"></div>
<br>
<table class="table table-striped table-hover table-condensed">
<tr>
<th>'.tr('Descrizione').'</th>
<th width="10%">'.tr('Q.').'</th>
<th width="15%">'.tr('Q. da evadere').'</th>
<th width="20%">'.tr('Subtot.').'</th>
<th width="20%">'.tr('Seriali').'</th>
</tr>';
$totale = 0.00;
foreach ($rs as $i => $r) {
// Descrizione
echo '
<tr>
<td>
<input type="hidden" name="idriga[]" value="'.$r['id'].'" />
<input type="hidden" name="abilita_serial[]" value="'.$r['abilita_serial'].'" />
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo[]" value="'.$r['idarticolo'].'" />
<input type="hidden" id="descrizione_'.$i.'" name="descrizione[]" value="'.$r['descrizione'].'" />';
// Checkbox - da evadere?
echo '
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere[]" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />';
echo nl2br($r['descrizione']);
echo '
</td>';
// Q.tà rimanente
echo '
<td>
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta'] - $r['qta_evasa']).'" />
<input type="hidden" id="um_'.$i.'" name="um[]" value="'.$r['um'].'" />
<p class="text-center">'.Translator::numberToLocale($r['qta_rimanente']).'</p>
</td>';
// Q.tà da evadere
echo '
<td>
{[ "type": "number", "name": "qta_da_evadere[]", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "extra" : "onchange=\"ricalcola_subtotale_riga('.$i.');\"" ]}
</td>';
// Subtotale
$subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
$sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
$iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
echo '
<td>
<input type="hidden" id="subtot_'.$i.'" name="subtot[]" value="'.($r['subtotale'] / $r['qta']).'" />
<input type="hidden" id="sconto_'.$i.'" name="sconto[]" value="'.($r['sconto'] / $r['qta']).'" />
<input type="hidden" id="idiva_'.$i.'" name="idiva[]" value="'.$r['idiva'].'" />
<input type="hidden" id="iva_'.$i.'" name="iva[]" value="'.($r['iva'] / $r['qta']).'" />
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' &euro;</big><br/>
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).'</small>
</td>';
// Seriali
echo '
<td>';
if (!empty($r['abilita_serial'])) {
echo '
{[ "type": "select", "name": "serial['.$i.'][]", "id": "serial_'.$i.'", "multiple": 1, "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$data[$pos]['condition'].' AND dir=\''.$dir.'\')", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}
';
} else {
echo '-';
}
echo '
</td>
</tr>';
$totale += $subtotale - $sconto + $iva;
}
// Totale
echo '
<tr>
<td colspan="4" align="right" class="text-right">
<b>'.tr('Totale').':</b>
</td>
<td class="text-right" colspan="2">
<big id="totale">'.Translator::numberToLocale($totale).' &euro;</big>
</td>
</tr>
</table>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" id="submit_btn" class="btn btn-primary pull-right">
<i class="fa fa-plus"></i> '.$button.'
</button>
</div>
</div>
</form>';
} else {
echo '
<p>'.tr('Non ci sono articoli da evadere').'...</p>';
}
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';
?>
<script type="text/javascript">
function ricalcola_subtotale_riga( r ){
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
qta = $("#qta_"+r).val().toEnglish();
if( isNaN(qta) ){
qta = 0;
}
qtamax = $("#qtamax_"+r).val().toEnglish();
if( isNaN(qtamax) ){
qtamax = 0;
}
iva = $("#iva_"+r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if( qta>qtamax ){
qta = qtamax.toFixedLocale(2);
$('#qta_'+r).val( qta );
}
$("#serial_"+r).selectClear();
$("#serial_"+r).select2("destroy");
$("#serial_"+r).data('maximum', qta);
start_superselect();
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
if( !$('#checked_'+r).is(':checked') ){
qta = 0;
}
subtotale = (subtot*qta+iva*qta).toFixedLocale(2);
$("#subtotale_"+r).html(subtotale+" &euro;");
$("#subtotaledettagli_"+r).html( (subtot*qta).toFixed(2)+" + " + (iva*qta).toFixed(2) );
ricalcola_totale();
}
function ricalcola_totale(){
r = 0;
totale = 0.00;
$('input[id*=qta_]').each( function(){
qta = $(this).val().toEnglish();
if( !$('#checked_'+r).is(':checked') || isNaN(qta) ){
qta = 0;
}
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
iva = $("#iva_"+r).val().toEnglish();
totale += subtot*qta+iva*qta;
r++;
});
$('#totale').html( (totale.toFixedLocale()) + " &euro;" );
if( totale==0 )
$('#submit_btn').hide();
else
$('#submit_btn').show();
}
</script>

View File

@ -2,6 +2,12 @@
include_once __DIR__.'/../../core.php';
if (isset($id_record)) {
$records = $dbo->fetchArray('SELECT *, co_documenti.idagente AS idagente_fattura, co_documenti.note, co_documenti.note_aggiuntive, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc`, (SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc, (SELECT descrizione FROM co_rivalsainps WHERE id=idrivalsainps) AS rivalsainps_desc FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($id_record));
if ($module['name'] == 'Fatture di vendita') {
$dir = 'entrata';
} else {
$dir = 'uscita';
}
if (isset($id_record)) {
$records = $dbo->fetchArray('SELECT *, co_documenti.idagente AS idagente_fattura, co_documenti.note, co_documenti.note_aggiuntive, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc`, (SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc, (SELECT descrizione FROM co_rivalsainps WHERE id=idrivalsainps) AS rivalsainps_desc FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir = '.prepare($dir).' AND co_documenti.id='.prepare($id_record));
}

View File

@ -597,7 +597,7 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu
* $prezzo float prezzo totale dell'articolo (prezzounitario*qtà)
* $idintervento integer id dell'intervento da cui arriva l'articolo (per non creare casini quando si rimuoverà un articolo dalla fattura).
*/
function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $lotto = '', $serial = '', $altro = '', $idgruppo = 0, $idconto = 0, $idum = 0)
function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $idconto = 0, $idum = 0)
{
global $dbo;
global $dir;
@ -616,10 +616,6 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva,
$um = $idum;
}
if (empty($idgruppo)) {
$idgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(`idgruppo`) + 1, 0) AS idgruppo FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento))[0]['idgruppo'];
}
// Lettura iva dell'articolo
$rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
$iva = ($prezzo - $sconto) / 100 * $rs2[0]['percentuale'];
@ -627,21 +623,8 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva,
if ($qta > 0) {
$rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo));
$qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1;
for ($i = 0; $i < $qta_in; ++$i) {
/*
$iva = $iva / $qta_in;
$qta = $qta / $qta_in;
$ubtotale = $subtotale / $qta_in;
$sconto = $sconto / $qta_in;
$iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile'];
*/
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, serial, idconto, um, idgruppo, `order`) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($serial).', '.prepare($idconto).', '.prepare($um).', '.prepare($idgruppo).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'))');
}
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, idconto, um, `order`) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($idconto).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'))');
$idriga = $dbo->lastInsertedID();
/*
@ -682,7 +665,7 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento)
global $dir;
// Leggo la quantità di questo articolo in fattura
$query = 'SELECT idgruppo, qta, idintervento, idpreventivo, idordine, idddt, subtotale, descrizione, lotto, serial, altro FROM co_righe_documenti WHERE id='.prepare($idrigadocumento);
$query = 'SELECT qta, idintervento, idpreventivo, idordine, idddt, subtotale, descrizione, lotto, serial, altro FROM co_righe_documenti WHERE id='.prepare($idrigadocumento);
$rs = $dbo->fetchArray($query);
$idintervento = $rs[0]['idintervento'];
$idpreventivo = $rs[0]['idpreventivo'];
@ -691,19 +674,15 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento)
$qta = $rs[0]['qta'];
$subtotale = $rs[0]['subtotale'];
$idgruppo = $rs[0]['idgruppo'];
$descrizione = $rs[0]['descrizione'];
$lotto = $rs[0]['lotto'];
$serial = $rs[0]['serial'];
$altro = $rs[0]['altro'];
if ($dir == 'uscita') {
$non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM co_righe_documenti WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND iddocumento='.prepare($iddocumento))[0]['non_rimovibili'];
if ($non_rimovibili != 0) {
return false;
}
$non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $idrigadocumento, $dir);
if (!empty($non_rimovibili)) {
return false;
}
// Se l'articolo è stato aggiunto in fattura perché era collegato ad un intervento o
@ -735,15 +714,15 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento)
if ($dir == 'uscita') {
// Elimino eventuali articoli caricati in mg_prodotti esclusivamente con la fattura di acquisto
$query = 'SELECT lotto, serial, altro, idarticolo FROM co_righe_documenti WHERE id='.prepare($idrigadocumento).' AND idddt = 0 AND idordine = 0';
$query = 'SELECT lotto, serial, altro, id_articolo FROM co_righe_documenti WHERE id='.prepare($idrigadocumento).' AND idddt = 0 AND idordine = 0';
$rs = $dbo->fetchArray($query);
if (sizeof($rs) > 0) {
$dbo->query('DELETE FROM `mg_prodotti` WHERE lotto='.prepare($rs[0]['lotto']).' AND serial='.prepare($rs[0]['serial']).' AND altro='.prepare($rs[0]['altro']).' AND idarticolo='.prepare($rs[0]['idarticolo']));
$dbo->query('DELETE FROM `mg_prodotti` WHERE lotto='.prepare($rs[0]['lotto']).' AND serial='.prepare($rs[0]['serial']).' AND altro='.prepare($rs[0]['altro']).' AND id_articolo='.prepare($rs[0]['id_articolo']));
}
}
// Elimino la riga dal documento
$dbo->query('DELETE FROM `co_righe_documenti` WHERE idgruppo='.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento));
$dbo->query('DELETE FROM `co_righe_documenti` WHERE id='.prepare($idrigadocumento).' AND iddocumento='.prepare($iddocumento));
// Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro
$dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($idarticolo).' AND iddocumento = '.prepare($iddocumento).' AND id = '.prepare($idrigadocumento));
@ -761,9 +740,6 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = [])
$descrizione = strtoupper(tr('Sconto'));
// Opzione per disabilitare l'idgruppo (per preventivi)
$id_gruppo = !isset($options['idgruppo']) || !empty($options['idgruppo']);
// Rimozione dello sconto precedente
$dbo->query('DELETE FROM '.$tables['row']." WHERE descrizione LIKE '%".$descrizione."%' AND ".$fields['row'].'='.prepare($id_record));
@ -774,7 +750,7 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = [])
// Aggiorno l'eventuale sconto gestendolo con le righe in fattura
if (!empty($sconto[0]['sconto_globale'])) {
if ($sconto[0]['tipo_sconto_globale'] == 'PRC') {
$subtotale = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).($id_gruppo ? ' GROUP BY idgruppo' : '').') AS t')[0]['imponibile'];
$subtotale = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).') AS t')[0]['imponibile'];
$subtotale = -$subtotale / 100 * $sconto[0]['sconto_globale'];
$descrizione = $descrizione.' '.Translator::numberToLocale($sconto[0]['sconto_globale']).'%';
@ -798,10 +774,44 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = [])
'#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM '.$tables['row'].' AS t WHERE '.$fields['row'].'='.prepare($id_record).')',
];
if ($id_gruppo) {
$values['#idgruppo'] = '(SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM '.$tables['row'].' AS t WHERE '.$fields['row'].'='.prepare($id_record).')';
}
$dbo->insert($tables['row'], $values);
}
}
function controlla_seriali($field, $id_riga, $old_qta, $new_qta, $dir)
{
$dbo = Database::getConnection();
if ($old_qta >= $new_qta) {
// Controllo sulla possibilità di rimuovere i seriali (se non utilizzati da documenti di vendita)
if ($dir == 'uscita' && $new_qta < count(seriali_non_rimuovibili($field, $id_riga, $dir))) {
return false;
} else {
// Controllo sul numero di seriali effettivi da rimuovere
$count = $dbo->fetchArray('SELECT COUNT(*) AS tot FROM mg_prodotti WHERE '.$field.'='.prepare($id_riga))[0]['tot'];
if ($new_qta < $count) {
$deletes = $dbo->fetchArray("SELECT id FROM mg_prodotti WHERE serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir = 'entrata' AND ".$field.'!='.prepare($id_riga).') AND '.$field.'='.prepare($id_riga).' ORDER BY serial DESC LIMIT '.abs($count - $new_qta));
// Rimozione
foreach ($deletes as $delete) {
$dbo->query('DELETE FROM mg_prodotti WHERE id = '.prepare($delete['id']));
}
}
}
}
return true;
}
function seriali_non_rimuovibili($field, $id_riga, $dir)
{
$dbo = Database::getConnection();
$results = [];
if ($dir == 'uscita') {
$results = $dbo->fetchArray("SELECT serial FROM mg_prodotti WHERE serial IN (SELECT serial FROM mg_prodotti WHERE dir = 'entrata') AND ".$field.'='.prepare($id_riga));
}
return $results;
}

View File

@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php';
/*
Righe fattura
*/
$q = "SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento=".prepare($id_record)." LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento=".prepare($id_record).' GROUP BY idgruppo ORDER BY `order`';
$q = "SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento=".prepare($id_record)." LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento=".prepare($id_record).' ORDER BY `order`';
$rs = $dbo->fetchArray($q);
echo '
@ -34,26 +34,18 @@ if (!empty($rs)) {
$delete = 'unlink_articolo';
$qserial = 'SELECT * FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']);
$rsserial = $dbo->fetchArray($qserial);
$mancanti = 0;
$serials = [];
// Individuazione dei seriali
if (!empty($r['abilita_serial'])) {
foreach ($rsserial as $seriali) {
$seriali['serial'] = trim($seriali['serial']);
if (!empty($seriali['serial'])) {
$serials[] = $seriali['serial'];
} else {
++$mancanti;
}
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_documento='.prepare($r['id'])), 'serial');
$mancanti = $r['qta'] - count($serials);
if ($mancanti > 0) {
$extra = 'class="warning"';
} else {
$mancanti = 0;
}
}
if ($mancanti > 0) {
$extra = 'class="warning"';
}
}
// Preventivi
elseif (!empty($r['idpreventivo'])) {
@ -101,36 +93,37 @@ if (!empty($rs)) {
echo '
<br>'.tr('SN').': '.implode(', ', $serials);
}
} else {
if ($r['lotto'] != '') {
echo '
<br>'.tr('Lotto').': '.$r['lotto'];
}
if ($r['serial'] != '') {
echo '
<br>'.tr('SN').': '.$r['serial'];
}
if ($r['altro'] != '') {
echo '
<br>'.$r['altro'];
}
}
// Aggiunta riferimento a ordine
if (!empty($r['idordine'])) {
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM or_ordini WHERE id='.prepare($r['idordine']));
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data, dir FROM or_ordini JOIN or_tipiordine ON or_tipiordine.id = or_ordini.idtipoordine WHERE or_ordini.id='.prepare($r['idordine']));
$numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero'];
echo '
<br>'.str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ordine _NUM_ del _DATE_'));
$ref = $rso[0]['dir'] == 'entrata' ? 'Ordini cliente' : 'Ordini fornitore';
$ref_id = $r['idordine'];
$descrizione = str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ordine _NUM_ del _DATE_'));
} elseif (!empty($r['idddt'])) {
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM dt_ddt WHERE id='.prepare($r['idddt']));
$rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM dt_ddt JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($r['idddt']));
$numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero'];
echo '
<br>'.str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ddt _NUM_ del _DATE_'));
$ref = $rso[0]['dir'] == 'entrata' ? 'Ddt di vendita' : 'Ddt di acquisto';
$ref_id = $r['idddt'];
$descrizione = str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ddt _NUM_ del _DATE_'));
} elseif (!empty($r['idpreventivo'])) {
$rso = $dbo->fetchArray('SELECT numero, data_bozza FROM co_preventivi WHERE id='.prepare($r['idpreventivo']));
$ref = 'Preventivi';
$ref_id = $r['idpreventivo'];
$descrizione = str_replace(['_NUM_', '_DATE_'], [$rso[0]['numero'], Translator::dateToLocale($rso[0]['data_bozza'])], tr('Rif. preventivo _NUM_ del _DATE_'));
}
if(!empty($descrizione)){
echo '
<br>'.str_replace(['_NUM_', '_DATE_'], [$rso[0]['numero'], Translator::dateToLocale($rso[0]['data_bozza'])], tr('Rif. preventivo _NUM_ del _DATE_'));
<br>'.Modules::link($ref, $ref_id, $descrizione.' <i class="fa fa-external-link"></i>', $descrizione);
}
echo '
@ -194,7 +187,7 @@ if (!empty($rs)) {
if (!empty($r['idarticolo']) && $r['abilita_serial'] && (empty($r['idddt']) || empty($r['idintervento']))) {
echo "
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idgruppo='.$r['idgruppo'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
}
echo "

View File

@ -437,11 +437,8 @@ switch (post('op')) {
add_movimento_magazzino($idarticolo_originale, $qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]);
$rs = $dbo->fetchArray('SELECT idgruppo FROM mg_articoli_interventi WHERE id='.prepare($idriga));
$idgruppo = $rs[0]['idgruppo'];
// Elimino questo articolo dall'intervento
$dbo->query('DELETE FROM mg_articoli_interventi WHERE idgruppo='.prepare($idgruppo));
$dbo->query('DELETE FROM mg_articoli_interventi WHERE id='.prepare($idriga));
// Elimino il collegamento al componente
$dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record));
@ -469,17 +466,13 @@ switch (post('op')) {
// Aggiorno l'automezzo dell'intervento
$dbo->query('UPDATE in_interventi SET idautomezzo='.prepare($idautomezzo).' WHERE id='.prepare($id_record).' '.Modules::getAdditionalsQuery($id_module));
// Calcolo idgruppo per questo inserimento
$ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM mg_articoli_interventi WHERE idintervento = '.prepare($id_record));
$idgruppo = $ridgruppo[0]['idgruppo'];
$rsart = $dbo->fetchArray('SELECT abilita_serial, prezzo_acquisto FROM mg_articoli WHERE id='.prepare($idarticolo));
$qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1;
$prezzo_acquisto = $rsart[0]['prezzo_acquisto'];
for ($i = 0; $i < $qta_in; ++$i) {
// Aggiunto il collegamento fra l'articolo e l'intervento
$dbo->query('INSERT INTO mg_articoli_interventi(idarticolo, idintervento, idimpianto, idautomezzo, descrizione, prezzo_vendita, prezzo_acquisto, sconto, sconto_unitario, tipo_sconto, idiva_vendita, qta, um, abilita_serial, serial, idgruppo) VALUES ('.prepare($idarticolo).', '.prepare($id_record).', '.(empty($idimpianto) ? 'NULL' : prepare($idimpianto)).', '.prepare($idautomezzo).', '.prepare($descrizione).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', (SELECT idiva_vendita FROM mg_articoli WHERE id='.prepare($idarticolo).'), '.prepare($qta).', '.prepare($um).', '.prepare($rsart[0]['abilita_serial']).', '.prepare(!empty($serials[$i]) ? $serials[$i] : '').', '.prepare($idgruppo).')');
$dbo->query('INSERT INTO mg_articoli_interventi(idarticolo, idintervento, idimpianto, idautomezzo, descrizione, prezzo_vendita, prezzo_acquisto, sconto, sconto_unitario, tipo_sconto, idiva_vendita, qta, um, abilita_serial, serial) VALUES ('.prepare($idarticolo).', '.prepare($id_record).', '.(empty($idimpianto) ? 'NULL' : prepare($idimpianto)).', '.prepare($idautomezzo).', '.prepare($descrizione).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', (SELECT idiva_vendita FROM mg_articoli WHERE id='.prepare($idarticolo).'), '.prepare($qta).', '.prepare($um).', '.prepare($rsart[0]['abilita_serial']).', '.prepare(!empty($serials[$i]) ? $serials[$i] : '').')');
}
link_componente_to_articolo($id_record, $idimpianto, $idarticolo, $qta);
@ -502,10 +495,8 @@ switch (post('op')) {
add_movimento_magazzino($idarticolo, $qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]);
$idgruppo = $dbo->fetchArray('SELECT idgruppo FROM mg_articoli_interventi WHERE id='.prepare($idriga).' AND idintervento='.prepare($id_record))[0]['idgruppo'];
// Elimino questo articolo dall'intervento
$dbo->query('DELETE FROM mg_articoli_interventi WHERE idgruppo='.prepare($idgruppo).' AND idintervento='.prepare($id_record));
$dbo->query('DELETE FROM mg_articoli_interventi WHERE id='.prepare($idriga).' AND idintervento='.prepare($id_record));
// Elimino il collegamento al componente
$dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record));
@ -514,16 +505,18 @@ switch (post('op')) {
break;
case 'add_serial':
$idgruppo = $post['idgruppo'];
$serial = $post['serial'];
$idriga = $post['idriga'];
$idarticolo = $post['idarticolo'];
$q = 'SELECT * FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id';
$rs = $dbo->fetchArray($q);
foreach ($rs as $i => $r) {
$dbo->query('UPDATE mg_articoli_interventi SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id']));
$serials = (array) $post['serial'];
foreach ($serials as $key => $value) {
if (empty($value)) {
unset($serials[$key]);
}
}
$dbo->sync('mg_prodotti', ['id_riga_intervento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
break;
case 'firma':

View File

@ -1,47 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$idarticolo = get('idarticolo');
$idgruppo = get('idgruppo');
$q2 = 'SELECT * FROM mg_articoli_interventi INNER JOIN in_interventi ON mg_articoli_interventi.idintervento=in_interventi.id WHERE mg_articoli_interventi.idintervento='.prepare($id_record).' AND mg_articoli_interventi.idgruppo='.prepare($idgruppo);
$rs2 = $dbo->fetchArray($q2);
echo '
<p>'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'</p>
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<input type="hidden" name="op" value="add_serial">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="idddt" value="'.$id_record.'">
<input type="hidden" name="idgruppo" value="'.$rs2[0]['idgruppo'].'">
<input type="hidden" name="dir" value="'.$dir.'">';
$serials = [];
$array = array_column($rs2, 'serial');
foreach ($array as $value) {
if (!empty($value)) {
$serials[] = $value;
}
}
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'int-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]}
</div>
</div>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-barcode"></i> '.tr('Aggiorna').'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';

View File

@ -4,7 +4,7 @@ include_once __DIR__.'/../../core.php';
include_once $docroot.'/modules/articoli/modutil.php';
$query = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=mg_articoli_interventi.idarticolo) AS codice, mg_articoli_interventi.id AS idriga, (SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM in_interventi WHERE id=mg_articoli_interventi.idintervento) ) ) AS prc_guadagno FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' '.Modules::getAdditionalsQuery('Magazzino').' GROUP BY idgruppo';
$query = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=mg_articoli_interventi.idarticolo) AS codice, mg_articoli_interventi.id AS idriga, (SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM in_interventi WHERE id=mg_articoli_interventi.idintervento) ) ) AS prc_guadagno FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' '.Modules::getAdditionalsQuery('Magazzino');
$rs = $dbo->fetchArray($query);
if (!empty($rs)) {
@ -33,27 +33,18 @@ if (!empty($rs)) {
</tr>';
foreach ($rs as $r) {
$qserial = 'SELECT * FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']);
$rsserial = $dbo->fetchArray($qserial);
// Individuazione dei seriali
if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) {
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_intervento='.prepare($r['id'])), 'serial');
$mancanti = $r['qta'] - count($serials);
$mancanti = 0;
$serials = [];
if (!empty($r['abilita_serial'])) {
foreach ($rsserial as $seriali) {
$seriali['serial'] = trim($seriali['serial']);
if (!empty($seriali['serial'])) {
$serials[] = $seriali['serial'];
} else {
++$mancanti;
}
if ($mancanti > 0) {
$extra = 'class="warning"';
} else {
$mancanti = 0;
}
}
if ($mancanti > 0) {
$extra = 'class="warning"';
}
echo '
<tr '.$extra.'>
<td>
@ -132,7 +123,7 @@ if (!empty($rs)) {
if ($r['abilita_serial']) {
echo '
<button type="button" class="btn btn-info btn-xs" data-toggle="tooltip" onclick="launch_modal(\''.tr('Modifica articoli').'\', \''.$rootdir.'/modules/interventi/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idarticolo='.$r['idriga'].'&idgruppo='.$r['idgruppo'].'\', 1);"><i class="fa fa-barcode"></i></button>';
<button type="button" class="btn btn-info btn-xs" data-toggle="tooltip" onclick="launch_modal(\''.tr('Modifica articoli').'\', \''.$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idarticolo='.$r['idriga'].'&idriga='.$r['id'].'\', 1);"><i class="fa fa-barcode"></i></button>';
}
echo '

View File

@ -144,11 +144,7 @@ switch (post('op')) {
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
// Calcolo idgruppo per questo inserimento
$ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM or_righe_ordini WHERE idordine = '.prepare($id_record));
$idgruppo = $ridgruppo[0]['idgruppo'];
add_articolo_inordine($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo_vendita * $qta, $sconto, $sconto_unitario, $tipo_sconto, '', '', '', $idgruppo);
add_articolo_inordine($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo_vendita * $qta, $sconto, $sconto_unitario, $tipo_sconto);
$_SESSION['infos'][] = tr('Articolo aggiunto!');
}
@ -177,7 +173,7 @@ switch (post('op')) {
$iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
$query = 'INSERT INTO or_righe_ordini(idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))';
$query = 'INSERT INTO or_righe_ordini(idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))';
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Riga aggiunta!');
@ -198,7 +194,11 @@ switch (post('op')) {
$idriga = post('idriga');
if ($id_record != '' && $idarticolo != '') {
rimuovi_articolo_daordine($idarticolo, $id_record, $idriga);
if (!rimuovi_articolo_daordine($idarticolo, $id_record, $idriga)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
// if( $dbo->query($query) ){
// Ricalcolo inps, ritenuta e bollo
@ -250,6 +250,22 @@ switch (post('op')) {
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
// Lettura idarticolo dalla riga documento
$rs = $dbo->fetchArray('SELECT idordine, idarticolo, qta, abilita_serial FROM or_righe_ordini WHERE id='.prepare($idriga));
$idarticolo = $rs[0]['idarticolo'];
$old_qta = $rs[0]['qta'];
$idordine = $rs[0]['idordine'];
$abilita_serial = $rs[0]['abilita_serial'];
// Controllo per gestire i serial
if (!empty($idarticolo)) {
if (!controlla_seriali('id_riga_ordine', $idriga, $old_qta, $qta, $dir)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
}
// Calcolo iva
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
$rs = $dbo->fetchArray($query);
@ -257,50 +273,9 @@ switch (post('op')) {
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
$desc_iva = $rs[0]['descrizione'];
// Lettura idarticolo dalla riga documento
$rs = $dbo->fetchArray('SELECT idgruppo, idordine, idarticolo, qta, abilita_serial FROM or_righe_ordini WHERE id='.prepare($idriga));
$idarticolo = $rs[0]['idarticolo'];
$old_qta = $rs[0]['qta'];
$idgruppo = $rs[0]['idgruppo'];
$idordine = $rs[0]['idordine'];
$abilita_serial = $rs[0]['abilita_serial'];
// Modifica riga generica sul documento
$query = 'UPDATE or_righe_ordini SET idiva='.prepare($idiva).', desc_iva='.prepare($rs[0]['descrizione']).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).' WHERE idgruppo='.prepare($idgruppo).' AND idordine='.prepare($idordine);
$query = 'UPDATE or_righe_ordini SET idiva='.prepare($idiva).', desc_iva='.prepare($rs[0]['descrizione']).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga);
if ($dbo->query($query)) {
// Modifica della quantità
$dbo->query('UPDATE or_righe_ordini SET qta='.prepare($qta).' WHERE idgruppo='.prepare($idgruppo));
// Modifica per gestire i serial
if (!empty($idarticolo)) {
$new_qta = $qta - $old_qta;
$new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta;
if (!empty($abilita_serial)) {
if ($old_qta < $qta) {
for ($i = 0; $i < $new_qta; ++$i) {
$dbo->query('INSERT INTO or_righe_ordini(idordine, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) SELECT idordine, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order` FROM or_righe_ordini WHERE id='.prepare($idriga));
}
} else {
if ($dir == 'uscita') {
if ($new_qta > $dbo->fetchArray("SELECT COUNT(*) AS rimovibili FROM or_righe_ordini WHERE serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idordine='.prepare($idordine))[0]['rimovibili']) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
} else {
$deletes = $dbo->fetchArray('SELECT id FROM or_righe_ordini AS t WHERE idgruppo = '.prepare($idgruppo).' AND idordine='.prepare($idordine)." AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') ORDER BY serial ASC LIMIT ".$new_qta);
}
} else {
$deletes = $dbo->fetchArray('SELECT id FROM or_righe_ordini AS t WHERE idgruppo = '.prepare($idgruppo).' AND idordine='.prepare($idordine).' ORDER BY serial ASC LIMIT '.$new_qta);
}
foreach ((array) $deletes as $delete) {
$dbo->query('DELETE FROM or_righe_ordini WHERE id = '.prepare($delete['id']));
}
}
}
}
$_SESSION['infos'][] = tr('Riga modificata!');
// Ricalcolo inps, ritenuta e bollo
@ -315,9 +290,13 @@ switch (post('op')) {
// eliminazione ordine
case 'delete':
if ($dir == 'uscita') {
$non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM or_righe_ordini WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idordine=".prepare($id_record))[0]['non_rimovibili'];
if ($non_rimovibili != 0) {
// Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino
$query = 'SELECT id, idarticolo FROM or_righe_ordini WHERE idordine='.prepare($id_record).' AND NOT idarticolo=0';
$rs = $dbo->fetchArray($query);
foreach ($rs as $value) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_documenti', $value['id'], $dir);
if (!empty($non_rimovibili)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
@ -331,16 +310,18 @@ switch (post('op')) {
break;
case 'add_serial':
$idgruppo = $post['idgruppo'];
$serial = $post['serial'];
$idriga = $post['idriga'];
$idarticolo = $post['idarticolo'];
$q = 'SELECT * FROM or_righe_ordini WHERE idordine='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id';
$rs = $dbo->fetchArray($q);
foreach ($rs as $i => $r) {
$dbo->query('UPDATE or_righe_ordini SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id']));
$serials = (array) $post['serial'];
foreach ($serials as $key => $value) {
if (empty($value)) {
unset($serials[$key]);
}
}
$dbo->sync('mg_prodotti', ['id_riga_ordine' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
break;
case 'update_position':

View File

@ -1,108 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
if ($module['name'] == 'Ordini cliente') {
$dir = 'entrata';
} else {
$dir = 'uscita';
}
$idarticolo = get('idarticolo');
$idgruppo = get('idgruppo');
$q2 = 'SELECT * FROM or_righe_ordini INNER JOIN mg_articoli ON or_righe_ordini.idarticolo=mg_articoli.id WHERE or_righe_ordini.idordine='.prepare($id_record).' AND or_righe_ordini.idgruppo='.prepare($idgruppo);
$rs2 = $dbo->fetchArray($q2);
echo '
<p>'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'</p>
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
<input type="hidden" name="op" value="add_serial">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="idgruppo" value="'.$rs2[0]['idgruppo'].'">
<input type="hidden" name="dir" value="'.$dir.'">';
$serials = [];
$array = array_column($rs2, 'serial');
foreach ($array as $value) {
if (!empty($value)) {
$serials[] = $value;
}
}
if ($dir == 'entrata') {
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'fat-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]}
</div>
</div>';
} else {
echo '
<p>'.tr('Inserisci i numeri seriali degli articoli aggiunti:').'</p>';
foreach ($array as $key => $serial) {
if ($key % 3 == 0) {
echo '
<div class="row">';
}
$res = $dbo->fetchArray("SELECT record FROM vw_serials WHERE dir='entrata' AND serial = ".prepare($serial));
echo '
<div class="col-md-4">
{[ "type": "text", "name": "serial[]", "value": "'.$serial.'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}';
if (!empty($res)) {
$pieces = explode('-', $res[0]['record']);
switch ($pieces[0]) {
case 'int':
$modulo = 'Interventi';
break;
case 'ddt':
$modulo = 'Ddt di vendita';
break;
case 'fat':
$modulo = 'Fatture di vendita';
break;
case 'ord':
$modulo = 'Ordini cliente';
break;
}
echo '
'.Modules::link($modulo, $pieces[1], tr('Visualizza vendita').' <i class="fa fa-external-link"></i>', null);
}
echo '
</div>';
if (($key + 1) % 3 == 0) {
echo '
</div>
<br>';
}
}
if (($key + 1) % 3 != 0) {
echo '
</div>';
}
}
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-barcode"></i> '.tr('Aggiorna').'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';

View File

@ -1,252 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
if ($module['name'] == 'Ordini cliente') {
$dir = 'entrata';
$module_name = 'Ddt di vendita';
} else {
$dir = 'uscita';
$module_name = 'Ddt di acquisto';
}
// Info documento
$rs = $dbo->fetchArray("SELECT * FROM or_ordini WHERE id=".prepare($id_record));
$numero = (!empty($rs[0]['numero_esterno'])) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
$idanagrafica = $rs[0]['idanagrafica'];
$idpagamento = $rs[0]['idpagamento'];
$idconto = $rs[0]['idconto'];
/*
Form di inserimento riga documento
*/
echo "<p>Ordine numero $numero</p>";
echo "Seleziona le righe che vuoi inserire nel ddt e la quantità:<br><br>";
echo '<form id="link_form" action="'.$rootdir.'/editor.php?id_module='.Modules::getModule($module_name)['id'].'&id_record='.$id_record."\" method=\"post\">";
// Altri id utili
echo " <input type='hidden' name='idordine' value='".$id_record."' />";
echo " <input type='hidden' name='idanagrafica' value='".$idanagrafica."' />";
echo " <input type='hidden' name='idconto' value='".$idconto."' />";
echo " <input type='hidden' name='idpagamento' value='".$idpagamento."' />";
echo " <input type='hidden' name='op' value='ddt_da_ordine'>";
echo " <input type='hidden' name='backto' value='record-edit'>";
echo " <input type='hidden' name='dir' value='".$dir."'>";
// Selezione articoli dell'ordine da portare nel ddt
$query = "SELECT * FROM or_ordini INNER JOIN or_righe_ordini ON or_ordini.id=or_righe_ordini.idordine WHERE or_ordini.id='".$id_record."' GROUP BY idgruppo HAVING qta_rimanente > 0";
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
if ($n > 0) {
$show_btn = true;
echo " <div class='form'>";
echo " <div class='col-md-4'>";
echo " <label>Data ddt</label>";
echo " <input type='text' class='form-control text-center datepicker ' name='data' id='data2' value='".date('d/m/Y')."'>";
echo " </div>"; ?>
<div class="clearfix"></div>
<br>
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-hover table-condensed">
<tr>
<th>Descrizione</th>
<th width="10%">Q.</th>
<th width="15%">Q. da evadere</th>
<th width="20%">Subtot.</th>
<th width="10%">Da evadere</th>
</tr>
<?php
$totale = 0.00;
for ($i = 0; $i < $n; ++$i) {
// Descrizione
echo "<tr>";
echo "<td class='text-left' >";
echo "<input type='hidden' name='idrigaordine[]' value=\"".$rs[$i]['id']."\" />";
echo "<input type='hidden' id='idarticolo_".$i."' name='idarticolo[]' value=\"".$rs[$i]['idarticolo']."\" />";
echo "<input type='hidden' id='descrizione_".$i."' name='descrizione[]' value=\"".$rs[$i]['descrizione']."\" />";
echo nl2br($rs[$i]['descrizione']).'<small>';
if ($rs[$i]['lotto'] != '') {
echo '<br>Lotto: '.$rs[$i]['lotto'];
}
if ($rs[$i]['serial'] != '') {
echo '<br>SN: '.$rs[$i]['serial'];
}
if ($rs[$i]['altro'] != '') {
echo '<br>'.$rs[$i]['altro'];
}
echo "</small>";
echo "</td>";
// Q.tà rimanente
echo "<td class='text-left' id='rimanente_".$i."'>";
echo "<input type='hidden' id='qtamax_".$i."' value='".($rs[$i]['qta'] - $rs[$i]['qta_evasa'])."' />";
echo "<input type='hidden' id='um_".$i."' name='um[]' value='".$rs[$i]['um']."' />";
echo($rs[$i]['qta'] - $rs[$i]['qta_evasa'])."";
echo "</td>";
// Q.tà da evadere
echo "<td class='text-left' >";
echo "<input class='form-control inputmask-decimal' type='text' id='qta_".$i."' name='qta_da_evadere[]' value='".($rs[$i]['qta'] - $rs[$i]['qta_evasa'])."' onkeyup=\"ricalcola_subtotale_riga(".$i.");\" />";
echo "</td>";
// Subtotale
$subtotale = $rs[$i]['subtotale'] / $rs[$i]['qta'] * ($rs[$i]['qta'] - $rs[$i]['qta_evasa']);
$sconto = $rs[$i]['sconto'] / $rs[$i]['qta'] * ($rs[$i]['qta'] - $rs[$i]['qta_evasa']);
$iva = $rs[$i]['iva'] / $rs[$i]['qta'] * ($rs[$i]['qta'] - $rs[$i]['qta_evasa']);
echo "<td class='text-right'>";
echo " <input type='hidden' id='subtot_".$i."' name='subtot[]' value=\"".Translator::numberToLocale($rs[$i]['subtotale'] / $rs[$i]['qta'])."\" />";
echo " <input type='hidden' id='sconto_".$i."' name='sconto[]' value=\"".Translator::numberToLocale($rs[$i]['sconto'] / $rs[$i]['qta'])."\" />";
echo " <input type='hidden' id='idiva_".$i."' name='idiva[]' value=\"".$rs[$i]['idiva']."\" />";
echo " <input type='hidden' id='iva_".$i."' name='iva[]' value=\"".Translator::numberToLocale($rs[$i]['iva'] / $rs[$i]['qta'])."\" />";
echo " <big id='subtotale_".$i."'>".Translator::numberToLocale($subtotale - $sconto + $iva)." &euro;</big><br><small class='help-block' id='subtotaledettagli_".$i."'>".Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva)."</small>";
echo "</td>";
// Checkbox - da evadere?
echo "<td class='text-left'>";
echo " <input type='checkbox' checked='checked' id='checked_".$i."' name='evadere[]' value='on' onclick=\"ricalcola_subtotale_riga(".$i.");\" />";
echo "</td></tr>";
$totale += $subtotale - $sconto + $iva;
}
// Totale
echo "<tr><td colspan='3' align='right' class='text-right'>";
echo " <b>Totale:</b>";
echo "</td>";
echo "<td class='text-right'>";
echo " <big id='totale'>".Translator::numberToLocale($totale)." &euro;</big>";
echo "</td><td></td></tr>";
echo "</table>";
echo "</div>";
} else {
$show_btn = false;
echo ' <b>'.tr('Non ci sono articoli da evadere in questo ordine')."...</b><br>";
}
echo " <div class=\"clearfix\"></div>";
echo " </div>";
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">';
if ($show_btn) {
if ($dir == 'entrata') {
echo '
<a onclick="creaddt_vendita();" class="btn btn-primary"><i class="fa fa-plus"></i> '.tr('Crea ddt di vendita').'</a>';
} else {
echo '
<a onclick="creaddt_acquisto();" class="btn btn-primary"><i class="fa fa-plus"></i> '.tr('Crea ddt di acquisto').'</a>';
}
}
echo '
</div>
</div>';
echo "</form>";
?>
<script type="text/javascript">
$(document).ready( function(){
start_superselect();
start_inputmask();
$('.datepicker').datepicker();
});
function creaddt_vendita(){
$("#link_form").submit();
}
function creaddt_acquisto(){
$("#link_form").submit();
}
function ricalcola_subtotale_riga( r ){
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
qta = $("#qta_"+r).val().toEnglish();
if( isNaN(qta) ){
qta = 0;
}
qtamax = $("#qtamax_"+r).val().toEnglish();
if( isNaN(qtamax) ){
qtamax = 0;
}
iva = $("#iva_"+r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if( qta>qtamax ){
qta = qtamax.toFixedLocale(2);
$('#qta_'+r).val( qta );
}
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
if( !$('#checked_'+r).is(':checked') ){
qta = 0;
}
subtotale = (subtot*qta+iva*qta).toFixedLocale(2);
$("#subtotale_"+r).html(subtotale+" &euro;");
$("#subtotaledettagli_"+r).html( (subtot*qta).toFixed(2)+" + " + (iva*qta).toFixed(2) );
ricalcola_totale();
}
function ricalcola_totale(){
r = 0;
totale = 0.00;
$('input[id*=qta_]').each( function(){
qta = $(this).val().toEnglish();
if( !$('#checked_'+r).is(':checked') || isNaN(qta) ){
qta = 0;
}
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
iva = $("#iva_"+r).val().toEnglish();
totale += subtot*qta+iva*qta;
r++;
});
$('#totale').html( (totale.toFixedLocale()) + " &euro;" );
if( totale==0 )
$('#submit_btn').hide();
else
$('#submit_btn').show();
}
</script>

View File

@ -1,245 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$module = Modules::getModule($id_module);
if ($module['name'] == 'Ordini cliente') {
$dir = 'entrata';
$module_name = 'Fatture di vendita';
} else {
$dir = 'uscita';
$module_name = 'Fatture di acquisto';
}
// Info documento
$rs = $dbo->fetchArray('SELECT * FROM or_ordini WHERE id='.prepare($id_record));
(!empty($rs[0]['numero_esterno'])) ? $numero = $rs[0]['numero_esterno'] : $numero = $rs[0]['numero'];
$idanagrafica = $rs[0]['idanagrafica'];
$idpagamento = $rs[0]['idpagamento'];
$idconto = $rs[0]['idconto'];
/*
Form di inserimento riga documento
*/
echo "<h4>Ordine numero $numero</h4>\n";
echo "Seleziona le righe che vuoi inserire nella fattura e la quantità:<br><br>\n";
echo '<form id="link_form" action="'.$rootdir.'/editor.php?id_module='.Modules::getModule($module_name)['id'].'&id_record='.$id_record."\" method=\"post\">\n";
// Altri id utili
echo " <input type='hidden' name='idordine' value='".$id_record."' />\n";
echo " <input type='hidden' name='idanagrafica' value='".$idanagrafica."' />\n";
echo " <input type='hidden' name='idconto' value='".$idconto."' />\n";
echo " <input type='hidden' name='idpagamento' value='".$idpagamento."' />\n";
echo " <input type='hidden' name='op' value='fattura_da_ordine'>\n";
echo " <input type='hidden' name='backto' value='record-edit'>\n";
echo " <input type='hidden' name='dir' value='".$dir."'>\n";
// Selezione articoli dell'ordine da portare nella fattura
$query = "SELECT * FROM or_ordini INNER JOIN or_righe_ordini ON or_ordini.id=or_righe_ordini.idordine WHERE or_ordini.id='".$id_record."' GROUP BY idgruppo HAVING qta_rimanente > 0";
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
if ($n > 0) {
$show_btn = true;
echo " <div class='form'>\n";
echo " <div class='col-md-4'>\n";
echo " <label>Data fattura</label>\n";
echo " <input type='text' class='form-control text-center datepicker ' name='data' id='data2' value='".date('d/m/Y')."' />\n";
echo " </div>\n"; ?>
<div class="clearfix"></div>
<br>
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-hover table-condensed">
<tr>
<th>Descrizione</th>
<th width="10%">Q.</th>
<th width="15%">Q. da evadere</th>
<th width="20%">Subtot.</th>
<th width="10%">Da evadere</th>
</tr>
<?php
$totale = 0.00;
for ($i = 0; $i < $n; ++$i) {
// Descrizione
echo " <tr>\n";
echo " <td class='text-left' >\n";
echo " <input type='hidden' name='idrigaordine[]' value=\"".$rs[$i]['id']."\" />\n";
echo " <input type='hidden' id='idarticolo_".$i."' name='idarticolo[]' value=\"".$rs[$i]['idarticolo']."\" />\n";
echo " <input type='hidden' id='descrizione_".$i."' name='descrizione[]' value=\"".$rs[$i]['descrizione']."\" />\n";
echo nl2br($rs[$i]['descrizione']).'<small>';
if ($rs[$i]['lotto'] != '') {
echo '<br>Lotto: '.$rs[$i]['lotto'];
}
if ($rs[$i]['serial'] != '') {
echo '<br>SN: '.$rs[$i]['serial'];
}
if ($rs[$i]['altro'] != '') {
echo '<br>'.$rs[$i]['altro'];
}
echo " </small>\n";
echo " </td>\n";
// Q.tà rimanente
echo " <td class='text-left' id='rimanente_".$i."'>\n";
echo " <input type='hidden' id='qtamax_".$i."' value='".($rs[$i]['qta'] - $rs[$i]['qta_evasa'])."' />\n";
echo " <input type='hidden' id='um_".$i."' name='um[]' value='".$rs[$i]['um']."' />\n";
echo($rs[$i]['qta'] - $rs[$i]['qta_evasa'])."\n";
echo " </td>\n";
// Q.tà da evadere
echo " <td class='text-left' >\n";
echo " <input class='form-control inputmask-decimal' type='text' id='qta_".$i."' name='qta_da_evadere[]' value='".($rs[$i]['qta'] - $rs[$i]['qta_evasa'])."' onkeyup=\"ricalcola_subtotale_riga(".$i.");\" />\n";
echo " </td>\n";
// Subtotale
$subtotale = $rs[$i]['subtotale'] / $rs[$i]['qta'] * ($rs[$i]['qta'] - $rs[$i]['qta_evasa']);
$sconto = $rs[$i]['sconto'] / $rs[$i]['qta'] * ($rs[$i]['qta'] - $rs[$i]['qta_evasa']);
$iva = $rs[$i]['iva'] / $rs[$i]['qta'] * ($rs[$i]['qta'] - $rs[$i]['qta_evasa']);
echo " <td class='text-right'>\n";
echo " <input type='hidden' id='subtot_".$i."' name='subtot[]' value=\"".Translator::numberToLocale($rs[$i]['subtotale'] / $rs[$i]['qta'])."\" />\n";
echo " <input type='hidden' id='sconto_".$i."' name='sconto[]' value=\"".Translator::numberToLocale($rs[$i]['sconto'] / $rs[$i]['qta'])."\" />\n";
echo " <input type='hidden' id='idiva_".$i."' name='idiva[]' value=\"".$rs[$i]['idiva']."\" />\n";
echo " <input type='hidden' id='iva_".$i."' name='iva[]' value=\"".Translator::numberToLocale($rs[$i]['iva'] / $rs[$i]['qta'])."\" />\n";
echo " <big id='subtotale_".$i."'>".Translator::numberToLocale($subtotale - $sconto + $iva)." &euro;</big><br><small class='help-block' id='subtotaledettagli_".$i."'>".Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva)."</small>\n";
echo " </td>\n";
// Checkbox - da evadere?
echo " <td class='text-left'>\n";
echo " <input type='checkbox' checked='checked' id='checked_".$i."' name='evadere[]' value='on' onclick=\"ricalcola_subtotale_riga(".$i.");\" />\n";
echo " </td></tr>\n";
$totale += $subtotale - $sconto + $iva;
}
// Totale
echo " <tr><td colspan='3' align='right' class='text-right'>\n";
echo " <b>Totale:</b>\n";
echo " </td>\n";
echo " <td class='text-right'>\n";
echo " <big id='totale'>".Translator::numberToLocale($totale)." &euro;</big>\n";
echo " </td><td></td></tr>\n";
echo " </table>\n";
echo " </div>\n";
echo "</div>\n";
} else {
$show_btn = false;
echo '<b>'.tr('Non ci sono articoli da evadere in questo ordine')."...</b><br>\n";
}
?>
<?php
if ($show_btn) {
if ($dir == 'entrata') {
echo "<a onmouseover=\"this.style.cursor='pointer';\" id='submit_btn' onclick=\"creafattura_vendita();\" class=\"btn btn-primary pull-right\" ><i class=\"fa fa-plus\"></i> Crea fattura di vendita</a>\n";
} else {
echo "<a onmouseover=\"this.style.cursor='pointer';\" id='submit_btn' onclick=\"creafattura_acquisto();\" class=\"btn btn-primary pull-right\" ><i class=\"fa fa-plus\"></i> Crea fattura di acquisto</a>\n";
}
}
echo "</form>\n";
?>
<div class="clearfix"></div>
<script type="text/javascript">
$(document).ready( function(){
start_superselect();
start_inputmask();
$('.datepicker').datepicker();
});
function creafattura_vendita(){
$("#link_form").submit();
}
function creafattura_acquisto(){
$("#link_form").submit();
}
function ricalcola_subtotale_riga( r ){
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
qta = $("#qta_"+r).val().toEnglish();
if( isNaN(qta) ){
qta = 0;
}
qtamax = $("#qtamax_"+r).val().toEnglish();
if( isNaN(qtamax) ){
qtamax = 0;
}
iva = $("#iva_"+r).val().toEnglish();
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
if( qta>qtamax ){
qta = qtamax.toFixedLocale(2);
$('#qta_'+r).val( qta );
}
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
if( !$('#checked_'+r).is(':checked') ){
qta = 0;
}
subtotale = (subtot*qta+iva*qta).toFixedLocale();
$("#subtotale_"+r).html(subtotale+" &euro;");
$("#subtotaledettagli_"+r).html( (subtot*qta).toFixed(2)+" + " + (iva*qta).toFixed(2) );
ricalcola_totale();
}
function ricalcola_totale(){
r = 0;
totale = 0.00;
$('input[id*=qta_]').each( function(){
qta = $(this).val().toEnglish();
if( !$('#checked_'+r).is(':checked') || isNaN(qta) ){
qta = 0;
}
subtot = $("#subtot_"+r).val().toEnglish();
sconto = $("#sconto_"+r).val().toEnglish();
subtot = subtot-sconto;
iva = $("#iva_"+r).val().toEnglish();
totale += subtot*qta+iva*qta;
r++;
});
$('#totale').html( (totale.toFixedLocale()) + " &euro;" );
if( totale==0 )
$('#submit_btn').hide();
else
$('#submit_btn').show();
}
</script>

View File

@ -100,8 +100,8 @@ if ($module['name'] == 'Ordini cliente') {
<div class="pull-right">
<!-- Stampe -->
<?php if( $records[0]['stato'] != 'Evaso' ){ ?>
<a class="btn btn-sm btn-info" data-href="<?php echo $rootdir ?>/modules/ordini/creaddt.php?id_module=<?php echo $id_module ?>&&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Crea ddt" data-target="#bs-popup" ><i class="fa fa-magic"></i> Crea ddt da ordine...</i></a>
<a class="btn btn-sm btn-info" data-href="<?php echo $rootdir ?>/modules/ordini/creafattura.php?id_module=<?php echo $id_module ?>&&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Crea fattura" data-target="#bs-popup" ><i class="fa fa-magic"></i> Crea fattura da ordine...</i></a>
<a class="btn btn-sm btn-info" data-href="<?php echo $rootdir ?>/modules/fatture/crea_documento.php?id_module=<?php echo $id_module ?>&&id_record=<?php echo $id_record ?>&documento=ddt" data-toggle="modal" data-title="Crea ddt" data-target="#bs-popup" ><i class="fa fa-magic"></i> Crea ddt da ordine...</i></a>
<a class="btn btn-sm btn-info" data-href="<?php echo $rootdir ?>/modules/fatture/crea_documento.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>&documento=fattura" data-toggle="modal" data-title="Crea fattura" data-target="#bs-popup" ><i class="fa fa-magic"></i> Crea fattura da ordine...</i></a>
<?php } ?>
<a class="btn btn-sm btn-info" target="_blank" href="<?php echo $rootdir ?>/pdfgen.php?ptype=ordini&idordine=<?php echo $id_record ?>" data-title="Stampa ordine"><i class="fa fa-print"></i> Stampa ordine</a>

View File

@ -124,7 +124,7 @@ function get_ivaindetraibile_ordine($idordine)
* $qta float quantità dell'articolo nell'ordine
* $prezzo float prezzo totale degli articoli (prezzounitario*qtà).
*/
function add_articolo_inordine($idordine, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $lotto = '', $serial = '', $altro = '', $idgruppo = 0)
function add_articolo_inordine($idordine, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT')
{
global $dbo;
global $dir;
@ -145,20 +145,7 @@ function add_articolo_inordine($idordine, $idarticolo, $descrizione, $idiva, $qt
if ($qta > 0) {
$rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo));
$qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1;
for ($i = 0; $i < $qta_in; ++$i) {
/*
$iva = $iva / $qta_in;
$qta = $qta / $qta_in;
$ubtotale = $subtotale / $qta_in;
$sconto = $sconto / $qta_in;
$iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile'];
*/
$dbo->query('INSERT INTO or_righe_ordini(idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, abilita_serial, idgruppo, `order`) VALUES ('.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs2[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($idgruppo).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($idordine).'))');
}
$dbo->query('INSERT INTO or_righe_ordini(idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, abilita_serial, `order`) VALUES ('.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs2[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($idordine).'))');
}
}
@ -173,16 +160,9 @@ function rimuovi_articolo_daordine($idarticolo, $idordine, $idrigaordine)
global $dbo;
global $dir;
// Leggo la quantità di questo articolo in fattura
$query = 'SELECT idgruppo FROM or_righe_ordini WHERE id='.prepare($idrigaordine);
$rs = $dbo->fetchArray($query);
$idgruppo = $rs[0]['idgruppo'];
if ($dir == 'uscita') {
$non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM or_righe_ordini WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idordine='.prepare($idordine))[0]['non_rimovibili'];
if ($non_rimovibili != 0) {
return false;
}
$non_rimovibili = seriali_non_rimuovibili('id_riga_ordine', $idrigaordine, $dir);
if (!empty($non_rimovibili)) {
return false;
}
// Elimino la riga dall'ordine

View File

@ -17,33 +17,22 @@ echo '
<tbody class="sortable">';
$q = 'SELECT *, (SELECT codice FROM mg_articoli WHERE mg_articoli.id=`or_righe_ordini`.`idarticolo`) AS codice FROM `or_righe_ordini` WHERE idordine='.prepare($id_record).' GROUP BY idgruppo ORDER BY `order`';
$q = 'SELECT *, (SELECT codice FROM mg_articoli WHERE mg_articoli.id=`or_righe_ordini`.`idarticolo`) AS codice FROM `or_righe_ordini` WHERE idordine='.prepare($id_record).' ORDER BY `order`';
$rs = $dbo->fetchArray($q);
if (!empty($rs)) {
foreach ($rs as $r) {
$delete = !empty($r['idarticolo']) ? 'unlink_articolo' : 'unlink_riga';
if (!empty($r['idarticolo'])) {
$qserial = 'SELECT * FROM or_righe_ordini WHERE idordine='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']);
$rsserial = $dbo->fetchArray($qserial);
$mancanti = 0;
$serials = [];
if (!empty($r['abilita_serial'])) {
foreach ($rsserial as $seriali) {
$seriali['serial'] = trim($seriali['serial']);
if (!empty($seriali['serial'])) {
$serials[] = $seriali['serial'];
} else {
++$mancanti;
}
}
}
// Individuazione dei seriali
if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) {
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_ordine='.prepare($r['id'])), 'serial');
$mancanti = $r['qta'] - count($serials);
if ($mancanti > 0) {
$extra = 'class="warning"';
} else {
$mancanti = 0;
}
}
@ -150,7 +139,7 @@ if (!empty($rs)) {
if (!empty($r['idarticolo']) && $r['abilita_serial']) {
echo "
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/ordini/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idgruppo='.$r['idgruppo'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
<a class='btn btn-primary btn-xs'data-toggle='tooltip' title='Aggiorna SN...' onclick=\"launch_modal( 'Aggiorna SN', '".$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
}
echo "

View File

@ -132,7 +132,7 @@ switch (post('op')) {
], [
'parent' => 'id',
'row' => 'idpreventivo',
], $id_record, ['idgruppo' => false]);
], $id_record);
// update_budget_preventivo( $id_record );
$_SESSION['infos'][] = tr('Preventivo modificato correttamente!');
@ -285,5 +285,5 @@ if (post('op') !== null && post('op') != 'update') {
], [
'parent' => 'id',
'row' => 'idpreventivo',
], $id_record, ['idgruppo' => false]);
], $id_record);
}

View File

@ -60,6 +60,7 @@ if (!empty($info['script'])) {
// Scelta del redirect dopo un submit
if (!empty($backto)) {
$hash = filter('hash');
$hash = !starts_with($hash, '#') ? '#'.$hash : $hash;
if ($backto == 'record-edit') {
redirect($rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_parent.$hash);
exit();

View File

@ -57,7 +57,7 @@ $totale = [];
// MATERIALE UTILIZZATO
// Conteggio articoli utilizzati
$rs2 = $dbo->fetchArray('SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice_art, SUM(qta) AS sumqta FROM `mg_articoli_interventi` GROUP BY idgruppo HAVING idintervento='.prepare($idintervento)." AND NOT idarticolo='0' ORDER BY idarticolo ASC");
$rs2 = $dbo->fetchArray('SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice_art, SUM(qta) AS sumqta FROM `mg_articoli_interventi` HAVING idintervento='.prepare($idintervento)." AND NOT idarticolo='0' ORDER BY idarticolo ASC");
if (!empty($rs2)) {
$body .= '
<table class="table_values" cellspacing="0" cellpadding="0" style="font-size:11px; table-layout:fixed; border-color:#aaa;">

View File

@ -27,6 +27,7 @@ UPDATE `co_righe_contratti` SET `idintervento` = (SELECT `id` FROM `in_intervent
UPDATE `co_righe_documenti` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `co_righe_documenti`.`idintervento`);
UPDATE `in_righe_interventi` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `in_righe_interventi`.`idintervento`);
UPDATE `mg_movimenti` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `mg_movimenti`.`idintervento`);
UPDATE `mg_articoli_interventi` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `mg_articoli_interventi`.`idintervento`);
UPDATE `my_impianti_interventi` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `my_impianti_interventi`.`idintervento`);
UPDATE `my_impianto_componenti` SET `idintervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `my_impianto_componenti`.`idintervento`);
UPDATE `my_componenti_interventi` SET `id_intervento` = (SELECT `id` FROM `in_interventi` WHERE `in_interventi`.`idintervento` = `my_componenti_interventi`.`id_intervento`);
@ -37,6 +38,7 @@ ALTER TABLE `co_righe_contratti` CHANGE `idintervento` `idintervento` varchar(25
ALTER TABLE `co_righe_documenti` CHANGE `idintervento` `idintervento` varchar(25);
ALTER TABLE `in_righe_interventi` CHANGE `idintervento` `idintervento` varchar(25);
ALTER TABLE `mg_movimenti` CHANGE `idintervento` `idintervento` varchar(25);
ALTER TABLE `mg_articoli_interventi` CHANGE `idintervento` `idintervento` varchar(25);
ALTER TABLE `my_impianti_interventi` CHANGE `idintervento` `idintervento` varchar(25);
ALTER TABLE `my_impianto_componenti` CHANGE `idintervento` `idintervento` varchar(25);
ALTER TABLE `my_componenti_interventi` CHANGE `id_intervento` `id_intervento` varchar(25);
@ -47,6 +49,7 @@ UPDATE `co_righe_contratti` SET `idintervento` = NULL WHERE `idintervento` = 0 O
UPDATE `co_righe_documenti` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = '';
UPDATE `in_righe_interventi` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = '';
UPDATE `mg_movimenti` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = '';
UPDATE `mg_articoli_interventi` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = '';
UPDATE `my_impianti_interventi` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = '';
UPDATE `my_impianto_componenti` SET `idintervento` = NULL WHERE `idintervento` = 0 OR `idintervento` = '';
UPDATE `my_componenti_interventi` SET `id_intervento` = NULL WHERE `id_intervento` = 0 OR `id_intervento` = '';
@ -57,6 +60,7 @@ ALTER TABLE `co_righe_contratti` CHANGE `idintervento` `idintervento` int(11), A
ALTER TABLE `co_righe_documenti` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
ALTER TABLE `in_righe_interventi` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
ALTER TABLE `mg_movimenti` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
ALTER TABLE `mg_articoli_interventi` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
ALTER TABLE `my_impianti_interventi` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
ALTER TABLE `my_impianto_componenti` CHANGE `idintervento` `idintervento` int(11), ADD FOREIGN KEY (`idintervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
ALTER TABLE `my_componenti_interventi` CHANGE `id_intervento` `id_intervento` int(11), ADD FOREIGN KEY (`id_intervento`) REFERENCES `in_interventi`(`id`) ON DELETE CASCADE;
@ -78,17 +82,6 @@ DROP TABLE `dt_automezzi_tagliandi`;
DROP TABLE `co_contratti_interventi`;
-- RELEASE 2.2.1 [NON UFFICIALE] --
-- Aggiunta del campo idgruppo per differenziare le righe in fatture, ddt e interventi (contenenti gruppi di seriali)
ALTER TABLE `co_righe_documenti` ADD `idgruppo` int(11) NOT NULL AFTER `qta`;
ALTER TABLE `mg_articoli_interventi` ADD `idgruppo` int(11) NOT NULL AFTER `qta`;
ALTER TABLE `dt_righe_ddt` ADD `idgruppo` int(11) NOT NULL AFTER `qta_evasa`;
ALTER TABLE `or_righe_ordini` ADD `idgruppo` int(11) NOT NULL AFTER `qta_evasa`;
UPDATE `co_righe_documenti` SET `idgruppo`=`id`;
UPDATE `dt_righe_ddt` SET `idgruppo`=`id`;
UPDATE `or_righe_ordini` SET `idgruppo`=`id`;
UPDATE `mg_articoli_interventi` SET `idgruppo`=`id`;
-- Aggiunta del campo desc_iva anche per Preventivi, DDT e Ordini
ALTER TABLE `dt_righe_ddt` ADD `desc_iva` varchar(255) NOT NULL AFTER `idiva`;
ALTER TABLE `co_righe_preventivi` ADD `desc_iva` varchar(255) NOT NULL AFTER `idiva`;
@ -746,25 +739,13 @@ ALTER TABLE `dt_righe_ddt` ADD `abilita_serial` boolean NOT NULL DEFAULT '0' AFT
ALTER TABLE `mg_articoli_interventi` ADD `abilita_serial` boolean NOT NULL DEFAULT '0' AFTER `um`;
ALTER TABLE `or_righe_ordini` ADD `abilita_serial` boolean NOT NULL DEFAULT '0' AFTER `um`;
-- Creazione della vista per la gestione dei seriali (la prima del progetto)
CREATE VIEW vw_serials (id_articolo, record, serial, dir) AS
(SELECT idarticolo, CONCAT('ord-', or_ordini.id), serial, or_tipiordine.dir FROM or_righe_ordini LEFT JOIN or_ordini ON or_ordini.id = or_righe_ordini.idordine LEFT JOIN or_tipiordine ON or_tipiordine.id = or_ordini.idtipoordine WHERE or_tipiordine.dir = 'entrata' AND serial != '')
UNION (SELECT idarticolo, CONCAT('fat-', co_documenti.id), serial, co_tipidocumento.dir FROM co_righe_documenti LEFT JOIN co_documenti ON co_documenti.id = co_righe_documenti.iddocumento LEFT JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE serial != '')
UNION (SELECT idarticolo, CONCAT('ddt-', dt_ddt.id), serial, dt_tipiddt.dir FROM dt_righe_ddt LEFT JOIN dt_ddt ON dt_ddt.id = dt_righe_ddt.idddt LEFT JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE serial != '')
UNION (SELECT idarticolo, CONCAT('int-', mg_articoli_interventi.idintervento), serial, 'entrata' FROM mg_articoli_interventi WHERE serial != '')
UNION (SELECT idarticolo, CONCAT('art-', idarticolo), serial, 'uscita' FROM mg_prodotti WHERE serial != '');
-- Aggiunto modulo per visualizzare i movimenti di magazzino
INSERT INTO `zz_modules` (`id`, `name`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES (NULL, 'Movimenti', '', 'SELECT |select| FROM `mg_movimenti` JOIN `mg_articoli` ON `mg_articoli`.id = `mg_movimenti`.`idarticolo` WHERE 1=1 HAVING 2=2', '', 'fa fa-angle-right', '2.3', '2.3', '1', 1, '1', '1');
UPDATE `zz_modules` `t1` INNER JOIN `zz_modules` `t2` ON (`t1`.`name` = 'Movimenti' AND `t2`.`name` = 'Magazzino') SET `t1`.`parent` = `t2`.`id`;
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `enabled`, `default`) VALUES
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Movimenti'), 'Articolo', 'IF(mg_articoli.descrizione != \'\', CONCAT(mg_articoli.codice, \'-\', mg_articoli.descrizione), mg_articoli.codice)', 2, 1, 0, 1, 1),
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Movimenti'), 'Articolo', 'IF(mg_articoli.descrizione != \'\', CONCAT(mg_articoli.codice, \' - \', mg_articoli.descrizione), mg_articoli.codice)', 2, 1, 0, 1, 1),
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Movimenti'), 'Data', 'mg_movimenti.created_at', 5, 1, 0, 1, 1),
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Movimenti'), 'Quantità', 'mg_movimenti.qta', 4, 1, 0, 1, 1),
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Movimenti'), 'Descrizione', 'movimento', 3, 1, 0, 1, 1),
@ -962,3 +943,23 @@ UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE
-- Fix per le sessioni di lavoro dei tecnici precedenti
UPDATE `in_interventi_tecnici` SET `idtipointervento` = (SELECT `idtipointervento` FROM `in_interventi` WHERE `idintervento` = `in_interventi`.`id`) WHERE `idtipointervento` = '';
-- Fix per i serial number
ALTER TABLE `mg_prodotti` ADD `id_riga_documento` int(11), ADD FOREIGN KEY (`id_riga_documento`) REFERENCES `co_righe_documenti`(`id`) ON DELETE CASCADE, ADD `id_riga_ordine` int(11), ADD FOREIGN KEY (`id_riga_ordine`) REFERENCES `or_righe_ordini`(`id`) ON DELETE CASCADE, ADD `id_riga_ddt` int(11), ADD FOREIGN KEY (`id_riga_ddt`) REFERENCES `dt_righe_ddt`(`id`) ON DELETE CASCADE, ADD `id_riga_intervento` int(11), ADD FOREIGN KEY (`id_riga_intervento`) REFERENCES `mg_articoli_interventi`(`id`) ON DELETE CASCADE, ADD `dir` enum('entrata', 'uscita') DEFAULT 'uscita', CHANGE `idarticolo` `id_articolo` int(11), ADD FOREIGN KEY (`id_articolo`) REFERENCES `mg_articoli`(`id`) ON DELETE CASCADE, CHANGE `serial` `serial` varchar(50), CHANGE `lotto` `lotto` varchar(50), CHANGE `altro` `altro` varchar(50);
INSERT INTO `mg_prodotti` (`id_riga_documento`, `dir`, `id_articolo`, `serial`, `lotto`, `altro`) SELECT `id`, (SELECT `dir` FROM `co_tipidocumento` JOIN `co_documenti` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` = `co_righe_documenti`.`iddocumento`), `idarticolo`, `serial`, `lotto`, `altro` FROM `co_righe_documenti`;
INSERT INTO `mg_prodotti` (`id_riga_ordine`, `dir`, `id_articolo`, `serial`, `lotto`, `altro`) SELECT `id`, (SELECT `dir` FROM `or_tipiordine` JOIN `or_ordini` ON `or_tipiordine`.`id` = `or_ordini`.`idtipoordine` WHERE `or_ordini`.`id` = `or_righe_ordini`.`idordine`), `idarticolo`, `serial`, `lotto`, `altro` FROM `or_righe_ordini`;
INSERT INTO `mg_prodotti` (`id_riga_ddt`, `dir`, `id_articolo`, `serial`, `lotto`, `altro`) SELECT `id`, (SELECT `dir` FROM `dt_tipiddt` JOIN `dt_ddt` ON `dt_tipiddt`.`id` = `dt_ddt`.`idtipoddt` WHERE `dt_ddt`.`id` = `dt_righe_ddt`.`idddt`), `idarticolo`, `serial`, `lotto`, `altro` FROM `dt_righe_ddt`;
INSERT INTO `mg_prodotti` (`id_riga_intervento`, `dir`, `id_articolo`, `serial`, `lotto`, `altro`) SELECT `id`, 'entrata', `idarticolo`, `serial`, `lotto`, `altro` FROM `mg_articoli_interventi`;
UPDATE `mg_prodotti` SET `serial` = NULL WHERE `serial` = '';
UPDATE `mg_prodotti` SET `lotto` = NULL WHERE `lotto` = '';
UPDATE `mg_prodotti` SET `altro` = NULL WHERE `altro` = '';
ALTER TABLE `co_righe_documenti` DROP `serial`, DROP `altro`, DROP `lotto`;
ALTER TABLE `mg_articoli_interventi` DROP `serial`, DROP `altro`, DROP `lotto`;
ALTER TABLE `dt_righe_ddt` DROP `serial`, DROP `altro`, DROP `lotto`;
ALTER TABLE `or_righe_ordini` DROP `serial`, DROP `altro`, DROP `lotto`;