App-TimelogTxt
view release on metacpan or search on metacpan
lib/App/TimelogTxt/Day.pm view on Meta::CPAN
package App::TimelogTxt::Day;
use warnings;
use strict;
use App::TimelogTxt::Utils;
use List::Util qw/sum/;
our $VERSION = '0.22';
sub new {
my ($class, $stamp) = @_;
die "Missing required stamp.\n" unless $stamp;
die "Invalid stamp format.\n" unless App::TimelogTxt::Utils::is_datestamp( $stamp );
return bless {
stamp => $stamp,
start => undef,
dur => 0,
tasks => {},
proj_dur => {},
last_start => 0,
}, $class;
}
sub is_empty { return !$_[0]->{dur}; }
sub is_complete { return !$_[0]->{last_start}; }
sub date_stamp { return $_[0]->{stamp}; }
sub has_tasks { return !!keys %{$_[0]->{tasks}}; }
sub update_dur
{
my ($self, $last, $epoch) = @_;
my $curr_dur = $last ? $epoch - $last->epoch : 0;
$self->{tasks}->{$last->task}->{dur} += $curr_dur if $last && $last->task;
$self->{proj_dur}->{$last->project} += $curr_dur if $last && $last->project;
$self->{dur} += $curr_dur;
return;
}
sub day_filtered_by_project
{
my ($self, $project) = @_;
my $result = __PACKAGE__->new( $self->date_stamp );
$project = qr/$project/ unless ref $project;
my @tasks = grep { $self->{tasks}->{$_}->{proj} =~ $project } keys %{$self->{tasks}};
@{$result->{tasks}}{@tasks} = @{$self->{tasks}}{@tasks};
my @projs = grep { $_ =~ $project } keys %{$self->{proj_dur}};
@{$result->{proj_dur}}{@projs} = @{$self->{proj_dur}}{@projs};
$result->{dur} = sum( 0, values %{$result->{proj_dur}} );
return $result;
}
sub close_day
{
my ($self, $last) = @_;
return if $self->is_complete();
$self->update_dur( $last, $self->day_end() );
$self->{last_start} = 0;
return;
}
sub start_task {
my ($self, $event) = @_;
if( $event->is_stop() )
{
$self->{last_start} = 0;
return;
}
my $task = $event->task;
$self->{last_start} = $event->epoch;
return if $self->{tasks}->{$task};
$self->{tasks}->{$task} = { start => $event->epoch, proj => $event->project, dur => 0 };
return;
}
sub print_day_detail {
my ($self, $fh) = @_;
$fh ||= \*STDOUT;
my ($tasks, $proj_dur) = @{$self}{ qw/tasks proj_dur/ };
my $last_proj = '';
print {$fh} "\n", _format_stamp_line( $self );
foreach my $t ( sort { ($tasks->{$a}->{proj} cmp $tasks->{$b}->{proj}) || ($tasks->{$b}->{start} <=> $tasks->{$a}->{start}) } keys %{$tasks} )
{
my $curr = $tasks->{$t};
if( $curr->{proj} ne $last_proj )
( run in 1.226 second using v1.01-cache-2.11-cpan-9581c071862 )