2018-02-04 16:00:47 +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-04 16:00:47 +01:00
include_once __DIR__ . '/../../../core.php' ;
2019-06-04 20:45:40 +02:00
switch ( $resource ) {
2020-08-14 09:38:17 +02:00
/*
* Opzioni utilizzate :
* - permetti_movimento_a_zero
* - idsede_partenza e idsede_destinazione
* - dir
* - idanagrafica
*/
2018-02-04 16:00:47 +01:00
case 'articoli' :
2020-07-06 13:32:43 +02:00
$sedi_non_impostate = ! isset ( $superselect [ 'idsede_partenza' ]) && ! isset ( $superselect [ 'idsede_destinazione' ]);
2020-07-06 13:57:45 +02:00
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
2020-07-22 13:15:15 +02:00
$usare_dettaglio_fornitore = $superselect [ 'dir' ] == 'uscita' ;
2020-10-20 11:33:34 +02:00
$usare_iva_anagrafica = $superselect [ 'dir' ] == 'entrata' && ! empty ( $superselect [ 'idanagrafica' ]);
2021-12-01 10:44:02 +01:00
$solo_non_varianti = $superselect [ 'solo_non_varianti' ];
2020-07-06 13:32:43 +02:00
2020-10-20 11:33:34 +02:00
$query = " SELECT
IF ( `categoria` . `nome` IS NOT NULL , CONCAT ( `categoria` . `nome` , IF ( `sottocategoria` . `nome` IS NOT NULL , CONCAT ( ' (' , `sottocategoria` . `nome` , ')' ), '-' )), '<i>".tr(' Nessuna categoria ')."</i>' ) AS optgroup ,
2020-07-06 13:32:43 +02:00
mg_articoli . id ,
mg_articoli . barcode ,
2020-10-20 11:33:34 +02:00
mg_articoli . " .( $prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
2020-07-22 13:15:15 +02:00
mg_articoli . prezzo_vendita_ivato AS prezzo_vendita_ivato , ' ;
// Informazioni relative al fornitore specificato dal documenti di acquisto
if ( $usare_dettaglio_fornitore ) {
$query .= '
2020-07-06 13:32:43 +02:00
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 . prezzo_acquisto , mg_articoli . prezzo_acquisto ) AS prezzo_acquisto ,
IFNULL ( mg_fornitore_articolo . qta_minima , 0 ) AS qta_minima ,
2020-07-22 13:15:15 +02:00
mg_fornitore_articolo . id AS id_dettaglio_fornitore , ' ;
}
// Informazioni dell'articolo per i documenti di vendita
else {
$query .= '
mg_articoli . codice AS codice ,
mg_articoli . descrizione AS descrizione ,
mg_articoli . prezzo_acquisto AS prezzo_acquisto ,
0 AS qta_minima ,
NULL AS id_dettaglio_fornitore , ' ;
}
2020-11-06 10:46:42 +01:00
if ( $usare_iva_anagrafica ) {
2020-10-20 11:33:34 +02:00
$query .= '
2021-09-30 17:34:48 +02:00
IFNULL ( iva_anagrafica . id , IFNULL ( iva_articolo . id , iva_predefinita . id )) AS idiva_vendita ,
IFNULL ( iva_anagrafica . descrizione , IFNULL ( iva_articolo . descrizione , iva_predefinita . descrizione )) AS iva_vendita , ' ;
2020-11-06 10:46:42 +01:00
} else {
2020-10-20 11:33:34 +02:00
$query .= '
2021-09-30 17:34:48 +02:00
IFNULL ( iva_articolo . id , iva_predefinita . id ) AS idiva_vendita ,
IFNULL ( iva_articolo . descrizione , iva_predefinita . descrizione ) AS iva_vendita , ' ;
2020-10-20 11:33:34 +02:00
}
2020-07-22 13:15:15 +02:00
$query .= '
2020-10-20 11:33:34 +02:00
round ( mg_articoli . qta , '.setting(' Cifre decimali per quantità ' ) . " ) AS qta,
2020-07-06 13:32:43 +02:00
mg_articoli . um ,
mg_articoli . servizio ,
2020-10-20 11:33:34 +02:00
2020-07-06 13:32:43 +02:00
mg_articoli . idconto_vendita ,
mg_articoli . idconto_acquisto ,
categoria . `nome` AS categoria ,
sottocategoria . `nome` AS sottocategoria ,
2021-10-29 10:37:01 +02:00
righe . media_ponderata ,
2020-10-20 11:33:34 +02:00
CONCAT ( conto_vendita_categoria . numero , '.' , conto_vendita_sottocategoria . numero , ' ' , conto_vendita_sottocategoria . descrizione ) AS idconto_vendita_title ,
CONCAT ( conto_acquisto_categoria . numero , '.' , conto_acquisto_sottocategoria . numero , ' ' , conto_acquisto_sottocategoria . descrizione ) AS idconto_acquisto_title
2020-07-06 13:32:43 +02:00
FROM mg_articoli
LEFT JOIN `mg_categorie` AS categoria ON `categoria` . `id` = `mg_articoli` . `id_categoria`
LEFT JOIN `mg_categorie` AS sottocategoria ON `sottocategoria` . `id` = `mg_articoli` . `id_sottocategoria`
LEFT JOIN co_pianodeiconti3 AS conto_vendita_sottocategoria ON conto_vendita_sottocategoria . id = mg_articoli . idconto_vendita
LEFT JOIN co_pianodeiconti2 AS conto_vendita_categoria ON conto_vendita_sottocategoria . idpianodeiconti2 = conto_vendita_categoria . id
LEFT JOIN co_pianodeiconti3 AS conto_acquisto_sottocategoria ON conto_acquisto_sottocategoria . id = mg_articoli . idconto_acquisto
LEFT JOIN co_pianodeiconti2 AS conto_acquisto_categoria ON conto_acquisto_sottocategoria . idpianodeiconti2 = conto_acquisto_categoria . id
2021-10-29 10:37:01 +02:00
LEFT JOIN ( SELECT co_righe_documenti . idarticolo AS id , ( SUM (( co_righe_documenti . prezzo_unitario - co_righe_documenti . sconto_unitario ) * co_righe_documenti . qta ) / SUM ( co_righe_documenti . qta )) AS media_ponderata FROM co_righe_documenti
2021-10-25 14:26:35 +02:00
LEFT JOIN co_documenti ON co_documenti . id = co_righe_documenti . iddocumento
2021-10-29 10:37:01 +02:00
LEFT JOIN co_tipidocumento ON co_tipidocumento . id = co_documenti . idtipodocumento WHERE co_tipidocumento . dir = 'uscita' GROUP BY co_righe_documenti . idarticolo ) AS righe
ON righe . id = mg_articoli . id
2020-10-20 11:33:34 +02:00
LEFT JOIN co_iva AS iva_articolo ON iva_articolo . id = mg_articoli . idiva_vendita
LEFT JOIN co_iva AS iva_predefinita ON iva_predefinita . id = ( SELECT valore FROM zz_settings WHERE nome = 'Iva predefinita' ) " ;
if ( $usare_iva_anagrafica ) {
2020-11-06 10:46:42 +01:00
$query .= '
LEFT JOIN co_iva AS iva_anagrafica ON iva_anagrafica . id = ( SELECT idiva_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($superselect[' idanagrafica ']).' ) ' ;
}
2020-10-20 11:33:34 +02:00
$query .= '
2020-07-06 13:32:43 +02:00
LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo . id_articolo = mg_articoli . id AND mg_fornitore_articolo . deleted_at IS NULL AND mg_fornitore_articolo . id_fornitore = '.prepare($superselect[' idanagrafica ' ]);
// Se c'è una sede settata, carico tutti gli articoli presenti in quella sede
if ( ! $sedi_non_impostate ) {
$query .= '
2021-02-05 13:27:18 +01:00
LEFT JOIN ( SELECT idarticolo , idsede FROM mg_movimenti GROUP BY idarticolo ) movimenti ON movimenti . idarticolo = mg_articoli . id
LEFT JOIN an_sedi ON an_sedi . id = movimenti . idsede ' ;
2019-05-29 19:17:57 +02:00
}
2019-06-04 20:45:40 +02:00
2020-07-06 13:32:43 +02:00
$query .= '
| where | ' ;
2019-05-29 19:17:57 +02:00
// Se c'è una sede settata, carico tutti gli articoli presenti in quella sede
2020-07-06 13:32:43 +02:00
if ( ! $sedi_non_impostate ) {
$query .= '
GROUP BY
mg_articoli . id ' ;
2019-05-29 19:17:57 +02:00
}
2018-02-04 16:00:47 +01:00
2020-07-06 13:32:43 +02:00
$query .= '
ORDER BY
mg_articoli . id_categoria ASC ,
mg_articoli . id_sottocategoria ASC ,
mg_articoli . codice ASC ,
mg_articoli . descrizione ASC ' ;
2018-02-04 16:00:47 +01:00
foreach ( $elements as $element ) {
$filter [] = 'mg_articoli.id=' . prepare ( $element );
}
2019-08-26 11:10:59 +02:00
$where [] = 'mg_articoli.attivo = 1' ;
$where [] = 'mg_articoli.deleted_at IS NULL' ;
2019-07-08 12:25:51 +02:00
2021-12-01 10:44:02 +01:00
if ( $solo_non_varianti ) {
$where [] = 'mg_articoli.id_combinazione IS NULL' ;
}
2018-02-04 16:00:47 +01:00
if ( ! empty ( $search )) {
$search_fields [] = 'mg_articoli.descrizione LIKE ' . prepare ( '%' . $search . '%' );
$search_fields [] = 'mg_articoli.codice LIKE ' . prepare ( '%' . $search . '%' );
2019-12-12 19:08:23 +01:00
$search_fields [] = 'mg_articoli.barcode LIKE ' . prepare ( '%' . $search . '%' );
2020-07-22 13:15:15 +02:00
if ( $usare_dettaglio_fornitore ) {
$search_fields [] = 'mg_fornitore_articolo.descrizione LIKE ' . prepare ( '%' . $search . '%' );
$search_fields [] = 'mg_fornitore_articolo.codice_fornitore LIKE ' . prepare ( '%' . $search . '%' );
}
2018-02-04 16:00:47 +01:00
}
2019-02-22 10:37:37 +01:00
$data = AJAX :: selectResults ( $query , $where , $filter , $search_fields , $limit , $custom );
$rs = $data [ 'results' ];
2018-02-04 16:00:47 +01:00
2020-12-04 16:00:21 +01:00
// Utilizzo dell'impostazione per disabilitare articoli con quantità <= 0
$permetti_movimenti_sotto_zero = setting ( 'Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita' ) ? true : $superselect [ 'permetti_movimento_a_zero' ];
2019-02-22 10:37:37 +01:00
// IVA da impostazioni
2020-10-20 11:33:34 +02:00
foreach ( $rs as $k => $r ) {
2019-07-08 10:27:56 +02:00
// Lettura movimenti delle mie sedi
2021-02-05 13:27:18 +01:00
$qta_sede = $dbo -> fetchOne ( 'SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede WHERE mg_movimenti.idarticolo = ' . prepare ( $r [ 'id' ]) . ' AND idsede = ' . prepare ( $superselect [ 'idsede_partenza' ]))[ 'qta' ];
2019-07-08 10:27:56 +02:00
2020-10-20 11:33:34 +02:00
$rs [ $k ] = array_merge ( $r , [
2021-02-05 13:27:18 +01:00
'text' => $r [ 'codice' ] . ' - ' . $r [ 'descrizione' ] . ' ' . ( ! $r [ 'servizio' ] ? '(' . Translator :: numberToLocale ( $qta_sede ) . ( ! empty ( $r [ 'um' ]) ? ' ' . $r [ 'um' ] : '' ) . ')' : '' ),
'disabled' => $qta_sede <= 0 && ! $permetti_movimenti_sotto_zero && ! $r [ 'servizio' ],
2020-10-20 11:33:34 +02:00
]);
2018-02-04 16:00:47 +01:00
}
2019-02-22 10:37:37 +01:00
$results = [
2020-10-20 11:33:34 +02:00
'results' => $rs ,
2019-02-22 10:37:37 +01:00
'recordsFiltered' => $data [ 'recordsFiltered' ],
];
2018-02-04 16:00:47 +01:00
break ;
case 'categorie' :
2020-01-09 18:19:28 +01:00
$query = 'SELECT id, nome AS descrizione FROM mg_categorie |where| ORDER BY nome' ;
2018-02-04 16:00:47 +01:00
foreach ( $elements as $element ) {
$filter [] = 'id=' . prepare ( $element );
}
$where [] = '`parent` IS NULL' ;
if ( ! empty ( $search )) {
$search_fields [] = 'nome LIKE ' . prepare ( '%' . $search . '%' );
}
break ;
2020-08-14 09:38:17 +02:00
/*
* Opzioni utilizzate :
* - id_categoria
*/
2018-02-04 16:00:47 +01:00
case 'sottocategorie' :
if ( isset ( $superselect [ 'id_categoria' ])) {
2020-01-09 18:19:28 +01:00
$query = 'SELECT id, nome AS descrizione FROM mg_categorie |where| ORDER BY nome' ;
2018-02-04 16:00:47 +01:00
foreach ( $elements as $element ) {
$filter [] = 'id=' . prepare ( $element );
}
$where [] = '`parent`=' . prepare ( $superselect [ 'id_categoria' ]);
if ( ! empty ( $search )) {
$search_fields [] = 'nome LIKE ' . prepare ( '%' . $search . '%' );
}
}
break ;
case 'misure' :
$query = 'SELECT valore AS id, valore AS descrizione FROM mg_unitamisura |where| ORDER BY valore' ;
foreach ( $elements as $element ) {
2018-03-24 14:24:17 +01:00
$filter [] = 'valore=' . prepare ( $element );
2018-02-04 16:00:47 +01:00
}
if ( ! empty ( $search )) {
$search_fields [] = 'valore LIKE ' . prepare ( '%' . $search . '%' );
}
2020-07-20 14:40:11 +02:00
break ;
2020-08-14 09:38:17 +02:00
/*
* Opzioni utilizzate :
* - idanagrafica
*/
2020-07-20 14:40:11 +02:00
case 'articoli_barcode' :
2020-08-17 10:57:51 +02:00
$id_anagrafica = filter ( 'id_anagrafica' ); // ID passato via URL in modo fisso
2020-07-20 14:40:11 +02:00
$prezzi_ivati = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' );
$query = ' SELECT mg_articoli .* ,
2020-08-26 18:03:59 +02:00
mg_articoli . id ,
mg_articoli . qta ,
mg_articoli . um ,
mg_articoli . id ,
mg_articoli . id ,
2020-07-20 14:40:11 +02:00
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 . prezzo_acquisto , mg_articoli . prezzo_acquisto ) AS prezzo_acquisto ,
mg_articoli . '.($prezzi_ivati ? ' prezzo_vendita_ivato ' : ' prezzo_vendita ').' AS prezzo_vendita ,
mg_articoli . prezzo_vendita_ivato AS prezzo_vendita_ivato ,
IFNULL ( mg_fornitore_articolo . qta_minima , 0 ) AS qta_minima ,
mg_fornitore_articolo . id AS id_dettaglio_fornitore
FROM mg_articoli
2020-08-17 10:57:51 +02:00
LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo . id_articolo = mg_articoli . id AND mg_fornitore_articolo . deleted_at IS NULL AND mg_fornitore_articolo . id_fornitore = '.prepare($id_anagrafica).'
2020-07-20 14:40:11 +02:00
| where | ' ;
$where [] = 'mg_articoli.attivo = 1' ;
$where [] = 'mg_articoli.deleted_at IS NULL' ;
2020-11-11 15:01:48 +01:00
if ( ! empty ( $search )) {
$search_fields [] = 'mg_articoli.codice LIKE ' . prepare ( '%' . $search . '%' );
$search_fields [] = 'mg_articoli.barcode LIKE ' . prepare ( '%' . $search . '%' );
}
2018-02-04 16:00:47 +01:00
break ;
2020-12-04 15:40:47 +01:00
2020-12-04 14:30:29 +01:00
case 'fornitori-articolo' :
$query = 'SELECT an_anagrafiche.idanagrafica AS id, an_anagrafiche.ragione_sociale AS descrizione, (mg_prezzi_articoli.prezzo_unitario-(mg_prezzi_articoli.prezzo_unitario*mg_prezzi_articoli.sconto_percentuale)/100) AS prezzo_unitario FROM mg_prezzi_articoli LEFT JOIN an_anagrafiche ON mg_prezzi_articoli.id_anagrafica=an_anagrafiche.idanagrafica |where| ORDER BY an_anagrafiche.ragione_sociale' ;
foreach ( $elements as $element ) {
$filter [] = 'an_anagrafiche.idanagrafica=' . prepare ( $element );
}
2020-12-04 15:40:47 +01:00
2020-12-04 14:30:29 +01:00
$where [] = 'dir="uscita"' ;
$where [] = 'minimo IS NULL' ;
$where [] = 'massimo IS NULL' ;
$where [] = 'id_articolo=' . prepare ( $superselect [ 'id_articolo' ]);
if ( ! empty ( $search )) {
$search_fields [] = 'an_anagrafiche.ragione_sociale LIKE ' . prepare ( '%' . $search . '%' );
}
break ;
2018-02-04 16:00:47 +01:00
}