Any Comment? Feedback? May be I am taking this as Anomaly but any explanation for this behaviour of Cost Update would be grateful.
276 06/02/2019 08:12:04 pm
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
277 06/01/2019 01:48:30 pm
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
When we record Customer Credit Note, the standard cost is not being updated in debtor_trans_details table.
Please add this line at Line # 117 on /sales/includes/db/sales_credit_db.inc
$credit_line->standard_cost = get_unit_cost($credit_line->stock_id); //Added by Faisal I request other senior members specially @joe and @jansuz to check this Cost Update anomaly being created.
Regards.
278 06/01/2019 12:01:06 pm
Topic: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
When Cost Update is executed it adjusts all previous transactions' standard_cost in stock_moves table. WHY? Any Idea?
Due to this the Inventory Sales Report is adversely affected because the Cost Column in this report is being picked from stock_moves table.
Hence the Contribution Margin of all Previous Entries are also affected.
Cost Update shall affect all future entries not previous entries.
In rep304 instead of taking standard_cost from the stock_moves table we can pick it from debtor_trans_detail table. I have modified the report as below
<?php
/**********************************************************************
Copyright (C) FrontAccounting, LLC.
Released under the terms of the GNU General Public License, GPL,
as published by the Free Software Foundation, either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
***********************************************************************/
$page_security = 'SA_SALESANALYTIC';
// ----------------------------------------------------------------
// $ Revision: 2.0 $
// Creator: Joe Hunt
// date_: 2005-05-19
// Title: Inventory Sales Report
// ----------------------------------------------------------------
$path_to_root="..";
include_once($path_to_root . "/includes/session.inc");
include_once($path_to_root . "/includes/date_functions.inc");
include_once($path_to_root . "/includes/data_checks.inc");
include_once($path_to_root . "/includes/banking.inc");
include_once($path_to_root . "/gl/includes/gl_db.inc");
include_once($path_to_root . "/inventory/includes/db/items_category_db.inc");
//----------------------------------------------------------------------------------------------------
print_inventory_sales();
function getTransactions($category, $location, $fromcust, $from, $to, $show_service)
{
$from = date2sql($from);
$to = date2sql($to);
$sql = "SELECT item.category_id,
category.description AS cat_description,
item.stock_id,
item.description, item.inactive,
item.mb_flag,
move.loc_code,
trans.debtor_no,
debtor.name AS debtor_name,
move.tran_date,
SUM(-move.qty) AS qty,
SUM(-move.qty*move.price) AS amt,
-- SUM(-IF(move.standard_cost <> 0, move.qty * move.standard_cost, move.qty *item.material_cost)) AS cost
SUM(-(move.qty *td.standard_cost)) AS cost
FROM ".TB_PREF."stock_master item,
".TB_PREF."stock_category category,
".TB_PREF."debtor_trans trans,
".TB_PREF."debtor_trans_details td,
".TB_PREF."debtors_master debtor,
".TB_PREF."stock_moves move
WHERE item.stock_id=move.stock_id
AND item.category_id=category.category_id
AND trans.debtor_no=debtor.debtor_no
AND trans.trans_no = td.debtor_trans_no
AND item.stock_id = td.stock_id
AND trans.type = td.debtor_trans_type
AND move.type=trans.type
AND move.trans_no=trans.trans_no
AND move.tran_date>='$from'
AND move.tran_date<='$to'
AND (trans.type=".ST_CUSTDELIVERY." OR move.type=".ST_CUSTCREDIT.")";
if (!$show_service)
$sql .= " AND (item.mb_flag='B' OR item.mb_flag='M')";
else
$sql .= " AND item.mb_flag<>'F'";
if ($category != 0)
$sql .= " AND item.category_id = ".db_escape($category);
if ($location != '')
$sql .= " AND move.loc_code = ".db_escape($location);
if ($fromcust != '')
$sql .= " AND debtor.debtor_no = ".db_escape($fromcust);
$sql .= " GROUP BY item.stock_id, debtor.name ORDER BY item.category_id,
item.stock_id, debtor.name";
return db_query($sql,"No transactions were returned");
}
//----------------------------------------------------------------------------------------------------
function print_inventory_sales()
{
global $path_to_root;
$from = $_POST['PARAM_0'];
$to = $_POST['PARAM_1'];
$category = $_POST['PARAM_2'];
$location = $_POST['PARAM_3'];
$fromcust = $_POST['PARAM_4'];
$show_service = $_POST['PARAM_5'];
$comments = $_POST['PARAM_6'];
$orientation = $_POST['PARAM_7'];
$destination = $_POST['PARAM_8'];
if ($destination)
include_once($path_to_root . "/reporting/includes/excel_report.inc");
else
include_once($path_to_root . "/reporting/includes/pdf_report.inc");
$orientation = ($orientation ? 'L' : 'P');
$dec = user_price_dec();
if ($category == ALL_NUMERIC)
$category = 0;
if ($category == 0)
$cat = _('All');
else
$cat = get_category_name($category);
if ($location == '')
$loc = _('All');
else
$loc = get_location_name($location);
if ($fromcust == '')
$fromc = _('All');
else
$fromc = get_customer_name($fromcust);
if ($show_service) $show_service_items = _('Yes');
else $show_service_items = _('No');
$cols = array(0, 75, 175, 250, 300, 375, 450, 515);
$headers = array(_('Category'), _('Description'), _('Customer'), _('Qty'), _('Sales'), _('Cost'), _('Contribution'));
if ($fromcust != '')
$headers[2] = '';
$aligns = array('left', 'left', 'left', 'right', 'right', 'right', 'right');
$params = array( 0 => $comments,
1 => array('text' => _('Period'),'from' => $from, 'to' => $to),
2 => array('text' => _('Category'), 'from' => $cat, 'to' => ''),
3 => array('text' => _('Location'), 'from' => $loc, 'to' => ''),
4 => array('text' => _('Customer'), 'from' => $fromc, 'to' => ''),
5 => array('text' => _('Show Service Items'), 'from' => $show_service_items, 'to' => ''));
$rep = new FrontReport(_('Inventory Sales Report'), "InventorySalesReport", user_pagesize(), 9, $orientation);
if ($orientation == 'L')
recalculate_cols($cols);
$rep->Font();
$rep->Info($params, $cols, $headers, $aligns);
$rep->NewPage();
$res = getTransactions($category, $location, $fromcust, $from, $to, $show_service);
$total = $grandtotal = 0.0;
$total1 = $grandtotal1 = 0.0;
$total2 = $grandtotal2 = 0.0;
$catt = '';
while ($trans=db_fetch($res))
{
if ($catt != $trans['cat_description'])
{
if ($catt != '')
{
$rep->NewLine(2, 3);
$rep->TextCol(0, 4, _('Total'));
$rep->AmountCol(4, 5, $total, $dec);
$rep->AmountCol(5, 6, $total1, $dec);
$rep->AmountCol(6, 7, $total2, $dec);
$rep->Line($rep->row - 2);
$rep->NewLine();
$rep->NewLine();
$total = $total1 = $total2 = 0.0;
}
$rep->TextCol(0, 1, $trans['category_id']);
$rep->TextCol(1, 6, $trans['cat_description']);
$catt = $trans['cat_description'];
$rep->NewLine();
}
$curr = get_customer_currency($trans['debtor_no']);
$rate = get_exchange_rate_from_home_currency($curr, sql2date($trans['tran_date']));
$trans['amt'] *= $rate;
$cb = $trans['amt'] - $trans['cost'];
$rep->NewLine();
$rep->fontSize -= 2;
$rep->TextCol(0, 1, $trans['stock_id']);
if ($fromcust == ALL_TEXT)
{
$rep->TextCol(1, 2, $trans['description'].($trans['inactive']==1 ? " ("._("Inactive").")" : ""), -1);
$rep->TextCol(2, 3, $trans['debtor_name']);
}
else
$rep->TextCol(1, 3, $trans['description'].($trans['inactive']==1 ? " ("._("Inactive").")" : ""), -1);
$rep->AmountCol(3, 4, $trans['qty'], get_qty_dec($trans['stock_id']));
$rep->AmountCol(4, 5, $trans['amt'], $dec);
if (is_service($trans['mb_flag']))
$rep->TextCol(5, 6, "---");
else
$rep->AmountCol(5, 6, $trans['cost'], $dec);
$rep->AmountCol(6, 7, $cb, $dec);
$rep->fontSize += 2;
$total += $trans['amt'];
$total1 += $trans['cost'];
$total2 += $cb;
$grandtotal += $trans['amt'];
$grandtotal1 += $trans['cost'];
$grandtotal2 += $cb;
}
$rep->NewLine(2, 3);
$rep->TextCol(0, 4, _('Total'));
$rep->AmountCol(4, 5, $total, $dec);
$rep->AmountCol(5, 6, $total1, $dec);
$rep->AmountCol(6, 7, $total2, $dec);
$rep->Line($rep->row - 2);
$rep->NewLine();
$rep->NewLine(2, 1);
$rep->TextCol(0, 4, _('Grand Total'));
$rep->AmountCol(4, 5, $grandtotal, $dec);
$rep->AmountCol(5, 6, $grandtotal1, $dec);
$rep->AmountCol(6, 7, $grandtotal2, $dec);
$rep->Line($rep->row - 4);
$rep->NewLine();
$rep->End();
}Here is the Comparison of InventorySales Report Before and After Modification
PS: The Affect of Cost Update in Standard Cost of stock_move table is explained here
279 06/01/2019 08:14:46 am
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
The Code I have suggested in post#34 will affect many reports. So doing this may need to change reports. And also the previous data may need to be adjusted in stock_moves table.
Hence therefore a separate log idea is better i think.
280 05/30/2019 07:10:48 pm
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
Further investigating this topic I found that the function defined at Line # 425 of /includes/db/inventory_db.inc function update_stock_move is not used anywhere in the system.
I have tried to help @zia why the cost is -ve. This might be helpful for others in this forum so I am attaching here.
This Image explains the affect of using Cost Update on the Average Cost of the Product
281 05/29/2019 09:40:31 pm
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
Hello @joe, I found that there is already a Log System for Average Cost in FA in stock_moves table but that is not properly used with Stock Adjustments.
In the file /inventory/includes/db/items_adjust_db.inc if we modify code at Line # 103 as below then Stock_Moves Table will have complete log of Transaction Affecting the Average Cost.
$calculated_avg_cost = get_unit_cost($stock_id); //added by faisal
add_stock_move(ST_INVADJUST, $stock_id, $adj_id, $location, //modified by faisal
$date_, $reference, $quantity,$calculated_avg_cost, $standard_cost);After Doing this /inventory/inquiry/stock_movements.php can be modified to show the columns as below
array_push($th, _("Date"), _("Detail"), _("Quantity In"), _("Quantity Out"), _("Quantity On Hand"),_("Price"), _("Avg Cost"));//Modified by faisaland
qty_cell($after_qty, false, $dec);
amount_cell($myrow["price"]); //added by faisal
amount_cell($myrow["standard_cost"]); //added by faisal282 05/27/2019 07:54:20 am
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
Fine, In the log some more fields are necessary but for that we may need to increase arguments in function. Like TransactionDate, TransactionType and TransactionRef or ID, User
Similarly the direct CostUpdate of any items shall also reflect in this Log.
283 05/27/2019 03:56:44 am
Topic: db_pager_view problem (0 replies, posted in Report Bugs here)
I have a modified dimensions db_pager view.
What I am expecting that if I pass the Value of the Column with an index 'name' with a value 'currency' (Database Column Name) then it shall display the value of that column irrespective of its sequential position in the $sql query passed to db_pager
_("Currency") => array('name'=>'currency'),But currently I am not getting the desired result unless I bring the currency column in the same sequential position.
for e.g If in db_pager view the Currency is displayed on 3rd column then in $sql also the currency column shall be on 3rd position, otherwise it is displaying the value of any other column that is on 3rd position.
Why the 'name' index 'value' is not working? Or I am expecting something wrong?
Any Idea?
284 05/27/2019 02:57:09 am
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
@joe, we can add this function to purchasing/includes/db/grn_db.inc. to create a log file in the company's folder for each item whenever the average cost is updated in the system for any reason.
This function (in my instance) also sends an Email Alert to BCC Email of the company.
function update_cost_log($new_material_cost, $curr_material_cost, $qty, $price, $stock_id, $qoh )
{
global $path_to_root, $db_connections;
$company = $db_connections[$_SESSION["wa_current_user"]->company]["name"]; //added by faisal
$date = Today()." ".Now();// date("Y-m-d h:i:sa", $d);
$tran_type = $qty > 0 ? "Stock IN" : "Stock Out";
$log = "date=$date, company=$company, stock_id=".get_item($stock_id)['description'].",";
$log .="Quntity On Hand=$qoh,";
$log .= "Current Material Cost=$curr_material_cost,";
$log .= "$tran_type=$qty,";
$log .= "Price to Receive Stock=$price,";
$log .= "Calculated Material Cost = $new_material_cost";
file_put_contents(company_path()."/".$stock_id.'.log',$log.PHP_EOL,FILE_APPEND);
if (!get_company_pref('avg_cost_alert')) return;
require_once($path_to_root . "/reporting/includes/class.mail.inc");
$mail = new email("ABC", "smtp@abc.net");
$mail->phpmailer->addAddress(get_company_pref('bcc_email'));
$mail->subject("Average Cost Alert");
$mail->text($log);
$mail->send();
}This function can be called at Line # 74 in the above file as below
if ($curr_material_cost <> $material_cost)
update_cost_log($material_cost, $curr_material_cost, $qty, $price_in_home_currency, $stock_id, $qoh); //by faisalThe same process can be repeated for manufacturing/includes/db/work_order_costing_db.inc
285 05/26/2019 03:36:36 pm
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
@zia, first of all you are using very older version. At FA on daily basis bugs are identified and rectified. It may be very cumbersome for any senior member here to support you on an older version. I would recommend that to avoid any future problems you keep your FA instance updated to the latest repo.
Secondly you can send me your ERPs credentials via Forum Email. I will try to locate the problem.
286 05/26/2019 10:51:43 am
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
May be we can maintain a log file in the company's folder for each item. That Log file can be called in Item Setup to view history with Date and Time, User and Transaction affecting the Average Cost. The user shall be able to refresh that log file.
287 05/26/2019 07:00:51 am
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
@joe, this area of FA that average cost of the item get changes but there is no LOG maintained for such change shall be addressed in 2.5.
This has placed me at very critical situation sometimes when a client asks why this Average Cost arrives?
288 05/26/2019 06:57:30 am
Re: Uncaught TypeError: found[k].className.match is not a function (8 replies, posted in Report Bugs here)
How can I reproduce this error?
289 05/24/2019 01:31:33 am
Re: Customer prepaid (6 replies, posted in Accounts Receivable)
Prepayment can be selected at the time of Sales Order only.
290 05/22/2019 03:26:34 am
Re: Customer prepaid (6 replies, posted in Accounts Receivable)
Hello,
You need to create a payment terms as PrePayment. While recording an Order or Invoice select this Payment Term.
291 05/20/2019 08:08:54 am
Topic: How to apply nowrap in a Cell using db_pager (1 replies, posted in Reporting)
How can I apply formatting to a cell nowrap using db_pager
292 05/20/2019 02:36:28 am
Re: Items Cost in negative in inventory sales report (35 replies, posted in Items and Inventory)
Hi @zia, have you you enabled Negative Inventory in Setup?
293 05/18/2019 10:47:17 am
Re: Customer Trial Balance Report (11 replies, posted in Reporting)
in rep115.php Line # 234 shall be modified as below
if (db_num_rows($res) == 0 && !$no_zeros)294 05/18/2019 10:34:05 am
Re: Customer Trial Balance Report (11 replies, posted in Reporting)
In rep206.php Line # 168 shall be modified as below
if (db_num_rows($res) == 0 && !$no_zeros) and Line # 181 shall be commented, Because ignoring the loop here is not adding up the values of $curr_cr, $curr_db and $item variables.
295 05/16/2019 10:05:56 am
Re: Writing Arabic in Fields with English User (5 replies, posted in Translations)
Great @rafat that worked for me thanks.
296 05/15/2019 07:09:34 pm
Topic: Writing Arabic in Fields with English User (5 replies, posted in Translations)
When logged in as a User with Language as English, Writing Arabic in Fields like Customer Name shows ?????????
While being logged in as a User with language as Arabic accepts it.
Even any customer name added in Arabic as an Arabic User shows as ??????? when logged in as English User.
How can we use Arabic to input some fields while Logged in as Arabic User?
297 05/07/2019 02:36:27 am
Re: Add stamp or watermark to reports on the fly – ad hoc. (15 replies, posted in FA Modifications)
Hmmm. I was trying from Customer Transaction Inquiry. So there shall be an option to Fix the Water Mark in Company Preferences so that even from Customer Transaction Inquiry the WaterMark appears.
298 05/07/2019 01:48:25 am
Re: Add stamp or watermark to reports on the fly – ad hoc. (15 replies, posted in FA Modifications)
Can't find any watermark in this report
299 05/05/2019 06:00:41 am
Re: Default Theme Redesigned And available For testing (47 replies, posted in Modules Add-on's)
@joe, can you provide the download link of flatcolor2 theme
300 04/28/2019 03:31:37 am
Re: How can i update my Arabic Language (12 replies, posted in Translations)
Hello @emiangel839 I just finished updating my arabic language using following steps. You also try them
1. Download POEdit
2. Add your Msg Strings like one below in PO file
msgid "Cost Centers"
msgstr "مراكز التكلفة"3. Open PO file using this application
4. Validate your PO file
5. Compile PO file in MO file
6. Upload both files to the cloud server
7. Restart your Web Server (Apache).
8. Logout and then Login FA.
Note: If you are using a shared hosting then you won't be able to restart apache.
