Added paid column on invoice views.
authorNik Okuntseff <support@anuko.com>
Fri, 26 Jan 2018 14:47:47 +0000 (14:47 +0000)
committerNik Okuntseff <support@anuko.com>
Fri, 26 Jan 2018 14:47:47 +0000 (14:47 +0000)
WEB-INF/lib/ttInvoiceHelper.class.php
WEB-INF/lib/ttTeamHelper.class.php
WEB-INF/templates/footer.tpl
WEB-INF/templates/invoice_view.tpl
WEB-INF/templates/invoices.tpl

index 2784a7b..c30776c 100644 (file)
@@ -80,12 +80,9 @@ class ttInvoiceHelper {
 
   // The getInvoiceByName looks up an invoice by name.
   static function getInvoiceByName($invoice_name) {
-
     $mdb2 = getConnection();
     global $user;
-
     $sql = "select id from tt_invoices where team_id = $user->team_id and name = ".$mdb2->quote($invoice_name)." and status = 1";
-
     $res = $mdb2->query($sql);
     if (!is_a($res, 'PEAR_Error')) {
       $val = $res->fetchRow();
@@ -96,6 +93,34 @@ class ttInvoiceHelper {
     return false;
   }
 
+  // The isPaid determines if an invoice is paid by looking at the paid status of its items.
+  // If any non-paid item is found, the entire invoice is considered not paid.
+  // Therefore, the paid status of the invoice is a calculated value.
+  // This is because we maintain the paid status on individual item level.
+  static function isPaid($invoice_id) {
+
+    $mdb2 = getConnection();
+    global $user;
+
+    $sql = "select count(*) as count from tt_log where invoice_id = $invoice_id and status = 1 and paid < 1";
+    $res = $mdb2->query($sql);
+    if (!is_a($res, 'PEAR_Error')) {
+      $val = $res->fetchRow();
+      if ($val['count'] > 0)
+        return false; // A non-paid time item exists.
+    }
+    $sql = "select count(*) as count from tt_expense_items where invoice_id = $invoice_id and status = 1 and paid < 1";
+    $res = $mdb2->query($sql);
+    if (!is_a($res, 'PEAR_Error')) {
+      $val = $res->fetchRow();
+      if ($val['count'] > 0)
+        return false; // A non-paid expense item exists.
+      else
+        return true; // All time and expense items in invoice are paid.
+    }
+    return false;
+  }
+
   // The getInvoiceItems retrieves tt_log items associated with the invoice. 
   static function getInvoiceItems($invoice_id) {
     global $user;
@@ -110,7 +135,8 @@ class ttInvoiceHelper {
       $sql = "select l.date as date, 1 as type, u.name as user_name, p.name as project_name,
       t.name as task_name, l.comment as note,
       time_format(l.duration, '%k:%i') as duration,
-      cast(l.billable * u.rate * time_to_sec(l.duration)/3600 as decimal(10, 2)) as cost from tt_log l
+      cast(l.billable * u.rate * time_to_sec(l.duration)/3600 as decimal(10, 2)) as cost,
+      l.paid as paid from tt_log l
       inner join tt_users u on (l.user_id = u.id)
       left join tt_projects p on (p.id = l.project_id)
       left join tt_tasks t on (t.id = l.task_id)
@@ -119,7 +145,8 @@ class ttInvoiceHelper {
       $sql = "select l.date as date, 1 as type, u.name as user_name, p.name as project_name,
         t.name as task_name, l.comment as note,
         time_format(l.duration, '%k:%i') as duration,
-        cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10, 2)) as cost from tt_log l
+        cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10, 2)) as cost,
+        l.paid as paid from tt_log l
         inner join tt_users u on (l.user_id = u.id)
         left join tt_projects p on (p.id = l.project_id)
         left join tt_tasks t on (t.id = l.task_id)
@@ -131,7 +158,8 @@ class ttInvoiceHelper {
     if ($user->isPluginEnabled('ex')) {
       $sql_for_expense_items = "select ei.date as date, 2 as type, u.name as user_name, p.name as project_name,
         null as task_name, ei.name as note,
-        null as duration, ei.cost as cost from tt_expense_items ei
+        null as duration, ei.cost as cost,
+        ei.paid as paid from tt_expense_items ei
         inner join tt_users u on (ei.user_id = u.id)
         left join tt_projects p on (p.id = ei.project_id)
         where ei.invoice_id = $invoice_id and ei.status = 1";
index 553ab0d..9a57d9c 100644 (file)
@@ -28,6 +28,7 @@
 
 import('ttUserHelper');
 import('DateAndTime');
+import('ttInvoiceHelper');
 
 // Class ttTeamHelper - contains helper functions that operate with teams.
 class ttTeamHelper {
@@ -328,6 +329,7 @@ class ttTeamHelper {
   static function getActiveInvoices($localizeDates = true)
   {
     global $user;
+    $addPaidStatus = $user->isPluginEnabled('ps');
 
     $result = array();
     $mdb2 = getConnection();
@@ -347,6 +349,8 @@ class ttTeamHelper {
           $dt->parseVal($val['date']);
           $val['date'] = $dt->toString($user->date_format);
         }
+        if ($addPaidStatus)
+          $val['paid'] = ttInvoiceHelper::isPaid($val['id']);
         $result[] = $val;
       }
     }
index 3d0d620..5439413 100644 (file)
@@ -12,7 +12,7 @@
       <br>
       <table cellspacing="0" cellpadding="4" width="100%" border="0">
         <tr>
-          <td align="center">&nbsp;Anuko Time Tracker 1.17.5.3791 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+          <td align="center">&nbsp;Anuko Time Tracker 1.17.5.3792 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
             <a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
             <a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
             <a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
index 1ff5c83..ec8bb96 100644 (file)
@@ -29,6 +29,9 @@
           <td class="tableHeader">{$i18n.label.note}</td>
           <td class="tableHeaderCentered" width="5%">{$i18n.label.duration}</td>
           <td class="tableHeaderCentered" width="5%">{$i18n.label.cost}</td>
+  {if $user->isPluginEnabled('ps')}
+          <td class="tableHeader">{$i18n.label.paid}</td>
+  {/if}
         </tr>
   {foreach $invoice_items as $invoice_item}
         <tr bgcolor="{cycle values="#f5f5f5,#ffffff"}">
@@ -43,6 +46,9 @@
           <td valign="top">{$invoice_item.note|escape}</td>
           <td align="right" valign="top">{$invoice_item.duration}</td>
           <td align="right" valign="top">{$invoice_item.cost}</td>
+    {if $user->isPluginEnabled('ps')}
+          <td align="right" valign="top">{if $invoice_item.paid}{$i18n.label.yes}{else}{$i18n.label.no}{/if}</td>
+    {/if}
         </tr>
   {/foreach}
         <tr><td>&nbsp;</td></tr>
index 1dfd43a..0fad98d 100644 (file)
@@ -11,6 +11,9 @@
           <td class="tableHeader">{$i18n.label.invoice}</td>
           <td class="tableHeader">{$i18n.label.client}</td>
           <td class="tableHeader">{$i18n.label.date}</td>
+  {if $user->isPluginEnabled('ps')}
+          <td class="tableHeader">{$i18n.label.paid}</td>
+  {/if}
           <td class="tableHeader">{$i18n.label.view}</td>
   {if !$user->isClient()}
           <td class="tableHeader">{$i18n.label.delete}</td>
@@ -21,6 +24,9 @@
           <td>{$invoice.name|escape}</td>
           <td>{$invoice.client_name|escape}</td>
           <td>{$invoice.date}</td>
+  {if $user->isPluginEnabled('ps')}
+          <td>{if $invoice.paid}{$i18n.label.yes}{else}{$i18n.label.no}{/if}</td>
+  {/if}
           <td><a href="invoice_view.php?id={$invoice.id}">{$i18n.label.view}</a></td>
   {if !$user->isClient()}
           <td><a href="invoice_delete.php?id={$invoice.id}">{$i18n.label.delete}</a></td>