Skip to content

Commit 823125c

Browse files
committed
refactor: ottimizzazione query con laravel
1 parent cc85ade commit 823125c

4 files changed

Lines changed: 134 additions & 93 deletions

File tree

modules/emails/ajax/complete.php

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -28,48 +28,66 @@
2828
$indirizzi_proposti = filter('indirizzi_proposti');
2929
$where = '';
3030

31-
if ($indirizzi_proposti == 1) {
32-
$where .= 'AND an_tipianagrafiche_lang.title = "Cliente"';
33-
} elseif ($indirizzi_proposti == 2) {
34-
$where .= 'AND an_tipianagrafiche_lang.title = "Fornitore"';
35-
} else {
36-
$indirizzi_proposti = null;
31+
// Definizione filtri per tipo anagrafica
32+
$tipo_anagrafica = match ($indirizzi_proposti) {
33+
1 => '"Cliente"',
34+
2 => '"Fornitore"',
35+
default => null
36+
};
37+
38+
if ($tipo_anagrafica !== null) {
39+
$where .= 'AND an_tipianagrafiche.name = '.$tipo_anagrafica;
3740
}
3841

3942
$results = [];
4043

41-
// Tutte le anagrafiche
42-
$q = "SELECT DISTINCT(an_anagrafiche.email), an_anagrafiche.idanagrafica, an_anagrafiche.ragione_sociale FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.id=an_tipianagrafiche_anagrafiche.idtipoanagrafica INNER JOIN an_tipianagrafiche_lang ON (an_tipianagrafiche_lang.id_lang=1 AND an_tipianagrafiche_lang.id_record=an_tipianagrafiche.id) WHERE email != '' ".$where.' ORDER BY ragione_sociale';
43-
$rs = $dbo->fetchArray($q);
44-
45-
foreach ($rs as $r) {
46-
if (!empty($r['email'])) {
44+
// Funzione helper per aggiungere risultati all'array
45+
$addResults = function($records) use (&$results) {
46+
foreach ($records as $record) {
4747
$results[] = [
48-
'value' => $r['email'],
49-
'label' => $r['ragione_sociale'].' <'.$r['email'].'>',
48+
'value' => $record['email'],
49+
'label' => $record['ragione_sociale'].' <'.$record['email'].'>',
5050
];
5151
}
52-
}
52+
};
5353

54-
$q = "SELECT DISTINCT(an_sedi.email), an_sedi.idanagrafica, nomesede AS ragione_sociale FROM an_sedi INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica=an_sedi.idanagrafica INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.id=an_tipianagrafiche_anagrafiche.idtipoanagrafica INNER JOIN an_tipianagrafiche_lang ON (an_tipianagrafiche_lang.id_lang=1 AND an_tipianagrafiche_lang.id_record=an_tipianagrafiche.id) WHERE an_sedi.email != '' ".$where.' ORDER BY ragione_sociale';
54+
// Tutte le anagrafiche (query specifica senza join su se stessa)
55+
$q = "
56+
SELECT DISTINCT(an_anagrafiche.email) AS email,
57+
an_anagrafiche.idanagrafica,
58+
an_anagrafiche.ragione_sociale
59+
FROM an_anagrafiche
60+
INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica = an_anagrafiche.idanagrafica
61+
INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.id = an_tipianagrafiche_anagrafiche.idtipoanagrafica
62+
INNER JOIN an_tipianagrafiche_lang ON (an_tipianagrafiche_lang.id_lang = 1 AND an_tipianagrafiche_lang.id_record = an_tipianagrafiche.id)
63+
WHERE an_anagrafiche.email != '' $where
64+
ORDER BY ragione_sociale
65+
";
66+
$addResults($dbo->fetchArray($q));
5567

56-
$sedi = $dbo->fetchArray($q);
57-
foreach ($sedi as $sede) {
58-
$results[] = [
59-
'value' => $sede['email'],
60-
'label' => $sede['ragione_sociale'].' <'.$sede['email'].'>',
61-
];
62-
}
68+
// Funzione helper per sedi e referenti (tabelle che richiedono join con an_anagrafiche)
69+
$fetchEmails = function($table, $email_column, $name_column) use ($dbo, $where) {
70+
$query = "
71+
SELECT DISTINCT($table.$email_column) AS email,
72+
$table.idanagrafica,
73+
$name_column AS ragione_sociale
74+
FROM $table
75+
INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = $table.idanagrafica
76+
INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica = an_anagrafiche.idanagrafica
77+
INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.id = an_tipianagrafiche_anagrafiche.idtipoanagrafica
78+
INNER JOIN an_tipianagrafiche_lang ON (an_tipianagrafiche_lang.id_lang = 1 AND an_tipianagrafiche_lang.id_record = an_tipianagrafiche.id)
79+
WHERE $table.$email_column != '' $where
80+
ORDER BY ragione_sociale
81+
";
82+
83+
return $dbo->fetchArray($query);
84+
};
6385

64-
$q = "SELECT DISTINCT(an_referenti.email), an_referenti.idanagrafica, an_referenti.nome AS ragione_sociale FROM an_referenti INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica=an_referenti.idanagrafica INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.id=an_tipianagrafiche_anagrafiche.idtipoanagrafica INNER JOIN an_tipianagrafiche_lang ON (an_tipianagrafiche_lang.id_lang=1 AND an_tipianagrafiche_lang.id_record=an_tipianagrafiche.id) WHERE an_referenti.email != '' ".$where.' ORDER BY ragione_sociale';
86+
// Tutte le sedi
87+
$addResults($fetchEmails('an_sedi', 'email', 'nomesede'));
6588

66-
$referenti = $dbo->fetchArray($q);
67-
foreach ($referenti as $referente) {
68-
$results[] = [
69-
'value' => $referente['email'],
70-
'label' => $referente['ragione_sociale'].' <'.$referente['email'].'>',
71-
];
72-
}
89+
// Tutti i referenti
90+
$addResults($fetchEmails('an_referenti', 'email', 'nome'));
7391

7492
echo json_encode($results);
7593

modules/fatture/actions.php

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747
// Controllo se la fattura è già stata inviata allo SDI
4848
if ($fattura) {
49-
$stato_fe = $dbo->fetchOne('SELECT codice_stato_fe FROM co_documenti WHERE id = '.$fattura->id);
49+
$stato_fe = ['codice_stato_fe' => $fattura->codice_stato_fe];
5050
}
5151

5252
$ops = ['update', 'add_intervento', 'manage_documento_fe', 'manage_riga_fe', 'manage_articolo', 'manage_sconto', 'manage_riga', 'manage_descrizione', 'unlink_intervento', 'delete_riga', 'copy_riga', 'add_serial', 'add_articolo', 'edit-price'];
@@ -104,17 +104,14 @@
104104
$tipo = Tipo::find(post('idtipodocumento'));
105105
$fattura->tipo()->associate($tipo);
106106

107-
$data_fattura_precedente = $dbo->fetchOne('
108-
SELECT
109-
MAX(`data`) AS datamax
110-
FROM
111-
`co_documenti`
112-
INNER JOIN `co_statidocumento` ON `co_statidocumento`.`id` = `co_documenti`.`idstatodocumento`
113-
LEFT JOIN `co_statidocumento_lang` ON (`co_statidocumento`.`id` = `co_statidocumento_lang`.`id_record` AND `co_statidocumento_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
114-
INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`
115-
INNER JOIN `zz_segments` ON `zz_segments`.`id` = `co_documenti`.`id_segment`
116-
WHERE
117-
`co_statidocumento_lang`.`title` = "Emessa" AND `co_tipidocumento`.`dir` = "entrata" AND `co_documenti`.`id_segment`='.$fattura->id_segment);
107+
$data_fattura_precedente = Fattura::whereHas('stato', function ($query) {
108+
$query->where('name', 'Emessa');
109+
})
110+
->whereHas('tipo', function ($query) {
111+
$query->where('dir', 'entrata');
112+
})
113+
->where('id_segment', $fattura->id_segment)
114+
->max('data');
118115

119116
if ((setting('Data emissione fattura automatica') == 1) && ($dir == 'entrata') && ($stato->id == Stato::where('name', 'Emessa')->first()->id) && Carbon::parse($data)->lessThan(Carbon::parse($data_fattura_precedente['datamax'])) && (!empty($data_fattura_precedente['datamax']))) {
120117
$fattura->data = $data_fattura_precedente['datamax'];
@@ -429,8 +426,8 @@
429426

430427
if (!empty($id_record) && $id_intervento !== null) {
431428
$copia_descrizione = post('copia_descrizione');
432-
$intervento = $dbo->fetchOne('SELECT descrizione FROM in_interventi WHERE id = '.prepare($id_intervento));
433-
if (!empty($copia_descrizione) && !empty($intervento['descrizione'])) {
429+
$intervento = Modules\Interventi\Intervento::find($id_intervento);
430+
if (!empty($copia_descrizione) && !empty($intervento->descrizione)) {
434431
$riga = Descrizione::build($fattura);
435432
$riga->descrizione = $intervento['descrizione'];
436433
$riga->idintervento = $id_intervento;
@@ -861,7 +858,10 @@
861858
$order = explode(',', post('order', true));
862859

863860
foreach ($order as $i => $id_riga) {
864-
$dbo->query('UPDATE `co_righe_documenti` SET `order` = '.prepare($i + 1).' WHERE id='.prepare($id_riga));
861+
Modules\Fatture\Components\Articolo::where('id', $id_riga)->update(['order' => $i + 1])
862+
?: Modules\Fatture\Components\Riga::where('id', $id_riga)->update(['order' => $i + 1])
863+
?: Modules\Fatture\Components\Descrizione::where('id', $id_riga)->update(['order' => $i + 1])
864+
?: Modules\Fatture\Components\Sconto::where('id', $id_riga)->update(['order' => $i + 1]);
865865
}
866866

867867
break;
@@ -873,7 +873,8 @@
873873

874874
// Metto l'intervento in stato "Fatturato"
875875
if (setting('Cambia automaticamente stato attività fatturate')) {
876-
$dbo->query("UPDATE `in_interventi` SET `idstatointervento`=(SELECT `id` FROM `in_statiintervento` WHERE `codice`='FAT') WHERE `id`=".prepare($id_documento));
876+
$stato_fatturato = Modules\Interventi\Stato::where('codice', 'FAT')->first()->id;
877+
Modules\Interventi\Intervento::where('id', $id_documento)->update(['idstatointervento' => $stato_fatturato]);
877878
}
878879

879880
// Individuazione del documento originale
@@ -1019,8 +1020,7 @@
10191020
$data = post('data');
10201021

10211022
$anagrafica = $fattura->anagrafica;
1022-
$id_tipo = database()->fetchOne('SELECT `co_tipidocumento`.`id` FROM `co_tipidocumento` WHERE `name` = "Nota di credito" AND `dir` = "entrata"')['id'];
1023-
$tipo = Tipo::find($id_tipo);
1023+
$tipo = Tipo::where('name', 'Nota di credito')->where('dir', 'entrata')->first();
10241024
$nota = Fattura::build($anagrafica, $tipo, $data, $id_segment);
10251025
$nota->ref_documento = $fattura->id;
10261026
$nota->idconto = $fattura->idconto;
@@ -1174,11 +1174,28 @@
11741174
case 'controlla_serial':
11751175
if (post('is_rientrabile')) {
11761176
// Controllo che i serial entrati e usciti siano uguali in modo da poterli registrare nuovamente.
1177-
$serial_uscita = $dbo->fetchOne('SELECT COUNT(id) AS `tot` FROM mg_prodotti WHERE serial='.prepare(post('serial')).' AND dir="uscita" AND id_articolo='.prepare(post('id_articolo')))['tot'];
1178-
$serial_entrata = $dbo->fetchOne('SELECT COUNT(id) AS `tot` FROM mg_prodotti WHERE serial='.prepare(post('serial')).' AND dir="entrata" AND id_articolo='.prepare(post('id_articolo')))['tot'];
1177+
$serial_uscita = $dbo->table('mg_prodotti')
1178+
->where('serial', post('serial'))
1179+
->where('dir', 'uscita')
1180+
->where('id_articolo', post('id_articolo'))
1181+
->count();
1182+
$serial_entrata = $dbo->table('mg_prodotti')
1183+
->where('serial', post('serial'))
1184+
->where('dir', 'entrata')
1185+
->where('id_articolo', post('id_articolo'))
1186+
->count();
11791187
$has_serial = $serial_entrata != $serial_uscita;
11801188
} else {
1181-
$has_serial = $dbo->fetchOne('SELECT id FROM mg_prodotti WHERE serial='.prepare(post('serial')).' AND dir="uscita" AND id_articolo='.prepare(post('id_articolo')).' AND (id_riga_documento IS NOT NULL OR id_riga_ordine IS NOT NULL OR id_riga_ddt IS NOT NULL)')['id'];
1189+
$has_serial = $dbo->table('mg_prodotti')
1190+
->where('serial', post('serial'))
1191+
->where('dir', 'uscita')
1192+
->where('id_articolo', post('id_articolo'))
1193+
->where(function ($query) {
1194+
$query->whereNotNull('id_riga_documento')
1195+
->orWhereNotNull('id_riga_ordine')
1196+
->orWhereNotNull('id_riga_ddt');
1197+
})
1198+
->value('id');
11821199
}
11831200

11841201
echo json_encode($has_serial);
@@ -1191,16 +1208,21 @@
11911208
$save_inline_barcode = true;
11921209

11931210
if (!empty($barcode)) {
1194-
$id_articolo = $dbo->selectOne('mg_articoli_barcode', 'idarticolo', ['barcode' => $barcode])['idarticolo'];
1211+
$id_articolo = $dbo->table('mg_articoli_barcode')->where('barcode', $barcode)->value('idarticolo');
11951212
if (empty($id_articolo)) {
1196-
$id_articolo = $dbo->selectOne('mg_articoli', 'id', ['deleted_at' => null, 'attivo' => 1, 'barcode' => '', 'codice' => $barcode])['id'];
1213+
$id_articolo = $dbo->table('mg_articoli')
1214+
->where('deleted_at', null)
1215+
->where('attivo', 1)
1216+
->where('barcode', '')
1217+
->where('codice', $barcode)
1218+
->value('id');
11971219
$save_inline_barcode = false;
11981220
}
11991221
}
12001222

12011223
if (!empty($id_articolo)) {
12021224
$permetti_movimenti_sotto_zero = setting('Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita');
1203-
$qta_articolo = $dbo->selectOne('mg_articoli', 'qta', ['id' => $id_articolo])['qta'];
1225+
$qta_articolo = $dbo->table('mg_articoli')->where('id', $id_articolo)->value('qta');
12041226

12051227
$originale = ArticoloOriginale::find($id_articolo);
12061228

@@ -1256,12 +1278,12 @@
12561278

12571279
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
12581280
$join = ($dir == 'entrata' ? 'id_piano_sconto_vendite' : 'id_piano_sconto_acquisti');
1259-
$piano_sconto = $dbo->fetchOne('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.'.$join.'=mg_piani_sconto.id WHERE idanagrafica='.prepare($id_anagrafica));
1281+
$piano_sconto = Modules\Anagrafiche\Anagrafica::find($id_anagrafica)->pianoSconto($dir);
12601282
if (!empty($piano_sconto)) {
1261-
$sconto = parseScontoCombinato($piano_sconto['prc_guadagno'].'+'.$sconto);
1283+
$sconto = parseScontoCombinato($piano_sconto->prc_guadagno.'+'.$sconto);
12621284
}
12631285

1264-
$provvigione = $dbo->selectOne('an_anagrafiche', 'provvigione_default', ['idanagrafica' => $fattura->idagente])['provvigione_default'];
1286+
$provvigione = Modules\Anagrafiche\Anagrafica::find($fattura->idagente)->provvigione_default;
12651287

12661288
$articolo->id_rivalsa_inps = setting('Cassa previdenziale predefinita') ?: null;
12671289
$articolo->id_ritenuta_acconto = setting('Ritenuta d\'acconto predefinita') ?: null;
@@ -1386,9 +1408,9 @@
13861408

13871409
// Aggiunta sconto combinato se è presente un piano di sconto nell'anagrafica
13881410
$join = ($dir == 'entrata' ? 'id_piano_sconto_vendite' : 'id_piano_sconto_acquisti');
1389-
$piano_sconto = $dbo->fetchOne('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_piani_sconto ON an_anagrafiche.'.$join.'=mg_piani_sconto.id WHERE idanagrafica='.prepare($id_anagrafica));
1411+
$piano_sconto = Modules\Anagrafiche\Anagrafica::find($id_anagrafica)->pianoSconto($dir);
13901412
if (!empty($piano_sconto)) {
1391-
$sconto = parseScontoCombinato($piano_sconto['prc_guadagno'].'+'.$sconto);
1413+
$sconto = parseScontoCombinato($piano_sconto->prc_guadagno.'+'.$sconto);
13921414
}
13931415

13941416
$riga->setSconto($sconto, 'PRC');
@@ -1517,9 +1539,11 @@
15171539

15181540
// Nota di debito
15191541
if (get('op') == 'nota_addebito') {
1520-
$rs_segment = $dbo->fetchArray('SELECT `zz_segments`.* FROM `zz_segments` LEFT JOIN `zz_segments_lang` ON (`zz_segments`.`id` = `zz_segments_lang`.`id_record` AND `zz_segments_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).") WHERE `predefined_addebito`='1'");
1542+
$rs_segment = Models\Segment::whereHas('translations', function ($query) {
1543+
$query->where('id_lang', Models\Locale::getDefault()->id);
1544+
})->where('predefined_addebito', '1')->first();
15211545
if (!empty($rs_segment)) {
1522-
$id_segment = $rs_segment[0]['id'];
1546+
$id_segment = $rs_segment->id;
15231547
} else {
15241548
$id_segment = $record['id_segment'];
15251549
}

modules/fatture/modutil.php

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,15 +192,13 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
192192
$fattura = Fattura::find($iddocumento);
193193
$is_nota = $fattura->isNota();
194194

195-
// Totale marca da bollo, inps, ritenuta, idagente
196-
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
197-
$rs = $dbo->fetchArray($query);
198-
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
199-
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
195+
// Ottimizzazione: usa il modello Eloquent invece di query SQL diretta
196+
$totale_bolli = $is_nota ? -$fattura->bollo : $fattura->bollo;
197+
$totale_ritenutaacconto = $is_nota ? -$fattura->ritenutaacconto : $fattura->ritenutaacconto;
200198
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
201-
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
202-
$data_documento = $rs[0]['data'];
203-
$split_payment = $rs[0]['split_payment'];
199+
$totale_rivalsainps = $is_nota ? -$fattura->rivalsainps : $fattura->rivalsainps;
200+
$data_documento = $fattura->data;
201+
$split_payment = $fattura->split_payment;
204202

205203
$netto_fattura = get_netto_fattura($iddocumento);
206204
$totale_fattura = get_totale_fattura($iddocumento);
@@ -392,10 +390,9 @@ function get_new_idmastrino($table = 'co_movimenti')
392390
{
393391
$dbo = database();
394392

395-
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
396-
$rs = $dbo->fetchArray($query);
393+
$maxidmastrino = $dbo->table($table)->max('idmastrino');
397394

398-
return intval($rs[0]['maxidmastrino']) + 1;
395+
return intval($maxidmastrino) + 1;
399396
}
400397
}
401398

0 commit comments

Comments
 (0)