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 )