From: anuko Date: Sun, 12 Feb 2017 18:09:06 +0000 (+0000) Subject: Added predefined expense selector onto the expenses.php page. X-Git-Tag: timetracker_1.19-1~1575 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=9082c911245bc87179d1668a0098f473ecb8bf76;p=timetracker.git Added predefined expense selector onto the expenses.php page. --- diff --git a/WEB-INF/resources/en.lang.php b/WEB-INF/resources/en.lang.php index 99dce6ec..0bb5d81f 100644 --- a/WEB-INF/resources/en.lang.php +++ b/WEB-INF/resources/en.lang.php @@ -195,6 +195,8 @@ $i18n_key_words = array( 'label.fav_report' => 'Favorite report', 'label.cron_schedule' => 'Cron schedule', 'label.what_is_it' => 'What is it?', +'label.expense' => 'Expense', +'label.quantity' => 'Quantity', // Form titles. 'title.login' => 'Login', diff --git a/WEB-INF/resources/nl.lang.php b/WEB-INF/resources/nl.lang.php index ebe465d2..d3951a1c 100644 --- a/WEB-INF/resources/nl.lang.php +++ b/WEB-INF/resources/nl.lang.php @@ -194,6 +194,9 @@ $i18n_key_words = array( 'label.fav_report' => 'Standaard rapport', 'label.cron_schedule' => 'Cron schema', 'label.what_is_it' => 'Wat betekent dit?', +// TODO: translate the following. +// 'label.expense' => 'Expense', +// 'label.quantity' => 'Quantity', // Form titles. 'title.login' => 'Aanmelden', diff --git a/WEB-INF/resources/ru.lang.php b/WEB-INF/resources/ru.lang.php index 65594355..0c086b65 100644 --- a/WEB-INF/resources/ru.lang.php +++ b/WEB-INF/resources/ru.lang.php @@ -195,6 +195,8 @@ $i18n_key_words = array( 'label.fav_report' => 'Стандартный отчёт', 'label.cron_schedule' => 'Расписание cron', 'label.what_is_it' => 'Что это?', +'label.expense' => 'Расход', +'label.quantity' => 'Количество', // Form titles. 'title.login' => 'Вход в систему', diff --git a/WEB-INF/templates/expenses.tpl b/WEB-INF/templates/expenses.tpl index 75540046..d2105079 100644 --- a/WEB-INF/templates/expenses.tpl +++ b/WEB-INF/templates/expenses.tpl @@ -6,25 +6,33 @@ // project_names[325] = "Time Tracker"; // Project name. // Prepare an array of project ids for clients. -project_ids = new Array(); +var project_ids = new Array(); {foreach $client_list as $client} project_ids[{$client.id}] = "{$client.projects}"; {/foreach} // Prepare an array of project names. -project_names = new Array(); +var project_names = new Array(); {foreach $project_list as $project} project_names[{$project.id}] = "{$project.name|escape:'javascript'}"; {/foreach} // We'll use this array to populate project dropdown when client is not selected. var idx = 0; -projects = new Array(); +var projects = new Array(); {foreach $project_list as $project} projects[idx] = new Array("{$project.id}", "{$project.name|escape:'javascript'}"); idx++; {/foreach} // Mandatory top option for project dropdown. -empty_label_project = "{$i18n.dropdown.select|escape:'javascript'}"; +var empty_label_project = "{$i18n.dropdown.select|escape:'javascript'}"; + +// Prepare an array of predefined expenses. +idx = 0; +var defined_expenses = new Array(); +{foreach $predefined_expenses as $predefined_expense} + defined_expenses[idx] = new Array("{$predefined_expense.id}", "{$predefined_expense.name|escape:'javascript'}", "{$predefined_expense.cost}"); + idx++; +{/foreach} // The fillProjectDropdown function populates the project combo box with // projects associated with a selected client (client id is passed here as id). @@ -66,6 +74,34 @@ function get_date() { var date = new Date(); return date.strftime("%Y-%m-%d"); } + +// The recalculateCost function recalculates cost based on the current selection +// of predefined expense and quantity and also changes the comment accordingly. +function recalculateCost() { + var quantity_control = document.getElementById("quantity"); + // Set quantity to 1 if it is not set already. + if (!quantity_control.value) { + quantity_control.value = "1"; + } + + var comment_control = document.getElementById("item_name"); + var cost_control = document.getElementById("cost"); + + // Calculate cost. + var dropdown = document.getElementById("predefined_expense"); + if (dropdown.selectedIndex == 0) { + quantity_control.value = ""; + comment_control.value = ""; + cost_control.value = ""; + } else { + comment_control.value = defined_expenses[dropdown.selectedIndex - 1][1] + " - " + quantity_control.value; + var quantity = quantity_control.value; + if (isNaN(quantity)) + cost_control.value = ""; + else + cost_control.value = (quantity_control.value * defined_expenses[dropdown.selectedIndex - 1][2]).toFixed(2); + } +} {$forms.expensesForm.open} @@ -90,9 +126,20 @@ function get_date() { {$i18n.label.project} (*): {$forms.expensesForm.project.control} +{/if} +{if $predefined_expenses} + + + {$i18n.label.expense}: + {$forms.expensesForm.predefined_expense.control} + + + {$i18n.label.quantity}: + {$forms.expensesForm.quantity.control} + {/if} - {$i18n.label.item} (*): + {$i18n.label.comment} (*): {$forms.expensesForm.item_name.control} diff --git a/WEB-INF/templates/profile_edit.tpl b/WEB-INF/templates/profile_edit.tpl index 6a72508a..8c9cb8d5 100644 --- a/WEB-INF/templates/profile_edit.tpl +++ b/WEB-INF/templates/profile_edit.tpl @@ -28,9 +28,15 @@ function handlePluginCheckboxes() { taxCheckbox.style.visibility = "hidden"; taxLabel.style.visibility = "hidden"; } + var configureLabel = document.getElementById("expenses_config"); + if (expensesCheckbox.checked) { + configureLabel.style.visibility = "visible"; + } else { + configureLabel.style.visibility = "hidden"; + } var customFieldsCheckbox = document.getElementById("custom_fields"); - var configureLabel = document.getElementById("cf_config"); + configureLabel = document.getElementById("cf_config"); if (customFieldsCheckbox.checked) { configureLabel.style.visibility = "visible"; } else { @@ -185,7 +191,7 @@ function handlePluginCheckboxes() { {$forms.profileForm.expenses.control} - {$forms.profileForm.tax_expenses.control} + {$forms.profileForm.tax_expenses.control} {$i18n.label.configure} {$forms.profileForm.notifications.control} diff --git a/expenses.php b/expenses.php index 4cfc0ea5..91fabecd 100644 --- a/expenses.php +++ b/expenses.php @@ -127,6 +127,20 @@ if (MODE_PROJECTS == $user->tracking_mode || MODE_PROJECTS_AND_TASKS == $user->t 'empty'=>array(''=>$i18n->getKey('dropdown.select')))); } } +// If predefined expenses are configured, add controls to select an expense and quantity. +$predefined_expenses = ttTeamHelper::getPredefinedExpenses($user->team_id); +if ($predefined_expenses) { + $form->addInput(array('type'=>'combobox', + 'onchange'=>'recalculateCost();', + 'name'=>'predefined_expense', + 'style'=>'width: 250px;', + 'value'=>$cl_predefined_expense, + 'data'=>$predefined_expenses, + 'datakeys'=>array('id', 'name'), + 'empty'=>array(''=>$i18n->getKey('dropdown.select')))); + $form->addInput(array('type'=>'text','onchange'=>'recalculateCost();','maxlength'=>'40','name'=>'quantity','style'=>'width: 100px;','value'=>$cl_quantity)); +} + $form->addInput(array('type'=>'textarea','maxlength'=>'800','name'=>'item_name','style'=>'width: 250px; height:'.NOTE_INPUT_HEIGHT.'px;','value'=>$cl_item_name)); $form->addInput(array('type'=>'text','maxlength'=>'40','name'=>'cost','style'=>'width: 100px;','value'=>$cl_cost)); $form->addInput(array('type'=>'calendar','name'=>'date','highlight'=>'expenses','value'=>$cl_date)); // calendar @@ -183,6 +197,7 @@ if ($request->isPost()) { $smarty->assign('day_total', ttExpenseHelper::getTotalForDay($user->getActiveUser(), $cl_date)); $smarty->assign('expense_items', ttExpenseHelper::getItems($user->getActiveUser(), $cl_date)); +$smarty->assign('predefined_expenses', $predefined_expenses); $smarty->assign('client_list', $client_list); $smarty->assign('project_list', $project_list); $smarty->assign('forms', array($form->getName()=>$form->toArray()));