Changed so that average item material price is automatic updated whenever a PO Delive...
[fa-stable.git] / purchasing / includes / db / grn_db.inc
1 <?php
2
3 //-------------------------------------------------------------------------------------------------------------
4
5 function add_grn(&$po, $date_, $reference, $location)
6 {
7         begin_transaction();
8
9         $grn = add_grn_batch($po->order_no, $po->supplier_id, $reference, $location, $date_);
10
11         foreach ($po->line_items as $order_line)
12         {
13
14                 if ($order_line->receive_qty != 0 && $order_line->receive_qty != "" && isset($order_line->receive_qty))
15                 {
16
17                         /*Update sales_order_details for the new quantity received and the standard cost used for postings to GL and recorded in the stock movements for FIFO/LIFO stocks valuations*/
18
19                         if ($order_line->qty_received == 0)
20                         {
21                                 /*This must be the first receipt of goods against this line */
22                                 /*Need to get the standard cost as it is now so we can process GL jorunals later*/
23                                 $order_line->standard_cost = get_standard_cost($order_line->stock_id);
24                         }
25
26                         //------------------- update average material cost ------------------------------------------ Joe Hunt Mar-03-2008
27                         $currency = get_supplier_currency($po->supplier_id);
28                         if ($currency != null)
29                                 $price_in_home_currency = to_home_currency($order_line->price, $currency, $date_);
30                         else
31                                 $price_in_home_currency = $order_line->price;
32                         $sql = "SELECT material_cost FROM ".TB_PREF."stock_master WHERE stock_id='$order_line->stock_id'";
33                         $result = db_query($sql);
34                         $myrow = db_fetch($result);
35                         $material_cost = $myrow['material_cost'];
36                         $qoh = get_qoh_on_date($order_line->stock_id, null, $date_);
37                         $material_cost = ($qoh * $material_cost + $order_line->receive_qty * $price_in_home_currency) /
38                                 ($qoh + $order_line->receive_qty);
39                         $sql = "UPDATE ".TB_PREF."stock_master SET material_cost=$material_cost
40                                 WHERE stock_id='$order_line->stock_id'";
41                         db_query($sql,"The cost details for the inventory item could not be updated");
42                         //----------------------------------------------------------------------------------------------------------------
43
44                         /*Need to insert a grn item */
45
46                         $grn_item = add_grn_detail_item($grn, $order_line->po_detail_rec,
47                                 $order_line->stock_id, $order_line->item_description,
48                                 $order_line->standard_cost,     $order_line->receive_qty);
49
50                         /* Update location stock records - NB  a po cannot be entered for a service/kit parts */
51
52             add_stock_move(25, $order_line->stock_id, $grn, $location, $date_, "",
53                 $order_line->receive_qty, $order_line->standard_cost,
54                 $po->supplier_id, 1, $order_line->price);
55
56                 } /*quantity received is != 0 */
57         } /*end of order_line loop */
58
59         add_forms_for_sys_type(25, $grn, $location);
60
61         references::save_last($reference, 25);
62
63         commit_transaction();
64
65         return $grn;
66 }
67
68 //----------------------------------------------------------------------------------------
69
70 function add_grn_batch($po_number, $supplier_id, $reference, $location, $date_)
71 {
72         $date = date2sql($date_);
73
74         $sql = "INSERT INTO ".TB_PREF."grn_batch (purch_order_no, delivery_date, supplier_id, reference, loc_code)
75                         VALUES ($po_number, '$date', '$supplier_id', '$reference', '$location')";
76
77         db_query($sql, "A grn batch record could not be inserted.");
78
79         return db_insert_id();
80 }
81
82 //-------------------------------------------------------------------------------------------------------------
83
84 function add_grn_detail_item($grn_batch_id, $po_detail_item, $item_code, $description, $standard_unit_cost,
85         $quantity_received)
86 {
87         $sql = "UPDATE ".TB_PREF."purch_order_details
88         SET quantity_received = quantity_received + $quantity_received,
89         std_cost_unit=$standard_unit_cost
90         WHERE po_detail_item = $po_detail_item";
91
92         db_query($sql, "a purchase order details record could not be updated. This receipt of goods has not been processed ");
93
94         $sql = "INSERT INTO ".TB_PREF."grn_items (grn_batch_id, po_detail_item, item_code, description, qty_recd)
95                 VALUES ($grn_batch_id, $po_detail_item, '$item_code', '$description', $quantity_received)";
96
97         db_query($sql, "A GRN detail item could not be inserted.");
98
99         return db_insert_id();
100 }
101
102 //----------------------------------------------------------------------------------------
103
104 function get_grn_items($grn_batch_id=0, $supplier_id="", $outstanding_only=false,
105         $is_invoiced_only=false)
106 {
107     $sql = "SELECT ".TB_PREF."grn_batch.*, ".TB_PREF."grn_items.*, ".TB_PREF."purch_order_details.unit_price,
108                 ".TB_PREF."purch_order_details.std_cost_unit, units
109         FROM ".TB_PREF."grn_batch, ".TB_PREF."grn_items, ".TB_PREF."purch_order_details, ".TB_PREF."stock_master
110         WHERE ".TB_PREF."grn_items.grn_batch_id=".TB_PREF."grn_batch.id
111                 AND ".TB_PREF."grn_items.po_detail_item=".TB_PREF."purch_order_details.po_detail_item
112         AND ".TB_PREF."stock_master.stock_id=".TB_PREF."grn_items.item_code ";
113
114         if ($grn_batch_id != 0)
115                 $sql .= " AND ".TB_PREF."grn_batch.id=$grn_batch_id AND ".TB_PREF."grn_items.grn_batch_id=$grn_batch_id ";
116
117         if ($is_invoiced_only)
118                 $sql .= " AND ".TB_PREF."grn_items.quantity_inv > 0";
119
120         if ($outstanding_only)
121         $sql .= " AND ".TB_PREF."grn_items.qty_recd - ".TB_PREF."grn_items.quantity_inv > 0";
122
123         if ($supplier_id != "")
124                 $sql .= " AND ".TB_PREF."grn_batch.supplier_id ='$supplier_id' ";
125
126         $sql .= " ORDER BY ".TB_PREF."grn_batch.delivery_date, ".TB_PREF."grn_batch.id, ".TB_PREF."grn_items.id";
127
128         return db_query($sql, "Could not retreive GRNS");
129 }
130
131 //----------------------------------------------------------------------------------------
132
133 // get the details for a given grn item
134
135 function get_grn_item_detail($grn_item_no)
136 {
137         $sql = "SELECT ".TB_PREF."grn_items.*, ".TB_PREF."purch_order_details.unit_price,
138         ".TB_PREF."grn_items.qty_recd - ".TB_PREF."grn_items.quantity_inv AS QtyOstdg,
139         ".TB_PREF."purch_order_details.std_cost_unit
140                 FROM ".TB_PREF."grn_items, ".TB_PREF."purch_order_details, ".TB_PREF."stock_master
141                 WHERE ".TB_PREF."grn_items.po_detail_item=".TB_PREF."purch_order_details.po_detail_item
142                         AND ".TB_PREF."stock_master.stock_id=".TB_PREF."grn_items.item_code
143                         AND ".TB_PREF."grn_items.id=$grn_item_no";
144
145         $result = db_query($sql, "could not retreive grn item details");
146         return db_fetch($result);
147 }
148
149 //----------------------------------------------------------------------------------------
150
151 function read_grn_items_to_order($grn_batch, &$order)
152 {
153         $result = get_grn_items($grn_batch);
154
155         if (db_num_rows($result) > 0)
156         {
157
158                 while ($myrow = db_fetch($result))
159                 {
160
161                         if (is_null($myrow["units"]))
162                         {
163                                 $units = "";
164                         }
165                         else
166                         {
167                                 $units = $myrow["units"];
168                         }
169
170                         $order->add_to_order($order->lines_on_order+1, $myrow["item_code"],
171                                 1,$myrow["description"], $myrow["unit_price"],$units,
172                                 sql2date($myrow["delivery_date"]), $myrow["quantity_inv"],
173                                 $myrow["qty_recd"]);
174
175                         $order->line_items[$order->lines_on_order]->po_detail_rec = $myrow["po_detail_item"];
176                 } /* line po from purchase order details */
177         } //end of checks on returned data set
178 }
179
180 //----------------------------------------------------------------------------------------
181
182 // read a grn into an order class
183
184 function read_grn($grn_batch, &$order)
185 {
186         $sql= "SELECT * FROM ".TB_PREF."grn_batch WHERE id=$grn_batch";
187
188         $result = db_query($sql, "The grn sent is not valid");
189
190         $row = db_fetch($result);
191         $po_number = $row["purch_order_no"];
192
193         $result = read_po_header($po_number, $order);
194
195         if ($result)
196         {
197
198                 $order->orig_order_date = sql2date($row["delivery_date"]);
199                 $order->location = $row["loc_code"];
200                 $order->reference = $row["reference"];
201
202                 read_grn_items_to_order($grn_batch, $order);
203         }
204 }
205
206 //----------------------------------------------------------------------------------------------------------
207
208 // get the GRNs (batch info not details) for a given po number
209
210 function get_po_grns($po_number)
211 {
212     $sql = "SELECT * FROM ".TB_PREF."grn_batch WHERE purch_order_no=$po_number";
213
214         return db_query($sql, "The grns for the po $po_number could not be retreived");
215 }
216
217 //----------------------------------------------------------------------------------------------------------
218
219 function exists_grn($grn_batch)
220 {
221         $sql = "SELECT id FROM ".TB_PREF."grn_batch WHERE id=$grn_batch";
222         $result = db_query($sql, "Cannot retreive a grn");
223
224     return (db_num_rows($result) > 0);
225 }
226
227 //----------------------------------------------------------------------------------------------------------
228
229 function exists_grn_on_invoices($grn_batch)
230 {
231         $sql = "SELECT ".TB_PREF."supp_invoice_items.id FROM ".TB_PREF."supp_invoice_items,".TB_PREF."grn_items
232                 WHERE ".TB_PREF."supp_invoice_items.grn_item_id=".TB_PREF."grn_items.id
233                 AND quantity != 0
234                 AND grn_batch_id=$grn_batch";
235         $result = db_query($sql, "Cannot query GRNs");
236
237     return (db_num_rows($result) > 0);
238 }
239
240 //----------------------------------------------------------------------------------------------------------
241
242 function void_grn($grn_batch)
243 {
244         // if this grn is references on any invoices/credit notes, then it
245         // can't be voided
246         if (exists_grn_on_invoices($grn_batch))
247                 return false;
248
249         begin_transaction();
250
251         void_bank_trans(25, $grn_batch, true);
252         void_gl_trans(25, $grn_batch, true);
253
254         // clear the quantities of the grn items in the POs and invoices
255         $result = get_grn_items($grn_batch);
256
257     if (db_num_rows($result) > 0)
258     {
259
260         while ($myrow = db_fetch($result))
261         {
262
263                 $sql = "UPDATE ".TB_PREF."purch_order_details
264                 SET quantity_received = quantity_received - " . $myrow["qty_recd"] . "
265                 WHERE po_detail_item = " . $myrow["po_detail_item"];
266
267                 db_query($sql, "a purchase order details record could not be voided.");
268         }
269     }
270
271         // clear the quantities in the grn items
272         $sql = "UPDATE ".TB_PREF."grn_items SET qty_recd=0, quantity_inv=0
273                 WHERE grn_batch_id=$grn_batch";
274
275         db_query($sql, "A grn detail item could not be voided.");
276
277     // clear the stock move items
278     void_stock_move(25, $grn_batch);
279
280         commit_transaction();
281
282         return true;
283 }
284
285 //----------------------------------------------------------------------------------------------------------
286
287 ?>