Merged changes form main trunk since 2.1RC
[fa-stable.git] / includes / ui / items_cart.inc
1 <?php
2 /**********************************************************************
3     Copyright (C) FrontAccounting, LLC.
4         Released under the terms of the GNU General Public License, GPL, 
5         as published by the Free Software Foundation, either version 3 
6         of the License, or (at your option) any later version.
7     This program is distributed in the hope that it will be useful,
8     but WITHOUT ANY WARRANTY; without even the implied warranty of
9     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
10     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 include_once($path_to_root . "/includes/prefs/sysprefs.inc");
13 include_once($path_to_root . "/inventory/includes/inventory_db.inc");
14
15 class items_cart
16 {
17         var $trans_type;
18         var $line_items;
19         var $gl_items;
20
21         var     $order_id;
22
23         var $editing_item, $deleting_item;
24
25         var $from_loc;
26         var $to_loc;
27         var $tran_date;
28         var $transfer_type;
29         var $increase;
30         var $memo_;
31         var $person_id;
32         var $branch_id;
33
34         function items_cart($type)
35         {
36                 $this->trans_type = $type;
37                 $this->clear_items();
38         }
39
40         // --------------- line item functions
41
42         function add_to_cart($line_no, $stock_id, $qty, $standard_cost, $description=null)
43         {
44
45                 if (isset($stock_id) && $stock_id != "" && isset($qty))
46                 {
47                         $this->line_items[$line_no] = new line_item($stock_id, $qty,
48                                 $standard_cost, $description);
49                         return true;
50                 }
51                 else
52                 {
53                         // shouldn't come here under normal circumstances
54                         display_db_error("unexpected - adding an invalid item or null quantity", "", true);
55                 }
56
57                 return false;
58         }
59
60         function find_cart_item($stock_id)
61         {
62                 foreach($this->line_items as $line_no=>$line) {
63                         if ($line->stock_id == $stock_id)
64                                 return $this->line_items[$line_no];
65                 }
66                 return null;
67         }
68
69         function update_cart_item($line_no, $qty, $standard_cost)
70         {
71                 $this->line_items[$line_no]->quantity = $qty;
72                 $this->line_items[$line_no]->standard_cost = $standard_cost;
73         }
74
75         function remove_from_cart($line_no)
76         {
77                 array_splice($this->line_items, $line_no, 1);
78         }
79
80         function count_items()
81         {
82                 return count($this->line_items);
83         }
84
85         function check_qoh($location, $date_, $reverse=false)
86         {
87                 foreach ($this->line_items as $line_no => $line_item)
88                 {
89                         $item_ret = $line_item->check_qoh($location, $date_, $reverse);
90                         if ($item_ret != null)
91                                 return $line_no;
92                 }
93                 return -1;
94         }
95
96         // ----------- GL item functions
97
98         function add_gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null)
99         {
100                 if (isset($code_id) && $code_id != "" && isset($amount) && isset($dimension_id)  &&
101                         isset($dimension2_id))
102                 {
103                         $this->gl_items[] = new gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description);
104                         return true;
105                 }
106                 else
107                 {
108                         // shouldn't come here under normal circumstances
109                         display_db_error("unexpected - invalid parameters in add_gl_item($code_id, $dimension_id, $dimension2_id, $amount,...)", "", true);
110                 }
111
112                 return false;
113         }
114
115         function update_gl_item($index, $dimension_id, $dimension2_id, $amount, $reference, $description=null)
116         {
117                 $this->gl_items[$index]->dimension_id = $dimension_id;
118                 $this->gl_items[$index]->dimension2_id = $dimension2_id;
119                 $this->gl_items[$index]->amount = $amount;
120                 $this->gl_items[$index]->reference = $reference;
121                 if ($description != null)
122                         $this->gl_items[$index]->description = $description;
123
124         }
125
126         function remove_gl_item($index)
127         {
128                 array_splice($this->gl_items, $index, 1);
129         }
130
131         function count_gl_items()
132         {
133                 return count($this->gl_items);
134         }
135
136         function gl_items_total()
137         {
138                 $total = 0;
139                 foreach ($this->gl_items as $gl_item)
140                         $total += $gl_item->amount;
141                 return $total;
142         }
143
144         function gl_items_total_debit()
145         {
146                 $total = 0;
147                 foreach ($this->gl_items as $gl_item)
148                 {
149                         if ($gl_item->amount > 0)
150                                 $total += $gl_item->amount;
151                 }
152                 return $total;
153         }
154
155         function gl_items_total_credit()
156         {
157                 $total = 0;
158                 foreach ($this->gl_items as $gl_item)
159                 {
160                         if ($gl_item->amount < 0)
161                                 $total += $gl_item->amount;
162                 }
163                 return $total;
164         }
165
166         // ------------ common functions
167
168         function clear_items()
169         {
170         unset($this->line_items);
171                 $this->line_items = array();
172
173         unset($this->gl_items);
174                 $this->gl_items = array();
175
176         }
177 }
178
179 //--------------------------------------------------------------------------------------------
180
181 class line_item
182 {
183         var $stock_id;
184         var $item_description;
185         var $units;
186         var $mb_flag;
187
188         var $quantity;
189         var $price;
190         var $standard_cost;
191
192         function line_item ($stock_id, $qty, $standard_cost=null, $description=null)
193         {
194                 $item_row = get_item($stock_id);
195
196                 if ($item_row == null)
197                         display_db_error("invalid item added to order : $stock_id", "");
198
199                 $this->mb_flag = $item_row["mb_flag"];
200                 $this->units = $item_row["units"];
201
202                 if ($description == null)
203                         $this->item_description = $item_row["description"];
204                 else
205                         $this->item_description = $description;
206
207                 if ($standard_cost == null)
208                         $this->standard_cost = $item_row["actual_cost"];
209                 else
210                         $this->standard_cost = $standard_cost;
211
212                 $this->stock_id = $stock_id;
213                 $this->quantity = $qty;
214                 //$this->price = $price;
215                 $this->price = 0;
216         }
217
218         function check_qoh($location, $date_, $reverse)
219         {
220         if (!sys_prefs::allow_negative_stock())
221         {
222                         if (has_stock_holding($this->mb_flag))
223                         {
224                                 $quantity = $this->quantity;
225                                 if ($reverse)
226                                         $quantity = -$this->quantity;
227
228                                 if ($quantity >= 0)
229                                         return null;
230
231                                 $qoh = get_qoh_on_date($this->stock_id, $location, $date_);
232                         if ($quantity + $qoh < 0)
233                         {
234                                 return $this;
235                         }
236                 }
237         }
238
239         return null;
240         }
241 }
242
243 //---------------------------------------------------------------------------------------
244
245 class gl_item
246 {
247
248         var $code_id;
249         var $dimension_id;
250         var $dimension2_id;
251         var $amount;
252         var $reference;
253         var $description;
254
255         function gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference,
256                 $description=null)
257         {
258                 //echo "adding $index, $code_id, $dimension_id, $amount, $reference<br>";
259
260                 if ($description == null)
261                         $this->description = get_gl_account_name($code_id);
262                 else
263                         $this->description = $description;
264
265                 $this->code_id = $code_id;
266                 $this->dimension_id = $dimension_id;
267                 $this->dimension2_id = $dimension2_id;
268                 $this->amount = $amount;
269                 $this->reference = $reference;
270         }
271 }
272
273 //---------------------------------------------------------------------------------------
274
275 ?>