mirror of
https://github.com/devcode-it/openstamanager.git
synced 2024-12-29 17:21:54 +01:00
349 lines
12 KiB
PHP
Executable File
349 lines
12 KiB
PHP
Executable File
<?php
|
|
/*
|
|
* 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/>.
|
|
*/
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
// Imposto come azienda l'azienda predefinita per selezionare le sedi a cui ho accesso
|
|
// select-options
|
|
|
|
if (setting('Attiva scorciatoie da tastiera')) {
|
|
echo '<div class="alert alert-info">
|
|
<i class="fa fa-info-circle"></i> '.tr('Scorciatoie da tastiera: <b>F7</b> - Barcode, <b>F8</b> - Carico, <b>F9</b> - Scarico, <b>F10</b> - Spostamento').'
|
|
</div>';
|
|
}
|
|
|
|
?>
|
|
|
|
|
|
|
|
|
|
<form action="" method="post" id="add-form">
|
|
<input type="hidden" name="op" value="add">
|
|
<input type="hidden" name="backto" value="record-edit">
|
|
|
|
<div class="row">
|
|
<div class="col-md-offset-4 col-md-4">
|
|
{["type": "text", "label": "<?php echo tr('Ricerca con lettore'); ?>", "name": "barcode", "icon-before": "<i class=\"fa fa-barcode\"></i>" ]}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
{["type": "select", "label": "<?php echo tr('Articolo'); ?>", "name": "idarticolo", "ajax-source": "articoli", "value": "", "required": 1, "select-options": {"permetti_movimento_a_zero": 1, "idanagrafica": <?php echo setting('Azienda predefinita'); ?>, "idsede_partenza": 0, "idsede_destinazione": 0} ]}
|
|
</div>
|
|
|
|
<div class="col-md-2">
|
|
{["type": "number", "label": "<?php echo tr('Quantità'); ?>", "name": "qta", "decimals": "qta", "value": "1", "required": 1 ]}
|
|
</div>
|
|
|
|
<div class="col-md-2">
|
|
{["type": "date", "label": "<?php echo tr('Data'); ?>", "name": "data", "value": "-now-", "required": 1 ]}
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
{["type": "select", "label": "<?php echo tr('Causale'); ?>", "name": "causale", "values": "query=SELECT id, nome as text, descrizione, tipo_movimento FROM mg_causali_movimenti", "value": 1, "required": 1 ]}
|
|
<input type="hidden" name="tipo_movimento" id="tipo_movimento" value="carico">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
{["type": "textarea", "label": "<?php echo tr('Descrizione movimento'); ?>", "name": "movimento", "required": 1, "value": "Carico manuale" ]}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
{[ "type": "select", "label": "<?php echo tr('Partenza merce'); ?>", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "0", "required": 1, "disabled": "1" ]}
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
{[ "type": "select", "label": "<?php echo tr('Destinazione merce'); ?>", "name": "idsede_destinazione", "ajax-source": "sedi_azienda", "value": "0", "required": 1 ]}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- PULSANTI -->
|
|
<div class="row" id="buttons">
|
|
<div class="col-md-12 text-right">
|
|
<button type="submit" class="btn btn-default">
|
|
<i class="fa fa-exchange"></i> <?php echo tr('Movimenta e chiudi'); ?>
|
|
</button>
|
|
<button type="button" class="btn btn-primary" onclick="salva(this);" id="aggiungi">
|
|
<i class="fa fa-exchange"></i> <?php echo tr('Movimenta'); ?>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
<?php
|
|
|
|
echo '
|
|
<hr>
|
|
|
|
<div id="messages"></div>
|
|
|
|
<div class="alert alert-warning hidden" id="articolo-missing">
|
|
<h3><i class="fa fa-warning"></i> '.tr('Nessuna corrispondenza trovata!').'</h3>
|
|
</div>
|
|
|
|
<script>
|
|
// Lettura codici da lettore barcode
|
|
$(document).unbind("keyup");
|
|
$("#modals > div").on( "shown.bs.modal", function(){';
|
|
if (setting('Attiva scorciatoie da tastiera')) {
|
|
echo 'EnableHotkeys()';
|
|
}
|
|
echo '
|
|
$("#barcode").focus();
|
|
});
|
|
|
|
$(document).on("keyup", function (event) {
|
|
if ($(":focus").is("input, textarea")) {
|
|
return;
|
|
}
|
|
|
|
let key = window.event ? event.keyCode : event.which; // IE vs Netscape/Firefox/Opera
|
|
$("#articolo-missing").addClass("hidden");
|
|
let barcode = $("#barcode");
|
|
|
|
if ( barcode.val() == "" && $("#idarticolo").val() == null && key === 13 ){
|
|
swal("'.tr('Inserisci barcode o seleziona un articolo').'", "", "warning");
|
|
}
|
|
else if (key === 13) {
|
|
let search = barcode.val().replace(/[^a-z0-9\s\-\.\/\\|]+/gmi, "");
|
|
ricercaBarcode(search);
|
|
} else if (key === 8) {
|
|
barcode.val(barcode.val().substr(0, barcode.val().length - 1));
|
|
} else if(key <= 90 && key >= 48) {
|
|
barcode.val(barcode.val() + String.fromCharCode(key));
|
|
}
|
|
});
|
|
|
|
function abilitaSede(id){
|
|
$(id).removeClass("disabled")
|
|
.attr("disabled", false)
|
|
.attr("required", true);
|
|
}
|
|
|
|
function disabilitaSede(id){
|
|
$(id).addClass("disabled")
|
|
.attr("disabled", true)
|
|
.attr("required", false);
|
|
}
|
|
|
|
$(document).ready(function () {
|
|
$("#causale").on("change", function () {
|
|
let data = $(this).selectData();
|
|
if (data) {
|
|
$("#movimento").val(data.descrizione);
|
|
$("#tipo_movimento").val(data.tipo_movimento);
|
|
|
|
if (data.tipo_movimento === "carico") {
|
|
disabilitaSede("#idsede_partenza");
|
|
abilitaSede("#idsede_destinazione");
|
|
} else if (data.tipo_movimento === "scarico") {
|
|
abilitaSede("#idsede_partenza");
|
|
disabilitaSede("#idsede_destinazione");
|
|
} else {
|
|
abilitaSede("#idsede_partenza");
|
|
abilitaSede("#idsede_destinazione");
|
|
}
|
|
} else {
|
|
disabilitaSede("#idsede_partenza");
|
|
disabilitaSede("#idsede_destinazione");
|
|
}
|
|
});
|
|
|
|
// Reload pagina appena chiudo il modal
|
|
$("#modals > div").on("hidden.bs.modal", function () {
|
|
location.reload();
|
|
});
|
|
});
|
|
|
|
function ricercaBarcode(barcode) {
|
|
// Ricerca via ajax del barcode negli articoli
|
|
$.get(globals.rootdir + "/ajax_select.php?op=articoli&search=" + barcode,
|
|
function(data){
|
|
data = JSON.parse(data);
|
|
|
|
// Articolo trovato
|
|
if(data.results.length === 1) {
|
|
let record = data.results[0];
|
|
$("#idarticolo").selectSetNew(record.id, record.text, record);
|
|
|
|
salva($("#aggiungi"));
|
|
}
|
|
|
|
// Articolo non trovato
|
|
else {
|
|
$("#messages").remove();
|
|
$("#articolo-missing").removeClass("hidden");
|
|
input("barcode").set("");
|
|
$("#barcode").focus();
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
async function salva(button) {
|
|
$("#messages").html("");
|
|
let qta_input = input("qta");
|
|
let tipo_movimento = $("#tipo_movimento").val();
|
|
|
|
await salvaForm("#add-form", {}, button);
|
|
|
|
let articolo = $("#idarticolo").selectData();
|
|
|
|
let prezzo_acquisto = parseFloat(articolo.prezzo_acquisto);
|
|
let prezzo_vendita = parseFloat(articolo.prezzo_vendita);
|
|
let iva_vendita = articolo.iva_vendita;
|
|
|
|
let qta_movimento = qta_input.get();
|
|
|
|
let alert_type, icon, text, qta_rimanente;
|
|
if (tipo_movimento === "carico") {
|
|
alert_type = "alert-success";
|
|
icon = "fa-arrow-up";
|
|
text = "Carico";
|
|
qta_rimanente = parseFloat(articolo.qta) + parseFloat(qta_movimento);
|
|
} else if (tipo_movimento === "scarico") {
|
|
alert_type = "alert-danger";
|
|
icon = "fa-arrow-down";
|
|
text = "Scarico";
|
|
qta_rimanente = parseFloat(articolo.qta) - parseFloat(qta_movimento);
|
|
} else if (tipo_movimento === "spostamento") {
|
|
alert_type = "alert-info";
|
|
icon = "fa-arrow-down";
|
|
text = "Spostamento";
|
|
qta_rimanente = parseFloat(articolo.qta);
|
|
}
|
|
|
|
if (articolo.descrizione) {
|
|
let testo = $("#info-articolo").html();
|
|
|
|
testo = testo.replace("|alert-type|", alert_type)
|
|
.replace("|icon|", icon)
|
|
.replace("|descrizione|", articolo.descrizione)
|
|
.replace("|codice|", articolo.codice)
|
|
.replace("|misura|", articolo.um)
|
|
.replace("|misura|", articolo.um)
|
|
.replace("|descrizione-movimento|", text)
|
|
.replace("|movimento|", qta_movimento.toLocale())
|
|
.replace("|rimanente|", qta_rimanente.toLocale())
|
|
.replace("|prezzo_acquisto|", prezzo_acquisto.toLocale())
|
|
.replace("|prezzo_vendita|", prezzo_vendita.toLocale())
|
|
.replace("|iva_vendita|", iva_vendita);
|
|
|
|
$("#messages").html(testo);
|
|
}
|
|
|
|
qta_input.set(1);
|
|
$("#causale").trigger("change");
|
|
|
|
if( input("barcode").get() !== "" ){
|
|
$("#idarticolo").selectReset();
|
|
input("barcode").set("");
|
|
$("#barcode").focus();
|
|
}
|
|
}
|
|
|
|
function EnableHotkeys(){
|
|
|
|
//Anable hotkeys in blocked input elements
|
|
hotkeys.filter = function(event){
|
|
var tagName = (event.target || event.srcElement).tagName;
|
|
hotkeys.setScope(/^(INPUT|TEXTAREA|SELECT)$/.test(tagName) ? "input" : "other");
|
|
return true;
|
|
}
|
|
|
|
hotkeys("f7,f8,f9,f10", function(event, handler) {
|
|
switch (handler.key) {
|
|
case "f7":
|
|
event.preventDefault();
|
|
$("#barcode").focus();
|
|
break;
|
|
case "f8":
|
|
event.preventDefault();
|
|
input("causale").set("1");
|
|
break;
|
|
case "f9":
|
|
event.preventDefault();
|
|
input("causale").set("2");
|
|
break;
|
|
case "f10":
|
|
event.preventDefault();
|
|
input("causale").set("3");
|
|
break;
|
|
default: alert(event);
|
|
}
|
|
});
|
|
}
|
|
|
|
</script>';
|
|
|
|
echo '
|
|
<div class="hidden" id="info-articolo">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="alert alert-info text-left">
|
|
<h3>
|
|
<b>'.tr('Codice').':</b> |codice|
|
|
</h3>
|
|
<p><b>'.tr('Descrizione').':</b> |descrizione|</p>
|
|
<p><b>'.tr('Prezzo acquisto').':</b> |prezzo_acquisto| '.currency().'</p>
|
|
<p><b>'.tr('Prezzo vendita').':</b> |prezzo_vendita| '.currency().'</p>
|
|
<p><b>'.tr('IVA').':</b> |iva_vendita|</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
|
|
<div class="alert |alert-type| text-center" style="margin-bottom:6px;" >
|
|
<h3>
|
|
<i class="fa |icon|"></i> |descrizione-movimento| |movimento| |misura|
|
|
</h3>
|
|
</div>
|
|
|
|
<div class="alert alert-info text-center">
|
|
<h3>
|
|
<i class="fa fa-cubes"></i> |rimanente| |misura| rimanenti
|
|
</h3>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>';
|
|
|
|
echo '
|
|
<script>
|
|
|
|
$("#idsede_partenza").change(function(){
|
|
updateSelectOption("idsede_partenza", $(this).val());
|
|
session_set("superselect,idsede_partenza", $(this).val(), 0);
|
|
|
|
$("#idarticolo").selectReset();
|
|
});
|
|
|
|
$("#idsede_destinazione").change(function(){
|
|
updateSelectOption("idsede_destinazione", $(this).val());
|
|
session_set("superselect,idsede_destinazione", $(this).val(), 0);
|
|
|
|
$("#idarticolo").selectReset();
|
|
});
|
|
|
|
</script>';
|