Browse Source

fatture in cloud

Roberto Santini 3 weeks ago
parent
commit
7124839f89

+ 47
- 14
app/Services/FatturaReportTicketPdfService.php View File

@@ -14,15 +14,46 @@ use Illuminate\Support\Facades\Storage;
14 14
 class FatturaReportTicketPdfService
15 15
 {
16 16
     /**
17
-     * @return array<int, array{titolo: string, data: string, ore: float, uscita: ?float}>
17
+     * @return array<int, array{titolo: string, data: string, minuti: int, uscita: ?float}>
18 18
      */
19 19
     public function righe(Fattura $fattura): array
20 20
     {
21
+        $daRighe = $this->righeDaFattura($fattura);
22
+        if ($daRighe !== []) {
23
+            return $daRighe;
24
+        }
25
+
21 26
         $salvate = data_get($fattura->meta, 'dettaglio_ticket');
22
-        if (is_array($salvate) && $salvate !== []) {
23
-            return array_values($salvate);
27
+        if (! is_array($salvate) || $salvate === []) {
28
+            return [];
29
+        }
30
+
31
+        $righe = [];
32
+        foreach ($salvate as $riga) {
33
+            if (! is_array($riga)) {
34
+                continue;
35
+            }
36
+            $minuti = array_key_exists('minuti', $riga)
37
+                ? (int) $riga['minuti']
38
+                : (int) round(((float) ($riga['ore'] ?? 0)) * 60);
39
+            $righe[] = [
40
+                'titolo' => (string) ($riga['titolo'] ?? 'Ticket'),
41
+                'data' => (string) ($riga['data'] ?? ''),
42
+                'minuti' => $minuti,
43
+                'uscita' => $riga['uscita'] ?? null,
44
+            ];
24 45
         }
25 46
 
47
+        return $righe;
48
+    }
49
+
50
+    /**
51
+     * Ore del PDF = minuti messi in fattura, non tutto il tempo segnato sul ticket.
52
+     *
53
+     * @return array<int, array{titolo: string, data: string, minuti: int, uscita: ?float}>
54
+     */
55
+    protected function righeDaFattura(Fattura $fattura): array
56
+    {
26 57
         $fattura->loadMissing('righe');
27 58
         $ids = $fattura->righe
28 59
             ->pluck('annotazione_id')
@@ -34,13 +65,20 @@ class FatturaReportTicketPdfService
34 65
             return [];
35 66
         }
36 67
 
68
+        $tipiOre = [FatturaRiga::TIPO_TEMPO, FatturaRiga::TIPO_EXTRA_CONTRATTO, FatturaRiga::TIPO_EXTRA_ORDINE];
37 69
         $uscite = [];
70
+        $minuti = [];
38 71
         foreach ($fattura->righe as $riga) {
39
-            if ($riga->tipo !== FatturaRiga::TIPO_USCITA || ! $riga->annotazione_id) {
72
+            if (! $riga->annotazione_id) {
40 73
                 continue;
41 74
             }
42 75
             $id = (int) $riga->annotazione_id;
43
-            $uscite[$id] = round(($uscite[$id] ?? 0) + (float) ($riga->importo ?? 0), 2);
76
+            if ($riga->tipo === FatturaRiga::TIPO_USCITA) {
77
+                $uscite[$id] = round(($uscite[$id] ?? 0) + (float) ($riga->importo ?? 0), 2);
78
+            }
79
+            if (in_array($riga->tipo, $tipiOre, true)) {
80
+                $minuti[$id] = ($minuti[$id] ?? 0) + (int) ($riga->minuti ?? 0);
81
+            }
44 82
         }
45 83
 
46 84
         $annotazioni = Annotazione::query()->with('segnalazione')->whereIn('id', $ids)->get()->keyBy('id');
@@ -53,15 +91,15 @@ class FatturaReportTicketPdfService
53 91
             $quando = $annotazione->tempo_data
54 92
                 ? Carbon::parse($annotazione->tempo_data)
55 93
                 : Carbon::parse($annotazione->created_at);
56
-            $ore = round(((int) $annotazione->tempo_minuti) / 60, 2);
94
+            $minutiRiga = (int) ($minuti[$id] ?? 0);
57 95
             $uscita = $uscite[$id] ?? null;
58
-            if ($ore <= 0 && ! $uscita) {
96
+            if ($minutiRiga <= 0 && ! $uscita) {
59 97
                 continue;
60 98
             }
61 99
             $righe[] = [
62 100
                 'titolo' => $annotazione->segnalazione?->titolo ?: 'Ticket',
63 101
                 'data' => $quando->format('Y-m-d H:i'),
64
-                'ore' => $ore,
102
+                'minuti' => $minutiRiga,
65 103
                 'uscita' => $uscita,
66 104
             ];
67 105
         }
@@ -112,16 +150,11 @@ class FatturaReportTicketPdfService
112 150
 
113 151
     public function binary(Fattura $fattura): ?string
114 152
     {
115
-        if ($fattura->path_file && Storage::disk('local')->exists($fattura->path_file)) {
116
-            return Storage::disk('local')->get($fattura->path_file);
117
-        }
118 153
         if (! $this->haDettaglio($fattura)) {
119 154
             return null;
120 155
         }
121 156
 
122
-        $this->store($fattura);
123
-
124
-        return Storage::disk('local')->get($fattura->path_file);
157
+        return $this->generateBinary($fattura);
125 158
     }
126 159
 
127 160
     public function formatOre(float $ore): string

+ 13
- 6
app/Services/FatturazioneGeneraService.php View File

@@ -1234,7 +1234,7 @@ class FatturazioneGeneraService
1234 1234
 
1235 1235
     /**
1236 1236
      * @param  array<int, array<string, mixed>>  $voci
1237
-     * @return array<int, array{titolo: string, data: string, ore: float, uscita: ?float}>
1237
+     * @return array<int, array{titolo: string, data: string, minuti: int, uscita: ?float}>
1238 1238
      */
1239 1239
     protected function dettaglioTicket(array $voci): array
1240 1240
     {
@@ -1244,12 +1244,19 @@ class FatturazioneGeneraService
1244 1244
         }
1245 1245
 
1246 1246
         $uscite = [];
1247
+        $minutiFatturati = [];
1248
+        $tipiOre = [FatturaRiga::TIPO_TEMPO, FatturaRiga::TIPO_EXTRA_CONTRATTO, FatturaRiga::TIPO_EXTRA_ORDINE];
1247 1249
         foreach ($voci as $voce) {
1248
-            if (($voce['tipo'] ?? '') !== FatturaRiga::TIPO_USCITA || empty($voce['annotazione_id'])) {
1250
+            if (empty($voce['annotazione_id'])) {
1249 1251
                 continue;
1250 1252
             }
1251 1253
             $id = (int) $voce['annotazione_id'];
1252
-            $uscite[$id] = round(($uscite[$id] ?? 0) + (float) ($voce['importo'] ?? 0), 2);
1254
+            if (($voce['tipo'] ?? '') === FatturaRiga::TIPO_USCITA) {
1255
+                $uscite[$id] = round(($uscite[$id] ?? 0) + (float) ($voce['importo'] ?? 0), 2);
1256
+            }
1257
+            if (in_array($voce['tipo'] ?? '', $tipiOre, true)) {
1258
+                $minutiFatturati[$id] = ($minutiFatturati[$id] ?? 0) + (int) ($voce['minuti'] ?? 0);
1259
+            }
1253 1260
         }
1254 1261
 
1255 1262
         $annotazioni = Annotazione::query()
@@ -1267,15 +1274,15 @@ class FatturazioneGeneraService
1267 1274
             $quando = $annotazione->tempo_data
1268 1275
                 ? Carbon::parse($annotazione->tempo_data)
1269 1276
                 : Carbon::parse($annotazione->created_at);
1270
-            $ore = round(((int) $annotazione->tempo_minuti) / 60, 2);
1277
+            $minuti = (int) ($minutiFatturati[$id] ?? 0);
1271 1278
             $uscita = $uscite[$id] ?? null;
1272
-            if ($ore <= 0 && ! $uscita) {
1279
+            if ($minuti <= 0 && ! $uscita) {
1273 1280
                 continue;
1274 1281
             }
1275 1282
             $righe[] = [
1276 1283
                 'titolo' => $annotazione->segnalazione?->titolo ?: 'Ticket',
1277 1284
                 'data' => $quando->format('Y-m-d H:i'),
1278
-                'ore' => $ore,
1285
+                'minuti' => $minuti,
1279 1286
                 'uscita' => $uscita,
1280 1287
             ];
1281 1288
         }

+ 3
- 3
resources/views/fatturazione/report-ticket.blade.php View File

@@ -38,7 +38,7 @@
38 38
       <tr>
39 39
         <td>{{ $riga['titolo'] }}</td>
40 40
         <td>{{ \Carbon\Carbon::parse($riga['data'])->format('d/m/Y') }}</td>
41
-        <td class="text-end">{{ $riga['ore'] > 0 ? \App\Models\Config::formatTempo((int) round($riga['ore'] * 60)) : '—' }}</td>
41
+        <td class="text-end">{{ ($riga['minuti'] ?? 0) > 0 ? \App\Models\Config::formatTempo((int) $riga['minuti']) : '—' }}</td>
42 42
         <td class="text-end">{{ !empty($riga['uscita']) ? \App\Models\Config::formatCosto($riga['uscita']) : '—' }}</td>
43 43
       </tr>
44 44
       @empty
@@ -49,12 +49,12 @@
49 49
     </tbody>
50 50
     @if(count($righe))
51 51
     @php
52
-      $oreTotali = round(collect($righe)->sum(fn ($r) => (float) ($r['ore'] ?? 0)), 2);
52
+      $minutiTotali = (int) collect($righe)->sum(fn ($r) => (int) ($r['minuti'] ?? 0));
53 53
     @endphp
54 54
     <tfoot>
55 55
       <tr>
56 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>
57
+        <td class="text-end"><strong>{{ \App\Models\Config::formatTempo($minutiTotali) }}</strong></td>
58 58
         <td></td>
59 59
       </tr>
60 60
     </tfoot>

Loading…
Cancel
Save