Initial commit: Kimai TMS

Kimai time management system (PHP 5.6 / MySQL) with custom extensions:
- Budget tracking (ki_budget)
- Change request form (ki_changerequest)
- Invoice generation (ki_invoice)
- Expense tracking (ki_expenses)
- Flexi time (ki_flexitime)
- Export, admin panel, timesheets, tasks, summary

Database: ~900K time entries, 2,000+ users, 439 projects.
Config: includes/autoconf.php — localhost/kimai/kimai
This commit is contained in:
TMS
2026-06-18 21:20:26 +00:00
commit eb299c9131
1099 changed files with 359817 additions and 0 deletions

View File

@@ -0,0 +1,142 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#add_edit_evt').ajaxForm(function() {
if ($('#evt_grps').val() == null) {
alert("{/literal}{$kga.lang.atLeastOneGroup}{literal}");
return;
}
floaterClose();
hook_chgEvt();
});
$('#floater_innerwrap').tabs({ selected: 0 });
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}: {$kga.lang.evt}{else}{$kga.lang.new_evt}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
<li class="tab norm"><a href="#general">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.general}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#projects">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.pcts}</span>
<span class="cc">&nbsp;</span>
</a></li>
{if $sel_grp_IDs|@count gt 1}
<li class="tab norm"><a href="#groups">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.groups}</span>
<span class="cc">&nbsp;</span>
</a></li>
{/if}
<li class="tab norm"><a href="#comment">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.comment}</span>
<span class="cc">&nbsp;</span>
</a></li>
</ul>
</div>
<form id="add_edit_evt" action="processor.php" method="post">
<input name="evt_filter" type="hidden" value="0" />
<input name="axAction" type="hidden" value="add_edit_KndPctEvt" />
<input name="axValue" type="hidden" value="evt" />
<input name="id" type="hidden" value="{$id}" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="evt_name" >{$kga.lang.evt}:</label>
<input type="text" name="evt_name" id="focus" value="{$evt_name|escape:'html'}" />
</li>
<li>
<label for="evt_default_rate" >{$kga.lang.default_rate}:</label>
<input type="text" name="evt_default_rate" value="{$evt_default_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="evt_my_rate" >{$kga.lang.my_rate}:</label>
<input type="text" name="evt_my_rate" id="focus" value="{$evt_my_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="evt_visible">{$kga.lang.visibility}:</label>
<input name="evt_visible" type="checkbox" value='1' {if $evt_visible || !$id }checked="checked"{/if} />
</li>
</ul>
</fieldset>
<fieldset id="comment">
<ul>
<li>
<label for="evt_comment">{$kga.lang.comment}:</label>
<textarea class='comment' name='evt_comment' cols='30' rows='5' >{$evt_comment|escape:'html'}</textarea>
</li>
</ul>
</fieldset>
{if $sel_grp_IDs|@count gt 1}
<fieldset id="groups">
<ul>
<li>
<label for="evt_grp" >{$kga.lang.groups}:</label>
<select class="formfield" id="evt_grps" name="evt_grp[]" multiple size='5' style="width:255px">
{html_options values=$sel_grp_IDs output=$sel_grp_names selected=$grp_selection}
</select>
</li>
</ul>
</fieldset>
{else}
<input id="evt_grps" name="evt_grp[]" type="hidden" value="{$grp_selection.0|escape:'html'}" />
{/if}
<fieldset id="projects">
<ul>
<li>
<label for="evt_pct" >{$kga.lang.pcts}:</label>
<select class="formfield" name="evt_pct[]" multiple size='5' style="width:255px">
{html_options values=$sel_pct_IDs output=$sel_pct_names selected=$pct_selection}
</select>
</li>
</ul>
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}'/>
</div>
</form>
</div>

View File

@@ -0,0 +1,212 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#add_edit_knd').ajaxForm(function() {
if ($('#knd_grps').val() == null) {
alert("{/literal}{$kga.lang.atLeastOneGroup}{literal}");
return;
}
floaterClose();
hook_chgKnd();
});
$('#floater_innerwrap').tabs({ selected: 0 });
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}: {$kga.lang.knd}{else}{$kga.lang.new_knd}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
<li class="tab norm"><a href="#general">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.general}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#address">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.address}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#contact">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.contact}</span>
<span class="cc">&nbsp;</span>
</a></li>
{if $sel_grp_IDs|@count gt 1}
<li class="tab norm"><a href="#groups">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.groups}</span>
<span class="cc">&nbsp;</span>
</a></li>
{/if}
<li class="tab norm"><a href="#comment">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.comment}</span>
<span class="cc">&nbsp;</span>
</a></li>
</ul>
</div>
<form id="add_edit_knd" action="processor.php" method="post">
<input name="knd_filter" type="hidden" value="0" />
<input name="axAction" type="hidden" value="add_edit_KndPctEvt" />
<input name="axValue" type="hidden" value="knd" />
<input name="id" type="hidden" value="{$id}" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="knd_name" >{$kga.lang.knd}:</label>
<input type="text" name="knd_name" id="focus" value="{$knd_name|escape:'html'}" />
</li>
<li>
<label for="knd_vat" >{$kga.lang.vat}:</label>
<input type="text" name="knd_vat" value="{$knd_vat|escape:'html'}" />
</li>
<li>
<label for="knd_visible">{$kga.lang.visibility}:</label>
<input name="knd_visible" type="checkbox" value='1' {if $knd_visible || !$id }checked="checked"{/if} />
</li>
<li>
<label for="knd_password">{$kga.lang.password}:</label>
<input type="password" name='knd_password' cols='30' rows='3' value=""/>
{if !$knd_password}
<br/>
<img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/caution_mini.png" alt="Caution" valign=middle />
<strong style="color:red">{$kga.lang.nopassword}</strong>
{/if}
</li>
</ul>
</fieldset>
<fieldset id="comment">
<ul>
<li>
<label for="knd_comment">{$kga.lang.comment}:</label>
<textarea class='comment' name='knd_comment' cols='30' rows='3' >{$knd_comment|escape:'html'}</textarea>
</li>
</ul>
</fieldset>
{if $sel_grp_IDs|@count gt 1}
<fieldset id="groups">
<ul>
<li>
<label for="knd_grp" >{$kga.lang.groups}:</label>
<select class="formfield" id ="knd_grps" name="knd_grp[]" multiple size='3' style="width:255px">
{html_options values=$sel_grp_IDs output=$sel_grp_names selected=$grp_selection}
</select>
</li>
</ul>
</fieldset>
{else}
<input id="knd_grps" name="knd_grp[]" type="hidden" value="{$grp_selection.0|escape:'html'}" />
{/if}
<fieldset id="address">
<ul>
<li>
<label for="knd_company" >{$kga.lang.company}:</label>
<input type="text" name="knd_company" value="{$knd_company|escape:'html'}" />
</li>
<li>
<label for="knd_contact" >{$kga.lang.contactPerson}:</label>
<input type="text" name="knd_contact" value="{$knd_contact|escape:'html'}" />
</li>
<li>
<label for="knd_street" >{$kga.lang.street}:</label>
<input type="text" name="knd_street" value="{$knd_street|escape:'html'}" />
</li>
<li>
<label for="knd_zipcode" >{$kga.lang.zipcode}:</label>
<input type="text" name="knd_zipcode" value="{$knd_zipcode|escape:'html'}" />
</li>
<li>
<label for="knd_city" >{$kga.lang.city}:</label>
<input type="text" name="knd_city" value="{$knd_city|escape:'html'}" />
</li>
</ul>
</fieldset>
<fieldset id="contact">
<ul>
<li>
<label for="knd_tel" >{$kga.lang.telephon}:</label>
<input type="text" name="knd_tel" value="{$knd_tel|escape:'html'}" />
</li>
<li>
<label for="knd_fax" >{$kga.lang.fax}:</label>
<input type="text" name="knd_fax" value="{$knd_fax|escape:'html'}" />
</li>
<li>
<label for="knd_mobile" >{$kga.lang.mobilephone}:</label>
<input type="text" name="knd_mobile" value="{$knd_mobile|escape:'html'}" />
</li>
<li>
<label for="knd_mail" >{$kga.lang.mail}:</label>
<input type="text" name="knd_mail" value="{$knd_mail|escape:'html'}" />
</li>
<li>
<label for="knd_homepage" >{$kga.lang.homepage}:</label>
<input type="text" name="knd_homepage" value="{$knd_homepage|escape:'html'}" />
</li>
</ul>
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}' />
</div>
</form>
</div>

View File

@@ -0,0 +1,161 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#addPct').ajaxForm(function() {
if ($('#pct_grps').val() == null) {
alert("{/literal}{$kga.lang.atLeastOneGroup}{literal}");
return;
}
floaterClose();
hook_chgPct();
hook_chgEvt();
});
$('#floater_innerwrap').tabs({ selected: 0 });
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}: {$kga.lang.pct}{else}{$kga.lang.new_pct}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
<li class="tab norm"><a href="#general">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.general}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#money">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.budget}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#evts">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.evts}</span>
<span class="cc">&nbsp;</span>
</a></li>
{if $sel_grp_IDs|@count gt 1}
<li class="tab norm"><a href="#groups">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.groups}</span>
<span class="cc">&nbsp;</span>
</a></li>
{/if}
<li class="tab norm"><a href="#comment">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.comment}</span>
<span class="cc">&nbsp;</span>
</a></li>
</ul>
</div>
<form id="addPct" action="processor.php" method="post">
<input name="pct_filter" type="hidden" value="0" />
<input name="axAction" type="hidden" value="add_edit_KndPctEvt" />
<input name="axValue" type="hidden" value="pct" />
<input name="id" type="hidden" value="{$id}" />
<div id="floater_tabs" class="floater_content">
<fieldset id ="general">
<ul>
<li>
<label for="pct_name" >{$kga.lang.pct}:</label>
<input type="text" name="pct_name" id="focus" value="{$pct_name|escape:'html'}" />
</li>
<li>
<label for="pct_kndID" >{$kga.lang.knd}:</label>
<select class="formfield" name="pct_kndID">
{html_options values=$sel_knd_IDs output=$sel_knd_names selected=$knd_selection}
</select>
</li>
<li>
<label for="pct_visible">{$kga.lang.visibility}:</label>
<input name="pct_visible" type="checkbox" value='1' {if $pct_visible || !$id}checked="checked"{/if} />
</li>
<li>
<label for="pct_internal" >{$kga.lang.internalProject}:</label>
<input type="checkbox" name="pct_internal" value='1' {if $pct_internal}checked="checked"{/if} />
</li>
</ul>
</fieldset>
<fieldset id ="money">
<ul>
<li>
<label for="pct_default_rate" >{$kga.lang.default_rate}:</label>
<input type="text" name="pct_default_rate" value="{$pct_default_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="pct_my_rate" >{$kga.lang.my_rate}:</label>
<input type="text" name="pct_my_rate" value="{$pct_my_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="pct_budget">{$kga.lang.budget}:</label>
<input type='text' name='pct_budget' cols='30' rows='5' value="{$pct_budget|replace:'.':$kga.conf.decimalSeparator|escape:'html'}"/>
</li>
</ul>
</fieldset>
<fieldset id="evts">
<ul>
<li>
<label for="pct_comment">{$kga.lang.evts}:</label>
<select class="formfield" name="pct_evt[]" multiple size='5' style="width:255px">
{html_options values=$sel_evt_IDs output=$sel_evt_names selected=$evt_selection}
</select>
</li>
</ul>
</fieldset>
{if $sel_grp_IDs|@count gt 1}
<fieldset id="groups">
<ul>
<li>
<label for="pct_grp" >{$kga.lang.groups}:</label>
<select class="formfield" id="pct_grps" name="pct_grp[]" multiple size='5' style="width:255px">
{html_options values=$sel_grp_IDs output=$sel_grp_names selected=$grp_selection}
</select>
</li>
</ul>
</fieldset>
{else}
<input id="pct_grps" name="pct_grp[]" type="hidden" value="{$grp_selection.0|escape:'html'}" />
{/if}
<fieldset id="comment">
<ul>
<li>
<label for="pct_comment">{$kga.lang.comment}:</label>
<textarea class='comment' name='pct_comment' cols='30' rows='5' >{$pct_comment|escape:'html'}</textarea>
</li>
</ul>
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}' />
</div>
</form>
</div>

View File

@@ -0,0 +1,17 @@
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{$kga.lang.about} Kimai</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="floater_content">
<h2>Kimai - Open Source Time Tracking</h2>
v{$kga.version}.{$kga.revision} - &copy; {$devtimespan} by the Kimai Core-Development-Team<br />
{$kga.lang.credits}
</div>
</div>

View File

@@ -0,0 +1,142 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
var options = {
beforeSubmit: function() {
if ( ($('#password').val() != "" || $('#retypePassword').val() != "")
&& !validatePassword($('#password').val(),$('#retypePassword').val()))
return false;
window.location.reload();
}
};
$('#core_prefs').ajaxForm(options);
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{$kga.lang.preferences}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="floater_content">
<form id="core_prefs" action="processor.php" method="post">
<fieldset>
<ul>
<li>
<label for="skin">{$kga.lang.skin}:</label>
<select name="skin">
{html_options values=$skins output=$skins selected=$kga.conf.skin}
</select>
</li>
<li>
<label for="pw">{$kga.lang.newPassword}:</label>
<input type="password" name="pw" size="9" id="password" /> {$kga.lang.minLength}
</li>
<li>
<label for="pw">{$kga.lang.retypePassword}:</label>
<input type="password" name="retypePassword" size="9" id="retypePassword" />
</li>
<li>
<label for="rate">{$kga.lang.my_rate}:</label>
<input type="text" name="rate" size="9" value="{$rate|replace:'.':$kga.conf.decimalSeparator}"/>
</li>
<li>
<label for="rowlimit">{$kga.lang.rowlimit}:</label>
<input type="text" name="rowlimit" value="{$kga.conf.rowlimit}" size="9" />
</li>
<li>
<label for="lang">{$kga.lang.lang}:</label>
<select name="lang">
{html_options values=$langs output=$langs selected=$kga.conf.lang}
</select>
</li>
<li>
<label for="timezone">{$kga.lang.timezone}:</label>
<select name="timezone">
{html_options values=$timezones output=$timezones selected=$kga.conf.timezone}
</select>
</li>
<li>
{$kga.lang.sublistAnnotations}:
<select name="sublistAnnotations">
<option value="0" {if $kga.conf.sublistAnnotations==0}selected="selected"{/if}>{$kga.lang.timelabel}</option>
<option value="1" {if $kga.conf.sublistAnnotations==1}selected="selected"{/if}>{$kga.lang.xp_ext.costs}</option>
<option value="2" {if $kga.conf.sublistAnnotations==2}selected="selected"{/if}>{$kga.lang.timelabel} &amp; {$kga.lang.xp_ext.costs}</option>
</select>
</li>
<li>
<label for="autoselection"></label>
<input type="checkbox" name="autoselection" value="1" {if $kga.conf.autoselection}checked{/if} /> {$kga.lang.autoselection}
</li>
<li>
{$kga.lang.quickdelete}:
<select name="quickdelete">
<option value="0" {if $kga.conf.quickdelete==0}selected="selected"{/if}>{$kga.lang.quickdeleteHide}</option>
<option value="1" {if $kga.conf.quickdelete==1}selected="selected"{/if}>{$kga.lang.quickdeleteShow}</option>
<option value="2" {if $kga.conf.quickdelete==2}selected="selected"{/if}>{$kga.lang.quickdeleteShowConfirm}</option>
</select>
</li>
<li>
<label for="flip_pct_display"></label>
<input type="checkbox" name="flip_pct_display" value="1" {if $kga.conf.flip_pct_display}checked{/if} /> {$kga.lang.flip_pct_display}
</li>
<li>
<label for="pct_comment_flag"></label>
<input type="checkbox" name="pct_comment_flag" value="1" {if $kga.conf.pct_comment_flag}checked{/if} /> {$kga.lang.pct_comment_flag}
</li>
<li>
<label for="showIDs"></label>
<input type="checkbox" name="showIDs" value="1" {if $kga.conf.showIDs}checked{/if} /> {$kga.lang.showIDs}
</li>
<li>
<label for="noFading"></label>
<input type="checkbox" name="noFading" value="1" {if $kga.conf.noFading}checked{/if} /> {$kga.lang.noFading}
</li>
<li>
<label for="user_list_hidden"></label>
<input type="checkbox" name="user_list_hidden" value="1" {if $kga.conf.user_list_hidden}checked{/if} /> {$kga.lang.user_list_hidden}
</li>
<li>
<label for="hideClearedEntries"></label>
<input type="checkbox" name="hideClearedEntries" value="1" {if $kga.conf.hideClearedEntries}checked{/if} /> {$kga.lang.hideClearedEntries}
</li>
</ul>
<input name="axAction" type="hidden" value="editPrefs" />
<input name="id" type="hidden" value="0" />
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}' />
</div>
</fieldset>
</form>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{$kga.lang.securityWarning}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="floater_content" style="padding:20px">
<h2 style="color:red">{$kga.lang.securityWarning}</h2>
<b>{$kga.lang.installerWarningHeadline}</b> <br/><br/>
{$kga.lang.installerWarningText}
</div>
</div>

View File

@@ -0,0 +1,180 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#help').hide();
var availableEndDay = 9;
var availableStartDay = 9;
var tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
var tpl_jasper_url = tpl_template[0].tpl_jasper_url;
var tpl_jasper_usr = tpl_template[0].tpl_jasper_usr;
var tpl_jasper_pwd = tpl_template[0].tpl_jasper_pwd;
availableEndDay = tpl_template[0].tpl_start_weekday;
availableStartDay = tpl_template[0].tpl_end_weekday;
function disableEndDays(date) {
var day = date.getDay();
if(availableEndDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableEndDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
function disableStartDays(date) {
var day = date.getDay();
if(availableStartDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableStartDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
$('#tpl_ID').change(function(){
var x = document.getElementById("tpl_ID").selectedIndex;
tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
for (var i = 0; i < tpl_template.length; i++){
// look for the entry with a matching `code` value
if (tpl_template[i].tpl_index == x){
// we found it
tpl_jasper_url = tpl_template[i].tpl_jasper_url;
tpl_jasper_usr = tpl_template[i].tpl_jasper_usr;
tpl_jasper_pwd = tpl_template[i].tpl_jasper_pwd;
availableEndDay = tpl_template[i].tpl_start_weekday;
availableStartDay = tpl_template[i].tpl_end_weekday;
}
}
//availableEndDay = tpl_end_weekday; // disable wednesdays
$("#select_in_day").datepicker("refresh");
});
$('#tpl_view_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
if (fromdate != '' && todate != ''){
var urlstring = 'https://tms.alteram.co.za/digital.php'.concat("?from_date=", fromdate, "&to_date=", todate, "&kimaiuserid=", user_id, "&reportid=", tpl_jasper_url);
//var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".html?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
}else{
window.alert("Please select date range!");
}
});
$('#tpl_download_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
if (fromdate != '' && todate != ''){
var urlstring = 'https://tms.alteram.co.za/manual.php'.concat("?from_date=", fromdate, "&to_date=", todate, "&kimaiuserid=", user_id, "&reportid=", tpl_jasper_url);
// var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".pdf?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
}else{
window.alert("Please select date range!");
}
});
setupDatePicker()
function setupDatePicker(){
$('#select_in_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableEndDays,
onSelect: function(dateText, instance) {
$('#select_out_day').datepicker( "option", $('#select_in_day').datepicker("getDate") );
}
});
$('#select_out_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableStartDays,
onSelect: function(dateText, instance) {
$('#select_in_day').datepicker( "option", $('#select_out_day').datepicker("getDate") );
}
});
}
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}{else}{$kga.lang.printtimesheet}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
<a href="#" class="help" onClick="$(this).blur(); $('#help').slideToggle();">{$kga.lang.help}</a>
</div>
</div>
<div id="help">
<div class="content">
{$kga.lang.dateAndTimeHelp}
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
</ul>
</div>
<form id="mn_ext_form_add_edit_record" action="../extensions/ki_timesheets/processor.php" method="post">
<input name="id" type="hidden" value="{$id}" />
<input name="axAction" type="hidden" value="add_edit_record" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="tpl_ID" >{$kga.lang.tpl}:</label>
<select class="formfield" name="tpl_ID" id="tpl_ID">
{html_options values=$sel_tpl_IDs output=$sel_tpl_names}
</select>
</li>
{* -------------------------------------------------------------------- *}
<li>
<label for="select_in_day">{$kga.lang.fromdate}:</label>
<input id='select_in_day' type='text' name='select_in_day' value='{$select_in_day|escape:'html'}' maxlength='10' size='10' tabindex='5' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
<li>
<label for="select_out_day">{$kga.lang.todate}:</label>
<input id='select_out_day' type='text' name='select_out_day' value='{$select_out_day|escape:'html'}' maxlength='10' size='10' tabindex='6' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
</ul>
</fieldset>
{* -------------------------------------------------------------------- *}
{* -------------------------------------------------------------------- *}
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' id="tpl_view_btn" type='button' value='{$kga.lang.view}'/>
<input class='btn_ok' id="tpl_download_btn" type='button' value='{$kga.lang.download}'/>
</div>
</div>
{* -------------------------------------------------------------------- *}
</form>
</div>

View File

@@ -0,0 +1,168 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#help').hide();
var availableEndDay = 9;
var availableStartDay = 9;
var tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
var tpl_jasper_url = tpl_template[0].tpl_jasper_url;
var tpl_jasper_usr = tpl_template[0].tpl_jasper_usr;
var tpl_jasper_pwd = tpl_template[0].tpl_jasper_pwd;
availableEndDay = tpl_template[0].tpl_start_weekday;
availableStartDay = tpl_template[0].tpl_end_weekday;
function disableEndDays(date) {
var day = date.getDay();
if(availableEndDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableEndDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
function disableStartDays(date) {
var day = date.getDay();
if(availableStartDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableStartDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
$('#tpl_ID').change(function(){
var x = document.getElementById("tpl_ID").selectedIndex;
tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
for (var i = 0; i < tpl_template.length; i++){
// look for the entry with a matching `code` value
if (tpl_template[i].tpl_index == x){
// we found it
tpl_jasper_url = tpl_template[i].tpl_jasper_url;
tpl_jasper_usr = tpl_template[i].tpl_jasper_usr;
tpl_jasper_pwd = tpl_template[i].tpl_jasper_pwd;
availableEndDay = tpl_template[i].tpl_start_weekday;
availableStartDay = tpl_template[i].tpl_end_weekday;
}
}
//availableEndDay = tpl_end_weekday; // disable wednesdays
$("#select_in_day").datepicker("refresh");
});
$('#tpl_view_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".html?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
});
$('#tpl_download_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".pdf?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
});
setupDatePicker()
function setupDatePicker(){
$('#select_in_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableEndDays,
onSelect: function(dateText, instance) {
$('#select_out_day').datepicker( "option", $('#select_in_day').datepicker("getDate") );
}
});
$('#select_out_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableStartDays,
onSelect: function(dateText, instance) {
$('#select_in_day').datepicker( "option", $('#select_out_day').datepicker("getDate") );
}
});
}
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}{else}{$kga.lang.printtimesheet}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
<a href="#" class="help" onClick="$(this).blur(); $('#help').slideToggle();">{$kga.lang.help}</a>
</div>
</div>
<div id="help">
<div class="content">
{$kga.lang.dateAndTimeHelp}
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
</ul>
</div>
<form id="mn_ext_form_add_edit_record" action="../extensions/ki_timesheets/processor.php" method="post">
<input name="id" type="hidden" value="{$id}" />
<input name="axAction" type="hidden" value="add_edit_record" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="tpl_ID" >{$kga.lang.tpl}:</label>
<select class="formfield" name="tpl_ID" id="tpl_ID">
{html_options values=$sel_tpl_IDs output=$sel_tpl_names}
</select>
</li>
{* -------------------------------------------------------------------- *}
<li>
<label for="select_in_day">{$kga.lang.fromdate}:</label>
<input id='select_in_day' type='text' name='select_in_day' value='{$select_in_day|escape:'html'}' maxlength='10' size='10' tabindex='5' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
<li>
<label for="select_out_day">{$kga.lang.todate}:</label>
<input id='select_out_day' type='text' name='select_out_day' value='{$select_out_day|escape:'html'}' maxlength='10' size='10' tabindex='6' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
</ul>
</fieldset>
{* -------------------------------------------------------------------- *}
{* -------------------------------------------------------------------- *}
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' id="tpl_view_btn" type='button' value='{$kga.lang.view}'/>
<input class='btn_ok' id="tpl_download_btn" type='button' value='{$kga.lang.download}'/>
</div>
{* -------------------------------------------------------------------- *}
</form>
</div>