2017-08-04 16:28:16 +02:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
* Copyright ( C ) DevCode s . n . c .
*
* 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 />.
*/
2017-08-04 16:28:16 +02:00
include_once __DIR__ . '/../../../core.php' ;
2019-07-08 10:21:35 +02:00
$record [ 'abilita_serial' ] = ( $record [ 'serial' ] > 0 ) ? 1 : $record [ 'abilita_serial' ];
if ( empty ( $record [ 'abilita_serial' ])) {
echo '
2019-07-08 12:25:51 +02:00
< script > $ ( " #link-tab_'. $plugin['id'] .' " ) . addClass ( " disabled " ); </ script > ' ;
2019-07-08 10:21:35 +02:00
}
2019-08-28 11:52:04 +02:00
// Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato
$message = setting ( " Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number " ) ? tr ( " L'inserimento e la rimozione dei seriali modificherà la quantità dell'articolo! " ) : tr ( " L'inserimento e la rimozione dei seriali non movimenterà la quantità dell'articolo! " );
2017-08-04 16:28:16 +02:00
echo '
2019-08-28 11:52:04 +02:00
< div class = " alert alert-info " >
'.$message.'
</ div > ' ;
2017-08-04 16:28:16 +02:00
2019-08-28 11:52:04 +02:00
// Inserimento seriali
2017-08-04 16:28:16 +02:00
echo '
2019-08-28 11:52:04 +02:00
< div class = " nav-tabs-custom " >
< ul class = " nav nav-tabs nav-justified " >
< li class = " active " >< a href = " #generazione " data - toggle = " tab " > '.tr(' Generazione ').' </ a ></ li >
< li >< a href = " #inserimento " data - toggle = " tab " > '.tr(' Inserimento ').' </ a ></ li >
</ ul >
2019-12-13 16:32:53 +01:00
2019-08-28 11:52:04 +02:00
< div class = " tab-content " >
< form action = " " method = " post " role = " form " class = " tab-pane active " id = " generazione " >
2017-08-04 16:28:16 +02:00
< input type = " hidden " name = " backto " value = " record-edit " >
2019-08-28 11:52:04 +02:00
< input type = " hidden " name = " op " value = " generate_serials " >
2019-12-13 16:32:53 +01:00
2019-08-28 11:52:04 +02:00
< div class = " row " >
< div class = " col-md-5 " >
{[ " type " : " text " , " label " : " '.tr('Inizio').' " , " name " : " serial_start " , " extra " : " onkeyup= \" $ ( \ '#serial_end \ ').val( $ (this).val()); ricalcola_generazione(); \" " ]}
2017-08-04 16:28:16 +02:00
</ div >
2019-12-13 16:32:53 +01:00
2019-08-28 11:52:04 +02:00
< div class = " col-md-2 text-center " style = " padding-top: 20px; " >
2018-07-04 15:38:10 +02:00
< i class = " fa fa-arrow-circle-right fa-2x " ></ i >
2019-08-28 11:52:04 +02:00
</ div >
2019-12-13 16:32:53 +01:00
2018-07-04 15:38:10 +02:00
< div class = " col-md-5 " >
2019-08-28 11:52:04 +02:00
{[ " type " : " text " , " label " : " '.tr('Fine').' " , " name " : " serial_end " , " extra " : " onkeyup= \" ricalcola_generazione(); \" " ]}
</ div >
</ div >
2019-12-13 16:32:53 +01:00
2019-08-28 11:52:04 +02:00
< div class = " row " >
< div class = " col-md-9 " >
< p class = " text-danger " > '.tr(' Totale prodotti da inserire ').' : < span id = " totale_generazione " > 0 </ span ></ p >
</ div >
2019-12-13 16:32:53 +01:00
2019-08-28 11:52:04 +02:00
< div class = " col-md-3 text-right " >
< button type = " button " class = " btn btn-primary " onclick = " addSerial( \ '#generazione \ ', $ ( \ '#totale_generazione \ ').text()) " >< i class = " fa fa-plus " ></ i > '.tr(' Aggiungi ').' </ button >
</ div >
</ div >
</ form >
2019-12-13 16:32:53 +01:00
< form action = " " method = " post " role = " form " class = " tab-pane " id = " inserimento " >
2019-08-28 11:52:04 +02:00
< input type = " hidden " name = " backto " value = " record-edit " >
< input type = " hidden " name = " op " value = " add_serials " >
2019-12-13 16:32:53 +01:00
2017-08-04 16:28:16 +02:00
< div class = " row " >
< div class = " col-md-12 " >
2019-08-28 11:52:04 +02:00
{[ " type " : " select " , " label " : " '.tr('Nuovi seriali').' " , " name " : " serials[] " , " extra " : " onchange= \" ricalcola_inserimento(); \" " , " multiple " : 1 , " values " : [] ]}
</ div >
</ div >
2017-08-04 16:28:16 +02:00
2019-08-28 11:52:04 +02:00
< div class = " row " >
< div class = " col-md-9 " >
< p class = " text-danger " > '.tr(' Totale prodotti da inserire ').' : < span id = " totale_inserimento " > 0 </ span ></ p >
</ div >
2019-12-13 16:32:53 +01:00
2019-08-28 11:52:04 +02:00
< div class = " col-md-3 text-right " >
< button type = " button " class = " btn btn-primary " onclick = " addSerial( \ '#inserimento \ ', $ ( \ '#totale_inserimento \ ').text()) " >< i class = " fa fa-plus " ></ i > '.tr(' Aggiungi ').' </ button >
2017-08-04 16:28:16 +02:00
</ div >
</ div >
</ form >
</ div >
</ div > ' ;
2019-08-28 11:52:04 +02:00
// Elenco
2017-08-04 16:28:16 +02:00
echo '
< div class = " box " >
< div class = " box-header with-border " >
2019-08-28 11:52:04 +02:00
< h3 class = " box-title " > '.tr(' Elenco seriali ').' </ h3 >
2017-08-04 16:28:16 +02:00
</ div >
2019-08-28 11:52:04 +02:00
< div class = " box-body " > ' ;
2017-08-04 16:28:16 +02:00
// Conteggio totale prodotti
2017-09-05 17:31:58 +02:00
$rs = $dbo -> fetchArray ( 'SELECT COUNT(id) AS tot FROM mg_prodotti WHERE id_articolo=' . prepare ( $id_record ));
2017-08-04 16:28:16 +02:00
$tot_prodotti = $rs [ 0 ][ 'tot' ];
// Visualizzazione di tutti i prodotti
2019-07-31 12:27:41 +02:00
$search_serial = get ( 'search_serial' );
2017-09-12 12:31:33 +02:00
$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' ;
2017-08-04 16:28:16 +02:00
$rs2 = $dbo -> fetchArray ( $query );
2017-09-05 17:31:58 +02:00
echo '
2020-04-15 16:43:23 +02:00
< table id = " table-serials " class = " table table-striped table-hover table-condensed table-bordered text-center datatables " >
2017-08-04 16:28:16 +02:00
< thead >
< tr >
2017-09-04 12:02:29 +02:00
< 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 >
2017-09-05 17:31:58 +02:00
< th class = " text-center " > #</th>
2017-08-04 16:28:16 +02:00
</ tr >
</ thead >
< tbody > ' ;
2017-09-05 17:31:58 +02:00
for ( $i = 0 ; $i < count ( $rs2 ); ++ $i ) {
echo '
< tr >
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
< td > '.$rs2[$i][' serial '].' </ td > ' ;
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
echo '
< td > '.Translator::timestampToLocale($rs2[$i][' created_at ']).' </ td > ' ;
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
// Ricerca vendite
$vendite = $dbo -> fetchArray ( 'SELECT * FROM mg_prodotti WHERE dir=\'entrata\' AND id_articolo=' . prepare ( $id_record ) . ' AND serial=' . prepare ( $rs2 [ $i ][ 'serial' ]));
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
if ( ! empty ( $vendite )) {
echo '
< td > ' ;
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
$totali = [];
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
foreach ( $vendite as $vendita ) {
2017-08-04 16:28:16 +02:00
// Venduto su fatture
2017-09-05 17:31:58 +02:00
if ( ! empty ( $vendita [ 'id_riga_documento' ])) {
2017-09-22 15:19:59 +02:00
$module_id = Modules :: get ( 'Fatture di vendita' )[ 'id' ];
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
// 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' ];
2017-08-04 16:28:16 +02:00
}
// Venduto su ddt
2017-09-05 17:31:58 +02:00
elseif ( ! empty ( $vendita [ 'id_riga_ddt' ])) {
2017-08-04 16:28:16 +02:00
$numero = ( $rs3 [ 0 ][ 'numero_esterno' ] != '' ) ? $rs3 [ 0 ][ 'numero_esterno' ] : $rs3 [ 0 ][ 'numero' ];
2017-09-22 15:19:59 +02:00
$module_id = Modules :: get ( 'Ddt di vendita' )[ 'id' ];
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
$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' ];
2017-08-04 16:28:16 +02:00
}
// Inserito su ordini
2017-09-05 17:31:58 +02:00
elseif ( ! empty ( $vendita [ 'id_riga_ordine' ])) {
2017-09-22 15:19:59 +02:00
$module_id = Modules :: get ( 'Ordini cliente' )[ 'id' ];
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
// 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' ];
2017-08-04 16:28:16 +02:00
}
// Inserito su intervento
2017-09-05 17:31:58 +02:00
elseif ( ! empty ( $vendita [ 'id_riga_intervento' ])) {
2017-09-22 15:19:59 +02:00
$module_id = Modules :: get ( 'Interventi' )[ 'id' ];
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
// Ricerca inserimenti su interventi
2020-02-14 17:02:16 +01:00
$query = 'SELECT in_righe_interventi.*, in_interventi.codice, ( SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=in_righe_interventi.idintervento LIMIT 0,1 ) AS data FROM in_righe_interventi JOIN in_interventi ON in_interventi.id = in_righe_interventi.idintervento WHERE in_righe_interventi.id=' . prepare ( $vendita [ 'id_riga_intervento' ]);
2017-09-05 17:31:58 +02:00
$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 ;
2017-08-04 16:28:16 +02:00
2017-09-10 14:35:41 +02:00
$extra = tr ( '(q.tà _QTA_)' , [
'_QTA_' => $data [ 0 ][ 'qta' ],
]);
2017-08-04 16:28:16 +02:00
}
2017-09-05 17:31:58 +02:00
$totali [] = [ $data [ 0 ][ 'subtotale' ], $data [ 0 ][ 'iva' ]];
2017-09-14 10:27:49 +02:00
$numero = ! empty ( $data [ 0 ][ 'numero_esterno' ]) ? $data [ 0 ][ 'numero_esterno' ] : $data [ 0 ][ 'numero' ];
2017-09-05 17:31:58 +02:00
2017-09-14 10:27:49 +02:00
$text = tr ( '_DOC_ num. _NUM_ del _DATE_' , [
2017-09-10 14:35:41 +02:00
'_DOC_' => $data [ 0 ][ 'tipo_documento' ],
'_NUM_' => $numero ,
'_DATE_' => Translator :: dateToLocale ( $data [ 0 ][ 'data' ]),
2017-09-14 10:27:49 +02:00
]) . ( ! empty ( $extra ) ? ' ' . $extra : '' );
2017-08-04 16:28:16 +02:00
echo '
2017-09-05 17:31:58 +02:00
'.Modules::link($module_id, $id, $text).' < br > ' ;
}
echo '
</ td >
< td class = " text-center " > ' ;
foreach ( $totali as $value ) {
$subtotale = $value [ 0 ];
$iva = $value [ 1 ];
2017-08-04 16:28:16 +02:00
2017-09-05 17:31:58 +02:00
echo '
2019-04-13 02:56:39 +02:00
< span > '.moneyFormat($subtotale + $iva).' </ span > ' ;
2017-08-04 16:28:16 +02:00
if ( ! empty ( $subtotale ) && ! empty ( $iva )) {
echo '
2017-09-05 17:31:58 +02:00
< small style = " color:#555; " > ( '.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).' ) </ small > ' ;
2017-08-04 16:28:16 +02:00
}
echo '
2017-09-05 17:31:58 +02:00
< br > ' ;
2017-08-04 16:28:16 +02:00
}
2017-09-05 17:31:58 +02:00
echo '
</ td >
< td ></ td > ' ;
}
// Non venduto
else {
// Documento di vendita
echo '
< td ></ td > ' ;
// Totale
echo '
< td ></ td > ' ;
2017-08-04 16:28:16 +02:00
echo '
2017-09-05 17:31:58 +02:00
< 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 > ' ;
2017-08-04 16:28:16 +02:00
}
echo '
2017-09-05 17:31:58 +02:00
</ tr > ' ;
}
echo '
2017-08-04 16:28:16 +02:00
</ tbody >
</ table >
</ div >
</ div > ' ;
2019-08-28 11:52:04 +02:00
echo '
2017-08-04 16:28:16 +02:00
< script type = " text/javascript " >
2019-08-28 11:52:04 +02:00
$ ( document ) . ready ( function () {
2020-04-15 16:43:23 +02:00
$ ( " #table-serials " ) . DataTable () . draw ();
2019-08-28 11:52:04 +02:00
$ ( " #serials " ) . removeClass ( " superselect " );
$ ( " #serials " ) . select2 () . select2 ( " destroy " );
$ ( " #serials " ) . select2 ({
theme : " bootstrap " ,
language : " it " ,
allowClear : true ,
tags : true ,
tokenSeparators : [ \ ' , \ ' ]
});
2017-08-04 16:28:16 +02:00
});
2019-12-13 16:32:53 +01:00
function addSerial ( form_id , numero ) {
2019-08-28 11:52:04 +02:00
if ( numero > 0 ){
swal ({
2019-08-28 16:58:47 +02:00
title : " '.tr('Nuovi seriali').' " ,
html : " '.tr( " Confermi l ' inserimento di _NUM_ nuovi seriali ? " , [
2019-08-28 11:52:04 +02:00
'_NUM_' => '" + numero + "' ,
2019-08-28 16:58:47 +02:00
]) . ' " ,
2019-08-28 11:52:04 +02:00
type : " success " ,
showCancelButton : true ,
2019-08-28 16:58:47 +02:00
confirmButtonText : " '.tr('Continua').' "
2019-08-28 11:52:04 +02:00
}) . then ( function ( result ) {
$ ( form_id ) . submit ();
})
} else {
swal ( " '.tr('Errore').' " , " '.tr('Nessun seriale inserito').' " , " error " );
}
2017-08-04 16:28:16 +02:00
}
2019-08-28 11:52:04 +02:00
function ricalcola_generazione (){
if ( $ ( " #serial_start " ) . val () == undefined ) return 0 ;
2017-08-04 16:28:16 +02:00
2019-08-28 11:52:04 +02:00
var serial_start = get_last_numeric_part ( $ ( " #serial_start " ) . val () . toString () );
var serial_end = get_last_numeric_part ( $ ( " #serial_end " ) . val () . toString () );
var serial = Math . abs ( parseInt ( serial_end , 10 ) - parseInt ( serial_start , 10 )) + 1 ;
2017-08-04 16:28:16 +02:00
2019-08-28 11:52:04 +02:00
// Se tutti i campi sono vuoti, il numero di prodotti è zero!
if ( isNaN ( serial )) {
serial = 0 ;
}
2017-08-04 16:28:16 +02:00
2019-08-28 11:52:04 +02:00
$ ( " #totale_generazione " ) . text ( serial );
}
2017-08-04 16:28:16 +02:00
2019-08-28 11:52:04 +02:00
function ricalcola_inserimento (){
$ ( " #totale_inserimento " ) . text ( $ ( " #serials " ) . select2 ( " data " ) . length );
2017-08-04 16:28:16 +02:00
}
/*
Questa funzione restituisce la parte numerica di una stringa
*/
2019-08-28 11:52:04 +02:00
function get_last_numeric_part ( str ){
2017-08-04 16:28:16 +02:00
var matches = str . match ( / ( .* ? )([ \d ] * $ ) / );
return matches [ 2 ];
}
2019-08-28 11:52:04 +02:00
</ script > ' ;