Update from usntable branch.
[fa-stable.git] / includes / ui / allocation_cart.inc
index 039e3bfb350632b704f7919bc819663cfec4b5cd..45bc0e8239d8955b36b5f46e4c069461c9d1514e 100644 (file)
@@ -9,8 +9,10 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
 ***********************************************************************/
-/* definition of the Debtor Receipt/Credit note allocation class */
-
+/*
+       Class for supplier/customer payment/credit allocations edition
+       and related helpers.
+*/
 //-----------------------------------------------------------------------------------
 
 class allocation 
@@ -18,23 +20,20 @@ class allocation
 
        var $trans_no; 
        var $type;
-       var $person_id;
-       var $person_name;
+       var $person_id = '';
+       var $person_name = '';
        var $date_;
-       var $amount; /*Total amount of the transaction in FX */
+       var $amount = 0; /*Total amount of the transaction in FX */
        
        var $allocs; /*array of transactions allocated to */    
 
-       function allocation($trans_no, $type, $person_id, $person_name, $amount, $date_)
+       function allocation($type, $trans_no)
        {
                $this->allocs = array();
                
                $this->trans_no = $trans_no;
                $this->type = $type;
-               $this->person_id = $person_id;
-               $this->person_name = $person_name;
-               $this->amount = $amount;
-               $this->date_ = $date_;
+               $this->read(); // read payment or credit
        }
 
        function add_item($type, $type_no, $date_, $due_date, $amount, $amount_allocated, 
@@ -80,9 +79,137 @@ class allocation
                        }  
                }
         return $this->add_item($type, $type_no, $date_, $due_date, 
-               $amount, $amount_allocated, $current_allocated);                                
+               $amount, $amount_allocated, $current_allocated);
        }                                               
 
+       //
+       //      Read payment or credit current/available allocations to cart.
+       //
+       function read($type = null, $trans_no = 0) 
+       {
+               if ($type == null) {    // re-read
+                       $type = $this->type;
+                       $trans_no = $this->trans_no;
+               }
+               
+               $sup = $type == ST_SUPPCREDIT || $type == ST_SUPPAYMENT;
+               $this->allocs = array();
+
+               if ($trans_no) {
+                       $trans = $sup ? get_supp_trans($trans_no, $type) 
+                               : get_customer_trans($trans_no, $type);
+
+                       $this->person_id = $trans[$sup ? 'supplier_id':'debtor_no'];
+                       $this->person_name = $trans[$sup ? "supplier_name":"DebtorName"];
+                       $this->amount = $trans["Total"];
+                       $this->date_ = sql2date($trans["tran_date"]);
+               } 
+               else {
+                       $this->person_id = get_post($sup ? 'supplier_id':'customer_id');
+                       $this->date_ = get_post($sup ? 'DatePaid':'DateBanked', Today());
+               }
+
+       /* Now populate the array of possible (and previous actual) allocations 
+               for this customer/supplier. First get the transactions that have 
+               outstanding balances ie Total-alloc >0 */
+
+               if ($sup)
+                       $trans_items = get_allocatable_to_supp_transactions($this->person_id);
+               else
+                       $trans_items = get_allocatable_to_cust_transactions($this->person_id);
+
+               while ($myrow = db_fetch($trans_items))
+               {
+                       $this->add_item($myrow["type"], $myrow["trans_no"],
+                               sql2date($myrow["tran_date"]),
+                               sql2date($myrow["due_date"]),
+                               $myrow["Total"], // trans total
+                               $myrow["alloc"], // trans total allocated
+                               0); // this allocation
+               }
+
+               if ($trans_no == 0) return; // this is new payment
+
+       /* Now get trans that might have previously been allocated to by this trans
+       NB existing entries where still some of the trans outstanding entered from
+       above logic will be overwritten with the prev alloc detail below */
+
+               if ($sup)
+                       $trans_items = get_allocatable_to_supp_transactions($this->person_id, 
+                               $trans_no, $type);
+               else
+                       $trans_items = get_allocatable_to_cust_transactions($this->person_id, 
+                               $trans_no, $type);
+       
+               while ($myrow = db_fetch($trans_items))
+               {
+                       $this->add_or_update_item ($myrow["type"], $myrow["trans_no"],
+                               sql2date($myrow["tran_date"]),
+                               sql2date($myrow["due_date"]),
+                               $myrow["Total"],
+                               $myrow["alloc"] - $myrow["amt"], $myrow["amt"]);
+               }
+       }
+       //
+       //      Update allocations in database.
+       //
+       function write()
+       {
+               $sup = $this->type == ST_SUPPCREDIT || $this->type == ST_SUPPAYMENT;
+
+               begin_transaction();
+
+               if ($sup)
+                       clear_supp_alloctions($this->type, $this->trans_no, $this->date_);
+               else
+                       clear_cust_alloctions($this->type, $this->trans_no, $this->date_);
+
+               // now add the new allocations
+               $total_allocated = 0;
+               foreach ($this->allocs as $alloc_item)
+               {
+                       if ($alloc_item->current_allocated > 0)
+                       {
+                               if ($sup) {
+                                       add_supp_allocation($alloc_item->current_allocated,
+                                               $this->type, $this->trans_no,
+                                       $alloc_item->type, $alloc_item->type_no, $this->date_);
+
+                                       update_supp_trans_allocation($alloc_item->type, 
+                                               $alloc_item->type_no, $alloc_item->current_allocated);
+                               } else {
+                                       add_cust_allocation($alloc_item->current_allocated,
+                                               $this->type, $this->trans_no,
+                                       $alloc_item->type, $alloc_item->type_no, $this->date_);
+                       
+                                       update_debtor_trans_allocation($alloc_item->type, 
+                                               $alloc_item->type_no, $alloc_item->current_allocated);
+                               }
+                               // Exchange Variations Joe Hunt 2008-09-20 ////////////////////
+
+                               exchange_variation($this->type, $this->trans_no,
+                                       $alloc_item->type, $alloc_item->type_no, $this->date_,
+                                       $alloc_item->current_allocated,
+                                       $sup ? PT_SUPPLIER 
+                                               : PT_CUSTOMER);
+                               
+
+                               //////////////////////////////////////////////////////////////
+                               $total_allocated += $alloc_item->current_allocated;
+                       }
+
+               }  /*end of the loop through the array of allocations made */
+               if ($sup)
+                       update_supp_trans_allocation($this->type, $this->trans_no, 
+                               $total_allocated);
+               else
+                       update_debtor_trans_allocation($this->type,     $this->trans_no, 
+                               $total_allocated);
+       
+               commit_transaction();
+
+       }
+
 } 
 
 //-----------------------------------------------------------------------------------
@@ -117,6 +244,110 @@ class allocation_item
        }
 }
 
-//-----------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+
+function show_allocatable($show_totals) {
+
+       global $table_style, $systypes_array;
+       
+    $k = $counter = $total_allocated = 0;
+
+       if (count($_SESSION['alloc']->allocs)) 
+       {
+               start_table("$table_style width=60%");
+               $th = array(_("Transaction Type"), _("#"), _("Date"), _("Due Date"), _("Amount"),
+                       _("Other Allocations"), _("This Allocation"), _("Left to Allocate"),'','');
+               table_header($th);
+
+               foreach ($_SESSION['alloc']->allocs as $alloc_item)
+           {
+                       alt_table_row_color($k);
+               label_cell($systypes_array[$alloc_item->type]);
+                       label_cell(get_trans_view_str($alloc_item->type, $alloc_item->type_no));
+               label_cell($alloc_item->date_, "align=right");
+               label_cell($alloc_item->due_date, "align=right");
+               amount_cell($alloc_item->amount);
+                       amount_cell($alloc_item->amount_allocated);
+
+               $_POST['amount' . $counter] = price_format($alloc_item->current_allocated);
+               amount_cells(null, "amount" . $counter, price_format('amount' . $counter));
+
+               $un_allocated = round($alloc_item->amount - $alloc_item->amount_allocated, 6);
+               amount_cell($un_allocated);
+                       label_cell("<a href='#' name=Alloc$counter onclick='allocate_all(this.name.substr(5));return true;'>"
+                                . _("All") . "</a>");
+                       label_cell("<a href='#' name=DeAll$counter onclick='allocate_none(this.name.substr(5));return true;'>"
+                                . _("None") . "</a>".hidden("un_allocated" . $counter, 
+                                price_format($un_allocated), false));
+                       end_row();
+
+               $total_allocated += input_num('amount' . $counter);
+                   $counter++;
+               }
+               if ($show_totals) {
+               label_row(_("Total Allocated"), price_format($total_allocated),
+                       "colspan=6 align=right", "align=right id='total_allocated'", 3);
+                       $amount = $_SESSION['alloc']->amount;
+
+                       if ($_SESSION['alloc']->type == 21 || $_SESSION['alloc']->type == 22) 
+                               $amount = -$amount;
+                       
+                       if ($amount - $total_allocated < 0)
+               {
+                       $font1 = "<font color=red>";
+                       $font2 = "</font>";
+           }
+               else
+                       $font1 = $font2 = "";
+                       $left_to_allocate = price_format($amount - $total_allocated);
+               label_row(_("Left to Allocate"), $font1 . $left_to_allocate . $font2, 
+                               "colspan=6 align=right", "nowrap align=right id='left_to_allocate'",
+                                3);
+               }
+               end_table(1);
+       }
+       hidden('TotalNumberOfAllocs', $counter);
+}
+//--------------------------------------------------------------------------------
+
+function check_allocations()
+{
+       global $SysPrefs;
+
+       $total_allocated = 0;
+
+       for ($counter = 0; $counter < $_POST["TotalNumberOfAllocs"]; $counter++)
+       {
+               if (!check_num('amount' . $counter, 0))
+               {
+                       display_error(_("The entry for one or more amounts is invalid or negative."));
+                       set_focus('amount'.$counter);
+                       return false;
+                }
+
+                 /*Now check to see that the AllocAmt is no greater than the
+                amount left to be allocated against the transaction under review */
+                if (input_num('amount' . $counter) > get_post('un_allocated' . $counter))
+                {
+                    //$_POST['amount' . $counter] = $_POST['un_allocated' . $counter];
+                }
+
+                $_SESSION['alloc']->allocs[$counter]->current_allocated = input_num('amount' . $counter);
+
+                $total_allocated += input_num('amount' . $counter);
+       }
+
+       $amount = $_SESSION['alloc']->amount;
+       if ($_SESSION['alloc']->type == 21 || $_SESSION['alloc']->type == 22) 
+               $amount = -$amount;
+
+       if ($total_allocated - ($amount + input_num('discount'))  > $SysPrefs->allocation_settled_allowance())
+       {
+               display_error(_("These allocations cannot be processed because the amount allocated is more than the total amount left to allocate."));
+               return false;
+       }
+
+       return true;
+}
 
 ?>