about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndinus <andinus@nand.sh>2021-08-16 19:27:41 +0530
committerAndinus <andinus@nand.sh>2021-08-16 19:27:41 +0530
commit242f220dde5570b72c1c1a06fa1da9bf1f3f8cb2 (patch)
treea203041bd7280996305db8956ccc0cfe2bab4148
parente3d7a57ee338b39d2d871ab8da7a784497d4b47d (diff)
downloadtaurus-242f220dde5570b72c1c1a06fa1da9bf1f3f8cb2.tar.gz
Add Yearly Records
Move Printing basic & common statistics to `print-basic-stats'
subroutine.
-rw-r--r--lib/Taurus/CLI.rakumod76
1 files changed, 47 insertions, 29 deletions
diff --git a/lib/Taurus/CLI.rakumod b/lib/Taurus/CLI.rakumod
index 7d80f51..8aacc7a 100644
--- a/lib/Taurus/CLI.rakumod
+++ b/lib/Taurus/CLI.rakumod
@@ -1,4 +1,5 @@
 use Taurus::Seconds;
+use Taurus::Timestamp;
 
 use CSV::Parser;
 use Terminal::UI 'ui';
@@ -14,6 +15,8 @@ multi sub MAIN (
 ) is export {
     my @logs;
     my Str %contacts{Str};
+    my Str @month-name = <Month January February March April May June
+                         July August September October November December>;
 
     my Instant $timed = now;
     my Promise $initial = start {
@@ -38,6 +41,9 @@ multi sub MAIN (
 
             # Store Duration in seconds.
             .[4] = (.[4].split(":")[0] * 60) + .[4].split(":")[1];
+
+            # Store DateTime.
+            .[3] = timestamp-to-date .[3];
         }
     };
 
@@ -45,7 +51,7 @@ multi sub MAIN (
     my $p0 = ui.panes[0];
     my $p1 = ui.panes[1];
 
-    $p0.put: t.bold ~ t.bg-cyan ~ t.black ~t.underline~ "Taurus v" ~ $?DISTRIBUTION.meta<version>;
+    $p0.put: t.bold ~ t.bg-cyan ~ t.black ~ t.underline ~ "Taurus v" ~ $?DISTRIBUTION.meta<version>;
     $p0.put: "";
 
     with ui.screen.add-frame(:4height, :40width, :center) -> $f {
@@ -68,6 +74,9 @@ multi sub MAIN (
 
     $p0.put: "- Show Records", :meta(:all);
     $p0.put: "";
+    $p0.put: "Yearly Records";
+    $p0.put: "  - $_ Records", :meta(:year($_)) for @logs.map(*.[3].year).unique;
+    $p0.put: "";
     # First list Contacts, then sorted phone numbers.
     for @logs.race.map(*.[1]).unique.sort({%contacts{$_} // "Z", $_}) {
         $p0.put: "- " ~ $_ ~ " {%contacts{$_} // ''}", :meta(:number($_));
@@ -78,49 +87,58 @@ multi sub MAIN (
     $p0.select(2);
     $p0.on: select => -> :%meta {
         my Int $fmt = 16;
-        if %meta<all> {
+        if %meta.keys.elems > 0 {
             ui.focus(:pane(1));
             $p1.clear;
-            with @logs {
-                my $outgoing = .grep(*.[2] eqv "Outgoing Call").map(*.[4]).sum;
-                my $incoming = .grep(*.[2] eqv "Incoming Call").map(*.[4]).sum;
+        }
+
+        print-basic-stats($p1, @logs) with %meta<all>;
 
-                $p1.put: "%-*s %s".sprintf($fmt, "Outgoing:", seconds-to-str($outgoing));
-                $p1.put: "%-*s %s".sprintf($fmt, "Incoming:",  seconds-to-str($incoming));
-                $p1.put: "%-*s %s".sprintf($fmt, "Total:",  seconds-to-str($outgoing + $incoming));
+        with %meta<year> -> $year {
+            $p1.put: "Year: " ~ $year;
+            $p1.put: "";
+            with @logs.grep(*.[3].year eqv $year) {
+                print-basic-stats($p1, $_);
                 $p1.put: "";
+                for .map(*.[3].month).unique -> $month {
+                    $p1.put: "%-*s %s".sprintf($fmt, @month-name[$month] ~ ":",
+                                               seconds-to-str(.grep(*.[3].month eqv $month).map(*.[4]).sum));
+                }
             }
-            $p1.select-first;
-        } elsif %meta<number> -> $num {
-            ui.focus(:pane(1));
-            $p1.clear;
+        }
+
+        with %meta<number> -> $num {
             $p1.put: "Name:   " ~ $_ with %contacts{$num};
             $p1.put: "Number: " ~ $num;
             $p1.put: "";
-            with @logs.grep(*.[1] eqv $num).cache {
-                my $outgoing = .grep(*.[2] eqv "Outgoing Call").map(*.[4]).sum;
-                my $incoming = .grep(*.[2] eqv "Incoming Call").map(*.[4]).sum;
-
-                $p1.put: "%-*s %s".sprintf($fmt, "Outgoing:", seconds-to-str($outgoing));
-                $p1.put: "%-*s %s".sprintf($fmt, "Incoming:", seconds-to-str($incoming));
-                $p1.put: "%-*s %s".sprintf($fmt, "Total:", seconds-to-str($outgoing + $incoming));
-                $p1.put: "";
-
-                $p1.put: "%-*s %d".sprintf($fmt, "Declined:",
-                                           .grep({$_.[2] eqv "Incoming Call" and $_.[4] == 0}).elems);
-                $p1.put: "%-*s %d".sprintf($fmt, "Declined (they):",
-                                           .grep({$_.[2] eqv "Outgoing Call" and $_.[4] == 0}).elems);
-                $p1.put: "%-*s %d".sprintf($fmt, "Missed Calls:",
-                                           .grep(*.[2] eqv "Missed Call").elems);
-            }
-            $p1.select-first;
+            print-basic-stats($p1, @logs.grep(*.[1] eqv $num));
         }
+        $p1.select-first;
     }
 
     ui.interact;
     ui.shutdown;
 }
 
+sub print-basic-stats($p1, @logs) {
+    constant $fmt = 16;
+    with @logs {
+        my $outgoing = .grep(*.[2] eqv "Outgoing Call").map(*.[4]).sum;
+        my $incoming = .grep(*.[2] eqv "Incoming Call").map(*.[4]).sum;
+
+        $p1.put: "%-*s %s".sprintf($fmt, "Outgoing:", seconds-to-str($outgoing));
+        $p1.put: "%-*s %s".sprintf($fmt, "Incoming:", seconds-to-str($incoming));
+        $p1.put: "%-*s %s".sprintf($fmt, "Total:", seconds-to-str($outgoing + $incoming));
+        $p1.put: "";
+
+        $p1.put: "%-*s %d".sprintf($fmt, "You Rejected:",
+                                   .grep({$_.[2] eqv "Rejected Call" and $_.[4] == 0}).elems);
+        $p1.put: "%-*s %d".sprintf($fmt, "Missed Calls:",
+                                   .grep(*.[2] eqv "Missed Call").elems);
+        $p1.put: "%-*s %d".sprintf($fmt, "Missed (they):", # Covers Not in network, Rejected.
+                                   .grep({$_.[2] eqv "Outgoing Call" and $_.[4] == 0}).elems);
+    }
+}
 
 multi sub MAIN(
     Bool :$version #= print version