|
113 | 113 | } |
114 | 114 |
|
115 | 115 | // Fatture |
116 | | -$numeri_fatture = []; |
| 116 | +$fatture_per_anagrafica = []; |
117 | 117 | $counter = 0; |
118 | | -$is_ultimo_importo_avere = false; |
119 | 118 |
|
120 | 119 | $id_documenti = array_unique($id_documenti); |
121 | | -$id_anagrafica_movimenti = null; |
122 | 120 | foreach ($id_documenti as $id_documento) { |
123 | 121 | $fattura = Fattura::find($id_documento); |
124 | 122 | $tipo = $fattura->tipo; |
|
130 | 128 | continue; |
131 | 129 | } |
132 | 130 |
|
133 | | - if ($id_anagrafica_movimenti == null) { |
134 | | - $id_anagrafica_movimenti = $fattura->idanagrafica; |
135 | | - } elseif ($fattura->idanagrafica != $id_anagrafica_movimenti) { |
136 | | - $id_anagrafica_movimenti = 0; |
137 | | - } |
138 | | - |
139 | | - $numeri_fatture[] = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero']; |
| 131 | + $numero_fattura_str = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero']; |
140 | 132 |
|
141 | 133 | $is_nota_credito = $tipo->reversed; |
142 | 134 | $is_importo_avere = ($dir == 'entrata' && !$is_nota_credito && !$is_insoluto) || ($dir == 'uscita' && ($is_nota_credito || $is_insoluto)); |
|
158 | 150 | $scadenze = [$scadenze[0]]; |
159 | 151 | } |
160 | 152 |
|
| 153 | + // Raggruppamento fatture per direzione e anagrafica - solo se ci sono scadenze selezionate |
| 154 | + if (!empty($scadenze)) { |
| 155 | + $chiave_anagrafica = $dir.'_'.$fattura->idanagrafica; |
| 156 | + if (!isset($fatture_per_anagrafica[$chiave_anagrafica])) { |
| 157 | + $fatture_per_anagrafica[$chiave_anagrafica] = [ |
| 158 | + 'ragione_sociale' => $fattura->anagrafica['ragione_sociale'], |
| 159 | + 'direzione' => $dir, |
| 160 | + 'numeri' => [], |
| 161 | + ]; |
| 162 | + } |
| 163 | + |
| 164 | + // Aggiungi il numero di fattura solo se non è già presente |
| 165 | + if (!in_array($numero_fattura_str, $fatture_per_anagrafica[$chiave_anagrafica]['numeri'])) { |
| 166 | + $fatture_per_anagrafica[$chiave_anagrafica]['numeri'][] = $numero_fattura_str; |
| 167 | + } |
| 168 | + } |
| 169 | + |
161 | 170 | $righe_documento = []; |
162 | 171 |
|
163 | 172 | // Riga controparte |
|
190 | 199 | 'avere' => $is_importo_avere ? 0 : $totale, |
191 | 200 | ]; |
192 | 201 |
|
193 | | - $is_ultimo_importo_avere = $is_importo_avere; |
194 | 202 | $movimenti = array_merge($movimenti, $righe_documento); |
195 | 203 | } |
196 | 204 |
|
|
207 | 215 | $numero_scadenze = count($id_scadenze); |
208 | 216 | $numero_documenti = count($id_documenti); |
209 | 217 | if ($numero_documenti + $numero_scadenze > 1) { |
210 | | - if (!empty($id_anagrafica_movimenti)) { |
211 | | - $anagrafica_movimenti = Anagrafica::find($id_anagrafica_movimenti); |
212 | | - |
213 | | - $descrizione = $is_ultimo_importo_avere ? tr('Inc. fatture _NAME_ num. _LIST_') : tr('Pag. fatture _NAME_ num. _LIST_'); |
214 | | - $descrizione = replace($descrizione, [ |
215 | | - '_NAME_' => $anagrafica_movimenti->ragione_sociale ?: '', |
216 | | - '_LIST_' => implode(', ', $numeri_fatture), |
217 | | - ]); |
| 218 | + // Conta quante anagrafiche diverse ci sono |
| 219 | + $anagrafiche_diverse = count($fatture_per_anagrafica); |
| 220 | + |
| 221 | + if ($anagrafiche_diverse == 1) { |
| 222 | + // Una sola anagrafica - estrai i dati |
| 223 | + $dati_unica = reset($fatture_per_anagrafica); |
| 224 | + |
| 225 | + // Estrai l'ID anagrafica dalla chiave (formato: direzione_idanagrafica) |
| 226 | + $chiave_unica = array_key_first($fatture_per_anagrafica); |
| 227 | + $id_anagrafica_unica = (int) substr($chiave_unica, strpos($chiave_unica, '_') + 1); |
| 228 | + $anagrafica_movimenti = Anagrafica::find($id_anagrafica_unica); |
| 229 | + |
| 230 | + $numeri_ordinati = $dati_unica['numeri']; |
| 231 | + sort($numeri_ordinati); |
| 232 | + |
| 233 | + $operazione = ($dati_unica['direzione'] == 'entrata') ? tr('Inc.') : tr('Pag.'); |
| 234 | + $descrizione = $operazione.' fatture '.$anagrafica_movimenti->ragione_sociale.' num. '.implode(', ', $numeri_ordinati); |
218 | 235 | } else { |
219 | | - $descrizione = $is_ultimo_importo_avere ? tr('Inc. fatture num. _LIST_') : tr('Pag. fatture num. _LIST_'); |
220 | | - $descrizione = replace($descrizione, [ |
221 | | - '_LIST_' => implode(', ', $numeri_fatture), |
222 | | - ]); |
| 236 | + // Fatture di più fornitori/clienti o più direzioni - raggruppare per direzione, anagrafica e numero |
| 237 | + $descrizione_parti = []; |
| 238 | + |
| 239 | + // Ordina per direzione: prima 'uscita' (Pag.), poi 'entrata' (Inc.) |
| 240 | + $direzioni_ordinate = ['uscita', 'entrata']; |
| 241 | + |
| 242 | + foreach ($direzioni_ordinate as $dir_ordinata) { |
| 243 | + $parti_per_dir = []; |
| 244 | + |
| 245 | + foreach ($fatture_per_anagrafica as $dati) { |
| 246 | + if ($dati['direzione'] === $dir_ordinata) { |
| 247 | + $numeri_ordinati = $dati['numeri']; |
| 248 | + sort($numeri_ordinati); |
| 249 | + $parti_per_dir[] = $dati['ragione_sociale'].': '.implode(', ', $numeri_ordinati); |
| 250 | + } |
| 251 | + } |
| 252 | + |
| 253 | + if (!empty($parti_per_dir)) { |
| 254 | + $operazione = ($dir_ordinata == 'entrata') ? tr('Inc.') : tr('Pag.'); |
| 255 | + $descrizione_parti[] = $operazione.' fatture '.implode('; ', $parti_per_dir); |
| 256 | + } |
| 257 | + } |
| 258 | + |
| 259 | + $descrizione = implode(' - ', $descrizione_parti); |
223 | 260 | } |
224 | 261 | } elseif ($numero_documenti == 1) { |
225 | 262 | $numero_fattura = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero']; |
|
228 | 265 | if (!empty($is_insoluto)) { |
229 | 266 | $operation = tr('Registrazione insoluto'); |
230 | 267 | } else { |
231 | | - $operation = $is_ultimo_importo_avere ? tr('Inc.') : tr('Pag.'); |
| 268 | + $operation = $dir == 'entrata' ? tr('Inc.') : tr('Pag.'); |
232 | 269 | } |
233 | 270 |
|
234 | 271 | $descrizione = tr('_OP_ _DOC_ num. _NUM_ del _DATE_ (_NAME_)', [ |
|
0 commit comments