2008-12-15 17:22:26 +03:00
|
|
|
#!/usr/bin/perl -wT
|
2014-07-21 16:23:16 +04:00
|
|
|
# "Old" version of "Today Worktime" page for mass-filling worktime information (CustIS Bug 12253)
|
|
|
|
# Author(s): Stas Fomin, Vitaliy Filippov
|
|
|
|
# License: Dual-license GPL 3.0+ or MPL 1.1+
|
2008-12-15 17:22:26 +03:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
use lib qw(. lib);
|
2011-06-30 21:22:37 +04:00
|
|
|
use POSIX qw(floor);
|
2008-12-15 17:22:26 +03:00
|
|
|
|
|
|
|
use Bugzilla;
|
2014-10-21 18:52:58 +04:00
|
|
|
use Bugzilla::Token;
|
2010-12-13 19:21:05 +03:00
|
|
|
use Bugzilla::Error;
|
2008-12-15 17:22:26 +03:00
|
|
|
use Bugzilla::Bug;
|
2015-01-14 10:38:22 +03:00
|
|
|
use Bugzilla::Util;
|
2010-12-13 19:21:05 +03:00
|
|
|
use Bugzilla::Product;
|
2009-08-04 22:50:12 +04:00
|
|
|
use Bugzilla::Search;
|
2010-06-29 21:26:09 +04:00
|
|
|
use Bugzilla::Search::Saved;
|
2008-12-16 21:04:30 +03:00
|
|
|
use Bugzilla::Constants;
|
2014-08-18 16:13:01 +04:00
|
|
|
use Bugzilla::CheckerUtils;
|
2014-08-18 17:10:04 +04:00
|
|
|
use Bugzilla::FixWorktimePage;
|
2010-10-01 18:20:33 +04:00
|
|
|
|
2008-12-15 17:22:26 +03:00
|
|
|
my $user = Bugzilla->login(LOGIN_REQUIRED);
|
|
|
|
my $userid = $user->id;
|
|
|
|
|
|
|
|
my $template = Bugzilla->template;
|
|
|
|
my $dbh = Bugzilla->dbh;
|
|
|
|
my $vars = {};
|
2014-07-30 16:02:24 +04:00
|
|
|
my $ARGS = Bugzilla->input_params;
|
2008-12-15 17:22:26 +03:00
|
|
|
|
2014-07-21 16:23:16 +04:00
|
|
|
my ($lastdays) = $ARGS->{lastdays} =~ /^(\d+)$/;
|
2008-12-15 17:22:26 +03:00
|
|
|
$vars->{lastdays} = $lastdays ||= '1';
|
|
|
|
|
2011-06-09 15:23:39 +04:00
|
|
|
sub add_wt
|
|
|
|
{
|
2011-06-10 15:52:53 +04:00
|
|
|
# Merge $t time and $c comment for bug $id into $wtime hashref
|
2011-06-09 15:23:39 +04:00
|
|
|
my ($wtime, $id, $t, $c) = @_;
|
|
|
|
push @{$wtime->{IDS}}, $id unless $wtime->{$id};
|
2011-06-10 15:52:53 +04:00
|
|
|
$t =~ tr/,/./;
|
2011-06-30 21:22:37 +04:00
|
|
|
$t = floor(100*$t+0.5)/100;
|
2011-06-09 15:23:39 +04:00
|
|
|
$wtime->{$id}->{time} += $t;
|
|
|
|
push @{$wtime->{$id}->{comments} ||= []}, $c if $c;
|
|
|
|
}
|
|
|
|
|
2011-06-10 15:52:53 +04:00
|
|
|
# Read buglist from query params
|
|
|
|
my @idlist;
|
2014-07-21 16:23:16 +04:00
|
|
|
foreach (keys %$ARGS)
|
2011-06-10 15:52:53 +04:00
|
|
|
{
|
|
|
|
if (/^wtime_(\d+)/)
|
|
|
|
{
|
|
|
|
my $id = $1;
|
2014-07-21 16:23:16 +04:00
|
|
|
push @idlist, $id if $ARGS->{$_} || $ARGS->{"comm_$id"} ||
|
|
|
|
$ARGS->{"oldrtime_$id"} ne $ARGS->{"newrtime_$id"};
|
2011-06-10 15:52:53 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-21 16:23:16 +04:00
|
|
|
my @lines = split("\n", $ARGS->{worktime});
|
2008-12-15 17:22:26 +03:00
|
|
|
if (@idlist || @lines)
|
|
|
|
{
|
2014-10-21 18:52:58 +04:00
|
|
|
check_token_data($ARGS->{token}, 'fill-day-worktime');
|
2011-06-09 15:23:39 +04:00
|
|
|
my $wtime = { IDS => [] };
|
2010-10-01 18:20:33 +04:00
|
|
|
foreach my $id (@idlist)
|
2008-12-15 17:22:26 +03:00
|
|
|
{
|
2014-07-21 16:23:16 +04:00
|
|
|
add_wt($wtime, $id, $ARGS->{"wtime_$id"}, $ARGS->{"comm_$id"});
|
2008-12-15 17:22:26 +03:00
|
|
|
}
|
2011-06-09 15:23:39 +04:00
|
|
|
foreach my $line (@lines)
|
2008-12-15 17:22:26 +03:00
|
|
|
{
|
2011-06-30 21:22:37 +04:00
|
|
|
# New, intuitive format: BUG_ID <space> TIME <space> COMMENT
|
2014-10-21 18:52:58 +04:00
|
|
|
if ($line =~ /^\D*(\d+)\s+(?:(-?\d[\d\.\,]*)|(\d+):(\d{2}))(?:\s+(.*))?$/iso)
|
2011-06-30 21:22:37 +04:00
|
|
|
{
|
|
|
|
my ($id, $time, $comment) = ($1, $3 ? $3+$4/60 : $2, $5);
|
|
|
|
add_wt($wtime, $id, $time, $comment);
|
|
|
|
}
|
2011-06-09 15:23:39 +04:00
|
|
|
# TODO REMOVE IT NAHREN :)
|
|
|
|
# This is some VERY OLD format: dd.mm.yyyy hh:mm - hh:mm <word> - BUG nnn
|
|
|
|
# hh:mm - hh:mm is start time - end time, <word> is matched but ignored
|
2011-06-30 21:22:37 +04:00
|
|
|
elsif ($line =~ /\s*(\d?\d.\d\d.[1-9]?\d?\d\d\s)?\s*((\d?\d):(\d\d)\s*-\s*(\d?\d):(\d\d)\s+)?([\w\/]+)\s*(-\s*(BUG|\()?\s*([1-9]\d*)(.*))/iso)
|
2008-12-15 17:22:26 +03:00
|
|
|
{
|
2011-06-09 15:23:39 +04:00
|
|
|
my $time = (($5 * 60 + $6) - ($3 * 60 + $4)) / 60;
|
|
|
|
$time = 0 if $time < 0;
|
|
|
|
my $id = $10;
|
|
|
|
my $comment = $line;
|
|
|
|
if (!$id)
|
2008-12-15 17:22:26 +03:00
|
|
|
{
|
2011-06-09 15:23:39 +04:00
|
|
|
ThrowUserError('object_not_specified', { class => 'Bugzilla::Bug' });
|
2008-12-15 17:22:26 +03:00
|
|
|
}
|
2011-06-09 15:23:39 +04:00
|
|
|
add_wt($wtime, $id, $time, $comment);
|
2008-12-15 17:22:26 +03:00
|
|
|
}
|
2011-06-09 15:23:39 +04:00
|
|
|
}
|
2011-08-26 18:40:49 +04:00
|
|
|
Bugzilla->request_cache->{checkers_hide_error} = 1;
|
|
|
|
my $rollback = 0;
|
|
|
|
$dbh->bz_start_transaction();
|
2011-06-09 15:23:39 +04:00
|
|
|
foreach my $id (@{$wtime->{IDS}})
|
|
|
|
{
|
2011-07-26 14:43:12 +04:00
|
|
|
$dbh->bz_start_transaction();
|
2014-08-18 17:10:04 +04:00
|
|
|
if (!Bugzilla::FixWorktimePage::FixWorktime($id, $wtime->{$id}->{time}, join("\n", @{$wtime->{$id}->{comments} || []})))
|
2011-08-26 18:40:49 +04:00
|
|
|
{
|
|
|
|
$rollback = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$dbh->bz_commit_transaction();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($rollback)
|
|
|
|
{
|
|
|
|
# Rollback all changes if some are blocked by Checkers
|
|
|
|
# Note that there is no support for "non-fatal" checks,
|
|
|
|
# and the warning with "do what i say..." text is not shown
|
|
|
|
Bugzilla->dbh->bz_rollback_transaction();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Bugzilla->dbh->bz_commit_transaction();
|
2008-12-15 17:22:26 +03:00
|
|
|
}
|
2014-08-18 16:13:01 +04:00
|
|
|
Bugzilla::CheckerUtils::show_checker_errors();
|
2014-10-21 18:52:58 +04:00
|
|
|
delete_token($ARGS->{token});
|
2014-07-21 16:23:16 +04:00
|
|
|
print Bugzilla->cgi->redirect(-location => "fill-day-worktime.cgi?lastdays=" . $lastdays);
|
2008-12-15 17:22:26 +03:00
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
2014-07-24 18:12:49 +04:00
|
|
|
my $query = Bugzilla::Search::Saved->new({ name => 'MyWorktimeBugs' });
|
2008-12-15 17:22:26 +03:00
|
|
|
|
|
|
|
my $sqlquery = "";
|
2014-07-24 18:12:49 +04:00
|
|
|
if ($query)
|
2008-12-15 17:22:26 +03:00
|
|
|
{
|
2014-07-21 16:23:16 +04:00
|
|
|
my $search = new Bugzilla::Search(
|
2014-07-24 18:12:49 +04:00
|
|
|
params => http_decode_query($query->query),
|
2010-12-07 20:24:44 +03:00
|
|
|
fields => [ "bugs.bug_id" ],
|
2008-12-15 17:22:26 +03:00
|
|
|
);
|
2011-07-25 18:56:02 +04:00
|
|
|
$sqlquery = $search->bugid_query;
|
2008-12-15 17:22:26 +03:00
|
|
|
}
|
|
|
|
|
2014-10-24 19:01:10 +04:00
|
|
|
$sqlquery = " UNION $sqlquery" if $sqlquery;
|
2008-12-15 17:22:26 +03:00
|
|
|
|
2014-10-24 16:49:49 +04:00
|
|
|
my $tm = $dbh->sql_date_math('CURRENT_DATE', '-', $lastdays-1, 'DAY');
|
2013-04-11 17:18:18 +04:00
|
|
|
my $join = $dbh->isa('Bugzilla::DB::Mysql') ? 'STRAIGHT_JOIN' : 'JOIN';
|
2008-12-15 17:22:26 +03:00
|
|
|
my $bugsquery = "
|
2010-12-13 19:21:05 +03:00
|
|
|
SELECT b.*, p.name product, c.name component, p.notimetracking product_notimetracking,
|
2010-12-06 17:04:25 +03:00
|
|
|
ROUND(b.remaining_time,1) remaining_time,
|
|
|
|
ROUND(SUM(l.work_time),2) all_work_time,
|
|
|
|
ROUND(SUM(
|
|
|
|
CASE WHEN l.bug_when >= $tm AND l.who=$userid
|
|
|
|
THEN l.work_time
|
|
|
|
ELSE 0 END
|
|
|
|
),2) today_work_time
|
2013-04-11 17:18:18 +04:00
|
|
|
FROM (
|
2010-12-06 17:04:25 +03:00
|
|
|
SELECT bugs.bug_id FROM longdescs ll, bugs
|
|
|
|
WHERE ll.bug_when >= $tm AND ll.who=? AND ll.bug_id=bugs.bug_id
|
2008-12-15 17:22:26 +03:00
|
|
|
UNION
|
2010-12-06 17:04:25 +03:00
|
|
|
SELECT bugs.bug_id FROM bugs_activity aa, bugs
|
|
|
|
WHERE aa.bug_when >= $tm AND aa.who=? AND aa.bug_id=bugs.bug_id
|
2008-12-15 17:22:26 +03:00
|
|
|
$sqlquery
|
2013-04-11 17:18:18 +04:00
|
|
|
) t $join bugs b ON t.bug_id=b.bug_id
|
|
|
|
LEFT JOIN longdescs l ON l.bug_id=b.bug_id
|
|
|
|
INNER JOIN products p ON p.id=b.product_id
|
|
|
|
INNER JOIN components c ON c.id=b.component_id
|
2010-12-06 17:04:25 +03:00
|
|
|
GROUP BY b.bug_id, b.priority, b.short_desc, p.name, c.name, b.remaining_time
|
2008-12-15 17:22:26 +03:00
|
|
|
ORDER BY today_work_time DESC, priority ASC
|
|
|
|
";
|
|
|
|
|
2014-10-21 18:52:58 +04:00
|
|
|
$vars->{token} = issue_session_token('fill-day-worktime');
|
|
|
|
|
2010-12-06 17:04:25 +03:00
|
|
|
$vars->{bugs} = $dbh->selectall_arrayref($bugsquery, {Slice=>{}}, $userid, $userid) || [];
|
2008-12-15 17:22:26 +03:00
|
|
|
|
|
|
|
($vars->{timestamp}) = $dbh->selectrow_array("SELECT NOW()");
|
2014-10-24 16:49:49 +04:00
|
|
|
($vars->{totaltime}) = $dbh->selectrow_array("SELECT ROUND(SUM(work_time),2) FROM longdescs WHERE bug_when >= ".$dbh->sql_date_math('CURRENT_DATE', '-', '?', 'DAY')." AND who=?", undef, $lastdays-1, $userid);
|
2010-12-06 17:04:25 +03:00
|
|
|
($vars->{prevdate1}) = $dbh->selectrow_array("SELECT DATE(MAX(bug_when)) FROM longdescs WHERE bug_when < CURRENT_DATE AND who=?", undef, $userid);
|
2008-12-15 17:22:26 +03:00
|
|
|
|
|
|
|
$vars->{totaltime} ||= 0;
|
|
|
|
|
|
|
|
$template->process('worktime/todaybugs.html.tmpl', $vars)
|
|
|
|
|| ThrowTemplateError($template->error());
|
|
|
|
|
|
|
|
exit;
|