|
32 | 32 | * Questo file prevede diverse operazioni per la generazione di un singolo array `$movimenti` contenente tutti i movimenti da presentare nella Prima Nota. In particolare: |
33 | 33 | * - Individua Scadenze e Fatture per ID da URL |
34 | 34 | * - Legge le informazioni relative alle Scadenze per presentare i movimenti in Dare e Avere |
35 | | - * - Legge le informazioni relative alla Scadenze le Fatture indicate (sola della prima Scadenza insoluta se `is_insoluto` impostato): |
| 35 | + * - Legge le informazioni relative alla Scadenze le Fatture indicate (sola della prima Scadenza disponibile se `is_insoluto` impostato): |
36 | 36 | * - Per Fatture di vendita, il totale è Avere (a meno di Note di credito oppure insoluto) |
37 | 37 | * - Per Fatture di acquisto, il totale è Dare (a meno di Note di credito oppure insoluto) |
38 | 38 | * - Inverte Dare e Avere se l'importo indicato è negativo [TODO: documentare la casistica] |
|
124 | 124 |
|
125 | 125 | // Inclusione delle sole fatture in stato Emessa, Parzialmente pagato o Pagato |
126 | 126 | if (!in_array($fattura->stato->name, ['Emessa', 'Parzialmente pagato', 'Pagato'])) { |
127 | | - ++$counter; |
| 127 | + $counter++; |
128 | 128 | continue; |
129 | 129 | } |
130 | 130 |
|
|
138 | 138 | $conto_field = 'idconto_'.($dir == 'entrata' ? 'vendite' : 'acquisti'); |
139 | 139 | $id_conto_aziendale = $banca->id_pianodeiconti3 ?: ($fattura->pagamento[$conto_field] ?: setting('Conto aziendale predefinito')); |
140 | 140 |
|
141 | | - // Se sto registrando un insoluto, leggo l'ultima scadenza pagata altrimenti leggo la scadenza della fattura |
| 141 | + // Se sto registrando un insoluto, leggo la prima rata disponibile (non pagata) altrimenti leggo la scadenza della fattura |
142 | 142 | if ($is_insoluto) { |
143 | | - $scadenze = $database->fetchArray('SELECT id, ABS(da_pagare) AS rata, iddocumento, tipo FROM co_scadenziario WHERE iddocumento='.prepare($id_documento).' AND ABS(da_pagare) = ABS(pagato) ORDER BY updated_at DESC LIMIT 0, 1'); |
| 143 | + $scadenze = $database->fetchArray('SELECT id, ABS(da_pagare - pagato) AS rata, iddocumento, tipo FROM co_scadenziario WHERE iddocumento='.prepare($id_documento).' AND ABS(da_pagare) > ABS(pagato)'.(! empty($id_scadenze) ? 'AND id IN('.implode(',', array_map(prepare(...), $id_scadenze)).')' : '').' ORDER BY YEAR(scadenza) ASC, MONTH(scadenza) ASC LIMIT 0, 1'); |
144 | 144 | } else { |
145 | | - $scadenze = $database->fetchArray('SELECT id, ABS(da_pagare - pagato) AS rata, iddocumento, tipo FROM co_scadenziario WHERE iddocumento='.prepare($id_documento).' AND ABS(da_pagare) > ABS(pagato)'.(!empty($id_scadenze) ? 'AND id IN('.implode(',', array_map(prepare(...), $id_scadenze)).')' : '').' ORDER BY YEAR(scadenza) ASC, MONTH(scadenza) ASC'); |
| 145 | + $scadenze = $database->fetchArray('SELECT id, ABS(da_pagare - pagato) AS rata, iddocumento, tipo FROM co_scadenziario WHERE iddocumento='.prepare($id_documento).' AND ABS(da_pagare) > ABS(pagato)'.(! empty($id_scadenze) ? 'AND id IN('.implode(',', array_map(prepare(...), $id_scadenze)).')' : '').' ORDER BY YEAR(scadenza) ASC, MONTH(scadenza) ASC'); |
146 | 146 | } |
147 | 147 |
|
148 | 148 | // Selezione prima scadenza |
|
169 | 169 |
|
170 | 170 | $righe_documento = []; |
171 | 171 |
|
172 | | - // Riga controparte |
173 | | - foreach ($scadenze as $scadenza) { |
174 | | - // Predisposizione conto |
175 | | - if ($scadenza['tipo'] == 'ritenutaacconto') { |
176 | | - $id_conto_controparte = setting("Conto per Erario c/ritenute d'acconto"); |
177 | | - } else { |
178 | | - $conto_field = 'idconto_'.($dir == 'entrata' ? 'cliente' : 'fornitore'); |
179 | | - $id_conto_controparte = $fattura->anagrafica[$conto_field]; |
180 | | - } |
| 172 | + if ($is_insoluto) { |
| 173 | + $scadenza_disponibile = $scadenze[0]; |
| 174 | + |
| 175 | + $conto_field = 'idconto_'.($dir == 'entrata' ? 'cliente' : 'fornitore'); |
| 176 | + $id_conto_controparte = $fattura->anagrafica[$conto_field]; |
| 177 | + |
| 178 | + $conto_banca_effetti = $database->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE descrizione = '.prepare('Banca effetti all\'incasso')); |
| 179 | + $id_conto_banca_effetti = $conto_banca_effetti['id'] ?? null; |
| 180 | + |
| 181 | + $conto_spese = $database->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE descrizione = '.prepare('Effetti insoluti')); |
| 182 | + $id_conto_spese_insoluti = $conto_spese['id'] ?? null; |
181 | 183 |
|
182 | 184 | $righe_documento[] = [ |
183 | | - 'iddocumento' => $scadenza['iddocumento'], |
184 | | - 'id_scadenza' => $scadenza['id'], |
| 185 | + 'iddocumento' => $scadenza_disponibile['iddocumento'], |
| 186 | + 'id_scadenza' => $scadenza_disponibile['id'], |
185 | 187 | 'id_conto' => $id_conto_controparte, |
186 | | - 'dare' => $is_importo_avere ? 0 : $scadenza['rata'], |
187 | | - 'avere' => $is_importo_avere ? $scadenza['rata'] : 0, |
| 188 | + 'dare' => $scadenza_disponibile['rata'], |
| 189 | + 'avere' => 0, |
188 | 190 | ]; |
189 | | - } |
190 | 191 |
|
191 | | - // Riga aziendale |
192 | | - $totale = sum(array_column($scadenze, 'rata')); |
| 192 | + $righe_documento[] = [ |
| 193 | + 'iddocumento' => $scadenza_disponibile['iddocumento'], |
| 194 | + 'id_scadenza' => $scadenza_disponibile['id'], |
| 195 | + 'id_conto' => $id_conto_banca_effetti, |
| 196 | + 'dare' => 0, |
| 197 | + 'avere' => $scadenza_disponibile['rata'], |
| 198 | + ]; |
193 | 199 |
|
194 | | - $righe_documento[] = [ |
195 | | - 'iddocumento' => $scadenze[0]['iddocumento'], |
196 | | - 'id_scadenza' => $scadenze[0]['id'], |
197 | | - 'id_conto' => $id_conto_aziendale, |
198 | | - 'dare' => $is_importo_avere ? $totale : 0, |
199 | | - 'avere' => $is_importo_avere ? 0 : $totale, |
200 | | - ]; |
| 200 | + $righe_documento[] = [ |
| 201 | + 'iddocumento' => null, |
| 202 | + 'id_scadenza' => null, |
| 203 | + 'id_conto' => $id_conto_spese_insoluti, |
| 204 | + 'dare' => $scadenza_disponibile['rata'], |
| 205 | + 'avere' => 0, |
| 206 | + ]; |
| 207 | + |
| 208 | + $righe_documento[] = [ |
| 209 | + 'iddocumento' => null, |
| 210 | + 'id_scadenza' => null, |
| 211 | + 'id_conto' => $id_conto_aziendale, |
| 212 | + 'dare' => 0, |
| 213 | + 'avere' => $scadenza_disponibile['rata'], |
| 214 | + ]; |
| 215 | + } else { |
| 216 | + // Riga controparte |
| 217 | + foreach ($scadenze as $scadenza) { |
| 218 | + // Predisposizione conto |
| 219 | + if ($scadenza['tipo'] == 'ritenutaacconto') { |
| 220 | + $id_conto_controparte = setting("Conto per Erario c/ritenute d'acconto"); |
| 221 | + } else { |
| 222 | + $conto_field = 'idconto_'.($dir == 'entrata' ? 'cliente' : 'fornitore'); |
| 223 | + $id_conto_controparte = $fattura->anagrafica[$conto_field]; |
| 224 | + } |
| 225 | + |
| 226 | + $righe_documento[] = [ |
| 227 | + 'iddocumento' => $scadenza['iddocumento'], |
| 228 | + 'id_scadenza' => $scadenza['id'], |
| 229 | + 'id_conto' => $id_conto_controparte, |
| 230 | + 'dare' => $is_importo_avere ? 0 : $scadenza['rata'], |
| 231 | + 'avere' => $is_importo_avere ? $scadenza['rata'] : 0, |
| 232 | + ]; |
| 233 | + } |
| 234 | + |
| 235 | + // Riga aziendale |
| 236 | + $totale = sum(array_column($scadenze, 'rata')); |
| 237 | + |
| 238 | + $righe_documento[] = [ |
| 239 | + 'iddocumento' => $scadenze[0]['iddocumento'], |
| 240 | + 'id_scadenza' => $scadenze[0]['id'], |
| 241 | + 'id_conto' => $id_conto_aziendale, |
| 242 | + 'dare' => $is_importo_avere ? $totale : 0, |
| 243 | + 'avere' => $is_importo_avere ? 0 : $totale, |
| 244 | + ]; |
| 245 | + } |
201 | 246 |
|
202 | 247 | $movimenti = array_merge($movimenti, $righe_documento); |
203 | 248 | } |
204 | 249 |
|
205 | 250 | // Inverto dare e avere per importi negativi |
206 | 251 | foreach ($movimenti as $key => $value) { |
207 | | - if ($movimenti[$key]['dare'] < 0 || $movimenti[$key]['avere'] < 0) { |
208 | | - $tmp = abs($movimenti[$key]['dare']); |
209 | | - $movimenti[$key]['dare'] = abs($movimenti[$key]['avere']); |
| 252 | + $dare = is_numeric($movimenti[$key]['dare']) ? $movimenti[$key]['dare'] : 0; |
| 253 | + $avere = is_numeric($movimenti[$key]['avere']) ? $movimenti[$key]['avere'] : 0; |
| 254 | + if ($dare < 0 || $avere < 0) { |
| 255 | + $tmp = abs($dare); |
| 256 | + $movimenti[$key]['dare'] = abs($avere); |
210 | 257 | $movimenti[$key]['avere'] = $tmp; |
211 | 258 | } |
212 | 259 | } |
|
0 commit comments