2020-07-20 14:40:11 +02:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright ( C ) DevCode s . r . l .
2020-09-07 15:04:06 +02:00
*
* 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 />.
*/
2020-07-20 14:40:11 +02:00
include_once __DIR__ . '/../../core.php' ;
$incorpora_iva = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
$intestazione_prezzo = ( $options [ 'dir' ] == 'uscita' ? tr ( 'Prezzo di acquisto' ) : ( $incorpora_iva ? tr ( 'Prezzo vendita ivato' ) : tr ( 'Prezzo vendita imponibile' )));
// Articolo
echo '
< div class = " row " >
< div class = " col-md-offset-4 col-md-4 " >
2020-11-11 15:01:48 +01:00
{[ " type " : " text " , " label " : " " , " name " : " barcode " , " value " : " " , " icon-before " : " <i class= \" fa fa-barcode \" ></i> " ]}
2020-07-20 14:40:11 +02:00
</ div >
</ div >
< div class = " alert alert-info hidden " id = " articolo-missing " >
< i class = " fa fa-exclamation-circle " ></ i > '.tr(' Nessuna corrispondenza trovata ! ').'
</ div >
< div class = " alert alert-warning hidden " id = " articolo-qta " >
< i class = " fa fa-warning " ></ i > '.tr(' Articolo con quantità non sufficiente ! ').'
</ div >
< div class = " row " >
< div class = " col-md-12 " >
< table class = " table table-stripped hide " id = " articoli_barcode " >
< tr >
< th > '.tr(' Articolo ').' </ th >
< th width = " 25% " > '.$intestazione_prezzo.' </ th >
< th width = " 20% " class = " text-center " > '.tr(' Sconto ').' </ th >
< th width = " 10% " class = " text-center " > '.tr(' Q . tà ').' </ th >
< th width = " 5% " class = " text-center " > #</th>
</ tr >
</ table >
</ div >
</ div > ' ;
echo '
< script >
2020-08-27 10:08:26 +02:00
var direzione = " '. $options['dir'] .' " ;
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
$ ( document ) . ready ( function (){
init ();
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
setTimeout ( function (){
$ ( " #barcode " ) . focus ();
}, 300 );
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
$ ( " .modal-body button " ) . attr ( " disabled " , true );
});
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
// Gestione dell\'invio da tastiera
$ ( document ) . keypress ( function ( event ){
let key = window . event ? event . keyCode : event . which ; // IE vs Netscape/Firefox/Opera
if ( key == " 13 " ) {
event . preventDefault ();
$ ( " #barcode " ) . blur ()
. focus ();
}
});
$ ( " #barcode " ) . off ( " keyup " ) . on ( " keyup " , function ( event ) {
let key = window . event ? event . keyCode : event . which ; // IE vs Netscape/Firefox/Opera
$ ( " #articolo-missing " ) . addClass ( " hidden " );
$ ( " #articolo-qta " ) . addClass ( " hidden " );
if ( key !== 13 ) {
return ;
}
$ ( " #barcode " ) . attr ( " disabled " , true );
var barcode = $ ( " #barcode " ) . val ();
if ( ! barcode ){
barcodeReset ();
return ;
}
2020-11-20 16:25:26 +01:00
$ . getJSON ( globals . rootdir + " /ajax_select.php?op=articoli_barcode&search= " + barcode + " &id_anagrafica='. $options['idanagrafica'] .' " , function ( response ) {
2020-08-27 10:08:26 +02:00
let result = response . results [ 0 ];
if ( ! result ){
$ ( " #articolo-missing " ) . removeClass ( " hidden " );
barcodeReset ();
2020-07-20 14:40:11 +02:00
return ;
}
2020-08-27 10:08:26 +02:00
let qta_input = $ ( " #riga_barcode_ " + result . id ) . find ( " [name^=qta] " );
if ( result . qta == 0 ) {
$ ( " #articolo-qta " ) . removeClass ( " hidden " );
2020-07-20 14:40:11 +02:00
barcodeReset ();
return ;
}
2020-08-27 10:08:26 +02:00
// Controllo se è già presente l\'articolo, in tal caso incremento la quantità, altrimenti inserisco la riga nuova
if ( qta_input . length ) {
let qta = qta_input . val () . toEnglish ();
let nuova_qta = qta + 1 ;
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
if ( result . qta < nuova_qta ) {
2020-07-20 14:40:11 +02:00
$ ( " #articolo-qta " ) . removeClass ( " hidden " );
barcodeReset ();
return ;
}
2020-08-27 10:08:26 +02:00
qta_input . val ( nuova_qta ) . trigger ( " change " );
} else {
let prezzo_unitario = ( direzione === " uscita " ) ? result . prezzo_acquisto : result . prezzo_vendita ;
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
let info_prezzi ;
2021-05-03 11:43:25 +02:00
if ( direzione === " entrata " ) {
2020-08-27 10:08:26 +02:00
info_prezzi = " Acquisto: " + result . prezzo_acquisto + " € " ;
} else {
info_prezzi = " Vendita: " + result . prezzo_vendita + " € " ;
}
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
$ ( " #articoli_barcode " ) . removeClass ( " hide " );
cleanup_inputs ();
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
var text = replaceAll ( $ ( " #barcode-template " ) . html (), " -id- " , result . id );
text = text . replace ( " |prezzo_unitario| " , prezzo_unitario )
. replace ( " |info_prezzi| " , info_prezzi )
. replace ( " |descrizione| " , result . descrizione )
. replace ( " |codice| " , result . codice )
. replace ( " |qta| " , 1 )
. replace ( " |sconto_unitario| " , 0 )
. replace ( " |tipo_sconto| " , " " )
. replace ( " |id_dettaglio_fornitore| " , result . id_dettaglio_fornitore ? result . id_dettaglio_fornitore : " " )
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
$ ( " #articoli_barcode tr:last " ) . after ( text );
restart_inputs ();
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
$ ( " .modal-body button " ) . attr ( " disabled " , false );
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
// Gestione dinamica dei prezzi
let tr = $ ( " #riga_barcode_ " + result . id );
2021-05-03 11:43:25 +02:00
ottieniDettagliArticolo ( result . id , tr ) . then ( function () {
2020-08-27 10:08:26 +02:00
if ( $ ( tr ) . find ( " input[name^=prezzo_unitario] " ) . val () . toEnglish () === 0 ){
aggiornaPrezzoArticolo ( tr );
} else {
verificaPrezzoArticolo ( tr );
}
2021-05-03 11:43:25 +02:00
if ( $ ( tr ) . find ( " input[name^=sconto] " ) . val () . toEnglish () === 0 ){
aggiornaScontoArticolo ();
} else {
verificaScontoArticolo ();
}
2020-08-27 10:08:26 +02:00
});
}
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
barcodeReset ();
$ ( " #barcode " ) . val ( " " );
}, function (){
$ ( " #articolo-missing " ) . removeClass ( " hidden " );
barcodeReset ();
2020-07-20 14:40:11 +02:00
});
2020-08-27 10:08:26 +02:00
});
$ ( document ) . on ( " change " , " input[name^=qta], input[name^=prezzo_unitario] " , function () {
let tr = $ ( this ) . closest ( " tr " );
verificaPrezzoArticolo ( tr );
});
function barcodeReset () {
setTimeout ( function (){
$ ( " #barcode " )
. attr ( " disabled " , false )
. focus ();
}, 200 );
}
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
function rimuoviRigaBarcode ( id ) {
if ( confirm ( " '.tr('Eliminare questo articolo?').' " )) {
$ ( " #riga_barcode_ " + id ) . remove ();
// Disabilito il pulsante di aggiunta se non ci sono articoli inseriti
if ( $ ( " .inputmask-decimal " ) . length === 0 ) {
$ ( " .modal-body button " ) . attr ( " disabled " , true );
$ ( " #articoli_barcode " ) . addClass ( " hide " );
}
2020-07-20 14:40:11 +02:00
}
2020-08-27 10:08:26 +02:00
}
2020-07-20 14:40:11 +02:00
2020-08-27 10:08:26 +02:00
/**
* Restituisce il prezzo registrato per una specifica quantità dell\ ' articolo .
*/
2021-05-03 11:43:25 +02:00
function getDettaglioPerQuantita ( qta , tr ) {
const data = $ ( tr ) . data ( " dettagli " );
if ( ! data ) return null ;
let dettaglio_predefinito = null ;
let dettaglio_selezionato = null ;
for ( const dettaglio of data ) {
if ( dettaglio . minimo == null && dettaglio . massimo == null ) {
dettaglio_predefinito = dettaglio ;
2020-08-27 10:08:26 +02:00
continue ;
2020-07-20 14:40:11 +02:00
}
2020-08-27 10:08:26 +02:00
2021-05-03 11:43:25 +02:00
if ( qta >= dettaglio . minimo && qta <= dettaglio . massimo ) {
dettaglio_selezionato = dettaglio ;
2020-08-27 10:08:26 +02:00
}
}
2021-05-03 11:43:25 +02:00
if ( dettaglio_selezionato == null ) {
dettaglio_selezionato = dettaglio_predefinito ;
2020-08-27 10:08:26 +02:00
}
2021-05-03 11:43:25 +02:00
return dettaglio_selezionato ;
}
/**
* Restituisce il prezzo registrato per una specifica quantità dell\ ' articolo .
*/
function getPrezzoPerQuantita ( qta , tr ) {
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 ;
2020-08-27 10:08:26 +02:00
}
/**
2021-05-03 11:43:25 +02:00
* Funzione per registrare localmente i dettagli definiti per l\ ' articolo in relazione ad una specifica anagrafica .
2020-08-27 10:08:26 +02:00
*/
2021-05-03 11:43:25 +02:00
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 ) {
2020-08-27 10:08:26 +02:00
const data = JSON . parse ( response );
2021-05-03 11:43:25 +02:00
$ ( tr ) . data ( " dettagli " , data );
2020-08-27 10:08:26 +02:00
});
}
/**
* Funzione per verificare se il prezzo unitario corrisponde a quello registrato per l\ ' articolo , e proporre in automatico una correzione .
*/
function verificaPrezzoArticolo ( tr ) {
let qta = $ ( tr ) . find ( " input[name^=qta] " ) . val () . toEnglish ();
let prezzo_previsto = getPrezzoPerQuantita ( qta , tr );
let prezzo_unitario_input = $ ( tr ) . find ( " input[name^=prezzo_unitario] " );
let prezzo_unitario = prezzo_unitario_input . val () . toEnglish ();
let div = prezzo_unitario_input . closest ( " div " ) . parent () . find ( " div[id*=errors] " );
if ( prezzo_previsto === prezzo_unitario ) {
div . css ( " padding-top " , " 0 " );
div . html ( " " );
return ;
2020-07-20 14:40:11 +02:00
}
2020-08-27 10:08:26 +02:00
div . css ( " padding-top " , " 5px " );
2021-05-03 11:43:25 +02:00
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>` );
2020-08-27 10:08:26 +02:00
}
/**
* Funzione per aggiornare il prezzo unitario sulla base dei valori automatici .
*/
function aggiornaPrezzoArticolo ( button ) {
let tr = $ ( button ) . closest ( " tr " );
let qta = tr . find ( " input[name^=qta] " ) . val () . toEnglish ();
let prezzo_previsto = getPrezzoPerQuantita ( qta , tr );
tr . find ( " input[name^=prezzo_unitario] " ) . val ( prezzo_previsto ) . trigger ( " change " );
2021-05-03 11:43:25 +02:00
// 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>` );
2020-08-27 10:08:26 +02:00
}
2021-05-03 11:43:25 +02:00
/**
* 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 ();
}
}
2020-07-20 14:40:11 +02:00
</ script >
< table class = " hidden " >
< tbody id = " barcode-template " >
< tr id = " riga_barcode_-id- " >
< td >
| codice | - | descrizione |
< br >< small >| info_prezzi |</ small >
< input type = " hidden " name = " id_dettaglio_fornitore[-id-] " value = " |id_dettaglio_fornitore| " >
</ td >
< td >
{[ " type " : " number " , " name " : " prezzo_unitario[-id-] " , " value " : " |prezzo_unitario| " , " required " : 0 , " icon-after " : " '.currency().' " ]}
</ td >
< td >
{[ " type " : " number " , " name " : " sconto[-id-] " , " value " : " |sconto_unitario| " , " icon-after " : " choice|untprc||tipo_sconto| " , " help " : " '.tr('Il valore positivo indica uno sconto. Per applicare una maggiorazione inserire un valore negativo.').' " ]}
</ td >
< td >
{[ " type " : " number " , " name " : " qta[-id-] " , " required " : 0 , " value " : " |qta| " , " decimals " : " qta " ]}
</ td >
< td width = " 5% " class = " text-center " >
< button type = " button " class = " btn btn-xs btn-danger " onclick = " rimuoviRigaBarcode( \ '-id- \ ') " >
< i class = " fa fa-trash " ></ i >
</ button >
</ td >
</ tr >
</ tbody >
</ table > ' ;