mirror of
https://github.com/devcode-it/openstamanager.git
synced 2024-12-26 15:54:17 +01:00
6510807bdd
Miglioramento della presentazione del progetto e delle informazioni relative. Aggiunti messaggi per segnalare il collegamento dei documenti tra di loro ed evitare cancellazioni involontarie. Unificato il sistema di identificazione dei numeri (ora abbreviati in "num.").
390 lines
15 KiB
PHP
390 lines
15 KiB
PHP
<?php
|
|
|
|
include_once __DIR__.'/../../../core.php';
|
|
|
|
// Gestione dei lotti degli articoli
|
|
|
|
echo '
|
|
<div class="panel panel-primary">
|
|
<div class="panel-heading">
|
|
<h3 class="panel-title">'.tr('Produzione').'</h3>
|
|
</div>
|
|
<div class="panel-body">';
|
|
|
|
$search_lotto = $get['search_lotto'];
|
|
$search_serial = $get['search_serial'];
|
|
$search_altro = $get['search_altro'];
|
|
|
|
// Calcolo prossimo lotto e serial number
|
|
$rs = $dbo->fetchArray('SELECT MAX(lotto) AS max_lotto, MAX(serial) AS max_serial, MAX(altro) AS max_altro FROM mg_prodotti WHERE id_articolo='.prepare($id_record));
|
|
//$max_lotto = $rs[0]['max_lotto'];
|
|
$max_serial = $rs[0]['max_serial'];
|
|
//$max_altro = $rs[0]['max_altro'];
|
|
|
|
//$next_lotto = get_next_code($max_lotto);
|
|
$next_serial = get_next_code($max_serial);
|
|
//$next_altro = get_next_code($max_altro);
|
|
|
|
echo '
|
|
<form action="" method="post" role="form">
|
|
<input type="hidden" name="backto" value="record-edit">
|
|
<input type="hidden" name="op" value="addprodotto">';
|
|
|
|
// Campi di inserimento lotti
|
|
echo '
|
|
<div class="row form-group">
|
|
<div class="col-md-12">
|
|
<h4>'.tr('Inserimento nuovi prodotti').'</h4>
|
|
</div>
|
|
</div>';
|
|
|
|
/*
|
|
// Lotto
|
|
echo '
|
|
<div class="row form-group">
|
|
<label class="col-md-2 control-label" for="lotto_start">'.tr('Lotto da').':</label>
|
|
<div class="col-md-2">
|
|
<input type="text" class="form-control input-md" name="lotto_start" onkeyup="$(\'input[name=lotto_end]\').val( $(\'input[name=lotto_start]\').val() ); $(\'#warn_lotto\').hide(); ricalcola_totale_prodotti();" value="'.$next_lotto.'">
|
|
</div>
|
|
|
|
<label class="col-md-1 control-label text-center" for="lotto_end"> <i class="fa fa-arrow-circle-right fa-2x"></i> </label>
|
|
<div class="col-md-2">
|
|
<input type="text" class="form-control input-md" name="lotto_end" onkeyup="check_progressivo( $(\'input[name=lotto_start]\'), $(\'input[name=lotto_end]\'), $(\'#warn_lotto\'), $(\'#inserisci\') );" value="'.$next_lotto.'">
|
|
</div>';
|
|
if (!empty($max_lotto)) {
|
|
echo '
|
|
<div class="col-md-3">
|
|
<p id="warn_lotto" class="text-danger"><b>'.tr('Ultimo lotto inserito').': </b> '.$max_lotto.'</p>
|
|
</div>';
|
|
}
|
|
echo '
|
|
</div>';
|
|
*/
|
|
// Serial
|
|
echo '
|
|
<div class="row form-group">
|
|
<label class="col-md-2 control-label" for="serial_start">'.tr('Serial number da').':</label>
|
|
<div class="col-md-2">
|
|
<input type="text" class="form-control input-md" name="serial_start" onkeyup="$(\'input[name=serial_end]\').val( $(\'input[name=serial_start]\').val() ); $(\'#warn_serial\').hide(); ricalcola_totale_prodotti();" value="'.$next_serial.'" />
|
|
</div>
|
|
|
|
<label class="col-md-1 control-label text-center" for="serial_end"> <i class="fa fa-arrow-circle-right fa-2x"></i> </label>
|
|
<div class="col-md-2">
|
|
<input type="text" class="form-control input-md" name="serial_end" onkeyup="check_progressivo( $(\'input[name=serial_start]\'), $(\'input[name=serial_end]\'), $(\'#warn_serial\'), $(\'#inserisci\') );" value="'.$next_serial.'" />
|
|
</div>';
|
|
|
|
if (!empty($max_serial)) {
|
|
echo '
|
|
<div class="col-md-3">
|
|
<p id="warn_serial" class="text-danger"><b>'.tr('Ultimo serial number inserito').': </b> '.$max_serial.'</p>
|
|
</div>';
|
|
}
|
|
echo '
|
|
</div>';
|
|
|
|
/*
|
|
// Altro
|
|
echo '
|
|
<div class="row form-group">
|
|
<label class="col-md-2 control-label" for="altro_start">'.tr('Altro codice da').':</label>
|
|
<div class="col-md-2">
|
|
<input type="text" class="form-control input-md" name="altro_start" onkeyup="$(\'input[name=altro_end]\').val( $(\'input[name=altro_start]\').val() ); $(\'#warn_altro\').hide(); ricalcola_totale_prodotti();" value="'.$next_altro.'" />
|
|
</div>
|
|
|
|
<label class="col-md-1 control-label text-center" for="altro_end"> <i class="fa fa-arrow-circle-right fa-2x"></i> </label>
|
|
<div class="col-md-2">
|
|
<input type="text" class="form-control input-md" name="altro_end" onkeyup="check_progressivo( $(\'input[name=altro_start]\'), $(\'input[name=altro_end]\'), $(\'#warn_altro\'), $(\'#inserisci\') );" value="'.$next_altro.'" />
|
|
</div>';
|
|
if (!empty($max_altro)) {
|
|
echo '
|
|
<div class="col-md-3">
|
|
<p id="warn_altro" class="text-danger"><b>'.tr('Ultimo codice aggiuntivo inserito').': </b> '.$max_altro.'</p>
|
|
</div>';
|
|
}
|
|
echo '
|
|
</div>';
|
|
*/
|
|
|
|
// Totale prodotti da inserire
|
|
echo '
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<p class="text-danger text-center">'.tr('Totale prodotti da inserire').': <span id="totale_prodotti">0</span></p>
|
|
<button type="submit" id="inserisci" class="btn btn-success" onclick="if( confirm(\'Confermi l\\\'inserimento di \' + globalsp.n_prodotti + \' prodotti?\') ){ $(\'#insert_form\').submit(); }"><i class="fa fa-check"></i> '.tr('Salva modifiche').'</button>';
|
|
|
|
// Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato
|
|
if (get_var("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number") == true) {
|
|
echo '
|
|
<small>'.tr("L'inserimento incrementerà la quantità dell'articolo!").'</small>';
|
|
} else {
|
|
echo '
|
|
<small>'.tr("L'inserimento non movimenterà la quantità dell'articolo!").'</small>';
|
|
}
|
|
|
|
echo '
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>';
|
|
|
|
// Ricerca
|
|
echo '
|
|
<div class="box">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title">'.tr('Ricerca prodotti').'</h3>
|
|
</div>
|
|
<div class="box-body">
|
|
<div class="text-right">
|
|
<small style="color:#f00;">';
|
|
|
|
// Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato
|
|
if (get_var("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) {
|
|
echo tr("La cancellazione decrementerà la quantità dell'articolo!");
|
|
} else {
|
|
echo tr("L'inserimento decrementerà la quantità dell'articolo!");
|
|
}
|
|
|
|
echo '
|
|
</small>
|
|
</div>';
|
|
|
|
// Conteggio totale prodotti
|
|
$rs = $dbo->fetchArray('SELECT COUNT(id) AS tot FROM mg_prodotti WHERE id_articolo='.prepare($id_record));
|
|
$tot_prodotti = $rs[0]['tot'];
|
|
|
|
// Visualizzazione di tutti i prodotti
|
|
$query = 'SELECT id, serial, created_at FROM mg_prodotti WHERE serial IS NOT NULL AND id_articolo='.prepare($id_record).(!empty($search_serial) ? ' AND serial LIKE '.prepare('%'.$search_serial.'%') : '').' GROUP BY serial ORDER BY created_at DESC, serial DESC, lotto DESC, altro DESC';
|
|
$rs2 = $dbo->fetchArray($query);
|
|
|
|
echo '
|
|
<table class="table table-striped table-hover table-condensed table-bordered text-center datatables">
|
|
<thead>
|
|
<tr>
|
|
<th id="th_Serial">'.tr('Serial').'</th>
|
|
<th id="th_Data di creazione">'.tr('Data di creazione').'</th>
|
|
<th id="th_Documento di vendita">'.tr('Documento di vendita').'</th>
|
|
<th id="th_Totale">'.tr('Totale').'</th>
|
|
<th class="text-center">#</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>';
|
|
|
|
for ($i = 0; $i < count($rs2); ++$i) {
|
|
echo '
|
|
<tr>
|
|
|
|
<td>'.$rs2[$i]['serial'].'</td>';
|
|
|
|
echo '
|
|
<td>'.Translator::timestampToLocale($rs2[$i]['created_at']).'</td>';
|
|
|
|
// Ricerca vendite
|
|
$vendite = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE dir=\'entrata\' AND id_articolo='.prepare($id_record).' AND serial='.prepare($rs2[$i]['serial']));
|
|
|
|
if (!empty($vendite)) {
|
|
echo '
|
|
<td>';
|
|
|
|
$totali = [];
|
|
|
|
foreach ($vendite as $vendita) {
|
|
// Venduto su fatture
|
|
if (!empty($vendita['id_riga_documento'])) {
|
|
$module_id = Modules::getModule('Fatture di vendita')['id'];
|
|
|
|
// Ricerca vendite su fatture
|
|
$query = 'SELECT *, ( SELECT descrizione FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS tipo_documento, ( SELECT `dir` FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS `dir`, ( SELECT numero FROM co_documenti WHERE id=iddocumento ) AS numero, ( SELECT numero_esterno FROM co_documenti WHERE id=iddocumento ) AS numero_esterno, ( SELECT data FROM co_documenti WHERE id=iddocumento ) AS data FROM co_righe_documenti WHERE co_righe_documenti.id='.prepare($vendita['id_riga_documento']);
|
|
$data = $dbo->fetchArray($query);
|
|
|
|
$id = $data[0]['iddocumento'];
|
|
}
|
|
|
|
// Venduto su ddt
|
|
elseif (!empty($vendita['id_riga_ddt'])) {
|
|
$numero = ($rs3[0]['numero_esterno'] != '') ? $rs3[0]['numero_esterno'] : $rs3[0]['numero'];
|
|
$module_id = Modules::getModule('Ddt di vendita')['id'];
|
|
|
|
$query = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE dt_righe_ddt.id='.prepare($vendita['id_riga_ddt']);
|
|
$data = $dbo->fetchArray($query);
|
|
|
|
$id = $data[0]['idddt'];
|
|
}
|
|
|
|
// Inserito su ordini
|
|
elseif (!empty($vendita['id_riga_ordine'])) {
|
|
$module_id = Modules::getModule('Ordini cliente')['id'];
|
|
|
|
// Ricerca inserimenti su ordini
|
|
$query = 'SELECT *, ( SELECT descrizione FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS tipo_documento, ( SELECT `dir` FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS `dir`, ( SELECT numero FROM or_ordini WHERE id=idordine ) AS numero, ( SELECT numero_esterno FROM or_ordini WHERE id=idordine ) AS numero_esterno, ( SELECT data FROM or_ordini WHERE id=idordine ) AS data FROM or_righe_ordini WHERE or_righe_ordini.id='.prepare($vendita['id_riga_ordine']);
|
|
$data = $dbo->fetchArray($query);
|
|
|
|
$id = $data[0]['idordine'];
|
|
}
|
|
|
|
// Inserito su intervento
|
|
elseif (!empty($vendita['id_riga_intervento'])) {
|
|
$module_id = Modules::getModule('Interventi')['id'];
|
|
|
|
// Ricerca inserimenti su interventi
|
|
$query = 'SELECT mg_articoli_interventi.*, in_interventi.codice, ( SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=mg_articoli_interventi.idintervento LIMIT 0,1 ) AS data FROM mg_articoli_interventi JOIN in_interventi ON in_interventi.id = mg_articoli_interventi.idintervento WHERE mg_articoli_interventi.id='.prepare($vendita['id_riga_intervento']);
|
|
$data = $dbo->fetchArray($query);
|
|
|
|
$id = $data[0]['idintervento'];
|
|
|
|
$data[0]['tipo_documento'] = tr('Intervento').' '.$data[0]['codice'];
|
|
$data[0]['subtotale'] = $data[0]['prezzo_vendita'] * $data[0]['qta'];
|
|
$data[0]['iva'] = 0;
|
|
|
|
$extra = tr('(q.tà _QTA_)', [
|
|
'_QTA_' => $data[0]['qta'],
|
|
]);
|
|
}
|
|
|
|
$totali[] = [$data[0]['subtotale'], $data[0]['iva']];
|
|
|
|
$numero = !empty($data[0]['numero_esterno']) ? $data[0]['numero_esterno'] : $data[0]['numero'];
|
|
|
|
$text = tr('_DOC_ num. _NUM_ del _DATE_', [
|
|
'_DOC_' => $data[0]['tipo_documento'],
|
|
'_NUM_' => $numero,
|
|
'_DATE_' => Translator::dateToLocale($data[0]['data']),
|
|
]).(!empty($extra) ? ' '.$extra : '');
|
|
|
|
echo '
|
|
'.Modules::link($module_id, $id, $text).'<br>';
|
|
}
|
|
|
|
echo '
|
|
</td>
|
|
|
|
<td class="text-center">';
|
|
foreach ($totali as $value) {
|
|
$subtotale = $value[0];
|
|
$iva = $value[1];
|
|
|
|
echo '
|
|
<span>€ '.Translator::numberToLocale($subtotale + $iva).'</span>';
|
|
if (!empty($subtotale) && !empty($iva)) {
|
|
echo '
|
|
<small style="color:#555;">('.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).')</small>';
|
|
}
|
|
echo '
|
|
<br>';
|
|
}
|
|
|
|
echo '
|
|
</td>
|
|
|
|
<td></td>';
|
|
}
|
|
|
|
// Non venduto
|
|
else {
|
|
// Documento di vendita
|
|
echo '
|
|
<td></td>';
|
|
|
|
// Totale
|
|
echo '
|
|
<td></td>';
|
|
|
|
echo '
|
|
<td class="text-center">
|
|
<a class="btn btn-danger btn-sm ask" data-backto="record-edit" data-op="delprodotto" data-idprodotto="'.$rs2[$i]['id'].'">
|
|
<i class="fa fa-trash"></i>
|
|
</a>
|
|
</td>';
|
|
}
|
|
echo '
|
|
</tr>';
|
|
}
|
|
echo '
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>';
|
|
|
|
?>
|
|
|
|
<script type="text/javascript">
|
|
|
|
globalsp = { n_prodotti: 0 };
|
|
|
|
$(document).ready( function(){
|
|
setInterval("ricalcola_totale_prodotti()", 1000);
|
|
});
|
|
|
|
/*
|
|
Queste funzioni servono a verificare se i codici di lotti, serial number e "altro" sono progressivi
|
|
*/
|
|
function check_progressivo( start, end, warn, submit_btn ){
|
|
digits_start = get_last_numeric_part( start.val().toString() );
|
|
digits_end = get_last_numeric_part( end.val().toString() );
|
|
|
|
// Nessun codice numerico trovato
|
|
if( digits_start=="" || digits_end=="" ){
|
|
warn.show();
|
|
submit_btn.hide();
|
|
}
|
|
else{
|
|
warn.hide();
|
|
submit_btn.show();
|
|
}
|
|
|
|
ricalcola_totale_prodotti();
|
|
}
|
|
|
|
function ricalcola_totale_prodotti(){
|
|
if( $("input[name=serial_start]").val() != undefined ){
|
|
var lotti, altro, serial;
|
|
/*
|
|
lotto_start = get_last_numeric_part( $("input[name=lotto_start]").val().toString() );
|
|
lotto_end = get_last_numeric_part( $("input[name=lotto_end]").val().toString() );
|
|
lotti = Math.abs( parseInt(lotto_end,10) - parseInt(lotto_start,10) )+1;
|
|
|
|
altro_start = get_last_numeric_part( $("input[name=altro_start]").val().toString() );
|
|
altro_end = get_last_numeric_part( $("input[name=altro_end]").val().toString() );
|
|
altro = Math.abs( parseInt(altro_end,10) - parseInt(altro_start,10) )+1;
|
|
*/
|
|
|
|
serial_start = get_last_numeric_part( $("input[name=serial_start]").val().toString() );
|
|
serial_end = get_last_numeric_part( $("input[name=serial_end]").val().toString() );
|
|
serial = Math.abs( parseInt(serial_end,10) - parseInt(serial_start,10) )+1;
|
|
|
|
// Se tutti i campi sono vuoti, il numero di prodotti è zero!
|
|
if(isNaN(serial) /*&& isNaN(lotti) && isNaN(altro)*/ ){
|
|
globalsp.n_prodotti = 0;
|
|
}
|
|
|
|
else{
|
|
if( isNaN(lotti) )
|
|
lotti = 1;
|
|
|
|
if( isNaN(serial) )
|
|
serial = 1;
|
|
|
|
if( isNaN(altro) )
|
|
altro = 1;
|
|
|
|
globalsp.n_prodotti = serial /* * lotti * altro */;
|
|
}
|
|
|
|
$("#totale_prodotti").text( globalsp.n_prodotti );
|
|
|
|
if( globalsp.n_prodotti==0 )
|
|
$("#inserisci").hide();
|
|
else
|
|
$("#inserisci").show();
|
|
}
|
|
}
|
|
|
|
/*
|
|
Questa funzione restituisce la parte numerica di una stringa
|
|
*/
|
|
function get_last_numeric_part( str ){
|
|
var matches = str.match(/(.*?)([\d]*$)/);
|
|
return matches[2];
|
|
}
|
|
</script>
|