2018-02-19 10:52:42 +01: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 />.
*/
2018-02-19 10:52:42 +01:00
2018-06-23 18:35:08 +02:00
$result [ 'idarticolo' ] = isset ( $result [ 'idarticolo' ]) ? $result [ 'idarticolo' ] : null ;
2020-07-06 13:32:43 +02:00
$qta_minima = 0 ;
2018-02-19 10:52:42 +01:00
// Articolo
2020-02-14 17:02:16 +01:00
if ( empty ( $result [ 'idarticolo' ])) {
2021-06-16 18:54:09 +02:00
// Sede partenza
if ( $module [ 'name' ] == 'Interventi' ) {
2021-07-07 07:57:10 +02:00
echo '
2021-06-16 18:54:09 +02:00
< div class = " row " >
< div class = " col-md-4 " >
{[ " type " : " select " , " label " : " '.tr('Partenza merce').' " , " required " : " 1 " , " id " : " idsede " , " name " : " idsede_partenza " , " ajax-source " : " sedi_azienda " , " value " : " '.( $result['idsede_partenza'] ?: $options['idsede_partenza'] ).' " ]}
</ div >
</ div > ' ;
}
2018-02-19 11:50:42 +01:00
echo '
2018-02-19 10:52:42 +01:00
< div class = " row " >
< div class = " col-md-12 " >
2020-08-17 16:25:01 +02:00
{[ " type " : " select " , " label " : " '.tr('Articolo').' " , " name " : " idarticolo " , " required " : 1 , " value " : " '. $result['idarticolo'] .' " , " ajax-source " : " articoli " , " select-options " : '.json_encode($options[' select - options '][' articoli ']).' , " icon-after " : " add|'.Modules::get('Articoli')['id'].' " ]}
2018-02-19 10:52:42 +01:00
</ div >
2020-07-06 13:32:43 +02:00
</ div >
< input type = " hidden " name = " id_dettaglio_fornitore " id = " id_dettaglio_fornitore " value = " " > ' ;
2018-02-19 11:50:42 +01:00
} else {
2018-09-20 12:05:22 +02:00
$database = database ();
2020-07-06 13:32:43 +02:00
$articolo = $database -> fetchOne ( ' SELECT mg_articoli . id ,
mg_fornitore_articolo . id AS id_dettaglio_fornitore ,
IFNULL ( mg_fornitore_articolo . codice_fornitore , mg_articoli . codice ) AS codice ,
IFNULL ( mg_fornitore_articolo . descrizione , mg_articoli . descrizione ) AS descrizione ,
IFNULL ( mg_fornitore_articolo . qta_minima , 0 ) AS qta_minima
FROM mg_articoli
LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo . id_articolo = mg_articoli . id AND mg_fornitore_articolo . id = '.prepare($result[' id_dettaglio_fornitore ']).'
WHERE mg_articoli . id = '.prepare($result[' idarticolo ' ]));
$qta_minima = $articolo [ 'qta_minima' ];
2018-02-19 11:50:42 +01:00
echo '
2021-11-04 18:10:38 +01:00
{[ " type " : " select " , " disabled " : " 1 " , " label " : " '.tr('Articolo').' " , " name " : " idarticolo " , " value " : " '. $result['idarticolo'] .' " , " ajax-source " : " articoli " , " select-options " : '.json_encode($options[' select - options '][' articoli ']).' , " icon-after " : " add|'.Modules::get('Articoli')['id'].' " ]}
2020-08-27 09:15:30 +02:00
< script >
$ ( document ) . ready ( function (){
2020-10-30 14:19:02 +01:00
ottieniDettagliArticolo ( " '. $articolo['id'] .' " ) . then ( function (){
2020-08-27 09:15:30 +02:00
verificaPrezzoArticolo ();
2020-10-30 11:18:15 +01:00
verificaScontoArticolo ();
});
2020-08-27 09:15:30 +02:00
});
</ script > ' ;
2020-02-14 17:02:16 +01:00
}
2020-07-06 13:32:43 +02:00
echo '
< input type = " hidden " name = " qta_minima " id = " qta_minima " value = " '. $qta_minima .' " > ' ;
2020-02-14 17:02:16 +01:00
// Selezione impianto per gli Interventi
if ( $module [ 'name' ] == 'Interventi' ) {
echo '
< div class = " row " >
< div class = " col-md-12 " >
2021-08-05 18:17:26 +02:00
{[ " type " : " select " , " label " : " '.tr('Impianto su cui installare').' " , " name " : " id_impianto " , " value " : " " , " ajax-source " : " impianti-intervento " , " select-options " : '.json_encode($options[' select - options '][' impianti ']).' , " help " : " '.tr( " La selezione di un Impianto in questo campo provocherà l 'installazione di un nuovo Componente basato sull' Articolo corrente " ).' " ]}
2020-02-14 17:02:16 +01:00
</ div >
</ div > ' ;
2018-02-19 11:50:42 +01:00
}
2018-02-19 10:52:42 +01:00
echo App :: internalLoad ( 'riga.php' , $result , $options );
2020-02-14 17:02:16 +01:00
// Informazioni aggiuntive
2021-04-01 17:40:38 +02:00
$disabled = empty ( $result [ 'idarticolo' ]);
2018-02-19 10:52:42 +01:00
2021-04-01 17:40:38 +02:00
echo '
2020-04-21 15:44:49 +02:00
< div class = " row '.(!empty( $options['nascondi_prezzi'] ) ? 'hidden' : '').' " id = " prezzi_articolo " >
2020-02-14 17:02:16 +01:00
< div class = " col-md-4 text-center " >
2020-09-23 17:53:19 +02:00
< button type = " button " class = " btn btn-sm btn-info btn-block '.( $disabled ? 'disabled' : '').' " '.($disabled ? ' disabled ' : ' ').' onclick = " $ ( \ '#prezziacquisto \ ').toggleClass( \ 'hide \ '); $ ( \ '#prezziacquisto \ ').load( \ ''.base_path(). " / ajax_complete . php ? module = Articoli & op = getprezziacquisto & idarticolo = ' + ( $(' #idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
2021-05-24 15:43:49 +02:00
< i class = " fa fa-shopping-cart " ></ i > '.tr(' Ultimi prezzi di acquisto ').'
2020-02-14 17:02:16 +01:00
</ button >
2020-04-15 16:25:44 +02:00
< div id = " prezziacquisto " class = " hide " ></ div >
2020-02-14 17:02:16 +01:00
</ div >
2018-02-19 10:52:42 +01:00
2020-02-14 17:02:16 +01:00
< div class = " col-md-4 text-center " >
2020-09-23 17:53:19 +02:00
< button type = " button " class = " btn btn-sm btn-info btn-block '.( $disabled ? 'disabled' : '').' " '.($disabled ? ' disabled ' : ' ').' onclick = " $ ( \ '#prezzi \ ').toggleClass( \ 'hide \ '); $ ( \ '#prezzi \ ').load( \ ''.base_path(). " / ajax_complete . php ? module = Articoli & op = getprezzi & idarticolo = ' + ( $(' #idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
2021-05-24 15:43:49 +02:00
< i class = " fa fa-handshake-o " ></ i > '.($options[' dir '] == ' entrata ' ? tr(' Ultimi prezzi al cliente ') : tr(' Ultimi prezzi dal fornitore ')).'
2020-02-14 17:02:16 +01:00
</ button >
2020-04-15 16:25:44 +02:00
< div id = " prezzi " class = " hide " ></ div >
2018-02-19 10:52:42 +01:00
</ div >
2020-02-14 17:02:16 +01:00
< div class = " col-md-4 text-center " >
2020-09-23 17:53:19 +02:00
< button type = " button " class = " btn btn-sm btn-info btn-block '.( $disabled ? 'disabled' : '').' " '.($disabled ? ' disabled ' : ' ').' onclick = " $ ( \ '#prezzivendita \ ').toggleClass( \ 'hide \ '); $ ( \ '#prezzivendita \ ').load( \ ''.base_path(). " / ajax_complete . php ? module = Articoli & op = getprezzivendita & idarticolo = ' + ( $(' #idarticolo option:selected').val() || $('#idarticolo').val()) + '&idanagrafica=".$options['idanagrafica'].'\');">
2021-05-24 15:43:49 +02:00
< i class = " fa fa-money " ></ i > '.tr(' Ultimi prezzi di vendita ').'
2020-02-14 17:02:16 +01:00
</ button >
< div id = " prezzivendita " class = " hide " ></ div >
</ div >
</ div >
2021-04-01 17:40:38 +02:00
< br >
2020-02-14 17:02:16 +01:00
< script >
2020-08-27 09:15:30 +02:00
var direzione = " '. $options['dir'] .' " ;
2020-10-30 14:19:02 +01:00
globals . aggiunta_articolo = {
};
2020-02-14 17:02:16 +01:00
$ ( document ) . ready ( function () {
2020-08-27 09:15:30 +02:00
if ( direzione === " uscita " ) {
2020-10-30 14:19:02 +01:00
aggiornaQtaMinima ();
$ ( " #qta " ) . keyup ( aggiornaQtaMinima );
2020-08-27 09:15:30 +02:00
}
});
2020-10-30 11:18:15 +01:00
$ ( " #tipo_sconto " ) . on ( " change " , function () {
2020-10-30 15:12:46 +01:00
verificaScontoArticolo ();
2020-10-30 11:18:15 +01:00
});
2020-08-27 09:15:30 +02:00
$ ( " #idarticolo " ) . on ( " change " , function () {
// Operazioni sui prezzi in fondo alla pagina
let prezzi_precedenti = $ ( " #prezzi_articolo button " );
if ( prezzi_precedenti . length ) {
prezzi_precedenti . attr ( " disabled " , ! $ ( this ) . val ());
2020-02-14 17:02:16 +01:00
if ( $ ( this ) . val ()) {
2020-08-27 09:15:30 +02:00
prezzi_precedenti . removeClass ( " disabled " );
} else {
prezzi_precedenti . addClass ( " disabled " );
}
2020-02-14 17:02:16 +01:00
2020-08-27 09:15:30 +02:00
$ ( " #prezzi " ) . html ( " " );
$ ( " #prezzivendita " ) . html ( " " );
$ ( " #prezziacquisto " ) . html ( " " );
}
2020-02-14 17:02:16 +01:00
2020-08-27 09:15:30 +02:00
if ( ! $ ( this ) . val ()) {
return ;
}
2020-02-27 16:19:07 +01:00
2020-08-27 09:15:30 +02:00
// Autoimpostazione dei campi relativi all\'articolo
let $data = $ ( this ) . selectData ();
2020-10-30 14:19:02 +01:00
ottieniDettagliArticolo ( $data . id ) . then ( function () {
2020-08-27 09:15:30 +02:00
if ( $ ( " #prezzo_unitario " ) . val () . toEnglish () === 0 ){
2020-10-30 14:19:02 +01:00
aggiornaPrezzoArticolo ();
2020-08-27 09:15:30 +02:00
} else {
verificaPrezzoArticolo ();
}
2020-07-06 13:32:43 +02:00
2020-10-30 11:18:15 +01:00
if ( $ ( " #sconto " ) . val () . toEnglish () === 0 ){
aggiornaScontoArticolo ();
} else {
verificaScontoArticolo ();
}
});
2020-08-27 09:15:30 +02:00
$ ( " #costo_unitario " ) . val ( $data . prezzo_acquisto );
$ ( " #descrizione_riga " ) . val ( $data . descrizione );
2020-07-06 13:32:43 +02:00
2020-08-27 09:15:30 +02:00
if ( direzione === " entrata " ) {
if ( $data . idiva_vendita ) {
$ ( " #idiva " ) . selectSetNew ( $data . idiva_vendita , $data . iva_vendita );
}
}
2018-02-19 10:52:42 +01:00
2020-08-27 09:15:30 +02:00
else {
$ ( " #id_dettaglio_fornitore " ) . val ( $data . id_dettaglio_fornitore );
$ ( " #qta_minima " ) . val ( $data . qta_minima );
2020-10-30 14:19:02 +01:00
aggiornaQtaMinima ();
2020-08-27 09:15:30 +02:00
}
2020-02-14 17:02:16 +01:00
2020-08-27 09:15:30 +02:00
let id_conto = $data . idconto_ '.($options[' dir '] == ' entrata ' ? ' vendita ' : ' acquisto ').' ;
let id_conto_title = $data . idconto_ '.($options[' dir '] == ' entrata ' ? ' vendita ' : ' acquisto ').' _title ;
if ( id_conto ) {
$ ( " #idconto " ) . selectSetNew ( id_conto , id_conto_title );
}
2020-02-14 17:02:16 +01:00
2020-08-27 09:15:30 +02:00
$ ( " #um " ) . selectSetNew ( $data . um , $data . um );
// Aggiornamento automatico di guadagno e margine
2021-05-03 11:43:25 +02:00
2020-08-27 09:15:30 +02:00
});
2021-06-16 18:54:09 +02:00
$ ( " #idsede " ) . on ( " change " , function () {
updateSelectOption ( " idsede_partenza " , $ ( this ) . val ());
session_set ( " superselect,idsede_partenza " , $ ( this ) . val (), 0 );
$ ( " #idarticolo " ) . selectReset ();
});
2020-10-30 11:18:15 +01:00
$ ( document ) . on ( " change " , " input[name^=qta], input[name^=prezzo_unitario], input[name^=sconto] " , function () {
2020-08-27 09:15:30 +02:00
verificaPrezzoArticolo ();
2020-10-30 11:18:15 +01:00
verificaScontoArticolo ();
2020-08-27 09:15:30 +02:00
});
/**
2020-10-30 14:19:02 +01:00
* Restituisce il dettaglio registrato per una specifica quantità dell\ ' articolo .
2020-08-27 09:15:30 +02:00
*/
2020-10-30 14:19:02 +01:00
function getDettaglioPerQuantita ( qta ) {
const data = globals . aggiunta_articolo . 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 09:15:30 +02:00
continue ;
2020-02-14 17:02:16 +01:00
}
2020-10-30 14:19:02 +01:00
if ( qta >= dettaglio . minimo && qta <= dettaglio . massimo ) {
dettaglio_selezionato = dettaglio ;
2020-08-27 09:15:30 +02:00
}
}
2020-10-30 14:19:02 +01:00
if ( dettaglio_selezionato == null ) {
dettaglio_selezionato = dettaglio_predefinito ;
2020-08-27 09:15:30 +02:00
}
2020-10-30 14:19:02 +01:00
return dettaglio_selezionato ;
2018-02-19 11:50:42 +01:00
}
2020-02-14 17:02:16 +01:00
2020-10-30 11:18:15 +01:00
/**
2020-10-30 14:19:02 +01:00
* Restituisce il prezzo registrato per una specifica quantità dell\ ' articolo .
2020-10-30 11:18:15 +01:00
*/
2020-10-30 14:19:02 +01:00
function getPrezzoPerQuantita ( qta ) {
const dettaglio = getDettaglioPerQuantita ( qta );
2020-10-30 11:18:15 +01:00
2020-10-30 14:19:02 +01:00
return dettaglio ? parseFloat ( dettaglio . prezzo_unitario ) : 0 ;
2020-10-30 11:18:15 +01:00
}
2020-08-27 09:15:30 +02:00
/**
2020-10-30 14:19:02 +01:00
* Restituisce lo sconto registrato per una specifica quantità dell\ ' articolo .
2020-08-27 09:15:30 +02:00
*/
2020-10-30 14:19:02 +01:00
function getScontoPerQuantita ( qta ) {
const dettaglio = getDettaglioPerQuantita ( qta );
2020-07-06 13:32:43 +02:00
2020-10-30 14:19:02 +01:00
return dettaglio ? parseFloat ( dettaglio . sconto_percentuale ) : 0 ;
2020-08-27 09:15:30 +02:00
}
2020-07-06 13:32:43 +02:00
2020-10-30 11:18:15 +01:00
/**
2020-10-30 14:19:02 +01:00
* Funzione per registrare localmente i dettagli definiti per l\ ' articolo in relazione ad una specifica anagrafica .
2020-10-30 11:18:15 +01:00
*/
2020-10-30 14:19:02 +01:00
function ottieniDettagliArticolo ( id_articolo ) {
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-10-30 11:18:15 +01:00
const data = JSON . parse ( response );
2020-10-30 14:19:02 +01:00
globals . aggiunta_articolo . dettagli = data ;
2020-10-30 11:18:15 +01:00
});
}
2020-08-27 09:15:30 +02:00
/**
* Funzione per verificare se il prezzo unitario corrisponde a quello registrato per l\ ' articolo , e proporre in automatico una correzione .
*/
function verificaPrezzoArticolo () {
let qta = $ ( " #qta " ) . val () . toEnglish ();
let prezzo_previsto = getPrezzoPerQuantita ( qta );
let prezzo_unitario_input = $ ( " #prezzo_unitario " );
let prezzo_unitario = prezzo_unitario_input . val () . toEnglish ();
let div = prezzo_unitario_input . closest ( " div " ) . parent () . find ( " div[id*=errors] " );
2021-10-26 10:18:32 +02:00
if ( prezzo_previsto === prezzo_unitario || prezzo_previsto === 0 ) {
2020-08-27 09:15:30 +02:00
div . css ( " padding-top " , " 0 " );
div . html ( " " );
return ;
}
div . css ( " padding-top " , " 5px " );
2021-10-26 10:18:32 +02:00
div . html ( `<small class="label label-info" >'.tr('Prezzo suggerito').': ` + prezzo_previsto . toLocale () + " " + globals . currency + `<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>` );
2020-10-30 11:18:15 +01:00
}
/**
* Funzione per verificare se lo sconto unitario corrisponde a quello registrato per l\ ' articolo , e proporre in automatico una correzione .
*/
function verificaScontoArticolo () {
let qta = $ ( " #qta " ) . val () . toEnglish ();
let sconto_previsto = getScontoPerQuantita ( qta );
2020-10-30 14:19:02 +01:00
2020-10-30 11:18:15 +01:00
let sconto_input = $ ( " #sconto " );
let sconto = sconto_input . val () . toEnglish ();
let div = sconto_input . parent () . next ();
2020-10-30 15:15:18 +01:00
if ( sconto_previsto === 0 || sconto_previsto === sconto || $ ( " #tipo_sconto " ) . val () === " UNT " ) {
2020-10-30 11:18:15 +01:00
div . css ( " padding-top " , " 0 " );
div . html ( " " );
return ;
}
div . css ( " padding-top " , " 5px " );
2021-10-26 10:18:32 +02:00
div . html ( `<small class="label label-info" >'.tr('Sconto suggerito').': ` + sconto_previsto . toLocale () + `%<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaScontoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>` );
2020-07-06 13:32:43 +02:00
}
2020-08-27 09:15:30 +02:00
/**
* Funzione per aggiornare il prezzo unitario sulla base dei valori automatici .
*/
function aggiornaPrezzoArticolo () {
let qta = $ ( " #qta " ) . val () . toEnglish ();
let prezzo_previsto = getPrezzoPerQuantita ( qta );
2020-07-06 13:32:43 +02:00
2020-08-27 10:08:26 +02:00
$ ( " #prezzo_unitario " ) . val ( prezzo_previsto ) . trigger ( " change " );
2021-01-11 19:08:34 +01:00
// Aggiornamento automatico di guadagno e margine
2021-05-03 11:43:25 +02:00
if ( direzione === " entrata " ) {
2021-01-11 19:08:34 +01:00
aggiorna_guadagno ();
}
2020-08-27 09:15:30 +02:00
}
2020-10-30 11:18:15 +01:00
/**
* Funzione per aggiornare lo sconto unitario sulla base dei valori automatici .
*/
function aggiornaScontoArticolo () {
let qta = $ ( " #qta " ) . val () . toEnglish ();
let sconto_previsto = getScontoPerQuantita ( qta );
$ ( " #sconto " ) . val ( sconto_previsto ) . trigger ( " change " );
2021-01-11 19:08:34 +01:00
// Aggiornamento automatico di guadagno e margine
2021-05-03 11:43:25 +02:00
if ( direzione === " entrata " ) {
2021-01-11 19:08:34 +01:00
aggiorna_guadagno ();
}
2020-10-30 11:18:15 +01:00
}
2020-08-27 09:15:30 +02:00
/**
* Funzione per l\ ' aggiornamento dinamico della quantità minima per l\ ' articolo .
*/
2020-10-30 14:19:02 +01:00
function aggiornaQtaMinima () {
2020-08-27 09:15:30 +02:00
let qta_minima = parseFloat ( $ ( " #qta_minima " ) . val ());
let qta = $ ( " #qta " ) . val () . toEnglish ();
2020-07-06 13:32:43 +02:00
2020-08-27 09:15:30 +02:00
if ( qta_minima === 0 ) {
2020-07-06 13:32:43 +02:00
return ;
}
2020-08-27 09:15:30 +02:00
let parent = $ ( " #qta " ) . closest ( " div " ) . parent ();
let div = parent . find ( " div[id*=errors] " );
2020-07-06 13:32:43 +02:00
div . html ( " <small>'.tr('Quantità minima').': " + qta_minima . toLocale () + " </small> " );
if ( qta < qta_minima ) {
parent . addClass ( " has-error " );
div . addClass ( " text-danger " ) . removeClass ( " text-success " );
} else {
parent . removeClass ( " has-error " );
div . removeClass ( " text-danger " ) . addClass ( " text-success " );
}
}
2021-10-26 11:28:38 +02:00
2020-02-14 17:02:16 +01:00
</ script > ' ;