Compare commits
3 Commits
aef69c3ed0
...
c1175dcec8
Author | SHA1 | Date |
---|---|---|
MatteoPistorello | c1175dcec8 | |
MatteoPistorello | 815ba25bb0 | |
Dasc3er | a5d1487b4b |
|
@ -39,6 +39,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
|
||||||
- Nuovo filtro in attività per mostrare al tecnico solo le attività assegnate.
|
- Nuovo filtro in attività per mostrare al tecnico solo le attività assegnate.
|
||||||
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
|
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
|
||||||
- Nuovo pulsante **Duplica Template** per copiare un template già esistente.
|
- Nuovo pulsante **Duplica Template** per copiare un template già esistente.
|
||||||
|
- Aggiunto controllo nelle fatture di vendita per segnalare l'eventuale fatturazione di un'attività con la data di una sessione futura rispetto alla data della fattura.
|
||||||
|
|
||||||
## 2.4.22
|
## 2.4.22
|
||||||
|
|
||||||
|
|
|
@ -295,10 +295,9 @@ function aggiornaPrezzoArticolo() {
|
||||||
$("#prezzo_unitario").val(prezzo_previsto).trigger("change");
|
$("#prezzo_unitario").val(prezzo_previsto).trigger("change");
|
||||||
|
|
||||||
// Aggiornamento automatico di guadagno e margine
|
// Aggiornamento automatico di guadagno e margine
|
||||||
if (direzione == "entrata") {
|
if (direzione === "entrata") {
|
||||||
aggiorna_guadagno();
|
aggiorna_guadagno();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -311,10 +310,9 @@ function aggiornaScontoArticolo() {
|
||||||
$("#sconto").val(sconto_previsto).trigger("change");
|
$("#sconto").val(sconto_previsto).trigger("change");
|
||||||
|
|
||||||
// Aggiornamento automatico di guadagno e margine
|
// Aggiornamento automatico di guadagno e margine
|
||||||
if (direzione == "entrata") {
|
if (direzione === "entrata") {
|
||||||
aggiorna_guadagno();
|
aggiorna_guadagno();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -124,7 +124,7 @@ $("#barcode").off("keyup").on("keyup", function (event) {
|
||||||
let prezzo_unitario = (direzione === "uscita") ? result.prezzo_acquisto : result.prezzo_vendita;
|
let prezzo_unitario = (direzione === "uscita") ? result.prezzo_acquisto : result.prezzo_vendita;
|
||||||
|
|
||||||
let info_prezzi;
|
let info_prezzi;
|
||||||
if(direzione == "entrata") {
|
if(direzione === "entrata") {
|
||||||
info_prezzi = "Acquisto: " + result.prezzo_acquisto + " €";
|
info_prezzi = "Acquisto: " + result.prezzo_acquisto + " €";
|
||||||
}else{
|
}else{
|
||||||
info_prezzi = "Vendita: " + result.prezzo_vendita + " €";
|
info_prezzi = "Vendita: " + result.prezzo_vendita + " €";
|
||||||
|
@ -150,12 +150,18 @@ $("#barcode").off("keyup").on("keyup", function (event) {
|
||||||
|
|
||||||
// Gestione dinamica dei prezzi
|
// Gestione dinamica dei prezzi
|
||||||
let tr = $("#riga_barcode_" + result.id);
|
let tr = $("#riga_barcode_" + result.id);
|
||||||
ottieniPrezziArticolo(result.id, tr).then(function() {
|
ottieniDettagliArticolo(result.id, tr).then(function() {
|
||||||
if ($(tr).find("input[name^=prezzo_unitario]").val().toEnglish() === 0){
|
if ($(tr).find("input[name^=prezzo_unitario]").val().toEnglish() === 0){
|
||||||
aggiornaPrezzoArticolo(tr);
|
aggiornaPrezzoArticolo(tr);
|
||||||
} else {
|
} else {
|
||||||
verificaPrezzoArticolo(tr);
|
verificaPrezzoArticolo(tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($(tr).find("input[name^=sconto]").val().toEnglish() === 0){
|
||||||
|
aggiornaScontoArticolo();
|
||||||
|
} else {
|
||||||
|
verificaScontoArticolo();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,38 +201,56 @@ function rimuoviRigaBarcode(id) {
|
||||||
/**
|
/**
|
||||||
* Restituisce il prezzo registrato per una specifica quantità dell\'articolo.
|
* Restituisce il prezzo registrato per una specifica quantità dell\'articolo.
|
||||||
*/
|
*/
|
||||||
function getPrezzoPerQuantita(qta, tr) {
|
function getDettaglioPerQuantita(qta, tr) {
|
||||||
const data = $(tr).find("input[name^=prezzo_unitario]").data("prezzi");
|
const data = $(tr).data("dettagli");
|
||||||
if (!data) return 0;
|
if (!data) return null;
|
||||||
|
|
||||||
let prezzo_predefinito = null;
|
let dettaglio_predefinito = null;
|
||||||
let prezzo_selezionato = null;
|
let dettaglio_selezionato = null;
|
||||||
for (const prezzo of data) {
|
for (const dettaglio of data) {
|
||||||
if (prezzo.minimo == null && prezzo.massimo == null) {
|
if (dettaglio.minimo == null && dettaglio.massimo == null) {
|
||||||
prezzo_predefinito = prezzo.prezzo_unitario;
|
dettaglio_predefinito = dettaglio;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qta >= prezzo.minimo && qta <= prezzo.massimo) {
|
if (qta >= dettaglio.minimo && qta <= dettaglio.massimo) {
|
||||||
prezzo_selezionato = prezzo.prezzo_unitario;
|
dettaglio_selezionato = dettaglio;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prezzo_selezionato == null) {
|
if (dettaglio_selezionato == null) {
|
||||||
prezzo_selezionato = prezzo_predefinito;
|
dettaglio_selezionato = dettaglio_predefinito;
|
||||||
}
|
}
|
||||||
|
|
||||||
return parseFloat(prezzo_selezionato);
|
return dettaglio_selezionato;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Funzione per registrare localmente i prezzi definiti per l\'articolo in relazione ad una specifica anagrafica.
|
* Restituisce il prezzo registrato per una specifica quantità dell\'articolo.
|
||||||
*/
|
*/
|
||||||
function ottieniPrezziArticolo(id_articolo, tr) {
|
function getPrezzoPerQuantita(qta, tr) {
|
||||||
return $.get(globals.rootdir + "/ajax_complete.php?module=Articoli&op=prezzi_articolo&id_anagrafica='.$options['idanagrafica'].'&id_articolo=" + id_articolo + "&dir=" + direzione, function(response) {
|
const dettaglio = getDettaglioPerQuantita(qta, tr);
|
||||||
|
|
||||||
|
return dettaglio ? parseFloat(dettaglio.prezzo_unitario) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restituisce lo sconto registrato per una specifica quantità dell\'articolo.
|
||||||
|
*/
|
||||||
|
function getScontoPerQuantita(qta, tr) {
|
||||||
|
const dettaglio = getDettaglioPerQuantita(qta, tr);
|
||||||
|
|
||||||
|
return dettaglio ? parseFloat(dettaglio.sconto_percentuale) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Funzione per registrare localmente i dettagli definiti per l\'articolo in relazione ad una specifica anagrafica.
|
||||||
|
*/
|
||||||
|
function ottieniDettagliArticolo(id_articolo, tr) {
|
||||||
|
return $.get(globals.rootdir + "/ajax_complete.php?module=Articoli&op=dettagli_articolo&id_anagrafica='.$options['idanagrafica'].'&id_articolo=" + id_articolo + "&dir=" + direzione, function(response) {
|
||||||
const data = JSON.parse(response);
|
const data = JSON.parse(response);
|
||||||
|
|
||||||
$(tr).find("input[name^=prezzo_unitario]").data("prezzi", data);
|
$(tr).data("dettagli", data);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,7 +274,7 @@ function verificaPrezzoArticolo(tr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
div.css("padding-top", "5px");
|
div.css("padding-top", "5px");
|
||||||
div.html(`<small class="label label-warning" >'.tr('Prezzo registrato').': ` + prezzo_previsto.toLocale() + globals.currency + `<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo(this)"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
|
div.html(`<small class="label label-warning" >'.tr('Prezzo suggerito').': ` + prezzo_previsto.toLocale() + globals.currency + `<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo(this)"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -262,8 +286,50 @@ function aggiornaPrezzoArticolo(button) {
|
||||||
let prezzo_previsto = getPrezzoPerQuantita(qta, tr);
|
let prezzo_previsto = getPrezzoPerQuantita(qta, tr);
|
||||||
|
|
||||||
tr.find("input[name^=prezzo_unitario]").val(prezzo_previsto).trigger("change");
|
tr.find("input[name^=prezzo_unitario]").val(prezzo_previsto).trigger("change");
|
||||||
|
|
||||||
|
// Aggiornamento automatico di guadagno e margine
|
||||||
|
if (direzione === "entrata") {
|
||||||
|
aggiorna_guadagno();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Funzione per verificare se lo sconto unitario corrisponde a quello registrato per l\'articolo, e proporre in automatico una correzione.
|
||||||
|
*/
|
||||||
|
function verificaScontoArticolo(tr) {
|
||||||
|
let qta = $(tr).find("input[name^=qta]").val().toEnglish();
|
||||||
|
let sconto_previsto = getScontoPerQuantita(qta, tr);
|
||||||
|
|
||||||
|
let sconto_input = $(tr).find("input[name^=sconto]");
|
||||||
|
let sconto = sconto_input.val().toEnglish();
|
||||||
|
|
||||||
|
let div = sconto_input.parent().next();
|
||||||
|
if (sconto_previsto === 0 || sconto_previsto === sconto || $(tr).find("input[name^=tipo_sconto]").val() === "UNT") {
|
||||||
|
div.css("padding-top", "0");
|
||||||
|
div.html("");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.css("padding-top", "5px");
|
||||||
|
div.html(`<small class="label label-warning" >'.tr('Sconto suggerito').': ` + sconto_previsto.toLocale() + `%<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaScontoArticolo(this)"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Funzione per aggiornare lo sconto unitario sulla base dei valori automatici.
|
||||||
|
*/
|
||||||
|
function aggiornaScontoArticolo(button) {
|
||||||
|
let tr = $(button).closest("tr");
|
||||||
|
let qta = tr.find("input[name^=qta]").val().toEnglish();
|
||||||
|
let sconto_previsto = getScontoPerQuantita(qta, tr);
|
||||||
|
|
||||||
|
$("#sconto").val(sconto_previsto).trigger("change");
|
||||||
|
|
||||||
|
// Aggiornamento automatico di guadagno e margine
|
||||||
|
if (direzione === "entrata") {
|
||||||
|
aggiorna_guadagno();
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<table class="hidden">
|
<table class="hidden">
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
use Modules\Anagrafiche\Anagrafica;
|
use Modules\Anagrafiche\Anagrafica;
|
||||||
use Modules\Fatture\Gestori\Bollo;
|
use Modules\Fatture\Gestori\Bollo;
|
||||||
use Modules\Iva\Aliquota;
|
use Modules\Iva\Aliquota;
|
||||||
|
use Modules\Interventi\Intervento;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
|
@ -89,6 +91,26 @@ if ($dir == 'entrata') {
|
||||||
]).'.</b>
|
]).'.</b>
|
||||||
</div>';
|
</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verifica la data dell'intervento rispetto alla data della fattura
|
||||||
|
$righe_interventi = $fattura->getRighe()->where('idintervento', '!=', NULL);
|
||||||
|
if (!empty($righe_interventi)) {
|
||||||
|
foreach($righe_interventi as $riga_intervento){
|
||||||
|
$intervento = Intervento::find($riga_intervento->idintervento);
|
||||||
|
|
||||||
|
if((new Carbon($intervento->fine))->diffInDays(new Carbon($fattura->data), false) < 0){
|
||||||
|
$fatturazione_futura = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($fatturazione_futura){
|
||||||
|
echo '
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
<i class="fa fa-warning"></i> '.tr("Stai fatturando un'attività futura rispetto alla data di fatturazione.").'</b>
|
||||||
|
</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<form action="" method="post" id="edit-form">
|
<form action="" method="post" id="edit-form">
|
||||||
|
|
Loading…
Reference in New Issue