From 43aa13b4e5d3cfb6a78c1ea3da65e4112883dc7c Mon Sep 17 00:00:00 2001
From: Daniel Barbero Martin <daniel.barbero@artica.es>
Date: Tue, 24 Sep 2019 17:39:11 +0200
Subject: [PATCH] fixed summatory series custom graph

---
 pandora_console/include/functions_graph.php | 159 +++++++++-----------
 1 file changed, 68 insertions(+), 91 deletions(-)

diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php
index d0e844c3bf..b4bbf521c5 100644
--- a/pandora_console/include/functions_graph.php
+++ b/pandora_console/include/functions_graph.php
@@ -1521,7 +1521,8 @@ function graphic_combined_module(
                         $array_data,
                         $params_combined['average'],
                         $params_combined['summatory'],
-                        $params_combined['modules_series']
+                        $params_combined['modules_series'],
+                        $date_array
                     );
                 }
             }
@@ -2222,7 +2223,7 @@ function graphic_combined_module(
  * @param boolean $average        Average.
  * @param boolean $summatory      Summatory.
  * @param boolean $modules_series Series module.
- * @param boolean $baseline       Baseline data.
+ * @param array   $date_array     Date data.
  *
  * @return array Data.
  */
@@ -2231,106 +2232,82 @@ function combined_graph_summatory_average(
     $average=false,
     $summatory=false,
     $modules_series=false,
-    $baseline=false
+    $date_array=[]
 ) {
     if (isset($array_data) && is_array($array_data)) {
+        $reduce_array = [];
         foreach ($array_data as $key => $value) {
             if (strpos($key, 'sum') !== false) {
-                $data_array_reverse[$key] = array_reverse($value['data']);
-                if (!$modules_series) {
-                    unset($array_data[$key]);
-                }
+                $last = $date_array['start_date'];
+                $reduce_array = array_reduce(
+                    $value['data'],
+                    function ($carry, $item) use ($date_array, $last, $reduce_array) {
+                        $slice_start = $date_array['start_date'];
+                        $iterator = $last;
+
+                        // JS to PHP timestamp format.
+                        $item[0] /= 1000;
+                        while ($iterator <= $date_array['final_date']) {
+                            if ($item[0] >= $slice_start && $item[0] < $iterator) {
+                                $array = [];
+                                $val = 0;
+                                $n = 0;
+
+                                if (is_array($reduce_array[$slice_start])) {
+                                    $val = $reduce_array[$slice_start]['value'];
+                                    $n = ($reduce_array[$slice_start]['n'] + 1);
+                                }
+
+                                $array['value'] = ($item[1] + $val);
+                                $array['n'] = $n;
+                                $array['t'] = ($slice_start * 1000);
+
+                                $carry[$slice_start] = $array;
+                                $last = $iterator;
+                                break;
+                            } else {
+                                $slice_start = $iterator;
+                                $iterator += 300;
+                            }
+                        }
+
+                        $i++;
+                        return $carry;
+                    },
+                    $reduce_array
+                );
+            }
+
+            if (!$modules_series) {
+                unset($array_data[$key]);
             }
         }
 
-        if (isset($data_array_reverse) && is_array($data_array_reverse)) {
-            $array_sum_reverse = [];
-            $array_avg_reverse = [];
-            $data_array_prev = false;
-            $data_array_pop = [];
-            $count = 0;
+        $reduce_array_summatory = [];
+        $reduce_array_average = [];
+        $i = 0;
+        foreach ($reduce_array as $item) {
+            $reduce_array_summatory[$i][0] = $item['t'];
+            $reduce_array_summatory[$i][1] = $item['value'];
 
-            $count_data_array_reverse = count($data_array_reverse['sum0']);
-            while ($count_data_array_reverse > 0) {
-                foreach ($data_array_reverse as $key_reverse => $value_reverse) {
-                    if (is_array($value_reverse) && count($value_reverse) > 0) {
-                        $data_array_pop[$key_reverse] = array_pop(
-                            $data_array_reverse[$key_reverse]
-                        );
-                    }
-                }
+            $reduce_array_average[$i][0] = $item['t'];
+            $reduce_array_average[$i][1] = ($item['value'] / ($item['n'] + 1));
 
-                if (isset($data_array_pop) && is_array($data_array_pop)) {
-                    $acum_data  = 0;
-                    $acum_array = [];
-                    $sum_data   = 0;
-                    $count_pop  = 0;
-                    foreach ($data_array_pop as $key_pop => $value_pop) {
-                        if ($value_pop[0] > $acum_data) {
-                            if ($acum_data != 0) {
-                                $sum_data = ($sum_data + $data_array_prev[$key_pop][1]);
-                                $data_array_reverse[$key_pop][] = $value_pop;
-                                $data_array_prev[$acum_key] = $acum_array;
-                            } else {
-                                if ($data_array_prev[$key_pop] == false) {
-                                    $data_array_prev[$key_pop] = $value_pop;
-                                }
+            $i++;
+        }
 
-                                $acum_key   = $key_pop;
-                                $acum_data  = $value_pop[0];
-                                $acum_array = $value_pop;
-                                $sum_data   = $value_pop[1];
-                            }
-                        } else if ($value_pop[0] < $acum_data) {
-                            $sum_data = ($sum_data + $data_array_prev[$key_pop][1]);
-                            $data_array_reverse[$acum_key][] = $acum_array;
-                            $data_array_prev[$key_pop] = $value_pop;
-                            $acum_key   = $key_pop;
-                            $acum_data  = $value_pop[0];
-                            $acum_array = $value_pop;
-                        } else if ($value_pop[0] == $acum_data) {
-                            $data_array_prev[$key_pop] = $value_pop;
-                            $sum_data += $value_pop[1];
-                        }
+        if ($summatory && isset($reduce_array_summatory)
+            && is_array($reduce_array_summatory)
+            && count($reduce_array_summatory) > 0
+        ) {
+            $array_data['summatory']['data'] = $reduce_array_summatory;
+        }
 
-                        $count_pop++;
-                    }
-
-                    if ($summatory) {
-                        $array_sum_reverse[$count][0] = $acum_data;
-                        $array_sum_reverse[$count][1] = $sum_data;
-                    }
-
-                    if ($average) {
-                        $array_avg_reverse[$count][0] = $acum_data;
-                        $array_avg_reverse[$count][1] = ($sum_data / $count_pop);
-                    }
-                }
-
-                $count++;
-                $count_data_array_reverse--;
-            }
-
-            if ($summatory && isset($array_sum_reverse)
-                && is_array($array_sum_reverse)
-                && count($array_sum_reverse) > 0
-            ) {
-                $array_data['summatory']['data']  = $array_sum_reverse;
-                $array_data['summatory']['color'] = 'purple';
-            }
-
-            if ($average && isset($array_avg_reverse)
-                && is_array($array_avg_reverse)
-                && count($array_avg_reverse) > 0
-            ) {
-                if ($baseline) {
-                    $array_data['baseline']['data']  = $array_avg_reverse;
-                    $array_data['baseline']['color'] = 'green';
-                } else {
-                    $array_data['average']['data']  = $array_avg_reverse;
-                    $array_data['average']['color'] = 'orange';
-                }
-            }
+        if ($average && isset($reduce_array_average)
+            && is_array($reduce_array_average)
+            && count($reduce_array_average) > 0
+        ) {
+            $array_data['average']['data'] = $reduce_array_average;
         }
 
         return $array_data;