Skip to content

Commit 9aa1aaf

Browse files
committed
refactor: ottimizzata query assicurazioni e corretto bug matching date in Scadenze
1 parent b67c311 commit 9aa1aaf

1 file changed

Lines changed: 52 additions & 22 deletions

File tree

modules/fatture/src/Gestori/Scadenze.php

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ public function __construct(private readonly Fattura $fattura)
4646
*/
4747
public function registra($is_pagato = false, $ignora_fe = false)
4848
{
49-
// Rimozione degli elementi pre-esistenti
50-
$this->rimuovi();
49+
// Rimozione degli elementi pre-esistenti e ottimizzazione caricamento assicurazioni
50+
$assicurazioni_map = $this->rimuovi();
5151

5252
if (!$ignora_fe && $this->fattura->module == 'Fatture di acquisto' && $this->fattura->isFE()) {
53-
$scadenze_fe = $this->registraScadenzeFE($is_pagato);
53+
$scadenze_fe = $this->registraScadenzeFE($is_pagato, $assicurazioni_map);
5454
}
5555

5656
if (empty($scadenze_fe)) {
57-
$this->registraScadenzeTradizionali($is_pagato);
57+
$this->registraScadenzeTradizionali($is_pagato, $assicurazioni_map);
5858
}
5959

6060
// Registrazione scadenza per Ritenuta d'Acconto
@@ -79,12 +79,14 @@ public function registra($is_pagato = false, $ignora_fe = false)
7979
$id_banca_controparte = $this->fattura->id_banca_controparte;
8080
$importo = -$ritenuta_acconto;
8181

82-
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, 'ritenuta_acconto');
82+
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, 'ritenuta_acconto', $assicurazioni_map);
8383
}
8484
}
8585

8686
/**
8787
* Elimina le scadenze della fattura.
88+
*
89+
* @return array Mappa delle assicurazioni caricate (id_anagrafica => assicurazione)
8890
*/
8991
public function rimuovi()
9092
{
@@ -98,17 +100,23 @@ public function rimuovi()
98100
if ($id_anagrafiche->isNotEmpty()) {
99101
$assicurazioni_list = AssicurazioneCrediti::whereIn('id_anagrafica', $id_anagrafiche)->get();
100102

101-
// Crea una mappa per accesso rapido
103+
// Crea una mappa per accesso rapido: chiave = id_anagrafica, valore = lista assicurazioni
102104
foreach ($assicurazioni_list as $assicurazione) {
103-
$key = $assicurazione->id_anagrafica.'_'.$assicurazione->data_inizio.'_'.$assicurazione->data_fine;
104-
$assicurazioni_map[$key] = $assicurazione;
105+
if (!isset($assicurazioni_map[$assicurazione->id_anagrafica])) {
106+
$assicurazioni_map[$assicurazione->id_anagrafica] = [];
107+
}
108+
$assicurazioni_map[$assicurazione->id_anagrafica][] = $assicurazione;
105109
}
106-
}
107110

108-
foreach ($scadenze as $scadenza) {
109-
$key = $scadenza->id_anagrafica.'_'.$scadenza->scadenza->format('Y-m-d').'_'.$scadenza->scadenza->format('Y-m-d');
110-
if (isset($assicurazioni_map[$key])) {
111-
$assicurazioni[] = $assicurazioni_map[$key];
111+
// Salva le assicurazioni da aggiornare dopo la cancellazione
112+
foreach ($scadenze as $scadenza) {
113+
if (isset($assicurazioni_map[$scadenza->id_anagrafica])) {
114+
foreach ($assicurazioni_map[$scadenza->id_anagrafica] as $assicurazione) {
115+
if ($scadenza->scadenza >= $assicurazione->data_inizio && $scadenza->scadenza <= $assicurazione->data_fine) {
116+
$assicurazioni[] = $assicurazione;
117+
}
118+
}
119+
}
112120
}
113121
}
114122

@@ -118,17 +126,24 @@ public function rimuovi()
118126
$assicurazione->fixTotale();
119127
$assicurazione->save();
120128
}
129+
130+
return $assicurazioni_map;
121131
}
122132

123133
/**
124134
* Registra una specifica scadenza nel database.
125135
*
126-
* @param float $importo
136+
* @param Fattura $fattura
137+
* @param float $importo
127138
* @param string $data_scadenza
128-
* @param bool $is_pagato
139+
* @param bool $is_pagato
140+
* @param string $id_pagamento
141+
* @param string $id_banca_azienda
142+
* @param string $id_banca_controparte
129143
* @param string $type
144+
* @param array $assicurazioni_map Mappa delle assicurazioni (id_anagrafica => [assicurazioni]) per ottimizzazione
130145
*/
131-
protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, $type = 'fattura')
146+
protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, $type = 'fattura', $assicurazioni_map = null)
132147
{
133148
$numero = $fattura->numero_esterno ?: $fattura->numero;
134149
$descrizione = $fattura->tipo->getTranslation('title').' numero '.$numero;
@@ -139,8 +154,21 @@ protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza,
139154
$scadenza->data_emissione = $fattura->data;
140155
$scadenza->save();
141156

142-
// TODO: Considerare di passare le assicurazioni come parametro se chiamato da rimuovi()
143-
$assicurazione_crediti = AssicurazioneCrediti::where('id_anagrafica', $scadenza->id_anagrafica)->where('data_inizio', '<=', $scadenza->scadenza)->where('data_fine', '>=', $scadenza->scadenza)->first();
157+
$assicurazione_crediti = null;
158+
159+
if ($assicurazioni_map !== null && isset($assicurazioni_map[$id_anagrafica])) {
160+
// Ottimizzazione: usa la mappa delle assicurazioni già caricata
161+
foreach ($assicurazioni_map[$id_anagrafica] as $assicurazione) {
162+
if ($scadenza->scadenza >= $assicurazione->data_inizio && $scadenza->scadenza <= $assicurazione->data_fine) {
163+
$assicurazione_crediti = $assicurazione;
164+
break;
165+
}
166+
}
167+
} else {
168+
// Query al database se la mappa non è disponibile
169+
$assicurazione_crediti = AssicurazioneCrediti::where('id_anagrafica', $scadenza->id_anagrafica)->where('data_inizio', '<=', $scadenza->scadenza)->where('data_fine', '>=', $scadenza->scadenza)->first();
170+
}
171+
144172
if (!empty($assicurazione_crediti)) {
145173
$assicurazione_crediti->fixTotale();
146174
$assicurazione_crediti->save();
@@ -171,10 +199,11 @@ protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza,
171199
* Registra le scadenze della fattura elettronica collegata al documento.
172200
*
173201
* @param bool $is_pagato
202+
* @param array $assicurazioni_map Mappa delle assicurazioni per ottimizzazione
174203
*
175204
* @return bool
176205
*/
177-
protected function registraScadenzeFE($is_pagato = false)
206+
protected function registraScadenzeFE($is_pagato = false, $assicurazioni_map = null)
178207
{
179208
$xml = XML::read($this->fattura->getXML());
180209

@@ -198,7 +227,7 @@ protected function registraScadenzeFE($is_pagato = false)
198227
$scadenza = !empty($rata['DataScadenzaPagamento']) ? FatturaElettronicaImport::parseDate($rata['DataScadenzaPagamento']) : $this->fattura->data;
199228
$importo = $this->fattura->isNota() ? $rata['ImportoPagamento'] : -$rata['ImportoPagamento'];
200229

201-
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte);
230+
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, 'fattura', $assicurazioni_map);
202231
}
203232
}
204233

@@ -209,8 +238,9 @@ protected function registraScadenzeFE($is_pagato = false)
209238
* Registra le scadenze tradizionali del gestionale.
210239
*
211240
* @param bool $is_pagato
241+
* @param array $assicurazioni_map Mappa delle assicurazioni per ottimizzazione
212242
*/
213-
protected function registraScadenzeTradizionali($is_pagato = false)
243+
protected function registraScadenzeTradizionali($is_pagato = false, $assicurazioni_map = null)
214244
{
215245
// Inversione di segno per le note
216246
$netto = $this->fattura->netto;
@@ -227,7 +257,7 @@ protected function registraScadenzeTradizionali($is_pagato = false)
227257
$id_banca_azienda = $this->fattura->id_banca_azienda;
228258
$id_banca_controparte = $this->fattura->id_banca_controparte;
229259

230-
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte);
260+
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, 'fattura', $assicurazioni_map);
231261
}
232262
}
233263
}

0 commit comments

Comments
 (0)