Skip to content

Commit e62c44e

Browse files
committed
refactor: ottimizzazione query lente
1 parent 3d873b0 commit e62c44e

8 files changed

Lines changed: 144 additions & 60 deletions

File tree

lib/common.php

Lines changed: 70 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -206,30 +206,85 @@ function getDestinationComponents($riga)
206206
{
207207
$documents = [];
208208

209-
$contratti = database()->table('co_righe_contratti')->where('original_id', $riga->id)->where('original_type', $riga::class)->get();
209+
// Ottimizzazione: usa eager loading per evitare il problema N+1
210+
$contratti = Contratto::whereIn('id', function ($query) use ($riga) {
211+
$query->select('idcontratto')
212+
->from('co_righe_contratti')
213+
->where('original_id', $riga->id)
214+
->where('original_type', $riga::class);
215+
})->get();
210216
foreach ($contratti as $contratto) {
211-
$documents['documento'][] = Contratto::find($contratto->idcontratto);
212-
$documents['qta'][] = $contratto->qta;
217+
$riga_contratto = database()->table('co_righe_contratti')
218+
->where('original_id', $riga->id)
219+
->where('original_type', $riga::class)
220+
->where('idcontratto', $contratto->id)
221+
->first();
222+
$documents['documento'][] = $contratto;
223+
$documents['qta'][] = $riga_contratto->qta;
213224
}
214-
$fatture = database()->table('co_righe_documenti')->where('original_id', $riga->id)->where('original_type', $riga::class)->get();
225+
226+
$fatture = Fattura::whereIn('id', function ($query) use ($riga) {
227+
$query->select('iddocumento')
228+
->from('co_righe_documenti')
229+
->where('original_id', $riga->id)
230+
->where('original_type', $riga::class);
231+
})->get();
215232
foreach ($fatture as $fattura) {
216-
$documents['documento'][] = Fattura::find($fattura->iddocumento);
217-
$documents['qta'][] = $fattura->qta;
233+
$riga_fattura = database()->table('co_righe_documenti')
234+
->where('original_id', $riga->id)
235+
->where('original_type', $riga::class)
236+
->where('iddocumento', $fattura->id)
237+
->first();
238+
$documents['documento'][] = $fattura;
239+
$documents['qta'][] = $riga_fattura->qta;
218240
}
219-
$ddts = database()->table('dt_righe_ddt')->where('original_id', $riga->id)->where('original_type', $riga::class)->get();
241+
242+
$ddts = DDT::whereIn('id', function ($query) use ($riga) {
243+
$query->select('idddt')
244+
->from('dt_righe_ddt')
245+
->where('original_id', $riga->id)
246+
->where('original_type', $riga::class);
247+
})->get();
220248
foreach ($ddts as $ddt) {
221-
$documents['documento'][] = DDT::find($ddt->idddt);
222-
$documents['qta'][] = $ddt->qta;
249+
$riga_ddt = database()->table('dt_righe_ddt')
250+
->where('original_id', $riga->id)
251+
->where('original_type', $riga::class)
252+
->where('idddt', $ddt->id)
253+
->first();
254+
$documents['documento'][] = $ddt;
255+
$documents['qta'][] = $riga_ddt->qta;
223256
}
224-
$interventi = database()->table('in_righe_interventi')->where('original_id', $riga->id)->where('original_type', $riga::class)->get();
257+
258+
$interventi = Intervento::whereIn('id', function ($query) use ($riga) {
259+
$query->select('idintervento')
260+
->from('in_righe_interventi')
261+
->where('original_id', $riga->id)
262+
->where('original_type', $riga::class);
263+
})->get();
225264
foreach ($interventi as $intervento) {
226-
$documents['documento'][] = Intervento::find($intervento->idintervento);
227-
$documents['qta'][] = $intervento->qta;
265+
$riga_intervento = database()->table('in_righe_interventi')
266+
->where('original_id', $riga->id)
267+
->where('original_type', $riga::class)
268+
->where('idintervento', $intervento->id)
269+
->first();
270+
$documents['documento'][] = $intervento;
271+
$documents['qta'][] = $riga_intervento->qta;
228272
}
229-
$ordini = database()->table('or_righe_ordini')->where('original_id', $riga->id)->where('original_type', $riga::class)->get();
273+
274+
$ordini = Ordine::whereIn('id', function ($query) use ($riga) {
275+
$query->select('idordine')
276+
->from('or_righe_ordini')
277+
->where('original_id', $riga->id)
278+
->where('original_type', $riga::class);
279+
})->get();
230280
foreach ($ordini as $ordine) {
231-
$documents['documento'][] = Ordine::find($ordine->idordine);
232-
$documents['qta'][] = $ordine->qta;
281+
$riga_ordine = database()->table('or_righe_ordini')
282+
->where('original_id', $riga->id)
283+
->where('original_type', $riga::class)
284+
->where('idordine', $ordine->id)
285+
->first();
286+
$documents['documento'][] = $ordine;
287+
$documents['qta'][] = $riga_ordine->qta;
233288
}
234289

235290
return $documents;

modules/anagrafiche/actions.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@
136136
'_COD_' => $codice_fiscale,
137137
]);
138138

139-
$links = [];
140-
foreach ($anagrafiche_codice_fiscale as $anagrafica_singola) {
141-
$links[] = '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
142-
}
139+
// Ottimizzazione: usa pluck() per ottenere i dati necessari
140+
$links = $anagrafiche_codice_fiscale->map(function ($anagrafica_singola) {
141+
return '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
142+
})->toArray();
143143

144144
flash()->warning($message.'<ul>'.implode('', $links).'</ul>');
145145
}
@@ -156,10 +156,10 @@
156156
'_IVA_' => $partita_iva,
157157
]);
158158

159-
$links = [];
160-
foreach ($anagrafiche_partita_iva as $anagrafica_singola) {
161-
$links[] = '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
162-
}
159+
// Ottimizzazione: usa pluck() per ottenere i dati necessari
160+
$links = $anagrafiche_partita_iva->map(function ($anagrafica_singola) {
161+
return '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
162+
})->toArray();
163163

164164
flash()->warning($message.'<ul>'.implode('', $links).'</ul>');
165165
}
@@ -255,10 +255,10 @@
255255
'_COD_' => $codice_fiscale,
256256
]);
257257

258-
$links = [];
259-
foreach ($anagrafiche_codice_fiscale as $anagrafica_singola) {
260-
$links[] = '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
261-
}
258+
// Ottimizzazione: usa pluck() per ottenere i dati necessari
259+
$links = $anagrafiche_codice_fiscale->map(function ($anagrafica_singola) {
260+
return '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
261+
})->toArray();
262262

263263
flash()->warning($message.'<ul>'.implode('', $links).'</ul>');
264264
}
@@ -275,10 +275,10 @@
275275
'_IVA_' => $partita_iva,
276276
]);
277277

278-
$links = [];
279-
foreach ($anagrafiche_partita_iva as $anagrafica_singola) {
280-
$links[] = '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
281-
}
278+
// Ottimizzazione: usa pluck() per ottenere i dati necessari
279+
$links = $anagrafiche_partita_iva->map(function ($anagrafica_singola) {
280+
return '<li>'.Modules::link('Anagrafiche', $anagrafica_singola->id, $anagrafica_singola->ragione_sociale).'</li>';
281+
})->toArray();
282282

283283
flash()->warning($message.'<ul>'.implode('', $links).'</ul>');
284284
}

modules/checklists/modutil.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ function renderChecklist($check, $level = 1, $parent = 0, $has_images = false)
118118
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
119119
<table class="table" style="margin-bottom:0px;">
120120
<tbody class="sort" data-sonof="'.$check->id.'">';
121-
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
121+
$children = $check->children;
122122
foreach ($children as $child) {
123123
$result .= renderChecklist($child, $level + 1, $check->id);
124124
}
@@ -175,7 +175,7 @@ function renderChecklistInserimento($check, $level = 1, $parent = 0)
175175
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
176176
<table class="table" style="margin-bottom:0px;">
177177
<tbody class="sort" data-sonof="'.$check->id.'">';
178-
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
178+
$children = $check->children;
179179
foreach ($children as $child) {
180180
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
181181
}

modules/fatture/bulk.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,9 @@
266266
$dst = $fe->getFilename();
267267
$src = $dbo->selectOne('zz_files', 'filename', ['original' => $dst])['filename'];
268268
} else {
269-
$src = basename((string) $fattura->uploads()->where('name', 'Fattura Elettronica')->first()->filename);
270-
$dst = basename((string) $fattura->uploads()->where('name', 'Fattura Elettronica')->first()->original_name);
269+
$fattura_upload = $fattura->uploads()->where('name', 'Fattura Elettronica')->first();
270+
$src = basename((string) $fattura_upload->filename);
271+
$dst = basename((string) $fattura_upload->original_name);
271272
}
272273

273274
$file = slashes('files/'.$module->attachments_directory.'/'.$src);
@@ -325,8 +326,9 @@
325326
foreach ($fatture as $r) {
326327
$fattura = Fattura::find($r['id']);
327328
$zz_file = $dbo->table('zz_files')->where('id_module', '=', $id_module)->where('id_record', '=', $fattura->id)->where('name', 'like', 'Ricevuta%')->first();
328-
$src = basename((string) $fattura->uploads()->where('id', $zz_file->id)->first()->filename);
329-
$dst = basename((string) $fattura->uploads()->where('id', $zz_file->id)->first()->original_name);
329+
$fattura_upload = $fattura->uploads()->where('id', $zz_file->id)->first();
330+
$src = basename((string) $fattura_upload->filename);
331+
$dst = basename((string) $fattura_upload->original_name);
330332

331333
$file = slashes($module->upload_directory.'/'.$src);
332334
$dest = slashes($dir.'tmp/'.$dst);

modules/fatture/src/Gestori/Scadenze.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,26 @@ public function registra($is_pagato = false, $ignora_fe = false)
8989
public function rimuovi()
9090
{
9191
$scadenze = $this->fattura->scadenze;
92+
$assicurazioni = [];
93+
94+
// Ottimizzazione: raccogli tutte le anagrafiche delle scadenze e carica le assicurazioni in una sola query
95+
$id_anagrafiche = $scadenze->pluck('idanagrafica')->unique()->filter()->values();
96+
$assicurazioni_map = [];
97+
98+
if ($id_anagrafiche->isNotEmpty()) {
99+
$assicurazioni_list = AssicurazioneCrediti::whereIn('id_anagrafica', $id_anagrafiche)->get();
100+
101+
// Crea una mappa per accesso rapido
102+
foreach ($assicurazioni_list as $assicurazione) {
103+
$key = $assicurazione->id_anagrafica.'_'.$assicurazione->data_inizio.'_'.$assicurazione->data_fine;
104+
$assicurazioni_map[$key] = $assicurazione;
105+
}
106+
}
107+
92108
foreach ($scadenze as $scadenza) {
93-
$assicurazione_crediti = AssicurazioneCrediti::where('id_anagrafica', $scadenza->idanagrafica)->where('data_inizio', '<=', $scadenza->scadenza)->where('data_fine', '>=', $scadenza->scadenza)->first();
94-
if (!empty($assicurazione_crediti)) {
95-
$assicurazioni[] = $assicurazione_crediti;
109+
$key = $scadenza->idanagrafica.'_'.$scadenza->scadenza->format('Y-m-d').'_'.$scadenza->scadenza->format('Y-m-d');
110+
if (isset($assicurazioni_map[$key])) {
111+
$assicurazioni[] = $assicurazioni_map[$key];
96112
}
97113
}
98114

@@ -123,6 +139,7 @@ protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza,
123139
$scadenza->data_emissione = $fattura->data;
124140
$scadenza->save();
125141

142+
// TODO: Considerare di passare le assicurazioni come parametro se chiamato da rimuovi()
126143
$assicurazione_crediti = AssicurazioneCrediti::where('id_anagrafica', $scadenza->idanagrafica)->where('data_inizio', '<=', $scadenza->scadenza)->where('data_fine', '>=', $scadenza->scadenza)->first();
127144
if (!empty($assicurazione_crediti)) {
128145
$assicurazione_crediti->fixTotale();

modules/impianti/actions.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@
117117
$id_record = $dbo->lastInsertedID();
118118

119119
$checks_categoria = $dbo->fetchArray('SELECT * FROM zz_checks WHERE id_module = '.prepare($id_modulo_categorie_impianti).' AND id_record = '.prepare($id_categoria));
120+
121+
$id_checks_categoria = array_column($checks_categoria, 'id');
122+
$utenti_checks = [];
123+
if (!empty($id_checks_categoria)) {
124+
$utenti_checks = $dbo->table('zz_check_user')->whereIn('id_check', $id_checks_categoria)->get()->groupBy('id_check');
125+
}
126+
120127
foreach ($checks_categoria as $check_categoria) {
121128
$id_parent_new = null;
122129
if ($check_categoria['id_parent']) {
@@ -131,9 +138,10 @@
131138

132139
// Riporto anche i permessi della check
133140
$users = [];
134-
$utenti = $dbo->table('zz_check_user')->where('id_check', $check_categoria['id'])->get();
135-
foreach ($utenti as $utente) {
136-
$users[] = $utente->id_utente;
141+
if (isset($utenti_checks[$check_categoria['id']])) {
142+
foreach ($utenti_checks[$check_categoria['id']] as $utente) {
143+
$users[] = $utente->id_utente;
144+
}
137145
}
138146
$check->setAccess($users, null);
139147
}
@@ -198,10 +206,20 @@
198206
]);
199207

200208
$checks_categoria = $dbo->fetchArray('SELECT * FROM zz_checks WHERE id_module = '.prepare($id_modulo_categorie_impianti).' AND id_record = '.prepare(post('id_categoria')));
209+
210+
$id_parents = array_filter(array_column($checks_categoria, 'id_parent'));
211+
$parents_map = [];
212+
if (!empty($id_parents)) {
213+
$parents = $dbo->select('zz_checks', '*', ['id' => $id_parents]);
214+
foreach ($parents as $parent) {
215+
$parents_map[$parent['id']] = $parent;
216+
}
217+
}
218+
201219
foreach ($checks_categoria as $check_categoria) {
202220
$id_parent_new = null;
203-
if ($check_categoria['id_parent']) {
204-
$parent = $dbo->selectOne('zz_checks', '*', ['id' => $check_categoria['id_parent']]);
221+
if ($check_categoria['id_parent'] && isset($parents_map[$check_categoria['id_parent']])) {
222+
$parent = $parents_map[$check_categoria['id_parent']];
205223
$id_parent_new = $dbo->selectOne('zz_checks', '*', ['content' => $parent['content'], 'id_module' => $id_module, 'id_record' => $id_record])['id'];
206224
}
207225
$check = Check::build($user, $structure, $id_record, $check_categoria['content'], $id_parent_new, $check_categoria['is_titolo'], $check_categoria['order']);

modules/listini_cliente/actions.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,9 @@
130130
$dbo->query('UPDATE mg_listini SET nome = CONCAT (nome, " (copia)") WHERE id = '.prepare($id_record_new));
131131

132132
$articoli = Articolo::where('id_listino', $id_record)->get();
133-
foreach ($articoli as $articolo) {
134-
$dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM mg_listini_articoli WHERE id= '.prepare($articolo->id));
135-
$dbo->query('ALTER TABLE tmp DROP id');
136-
$dbo->query('INSERT INTO mg_listini_articoli SELECT NULL,tmp. * FROM tmp');
137-
$id_riga_new = $dbo->lastInsertedID();
138-
$dbo->query('DROP TEMPORARY TABLE tmp');
139-
$dbo->query('UPDATE mg_listini_articoli SET id_listino = '.prepare($id_record_new).' WHERE id = '.prepare($id_riga_new));
133+
if ($articoli->isNotEmpty()) {
134+
$dbo->query('INSERT INTO mg_listini_articoli (SELECT NULL, tmp.* FROM mg_listini_articoli tmp WHERE tmp.id IN ('.implode(',', $articoli->pluck('id')->toArray()).'))');
135+
$dbo->query('UPDATE mg_listini_articoli SET id_listino = '.prepare($id_record_new).' WHERE id_listino = '.prepare($id_record));
140136
}
141137

142138
flash()->info(tr('Listino duplicato correttamente!'));

modules/listini_cliente/bulk.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,10 @@
2525

2626
switch (post('op')) {
2727
case 'change_prezzo':
28-
foreach ($id_records as $id) {
29-
$listino = Listino::find($id);
30-
31-
$articoli = Articolo::where('id_listino', $id)->get();
32-
foreach ($articoli as $articolo) {
33-
$articolo->sconto_percentuale = post('percentuale');
34-
$articolo->save();
35-
}
28+
$articoli = Articolo::whereIn('id_listino', $id_records)->get();
29+
foreach ($articoli as $articolo) {
30+
$articolo->sconto_percentuale = post('percentuale');
31+
$articolo->save();
3632
}
3733

3834
flash()->info(tr('Listini aggiornati!'));

0 commit comments

Comments
 (0)