mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-16 11:30:55 +01:00
Aggiornamento spostamento quantità Articolo tra Sedi
This commit is contained in:
parent
20a8352cf0
commit
e3688413ab
@ -536,6 +536,7 @@ function salvaForm(button, form) {
|
||||
title: globals.translations.ajax.missing.title,
|
||||
text: globals.translations.ajax.missing.text,
|
||||
});
|
||||
buttonRestore(button, restore);
|
||||
|
||||
resolve(false);
|
||||
}
|
||||
|
@ -73,8 +73,6 @@ class Articolo extends Model
|
||||
*/
|
||||
public function registra($qta, $descrizone = null, $data = null, $manuale = false, $array = [])
|
||||
{
|
||||
$id = false;
|
||||
|
||||
if (empty($qta)) {
|
||||
return false;
|
||||
}
|
||||
|
@ -6,32 +6,44 @@ use Modules\Articoli\Articolo;
|
||||
|
||||
switch (post('op')) {
|
||||
case 'add':
|
||||
$articolo = Articolo::find(post('idarticolo'));
|
||||
$tipo_movimento = post('tipo_movimento');
|
||||
$descrizione = post('movimento');
|
||||
$data = post('data');
|
||||
$qta = post('qta');
|
||||
|
||||
$idsede_partenza = post('idsede_partenza');
|
||||
$idsede_destinazione = post('idsede_destinazione');
|
||||
$direzione = post('direzione');
|
||||
|
||||
$qta = !empty($direzione) ? post('qta') : -post('qta');
|
||||
if (!empty($direzione)) {
|
||||
if ($idsede_partenza == 0 && $idsede_destinazione != 0) {
|
||||
$qta = -post('qta');
|
||||
} elseif ($idsede_partenza != 0 && $idsede_destinazione == 0) {
|
||||
$qta = post('qta');
|
||||
$idsede_partenza = post('idsede_destinazione');
|
||||
$idsede_destinazione = post('idsede_partenza');
|
||||
}
|
||||
} else {
|
||||
if ($idsede_partenza != 0 && $idsede_destinazione == 0) {
|
||||
$qta = -post('qta');
|
||||
$idsede_partenza = post('idsede_destinazione');
|
||||
$idsede_destinazione = post('idsede_partenza');
|
||||
} elseif ($idsede_partenza == 0 && $idsede_destinazione != 0) {
|
||||
$qta = post('qta');
|
||||
if ($tipo_movimento == 'carico' || $tipo_movimento == 'scarico') {
|
||||
if ($tipo_movimento == 'carico') {
|
||||
$id_sede_azienda = $idsede_destinazione;
|
||||
$id_sede_controparte = 0;
|
||||
} elseif ($tipo_movimento == 'scarico') {
|
||||
$id_sede_controparte = $idsede_partenza;
|
||||
$id_sede_azienda = 0;
|
||||
|
||||
$qta = -$qta;
|
||||
}
|
||||
|
||||
// Registrazione del movimento con variazione della quantità
|
||||
$articolo->movimenta($qta, $descrizione, $data, 1, [
|
||||
'idsede_controparte' => $id_sede_controparte,
|
||||
'idsede_azienda' => $id_sede_azienda,
|
||||
]);
|
||||
} elseif ($tipo_movimento == 'spostamento') {
|
||||
// Registrazione del movimento verso la sede di destinazione
|
||||
$articolo->registra($qta, $descrizione, $data, 1, [
|
||||
'idsede_controparte' => 0,
|
||||
'idsede_azienda' => $idsede_destinazione,
|
||||
]);
|
||||
|
||||
// Registrazione del movimento dalla sede di origine
|
||||
$articolo->registra(-$qta, $descrizione, $data, 1, [
|
||||
'idsede_controparte' => 0,
|
||||
'idsede_azienda' => $idsede_partenza,
|
||||
]);
|
||||
}
|
||||
|
||||
$articolo = Articolo::find(post('idarticolo'));
|
||||
$idmovimento = $articolo->movimenta($qta, post('movimento'), post('data'), 1);
|
||||
$dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_partenza).', idsede_controparte='.prepare($idsede_destinazione).' WHERE id='.prepare($idmovimento));
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -12,14 +12,19 @@ $_SESSION['superselect']['idsede_partenza'] = 0;
|
||||
$_SESSION['superselect']['idsede_destinazione'] = 0;
|
||||
|
||||
?>
|
||||
|
||||
<form action="" method="post" id="add-form">
|
||||
<input type="hidden" name="op" value="add">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="op" value="add">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
|
||||
<div class="row hidden" id="barcode-row">
|
||||
<div class="col-md-12">
|
||||
{["type": "text", "label": "<?php echo tr('Barcode'); ?>", "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 ]}
|
||||
{["type": "select", "label": "<?php echo tr('Articolo'); ?>", "name": "idarticolo", "ajax-source": "articoli", "value": "", "required": 1, "select-options": {"permetti_movimento_a_zero": 1} ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-2">
|
||||
@ -31,166 +36,230 @@ $_SESSION['superselect']['idsede_destinazione'] = 0;
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
{["type": "select", "label": "<?php echo tr('Causale'); ?>", "name": "causale", "values": "query=SELECT id, nome as text, descrizione, movimento_carico FROM mg_causali_movimenti", "value": 1, "required": 1 ]}
|
||||
|
||||
<input type="hidden" name="direzione" id="direzione">
|
||||
{["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 ]}
|
||||
{["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('Sede'); ?>", "name": "idsede_destinazione", "ajax-source": "sedi_azienda", "value": "0", "required": 1 ]}
|
||||
{[ "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('Partenza merce'); ?>", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "0", "required": 1 ]}
|
||||
{[ "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-plus"></i> <?php echo tr('Aggiungi e chiudi'); ?></button>
|
||||
<a type="button" class="btn btn-primary" onclick="ajax_submit( $('#idarticolo').selectData() );"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?></a>
|
||||
</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-plus"></i> <?php echo tr('Aggiungi e chiudi'); ?>
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" onclick="salva(this);" id="aggiungi">
|
||||
<i class="fa fa-plus"></i> <?php echo tr('Aggiungi'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
|
||||
echo '
|
||||
<hr>
|
||||
|
||||
<div id="messages"></div>
|
||||
|
||||
<div class="alert alert-info hidden" id="articolo-missing">
|
||||
<i class="fa fa-exclamation-circle"></i> '.tr('Nessuna corrispondenza trovata!').'
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$('#modals > div').on('shown.bs.modal', function() {
|
||||
$('#causale').on('change', function() {
|
||||
var data = $(this).selectData();
|
||||
if (data) {
|
||||
$('#movimento').val(data.descrizione);
|
||||
$('#direzione').val(data.movimento_carico);
|
||||
}
|
||||
});
|
||||
|
||||
$('#causale').trigger('change');
|
||||
|
||||
// Lettura codici da lettore barcode
|
||||
var keys = '';
|
||||
|
||||
$(document).unbind('keyup');
|
||||
|
||||
$(document).on('keyup', function (evt) {
|
||||
if(window.event) { // IE
|
||||
keynum = evt.keyCode;
|
||||
} else if(evt.which){ // Netscape/Firefox/Opera
|
||||
keynum = evt.which;
|
||||
}
|
||||
|
||||
if (evt.which === 13) {
|
||||
var search = keys.replace(/\W/g, '');
|
||||
|
||||
// Ricerca via ajax del barcode negli articoli
|
||||
$.get(
|
||||
globals.rootdir + '/ajax_select.php?op=articoli&search='+search,
|
||||
function(data){
|
||||
data = $.parseJSON(data);
|
||||
|
||||
// Articolo trovato
|
||||
if( data.results.length == 1 ){
|
||||
var record = data.results[0].children[0];
|
||||
$('#idarticolo').selectSetNew( record.id, record.text );
|
||||
ajax_submit( record );
|
||||
}
|
||||
|
||||
// Articolo non trovato
|
||||
else {
|
||||
$('#messages').html( '<hr><div class="alert alert-danger text-center"><big>Articolo <b>' + search + '</b> non trovato!</big></div>' );
|
||||
}
|
||||
}
|
||||
);
|
||||
keys = '';
|
||||
} else {
|
||||
keys += String.fromCharCode( evt.keyCode );
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Reload pagina appena chiudo il modal
|
||||
$('#modals > div').on('hidden.bs.modal', function() {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
function ajax_submit( articolo ) {
|
||||
//Controllo che siano presenti tutti i dati richiesti
|
||||
if( $("#add-form").parsley().validate() ){
|
||||
submitAjax(
|
||||
$('#add-form'),
|
||||
{},
|
||||
function() {},
|
||||
function() {}
|
||||
);
|
||||
|
||||
$('#messages').html('');
|
||||
|
||||
var prezzo_acquisto = parseFloat(articolo.prezzo_acquisto);
|
||||
var prezzo_vendita = parseFloat(articolo.prezzo_vendita);
|
||||
|
||||
var qta_movimento = parseFloat($('#qta').val());
|
||||
|
||||
var alert = '';
|
||||
var icon = '';
|
||||
var text = '';
|
||||
var qta_rimanente = 0;
|
||||
|
||||
if($('#direzione').val()=='Carico manuale'){
|
||||
alert = 'alert-success';
|
||||
icon = '<i class="fa fa-arrow-up"></i>';
|
||||
text = 'Carico';
|
||||
qta_rimanente = parseFloat(articolo.qta)+parseFloat(qta_movimento);
|
||||
}else{
|
||||
alert = 'alert-danger';
|
||||
icon = '<i class="fa fa-arrow-down"></i>';
|
||||
text = 'Scarico';
|
||||
qta_rimanente = parseFloat(articolo.qta)-parseFloat(qta_movimento);
|
||||
}
|
||||
|
||||
if( articolo.descrizione != '' ){
|
||||
$('#messages').html(
|
||||
'<hr>'+
|
||||
'<div class="row">'+
|
||||
'<div class="col-md-6">'+
|
||||
'<div class="alert alert-info text-center" style="line-height: 1.6;">'+
|
||||
'<b style="font-size:14pt;"><i class="fa fa-barcode"></i> ' + articolo.barcode + ' - ' + articolo.descrizione + '</b><br>'+
|
||||
'<b>Prezzo acquisto:</b> ' + prezzo_acquisto.toLocale() + " " + globals.currency + '<br><b>Prezzo vendita:</b> ' + prezzo_vendita.toLocale() + " " + globals.currency +
|
||||
'</div>'+
|
||||
'</div>'+
|
||||
'<div class="col-md-6">'+
|
||||
'<div class="alert '+alert+' text-center">'+
|
||||
'<p style="font-size:14pt;">'+icon+' '+text+' '+qta_movimento.toLocale()+' '+articolo.um+' <i class="fa fa-arrow-circle-right"></i> '+qta_rimanente.toLocale()+' '+articolo.um+' rimanenti</p>'+
|
||||
'</div>'+
|
||||
'</div>'+
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
|
||||
$("#qta").val(1);
|
||||
// Lettura codici da lettore barcode
|
||||
$(document).unbind("keyup");
|
||||
$(document).on("keyup", function (event) {
|
||||
if ($(":focus").is("input, textarea")) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<?php
|
||||
|
||||
let key = window.event ? event.keyCode : event.which; // IE vs Netscape/Firefox/Opera
|
||||
$("#articolo-missing").addClass("hidden");
|
||||
let barcode = $("#barcode");
|
||||
|
||||
if (key === 13) {
|
||||
let search = barcode.val().replace(/\W/g, "");
|
||||
ricercaBarcode(search);
|
||||
} else if (key === 8) {
|
||||
barcode.val(barcode.val().substr(0, barcode.val().length - 1));
|
||||
} else if(key <= 90 && key >= 48) {
|
||||
$("#barcode-row").removeClass("hidden");
|
||||
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) {
|
||||
$("#barcode").val("");
|
||||
|
||||
var record = data.results[0].children[0];
|
||||
$("#idarticolo").selectSetNew(record.id, record.text, record);
|
||||
|
||||
salva($("#aggiungi"));
|
||||
}
|
||||
|
||||
// Articolo non trovato
|
||||
else {
|
||||
$("#articolo-missing").removeClass("hidden");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
async function salva(button) {
|
||||
$("#messages").html("");
|
||||
var qta_input = $("#qta");
|
||||
var tipo_movimento = $("#tipo_movimento").val();
|
||||
|
||||
let valid = await salvaForm(button, "#add-form");
|
||||
|
||||
if (valid) {
|
||||
let articolo = $("#idarticolo").selectData();
|
||||
let prezzo_acquisto = parseFloat(articolo.prezzo_acquisto);
|
||||
let prezzo_vendita = parseFloat(articolo.prezzo_vendita);
|
||||
|
||||
let qta_movimento = parseFloat(qta_input.val());
|
||||
|
||||
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());
|
||||
|
||||
$("#messages").html(testo);
|
||||
}
|
||||
|
||||
qta_input.val(1);
|
||||
$("#causale").trigger("change");
|
||||
}
|
||||
}
|
||||
</script>';
|
||||
|
||||
if (setting('Attiva scorciatoie da tastiera')) {
|
||||
echo '
|
||||
<script>
|
||||
hotkeys(\'f8\', \'carico\', function(event, handler){
|
||||
hotkeys("f8", "carico", function() {
|
||||
$("#modals > div #direzione").val(1).change();
|
||||
});
|
||||
hotkeys.setScope(\'carico\');
|
||||
hotkeys.setScope("carico");
|
||||
|
||||
hotkeys(\'f9\', \'carico\', function(event, handler){
|
||||
hotkeys("f9", "scarico", function() {
|
||||
$("#modals > div #direzione").val(2).change();
|
||||
});
|
||||
hotkeys.setScope(\'carico\');
|
||||
hotkeys.setScope("scarico");
|
||||
</script>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="hidden" id="info-articolo">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="alert alert-info text-center">
|
||||
<h3>
|
||||
|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>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="alert |alert-type| text-center">
|
||||
<h3>
|
||||
<i class="fa |icon|"></i> |descrizione-movimento| |movimento| |misura|
|
||||
<i class="fa fa-arrow-circle-right"></i> |rimanente| |misura| rimanenti
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
@ -54,8 +54,8 @@ class ChoicesHandler implements HandlerInterface
|
||||
<input type="checkbox" id="|id|" value="|value|" autocomplete="off" class="hidden" |attr| onchange="$(this).parent().find(\'[type = hidden]\').val(+this.checked)"/>
|
||||
<div class="btn-group">
|
||||
<label for="|id|" class="btn btn-default">
|
||||
<span class="fa fa-check"></span>
|
||||
<span class="fa fa-close"></span>
|
||||
<span class="fa fa-check text-success"></span>
|
||||
<span class="fa fa-close text-danger"></span>
|
||||
</label>
|
||||
<label for="|id|" class="btn btn-default active">
|
||||
|placeholder|
|
||||
|
@ -167,4 +167,13 @@ DELETE FROM `in_statiintervento` WHERE `codice` = 'CALL' AND `descrizione` = 'Ch
|
||||
NOT EXISTS(SELECT `idstatointervento` FROM `in_interventi` WHERE `in_interventi`.`idstatointervento` = `in_statiintervento`.`idstatointervento`) ;
|
||||
|
||||
-- Rimozione aliquote iva non usate
|
||||
UPDATE `co_iva` SET deleted_at=NOW() WHERE `descrizione` LIKE 'Scorporo%';
|
||||
UPDATE `co_iva` SET deleted_at = NOW() WHERE `descrizione` LIKE 'Scorporo%';
|
||||
|
||||
-- Modifica mg_causali_movimenti
|
||||
ALTER TABLE `mg_causali_movimenti` ADD `tipo_movimento` ENUM('carico', 'scarico', 'spostamento') NOT NULL DEFAULT 'spostamento';
|
||||
UPDATE `mg_causali_movimenti` SET `tipo_movimento` = 'carico' WHERE `movimento_carico` = 1;
|
||||
UPDATE `mg_causali_movimenti` SET `tipo_movimento` = 'scarico' WHERE `movimento_carico` = 0;
|
||||
ALTER TABLE `mg_causali_movimenti` DROP `movimento_carico`;
|
||||
|
||||
INSERT INTO `mg_causali_movimenti` (`id`, `nome`, `descrizione`, `tipo_movimento`) VALUES
|
||||
(NULL, 'Spostamento', 'Spostamento manuale', 'spostamento');
|
||||
|
Loading…
x
Reference in New Issue
Block a user