{
if ($chg_price != null)
{
- $sql = "SELECT act_price FROM ".TB_PREF."purch_order_details WHERE
+ $sql = "SELECT act_price, unit_price FROM ".TB_PREF."purch_order_details WHERE
po_detail_item = $po_detail_item";
$result = db_query($sql, "The old actual price of the purchase order line could not be retrieved");
$row = db_fetch_row($result);
$ret = $row[0];
+
+ $unit_price = $row[1]; //Added by Rasmus
+
$sql = "SELECT delivery_date FROM ".TB_PREF."grn_batch,".TB_PREF."grn_items WHERE
".TB_PREF."grn_batch.id = ".TB_PREF."grn_items.grn_batch_id AND ".TB_PREF."grn_items.id=$id";
$result = db_query($sql, "The old delivery date from the received record cout not be retrieved");
{
$ret = 0;
$date = "";
+ $unit_price = 0; // Added by Rasmus
}
$sql = "UPDATE ".TB_PREF."purch_order_details
SET qty_invoiced = qty_invoiced + $qty_invoiced ";
SET quantity_inv = quantity_inv + $qty_invoiced
WHERE id = $id";
db_query($sql, "The quantity invoiced off the items received record could not be updated");
- return array($ret, $date);
+ return array($ret, $date, $unit_price);
}
function get_deliveries_between($stock_id, $from, $to)
if (!$supp_trans->is_invoice)
{
$entered_grn->this_quantity_inv = -$entered_grn->this_quantity_inv;
+ set_grn_item_credited($entered_grn, $supp_trans->supplier_id, $invoice_id, $date_);
}
$line_taxfree = $entered_grn->taxfree_charge_price($supp_trans->tax_group_id);
$line_tax = $entered_grn->full_charge_price($supp_trans->tax_group_id) - $line_taxfree;
-
- $old = update_supp_received_items_for_invoice($entered_grn->id, $entered_grn->po_detail_item,
- $entered_grn->this_quantity_inv, $entered_grn->chg_price);
$stock_gl_code = get_stock_gl_code($entered_grn->item_code);
add_gl_trans_supplier($trans_type, $invoice_id, $date_, $stock_gl_code["inventory_account"],
$stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'],
$entered_grn->this_quantity_inv * $line_taxfree, $supp_trans->supplier_id);
// -------------- if price changed since po received. 16 Aug 2008 Joe Hunt
- $old_price = $old[0];
- if ($old_price != $entered_grn->chg_price) // price-change, so update
+ if($supp_trans->is_invoice)
{
- $diff = $entered_grn->chg_price - $old_price;
- $old_date = sql2date($old[1]);
- // only update the diff (last parameter, adj_only is set to true).
- $mat_cost = update_average_material_cost($supp_trans->supplier_id, $entered_grn->item_code,
- $diff, $entered_grn->this_quantity_inv, $old_date, true);
- // function just above this
- $deliveries = get_deliveries_between($entered_grn->item_code, $old_date, $date_);
- if ($deliveries[0] != 0) // have deliveries been done during the period?
- {
-
- $amt = ($mat_cost - $deliveries[1]) * $deliveries[0]; // $amt in home currency
-
- add_gl_trans($trans_type, $invoice_id, $date_, $stock_gl_code["cogs_account"],
- $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], _("Cost diff."),
- $amt, null, null, null,
- "The general ledger transaction could not be added for the price variance of the inventory item");
- add_gl_trans($trans_type, $invoice_id, $date_, $stock_gl_code["inventory_account"],
- 0, 0, _("Cost diff."), -$amt, null, null, null,
- "The general ledger transaction could not be added for the price variance of the inventory item");
- update_stock_move_pid(13, $entered_grn->item_code, $old_date, $date_, 0, $mat_cost);
- }
- update_stock_move_pid(25, $entered_grn->item_code, $old_date, $old_date, $supp_trans->supplier_id, $mat_cost);
- }
+ $old = update_supp_received_items_for_invoice($entered_grn->id, $entered_grn->po_detail_item,
+ $entered_grn->this_quantity_inv, $entered_grn->chg_price);
+ // Since the standard cost is always calculated on basis of the po unit_price,
+ // this is also the price that should be the base of calculating the price diff.
+ // In cases where there is two different po invoices on the same delivery with different unit prices this will not work either
+
+ //$old_price = $old[0];
+
+ $old_price = $old[2];
+
+
+
+ /*
+ If statement is removed. Should always check for deliveries nomatter if there has been a price change.
+ */
+ //if ($old_price != $entered_grn->chg_price) // price-change, so update
+ //{
+ $diff = $entered_grn->chg_price - $old_price;
+ $old_date = sql2date($old[1]);
+ // only update the diff (last parameter, adj_only is set to true).
+ $mat_cost = update_average_material_cost($supp_trans->supplier_id, $entered_grn->item_code,
+ $diff, $entered_grn->this_quantity_inv, $old_date, true);
+ // function just above this
+ $deliveries = get_deliveries_between($entered_grn->item_code, $old_date, $date_);
+ if ($deliveries[0] != 0) // have deliveries been done during the period?
+ {
+
+ $amt = ($mat_cost - $deliveries[1]) * $deliveries[0]; // $amt in home currency
+ if ($amt != 0.0)
+ {
+ add_gl_trans($trans_type, $invoice_id, $date_, $stock_gl_code["cogs_account"],
+ $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], _("Cost diff."),
+ $amt, null, null, null,
+ "The general ledger transaction could not be added for the price variance of the inventory item");
+ add_gl_trans($trans_type, $invoice_id, $date_, $stock_gl_code["inventory_account"],
+ 0, 0, _("Cost diff."), -$amt, null, null, null,
+ "The general ledger transaction could not be added for the price variance of the inventory item");
+ }
+ update_stock_move_pid(13, $entered_grn->item_code, $old_date, $date_, 0, $mat_cost);
+ }
+ update_stock_move_pid(25, $entered_grn->item_code, $old_date, $old_date, $supp_trans->supplier_id, $mat_cost);
+ //}
+ }
// ----------------------------------------------------------------------
add_supp_invoice_item($trans_type, $invoice_id, $entered_grn->item_code,
// now remove this invoice/credit from any GRNs/POs that it's related to
if (db_num_rows($result) > 0)
{
+ $date_ = Today();
while ($details_row = db_fetch($result))
{
if (strlen($details_row["grn_item_id"]) > 0) // it can be empty for GL items
{
- update_supp_received_items_for_invoice($details_row["grn_item_id"],
- $details_row["po_detail_item_id"], -$details_row["quantity"]);
+ // Changed 2008-10-17 by Joe Hunt to get the avg. material cost updated
+ $old = update_supp_received_items_for_invoice($details_row["grn_item_id"],
+ $details_row["po_detail_item_id"], -$details_row["quantity"], $details_row["FullUnitPrice"]);
+
+ $diff = $details_row["FullUnitPrice"] - $old[2];
+ $old_date = sql2date($old[1]);
+
+ $batch = get_grn_batch_from_item($details_row["grn_item_id"]);
+ $grn = get_grn_batch($batch);
+
+ // Only adjust the avg for the diff
+ $mat_cost = update_average_material_cost($grn["supplier_id"], $details_row["stock_id"],
+ $diff, -$details_row["quantity"], $date_, true);
+
+ $deliveries = get_deliveries_between($details_row["stock_id"], $old_date, $date_);
+ if ($deliveries[0] != 0) // have deliveries been done during the period?
+ {
+
+ $amt = ($mat_cost - $deliveries[1]) * $deliveries[0]; // $amt in home currency
+ if ($amt != 0.0)
+ {
+ $stock_gl_code = get_stock_gl_code($details_row["stock_id"]);
+ add_gl_trans($type, $type_no, $date_, $stock_gl_code["cogs_account"],
+ $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], _("Cost diff."),
+ -$amt, null, null, null,
+ "The general ledger transaction could not be added for the price variance of the inventory item");
+ add_gl_trans($type, $type_no, $date_, $stock_gl_code["inventory_account"],
+ 0, 0, _("Cost diff."), $amt, null, null, null,
+ "The general ledger transaction could not be added for the price variance of the inventory item");
+ }
+ update_stock_move_pid(13, $details_row["stock_id"], $old_date, $date_, 0, $mat_cost);
+ }
+ update_stock_move_pid(25, $details_row["stock_id"], $old_date, $old_date, $grn['supplier_id'], $mat_cost);
+
}
}
}
//----------------------------------------------------------------------------------------
-?>
\ No newline at end of file
+?>