I cannot attach files as I get an error:
Could not upload attachment to ./files/11116_7dfdd0331cb3672dd88c49fd82077c17.
I am an experienced developer, though new to php and Mantis, and am (for better or worse) not about to read the full standards manual before adding a few bits for my own use. Asd a result they may differ from the standards, however particularly in the billing page the php is messy to start with - I have not tried to clean it up, just built on what was there.
I hope this is of use.
Mantis version used 1.1.6
Description:
Billing
you will need to add the billing detail page to the menu as a new link. This gives you the ability to:
a) sort the billing detail by Issue ID# or Date
b) select a project and see the billing for this and all sub-projects
there are 2 custom functions required:
get list of projects and subprojects (not as efficient as it might be, but MySQL does not support self-lined hierarchies so this function runs 1 sql statement for each level of projects - since there are probably likely to be 3 or 4 levels max, this is not too high an overhead.)
get the project info given this list of project ids
Time tracking
This provides a new button on the time tracking section to start the stopwatch with the time from the most recently added bugnote by this user, it saves having to remember to start the stopwatch each time if the user is working on a number of issues consecutively.
extra code in bugnote_add_inc.php from line 71, adding new button
and new function in javascript\time_tracking_stopwatch.js
I make no warranties about this code, if you wish to do so then use it at your own risk!
billing_detail_inc.php
Code: Select all
<?php
# Mantis - a php based bugtracking system
# Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
# Copyright (C) 2002 - 2007 Mantis Team - mantisbt-dev@lists.sourceforge.net
# Mantis 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.
#
# Mantis 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 Mantis. If not, see <http://www.gnu.org/licenses/>.
# --------------------------------------------------------
# $Id: billing_inc.php,v 1.14.2.1 2007-10-13 22:32:29 giallu Exp $
# --------------------------------------------------------
?>
<?php
# This include file prints out the bug bugnote_stats
# $f_bug_id must already be defined
?>
<?php
$t_core_path = config_get( 'core_path' );
require_once( 'custom_functions_inc.php' );
require_once( $t_core_path.'bugnote_api.php' );
?>
<?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_sort_order = gpc_get_string( 'sort_order', 'id' );
$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 $_SERVER['PHP_SELF']; ?>">
<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" size="7" maxlength="7" name="bugnote_cost" value="<?php echo $f_bugnote_cost ?>" />
Order <select name="sort_order">
<option <?php if ($f_sort_order == 'id') {echo 'selected="selected"'; } ?> >id</option>
<option <?php if ($f_sort_order == 'date') {echo 'selected="selected"'; } ?> >date</option>
</select>
</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_detail_get_project_array( $f_project_id, $t_from, $t_to, $f_bugnote_cost, $f_sort_order );
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"> </td>
<td class="small-caption"> </td>
<td class="small-caption">Time</td>
<td class="small-caption">Notes</td>
<?php if ( $t_cost_col) { ?>
<td align="right" class="small-caption">
<?php echo lang_get( 'time_tracking_cost' ) ?>
</td>
<?php } ?>
</tr>
<?php
$t_sum_in_minutes = 0;
$t_sum_item_in_minutes = 0;
$t_prev_id = -1;
foreach ( $t_bugnote_stats as $t_item ) {
$t_link = string_get_bug_view_link( $t_item['bug_id'] ) . ": " . string_display( $t_item['summary'] );
if ( ($f_sort_order == 'id' && $t_item['bug_id'] != $t_prev_id) || ($f_sort_order == 'date' && substr($t_item['date_submitted'], 0, 10) != $t_prev_id )) {
if ( $t_prev_id != -1) {
?>
<tr>
<td class="small-caption"><?php echo $t_item['username'] ?></td>
<td class="small-caption"><b>Total for <?php echo $t_prev_id ?></b></td>
<td class="small-caption"><b><?php echo db_minutes_to_hhmm($t_sum_item_in_minutes) ?></b></td>
<td></td>
<?php if ($t_cost_col) { ?>
<td class="small-caption" align="right" ><b>£
<?php echo string_attribute( number_format( $t_sum_item_in_minutes * $f_bugnote_cost / 60, 2 ) ); ?>
</b></td>
<?php } ?>
</tr>
<?php }
$t_sum_item_in_minutes = 0;
if ( $f_sort_order == 'id') {
echo '<tr class="row-category-history"><td colspan="5">' . $t_link . "</td></tr>";
$t_prev_id = $t_item['bug_id'];
} else {
echo '<tr class="row-category-history"><td>' . substr($t_item['date_submitted'], 0, 10) . "</td><td></td><td></td><td></td><td></td></tr>";
$t_prev_id = substr($t_item['date_submitted'], 0, 10);
}
}
$t_sum_in_minutes += $t_item['time_tracking'];
$t_sum_item_in_minutes += $t_item['time_tracking'];
?>
<tr>
<td class="small-caption"><?php echo $t_item['username'] ?></td>
<td class="small-caption">
<?php if ( $f_sort_order == "id") {
echo $t_item['date_submitted'];
} else {
echo $t_link;
} ?>
</td>
<td class="small-caption"><?php echo db_minutes_to_hhmm($t_item['time_tracking']) ?></td>
<td class="small-caption"><?php echo $t_item['note'] ?></td>
<td></td>
</tr>
<?php } # end for loop
?>
<tr>
<td class="small-caption"><b><?php echo $t_item['username'] ?></b></td>
<td class="small-caption"><b>Total for <?php echo $t_prev_id ?></b></td>
<td class="small-caption"><b><?php echo db_minutes_to_hhmm($t_sum_item_in_minutes) ?></b></td>
<td></td>
<?php if ($t_cost_col) { ?>
<td class="small-caption" align="right"><b>£
<?php echo string_attribute( number_format( $t_sum_item_in_minutes * $f_bugnote_cost / 60, 2 ) ); ?>
</b></td>
<?php } ?>
</tr>
<tr <?php echo helper_alternate_class() ?>>
<td class="small-caption"><b><?php echo lang_get( 'total_time' ); ?></td>
<td></td>
<td class="small-caption"><b><?php echo db_minutes_to_hhmm( $t_sum_in_minutes ); ?></b></td>
<?php if ($t_cost_col) { ?>
<td></td>
<td class="small-caption" align="right"><b>£
<?php echo string_attribute( number_format( $t_sum_in_minutes * $f_bugnote_cost / 60, 2 ) ); ?>
</b></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' );
?>
billing_detail_page.php
Code: Select all
<?php
# Mantis - a php based bugtracking system
# Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
# Copyright (C) 2002 - 2007 Mantis Team - mantisbt-dev@lists.sourceforge.net
# Mantis 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.
#
# Mantis 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 Mantis. If not, see <http://www.gnu.org/licenses/>.
# --------------------------------------------------------
# $Id: billingpage.php,v 1.1.2.1 2007-10-13 22:32:30 giallu Exp $
# --------------------------------------------------------
?>
<?php
require_once( 'core.php' );
$t_core_path = config_get( 'core_path' );
?>
<?php
/*
compress_enable();
*/
?>
<?php html_page_top1( lang_get( 'time_tracking_billing_link' ) ) ?>
<?php html_page_top2() ?>
<br />
<?php
$t_mantis_dir = dirname( __FILE__ ) . DIRECTORY_SEPARATOR;
?>
<!-- Jump to Bugnote add form -->
<?php
# Work break-down
include( $t_mantis_dir . 'billing_detail_inc.php' );
html_page_bottom1( __FILE__ );
?>