Compare commits
10 Commits
10084e3e3d
...
b82551d035
Author | SHA1 | Date |
---|---|---|
Dasc3er | b82551d035 | |
Dasc3er | 10e1301eb7 | |
MatteoPistorello | 47891b2854 | |
MatteoPistorello | 22c6ea2401 | |
Dasc3er | 67ad05b3a7 | |
Dasc3er | 1e6833e80f | |
Dasc3er | 20ca61c5d3 | |
Dasc3er | 1c458b2bcf | |
Dasc3er | 8855fd0832 | |
Dasc3er | f26fc17a89 |
|
@ -81,7 +81,8 @@ input[type=file] {
|
|||
position: fixed;
|
||||
}
|
||||
|
||||
.ui-autocomplete {
|
||||
.autocomplete, .ui-autocomplete {
|
||||
background: white;
|
||||
z-index: 10000;
|
||||
min-width: 160px;
|
||||
padding: 10px;
|
||||
|
@ -94,8 +95,23 @@ input[type=file] {
|
|||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.ui-autocomplete-category {
|
||||
font-size: 150%;
|
||||
.autocomplete .group, .ui-autocomplete-category {
|
||||
font-size: 1.5em;
|
||||
background: inherit;
|
||||
}
|
||||
|
||||
.autocomplete > div {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
background: #FFFF66;
|
||||
}
|
||||
|
||||
.autocomplete > div:hover:not(.group),
|
||||
.autocomplete > div.selected {
|
||||
background: #F5F5F5;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.ui-autocomplete-scrollable {
|
||||
|
|
|
@ -138,7 +138,7 @@ $(document).ready(function () {
|
|||
$(this).attr("data-id_records", "");
|
||||
$(this).data("id_records", "");
|
||||
} else {
|
||||
swal(globals.translations.waiting, globals.translations.waiting_msg, "error");
|
||||
swal(globals.translations.waiting, globals.translations.waitingMessage, "error");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -17,88 +17,75 @@
|
|||
*/
|
||||
|
||||
$(document).ready(function () {
|
||||
$('#supersearch').keyup(function () {
|
||||
$(document).ajaxStop();
|
||||
const searchInput = $('#supersearch');
|
||||
const searchButton = searchInput.parent().find('i');
|
||||
const searches = [];
|
||||
|
||||
if ($(this).val() == '') {
|
||||
$(this).removeClass('wait');
|
||||
} else {
|
||||
$(this).addClass('wait');
|
||||
}
|
||||
});
|
||||
autocomplete({
|
||||
minLength: 1,
|
||||
input: searchInput[0],
|
||||
emptyMsg: globals.translations.noResults,
|
||||
debounceWaitMs: 500,
|
||||
fetch: function(text, update) {
|
||||
text = text.toLowerCase();
|
||||
|
||||
$.widget("custom.supersearch", $.ui.autocomplete, {
|
||||
_create: function () {
|
||||
this._super();
|
||||
this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
|
||||
},
|
||||
_renderMenu: function (ul, items) {
|
||||
if (items[0].value == undefined) {
|
||||
$('#supersearch').removeClass('wait');
|
||||
ul.html('');
|
||||
} else {
|
||||
var that = this,
|
||||
currentCategory = "";
|
||||
// Registrazione ricerca
|
||||
searches.push(text);
|
||||
searchButton
|
||||
.removeClass('fa-search')
|
||||
.addClass('fa-spinner fa-spin');
|
||||
|
||||
ul.addClass('ui-autocomplete-scrollable');
|
||||
ul.css('z-index', '999');
|
||||
|
||||
$.each(items, function (index, item) {
|
||||
|
||||
if (item.category != currentCategory) {
|
||||
ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
|
||||
currentCategory = item.category;
|
||||
}
|
||||
|
||||
that._renderItemData(ul, item);
|
||||
});
|
||||
}
|
||||
},
|
||||
_renderItem: function (ul, item) {
|
||||
return $("<li>")
|
||||
.append("<a href='" + item.link + "' title='Clicca per aprire'><b>" + item.value + "</b><br/>" + item.label + "</a>")
|
||||
.appendTo(ul);
|
||||
}
|
||||
});
|
||||
|
||||
// Configurazione supersearch
|
||||
var $super = $('#supersearch').supersearch({
|
||||
minLength: 3,
|
||||
select: function (event, ui) {
|
||||
location.href = ui.item.link;
|
||||
},
|
||||
source: function (request, response) {
|
||||
$.ajax({
|
||||
url: globals.rootdir + '/ajax_search.php',
|
||||
dataType: "json",
|
||||
dataType: "JSON",
|
||||
data: {
|
||||
term: request.term
|
||||
term: text,
|
||||
},
|
||||
|
||||
complete: function (jqXHR) {
|
||||
$('#supersearch').removeClass('wait');
|
||||
},
|
||||
|
||||
success: function (data) {
|
||||
if (data == null) {
|
||||
response($.map(['a'], function (item) {
|
||||
return false;
|
||||
}));
|
||||
} else {
|
||||
response($.map(data, function (item) {
|
||||
labels = (item.labels).toString();
|
||||
labels = labels.replace('<br/>,', '<br/>');
|
||||
// Fix per gestione risultati null
|
||||
data = data ? data : [];
|
||||
|
||||
// Trasformazione risultati in formato leggibile
|
||||
const results = data.map(function (result) {
|
||||
return {
|
||||
label: labels,
|
||||
category: item.category,
|
||||
link: item.link,
|
||||
value: item.title
|
||||
}
|
||||
}));
|
||||
}
|
||||
label: result.label ? result.label : '<h4>' + result.title + '</h4>' + result.labels
|
||||
.join('').split('<br/>,').join('<br/>'),
|
||||
group: result.category,
|
||||
link: result.link,
|
||||
value: result.title
|
||||
}
|
||||
});
|
||||
|
||||
// Rimozione ricerca in corso
|
||||
searches.pop();
|
||||
if (searches.length === 0) {
|
||||
searchButton
|
||||
.removeClass('fa-spinner fa-spin')
|
||||
.addClass('fa-search');
|
||||
}
|
||||
|
||||
update(results);
|
||||
},
|
||||
error: function (){
|
||||
searchButton
|
||||
.removeClass('fa-spinner fa-spin')
|
||||
.addClass('fa-exclamation-triangle');
|
||||
}
|
||||
});
|
||||
},
|
||||
preventSubmit: true,
|
||||
disableAutoSelect: true,
|
||||
onSelect: function(item) {
|
||||
window.location.href = item.link;
|
||||
},
|
||||
customize: function(input, inputRect, container, maxHeight) {
|
||||
container.style.width = '600px';
|
||||
},
|
||||
render: function(item, currentValue){
|
||||
const itemElement = document.createElement("div");
|
||||
itemElement.innerHTML = item.label;
|
||||
// <a href='" + item.link + "' title='Clicca per aprire'><b>" + item.value + "</b><br/>" + item.label + "</a>
|
||||
return itemElement;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -0,0 +1,308 @@
|
|||
/*
|
||||
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
||||
* Copyright (C) DevCode s.r.l.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Disabling autoDiscover, otherwise Dropzone will try to attach twice.
|
||||
Dropzone.autoDiscover = false;
|
||||
|
||||
/**
|
||||
* Restituisce filename ed estensione di un file indicato.
|
||||
* @param path
|
||||
* @returns [string, string]
|
||||
*/
|
||||
function getFilenameAndExtension(path) {
|
||||
let filename_extension = path.replace(/^.*[\\\/]/, '');
|
||||
let filename = filename_extension.substring(0, filename_extension.lastIndexOf('.'));
|
||||
let ext = filename_extension.split('.').pop();
|
||||
|
||||
return [filename, ext];
|
||||
}
|
||||
|
||||
/**
|
||||
* Inizializza la gestione degli allegati.
|
||||
* @param gestione
|
||||
*/
|
||||
function initGestioneAllegati(gestione) {
|
||||
const dropzone_id = '#' + gestione.attr('id') + ' .dropzone';
|
||||
const maxFilesize = gestione.data('max_filesize');
|
||||
if ($(dropzone_id).length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
let params = new URLSearchParams({
|
||||
op: "aggiungi-allegato",
|
||||
id_module: gestione.data('id_module'),
|
||||
id_plugin: gestione.data('id_plugin'),
|
||||
id_record: gestione.data('id_record'),
|
||||
}).toString();
|
||||
|
||||
let dragdrop = new Dropzone(dropzone_id, {
|
||||
dictDefaultMessage: globals.translations.allegati.messaggio + ".<br>(" + globals.translations.allegati.maxFilesize.replace('_SIZE_', maxFilesize) + ")",
|
||||
paramName: "file",
|
||||
maxFilesize: maxFilesize, // MB
|
||||
uploadMultiple: false,
|
||||
parallelUploads: 2,
|
||||
addRemoveLinks: false,
|
||||
autoProcessQueue: true,
|
||||
autoQueue: true,
|
||||
url: globals.rootdir + "/actions.php?" + params,
|
||||
init: function (file, xhr, formData) {
|
||||
this.on("success", function (file) {
|
||||
dragdrop.removeFile(file);
|
||||
});
|
||||
|
||||
this.on("complete", function (file) {
|
||||
// Ricarico solo quando ho finito
|
||||
if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
|
||||
ricaricaAllegati(gestione);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per l'apertura della schermata di modifica per una categoria di allegati.
|
||||
* @param gestione
|
||||
* @param pulsanteModifica
|
||||
*/
|
||||
function modificaCategoriaAllegati(gestione, pulsanteModifica) {
|
||||
const categoria = $(pulsanteModifica).parent().parent();
|
||||
console.log(categoria)
|
||||
|
||||
const nome = categoria.find(".box-title");
|
||||
nome.addClass('hidden');
|
||||
$(pulsanteModifica).addClass('hidden');
|
||||
|
||||
const pulsanteSalva = categoria.find(".category-save");
|
||||
const pulsanteAnnulla = categoria.find(".category-cancel");
|
||||
const inputNome = categoria.find(".category-name");
|
||||
pulsanteSalva.removeClass("hidden");
|
||||
pulsanteAnnulla.removeClass("hidden");
|
||||
inputNome.removeClass("hidden");
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per salvare le modifiche effettuate su una categoria di allegati.
|
||||
* @param gestione
|
||||
* @param pulsanteSalva
|
||||
*/
|
||||
function salvaCategoriaAllegati(gestione, pulsanteSalva) {
|
||||
const categoria = $(pulsanteSalva).parent().parent();
|
||||
|
||||
const nome = categoria.find(".box-title");
|
||||
const inputNome = categoria.find(".category-name");
|
||||
|
||||
mostraCaricamentoAllegati(gestione);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
cache: false,
|
||||
type: "POST",
|
||||
data: {
|
||||
op: "modifica-categoria-allegato",
|
||||
id_module: gestione.data('id_module'),
|
||||
id_plugin: gestione.data('id_plugin'),
|
||||
id_record: gestione.data('id_record'),
|
||||
category: nome.text(),
|
||||
name: inputNome.val(),
|
||||
},
|
||||
success: function (data) {
|
||||
ricaricaAllegati(gestione);
|
||||
},
|
||||
error: function (gestione) {
|
||||
ricaricaAllegati(gestione);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per caricare un nuovo allegato.
|
||||
* @param gestione
|
||||
*/
|
||||
function aggiungiAllegato(gestione) {
|
||||
const id = "#" + gestione.attr('id');
|
||||
const form = $(id + " #upload-form");
|
||||
|
||||
form.ajaxSubmit({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
data: data,
|
||||
type: "post",
|
||||
uploadProgress: function (event, position, total, percentComplete) {
|
||||
$(id + " #upload").prop("disabled", true).html(percentComplete + "%").removeClass("btn-success").addClass("btn-info");
|
||||
},
|
||||
success: function (data) {
|
||||
ricaricaAllegati(gestione);
|
||||
},
|
||||
error: function (data) {
|
||||
alert(globals.translations.allegati.errore + ": " + data);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per mostrare il loader di caricamento per gli allegati.
|
||||
* @param gestione
|
||||
*/
|
||||
function mostraCaricamentoAllegati(gestione) {
|
||||
const id = "#" + gestione.attr('id');
|
||||
|
||||
localLoading($(id + " .panel-body"), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione dedicata al caricamento dinamico degli allegati.
|
||||
* @param gestione
|
||||
*/
|
||||
function ricaricaAllegati(gestione) {
|
||||
const id = "#" + gestione.attr('id');
|
||||
|
||||
let params = new URLSearchParams({
|
||||
op: "list_attachments",
|
||||
id_module: gestione.data('id_module'),
|
||||
id_plugin: gestione.data('id_plugin'),
|
||||
id_record: gestione.data('id_record'),
|
||||
}).toString();
|
||||
|
||||
$(id).load(globals.rootdir + "/ajax.php?" + params, function () {
|
||||
localLoading($(id + " .panel-body"), false);
|
||||
|
||||
const nuovoAllegato = $(id + " table tr").eq(-1).attr("id");
|
||||
if (nuovoAllegato !== undefined) {
|
||||
$("#" + nuovoAllegato).effect("highlight", {}, 1500);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per l'apertura della pagina di gestione dei dati dell'allegato.
|
||||
* @param button
|
||||
*/
|
||||
function modificaAllegato(button) {
|
||||
const gestione = $(button).closest(".gestione-allegati");
|
||||
const allegato = $(button).closest("tr").data();
|
||||
|
||||
let params = new URLSearchParams({
|
||||
op: "visualizza-modifica-allegato",
|
||||
id_module: gestione.data('id_module'),
|
||||
id_plugin: gestione.data('id_plugin'),
|
||||
id_record: gestione.data('id_record'),
|
||||
id_allegato: allegato.id,
|
||||
}).toString();
|
||||
|
||||
openModal(globals.translations.allegati.modifica, globals.rootdir + "/actions.php?" + params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per gestire il download di un allegato.
|
||||
* @param button
|
||||
*/
|
||||
function saggiungiAllegato(button) {
|
||||
const gestione = $(button).closest(".gestione-allegati");
|
||||
const allegato = $(button).closest("tr").data();
|
||||
|
||||
let params = new URLSearchParams({
|
||||
op: "download-allegato",
|
||||
id_module: gestione.data('id_module'),
|
||||
id_plugin: gestione.data('id_plugin'),
|
||||
id_record: gestione.data('id_record'),
|
||||
id: allegato.id,
|
||||
filename: allegato.filename,
|
||||
}).toString();
|
||||
|
||||
window.open(globals.rootdir + "/actions.php?" + params, "_blank")
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per l'apertura dell'anteprima di visualizzazione allegato.
|
||||
* @param button
|
||||
*/
|
||||
function visualizzaAllegato(button) {
|
||||
const allegato = $(button).closest("tr").data();
|
||||
|
||||
let params = new URLSearchParams({
|
||||
file_id: allegato.id,
|
||||
}).toString();
|
||||
|
||||
openModal(allegato.nome + ' <small style="color:white"><i>(' + allegato.filename + ')</i></small>', globals.rootdir + "/view.php?" + params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per la gestione della rimozione di un allegato specifico.
|
||||
*
|
||||
* @param button
|
||||
*/
|
||||
function rimuoviAllegato(button) {
|
||||
const gestione = $(button).closest(".gestione-allegati");
|
||||
const allegato = $(button).closest("tr").data();
|
||||
|
||||
swal({
|
||||
title: globals.translations.allegati.elimina,
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: globals.translations.allegati.procedi,
|
||||
}).then(function () {
|
||||
mostraCaricamentoAllegati(gestione);
|
||||
|
||||
// Parametri della richiesta AJAX
|
||||
let params = new URLSearchParams({
|
||||
op: "rimuovi-allegato",
|
||||
id_module: gestione.data('id_module'),
|
||||
id_plugin: gestione.data('id_plugin'),
|
||||
id_record: gestione.data('id_record'),
|
||||
id_allegato: allegato.id,
|
||||
filename: allegato.filename,
|
||||
}).toString();
|
||||
|
||||
// Richiesta AJAX
|
||||
$.ajax(globals.rootdir + "/actions.php?" + params)
|
||||
.then(function () {
|
||||
ricaricaAllegati(gestione);
|
||||
});
|
||||
}).catch(swal.noop);
|
||||
}
|
||||
|
||||
function impostaCategorieAllegatiDisponibili(gestione, categorie) {
|
||||
// Disabilitazione per rimozione input in aggiunta
|
||||
return;
|
||||
|
||||
const id = "#" + gestione.attr('id');
|
||||
const input = $("#modifica-allegato #categoria_allegato")[0];
|
||||
|
||||
autocomplete({
|
||||
minLength: 0,
|
||||
input: input,
|
||||
emptyMsg: globals.translations.noResults,
|
||||
fetch: function (text, update) {
|
||||
text = text.toLowerCase();
|
||||
const suggestions = categorie.filter(n => n.toLowerCase().startsWith(text));
|
||||
|
||||
// Trasformazione risultati in formato leggibile
|
||||
const results = suggestions.map(function (result) {
|
||||
return {
|
||||
label: result,
|
||||
value: result
|
||||
}
|
||||
});
|
||||
|
||||
update(results);
|
||||
},
|
||||
onSelect: function (item) {
|
||||
input.value = item.label;
|
||||
},
|
||||
});
|
||||
}
|
|
@ -82,9 +82,11 @@ const JS = gulp.parallel(() => {
|
|||
const vendor = [
|
||||
'jquery/dist/jquery.js',
|
||||
'autosize/dist/autosize.js',
|
||||
'autocompleter/autocomplete.js',
|
||||
'html5sortable/dist/html5sortable.js',
|
||||
'bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js',
|
||||
'moment/moment.js',
|
||||
'components-jqueryui/jquery-ui.js',
|
||||
//'components-jqueryui/jquery-ui.js',
|
||||
'datatables.net/js/jquery.dataTables.js',
|
||||
'datatables.net-buttons/js/dataTables.buttons.js',
|
||||
'datatables.net-buttons/js/buttons.colVis.js',
|
||||
|
|
|
@ -34,15 +34,21 @@ $final_module = Modules::get($name);
|
|||
// IVA predefinita
|
||||
$id_iva = $id_iva ?: setting('Iva predefinita');
|
||||
|
||||
$righe_totali = $documento->getRighe();
|
||||
if ($final_module['name'] == 'Interventi') {
|
||||
$righe = $documento->getRighe()->where('qta_rimanente', '>', 0)->where('is_descrizione', '=', 0);
|
||||
$righe = $righe_totali->where('is_descrizione', '=', 0)
|
||||
->where('qta_rimanente', '>', 0);
|
||||
$righe_evase = $righe_totali->where('is_descrizione', '=', 0)
|
||||
->where('qta_rimanente', '=', 0);
|
||||
} elseif ($final_module['name'] == 'Ordini fornitore') {
|
||||
$righe = $documento->getRighe();
|
||||
$righe = $righe_totali;
|
||||
$righe_evase = collect();
|
||||
} else {
|
||||
$righe = $documento->getRighe()->where('qta_rimanente', '>', 0);
|
||||
$righe = $righe_totali->where('qta_rimanente', '>', 0);
|
||||
$righe_evase = $righe_totali->where('qta_rimanente', '=', 0);
|
||||
}
|
||||
|
||||
if (empty($righe)) {
|
||||
if ($righe->isEmpty()) {
|
||||
echo '
|
||||
<p>'.tr('Non ci sono elementi da evadere').'...</p>';
|
||||
|
||||
|
@ -355,8 +361,43 @@ echo '
|
|||
</table>
|
||||
</div>';
|
||||
|
||||
// Elenco righe evase completametne
|
||||
if (!$righe_evase->isEmpty()) {
|
||||
echo '
|
||||
<div class="box box-info collapsable collapsed-box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Righe evase completamente').'</h3>
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="box-body table table-striped table-hover table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.tr('Descrizione').'</th>
|
||||
<th width="10%" class="text-center">'.tr('Q.tà').'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>';
|
||||
|
||||
foreach ($righe_evase as $riga) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$riga->descrizione.'</td>
|
||||
<td class="text-center">'.numberFormat($riga->qta, 'qta').' '.$riga->um.'</td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tbody>
|
||||
</table>
|
||||
</div>';
|
||||
}
|
||||
|
||||
// Gestione articolo sottoscorta
|
||||
echo '
|
||||
<div class="alert alert-warning hidden" id="articoli_sottoscorta">
|
||||
<div class="alert alert-warning hidden" id="articoli_sottoscorta">
|
||||
<table class="table table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -369,7 +410,7 @@ echo '
|
|||
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>';
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
|
||||
|
@ -386,10 +427,7 @@ echo '
|
|||
echo '
|
||||
<script>$(document).ready(init)</script>';
|
||||
|
||||
echo '
|
||||
<script type="text/javascript">
|
||||
';
|
||||
|
||||
// Individuazione scorte
|
||||
$articoli = $documento->articoli->groupBy('idarticolo');
|
||||
$scorte = [];
|
||||
foreach ($articoli as $elenco) {
|
||||
|
@ -407,10 +445,12 @@ foreach ($articoli as $elenco) {
|
|||
}
|
||||
|
||||
echo '
|
||||
var scorte = '.json_encode($scorte).';
|
||||
var abilita_scorte = '.intval(!$documento::$movimenta_magazzino && !empty($options['tipo_documento_finale']) && $options['tipo_documento_finale']::$movimenta_magazzino).';
|
||||
<script type="text/javascript">
|
||||
var scorte = '.json_encode($scorte).';
|
||||
var permetti_documento_vuoto = '.intval(!empty($options['allow-empty'])).';
|
||||
var abilita_scorte = '.intval(!$documento::$movimenta_magazzino && !empty($options['tipo_documento_finale']) && $options['tipo_documento_finale']::$movimenta_magazzino).';
|
||||
|
||||
function controllaMagazzino() {
|
||||
function controllaMagazzino() {
|
||||
if(!abilita_scorte) return;
|
||||
|
||||
let righe = $("#righe_documento_importato tr");
|
||||
|
@ -437,7 +477,7 @@ function controllaMagazzino() {
|
|||
for(const id_articolo in richieste) {
|
||||
let qta_scorta = parseFloat(scorte[id_articolo]["qta"]);
|
||||
let qta_richiesta = parseFloat(richieste[id_articolo]);
|
||||
if ((qta_richiesta > qta_scorta) && (scorte[id_articolo]["servizio"] !== 1) ) {
|
||||
if ((qta_richiesta > qta_scorta) && (scorte[id_articolo]["servizio"] !== 1)) {
|
||||
body.append(`<tr>
|
||||
<td>` + scorte[id_articolo]["descrizione"] + `</td>
|
||||
<td class="text-right">` + qta_richiesta.toLocale() + `</td>
|
||||
|
@ -452,13 +492,13 @@ function controllaMagazzino() {
|
|||
} else {
|
||||
sottoscorta.addClass("hidden");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$("input[name=righe]").each(function() {
|
||||
$("input[name=righe]").each(function() {
|
||||
ricalcolaTotaleRiga($(this).val());
|
||||
});
|
||||
});
|
||||
|
||||
function ricalcolaTotaleRiga(r) {
|
||||
function ricalcolaTotaleRiga(r) {
|
||||
let prezzo_unitario = $("#prezzo_unitario_" + r).val();
|
||||
let sconto = $("#sconto_unitario_" + r).val();
|
||||
|
||||
|
@ -497,9 +537,9 @@ function ricalcolaTotaleRiga(r) {
|
|||
|
||||
|
||||
ricalcolaTotale();
|
||||
}
|
||||
}
|
||||
|
||||
function ricalcolaTotale() {
|
||||
function ricalcolaTotale() {
|
||||
let totale = 0.00;
|
||||
let totale_qta = 0;
|
||||
|
||||
|
@ -526,25 +566,23 @@ function ricalcolaTotale() {
|
|||
totale_qta += qta;
|
||||
});
|
||||
|
||||
$("#totale").html((totale.toLocale()) + " " + globals.currency);';
|
||||
$("#totale").html((totale.toLocale()) + " " + globals.currency);
|
||||
|
||||
if (empty($options['allow-empty'])) {
|
||||
echo '
|
||||
if (!permetti_documento_vuoto) {
|
||||
if (totale_qta > 0) {
|
||||
$("#submit_btn").show();
|
||||
} else {
|
||||
$("#submit_btn").hide();
|
||||
}';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
controllaMagazzino();
|
||||
}
|
||||
}
|
||||
|
||||
ricalcolaTotale();
|
||||
ricalcolaTotale();
|
||||
|
||||
$(document).ready(function(){
|
||||
if(input("id_ritenuta_acconto").get()){
|
||||
if(input("id_ritenuta_acconto").get()) {
|
||||
$("#calcolo_ritenuta_acconto").prop("required", true);
|
||||
} else{
|
||||
$("#calcolo_ritenuta_acconto").prop("required", false);
|
||||
|
@ -552,9 +590,8 @@ ricalcolaTotale();
|
|||
}
|
||||
|
||||
$("#id_ritenuta_acconto").on("change", function(){
|
||||
if(input("id_ritenuta_acconto").get()){
|
||||
if(input("id_ritenuta_acconto").get()) {
|
||||
$("#calcolo_ritenuta_acconto").prop("required", true);
|
||||
|
||||
} else{
|
||||
$("#calcolo_ritenuta_acconto").prop("required", false);
|
||||
input("calcolo_ritenuta_acconto").set("");
|
||||
|
|
|
@ -56,12 +56,34 @@ $source = array_clean(array_column($categories, 'category'));
|
|||
|
||||
echo '
|
||||
<script>
|
||||
var categorie = '.json_encode($source).';
|
||||
|
||||
// Auto-completamento categoria
|
||||
$("#modifica-allegato #categoria_allegato").autocomplete({
|
||||
source: '.json_encode($source).',
|
||||
minLength: 0
|
||||
}).focus(function() {
|
||||
$(this).autocomplete("search", $(this).val())
|
||||
$(document).ready(function () {
|
||||
const input = $("#modifica-allegato #categoria_allegato")[0];
|
||||
|
||||
autocomplete({
|
||||
minLength: 0,
|
||||
input: input,
|
||||
emptyMsg: globals.translations.noResults,
|
||||
fetch: function (text, update) {
|
||||
text = text.toLowerCase();
|
||||
const suggestions = categorie.filter(n => n.toLowerCase().startsWith(text));
|
||||
|
||||
// Trasformazione risultati in formato leggibile
|
||||
const results = suggestions.map(function (result) {
|
||||
return {
|
||||
label: result,
|
||||
value: result
|
||||
}
|
||||
});
|
||||
|
||||
update(results);
|
||||
},
|
||||
onSelect: function (item) {
|
||||
input.value = item.label;
|
||||
},
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script>$(document).ready(init)</script>';
|
||||
|
|
|
@ -108,19 +108,28 @@ if (Auth::check()) {
|
|||
'details' => tr('Dettagli'),
|
||||
'loading' => tr('Caricamento'),
|
||||
'waiting' => tr('Impossibile procedere'),
|
||||
'waiting_msg' => tr('Prima di proseguire devi selezionare alcuni elementi!'),
|
||||
'waitingMessage' => tr('Prima di proseguire devi selezionare alcuni elementi!'),
|
||||
'hooksExecuting' => tr('Hooks in esecuzione'),
|
||||
'hookExecuting' => tr('Hook "_NAME_" in esecuzione'),
|
||||
'hookMultiple' => tr('Hai _NUM_ notifiche'),
|
||||
'hookSingle' => tr('Hai 1 notifica'),
|
||||
'hookNone' => tr('Nessuna notifica'),
|
||||
'singleCalendar' => tr("E' presente un solo periodo!"),
|
||||
'noResults' => tr("Nessun elemento trovato"),
|
||||
];
|
||||
foreach ($translations as $key => $value) {
|
||||
echo '
|
||||
'.$key.': "'.addslashes($value).'",';
|
||||
}
|
||||
echo '
|
||||
allegati: {
|
||||
messaggio: "'.tr("Clicca o trascina qui per caricare uno o più file").'",
|
||||
maxFilesize: "'.tr('Max upload: _SIZE_ MB').'",
|
||||
errore: "'.tr('Errore').'",
|
||||
modifica: "'.tr('Modifica allegato').'",
|
||||
elimina: "'.tr('Vuoi eliminare questo file?').'",
|
||||
procedi: "'.tr('Procedi').'",
|
||||
},
|
||||
ajax: {
|
||||
"missing": {
|
||||
"title": "'.tr('Errore').'",
|
||||
|
@ -453,7 +462,8 @@ if (Auth::check()) {
|
|||
<div class="input-group">
|
||||
<input type="text" name="q" class="form-control" id="supersearch" placeholder="'.tr('Cerca').'..."/>
|
||||
<span class="input-group-btn">
|
||||
<button class="btn btn-flat" id="search-btn" name="search" type="submit" ><i class="fa fa-search"></i>
|
||||
<button class="btn btn-flat" id="search-btn" name="search" type="submit">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</span>
|
||||
|
||||
|
|
50
mail.php
50
mail.php
|
@ -158,13 +158,13 @@ echo '
|
|||
echo '
|
||||
<script>
|
||||
var emails = [];
|
||||
var id_anagrafica = "'.$id_anagrafica.'";
|
||||
var pec = "'.$smtp['pec']. '";
|
||||
|
||||
$(document).ready(function() {';
|
||||
|
||||
// Autocompletamento destinatario
|
||||
if (!empty($id_anagrafica)) {
|
||||
echo '
|
||||
$(document).load(globals.rootdir + "/ajax_complete.php?module=Anagrafiche&op=get_email&id_anagrafica='.$id_anagrafica.(($smtp['pec']) ? '&type=pec' : '').'", function(response) {
|
||||
$(document).ready(function() {
|
||||
// Auto-completamento destinatario
|
||||
if (id_anagrafica) {
|
||||
$(document).load(globals.rootdir + "/ajax_complete.php?module=Anagrafiche&op=get_email&id_anagrafica=" + id_anagrafica + (pec ? "&type=pec" : ""), function(response) {
|
||||
emails = JSON.parse(response);
|
||||
|
||||
$(".destinatari").each(function(){
|
||||
|
@ -172,44 +172,44 @@ echo '
|
|||
});
|
||||
|
||||
aggiungiDestinatario();
|
||||
});';
|
||||
});
|
||||
}
|
||||
|
||||
echo '
|
||||
|
||||
});
|
||||
|
||||
function inviaEmail() {
|
||||
if($("#email-form").parsley().validate() && confirm("Inviare e-mail?")) {
|
||||
$("#email-form").submit();
|
||||
const form = $("#email-form");
|
||||
|
||||
if (form.parsley().validate() && confirm("Inviare e-mail?")) {
|
||||
form.submit();
|
||||
}
|
||||
}
|
||||
|
||||
function addAutoComplete(input){
|
||||
$(input).autocomplete({
|
||||
source: emails,
|
||||
function addAutoComplete(input) {
|
||||
autocomplete({
|
||||
minLength: 0,
|
||||
close: function() {
|
||||
input: input,
|
||||
emptyMsg: globals.translations.noResults,
|
||||
fetch: function (text, update) {
|
||||
text = text.toLowerCase();
|
||||
const suggestions = emails.filter(n => n.value.toLowerCase().startsWith(text));
|
||||
update(suggestions);
|
||||
},
|
||||
onSelect: function (item) {
|
||||
input.value = item.value;
|
||||
aggiungiDestinatario();
|
||||
},
|
||||
}).focus(function() {
|
||||
$(this).autocomplete("search", $(this).val());
|
||||
});
|
||||
}
|
||||
|
||||
function aggiungiDestinatario() {
|
||||
var last = $("#lista-destinatari input").last();
|
||||
const last = $("#lista-destinatari input").last();
|
||||
|
||||
if (last.val()) {
|
||||
cleanup_inputs();
|
||||
const nuovaRiga = aggiungiContenuto("#lista-destinatari", "#template-destinatario", {"-id-": $("#lista-destinatari > div").length});
|
||||
|
||||
aggiungiContenuto("#lista-destinatari", "#template-destinatario", {"-id-": $("#lista-destinatari > div").length});
|
||||
|
||||
$(".destinatari").each(function(){
|
||||
nuovaRiga.find(".destinatari").each(function(){
|
||||
addAutoComplete(this);
|
||||
});
|
||||
|
||||
restart_inputs();
|
||||
}
|
||||
}
|
||||
</script>';
|
||||
|
|
|
@ -19,98 +19,6 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
use Modules\Articoli\Articolo;
|
||||
|
||||
/**
|
||||
* Funzione per inserire i movimenti di magazzino.
|
||||
*
|
||||
* @deprecated 2.4.11
|
||||
*/
|
||||
function add_movimento_magazzino($id_articolo, $qta, $array = [], $descrizone = '', $data = '')
|
||||
{
|
||||
$dbo = database();
|
||||
|
||||
if (empty($qta)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$nome = null;
|
||||
$tipo = null;
|
||||
$numero = null;
|
||||
|
||||
// Informazioni articolo
|
||||
$manuale = 0;
|
||||
|
||||
// Ddt
|
||||
if (!empty($array['idddt'])) {
|
||||
$rs = $dbo->fetchArray('SELECT numero, numero_esterno, dt_tipiddt.descrizione AS tipo, dt_tipiddt.dir FROM dt_ddt LEFT JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($array['idddt']));
|
||||
$numero = (!empty($rs[0]['numero_esterno'])) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
|
||||
$tipo = strtolower($rs[0]['tipo']);
|
||||
|
||||
$rs_data = $dbo->fetchArray("SELECT data FROM dt_ddt WHERE id='".$array['idddt']."'");
|
||||
$data = $rs_data[0]['data'];
|
||||
}
|
||||
|
||||
// Fattura
|
||||
elseif (!empty($array['iddocumento'])) {
|
||||
$rs = $dbo->fetchArray('SELECT numero, numero_esterno, co_tipidocumento.descrizione AS tipo, co_tipidocumento.dir FROM co_documenti LEFT JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($array['iddocumento']));
|
||||
$numero = (!empty($rs[0]['numero_esterno'])) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
|
||||
$tipo = strtolower($rs[0]['tipo']);
|
||||
|
||||
$rs_data = $dbo->fetchArray("SELECT data FROM co_documenti WHERE id='".$array['iddocumento']."'");
|
||||
$data = $rs_data[0]['data'];
|
||||
}
|
||||
|
||||
// Intervento
|
||||
elseif (!empty($array['idintervento'])) {
|
||||
$rs_data = $dbo->fetchArray('SELECT IFNULL(MAX(orario_fine), data_richiesta) AS data, codice FROM in_interventi LEFT JOIN in_interventi_tecnici ON in_interventi.id=in_interventi_tecnici.idintervento WHERE in_interventi.id = '.prepare($array['idintervento']));
|
||||
$data = $rs_data[0]['data'];
|
||||
$codice_intervento = $rs_data[0]['codice'];
|
||||
|
||||
$movimento = ($qta > 0) ? tr('Ripristino articolo da intervento _NUM_') : tr('Scarico magazzino per intervento _NUM_');
|
||||
$numero = $codice_intervento;
|
||||
}
|
||||
|
||||
// Manuale
|
||||
else {
|
||||
$manuale = 1;
|
||||
$movimento = !empty($descrizone) ? $descrizone : '';
|
||||
$descrizone = '';
|
||||
|
||||
if (empty($movimento)) {
|
||||
$movimento = ($qta > 0) ? tr('Carico magazzino') : tr('Scarico magazzino');
|
||||
}
|
||||
|
||||
if ($data == '') {
|
||||
$data = date('Y-m-d');
|
||||
}
|
||||
}
|
||||
|
||||
// Descrizione di default
|
||||
if (empty($movimento)) {
|
||||
$carico = (!empty($rs[0]['dir']) && $rs[0]['dir'] == 'entrata') ? tr('Ripristino articolo da _TYPE_ numero _NUM_') : tr('Carico magazzino da _TYPE_ numero _NUM_');
|
||||
$scarico = (!empty($rs[0]['dir']) && $rs[0]['dir'] == 'uscita') ? tr('Rimozione articolo da _TYPE_ numero _NUM_') : tr('Scarico magazzino per _TYPE_ numero _NUM_');
|
||||
|
||||
$movimento = ($qta > 0) ? $carico : $scarico;
|
||||
}
|
||||
|
||||
// Completamento della descrizione
|
||||
$movimento .= $descrizone;
|
||||
$movimento = str_replace(['_NAME_', '_TYPE_', '_NUM_'], [$nome, $tipo, $numero], $movimento);
|
||||
|
||||
// Movimento il magazzino solo se l'articolo non è un servizio
|
||||
$articolo = Articolo::find($id_articolo);
|
||||
|
||||
// Movimentazione effettiva
|
||||
if (empty($array['idintervento'])) {
|
||||
return $articolo->movimenta($qta, $movimento, $data, $manuale, $array);
|
||||
} else {
|
||||
return $articolo->registra($qta, $movimento, $data, $manuale, $array);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Funzione per aggiornare le sedi nei movimenti di magazzino.
|
||||
*/
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
use Models\Module;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Articoli\Articolo as ArticoloOriginale;
|
||||
use Modules\DDT\Components\Articolo;
|
||||
|
@ -26,6 +27,7 @@ use Modules\DDT\Components\Descrizione;
|
|||
use Modules\DDT\Components\Riga;
|
||||
use Modules\DDT\Components\Sconto;
|
||||
use Modules\DDT\DDT;
|
||||
use Modules\DDT\Stato;
|
||||
use Modules\DDT\Tipo;
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
@ -36,7 +38,7 @@ if ($module['name'] == 'Ddt di vendita') {
|
|||
$dir = 'uscita';
|
||||
}
|
||||
|
||||
switch (post('op')) {
|
||||
switch (filter('op')) {
|
||||
case 'add':
|
||||
$idanagrafica = post('idanagrafica');
|
||||
$data = post('data');
|
||||
|
@ -428,6 +430,50 @@ switch (post('op')) {
|
|||
$dbo->query('UPDATE `dt_righe_ddt` SET `order` = '.prepare($i + 1).' WHERE id='.prepare($id_riga));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
/*
|
||||
* Gestione della generazione di DDT in direzione opposta a quella corrente, per completare il riferimento di trasporto interno tra sedi distinte dell'anagrafica Azienda.
|
||||
*/
|
||||
case 'completa_trasporto':
|
||||
$tipo = Tipo::where('dir', '!=', $ddt->direzione)->first();
|
||||
$stato = Stato::where('descrizione', '=', 'Evaso')->first();
|
||||
|
||||
// Duplicazione DDT
|
||||
$copia = $ddt->replicate();
|
||||
$copia->tipo()->associate($tipo);
|
||||
$copia->stato()->associate($stato);
|
||||
$copia->id_ddt_trasporto_interno = $ddt->id;
|
||||
|
||||
// Inversione sedi
|
||||
$copia->idsede_partenza = $ddt->idsede_destinazione;
|
||||
$copia->idsede_destinazione = $ddt->idsede_partenza;
|
||||
|
||||
$copia->save();
|
||||
|
||||
// Copia righe
|
||||
$righe = $ddt->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$copia_riga = $riga->replicate();
|
||||
|
||||
// Aggiornamento riferimenti
|
||||
$copia_riga->idddt = $copia->id;
|
||||
$copia_riga->original_id = null;
|
||||
$copia_riga->original_type = null;
|
||||
|
||||
$copia_riga->save();
|
||||
|
||||
// Movimentazione forzata in direzione del documento
|
||||
$copia_riga->movimenta($riga->qta);
|
||||
}
|
||||
|
||||
// Salvataggio riferimento
|
||||
$ddt->id_ddt_trasporto_interno = $copia->id;
|
||||
$ddt->save();
|
||||
|
||||
$id_record = $copia->id;
|
||||
$id_module = $ddt->direzione == 'entrata' ? Module::pool('Ddt di acquisto')->id : Module::pool('Ddt di vendita')->id;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,14 +17,54 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use Models\Module;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$stati = $dbo->fetchArray('SELECT descrizione FROM `dt_statiddt` WHERE `is_fatturabile` = 1');
|
||||
// Informazioni sui movimenti interni
|
||||
if (!empty($ddt->id_ddt_trasporto_interno)) {
|
||||
$id_module_collegamento = $ddt->direzione == 'entrata' ? Module::pool('Ddt di acquisto')->id : Module::pool('Ddt di vendita')->id;
|
||||
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr("Questo ddt è impostato sull'anagrafica Azienda, e pertanto rappresenta un trasporto interno di merce: il movimento tra sedi distinte è necessario completato tramite un DDT in direzione opposta").'.">
|
||||
<a class="btn btn-info" href="'.base_url().'/editor.php?id_module='.$id_module_collegamento.'&id_record='.$ddt->id_ddt_trasporto_interno.'">
|
||||
<i class="fa fa-truck"></i> '.tr('DDT di completamento trasporto').'
|
||||
</a>
|
||||
</div>';
|
||||
} elseif ($azienda->id == $ddt->anagrafica->id) {
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr("Questo ddt è impostato sull'anagrafica Azienda, e pertanto rappresenta un trasporto interno di merce: per completare il movimento tra sedi distinte, è necessario generare un DDT in direzione opposta tramite questo pulsante").'.">
|
||||
<button class="btn btn-warning '.($ddt->isImportabile() ? '' : 'disabled').'" onclick="completaTrasporto()">
|
||||
<i class="fa fa-truck"></i> '.tr('Completa trasporto ').'
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function completaTrasporto() {
|
||||
swal({
|
||||
title: "'.tr('Completare il trasporto?').'",
|
||||
text: "'.tr('Sei sicuro di voler completare il trasporto interno tramite un DDT in direzione opposta?').'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonClass: "btn btn-lg btn-success",
|
||||
confirmButtonText: "'.tr('Completa').'",
|
||||
}).then(
|
||||
function() {
|
||||
location.href = globals.rootdir + "/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=completa_trasporto&backto=record-edit";
|
||||
},
|
||||
function() {}
|
||||
);
|
||||
}
|
||||
</script>';
|
||||
}
|
||||
|
||||
// Informazioni sull'importabilità del DDT
|
||||
$stati = $database->fetchArray('SELECT descrizione FROM `dt_statiddt` WHERE `is_fatturabile` = 1');
|
||||
foreach ($stati as $stato) {
|
||||
$stati_importabili[] = $stato['descrizione'];
|
||||
}
|
||||
|
||||
$causali = $dbo->fetchArray('SELECT descrizione FROM `dt_causalet` WHERE `is_importabile` = 1');
|
||||
$causali = $database->fetchArray('SELECT descrizione FROM `dt_causalet` WHERE `is_importabile` = 1');
|
||||
foreach ($causali as $causale) {
|
||||
$causali_importabili[] = $causale['descrizione'];
|
||||
}
|
||||
|
|
|
@ -19,8 +19,11 @@
|
|||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\DDT\DDT;
|
||||
|
||||
$azienda = Anagrafica::find(setting('Azienda predefinita'));
|
||||
|
||||
if ($module['name'] == 'Ddt di vendita') {
|
||||
$dir = 'entrata';
|
||||
} else {
|
||||
|
|
|
@ -105,71 +105,6 @@ function get_ivaindetraibile_ddt($id_ddt)
|
|||
return $ddt->iva_indetraibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Questa funzione rimuove un articolo dal ddt data e lo riporta in magazzino
|
||||
* $idarticolo integer codice dell'articolo da scollegare dal ddt
|
||||
* $idddt integer codice del ddt da cui scollegare l'articolo.
|
||||
*
|
||||
* @deprecated 2.4.11
|
||||
*/
|
||||
function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$dbo = database();
|
||||
|
||||
// Leggo la quantità di questo articolo in ddt
|
||||
$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'];
|
||||
|
||||
// Leggo l'idordine
|
||||
$query = 'SELECT idordine FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$idordine = $rs[0]['idordine'];
|
||||
|
||||
$non_rimovibili = seriali_non_rimuovibili('id_riga_ddt', $idrigaddt, $dir);
|
||||
if (!empty($non_rimovibili)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Ddt di vendita
|
||||
if ($dir == 'entrata') {
|
||||
add_movimento_magazzino($idarticolo, $qta, ['idddt' => $idddt]);
|
||||
|
||||
// Se il ddt è stato generato da un ordine tolgo questa quantità dalla quantità evasa
|
||||
if (!empty($idordine)) {
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$qta.' WHERE idarticolo='.prepare($idarticolo).' AND idordine='.prepare($idordine));
|
||||
}
|
||||
}
|
||||
|
||||
// Ddt di acquisto
|
||||
else {
|
||||
add_movimento_magazzino($idarticolo, -$qta, ['idddt' => $idddt]);
|
||||
|
||||
// Se il ddt è stato generato da un ordine tolgo questa quantità dalla quantità evasa
|
||||
if (!empty($idordine)) {
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$qta.' WHERE idarticolo='.prepare($idarticolo).' AND idordine='.prepare($idordine));
|
||||
}
|
||||
}
|
||||
|
||||
$dbo->query($query);
|
||||
|
||||
// Elimino la riga dal ddt
|
||||
$dbo->query('DELETE FROM `dt_righe_ddt` WHERE id='.prepare($idrigaddt).' AND idddt='.prepare($idddt));
|
||||
|
||||
//Aggiorno lo stato dell'ordine
|
||||
if (setting('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));
|
||||
}
|
||||
|
||||
// Elimino i seriali utilizzati dalla riga
|
||||
$dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($idarticolo).' AND id_riga_ddt = '.prepare($idrigaddt));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ricalcola i costi aggiuntivi in ddt (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
||||
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
||||
|
@ -255,65 +190,6 @@ function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Questa funzione aggiunge un articolo nel ddt
|
||||
* $iddocumento integer id dell'ordine
|
||||
* $idarticolo integer id dell'articolo da inserire nell'ordine
|
||||
* $idiva integer id del codice iva associato all'articolo
|
||||
* $qta float quantità dell'articolo nell'ordine
|
||||
* $prezzo float prezzo totale degli articoli (prezzounitario*qtà).
|
||||
*
|
||||
* @deprecated 2.4.11
|
||||
*/
|
||||
function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $idum, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT')
|
||||
{
|
||||
global $dir;
|
||||
global $idordine;
|
||||
|
||||
$dbo = database();
|
||||
|
||||
// Lettura unità di misura dell'articolo
|
||||
if (empty($idum)) {
|
||||
$rs = $dbo->fetchArray('SELECT um FROM mg_articoli WHERE id='.prepare($idarticolo));
|
||||
$um = $rs[0]['valore'];
|
||||
} else {
|
||||
$um = $idum;
|
||||
}
|
||||
|
||||
// Lettura iva dell'articolo
|
||||
$rs2 = $dbo->fetchArray('SELECT percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva));
|
||||
$iva = ($prezzo - $sconto) / 100 * $rs2[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile'];
|
||||
|
||||
if ($qta > 0) {
|
||||
$rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo));
|
||||
|
||||
$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();
|
||||
|
||||
/*
|
||||
Ddt cliente
|
||||
*/
|
||||
if ($dir == 'entrata') {
|
||||
// Decremento la quantità dal magazzino centrale
|
||||
add_movimento_magazzino($idarticolo, -$qta, ['idddt' => $idddt]);
|
||||
}
|
||||
/*
|
||||
Ddt fornitore
|
||||
*/
|
||||
elseif ($dir == 'uscita') {
|
||||
// Decremento la quantità dal magazzino centrale
|
||||
add_movimento_magazzino($idarticolo, $qta, ['idddt' => $idddt]);
|
||||
}
|
||||
|
||||
// Inserisco il riferimento dell'ordine alla riga
|
||||
$dbo->query('UPDATE dt_righe_ddt SET idordine='.prepare($idordine).' WHERE id='.prepare($idriga));
|
||||
}
|
||||
|
||||
return $idriga;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce lo stato del ddt in base alle righe.
|
||||
*/
|
||||
|
|
|
@ -150,13 +150,13 @@ echo '
|
|||
|
||||
</form>
|
||||
<?php
|
||||
if( !empty($newsletters)){
|
||||
if (!empty($newsletters)) {
|
||||
echo '
|
||||
<div class="alert alert-danger">
|
||||
'.tr('Questo template non può essere rimosso dal sistema perchè collegato alle seguenti newsletter:').'
|
||||
<ul>';
|
||||
|
||||
foreach($newsletters as $newsletter){
|
||||
foreach ($newsletters as $newsletter) {
|
||||
echo '
|
||||
<li>'.Modules::link('Newsletter', $newsletter->id, $newsletter->name, null, '').'</li>';
|
||||
}
|
||||
|
@ -164,9 +164,8 @@ if( !empty($newsletters)){
|
|||
echo '
|
||||
</ul>
|
||||
</div>';
|
||||
|
||||
}elseif (!$record['predefined']) {
|
||||
?>
|
||||
} elseif (!$record['predefined']) {
|
||||
?>
|
||||
<a class="btn btn-danger ask" data-backto="record-list">
|
||||
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
|
||||
</a>
|
||||
|
|
|
@ -25,5 +25,5 @@ if (isset($id_record)) {
|
|||
$record = $dbo->fetchOne('SELECT * FROM em_templates WHERE id='.prepare($id_record).' AND deleted_at IS NULL');
|
||||
|
||||
//Controllo se ci sono newletter collegate a questo template
|
||||
$newsletters = Newsletter::where('id_template',$id_record)->get();
|
||||
$newsletters = Newsletter::where('id_template', $id_record)->get();
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
use Carbon\Carbon;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Anagrafiche\Nazione;
|
||||
use Modules\Fatture\Gestori\Bollo;
|
||||
use Modules\Interventi\Intervento;
|
||||
use Modules\Iva\Aliquota;
|
||||
|
@ -138,8 +139,9 @@ if ($dir == 'entrata') {
|
|||
array_push($campi_mancanti, 'Codice fiscale');
|
||||
}
|
||||
|
||||
$nazione = Nazione::find($rs2[0]['id_nazione']);
|
||||
//se è un privato o un ente pubblico controllo il codice fiscale
|
||||
if (($rs2[0]['tipo'] == 'Privato' or $rs2[0]['tipo'] == 'Ente pubblico') and empty($rs2[0]['codice_fiscale'])) {
|
||||
if ((($rs2[0]['tipo'] == 'Privato' && $nazione->iso2 == 'IT') or $rs2[0]['tipo'] == 'Ente pubblico') and empty($rs2[0]['codice_fiscale'])) {
|
||||
array_push($campi_mancanti, 'Codice fiscale');
|
||||
}
|
||||
|
||||
|
|
|
@ -389,114 +389,6 @@ function ricalcola_costiagg_fattura($iddocumento)
|
|||
$fattura->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Questa funzione aggiunge un articolo in fattura. E' comoda quando si devono inserire
|
||||
* degli interventi con articoli collegati o preventivi che hanno interventi con articoli collegati!
|
||||
* $iddocumento integer id della fattura
|
||||
* $idarticolo integer id dell'articolo da inserire in fattura
|
||||
* $idiva integer id del codice iva associato all'articolo
|
||||
* $qta float quantità dell'articolo in fattura
|
||||
* $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).
|
||||
*
|
||||
* @deprecated 2.4.11
|
||||
*/
|
||||
function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $idconto = 0, $idum = 0, $idrivalsainps = '', $idritenutaacconto = '', $calcolo_ritenuta_acconto = '')
|
||||
{
|
||||
global $dir;
|
||||
global $idddt;
|
||||
global $idordine;
|
||||
global $idcontratto;
|
||||
|
||||
$dbo = database();
|
||||
|
||||
if (empty($idddt)) {
|
||||
$idddt = 0;
|
||||
}
|
||||
|
||||
if (empty($idordine)) {
|
||||
$idordine = 0;
|
||||
}
|
||||
|
||||
if (empty($idcontratto)) {
|
||||
$idcontratto = 0;
|
||||
}
|
||||
|
||||
// Lettura unità di misura dell'articolo
|
||||
if (empty($idum)) {
|
||||
$query = 'SELECT um FROM mg_articoli WHERE id='.prepare($idarticolo);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$um = $rs[0]['valore'];
|
||||
} else {
|
||||
$um = $idum;
|
||||
}
|
||||
|
||||
// Lettura iva dell'articolo
|
||||
$rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
|
||||
$iva = ($prezzo - $sconto) / 100 * $rs2[0]['percentuale'];
|
||||
$desc_iva = $rs2[0]['descrizione'];
|
||||
|
||||
if (!empty($idrivalsainps)) {
|
||||
// Calcolo rivalsa inps
|
||||
$rs = $dbo->fetchArray('SELECT * FROM co_rivalse WHERE id='.prepare($idrivalsainps));
|
||||
$rivalsainps = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
if (!empty($idritenutaacconto)) {
|
||||
// Calcolo ritenuta d'acconto
|
||||
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if ($calcolo_ritenuta_acconto == 'IMP') {
|
||||
$ritenutaacconto = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
} elseif ($calcolo_ritenuta_acconto == 'IMP+RIV') {
|
||||
$ritenutaacconto = ($prezzo - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
}
|
||||
|
||||
if ($qta != 0) {
|
||||
$rsart = $dbo->fetchArray('SELECT abilita_serial, idconto_vendita, idconto_acquisto FROM mg_articoli WHERE id='.prepare($idarticolo));
|
||||
|
||||
$default_idconto = ($dir == 'entrata') ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto');
|
||||
if ($idconto == $default_idconto) {
|
||||
$idconto = $rsart[0]['idconto_'.($dir == 'entrata' ? 'vendita' : 'acquisto')];
|
||||
}
|
||||
$idconto = empty($idconto) ? $default_idconto : $idconto;
|
||||
|
||||
$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`, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, calcolo_ritenuta_acconto) 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).'), '.prepare($idritenutaacconto).', '.prepare($ritenutaacconto).', '.prepare($idrivalsainps).', '.prepare($rivalsainps).', '.prepare($calcolo_ritenuta_acconto).')');
|
||||
$idriga = $dbo->lastInsertedID();
|
||||
|
||||
/*
|
||||
Fatture di vendita
|
||||
*/
|
||||
if ($dir == 'entrata') {
|
||||
// Se il documento non è generato da un ddt o intervento allora movimento il magazzino
|
||||
if (empty($idddt) && empty($idintervento)) {
|
||||
add_movimento_magazzino($idarticolo, -$qta, ['iddocumento' => $iddocumento]);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Fatture di acquisto
|
||||
*/
|
||||
elseif ($dir == 'uscita') {
|
||||
// Se il documento non è generato da un ddt allora movimento il magazzino
|
||||
if (empty($idddt)) {
|
||||
add_movimento_magazzino($idarticolo, $qta, ['iddocumento' => $iddocumento]);
|
||||
}
|
||||
}
|
||||
|
||||
// Inserisco il riferimento del ddt alla riga
|
||||
$dbo->query('UPDATE co_righe_documenti SET idddt='.prepare($idddt).' WHERE id='.prepare($idriga));
|
||||
|
||||
// Inserisco il riferimento dell'ordine alla riga
|
||||
$dbo->query('UPDATE co_righe_documenti SET idordine='.prepare($idordine).' WHERE id='.prepare($idriga));
|
||||
|
||||
// Inserisco il riferimento del contratto alla riga
|
||||
$dbo->query('UPDATE co_righe_documenti SET idcontratto='.prepare($idcontratto).' WHERE id='.prepare($idriga));
|
||||
}
|
||||
|
||||
return $idriga;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifica che il numero_esterno della fattura indicata sia correttamente impostato, a partire dai valori delle fatture ai giorni precedenti.
|
||||
* Restituisce il numero_esterno mancante in caso di numero errato.
|
||||
|
|
|
@ -53,7 +53,7 @@ $id_stato = $stato['idstatointervento'];
|
|||
// Se è indicata un'anagrafica relativa, si carica il tipo di intervento di default impostato
|
||||
if (!empty($id_anagrafica)) {
|
||||
$anagrafica = $dbo->fetchOne('SELECT idtipointervento_default, idzona FROM an_anagrafiche WHERE idanagrafica='.prepare($id_anagrafica));
|
||||
$id_tipo = $anagrafica['idtipointervento_default'];
|
||||
$id_tipo = $id_tipo ?: $anagrafica['idtipointervento_default'];
|
||||
$id_zona = $anagrafica['idzona'];
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ use Modules\Emails\Template;
|
|||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
//Controllo se il template è ancora attivo
|
||||
if( empty($template) ){
|
||||
if (empty($template)) {
|
||||
echo '
|
||||
<div class=" alert alert-danger">'.tr('ATTENZIONE! Questa newsletter risulta collegata ad un template non più presente a sistema').'</div>';
|
||||
}
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use Modules\Newsletter\Newsletter;
|
||||
use Modules\Emails\Template;
|
||||
use Modules\Newsletter\Newsletter;
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
|
|
|
@ -105,70 +105,6 @@ function get_ivaindetraibile_ordine($idordine)
|
|||
return $ordine->iva_indetraibile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Questa funzione aggiunge un articolo nell'ordine. E' comoda quando si devono inserire
|
||||
* degli interventi con articoli collegati o preventivi che hanno interventi con articoli collegati!
|
||||
* $iddocumento integer id dell'ordine
|
||||
* $idarticolo integer id dell'articolo da inserire nell'ordine
|
||||
* $idiva integer id del codice iva associato all'articolo
|
||||
* $qta float quantità dell'articolo nell'ordine
|
||||
* $prezzo float prezzo totale degli articoli (prezzounitario*qtà).
|
||||
*
|
||||
* @deprecated 2.4.11
|
||||
*/
|
||||
function add_articolo_inordine($idordine, $idarticolo, $descrizione, $idiva, $qta, $idum, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT')
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$dbo = database();
|
||||
|
||||
// Lettura unità di misura dell'articolo
|
||||
if (empty($idum)) {
|
||||
$rs = $dbo->fetchArray('SELECT um FROM mg_articoli WHERE id='.prepare($idarticolo));
|
||||
$um = $rs[0]['valore'];
|
||||
} else {
|
||||
$um = $idum;
|
||||
}
|
||||
|
||||
// Lettura iva dell'articolo
|
||||
$rs2 = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva));
|
||||
$iva = ($prezzo - $sconto) / 100 * $rs2[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile'];
|
||||
|
||||
if ($qta > 0) {
|
||||
$rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo));
|
||||
$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).'))');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Questa funzione rimuove un articolo dall'ordine
|
||||
* $idarticolo integer codice dell'articolo da scollegare dall'ordine
|
||||
* $idordine integer codice dell'ordine da cui scollegare l'articolo
|
||||
* $idrigaordine integer id della riga ordine da rimuovere.
|
||||
*
|
||||
* @deprecated 2.4.11
|
||||
*/
|
||||
function rimuovi_articolo_daordine($idarticolo, $idordine, $idrigaordine)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$dbo = database();
|
||||
|
||||
$non_rimovibili = seriali_non_rimuovibili('id_riga_ordine', $idrigaordine, $dir);
|
||||
if (!empty($non_rimovibili)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Elimino la riga dall'ordine
|
||||
$dbo->query('DELETE FROM `or_righe_ordini` WHERE id='.prepare($idrigaordine));
|
||||
|
||||
// Elimino i seriali utilizzati dalla riga
|
||||
$dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($idarticolo).' AND id_riga_ordine = '.prepare($idrigaordine));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ricalcola i costi aggiuntivi in ordine (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
||||
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
||||
|
|
|
@ -49,8 +49,8 @@ foreach ($rs as $r) {
|
|||
$result['link'] = base_path().'/editor.php?id_module='.$link_id.'&id_record='.$r['id'];
|
||||
$result['title'] = 'Preventivo '.$r['numero'];
|
||||
|
||||
if ($rs[$r]['data_accettazione'] == '0000-00-00') {
|
||||
$result['title'] .= ' del '.Translator::dateToLocale($rs[$r]['data_accettazione']);
|
||||
if ($r['data_accettazione'] == '0000-00-00') {
|
||||
$result['title'] .= ' del '.Translator::dateToLocale($r['data_accettazione']);
|
||||
}
|
||||
|
||||
$result['category'] = 'Preventivi';
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
"main": "gulpfile.js",
|
||||
"dependencies": {
|
||||
"admin-lte": "^2.4.0",
|
||||
"autocompleter": "^6.1.1",
|
||||
"autonumeric": "^4.6.0",
|
||||
"autosize": "^3.0.21",
|
||||
"bootstrap": "^3.3.7",
|
||||
|
@ -22,6 +23,7 @@
|
|||
"fullcalendar": "^3.4.0",
|
||||
"geocomplete": "^1.7.0",
|
||||
"hotkeys-js": "^3.8.5",
|
||||
"html5sortable": "^0.13.2",
|
||||
"inputmask": "^3.3.9",
|
||||
"jquery": "^3.5.1",
|
||||
"jquery-form": "^4.2.1",
|
||||
|
|
|
@ -536,14 +536,14 @@ class FatturaElettronica
|
|||
// se privato/pa o azienda
|
||||
if ($data['tipo'] == 'Privato' or $data['tipo'] == 'Ente pubblico') {
|
||||
// se privato/pa chiedo obbligatoriamente codice fiscale
|
||||
$fields['codice_fiscale'] = 'Codice Fiscale';
|
||||
$fields['codice_fiscale'] = ($data['nazione']->iso2 == 'IT' ? 'Codice Fiscale' : '');
|
||||
// se pa chiedo codice unico ufficio
|
||||
$fields['codice_destinatario'] = ($data['tipo'] == 'Ente pubblico' && empty($data['codice_destinatario'])) ? 'Codice unico ufficio' : '';
|
||||
} else {
|
||||
// se azienda chiedo partita iva
|
||||
$fields['piva'] = 'Partita IVA';
|
||||
// se italiana e non ho impostato ne il codice destinatario ne indirizzo PEC chiedo la compilazione di almeno uno dei due
|
||||
$fields['codice_destinatario'] = (empty($data['codice_destinatario']) and empty($data['pec']) && intval($data['nazione'] == 'IT')) ? 'Codice destinatario o indirizzo PEC' : '';
|
||||
$fields['codice_destinatario'] = (empty($data['codice_destinatario']) and empty($data['pec']) && intval($data['nazione']->iso2 == 'IT')) ? 'Codice destinatario o indirizzo PEC' : '';
|
||||
}
|
||||
|
||||
$missing = [];
|
||||
|
|
10
src/App.php
10
src/App.php
|
@ -48,7 +48,6 @@ class App
|
|||
'app.min.css',
|
||||
'style.min.css',
|
||||
'themes.min.css',
|
||||
'dropzone.min.css',
|
||||
],
|
||||
|
||||
// Print CSS
|
||||
|
@ -61,7 +60,6 @@ class App
|
|||
'app.min.js',
|
||||
'functions.min.js',
|
||||
'custom.min.js',
|
||||
'dropzone.min.js',
|
||||
'i18n/parsleyjs/|lang|.min.js',
|
||||
'i18n/select2/|lang|.min.js',
|
||||
'i18n/moment/|lang|.min.js',
|
||||
|
@ -221,18 +219,20 @@ class App
|
|||
$result = array_unique(array_merge(self::$assets[$section], $config['assets'][$section]));
|
||||
|
||||
foreach ($result as $key => $element) {
|
||||
$element = $paths[$dir].'/'.$element;
|
||||
$element = string_starts_with($element, 'http') ? $element : $paths[$dir].'/'.$element;
|
||||
|
||||
if (string_contains($element, '|lang|')) {
|
||||
foreach ($lang_replace as $replace) {
|
||||
$name = str_replace('|lang|', $replace, $element);
|
||||
|
||||
if (file_exists(base_dir().str_replace(base_path(), '', $name))) {
|
||||
$assets_element = $name;
|
||||
$element = $name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$result[$key] = $assets_element.'?v='.$version;
|
||||
$result[$key] = $element.'?v='.$version;
|
||||
}
|
||||
|
||||
$assets[$section] = $result;
|
||||
|
|
|
@ -21,6 +21,7 @@ namespace HTMLBuilder\Manager;
|
|||
|
||||
use Models\Setting;
|
||||
use Models\Upload;
|
||||
use Util\FileSystem;
|
||||
|
||||
/**
|
||||
* Gestione allegati.
|
||||
|
@ -47,11 +48,14 @@ class FileManager implements ManagerInterface
|
|||
// ID del form
|
||||
$attachment_id = 'attachments_'.$options['id_module'].'_'.$options['id_plugin'];
|
||||
|
||||
$upload_max_filesize = ini_get('upload_max_filesize');
|
||||
$upload_max_filesize = substr($upload_max_filesize, 0, -1);
|
||||
|
||||
$dbo = database();
|
||||
|
||||
// Codice HTML
|
||||
$result = '
|
||||
<div id="'.$attachment_id.'" >';
|
||||
<div class="gestione-allegati" id="'.$attachment_id.'" data-id_module="'.$options['id_module'].'" data-id_plugin="'.$options['id_plugin'].'" data-id_record="'.$options['id_record'].'" data-max_filesize="'.$upload_max_filesize.'">';
|
||||
|
||||
if (!empty($options['showpanel'])) {
|
||||
$result .= '
|
||||
|
@ -79,16 +83,20 @@ class FileManager implements ManagerInterface
|
|||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.(!empty($category) ? $category : tr('Generale')).'</h3>
|
||||
|
||||
{[ "type": "text", "class": "hide category-name", "value": "'.$category.'" ]}
|
||||
{[ "type": "text", "class": "hidden category-name", "value": "'.$category.'" ]}
|
||||
|
||||
<div class="box-tools pull-right">';
|
||||
|
||||
if (!empty($category) && !in_array($category, ['Fattura Elettronica'])) {
|
||||
$result .= '
|
||||
<button type="button" class="btn btn-box-tool category-save hide">
|
||||
<button type="button" class="btn btn-box-tool category-save hidden">
|
||||
<i class="fa fa-check"></i>
|
||||
</button>
|
||||
|
||||
<button type="button" class="btn btn-box-tool category-cancel hidden">
|
||||
<i class="fa fa-close"></i>
|
||||
</button>
|
||||
|
||||
<button type="button" class="btn btn-box-tool category-edit">
|
||||
<i class="fa fa-edit"></i>
|
||||
</button>';
|
||||
|
@ -115,7 +123,7 @@ class FileManager implements ManagerInterface
|
|||
$file = Upload::find($r['id']);
|
||||
|
||||
$result .= '
|
||||
<tr id="row_'.$r['id'].'" >
|
||||
<tr id="row_'.$r['id'].'" data-id="'.$r['id'].'" data-filename="'.$r['filename'].'">
|
||||
<td align="left">';
|
||||
|
||||
if ($file->user && $file->user->photo) {
|
||||
|
@ -133,38 +141,38 @@ class FileManager implements ManagerInterface
|
|||
<i class="fa fa-external-link"></i> '.$r['name'].'
|
||||
</a>
|
||||
|
||||
<small> ('.$file->extension.')'.((!empty($file->size)) ? ' ('.\Util\FileSystem::formatBytes($file->size).')' : '').' '.(((setting('Logo stampe') == $r['filename']) || (setting('Filigrana stampe') == $r['filename'])) ? '<i class="fa fa-file-text-o"></i>' : '').'</small>'.'
|
||||
<small> ('.$file->extension.')'.((!empty($file->size)) ? ' ('. FileSystem::formatBytes($file->size).')' : '').' '.(((setting('Logo stampe') == $r['filename']) || (setting('Filigrana stampe') == $r['filename'])) ? '<i class="fa fa-file-text-o"></i>' : '').'</small>'.'
|
||||
</td>
|
||||
|
||||
<td>'.\Translator::timestampToLocale($r['created_at']).'</td>
|
||||
<td>'.timestampFormat($r['created_at']).'</td>
|
||||
|
||||
<td class="text-center">
|
||||
<a class="btn btn-xs btn-primary" href="'.base_path().'/actions.php?id_module='.$options['id_module'].'&op=download-allegato&id='.$r['id'].'&filename='.$r['filename'].'" target="_blank">
|
||||
<button type="button" class="btn btn-xs btn-primary" onclick="saggiungiAllegato(this)">
|
||||
<i class="fa fa-download"></i>
|
||||
</a>';
|
||||
</button>';
|
||||
|
||||
// Anteprime supportate dal browser
|
||||
if ($file->hasPreview()) {
|
||||
$result .= '
|
||||
<button class="btn btn-xs btn-info" type="button" data-title="'.prepareToField($r['name']).' <small style=\'color:white\'><i>('.$r['filename'].')</i></small>" data-href="'.base_path().'/view.php?file_id='.$r['id'].'">
|
||||
<button type="button" class="btn btn-xs btn-info" onclick="visualizzaAllegato(this)">
|
||||
<i class="fa fa-eye"></i>
|
||||
</button>';
|
||||
} else {
|
||||
$result .= '
|
||||
<button class="btn btn-xs btn-default disabled" title="'.tr('Anteprima file non disponibile').'" disabled>
|
||||
<button type="button" class="btn btn-xs btn-default disabled" title="'.tr('Anteprima file non disponibile').'" disabled>
|
||||
<i class="fa fa-eye"></i>
|
||||
</button>';
|
||||
}
|
||||
|
||||
if (!$options['readonly']) {
|
||||
$result .= '
|
||||
<button type="button" class="btn btn-xs btn-warning" data-href="'.base_path().'/actions.php?op=visualizza-modifica-allegato&id_module='.$options['id_module'].'&id_allegato='.$r['id'].'" data-title="'.tr('Modifica allegato').'">
|
||||
<button type="button" class="btn btn-xs btn-warning" onclick="modificaAllegato(this)">
|
||||
<i class="fa fa-edit"></i>
|
||||
</button>
|
||||
|
||||
<a class="btn btn-xs btn-danger ask" data-backto="record-edit" data-msg="'.tr('Vuoi eliminare questo file?').'" data-op="rimuovi-allegato" data-filename="'.$r['filename'].'" data-id_record="'.$r['id_record'].'" data-id_plugin="'.$options['id_plugin'].'" data-before="show_'.$attachment_id.'" data-callback="reload_'.$attachment_id.'">
|
||||
<button type="button" class="btn btn-xs btn-danger" onclick="rimuoviAllegato(this)">
|
||||
<i class="fa fa-trash"></i>
|
||||
</a>';
|
||||
</button>';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
|
@ -214,147 +222,42 @@ class FileManager implements ManagerInterface
|
|||
|
||||
$source = array_clean(array_column($categories, 'category'));
|
||||
|
||||
$upload_max_filesize = ini_get('upload_max_filesize');
|
||||
$upload_max_filesize = substr($upload_max_filesize, 0, -1);
|
||||
|
||||
$result .= '
|
||||
<script>$(document).ready(init)</script>
|
||||
|
||||
<script>
|
||||
|
||||
// Disabling autoDiscover, otherwise Dropzone will try to attach twice.
|
||||
Dropzone.autoDiscover = false;
|
||||
|
||||
$(document).ready(function() {
|
||||
let dropzone_id = "#'.$attachment_id.' .dropzone";
|
||||
if ($(dropzone_id).length == 0) {
|
||||
return;
|
||||
}
|
||||
const container = $("#'.$attachment_id.'");
|
||||
|
||||
let dragdrop = new Dropzone(dropzone_id, {
|
||||
dictDefaultMessage: "'.tr('Clicca o trascina qui per caricare uno o più file').'.<br>('.tr('Max upload: _SIZE_', [
|
||||
'_SIZE_' => $upload_max_filesize.' MB',
|
||||
]).')",
|
||||
paramName: "file",
|
||||
maxFilesize: '.$upload_max_filesize.', // MB
|
||||
uploadMultiple: false,
|
||||
parallelUploads: 2,
|
||||
addRemoveLinks: false,
|
||||
autoProcessQueue: true,
|
||||
autoQueue: true,
|
||||
url: "'.base_path().'/actions.php?op=aggiungi-allegato&id_module='.$options['id_module'].'&id_record='.$options['id_record'].'&id_plugin='.$options['id_plugin'].'",
|
||||
init: function (file, xhr, formData) {
|
||||
this.on("success", function (file) {
|
||||
dragdrop.removeFile(file);
|
||||
});
|
||||
|
||||
this.on("complete", function (file) {
|
||||
// Ricarico solo quando ho finito
|
||||
if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
|
||||
reload_'.$attachment_id.'();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Modifica categoria
|
||||
$("#'.$attachment_id.' .category-edit").click(function() {
|
||||
var nome = $(this).parent().parent().find(".box-title");
|
||||
var save_button = $(this).parent().find(".category-save");
|
||||
var input = $(this).parent().parent().find(".category-name");
|
||||
|
||||
nome.hide();
|
||||
$(this).hide();
|
||||
|
||||
input.removeClass("hide");
|
||||
save_button.removeClass("hide");
|
||||
});
|
||||
|
||||
$("#'.$attachment_id.' .category-save").click(function() {
|
||||
var nome = $(this).parent().parent().find(".box-title");
|
||||
var input = $(this).parent().parent().find(".category-name");
|
||||
|
||||
show_'.$attachment_id.'();
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
cache: false,
|
||||
type: "POST",
|
||||
data: {
|
||||
id_module: "'.$options['id_module'].'",
|
||||
id_plugin: "'.$options['id_plugin'].'",
|
||||
id_record: "'.$options['id_record'].'",
|
||||
op: "modifica-categoria-allegato",
|
||||
category: nome.text(),
|
||||
name: input.val(),
|
||||
},
|
||||
success: function(data) {
|
||||
reload_'.$attachment_id.'();
|
||||
},
|
||||
error: function(data) {
|
||||
reload_'.$attachment_id.'();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function getFilenameAndExtension(path) {
|
||||
let filename_extension = path.replace(/^.*[\\\/]/, \'\');
|
||||
let filename = filename_extension.substring(0, filename_extension.lastIndexOf(\'.\'));
|
||||
let ext = filename_extension.split(\'.\').pop();
|
||||
|
||||
return [filename, ext];
|
||||
}
|
||||
|
||||
// Auto-completamento categoria
|
||||
$("#'.$attachment_id.' #categoria_allegato").autocomplete({
|
||||
source: '.json_encode($source).',
|
||||
minLength: 0
|
||||
}).focus(function() {
|
||||
$(this).autocomplete("search", $(this).val())
|
||||
});
|
||||
|
||||
var data = {
|
||||
op: "aggiungi-allegato",
|
||||
id_module: "'.$options['id_module'].'",
|
||||
id_plugin: "'.$options['id_plugin'].'",
|
||||
id_record: "'.$options['id_record'].'",
|
||||
};
|
||||
|
||||
// Upload
|
||||
$("#'.$attachment_id.' #upload").click(function(){
|
||||
$form = $("#'.$attachment_id.' #upload-form");
|
||||
|
||||
$form.ajaxSubmit({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
data: data,
|
||||
type: "post",
|
||||
uploadProgress: function(event, position, total, percentComplete) {
|
||||
$("#'.$attachment_id.' #upload").prop("disabled", true).html(percentComplete + "%").removeClass("btn-success").addClass("btn-info");
|
||||
},
|
||||
success: function(data){
|
||||
reload_'.$attachment_id.'();
|
||||
},
|
||||
error: function(data) {
|
||||
alert("'.tr('Errore').': " + data);
|
||||
}
|
||||
});
|
||||
});
|
||||
initGestioneAllegati(container);
|
||||
impostaCategorieAllegatiDisponibili(container, '.json_encode($source).');
|
||||
});
|
||||
|
||||
function show_'.$attachment_id.'() {
|
||||
localLoading($("#'.$attachment_id.' .panel-body"), true);
|
||||
}
|
||||
// Modifica categoria
|
||||
$("#'.$attachment_id.' .category-edit").click(function() {
|
||||
const container = $(this).closest(".gestione-allegati");
|
||||
|
||||
function reload_'.$attachment_id.'() {
|
||||
$("#'.$attachment_id.'").load(globals.rootdir + "/ajax.php?op=list_attachments&id_module='.$options['id_module'].'&id_record='.$options['id_record'].'&id_plugin='.$options['id_plugin'].'", function() {
|
||||
localLoading($("#'.$attachment_id.' .panel-body"), false);
|
||||
modificaCategoriaAllegati(container, this);
|
||||
});
|
||||
|
||||
var id = $("#'.$attachment_id.' table tr").eq(-1).attr("id");
|
||||
if (id !== undefined) {
|
||||
$("#" + id).effect("highlight", {}, 1500);
|
||||
}
|
||||
});
|
||||
}
|
||||
$("#'.$attachment_id.' .category-save").click(function() {
|
||||
const container = $(this).closest(".gestione-allegati");
|
||||
|
||||
salvaCategoriaAllegati(container, this);
|
||||
});
|
||||
|
||||
$("#'.$attachment_id.' .category-cancel").click(function() {
|
||||
const container = $(this).closest(".gestione-allegati");
|
||||
|
||||
ricaricaAllegati(gestione);
|
||||
});
|
||||
|
||||
// Upload
|
||||
$("#'.$attachment_id.' #upload").click(function(){
|
||||
const container = $(this).closest(".gestione-allegati");
|
||||
|
||||
aggiungiAllegato(container);
|
||||
});
|
||||
</script>';
|
||||
|
||||
return $result;
|
||||
|
|
|
@ -135,3 +135,6 @@ INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `e
|
|||
(NULL, 'app-v1', 'retrieve', 'controllo-clienti', 'API\\App\\v1\\ControlloClienti', '1'),
|
||||
(NULL, 'app-v1', 'retrieve', 'segnalazione-bug', 'API\\App\\v1\\SegnalazioneBug', '1'),
|
||||
(NULL, 'app-v1', 'create', 'segnalazione-bug', 'API\\App\\v1\\SegnalazioneBug', '1');
|
||||
|
||||
-- Aggiunto collegamento tra DDT in direzioni opposte per gestione movimentazioni interne tra sedi
|
||||
ALTER TABLE `dt_ddt` ADD `id_ddt_trasporto_interno` INT(11) NULL, ADD FOREIGN KEY (`id_ddt_trasporto_interno`) REFERENCES `dt_ddt`(`id`) ON DELETE CASCADE;
|
||||
|
|
Loading…
Reference in New Issue