Added predefined expense selector onto the expenses.php page.
authoranuko <support@anuko.com>
Sun, 12 Feb 2017 18:09:06 +0000 (18:09 +0000)
committeranuko <support@anuko.com>
Sun, 12 Feb 2017 18:09:06 +0000 (18:09 +0000)
WEB-INF/resources/en.lang.php
WEB-INF/resources/nl.lang.php
WEB-INF/resources/ru.lang.php
WEB-INF/templates/expenses.tpl
WEB-INF/templates/profile_edit.tpl
expenses.php

index 99dce6e..0bb5d81 100644 (file)
@@ -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',
index ebe465d..d3951a1 100644 (file)
@@ -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',
index 6559435..0c086b6 100644 (file)
@@ -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' => 'Вход в систему',
index 7554004..d210507 100644 (file)
@@ -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);
+  }
+}
 </script>
 
 {$forms.expensesForm.open}
@@ -90,9 +126,20 @@ function get_date() {
           <td align="right">{$i18n.label.project} (*):</td>
           <td>{$forms.expensesForm.project.control}</td>
         </tr>
+{/if}
+{if $predefined_expenses}
+
+        <tr>
+          <td align="right">{$i18n.label.expense}:</td>
+          <td>{$forms.expensesForm.predefined_expense.control}</td>
+        </tr>
+        <tr>
+          <td align="right">{$i18n.label.quantity}:</td>
+          <td>{$forms.expensesForm.quantity.control}</td>
+        </tr>
 {/if}
         <tr>
-          <td align="right">{$i18n.label.item} (*):</td>
+          <td align="right">{$i18n.label.comment} (*):</td>
           <td>{$forms.expensesForm.item_name.control}</td>
         </tr>
         <tr>
index 6a72508..8c9cb8d 100644 (file)
@@ -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() {
           </tr>
           <tr>
             <td align="right" nowrap>{$forms.profileForm.expenses.control}</td>
-            <td><label for="expenses">{$i18n.title.expenses}</label> {$forms.profileForm.tax_expenses.control} <span id="tax_label"><label for="tax_expenses">{$i18n.label.tax}</label></span></td>
+            <td><label for="expenses">{$i18n.title.expenses}</label> {$forms.profileForm.tax_expenses.control} <span id="tax_label"><label for="tax_expenses">{$i18n.label.tax}</label></span> <span id="expenses_config"><a href="predefined_expenses.php">{$i18n.label.configure}</a></span></td>
           </tr>
           <tr>
             <td align="right" nowrap>{$forms.profileForm.notifications.control}</td>
index 4cfc0ea..91fabec 100644 (file)
@@ -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()));