Roberto Santini 3 weeks ago
parent
commit
8e907a5c50

+ 3
- 2
app/Http/Controllers/ContrattoServizioController.php View File

@@ -351,16 +351,17 @@ class ContrattoServizioController extends Controller implements HasMiddleware
351 351
       if ($dataFine === '') {
352 352
         $dataFine = null;
353 353
       }
354
+      $unita = $row['unita_misura'] ?? ($prodotto->unita_misura ?? null);
354 355
       $riga->fill([
355 356
         'prodotto_id' => $prodottoId,
356 357
         'quantita' => $row['quantita'] ?? 1,
357
-        'unita_misura' => $row['unita_misura'] ?? ($prodotto->unita_misura ?? null),
358
+        'unita_misura' => $unita,
358 359
         'prezzo_unitario' => ($row['prezzo_unitario'] === '' || ! array_key_exists('prezzo_unitario', $row))
359 360
           ? null
360 361
           : $row['prezzo_unitario'],
361 362
         'sconto_tipo' => $scontoTipo,
362 363
         'sconto_valore' => $scontoValore,
363
-        'periodo' => $row['periodo'] ?? ($prodotto->periodo ?? null),
364
+        'periodo' => ContrattoServizioRiga::periodoSalvato($unita, $row['periodo'] ?? ($prodotto->periodo ?? null)),
364 365
         'data_inizio' => $dataInizio,
365 366
         'data_fine' => $dataFine,
366 367
         'note' => $row['note'] ?? null,

+ 4
- 2
app/Http/Controllers/ContrattoTemplateController.php View File

@@ -3,6 +3,7 @@
3 3
 namespace App\Http\Controllers;
4 4
 
5 5
 use App\DataTables\ContrattoTemplateDataTable;
6
+use App\Models\ContrattoServizioRiga;
6 7
 use App\Models\ContrattoTemplate;
7 8
 use App\Models\ContrattoTemplateRiga;
8 9
 use App\Models\ContrattoTemplateTodo;
@@ -213,15 +214,16 @@ class ContrattoTemplateController extends Controller implements HasMiddleware
213 214
         continue;
214 215
       }
215 216
       $prodotto = Prodotto::find($prodottoId);
217
+      $unita = $row['unita_misura'] ?? ($prodotto->unita_misura ?? null);
216 218
       ContrattoTemplateRiga::create([
217 219
         'contratto_template_id' => $template->id,
218 220
         'prodotto_id' => $prodottoId,
219 221
         'quantita' => $row['quantita'] ?? 1,
220
-        'unita_misura' => $row['unita_misura'] ?? ($prodotto->unita_misura ?? null),
222
+        'unita_misura' => $unita,
221 223
         'prezzo_unitario' => ($row['prezzo_unitario'] === '' || ! array_key_exists('prezzo_unitario', $row))
222 224
           ? null
223 225
           : $row['prezzo_unitario'],
224
-        'periodo' => $row['periodo'] ?? ($prodotto->periodo ?? null),
226
+        'periodo' => ContrattoServizioRiga::periodoSalvato($unita, $row['periodo'] ?? ($prodotto->periodo ?? null)),
225 227
         'note' => $row['note'] ?? null,
226 228
         'ordine' => $ordine++,
227 229
       ]);

+ 1
- 1
app/Models/ContrattoServizio.php View File

@@ -394,7 +394,7 @@ class ContrattoServizio extends \App\Models\AbstractModels\AbstractContrattoServ
394 394
                 'quantita' => $riga->quantita,
395 395
                 'unita_misura' => $riga->unita_misura,
396 396
                 'prezzo_unitario' => $riga->prezzo_unitario,
397
-                'periodo' => $riga->periodo,
397
+                'periodo' => ContrattoServizioRiga::periodoSalvato($riga->unita_misura, $riga->periodo),
398 398
                 'note' => $riga->note,
399 399
                 'ordine' => $riga->ordine,
400 400
             ]);

+ 38
- 0
app/Models/ContrattoServizioRiga.php View File

@@ -315,6 +315,44 @@ class ContrattoServizioRiga extends \App\Models\AbstractModels\AbstractContratto
315 315
         return filled($um) && ! in_array($um, ['mese', 'anno', 'forfait'], true);
316 316
     }
317 317
 
318
+    /**
319
+     * Ciclo di fatturazione. Mese, anno e forfait sono già il ciclo:
320
+     * un eventuale periodo salvato sulla riga (es. mensile su «1 anno») non conta.
321
+     * Il forfait con periodo esplicito è il canone di testata, che segue il contratto.
322
+     */
323
+    public function periodoCiclo(?string $periodoContratto = null): string
324
+    {
325
+        $um = $this->unita_misura ?: optional($this->prodotto)->unita_misura;
326
+
327
+        if ($um === 'anno') {
328
+            return 'annuale';
329
+        }
330
+        if ($um === 'mese') {
331
+            return 'mensile';
332
+        }
333
+        if ($um === 'forfait' && ! filled($this->periodo)) {
334
+            return 'una_tantum';
335
+        }
336
+
337
+        $periodo = (string) ($this->periodo ?: $periodoContratto ?: 'una_tantum');
338
+
339
+        return $periodo !== '' ? $periodo : 'una_tantum';
340
+    }
341
+
342
+    /**
343
+     * Mese, anno e forfait non hanno un periodo separato: non va persistito.
344
+     */
345
+    public static function periodoSalvato(?string $unita, ?string $periodo): ?string
346
+    {
347
+        if (in_array($unita, ['mese', 'anno', 'forfait'], true)) {
348
+            return null;
349
+        }
350
+
351
+        $periodo = $periodo !== null ? trim($periodo) : null;
352
+
353
+        return $periodo === '' ? null : $periodo;
354
+    }
355
+
318 356
     public function getPeriodoLabelAttribute(): string
319 357
     {
320 358
         if (! $this->needsPeriodo()) {

+ 2
- 2
app/Services/FatturazioneGeneraService.php View File

@@ -651,7 +651,7 @@ class FatturazioneGeneraService
651 651
             }
652 652
 
653 653
             foreach ($contratto->righe as $riga) {
654
-                $periodoKey = (string) ($riga->periodo ?: $contratto->periodo ?: 'una_tantum');
654
+                $periodoKey = $riga->periodoCiclo($contratto->periodo);
655 655
                 foreach ($this->dateOccorrenzeRigaNelPeriodo($contratto, $riga, $from, $to) as $occurrence) {
656 656
                     [$pDa, $pA] = $this->finestraCiclo($periodoKey, $occurrence, $this->decorrenzaRiga($contratto, $riga));
657 657
                     if ($this->cicloPrecedenteAllaSoglia($occurrence, $pDa, $rinnoviDa)) {
@@ -740,7 +740,7 @@ class FatturazioneGeneraService
740 740
             return [];
741 741
         }
742 742
 
743
-        $periodo = (string) ($riga->periodo ?: $contratto->periodo ?: 'una_tantum');
743
+        $periodo = $riga->periodoCiclo($contratto->periodo);
744 744
         if ($periodo === 'a_consumo') {
745 745
             return [];
746 746
         }

Loading…
Cancel
Save