@@ -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