Changes in db scheme: gl_trans.type_no optimized to int, changed lock_stock.reorder_l...
[fa-stable.git] / includes / ui / items_cart.inc
index a2d3e2d2e9a971494eee82baa76baa6d5de04872..c836f487fa1a869342ddd7393d6a65d5e9777471 100644 (file)
@@ -1,5 +1,14 @@
 <?php
-
+/**********************************************************************
+    Copyright (C) FrontAccounting, LLC.
+       Released under the terms of the GNU General Public License, GPL, 
+       as published by the Free Software Foundation, either version 3 
+       of the License, or (at your option) any later version.
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+    See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
+***********************************************************************/
 include_once($path_to_root . "/includes/prefs/sysprefs.inc");
 include_once($path_to_root . "/inventory/includes/inventory_db.inc");
 
@@ -9,21 +18,18 @@ class items_cart
        var $line_items;
        var $gl_items;
 
-       var $gl_item_count;
-
        var     $order_id;
 
-       var $editing_item, $deleting_item;
-
        var $from_loc;
        var $to_loc;
        var $tran_date;
        var $transfer_type;
        var $increase;
        var $memo_;
-       var $person_id;
        var $branch_id;
-
+       var $reference;
+       var $original_amount;
+       
        function items_cart($type)
        {
                $this->trans_type = $type;
@@ -44,7 +50,7 @@ class items_cart
                else
                {
                        // shouldn't come here under normal circumstances
-                       display_db_error("unexpected - adding an invalid item or null quantity", "", true);
+                       display_error("unexpected - adding an invalid item or null quantity", "", true);
                }
 
                return false;
@@ -67,7 +73,7 @@ class items_cart
 
        function remove_from_cart($line_no)
        {
-                       unset($this->line_items[$line_no]);
+               array_splice($this->line_items, $line_no, 1);
        }
 
        function count_items()
@@ -75,56 +81,81 @@ class items_cart
                return count($this->line_items);
        }
 
+       /*
+               Checks cart quantities on document_date.
+               Returns array of stock_ids which stock quantities would go negative on some day.
+       */
        function check_qoh($location, $date_, $reverse=false)
        {
+               $low_stock = array();
+
+               // collect quantities by stock_id
+               $qtys = array();
                foreach ($this->line_items as $line_no => $line_item)
                {
-                       $item_ret = $line_item->check_qoh($location, $date_, $reverse);
-                       if ($item_ret != null)
-                               return $line_no;
+                       $qty = $reverse ? -$line_item->quantity : $line_item->quantity;
+
+                       $qtys[$line_item->stock_id]['qty'] = $qty + @$qtys[$line_item->stock_id]['qty'];
+                       $qtys[$line_item->stock_id]['line'] = $line_no;
                }
-               return -1;
+
+               foreach($qtys as $stock_id => $sum)
+               {
+                       $fail = check_negative_stock($stock_id, $sum['qty'], $location, $date_);
+                       if ($fail)
+                               $low_stock[] = $stock_id;
+               }
+
+               return $low_stock;
        }
 
        // ----------- GL item functions
 
-       function add_gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null)
+       function add_gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null, $person_id=null)
        {
                if (isset($code_id) && $code_id != "" && isset($amount) && isset($dimension_id)  &&
                        isset($dimension2_id))
                {
-                       $this->gl_items[$this->gl_item_count] = new gl_item($this->gl_item_count,
-                               $code_id, $dimension_id, $dimension2_id, $amount, $reference, $description);
-                       $this->gl_item_count++;
+                       $this->gl_items[] = new gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description, $person_id);
                        return true;
                }
                else
                {
                        // shouldn't come here under normal circumstances
-                       display_db_error("unexpected - adding an invalid item or null quantity", "", true);
+                       display_error("unexpected - invalid parameters in add_gl_item($code_id, $dimension_id, $dimension2_id, $amount,...)", "", true);
                }
 
                return false;
        }
 
-       function update_gl_item($index, $dimension_id, $dimension2_id, $amount, $reference, $description=null)
+       function update_gl_item($index, $code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null, $person_id=null)
        {
-               $this->gl_items[$index]->index = $index;
+           $this->gl_items[$index]->code_id = $code_id;
+           $this->gl_items[$index]->person_id = $person_id;
+
+               $gl_type = is_subledger_account($code_id, $person_id);
+               if ($gl_type)
+               {
+                       $this->gl_items[$index]->person_type_id = $gl_type > 0 ? PT_CUSTOMER : PT_SUPPLIER;
+                       $this->gl_items[$index]->person_name = get_subaccount_name($code_id, $person_id);
+               } else
+               {
+                       $this->gl_items[$index]->person_type_id = $this->gl_items[$index]->person_name = '';
+               }
                $this->gl_items[$index]->dimension_id = $dimension_id;
                $this->gl_items[$index]->dimension2_id = $dimension2_id;
                $this->gl_items[$index]->amount = $amount;
                $this->gl_items[$index]->reference = $reference;
-               if ($description != null)
+               if ($description == null)
+                       $this->gl_items[$index]->description = get_gl_account_name($code_id);
+               else
                        $this->gl_items[$index]->description = $description;
 
        }
 
        function remove_gl_item($index)
        {
-               if (isset($index))
-               {
-                       unset($this->gl_items[$index]);
-               }
+               array_splice($this->gl_items, $index, 1);
        }
 
        function count_gl_items()
@@ -171,9 +202,20 @@ class items_cart
 
        unset($this->gl_items);
                $this->gl_items = array();
-               $this->gl_item_count = 1;
 
        }
+       //
+       //      Check if cart contains virtual subaccount (AP/AR) postings
+       //
+       function has_sub_accounts()
+       {
+               foreach ($this->gl_items as $gl_item)
+               {
+                       if ($gl_item->person_id)
+                               return true;
+               }
+               return false;
+       }
 }
 
 //--------------------------------------------------------------------------------------------
@@ -194,7 +236,7 @@ class line_item
                $item_row = get_item($stock_id);
 
                if ($item_row == null)
-                       display_db_error("invalid item added to order : $stock_id", "");
+                       display_error("invalid item added to order : $stock_id", "");
 
                $this->mb_flag = $item_row["mb_flag"];
                $this->units = $item_row["units"];
@@ -215,9 +257,15 @@ class line_item
                $this->price = 0;
        }
 
+       /*
+               This method is generally obsolete and subject to removal in FA 2.4 (preserved for now to support 2.3 extensions).
+               Use items_cart::check_qoh instead.
+       */
        function check_qoh($location, $date_, $reverse)
        {
-       if (!sys_prefs::allow_negative_stock())
+               global $SysPrefs;
+
+       if (!$SysPrefs->allow_negative_stock())
        {
                        if (has_stock_holding($this->mb_flag))
                        {
@@ -228,11 +276,9 @@ class line_item
                                if ($quantity >= 0)
                                        return null;
 
-                               $qoh = get_qoh_on_date($this->stock_id, $location, $date_);
-                       if ($quantity + $qoh < 0)
-                       {
-                               return $this;
-                       }
+                               $fail = check_negative_stock($this->stock_id, $quantity, $location, $date_);
+                               if ($fail)
+                                       return $this;
                }
        }
 
@@ -245,16 +291,18 @@ class line_item
 class gl_item
 {
 
-       var $index;
        var $code_id;
        var $dimension_id;
        var $dimension2_id;
        var $amount;
        var $reference;
        var $description;
+       var $person_id;
+       var $person_type_id;
+       var $person_name;
 
-       function gl_item($index, $code_id, $dimension_id, $dimension2_id, $amount, $reference,
-               $description=null)
+       function gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference,
+               $description=null, $person_id=null)
        {
                //echo "adding $index, $code_id, $dimension_id, $amount, $reference<br>";
 
@@ -263,8 +311,14 @@ class gl_item
                else
                        $this->description = $description;
 
-               $this->index = $index;
                $this->code_id = $code_id;
+               $this->person_id = $person_id;
+               $gl_type = is_subledger_account($code_id, $person_id);
+               if ($gl_type)
+               {
+                       $this->person_type_id = $gl_type > 0 ? PT_CUSTOMER : PT_SUPPLIER;
+                       $this->person_name = get_subaccount_name($code_id, $person_id);
+               }
                $this->dimension_id = $dimension_id;
                $this->dimension2_id = $dimension2_id;
                $this->amount = $amount;
@@ -274,4 +328,3 @@ class gl_item
 
 //---------------------------------------------------------------------------------------
 
-?>