Merged changes up to 2.3.16 into unstable
[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 $from_loc;
24         var $to_loc;
25         var $tran_date;
26         var $transfer_type;
27         var $increase;
28         var $memo_;
29         var $branch_id;
30         var $reference;
31         var $original_amount;
32         
33         function items_cart($type)
34         {
35                 $this->trans_type = $type;
36                 $this->clear_items();
37         }
38
39         // --------------- line item functions
40
41         function add_to_cart($line_no, $stock_id, $qty, $standard_cost, $description=null)
42         {
43
44                 if (isset($stock_id) && $stock_id != "" && isset($qty))
45                 {
46                         $this->line_items[$line_no] = new line_item($stock_id, $qty,
47                                 $standard_cost, $description);
48                         return true;
49                 }
50                 else
51                 {
52                         // shouldn't come here under normal circumstances
53                         display_error("unexpected - adding an invalid item or null quantity", "", true);
54                 }
55
56                 return false;
57         }
58
59         function find_cart_item($stock_id)
60         {
61                 foreach($this->line_items as $line_no=>$line) {
62                         if ($line->stock_id == $stock_id)
63                                 return $this->line_items[$line_no];
64                 }
65                 return null;
66         }
67
68         function update_cart_item($line_no, $qty, $standard_cost)
69         {
70                 $this->line_items[$line_no]->quantity = $qty;
71                 $this->line_items[$line_no]->standard_cost = $standard_cost;
72         }
73
74         function remove_from_cart($line_no)
75         {
76                 array_splice($this->line_items, $line_no, 1);
77         }
78
79         function count_items()
80         {
81                 return count($this->line_items);
82         }
83
84         function check_qoh($location, $date_, $reverse=false)
85         {
86                 foreach ($this->line_items as $line_no => $line_item)
87                 {
88                         $item_ret = $line_item->check_qoh($location, $date_, $reverse);
89                         if ($item_ret != null)
90                                 return $line_no;
91                 }
92                 return -1;
93         }
94
95         // ----------- GL item functions
96
97         function add_gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null, $person_id=null)
98         {
99                 if (isset($code_id) && $code_id != "" && isset($amount) && isset($dimension_id)  &&
100                         isset($dimension2_id))
101                 {
102                         $this->gl_items[] = new gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description, $person_id);
103                         return true;
104                 }
105                 else
106                 {
107                         // shouldn't come here under normal circumstances
108                         display_error("unexpected - invalid parameters in add_gl_item($code_id, $dimension_id, $dimension2_id, $amount,...)", "", true);
109                 }
110
111                 return false;
112         }
113
114         function update_gl_item($index, $code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null, $person_id=null)
115         {
116             $this->gl_items[$index]->code_id = $code_id;
117             $this->gl_items[$index]->person_id = $person_id;
118
119                 $gl_type = is_subledger_account($code_id, $person_id);
120                 if ($gl_type)
121                 {
122                         $this->gl_items[$index]->person_type_id = $gl_type > 0 ? PT_CUSTOMER : PT_SUPPLIER;
123                         $this->gl_items[$index]->person_name = get_subaccount_name($code_id, $person_id);
124                 } else
125                 {
126                         $this->gl_items[$index]->person_type_id = $this->gl_items[$index]->person_name = '';
127                 }
128                 $this->gl_items[$index]->dimension_id = $dimension_id;
129                 $this->gl_items[$index]->dimension2_id = $dimension2_id;
130                 $this->gl_items[$index]->amount = $amount;
131                 $this->gl_items[$index]->reference = $reference;
132                 if ($description == null)
133                         $this->gl_items[$index]->description = get_gl_account_name($code_id);
134                 else
135                         $this->gl_items[$index]->description = $description;
136
137         }
138
139         function remove_gl_item($index)
140         {
141                 array_splice($this->gl_items, $index, 1);
142         }
143
144         function count_gl_items()
145         {
146                 return count($this->gl_items);
147         }
148
149         function gl_items_total()
150         {
151                 $total = 0;
152                 foreach ($this->gl_items as $gl_item)
153                         $total += $gl_item->amount;
154                 return $total;
155         }
156
157         function gl_items_total_debit()
158         {
159                 $total = 0;
160                 foreach ($this->gl_items as $gl_item)
161                 {
162                         if ($gl_item->amount > 0)
163                                 $total += $gl_item->amount;
164                 }
165                 return $total;
166         }
167
168         function gl_items_total_credit()
169         {
170                 $total = 0;
171                 foreach ($this->gl_items as $gl_item)
172                 {
173                         if ($gl_item->amount < 0)
174                                 $total += $gl_item->amount;
175                 }
176                 return $total;
177         }
178
179         // ------------ common functions
180
181         function clear_items()
182         {
183         unset($this->line_items);
184                 $this->line_items = array();
185
186         unset($this->gl_items);
187                 $this->gl_items = array();
188
189         }
190         //
191         //      Check if cart contains virtual subaccount (AP/AR) postings
192         //
193         function has_sub_accounts()
194         {
195                 foreach ($this->gl_items as $gl_item)
196                 {
197                         if ($gl_item->person_id)
198                                 return true;
199                 }
200                 return false;
201         }
202 }
203
204 //--------------------------------------------------------------------------------------------
205
206 class line_item
207 {
208         var $stock_id;
209         var $item_description;
210         var $units;
211         var $mb_flag;
212
213         var $quantity;
214         var $price;
215         var $standard_cost;
216
217         function line_item ($stock_id, $qty, $standard_cost=null, $description=null)
218         {
219                 $item_row = get_item($stock_id);
220
221                 if ($item_row == null)
222                         display_error("invalid item added to order : $stock_id", "");
223
224                 $this->mb_flag = $item_row["mb_flag"];
225                 $this->units = $item_row["units"];
226
227                 if ($description == null)
228                         $this->item_description = $item_row["description"];
229                 else
230                         $this->item_description = $description;
231
232                 if ($standard_cost == null)
233                         $this->standard_cost = $item_row["actual_cost"];
234                 else
235                         $this->standard_cost = $standard_cost;
236
237                 $this->stock_id = $stock_id;
238                 $this->quantity = $qty;
239                 //$this->price = $price;
240                 $this->price = 0;
241         }
242
243         function check_qoh($location, $date_, $reverse)
244         {
245                 global $SysPrefs;
246                 
247         if (!$SysPrefs->allow_negative_stock())
248         {
249                         if (has_stock_holding($this->mb_flag))
250                         {
251                                 $quantity = $this->quantity;
252                                 if ($reverse)
253                                         $quantity = -$this->quantity;
254
255                                 if ($quantity >= 0)
256                                         return null;
257
258                                 $qoh = get_qoh_on_date($this->stock_id, $location, $date_);
259                         if ($quantity + $qoh < 0)
260                         {
261                                 return $this;
262                         }
263                 }
264         }
265
266         return null;
267         }
268 }
269
270 //---------------------------------------------------------------------------------------
271
272 class gl_item
273 {
274
275         var $code_id;
276         var $dimension_id;
277         var $dimension2_id;
278         var $amount;
279         var $reference;
280         var $description;
281         var $person_id;
282         var $person_type_id;
283         var $person_name;
284
285         function gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference,
286                 $description=null, $person_id=null)
287         {
288                 //echo "adding $index, $code_id, $dimension_id, $amount, $reference<br>";
289
290                 if ($description == null)
291                         $this->description = get_gl_account_name($code_id);
292                 else
293                         $this->description = $description;
294
295                 $this->code_id = $code_id;
296                 $this->person_id = $person_id;
297                 $gl_type = is_subledger_account($code_id, $person_id);
298                 if ($gl_type)
299                 {
300                         $this->person_type_id = $gl_type > 0 ? PT_CUSTOMER : PT_SUPPLIER;
301                         $this->person_name = get_subaccount_name($code_id, $person_id);
302                 }
303                 $this->dimension_id = $dimension_id;
304                 $this->dimension2_id = $dimension2_id;
305                 $this->amount = $amount;
306                 $this->reference = $reference;
307         }
308 }
309
310 //---------------------------------------------------------------------------------------
311
312 ?>