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 |
|