View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0012273 | mantisbt | time tracking | public | 2010-08-20 17:21 | 2011-12-26 07:41 |
| Reporter | clebercbr | Assigned To | |||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | new | Resolution | open | ||
| Product Version | 1.2.2 | ||||
| Summary | 0012273: Show time tracking per project (subproject) | ||||
| Description | Is interesting show summary of time spend by project. I'd a code here that is resoling my issue, may be you can use too. See attached file and changes in core\bugnote_api.php | ||||
| Additional Information | on core\bugnote_api.php /**
| ||||
| Tags | billing, feature, reporting | ||||
| Attached Files | billing_inc.php (9,623 bytes)
<?php
# MantisBT - a php based bugtracking system
# MantisBT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# MantisBT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with MantisBT. If not, see <http://www.gnu.org/licenses/>.
/**
* This include file prints out the bug bugnote_stats
* $f_bug_id must already be defined
*
* @package MantisBT
* @copyright Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
* @copyright Copyright (C) 2002 - 2010 MantisBT Team - mantisbt-dev@lists.sourceforge.net
* @link http://www.mantisbt.org
*/
/**
* Requires bugnote API
*/
require_once( 'bugnote_api.php' );
if ( !config_get('time_tracking_enabled') )
return;
?>
<a name="bugnotestats" id="bugnotestats" /><br />
<?php
collapse_open( 'bugnotestats' );
$t_today = date( "d:m:Y" );
$t_date_submitted = isset( $t_bug ) ? date( "d:m:Y", $t_bug->date_submitted ) : $t_today;
$t_bugnote_stats_from_def = $t_date_submitted;
$t_bugnote_stats_from_def_ar = explode ( ":", $t_bugnote_stats_from_def );
$t_bugnote_stats_from_def_d = $t_bugnote_stats_from_def_ar[0];
$t_bugnote_stats_from_def_m = $t_bugnote_stats_from_def_ar[1];
$t_bugnote_stats_from_def_y = $t_bugnote_stats_from_def_ar[2];
$t_bugnote_stats_from_d = gpc_get_int('start_day', $t_bugnote_stats_from_def_d);
$t_bugnote_stats_from_m = gpc_get_int('start_month', $t_bugnote_stats_from_def_m);
$t_bugnote_stats_from_y = gpc_get_int('start_year', $t_bugnote_stats_from_def_y);
$t_bugnote_stats_to_def = $t_today;
$t_bugnote_stats_to_def_ar = explode ( ":", $t_bugnote_stats_to_def );
$t_bugnote_stats_to_def_d = $t_bugnote_stats_to_def_ar[0];
$t_bugnote_stats_to_def_m = $t_bugnote_stats_to_def_ar[1];
$t_bugnote_stats_to_def_y = $t_bugnote_stats_to_def_ar[2];
$t_bugnote_stats_to_d = gpc_get_int('end_day', $t_bugnote_stats_to_def_d);
$t_bugnote_stats_to_m = gpc_get_int('end_month', $t_bugnote_stats_to_def_m);
$t_bugnote_stats_to_y = gpc_get_int('end_year', $t_bugnote_stats_to_def_y);
$f_get_bugnote_stats_button = gpc_get_string('get_bugnote_stats_button', '');
$f_bugnote_cost = gpc_get_int( 'bugnote_cost', '' );
$f_project_id = helper_get_current_project();
if ( ON == config_get( 'time_tracking_with_billing' ) ) {
$t_cost_col = true;
} else {
$t_cost_col = false;
}
?>
<form method="post" action="<?php echo form_action_self() ?>">
<?php # CSRF protection not required here - form does not result in modifications ?>
<input type="hidden" name="id" value="<?php echo isset( $f_bug_id ) ? $f_bug_id : 0 ?>" />
<table border="0" class="width100" cellspacing="0">
<tr>
<td class="form-title" colspan="4">
<?php
collapse_icon( 'bugnotestats' );
?>
<?php echo lang_get( 'time_tracking' ) ?>
</td>
</tr>
<tr class="row-2">
<td class="category" width="25%">
<?php
$t_filter = array();
$t_filter['do_filter_by_date'] = 'on';
$t_filter['start_day'] = $t_bugnote_stats_from_d;
$t_filter['start_month'] = $t_bugnote_stats_from_m;
$t_filter['start_year'] = $t_bugnote_stats_from_y;
$t_filter['end_day'] = $t_bugnote_stats_to_d;
$t_filter['end_month'] = $t_bugnote_stats_to_m;
$t_filter['end_year'] = $t_bugnote_stats_to_y;
print_filter_do_filter_by_date(true);
?>
</td>
</tr>
<?php if ( $t_cost_col ) { ?>
<tr class="row-1">
<td>
<?php echo lang_get( 'time_tracking_cost' ) ?>:
<input type="text" name="bugnote_cost" value="<?php echo $f_bugnote_cost ?>" />
</td>
</tr>
<?php } ?>
<tr>
<td class="center" colspan="2">
<input type="submit" class="button" name="get_bugnote_stats_button" value="<?php echo lang_get( 'time_tracking_get_info_button' ) ?>" />
</td>
</tr>
</table>
</form>
<?php
if ( !is_blank( $f_get_bugnote_stats_button ) ) {
$t_from = "$t_bugnote_stats_from_y-$t_bugnote_stats_from_m-$t_bugnote_stats_from_d";
$t_to = "$t_bugnote_stats_to_y-$t_bugnote_stats_to_m-$t_bugnote_stats_to_d";
$t_bugnote_stats = bugnote_stats_get_project_array( $f_project_id, $t_from, $t_to, $f_bugnote_cost );
if ( is_blank( $f_bugnote_cost ) || ( (double)$f_bugnote_cost == 0 ) ) {
$t_cost_col = false;
}
$t_prev_id = -1;
?>
<br />
<table border="0" class="width100" cellspacing="0">
<tr class="row-category-history">
<td class="small-caption">
<?php echo lang_get( 'username' ) ?>
</td>
<td class="small-caption">
<?php echo lang_get( 'time_tracking' ) ?>
</td>
<?php if ( $t_cost_col) { ?>
<td class="small-caption">
<?php echo lang_get( 'time_tracking_cost' ) ?>
</td>
<?php } ?>
</tr>
<?php
$t_sum_in_minutes = 0;
$t_user_summary = array();
$t_project_summary = array();
foreach ( $t_bugnote_stats as $t_item ) {
$t_sum_in_minutes += $t_item['sum_time_tracking'];
$t_user_summary[$t_item['username']] += $t_item['sum_time_tracking'];
$t_project_summary[$t_item['project_name']] += $t_item['sum_time_tracking'];
$t_item['sum_time_tracking'] = db_minutes_to_hhmm( $t_item['sum_time_tracking'] );
if ( $t_item['bug_id'] != $t_prev_id) {
$t_link = string_get_bug_view_link( $t_item['bug_id'] ) . ": " . string_display( $t_item['summary'] );
echo '<tr class="row-category-history"><td colspan="4">' . $t_link . "</td></tr>";
$t_prev_id = $t_item['bug_id'];
}
?>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption">
<?php echo $t_item['username'] ?>
</td>
<td class="small-caption">
<?php echo $t_item['sum_time_tracking'] ?>
</td>
<?php if ($t_cost_col) { ?>
<td>
<?php echo string_attribute( number_format( $t_item['cost'], 2 ) ); ?>
</td>
<?php } ?>
</tr>
<?php } # end for loop
?>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption">
<?php echo lang_get( 'total_time' ); ?>
</td>
<td class="small-caption">
<?php echo db_minutes_to_hhmm( $t_sum_in_minutes ); ?>
</td>
<?php if ($t_cost_col) { ?>
<td>
<?php echo string_attribute( number_format( $t_sum_in_minutes * $f_bugnote_cost / 60, 2 ) ); ?>
</td>
<?php } ?>
</tr>
</table>
<br />
<br />
<table border="0" class="width100" cellspacing="0">
<tr class="row-category-history">
<td class="small-caption">
<?php echo lang_get( 'username' ) ?>
</td>
<td class="small-caption">
<?php echo lang_get( 'time_tracking' ) ?>
</td>
<?php if ( $t_cost_col) { ?>
<td class="small-caption">
<?php echo lang_get( 'time_tracking_cost' ) ?>
</td>
<?php } ?>
</tr>
<?php
foreach ( $t_user_summary as $t_username => $t_total_time ) {
?>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption">
<?php echo $t_username; ?>
</td>
<td class="small-caption">
<?php echo db_minutes_to_hhmm($t_total_time); ?>
</td>
<?php if ($t_cost_col) { ?>
<td>
<?php echo string_attribute( number_format( $t_total_time * $f_bugnote_cost / 60, 2 ) ); ?>
</td>
<?php } ?>
</tr>
<?php } ?>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption">
<?php echo lang_get( 'total_time' ); ?>
</td>
<td class="small-caption">
<?php echo db_minutes_to_hhmm( $t_sum_in_minutes ); ?>
</td>
<?php if ($t_cost_col) { ?>
<td>
<?php echo string_attribute( number_format( $t_sum_in_minutes * $f_bugnote_cost / 60, 2 ) ); ?>
</td>
<?php } ?>
</tr>
</table>
<br />
<br />
<?php
# Summary per project
?>
<table border="0" class="width100" cellspacing="0">
<tr class="row-category-history">
<td class="small-caption">
<?php echo lang_get( 'project_name' ) ?>
</td>
<td class="small-caption">
<?php echo lang_get( 'time_tracking' ) ?>
</td>
<?php if ( $t_cost_col) { ?>
<td class="small-caption">
<?php echo lang_get( 'time_tracking_cost' ) ?>
</td>
<?php } ?>
</tr>
<?php
foreach ( $t_project_summary as $t_project_name => $t_total_time ) {
?>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption">
<?php echo $t_project_name; ?>
</td>
<td class="small-caption">
<?php echo db_minutes_to_hhmm($t_total_time); ?>
</td>
<?php if ($t_cost_col) { ?>
<td>
<?php echo string_attribute( number_format( $t_total_time * $f_bugnote_cost / 60, 2 ) ); ?>
</td>
<?php } ?>
</tr>
<?php } ?>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption">
<?php echo lang_get( 'total_time' ); ?>
</td>
<td class="small-caption">
<?php echo db_minutes_to_hhmm( $t_sum_in_minutes ); ?>
</td>
<?php if ($t_cost_col) { ?>
<td>
<?php echo string_attribute( number_format( $t_sum_in_minutes * $f_bugnote_cost / 60, 2 ) ); ?>
</td>
<?php } ?>
</tr>
</table>
<?php } # end if
collapse_closed( 'bugnotestats' );
?>
<table class="width100" cellspacing="0">
<tr>
<td class="form-title" colspan="4">
<?php collapse_icon( 'bugnotestats' );
echo lang_get( 'time_tracking' ) ?>
</td>
</tr>
</table>
<?php
collapse_end( 'bugnotestats' );
| ||||
|
can it be integrated? |
|
|
Of course! |
|
|
clebercbr, I ask to who can add code to the project, can the developper add this? I'm interesting in a report with project and subproject, devide for person and for project. I want to say if i'm on a project with subproject this subproject time need to insert inside of the report of the main project. |
|
|
I mean, YES! |
|
|
clebercbr - would you be able to provide your changes as a git patch vs the latest 1.2.x code, or even better to put it on github ? If not, at least provide a regular unified diff vs 1.2.6, as there have been quite a few changes on time tracking in that release. |
|
|
i check the sql that clebercbr do in bugnote_api.php i find some problem on it. SELECT u.username, u.realname, b.summary, p.name as project_name, bn.bug_id, SUM(bn.time_tracking) AS sum_time_tracking WHERE u.id = bn.reporter_id -- This condition is for be sure that the project is connected to the request project -- $t_project_where = changed in -- This condition is for see if the user have access to the project and subproject -- This condition is for see if the project is public and user have enough level for see the datail time tracking on the project and subproject GROUP BY bn.bug_id, u.id, u.username, b.summary P.S.: the variable $user_request, $threshold_user_level, $threshold_public_level don't exist in mantis i use for mean need to use something instead. |
|
|
Sorry guys, I can't help you, I don't know mantis core deeply. Anyway, I tested ilsaul code and I had problems in my 1.2.3 version. "AND ph.parent_id = 1" "AND ((pul.user_id = $user_request AND pul.access_level >= $threshold_user_level) OR (p.view_state = 10 AND u.access_level >= $threshold_public_level))" Without that the SQL run, but result is wrong anyway. The list of notes and time sum is not correct. Also, this code cannot treat a more complex tree of projects, like big_project > child_1 > child_of_child_1 |
|
|
clebercbr the problem is some date that need to correct. SELECT u.username, u.realname, b.summary, p.name as project_name, bn.bug_id, SUM(bn.time_tracking) AS sum_time_tracking WHERE u.id = bn.reporter_id AND ph.parent_id = 1 AND ((pul.user_id = 2 AND pul.access_level >= 70) OR (p.view_state = 10 AND u.access_level >= 70)) 2 important thing i don't have the database scheme of 1.2.3 if u have problem u must check if field exist in the table. if exist that part, it can not have problem. |
|
|
clebercbr, did you do as dregad asked? has it made it into core? |
|
|
Nothing has been added to core to date, as I do not have time to do the 3-way merge and then review & test the changes against latest version. Since clebercbr apparently does not know how to do it, maybe you or someone else can volunteer ... |
|
|
I've put grouping per issue and per user into the plugin. With a migration script we could retire the entire core time reporting soon ^^ I'll add project grouping too. |
|
|
this feature is now officially included in the time tracking plugin |
|