Skip to content

Commit 1db1512

Browse files
committed
fix: registrazione insoluto da tasto Registra insoluto
1 parent 7dd030b commit 1db1512

2 files changed

Lines changed: 109 additions & 44 deletions

File tree

modules/primanota/add.php

Lines changed: 78 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
* Questo file prevede diverse operazioni per la generazione di un singolo array `$movimenti` contenente tutti i movimenti da presentare nella Prima Nota. In particolare:
3333
* - Individua Scadenze e Fatture per ID da URL
3434
* - 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):
3636
* - Per Fatture di vendita, il totale è Avere (a meno di Note di credito oppure insoluto)
3737
* - Per Fatture di acquisto, il totale è Dare (a meno di Note di credito oppure insoluto)
3838
* - Inverte Dare e Avere se l'importo indicato è negativo [TODO: documentare la casistica]
@@ -124,7 +124,7 @@
124124

125125
// Inclusione delle sole fatture in stato Emessa, Parzialmente pagato o Pagato
126126
if (!in_array($fattura->stato->name, ['Emessa', 'Parzialmente pagato', 'Pagato'])) {
127-
++$counter;
127+
$counter++;
128128
continue;
129129
}
130130

@@ -138,11 +138,11 @@
138138
$conto_field = 'idconto_'.($dir == 'entrata' ? 'vendite' : 'acquisti');
139139
$id_conto_aziendale = $banca->id_pianodeiconti3 ?: ($fattura->pagamento[$conto_field] ?: setting('Conto aziendale predefinito'));
140140

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
142142
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');
144144
} 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');
146146
}
147147

148148
// Selezione prima scadenza
@@ -169,44 +169,91 @@
169169

170170
$righe_documento = [];
171171

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;
181183

182184
$righe_documento[] = [
183-
'iddocumento' => $scadenza['iddocumento'],
184-
'id_scadenza' => $scadenza['id'],
185+
'iddocumento' => $scadenza_disponibile['iddocumento'],
186+
'id_scadenza' => $scadenza_disponibile['id'],
185187
'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,
188190
];
189-
}
190191

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+
];
193199

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+
}
201246

202247
$movimenti = array_merge($movimenti, $righe_documento);
203248
}
204249

205250
// Inverto dare e avere per importi negativi
206251
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);
210257
$movimenti[$key]['avere'] = $tmp;
211258
}
212259
}

modules/primanota/src/Mastrino.php

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ class Mastrino extends Model
3838
use SimpleModelTrait;
3939

4040
public $incrementing = false;
41+
4142
protected $table = 'co_movimenti';
43+
4244
protected $primaryKey = 'idmastrino';
4345

4446
protected $hidden = [
@@ -50,7 +52,7 @@ class Mastrino extends Model
5052

5153
public static function build($descrizione = null, $data = null, $is_insoluto = false, $contabile = false, $id_anagrafica = null)
5254
{
53-
$model = new static();
55+
$model = new static;
5456

5557
$model->idmastrino = self::getNextMastrino();
5658
$model->data = $data;
@@ -119,17 +121,18 @@ public function aggiornaScadenzario($movimenti = null, $scadenza = null, $singol
119121
return;
120122
}
121123
$movimenti = $movimenti ?: $this->movimenti;
124+
$is_insoluto = $this->is_insoluto;
122125

123126
// Aggiornamento delle scadenze per i singoli documenti
124127
$documenti = $this->getUniqueDocumenti($movimenti);
125128
$scadenze = $this->getScadenzePerDocumenti($documenti);
126129

127-
if (!empty($scadenza) && $singola) {
130+
if (! empty($scadenza) && $singola) {
128131
$scadenze = [$scadenza->iddocumento => [$scadenza->id]];
129132
}
130133

131134
foreach ($movimenti as $movimento) {
132-
$this->correggiScadenza($movimento, $scadenze[$movimento->iddocumento], $movimento->iddocumento);
135+
$this->correggiScadenza($movimento, $scadenze[$movimento->iddocumento], $movimento->iddocumento, $is_insoluto);
133136
}
134137

135138
// Fix dello stato della Fattura
@@ -188,13 +191,13 @@ public static function getNextMastrino()
188191
/**
189192
* Funzione dedicata alla distribuzione del totale pagato del movimento nelle relative scadenze associate.
190193
*/
191-
protected function correggiScadenza(Movimento $movimento, $scadenze = null, $id_documento = null)
194+
protected function correggiScadenza(Movimento $movimento, $scadenze = null, $id_documento = null, $is_insoluto = false)
192195
{
193196
$is_nota = false;
194197
$documento = Fattura::find($id_documento);
195198
$totale_da_distribuire = 0;
196199

197-
if (!empty($scadenze)) {
200+
if (! empty($scadenze)) {
198201
if (empty($documento)) {
199202
$dir = $movimento->totale < 0 ? 'uscita' : 'entrata';
200203
} else {
@@ -204,12 +207,21 @@ protected function correggiScadenza(Movimento $movimento, $scadenze = null, $id_
204207
// Se il movimento ha una scadenza specifica, aggiorna solo quella
205208
if (count($scadenze) == 1) {
206209
$scadenza = Scadenza::find($movimento->id_scadenza);
207-
if (!empty($scadenza)) {
210+
if (! empty($scadenza)) {
208211
// Calcola il totale di TUTTI i movimenti per questa specifica scadenza
209-
$totale_movimenti_scadenza = Movimento::where('id_scadenza', '=', $scadenza->id)
212+
// Considerando il flag is_insoluto per sottrarre i movimenti di insoluto
213+
$totale_pagamenti = Movimento::where('id_scadenza', '=', $scadenza->id)
214+
->where('totale', '>', 0)
215+
->where('is_insoluto', '=', 0)
216+
->sum('totale');
217+
218+
$totale_insoluti = Movimento::where('id_scadenza', '=', $scadenza->id)
210219
->where('totale', '>', 0)
220+
->where('is_insoluto', '=', 1)
211221
->sum('totale');
212222

223+
$totale_movimenti_scadenza = $totale_pagamenti - $totale_insoluti;
224+
213225
$scadenza_da_pagare = abs($scadenza->da_pagare);
214226
$pagato_assoluto = abs($totale_movimenti_scadenza);
215227

@@ -229,14 +241,20 @@ protected function correggiScadenza(Movimento $movimento, $scadenze = null, $id_
229241
// Ordina le scadenze per data scadenza
230242
$scadenze = Scadenza::whereIn('id', $scadenze)->orderBy('scadenza', 'asc')->get()->pluck('id')->toArray();
231243

232-
$totale_movimenti = 0;
244+
$totale_pagamenti = 0;
245+
$totale_insoluti = 0;
233246
foreach ($scadenze as $scadenza) {
234-
$totale_movimenti += Movimento::where('id_scadenza', '=', $scadenza)
235-
->where('totale', '>', 0)
236-
->sum('totale');
247+
$totale_pagamenti += Movimento::where('id_scadenza', '=', $scadenza)
248+
->where('totale', '>', 0)
249+
->where('is_insoluto', '=', 0)
250+
->sum('totale');
251+
$totale_insoluti += Movimento::where('id_scadenza', '=', $scadenza)
252+
->where('totale', '>', 0)
253+
->where('is_insoluto', '=', 1)
254+
->sum('totale');
237255
}
238256

239-
$totale_da_distribuire = abs($totale_movimenti);
257+
$totale_da_distribuire = abs($totale_pagamenti - $totale_insoluti);
240258

241259
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato
242260
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
@@ -282,7 +300,7 @@ private function getUniqueDocumenti($movimenti)
282300
{
283301
$documentIds = [];
284302
foreach ($movimenti as $movimento) {
285-
if (!in_array($movimento->iddocumento, $documentIds)) {
303+
if (! in_array($movimento->iddocumento, $documentIds)) {
286304
$documentIds[] = $movimento->iddocumento;
287305
}
288306
}

0 commit comments

Comments
 (0)