Customer Payment, Supplier Payment: early discount support.
[fa-stable.git] / includes / ui / allocation_cart.inc
index 0596e2b2e2838d6c004ea677154dafc5a9ec938e..10ce525f671e247f3fd48e81a78c1f4e3b72e93a 100644 (file)
@@ -52,13 +52,13 @@ class allocation
        }
 
        function add_item($type, $type_no, $date_, $due_date, $amount, $amount_allocated, 
-               $current_allocated, $ref, $early_discount=0, $early_days=0)
+               $current_allocated, $ref, $early_discount=0, $early_days=0, $discount=0)
        {
                if (floatcmp($amount, 0))
                {
                        $this->allocs[count($this->allocs)] = new allocation_item($type, $type_no, 
-                               $date_, $due_date, $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days);
-                       return true;
+                               $date_, $due_date, $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days, $discount);
+                       return $this->allocs[count($this->allocs)-1];
                } 
                else 
                {
@@ -67,13 +67,13 @@ class allocation
        }
        
        function update_item($index, $type, $type_no, $date_, $due_date, 
-               $amount, $amount_allocated, $current_allocated, $ref, $early_discount=0, $early_days=0)
+               $amount, $amount_allocated, $current_allocated, $ref, $early_discount=0, $early_days=0, $discount=0)
        {
                if (floatcmp($amount, 0))
                {
                        $this->allocs[$index] = new allocation_item($type, $type_no, 
-                               $date_, $due_date, $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days);
-                       return true;
+                               $date_, $due_date, $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days, $discount);
+                       return $this->allocs[$index];
                } 
                else 
                {
@@ -82,7 +82,7 @@ class allocation
        }
        
        function add_or_update_item($type, $type_no, $date_, $due_date, 
-               $amount, $amount_allocated, $current_allocated, $ref, $early_discount=0, $early_days=0)
+               $amount, $amount_allocated, $current_allocated, $ref, $early_discount=0, $early_days=0, $discount=0)
        {
                for ($i = 0; $i < count($this->allocs); $i++) 
                {
@@ -90,11 +90,11 @@ class allocation
                        if (($item->type == $type) && ($item->type_no == $type_no)) 
                        {
                                return $this->update_item($i, $type, $type_no, $date_, $due_date, 
-                                       $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days);
+                                       $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days, $discount);
                        }
                }
         return $this->add_item($type, $type_no, $date_, $due_date, 
-               $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days);
+               $amount, $amount_allocated, $current_allocated, $ref, $early_discount, $early_days, $discount);
        }
 
        //
@@ -134,49 +134,27 @@ class allocation
                                $this->amount = $trans["Total"];
                        }
                }
-       /* 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 */
 
+       /* 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 */
                $this->allocs = array();
                if ($this->person_id)
                {
                        if ($this->person_type==PT_SUPPLIER)
-                               $trans_items = get_allocatable_to_supp_transactions($this->person_id);
+                               $trans_items = get_allocatable_to_supp_transactions($this->person_id, $this->trans_no, $this->type);
                        else
-                               $trans_items = get_allocatable_to_cust_transactions($this->person_id);
+                               $trans_items = get_allocatable_to_cust_transactions($this->person_id, $this->trans_no, $this->type);
+
                        while ($myrow = db_fetch($trans_items))
                        {
-                               $this->add_item($myrow["type"], $myrow["trans_no"],
+                               $this->add_or_update_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
-                                       $myrow["reference"], $myrow["early_discount"], $myrow["early_days"]);
+                                       $myrow["Total"], $myrow["alloc"]-$myrow["amt"], $myrow["amt"],
+                                       $myrow["reference"],
+                                       $myrow["early_discount"], $myrow["early_days"], $myrow["discount"]);
                        }
                }
-               if ($this->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 ($this->person_type==PT_SUPPLIER)
-                       $trans_items = get_allocatable_to_supp_transactions($this->person_id, 
-                               $this->trans_no, $this->type);
-               else
-                       $trans_items = get_allocatable_to_cust_transactions($this->person_id, 
-                               $this->trans_no, $this->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"], $myrow["reference"], $myrow["early_discount"], $myrow["early_days"]);
-               }
        }
        //
        //      Update allocations in database.
@@ -204,13 +182,13 @@ class allocation
                                if ($this->person_type == PT_SUPPLIER) {
                                        add_supp_allocation($amount,
                                                $this->type, $this->trans_no,
-                                       $alloc_item->type, $alloc_item->type_no, $this->person_id, $this->date_);
+                                       $alloc_item->type, $alloc_item->type_no, $this->person_id, $this->date_, round2($alloc_item->early_discount*abs($alloc_item->amount), user_price_dec()));
 
                                        update_supp_trans_allocation($alloc_item->type, $alloc_item->type_no, $this->person_id);
                                } else {
                                        add_cust_allocation($amount,
                                                $this->type, $this->trans_no,
-                                       $alloc_item->type, $alloc_item->type_no, $this->person_id, $this->date_);
+                                       $alloc_item->type, $alloc_item->type_no, $this->person_id, $this->date_, round2($alloc_item->early_discount*abs($alloc_item->amount), user_price_dec()));
 
                                        update_debtor_trans_allocation($alloc_item->type, $alloc_item->type_no, $this->person_id);
                                }
@@ -256,6 +234,7 @@ class allocation_item
        var $current_allocated;
        var $early_discount;    // nominal early payment discount according to payment terms
        var $early_days;        // days for early payment
+       var $discount_confirmed = false;
        
        function __construct($type, $type_no, $date_, $due_date, $amount, 
                $amount_allocated, $current_allocated, $ref, $early_discount=0, $early_days=0)
@@ -275,6 +254,11 @@ class allocation_item
                $this->early_discount = $early_discount;
                $this->early_days = $early_days;
        }
+
+       function confirm_discount($confirmed)
+       {
+               $this->discount_confirmed = $confirmed;
+       }
 }
 
 //--------------------------------------------------------------------------------
@@ -313,28 +297,22 @@ function show_allocatable($reallocation) {
                        $_POST['amount' . $id] = price_format($alloc_item->current_allocated);
                        
                        $un_allocated = round((abs($alloc_item->amount) - $alloc_item->amount_allocated), 6);
-                       amount_cell($un_allocated, false,'', 'maxval'.$id);
-                       if ($early_discount) {
-                               $discount = price_format($alloc_item->early_discount*abs($alloc_item->amount));
 
-                               if ($reallocation)
-                                               label_cell($discount, 'align=center');
-                                       else
-                                               check_cells(null, 'early_disc'.$id, $discount, false, false, 'align=center');
+                               amount_cell($un_allocated-$alloc_item->current_allocated, false,'', 'left'.$id);
+
+                       if ($early_discount) {
+                               $discount = round2($alloc_item->early_discount*abs($alloc_item->amount),user_price_dec());
+                                       check_cells(null, 'early_disc'.$id, price_format($discount), false, false, 'align=center');
                                        $total_discount += $discount;
                                } else {
-                                       label_cell(_("N/A"), 'align=center'); hidden('early_disc'.$id, 0);
+                                       label_cell(_("N/A"), 'align=center', 'early_disc'.$id); hidden('early_disc'.$id, 0);
                                }
                        amount_cells(null, "amount" . $id);
-                               if (0) {
-                                       label_cells('', '', '', 'colspan=2');
-                               } else {
-                                       label_cell("<a href='#' name=Alloc$id onclick='allocate_all(this.name.substr(5));return true;'>"
-                                                . _("All") . "</a>");
-                                       label_cell("<a href='#' name=DeAll$id onclick='allocate_none(this.name.substr(5));return true;'>"
-                                                . _("None") . "</a>".hidden("un_allocated" . $id, 
-                                                price_format($un_allocated), false));
-                               }
+
+                               label_cell("<a href='#' name=Alloc$id onclick='allocate_all(this.name.substr(5));return true;'>"
+                                        . _("All") . "</a>");
+                               label_cell("<a href='#' name=DeAll$id onclick='allocate_none(this.name.substr(5));return true;'>"
+                                        . _("None") . "</a>".hidden("un_allocated".$id, price_format($un_allocated), false));
                                end_row();
 
                        $total_allocated += input_num('amount' . $id);
@@ -371,7 +349,7 @@ function check_allocations()
 {
        global $SysPrefs;
 
-       $total_allocated = 0;
+       $total_allocated = $discount=0;
 
        for ($counter = 0; $counter < get_post("TotalNumberOfAllocs"); $counter++)
        {
@@ -397,11 +375,14 @@ function check_allocations()
                 $_SESSION['alloc']->allocs[$counter]->current_allocated = input_num('amount' . $counter);
 
                 $total_allocated += input_num('amount' . $counter);
-       }
 
+                $_SESSION['alloc']->allocs[$counter]->discount_confirmed = check_value('early_disc'.$counter) != 0;
+                $discount += check_value('early_disc'.$counter) 
+                       ? round2($_SESSION['alloc']->allocs[$counter]->early_discount*input_num('amount' . $counter), user_price_dec()) : 0;
+       }
        $amount = abs($_SESSION['alloc']->amount);
 
-       if ($total_allocated - ($amount + input_num('discount'))  > $SysPrefs->allocation_settled_allowance())
+       if ($total_allocated - ($amount + $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;