Selaa lähdekoodia

prima nota export chunks

FabioFratini 8 kuukautta sitten
vanhempi
commit
819d1158d6
1 muutettua tiedostoa jossa 71 lisäystä ja 63 poistoa
  1. 71 63
      app/Http/Livewire/Record.php

+ 71 - 63
app/Http/Livewire/Record.php

@@ -259,12 +259,15 @@ class Record extends Component
     }
     public function export()
     {
+        ini_set('memory_limit', '512M');
+
+        gc_enable();
+
         $letters = array('F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA');
 
         $spreadsheet = new Spreadsheet();
         $activeWorksheet = $spreadsheet->getActiveSheet();
 
-        //$activeWorksheet->setCellValue('A1', 'PrimaNota');
         $activeWorksheet->setCellValue('A1', "Data");
         $activeWorksheet->setCellValue('B1', "Causale");
         $activeWorksheet->setCellValue('C1', "Dettaglio");
@@ -297,7 +300,6 @@ class Record extends Component
                 if ($idx >= count($letters)) {
                     break;
                 }
-
                 $activeWorksheet->setCellValue($letters[$idx] . '2', "Entrate");
                 $idx++;
                 $activeWorksheet->setCellValue($letters[$idx] . '2', "Uscite");
@@ -306,7 +308,6 @@ class Record extends Component
                 if ($idx >= count($letters)) {
                     break;
                 }
-
                 $activeWorksheet->setCellValue($letters[$idx] . '2', "Entrate");
                 $idx++;
                 $activeWorksheet->setCellValue($letters[$idx] . '2', "");
@@ -315,7 +316,6 @@ class Record extends Component
                 if ($idx >= count($letters)) {
                     break;
                 }
-
                 $activeWorksheet->setCellValue($letters[$idx] . '2', "");
                 $idx++;
                 $activeWorksheet->setCellValue($letters[$idx] . '2', "Uscite");
@@ -325,62 +325,73 @@ class Record extends Component
 
         $activeWorksheet->getStyle('A1:Q1')->getFont()->setBold(true);
         $activeWorksheet->getStyle('A2:Q2')->getFont()->setBold(true);
-        // $activeWorksheet->getStyle('A1:N1')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00ff00');
 
         $count = 3;
+        $batchSize = 1000;
+        $recordsProcessed = 0;
+
+        $totalRecords = count($this->records);
+        $recordsArray = array_chunk($this->records, $batchSize, true);
+
+        foreach ($recordsArray as $recordsBatch) {
+            foreach ($recordsBatch as $causal => $record) {
+                $check = strpos($causal, "$") ? explode("$", $causal)[1] : $causal;
+
+                $parts = explode("§", $check);
+                $d = $parts[0] ?? '';
+                $c = $parts[1] ?? '';
+                $j = $parts[2] ?? '';
+                $k = $parts[3] ?? '';
+                $deleted = $parts[4] ?? '';
+                $numeroLinea = $parts[5] ?? '';
+
+                $activeWorksheet->setCellValue('A' . $count, !empty($d) ? date("d/m/Y", strtotime($d)) : '');
+                $activeWorksheet->setCellValue('B' . $count, $c);
+                $activeWorksheet->setCellValue('C' . $count, $k);
+                $activeWorksheet->setCellValue('D' . $count, $j);
+
+                $stato = ($deleted === 'DELETED') ? 'ANNULLATA' : '';
+                $activeWorksheet->setCellValue('E' . $count, $stato);
+
+                if ($stato === 'ANNULLATA') {
+                    $activeWorksheet->getStyle('E' . $count)->getFont()->getColor()->setARGB('FFFF0000');
+                }
 
-        $totals = [];
-
-        foreach ($this->records as $causal => $record) {
-
-            $check = strpos($causal, "$") ? explode("$", $causal)[1] : $causal;
-            list($d, $c, $j, $k, $deleted, $numeroLinea) = explode("§", $check);
-
-            $activeWorksheet->setCellValue('A' . $count, date("d/m/Y", strtotime($d)));
-            $activeWorksheet->setCellValue('B' . $count, $c);
-            $activeWorksheet->setCellValue('C' . $count, $k);
-            $activeWorksheet->setCellValue('D' . $count, $j);
-
-            $stato = ($deleted === 'DELETED') ? 'ANNULLATA' : '';
-            $activeWorksheet->setCellValue('E' . $count, $stato);
-
-            if ($stato === 'ANNULLATA') {
-                $activeWorksheet->getStyle('E' . $count)->getFont()->getColor()->setARGB('FFFF0000');
-            }
+                $idx = 0;
+                foreach ($this->payments as $p) {
+                    if ($idx >= count($letters) - 1) {
+                        break;
+                    }
 
-            $idx = 0;
-            foreach ($this->payments as $p) {
-                if (isset($record[$p->name])) {
+                    if (isset($record[$p->name])) {
+                        $inValue = isset($record[$p->name]["IN"]) ? formatPrice($record[$p->name]["IN"]) : "";
+                        $outValue = isset($record[$p->name]["OUT"]) ? formatPrice($record[$p->name]["OUT"]) : "";
 
-                    if (isset($record[$p->name]["IN"])) {
-                        $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($record[$p->name]["IN"]));
+                        $activeWorksheet->setCellValue($letters[$idx] . $count, $inValue);
+                        $idx++;
+                        $activeWorksheet->setCellValue($letters[$idx] . $count, $outValue);
+                        $idx++;
                     } else {
                         $activeWorksheet->setCellValue($letters[$idx] . $count, "");
-                    }
-                    $idx++;
-                    if (isset($record[$p->name]["OUT"])) {
-                        $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($record[$p->name]["OUT"]));
-                    } else {
+                        $idx++;
                         $activeWorksheet->setCellValue($letters[$idx] . $count, "");
+                        $idx++;
                     }
-                    $idx++;
-                } else {
-                    if ($idx >= count($letters)) {
-                        break;
-                    }
+                }
 
-                    $activeWorksheet->setCellValue($letters[$idx] . $count, "");
-                    $idx++;
-                    $activeWorksheet->setCellValue($letters[$idx] . $count, "");
-                    $idx++;
+                $count++;
+                $recordsProcessed++;
+
+                if ($recordsProcessed % 500 === 0) {
+                    gc_collect_cycles();
                 }
             }
 
-            $count += 1;
+            unset($recordsBatch);
+            gc_collect_cycles();
         }
 
-        $count += 1;
-
+        $count++;
         $idx = 0;
 
         $activeWorksheet->setCellValue('A' . $count, 'Totale');
@@ -390,47 +401,39 @@ class Record extends Component
         $activeWorksheet->setCellValue('E' . $count, '');
 
         foreach ($this->payments as $p) {
+            if ($idx >= count($letters) - 1) {
+                break;
+            }
+
             if (isset($this->totals[$p->name])) {
                 if ($p->type == 'ALL') {
-                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["IN"]));
+                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["IN"] ?? 0));
                     $idx++;
-                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["OUT"]));
+                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["OUT"] ?? 0));
                     $idx++;
                 } elseif ($p->type == 'IN') {
-                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["IN"]));
+                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["IN"] ?? 0));
                     $idx++;
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "");
                     $idx++;
                 } elseif ($p->type == 'OUT') {
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "");
                     $idx++;
-                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["OUT"]));
+                    $activeWorksheet->setCellValue($letters[$idx] . $count, formatPrice($this->totals[$p->name]["OUT"] ?? 0));
                     $idx++;
                 }
             } else {
                 if ($p->type == 'ALL') {
-                    if ($idx >= count($letters)) {
-                        break;
-                    }
-
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "0");
                     $idx++;
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "0");
                     $idx++;
                 } elseif ($p->type == 'IN') {
-                    if ($idx >= count($letters)) {
-                        break;
-                    }
-
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "0");
                     $idx++;
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "");
                     $idx++;
                 } elseif ($p->type == 'OUT') {
-                    if ($idx >= count($letters)) {
-                        break;
-                    }
-
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "");
                     $idx++;
                     $activeWorksheet->setCellValue($letters[$idx] . $count, "0");
@@ -446,11 +449,16 @@ class Record extends Component
         $activeWorksheet->getColumnDimension('C')->setWidth(40);
         $activeWorksheet->getColumnDimension('D')->setWidth(40);
         $activeWorksheet->getColumnDimension('E')->setWidth(20);
-        foreach ($letters as $l)
+        foreach ($letters as $l) {
             $activeWorksheet->getColumnDimension($l)->setWidth(20);
+        }
 
         $writer = new Xlsx($spreadsheet);
-        $writer->save($path = storage_path('prima_nota_' . date("YmdHis") . '.xlsx'));
+        $path = storage_path('prima_nota_' . date("YmdHis") . '.xlsx');
+        $writer->save($path);
+
+        unset($spreadsheet, $activeWorksheet, $writer);
+        gc_collect_cycles();
 
         return response()->download($path)->deleteFileAfterSend();
     }