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

+ 1
- 0
app/Services/FatturaReportTicketPdfService.php Просмотреть файл

91
         $pdf->setPaper('a4', 'portrait');
91
         $pdf->setPaper('a4', 'portrait');
92
         $pdf->setOption('defaultFont', 'DejaVu Sans');
92
         $pdf->setOption('defaultFont', 'DejaVu Sans');
93
         $pdf->setOption('isHtml5ParserEnabled', true);
93
         $pdf->setOption('isHtml5ParserEnabled', true);
94
+        $pdf->setOption('isPhpEnabled', true);
94
 
95
 
95
         return $pdf->output();
96
         return $pdf->output();
96
     }
97
     }

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

5
 use App\Models\AcquistoServizio;
5
 use App\Models\AcquistoServizio;
6
 use App\Models\Annotazione;
6
 use App\Models\Annotazione;
7
 use App\Models\Config;
7
 use App\Models\Config;
8
+use App\Models\ConfiguraSegnalazione;
8
 use App\Models\ContrattoServizio;
9
 use App\Models\ContrattoServizio;
9
 use App\Models\ContrattoServizioRiga;
10
 use App\Models\ContrattoServizioRiga;
10
 use App\Models\Fattura;
11
 use App\Models\Fattura;
578
                 'minuti' => $allocazione['minuti_fatturare'],
579
                 'minuti' => $allocazione['minuti_fatturare'],
579
                 'annotazione_id' => $annotazione->id,
580
                 'annotazione_id' => $annotazione->id,
580
                 'segnalazione_id' => $segnalazione->id,
581
                 'segnalazione_id' => $segnalazione->id,
582
+                'tipo_segnalazione' => $this->labelTipoSegnalazione($segnalazione),
581
                 'contratto_servizio_id' => $segnalazione->contratto_servizio_id,
583
                 'contratto_servizio_id' => $segnalazione->contratto_servizio_id,
582
                 'contratto_servizio_riga_id' => null,
584
                 'contratto_servizio_riga_id' => null,
583
                 'ordine_lavoro_id' => $segnalazione->ordine_lavoro_id,
585
                 'ordine_lavoro_id' => $segnalazione->ordine_lavoro_id,
599
                 'minuti' => null,
601
                 'minuti' => null,
600
                 'annotazione_id' => $annotazione->id,
602
                 'annotazione_id' => $annotazione->id,
601
                 'segnalazione_id' => $segnalazione->id,
603
                 'segnalazione_id' => $segnalazione->id,
604
+                'tipo_segnalazione' => $this->labelTipoSegnalazione($segnalazione),
602
                 'contratto_servizio_id' => $segnalazione->contratto_servizio_id,
605
                 'contratto_servizio_id' => $segnalazione->contratto_servizio_id,
603
                 'contratto_servizio_riga_id' => null,
606
                 'contratto_servizio_riga_id' => null,
604
                 'ordine_lavoro_id' => $segnalazione->ordine_lavoro_id,
607
                 'ordine_lavoro_id' => $segnalazione->ordine_lavoro_id,
619
                 'minuti' => null,
622
                 'minuti' => null,
620
                 'annotazione_id' => $annotazione->id,
623
                 'annotazione_id' => $annotazione->id,
621
                 'segnalazione_id' => $segnalazione->id,
624
                 'segnalazione_id' => $segnalazione->id,
625
+                'tipo_segnalazione' => $this->labelTipoSegnalazione($segnalazione),
622
                 'contratto_servizio_id' => $segnalazione->contratto_servizio_id,
626
                 'contratto_servizio_id' => $segnalazione->contratto_servizio_id,
623
                 'contratto_servizio_riga_id' => null,
627
                 'contratto_servizio_riga_id' => null,
624
                 'ordine_lavoro_id' => $segnalazione->ordine_lavoro_id,
628
                 'ordine_lavoro_id' => $segnalazione->ordine_lavoro_id,
1133
         return $daRighe->merge($daMeta)->unique()->values()->all();
1137
         return $daRighe->merge($daMeta)->unique()->values()->all();
1134
     }
1138
     }
1135
 
1139
 
1140
+    protected function labelTipoSegnalazione($segnalazione): string
1141
+    {
1142
+        static $labels = null;
1143
+        if ($labels === null) {
1144
+            $labels = ConfiguraSegnalazione::query()
1145
+                ->where('gruppo', 'Tipo')
1146
+                ->pluck('label', 'value');
1147
+        }
1148
+        $value = trim((string) ($segnalazione->tipo ?? ''));
1149
+        if ($value === '') {
1150
+            return 'Ticket';
1151
+        }
1152
+        $label = trim((string) ($labels[$value] ?? $value));
1153
+
1154
+        return $label !== '' ? $label : 'Ticket';
1155
+    }
1156
+
1136
     /**
1157
     /**
1137
-     * Una riga fattura per tipo (ore, extra, spese, uscite) al posto di una riga per ticket.
1158
+     * Una riga per tipo di ticket (es. Assistenza remota), con le ore sommate.
1138
      *
1159
      *
1139
      * @param  array<int, array<string, mixed>>  $voci
1160
      * @param  array<int, array<string, mixed>>  $voci
1140
      * @return array<int, array<string, mixed>>
1161
      * @return array<int, array<string, mixed>>
1156
                 $resto[] = $voce;
1177
                 $resto[] = $voce;
1157
                 continue;
1178
                 continue;
1158
             }
1179
             }
1159
-            $gruppi[$tipo][] = $voce;
1180
+            $tipoSegnalazione = trim((string) ($voce['tipo_segnalazione'] ?? ''));
1181
+            if ($tipoSegnalazione === '') {
1182
+                $tipoSegnalazione = 'Ticket';
1183
+            }
1184
+            $ore = in_array($tipo, [FatturaRiga::TIPO_TEMPO, FatturaRiga::TIPO_EXTRA_CONTRATTO, FatturaRiga::TIPO_EXTRA_ORDINE], true);
1185
+            $chiave = ($ore ? 'ore' : $tipo).'|'.$tipoSegnalazione;
1186
+            $gruppi[$chiave][] = $voce;
1160
         }
1187
         }
1161
 
1188
 
1162
-        foreach ($gruppi as $tipo => $items) {
1189
+        foreach ($gruppi as $items) {
1190
+            $tipo = (string) ($items[0]['tipo'] ?? FatturaRiga::TIPO_TEMPO);
1191
+            $tipoSegnalazione = trim((string) ($items[0]['tipo_segnalazione'] ?? 'Ticket'));
1163
             $importo = round(collect($items)->sum(fn ($v) => (float) ($v['importo'] ?? 0)), 2);
1192
             $importo = round(collect($items)->sum(fn ($v) => (float) ($v['importo'] ?? 0)), 2);
1164
             $minuti = (int) collect($items)->sum(fn ($v) => (int) ($v['minuti'] ?? 0));
1193
             $minuti = (int) collect($items)->sum(fn ($v) => (int) ($v['minuti'] ?? 0));
1165
             $ore = in_array($tipo, [FatturaRiga::TIPO_TEMPO, FatturaRiga::TIPO_EXTRA_CONTRATTO, FatturaRiga::TIPO_EXTRA_ORDINE], true);
1194
             $ore = in_array($tipo, [FatturaRiga::TIPO_TEMPO, FatturaRiga::TIPO_EXTRA_CONTRATTO, FatturaRiga::TIPO_EXTRA_ORDINE], true);
1167
             if ($qty <= 0) {
1196
             if ($qty <= 0) {
1168
                 $qty = 1;
1197
                 $qty = 1;
1169
             }
1198
             }
1199
+            if ($ore) {
1200
+                $descrizione = $tipoSegnalazione;
1201
+            } elseif ($tipo === FatturaRiga::TIPO_SPESA) {
1202
+                $descrizione = 'Spesa — '.$tipoSegnalazione;
1203
+            } else {
1204
+                $descrizione = 'Costo d\'uscita — '.$tipoSegnalazione;
1205
+            }
1170
             $resto[] = [
1206
             $resto[] = [
1171
-                'tipo' => $tipo,
1172
-                'descrizione' => FatturaRiga::TIPI[$tipo] ?? $tipo,
1207
+                'tipo' => $ore ? FatturaRiga::TIPO_TEMPO : $tipo,
1208
+                'descrizione' => $descrizione,
1173
                 'quantita' => $qty,
1209
                 'quantita' => $qty,
1174
                 'unita_misura' => $ore ? 'ora' : 'forfait',
1210
                 'unita_misura' => $ore ? 'ora' : 'forfait',
1175
                 'prezzo_unitario' => round($importo / $qty, 2),
1211
                 'prezzo_unitario' => round($importo / $qty, 2),

+ 14
- 0
resources/views/fatturazione/report-ticket.blade.php Просмотреть файл

47
       </tr>
47
       </tr>
48
       @endforelse
48
       @endforelse
49
     </tbody>
49
     </tbody>
50
+    @if(count($righe))
51
+    @php
52
+      $oreTotali = round(collect($righe)->sum(fn ($r) => (float) ($r['ore'] ?? 0)), 2);
53
+    @endphp
54
+    <tfoot>
55
+      <tr>
56
+        <td colspan="2"><strong>Totale ore</strong></td>
57
+        <td class="text-end"><strong>{{ \App\Models\Config::formatTempo((int) round($oreTotali * 60)) }}</strong></td>
58
+        <td></td>
59
+      </tr>
60
+    </tfoot>
61
+    @endif
50
   </table>
62
   </table>
63
+
64
+  @include('pdf.footer', ['documentoLabel' => 'Dettaglio ticket — Fattura '.$fattura->numero_documento])
51
 </body>
65
 </body>
52
 </html>
66
 </html>

+ 4
- 0
resources/views/pdf/styles.blade.php Просмотреть файл

106
     background: #f2f2f2;
106
     background: #f2f2f2;
107
     font-size: 9px;
107
     font-size: 9px;
108
   }
108
   }
109
+  table.pdf-lines tfoot td {
110
+    background: #f2f2f2;
111
+    font-size: 10px;
112
+  }
109
 
113
 
110
   .pdf-notes {
114
   .pdf-notes {
111
     margin-top: 14px;
115
     margin-top: 14px;

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