1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-01 16:36:45 +01:00

Migliorie note di accredito/addebito

This commit is contained in:
Thomas Zilio 2018-07-04 12:57:53 +02:00
parent b344119e4c
commit cfbe83e0cd
14 changed files with 242 additions and 186 deletions

View File

@ -239,16 +239,19 @@ echo '
<script>';
// Se l'utente ha i permessi in sola lettura per il modulo, converto tutti i campi di testo in span
if (Modules::getPermission($id_module) == 'r') {
?>
$(document).ready( function(){
$('input, textarea, select', 'section.content').attr('readonly', 'true');
$('select, input[type="checkbox"]').prop('disabled', true);
$('a.btn, button, input[type=button], input[type=submit]', 'section.content').hide();
$('a.btn-info, button.btn-info, input[type=button].btn-info', 'section.content').show();
});
<?php
} ?>
if (Modules::getPermission($id_module) == 'r' || !empty($block_edit)) {
$not = (Modules::getPermission($id_module) == 'r') ? '' : '.not(".unblockable")';
echo '
$(document).ready(function(){
$("input, textarea, select", "section.content")'.$not.'.attr("readonly", "true");
$("select, input[type=checkbox]")'.$not.'.prop("disabled", true);
$("a.btn, button, input[type=button], input[type=submit]", "section.content")'.$not.'.hide();
$("a.btn-info, a.btn-warning, button.btn-info, button.btn-warning, input[type=button].btn-info", "section.content")'.$not.'.show();
});';
}
?>
var content_was_modified = false;

View File

@ -272,13 +272,9 @@ switch (post('op')) {
// Operazioni aggiuntive per il logo
if (filter('op') == 'link_file') {
if (Settings::get('Azienda predefinita') == $id_record && filter('nome_allegato') == 'Logo stampe') {
$file = $dbo->selectOne('zz_files', ['filename'], [
'nome' => $nome,
'id_module' => $id_module,
'id_record' => $id_record,
]);
$nome = 'Logo stampe';
Settings::set('Logo stampe', $nome);
if (Settings::get('Azienda predefinita') == $id_record && filter('nome_allegato') == $nome) {
Settings::set($nome, $upload);
}
}

View File

@ -252,6 +252,16 @@ switch (post('op')) {
}
// Operazioni aggiuntive per l'immagine
if (filter('op') == 'unlink_file' && $name == 'Immagine') {
$dbo->query("UPDATE mg_articoli SET immagine01 = '' WHERE id=".prepare($id_record));
if (filter('op') == 'unlink_file' && filter('filename') == $records[0]['immagine01']) {
$dbo->update('mg_articoli', [
'immagine01' => '',
], [
'id' => $id_record,
]);
} elseif (filter('op') == 'link_file' && filter('nome_allegato') == 'Immagine') {
$dbo->update('mg_articoli', [
'immagine01' => $upload,
], [
'id' => $id_record,
]);
}

View File

@ -7,9 +7,14 @@ include_once Modules::filepath('MyImpianti', 'modutil.php');
$_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
$fileinfo = Uploads::fileInfo($records[0]['immagine01']);
$img = !empty($records[0]['immagine01']) ? ROOTDIR.'/'.Uploads::getUploadDirectory($id_module).'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension'] : '';
$img = null;
if (!empty($records[0]['immagine01'])) {
$fileinfo = Uploads::fileInfo($records[0]['immagine01']);
$default_img = '/'.Uploads::getUploadDirectory($id_module).'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension'];
$img = file_exists(DOCROOT.$default_img) ? ROOTDIR.$default_img : ROOTDIR.'/'.Uploads::getUploadDirectory($id_module).'/'.$records[0]['immagine01'];
}
?><form action="" method="post" id="edit-form" enctype="multipart/form-data">
<input type="hidden" name="backto" value="record-edit">
@ -24,7 +29,7 @@ $img = !empty($records[0]['immagine01']) ? ROOTDIR.'/'.Uploads::getUploadDirecto
<div class="panel-body">
<div class="row">
<div class="col-md-3">
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine01", "class": "img-thumbnail", "value": "<?php echo $img; ?>" ]}
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine01", "class": "img-thumbnail", "value": "<?php echo $img; ?>" ]}
</div>
<div class="col-md-4">

View File

@ -93,7 +93,7 @@ switch (post('op')) {
// Query di aggiornamento
$dbo->update('co_documenti', [
'data' => post('data'),
'numero' => $numero,
'#numero' => $numero,
'numero_esterno' => post('numero_esterno'),
'note' => post('note'),
'note_aggiuntive' => post('note_aggiuntive'),
@ -110,7 +110,7 @@ switch (post('op')) {
'idaspettobeni' => post('idaspettobeni'),
'idvettore' => post('idvettore'),
'idsede' => post('idsede'),
'idconto' => post('idconto'),
'idconto' => post('idconto'),
'idrivalsainps' => $idrivalsainps,
'idritenutaacconto' => $idritenutaacconto,
@ -170,12 +170,11 @@ switch (post('op')) {
// eliminazione documento
case 'delete':
// 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);
$rs = $dbo->fetchArray('SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record));
foreach ($rs as $value) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $value['id'], $dir);
// Controllo sui seriali
foreach ($rs as $r) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $r['id'], $dir);
if (!empty($non_rimovibili)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
@ -183,57 +182,27 @@ switch (post('op')) {
}
}
for ($i = 0; $i < sizeof($rs); ++$i) {
rimuovi_articolo_dafattura($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']);
// Rimozione righe
foreach ($rs as $r) {
rimuovi_riga_fattura($id_record, $r['id'], $dir);
}
// 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);
$rs = $dbo->fetchArray('SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idpreventivo IS NOT NULL');
for ($i = 0; $i < sizeof($rs); ++$i) {
$dbo->query("UPDATE co_preventivi SET idstato=(SELECT id FROM co_statipreventivi WHERE descrizione='In lavorazione') WHERE id=".prepare($rs[$i]['idpreventivo']));
}
// Se ci sono degli interventi collegati li rimetto nello stato "Completato"
$query = 'SELECT idintervento FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idintervento IS NOT NULL';
$rs = $dbo->fetchArray($query);
$rs = $dbo->fetchArray('SELECT idintervento FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idintervento IS NOT NULL');
for ($i = 0; $i < sizeof($rs); ++$i) {
$dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id=".prepare($rs[$i]['idintervento']));
}
// 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, idddt, idiva FROM co_righe_documenti WHERE iddocumento='.prepare($id_record));
foreach ($rs as $r) {
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$r['qta'].' WHERE descrizione='.prepare($r['descrizione']).' AND idarticolo='.prepare($r['idarticolo']).' AND idordine='.prepare($r['idordine']).' AND idiva='.prepare($r['idiva']));
}
// Se delle righe sono state create da un ddt, devo riportare la quantità evasa nella tabella dei ddt al valore di prima, riaggiungendo la quantità che sto togliendo
foreach ($rs as $r) {
$dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$r['qta'].' WHERE descrizione='.prepare($r['descrizione']).' AND idarticolo='.prepare($r['idarticolo']).' AND idddt='.prepare($r['idddt']).' AND idiva='.prepare($r['idiva']));
}
$dbo->query('DELETE FROM co_documenti WHERE id='.prepare($id_record));
$dbo->query('DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record));
$dbo->query('DELETE FROM co_scadenziario WHERE iddocumento='.prepare($id_record));
$dbo->query('DELETE FROM mg_movimenti WHERE iddocumento='.prepare($id_record));
$dbo->query('DELETE FROM co_movimenti WHERE iddocumento='.prepare($id_record));
//Aggiorno gli stati dei ddt
if (get_var('Cambia automaticamente stato ddt fatturati')) {
foreach ($rs as $r) {
$dbo->query('UPDATE dt_ddt SET idstatoddt=(SELECT id FROM dt_statiddt WHERE descrizione="'.get_stato_ddt($r['idddt']).'") WHERE id = '.prepare($r['idddt']));
}
}
//Aggiorno gli stati degli ordini
if (get_var('Cambia automaticamente stato ordini fatturati')) {
foreach ($rs as $r) {
$dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($r['idordine']).'") WHERE id = '.prepare($r['idordine']));
}
}
// Azzeramento collegamento della rata contrattuale alla pianificazione
$dbo->query('UPDATE co_ordiniservizio_pianificazionefatture SET iddocumento=0 WHERE iddocumento='.prepare($id_record));
@ -511,7 +480,7 @@ switch (post('op')) {
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
ricalcola_costiagg_fattura($id_record);
}
// Metto l'intervento in stato "Fatturato"
@ -647,7 +616,7 @@ switch (post('op')) {
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
ricalcola_costiagg_fattura($id_record);
}
}
@ -716,7 +685,7 @@ switch (post('op')) {
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
ricalcola_costiagg_fattura($id_record);
}
}
}
@ -732,6 +701,10 @@ switch (post('op')) {
$idum = post('um');
$qta = $post['qta'];
if (!empty($records[0]['is_reversed'])) {
$qta = -$qta;
}
$prezzo = $post['prezzo'];
// Calcolo dello sconto
@ -756,6 +729,10 @@ switch (post('op')) {
$calcolo_ritenutaacconto = post('calcolo_ritenutaacconto');
$qta = $post['qta'];
if (!empty($records[0]['is_reversed'])) {
$qta = -$qta;
}
$prezzo = $post['prezzo'];
// Calcolo dello sconto
@ -820,6 +797,10 @@ switch (post('op')) {
$calcolo_ritenutaacconto = post('calcolo_ritenutaacconto');
$qta = $post['qta'];
if (!empty($records[0]['is_reversed'])) {
$qta = -$qta;
}
$prezzo = $post['prezzo'];
// Calcolo dello sconto
@ -1195,7 +1176,7 @@ switch (post('op')) {
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
ricalcola_costiagg_fattura($id_record);
}
// Lettura interventi collegati
@ -1225,49 +1206,23 @@ switch (post('op')) {
// Scollegamento articolo da documento
case 'unlink_articolo':
if (!empty($id_record) && isset($post['idarticolo'])) {
if (!empty($id_record)) {
$idriga = post('idriga');
$idarticolo = post('idarticolo');
// Leggo se la riga è collegata a un ddt, per aggiornargli lo stato
$rs = $dbo->fetchArray('SELECT qta, descrizione, idarticolo, idddt, idordine, idiva FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga));
$idddt = $rs[0]['idddt'];
$idordine = $rs[0]['idordine'];
if (!rimuovi_articolo_dafattura($idarticolo, $id_record, $idriga)) {
if (!rimuovi_riga_fattura($id_record, $idriga, $dir)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
return;
}
if ($dbo->query('DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga))) {
if (!empty($idddt)) {
// Se nella fattura non c'é più il ddt rimosso, aggiorno lo stato del ddt in "Bozza"
$rs = $dbo->fetchArray('SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idddt='.prepare($idddt));
if (sizeof($rs) == 0 && get_var('Cambia automaticamente stato ddt fatturati')) {
$dbo->query('UPDATE dt_ddt SET idstatoddt=(SELECT id FROM dt_statiddt WHERE descrizione="Bozza") WHERE id = '.prepare($idddt));
}
}
if (!empty($idordine)) {
// Se nella fattura non c'é più l'ordine rimosso, aggiorno lo stato dell'ordine in "Bozza"
$rs = $dbo->fetchArray('SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idordine='.prepare($idordine));
if (sizeof($rs) == 0 && get_var('Cambia automaticamente stato ordini fatturati')) {
$dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="Bozza") WHERE id = '.prepare($idordine));
}
}
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
}
$_SESSION['infos'][] = tr('Articolo rimosso!');
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record);
}
$_SESSION['infos'][] = tr('Articolo rimosso!');
}
break;
@ -1313,7 +1268,7 @@ switch (post('op')) {
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
ricalcola_costiagg_fattura($id_record);
}
$_SESSION['infos'][] = tr('Preventivo rimosso!');
@ -1363,7 +1318,7 @@ switch (post('op')) {
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
ricalcola_costiagg_fattura($id_record);
}
$_SESSION['infos'][] = tr('Contratto rimosso!');
@ -1376,53 +1331,16 @@ switch (post('op')) {
if (isset($post['idriga'])) {
$idriga = post('idriga');
// Se la riga è stata creata 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($id_record).' AND id='.prepare($idriga));
$idordine = $rs[0]['idordine'];
rimuovi_riga_fattura($id_record, $idriga, $dir);
// Rimpiazzo la quantità negli ordini
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$rs[0]['qta'].' WHERE descrizione='.prepare($rs[0]['descrizione']).' AND idarticolo='.prepare($rs[0]['idarticolo']).' AND idordine='.prepare($rs[0]['idordine']).' AND idiva='.prepare($rs[0]['idiva']));
// Se la riga è stata creata da un ddt, devo riportare la quantità evasa nella tabella dei ddt
// al valore di prima, riaggiungendo la quantità che sto togliendo
$rs = $dbo->fetchArray('SELECT qta, descrizione, idarticolo, idddt, idordine, idiva FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga));
$idddt = $rs[0]['idddt'];
$idordine = $rs[0]['idordine'];
// Rimpiazzo la quantità nei ddt
$dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$rs[0]['qta'].' WHERE descrizione='.prepare($rs[0]['descrizione']).' AND idarticolo='.prepare($rs[0]['idarticolo']).' AND idddt='.prepare($rs[0]['idddt']).' AND idiva='.prepare($rs[0]['idiva']));
$query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga);
if ($dbo->query($query)) {
if (!empty($idddt)) {
// Se nella fattura non c'é più il ddt rimosso, aggiorno lo stato del ddt in "Bozza"
$rs = $dbo->fetchArray('SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idddt='.prepare($idddt));
if (sizeof($rs) == 0 && get_var('Cambia automaticamente stato ddt fatturati')) {
$dbo->query('UPDATE dt_ddt SET idstatoddt=(SELECT id FROM dt_statiddt WHERE descrizione="Bozza") WHERE id = '.prepare($idddt));
}
}
if (!empty($idordine)) {
// Se nella fattura non c'é più l'ordine rimosso, aggiorno lo stato dell'ordine in "Bozza"
$rs = $dbo->fetchArray('SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idordine='.prepare($idordine));
if (sizeof($rs) == 0 && get_var('Cambia automaticamente stato ordini fatturati')) {
$dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="Bozza") WHERE id = '.prepare($idordine));
}
}
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record, 0, 0, 0);
}
$_SESSION['infos'][] = tr('Riga rimossa!');
// Ricalcolo inps, ritenuta e bollo
if ($dir == 'entrata') {
ricalcola_costiagg_fattura($id_record);
} else {
ricalcola_costiagg_fattura($id_record);
}
$_SESSION['infos'][] = tr('Riga rimossa!');
}
break;
@ -1460,9 +1378,6 @@ switch (post('op')) {
case 'add_ordine':
$idordine = $post['iddocumento'];
$rs = $dbo->fetchArray('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
$idconto = $rs[0]['idconto'];
// Lettura di tutte le righe della tabella in arrivo
foreach ($post['qta_da_evadere'] as $i => $value) {
// Processo solo le righe da evadere
@ -1497,6 +1412,10 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
$desc_iva = $rs[0]['descrizione'];
$rs = $dbo->fetchArray('SELECT * FROM co_righe_documenti WHERE id='.prepare($idriga));
$idconto = $rs[0]['idconto'];
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
if (!empty($idarticolo)) {
$idiva_acquisto = $idiva;
@ -1531,7 +1450,11 @@ switch (post('op')) {
$numero = get_new_numerofattura($records[0]['data']);
$numero_esterno = get_new_numerosecondariofattura($records[0]['data']);
$dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($id_record).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di accredito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record));
$rs = $dbo->fetchArray('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
$idconto = $rs[0]['idconto'];
$ref_documento = $id_record;
$dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($ref_documento).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di accredito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record));
$id_record = $dbo->lastInsertedID();
// Lettura di tutte le righe della tabella in arrivo
@ -1579,14 +1502,19 @@ switch (post('op')) {
$serials = array_filter($serials, function ($value) { return !empty($value); });
$dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => 'uscita', 'id_articolo' => $idarticolo], ['serial' => $serials]);
$dbo->detach('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => 'entrata', 'id_articolo' => $idarticolo], ['serial' => $serials]);
}
// Inserimento riga normale
elseif ($qta != 0) {
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idordine, 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($idordine).', '.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);
$riga = $dbo->lastInsertedID();
}
$dbo->query('UPDATE co_righe_documenti SET ref_riga_documento = '.prepare($idriga).' WHERE id='.prepare($riga));
// Scalo la quantità dall ordine
$dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.(-$qta).' WHERE id='.prepare($idriga));
}

View File

@ -190,7 +190,7 @@ if (!empty($rs)) {
echo '
<td>';
if (!empty($r['abilita_serial'])) {
$query = 'SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti AS t WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')';
$query = 'SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir='.prepare($dir).' AND '.$row.' = '.prepare($r['id']).' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti AS t WHERE serial IS NOT NULL AND dir='.prepare($dir).' AND '.$data[$pos]['condition'].')';
$values = $dbo->fetchArray($query);
if (!empty($values)) {

View File

@ -2,6 +2,8 @@
include_once __DIR__.'/../../core.php';
$block_edit = !empty($note_accredito);
$rs = $dbo->fetchArray('SELECT co_tipidocumento.descrizione, dir FROM co_tipidocumento INNER JOIN co_documenti ON co_tipidocumento.id=co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id_record));
$dir = $rs[0]['dir'];
$tipodoc = $rs[0]['descrizione'];
@ -378,6 +380,25 @@ include $docroot.'/modules/fatture/row-list.php';
});
</script>
<?php
if(!empty($note_accredito)){
echo '
<div class="alert alert-info text-center">'.tr('Note di accredito collegate').':';
foreach($note_accredito as $nota){
$text = tr('Rif. fattura _NUM_ del _DATE_', [
'_NUM_' => $nota['numero'],
'_DATE_' => Translator::dateToLocale($nota['data']),
]);
echo '
<br>'.Modules::link('Fatture di vendita', $nota['id'], $text, $text);
}
echo '
</div>';
}
?>
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
</a>

View File

@ -9,5 +9,7 @@ if ($module['name'] == 'Fatture di vendita') {
}
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));
$records = $dbo->fetchArray('SELECT *, co_tipidocumento.reversed AS is_reversed, 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));
$note_accredito = $dbo->fetchArray("SELECT co_documenti.id, IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE reversed = 1 AND ref_documento=".prepare($id_record));
}

View File

@ -617,31 +617,17 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu
$netto_a_pagare = $totale_fattura - $ritenutaacconto;
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace(',', '.', $bolli);
$bolli = floatval($bolli);
if ($dir == 'uscita') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > get_var("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
}
} else {
$bolli = str_replace(',', '.', get_var('Importo marca da bollo'));
if (abs($bolli) > 0 && abs($netto_a_pagare) > abs(get_var("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
$bolli = ($dir == 'uscita') ? $bolli : get_var('Importo marca da bollo');
$bolli = Translator::getFormatter()->parse($bolli);
// Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo
if ($netto_a_pagare < 0) {
$marca_da_bollo *= -1;
}
$marca_da_bollo = 0;
if (abs($bolli) > 0 && abs($netto_a_pagare > get_var("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = $bolli;
}
// Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo
$marca_da_bollo = abs($marca_da_bollo);
$dbo->query('UPDATE co_documenti SET ritenutaacconto='.prepare($ritenutaacconto).', rivalsainps='.prepare($rivalsainps).', iva_rivalsainps='.prepare($iva_rivalsainps).', bollo='.prepare($marca_da_bollo).' WHERE id='.prepare($iddocumento));
} else {
$dbo->query("UPDATE co_documenti SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id=".prepare($iddocumento));
@ -784,15 +770,16 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento)
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$qta.' WHERE qta='.prepare($qta).' AND idarticolo='.prepare($idarticolo).' AND idordine='.prepare($idordine));
}
}
// Elimino la riga dal documento
$dbo->query('DELETE FROM `co_righe_documenti` WHERE id='.prepare($idrigadocumento).' AND iddocumento='.prepare($iddocumento));
//Aggiorno lo stato dell'ordine
// Aggiorno lo stato dell'ordine
if (get_var('Cambia automaticamente stato ordini fatturati') && !empty($idordine)) {
$dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($idordine).'") WHERE id = '.prepare($idordine));
}
//Aggiorno lo stato del ddt
// Aggiorno lo stato del ddt
if (get_var('Cambia automaticamente stato ddt fatturati') && !empty($idddt)) {
$dbo->query('UPDATE dt_ddt SET idstatoddt=(SELECT id FROM dt_statiddt WHERE descrizione="'.get_stato_ddt($idddt).'") WHERE id = '.prepare($idddt));
}
@ -862,6 +849,9 @@ function controlla_seriali($field, $id_riga, $old_qta, $new_qta, $dir)
{
$dbo = Database::getConnection();
$new_qta = abs($new_qta);
$old_qta = abs($old_qta);
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))) {
@ -1035,3 +1025,73 @@ function doc_references($info, $dir, $ignore = [])
return [];
}
function rimuovi_riga_fattura($id_documento, $id_riga, $dir)
{
$dbo = Database::getConnection();
// Leggo la quantità di questo articolo in fattura
$riga = $dbo->fetchOne('SELECT * FROM co_righe_documenti WHERE id='.prepare($id_riga));
$non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $id_riga, $dir);
if (!empty($non_rimovibili)) {
return false;
}
$serials = $dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_documento='.prepare($id_riga));
// Elimino la riga dal documento
$dbo->query('DELETE FROM `co_righe_documenti` WHERE id='.prepare($id_riga).' AND iddocumento='.prepare($id_documento));
if (empty($riga['qta'])) {
return true;
}
// Operazioni per la rimozione degli articoli
if (!empty($riga['idarticolo'])) {
// Movimentazione articoli se da interventi o ddt
if (empty($riga['idintervento']) && empty($riga['idddt'])) {
add_movimento_magazzino($riga['idarticolo'], ($dir == 'entrata') ? $riga['qta'] : -$riga['qta'], ['iddocumento' => $id_documento]);
}
// TODO: possibile ambiguità tra righe molto simili tra loro
// Se l'articolo è stato inserito in fattura tramite un ddt devo sanare la qta_evasa
if (!empty($riga['idddt'])) {
$dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idddt='.prepare($riga['idddt']));
}
// TODO: possibile ambiguità tra righe molto simili tra loro
// Se l'articolo è stato inserito in fattura tramite un ordine devo sanare la qta_evasa
if (!empty($riga['idordine'])) {
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idordine='.prepare($riga['idordine']));
}
// Nota di accredito
if (!empty($riga['ref_riga_documento'])) {
$dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.$riga['qta'].' WHERE id='.prepare($riga['ref_riga_documento']));
$serials = array_column($serials, 'serial');
$serials = array_filter($serials, function ($value) { return !empty($value); });
$dbo->attach('mg_prodotti', ['id_riga_documento' => $riga['ref_riga_documento'], 'dir' => $dir, 'id_articolo' => $riga['idarticolo']], ['serial' => $serials]);
}
}
// Aggiorno lo stato dell'ordine
if (!empty($riga['idordine']) && get_var('Cambia automaticamente stato ordini fatturati')) {
$dbo->query('UPDATE or_ordini SET idstatoordine = (SELECT id FROM or_statiordine WHERE descrizione = '.prepare(get_stato_ordine($riga['idordine'])).') WHERE id = '.prepare($riga['idordine']));
}
// Aggiorno lo stato del ddt
if (!empty($riga['idddt']) && get_var('Cambia automaticamente stato ddt fatturati')) {
$dbo->query('UPDATE dt_ddt SET idstatoddt = (SELECT id FROM dt_statiddt WHERE descrizione = '.prepare(get_stato_ddt($riga['idddt'])).') WHERE id = '.prepare($riga['idddt']));
}
// Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro
$dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($riga['idarticolo']).' AND iddocumento = '.prepare($id_documento).' AND id = '.prepare($id_riga));
// Elimino i seriali utilizzati dalla riga
$dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($riga['idarticolo']).' AND id_riga_documento = '.prepare($id_riga));
return true;
}

View File

@ -99,8 +99,19 @@ if (!empty($rs)) {
}
// Aggiunta dei riferimenti ai documenti
$ref = doc_references($r, $dir, ['iddocumento']);
if (!empty($records[0]['ref_documento'])) {
$data = $dbo->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti WHERE id = ".prepare($records[0]['ref_documento']));
$text = tr('Rif. fattura _NUM_ del _DATE_', [
'_NUM_' => $data[0]['numero'],
'_DATE_' => Translator::dateToLocale($data[0]['data']),
]);
echo '
<br>'.Modules::link('Fatture di vendita', $records[0]['ref_documento'], $text, $text);
}
$ref = doc_references($r, $dir, ['iddocumento']);
if (!empty($ref)) {
echo '
<br>'.Modules::link($ref['module'], $ref['id'], $ref['description'], $ref['description']);
@ -195,7 +206,7 @@ if (!empty($rs)) {
echo "
<div class='input-group-btn'>";
if (!empty($r['idarticolo']) && $r['abilita_serial'] && (empty($r['idddt']) || empty($r['idintervento']))) {
if (empty($records[0]['is_reversed']) && !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.'&idriga='.$r['id'].'&idarticolo='.$r['idarticolo']."', 1 );\"><i class='fa fa-barcode' aria-hidden='true'></i></a>";
}

View File

@ -327,7 +327,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
<?php
//fatture collegate a questo intervento
// Fatture collegate a questo intervento
$fatture = $dbo->fetchArray('SELECT `co_documenti`.*, `co_tipidocumento`.`descrizione` AS tipo_documento, `co_tipidocumento`.`dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idintervento` = '.prepare($id_record).') ORDER BY `data`');
if (!empty($fatture)) {

View File

@ -51,7 +51,7 @@ class FileManager implements ManagerInterface
$count = 0;
$where = '`id_record` = '.prepare($options['id_record']).' AND `id_module` '.(!empty($options['id_module']) ? '= '.prepare($options['id_module']) : 'IS NULL').' AND `id_plugin` '.(!empty($options['id_plugin']) ? '= '.prepare($options['id_plugin']) : 'IS NULL').'';
$where = '`id_module` '.(!empty($options['id_module']) ? '= '.prepare($options['id_module']) : 'IS NULL').' AND `id_plugin` '.(!empty($options['id_plugin']) ? '= '.prepare($options['id_plugin']) : 'IS NULL').'';
// Categorie
$categories = $dbo->fetchArray('SELECT DISTINCT `category` FROM `zz_files` WHERE '.$where.' ORDER BY `category`');
@ -76,7 +76,7 @@ class FileManager implements ManagerInterface
<th width="15%" class="text-center">'.tr('Opzioni').'</th>
</tr>';
$rs = $dbo->fetchArray('SELECT * FROM `zz_files` WHERE `category`'.(!empty($category) ? '= '.prepare($category) : 'IS NULL').' AND '.$where);
$rs = $dbo->fetchArray('SELECT * FROM `zz_files` WHERE `category`'.(!empty($category) ? '= '.prepare($category) : 'IS NULL').' AND `id_record` = '.prepare($options['id_record']).' AND '.$where);
foreach ($rs as $r) {
$result .= '

View File

@ -92,11 +92,28 @@ foreach ($righe as $r) {
}
// Aggiunta dei riferimenti ai documenti
if (!empty($records[0]['ref_documento'])) {
$data = $dbo->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti WHERE id = ".prepare($records[0]['ref_documento']));
$text = tr('Rif. fattura _NUM_ del _DATE_', [
'_NUM_' => $data[0]['numero'],
'_DATE_' => Translator::dateToLocale($data[0]['data']),
]);
echo '
<br><small>'.$text.'</small>';
if ($count <= 1) {
$count += 0.4;
}
}
$ref = doc_references($r, $records[0]['dir'], ['iddocumento']);
if (!empty($ref)) {
echo '
<br><small>'.$ref['description'].'</small>';
if ($count <= 1) {
$count += 0.4;
}

View File

@ -373,7 +373,10 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
-- Aggiunto supporto a Note di accredito e addebito
ALTER TABLE `co_documenti` ADD `ref_documento` int(11) AFTER `idagente`, ADD FOREIGN KEY (`ref_documento`) REFERENCES `co_documenti`(`id`) ON DELETE CASCADE;
ALTER TABLE `co_righe_documenti` ADD `qta_evasa` int(11) NOT NULL AFTER `qta`;
ALTER TABLE `co_righe_documenti` ADD `qta_evasa` int(11) NOT NULL AFTER `qta`, ADD `ref_riga_documento` int(11) AFTER `idcontratto`, ADD FOREIGN KEY (`ref_riga_documento`) REFERENCES `co_righe_documenti`(`id`) ON DELETE CASCADE;
ALTER TABLE `co_tipidocumento` ADD `reversed` BOOLEAN NOT NULL DEFAULT FALSE AFTER `dir`;
UPDATE `co_tipidocumento` SET `reversed` = 1 WHERE `descrizione` = 'Nota di accredito';
-- Fix id_sottocategoria in mg_articoli
ALTER TABLE `mg_articoli` CHANGE `id_sottocategoria` `id_sottocategoria` int(11);