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/* Definition of the purch_order class to hold all the information for a purchase order and delivery
13*/
14
15class purch_order
16{
17
18	var $trans_type; // order/grn/invoice (direct)
19	var $line_items;
20	var $curr_code;
21	var $supp_ref;
22	var $delivery_address;
23	var $Comments;
24	var $Location;
25	var $supplier_id;
26	var $supplier_name;
27	var $orig_order_date;
28	var $due_date;
29	var $order_no; /*Only used for modification of existing orders otherwise only established when order committed */
30	var $lines_on_order = 0;
31	var $credit;
32	var $tax_group_id;
33	var $tax_group_array = null; // saves db queries
34	var $tax_included; // type of prices
35	var $terms;
36	var $ex_rate;
37
38	var $reference;
39	var $tax_overrides = array();		// array of taxes manually inserted during sales invoice entry (direct invoice)
40
41	function purch_order()
42	{
43		/*Constructor function initialises a new purchase order object */
44		$this->line_items = array();
45		$this->lines_on_order = $this->order_no = $this->supplier_id = 0;
46	}
47
48	function set_supplier($supplier_id, $supplier_name, $curr_code, $tax_group_id, $tax_included)
49	{
50		$this->supplier_id = $supplier_id;
51		$this->supplier_name = $supplier_name;
52		$this->curr_code = $curr_code;
53		$this->tax_group_id = $tax_group_id;
54		$this->tax_included = $tax_included;
55		$this->tax_group_array = get_tax_group_items_as_array($tax_group_id);
56	}
57
58	function add_to_order($line_no, $stock_id, $qty, $item_descr, $price, $uom, $req_del_date, $qty_inv, $qty_recd)
59	{
60		if (isset($qty) && $qty != 0)
61		{
62			$this->line_items[$line_no] = new po_line_details($line_no, $stock_id, $item_descr, $qty, $price, $uom,
63				$req_del_date, $qty_inv, $qty_recd);
64			$this->lines_on_order++;
65			return 1;
66		}
67		return 0;
68	}
69
70	function update_order_item($line_no, $qty, $price, $req_del_date, $description="")
71	{
72		if ($description != "")
73			$this->line_items[$line_no]->item_description = $description;
74		$this->line_items[$line_no]->quantity = $qty;
75		$this->line_items[$line_no]->price = $price;
76		$this->line_items[$line_no]->req_del_date = $req_del_date;
77		$this->line_items[$line_no]->item_description = $description;
78	}
79
80	function remove_from_order($line_no)
81	{
82		array_splice($this->line_items, $line_no, 1);
83	}
84
85	function order_has_items()
86	{
87		return count($this->line_items) != 0;
88	}
89
90	function clear_items()
91	{
92    	unset($this->line_items);
93		$this->line_items = array();
94
95		$this->lines_on_order = 0;
96		$this->order_no = 0;
97	}
98
99
100	function any_already_received()
101	{
102		/* Checks if there have been deliveries or invoiced entered against any of the line items */
103		if (count($this->line_items) > 0)
104		{
105		   	foreach ($this->line_items as $ordered_items)
106		   	{
107				if ($ordered_items->qty_received != 0 || $ordered_items->qty_inv != 0)
108				{
109					return 1;
110				}
111		   	}
112		}
113		return 0;
114	}
115
116	function some_already_received($line_no)
117	{
118		/* Checks if there have been deliveries or amounts invoiced against a specific line item */
119		if (count($this->line_items) > 0)
120		{
121		   	if ($this->line_items[$line_no]->qty_received != 0 ||
122		   		$this->line_items[$line_no]->qty_inv != 0)
123		 	{
124				return 1;
125		   	}
126		}
127		return 0;
128	}
129
130	//
131	//	Returns taxes for PO/GRN.
132	//	$receival=true in purchase receive context.
133	//
134	function get_taxes($shipping_cost=null, $receival=false)
135	{
136		$items = array();
137		$prices = array();
138		if($shipping_cost==null)
139			$shipping_cost = 0;//$this->freight_cost;
140
141		foreach ($this->line_items as $ln_itm) {
142			$items[] = $ln_itm->stock_id;
143			$prices[] = round($ln_itm->price * ($receival ? $ln_itm->receive_qty : $ln_itm->quantity),  user_price_dec());
144		}
145		$taxes = get_tax_for_items($items, $prices, $shipping_cost,
146		  $this->tax_group_id, $this->tax_included,  $this->tax_group_array);
147
148    	// Adjustment for swiss franken, we always have 5 rappen = 1/20 franken
149	    if ($this->curr_code == 'CHF') {
150			$val = $taxes['1']['Value'];
151			$val1 = (floatval((intval(round(($val*20),0)))/20));
152			$taxes['1']['Value'] = $val1;
153		}
154		foreach($this->tax_overrides as $id => $value) // add values entered manually
155		{
156			$taxes[$id]['Override'] = $value;
157		}
158		return $taxes;
159	}
160
161	/*
162		Returns order value including all taxes
163	*/
164	function get_trans_total() {
165
166		$total = 0;
167		$dec = user_price_dec();
168
169		foreach ($this->line_items as $ln_itm) {
170			$items[] = $ln_itm->stock_id;
171			$value = round($ln_itm->quantity * $ln_itm->price, $dec);
172			$prices[] =$value;
173			$total += $value;
174		}
175
176		if (!$this->tax_included ) {
177			$taxes = get_tax_for_items($items, $prices, 0, $this->tax_group_id,
178			$this->tax_included,  $this->tax_group_array);
179
180			foreach($taxes as $tax)
181				$total += round($tax['Value'], $dec);
182		}
183		return $total;
184	}
185
186} /* end of class defintion */
187
188class po_line_details
189{
190
191	var $line_no;
192	var $po_detail_rec;
193	var $grn_item_id;
194	var $stock_id;
195	var $item_description;
196	var $price;
197	var $units;
198	var $req_del_date;
199	var $tax_type;
200	var $tax_type_name;
201
202	var $quantity;		// current/entry quantity of PO line
203	var $qty_inv;	// quantity already invoiced against this line
204	var $receive_qty;	// current/entry GRN quantity
205	var $qty_received;	// quantity already received against this line
206
207	var $standard_cost;
208	var $descr_editable;
209
210	function po_line_details($line_no, $stock_item, $item_descr, $qty, $prc, $uom, $req_del_date,
211		$qty_inv, $qty_recd, $grn_item_id=0)
212	{
213
214		/* Constructor function to add a new LineDetail object with passed params */
215		$this->line_no = $line_no;
216		$this->stock_id = $stock_item;
217		$item_row = get_item($stock_item);
218		if (!$item_row)
219			return;
220
221		$this->descr_editable = $item_row["editable"];
222		if ($item_descr == null || !$this->descr_editable)
223			$this->item_description = $item_row["description"];
224		else
225			$this->item_description = $item_descr;
226		$this->quantity = $qty;
227		$this->req_del_date = $req_del_date;
228		$this->price = $prc;
229//		$this->units = $uom;
230		$this->tax_type = $item_row["tax_type_id"];
231		$this->tax_type_name = $item_row["tax_type_name"];
232		$this->units = $item_row["units"];
233		$this->qty_received = $qty_recd;
234		$this->qty_inv = $qty_inv;
235		$this->receive_qty = 0;	/*initialise these last two only */
236		$this->standard_cost =0;
237		$this->grn_item_id = $grn_item_id;
238	}
239
240	// Deprecated, use with care. If you need line value as it is calculated in invoice, use taxfree_charge_value below.
241	function taxfree_charge_price($po)
242	{
243		return get_tax_free_price_for_item($this->stock_id, $this->price,
244		  $po->tax_group_id, $po->tax_included, $po->tax_group_array);
245	}
246
247	//
248	// GRN line tax free value.
249	//
250	function taxfree_charge_value($po)
251	{
252		return get_tax_free_price_for_item($this->stock_id, $this->receive_qty*$this->price,
253		  $po->tax_group_id, $po->tax_included, $po->tax_group_array);
254	}
255}
256
257?>
258