Roberto Santini 3 недель назад
Родитель
Сommit
8e907a5c50

+ 3
- 2
app/Http/Controllers/ContrattoServizioController.php Просмотреть файл

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

+ 4
- 2
app/Http/Controllers/ContrattoTemplateController.php Просмотреть файл

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

+ 1
- 1
app/Models/ContrattoServizio.php Просмотреть файл

394
                 'quantita' => $riga->quantita,
394
                 'quantita' => $riga->quantita,
395
                 'unita_misura' => $riga->unita_misura,
395
                 'unita_misura' => $riga->unita_misura,
396
                 'prezzo_unitario' => $riga->prezzo_unitario,
396
                 'prezzo_unitario' => $riga->prezzo_unitario,
397
-                'periodo' => $riga->periodo,
397
+                'periodo' => ContrattoServizioRiga::periodoSalvato($riga->unita_misura, $riga->periodo),
398
                 'note' => $riga->note,
398
                 'note' => $riga->note,
399
                 'ordine' => $riga->ordine,
399
                 'ordine' => $riga->ordine,
400
             ]);
400
             ]);

+ 38
- 0
app/Models/ContrattoServizioRiga.php Просмотреть файл

315
         return filled($um) && ! in_array($um, ['mese', 'anno', 'forfait'], true);
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
     public function getPeriodoLabelAttribute(): string
356
     public function getPeriodoLabelAttribute(): string
319
     {
357
     {
320
         if (! $this->needsPeriodo()) {
358
         if (! $this->needsPeriodo()) {

+ 2
- 2
app/Services/FatturazioneGeneraService.php Просмотреть файл

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

Загрузка…
Отмена
Сохранить