Hello, is it possible in FA to get first few columns freezed in db_pager_view?
251 06/22/2019 06:19:28 am
Topic: In db_pager can we freeze first few columns (7 replies, posted in FA Modifications)
252 06/18/2019 06:06:06 pm
Re: Release 2.5. (10 replies, posted in Development)
I want to suggest that in 2.5 we shall include this modification done by @anoopmb
https://frontaccounting.com/punbb/viewtopic.php?id=7525
This is very useful approval system. It requires some database changes that we can do in 2.5. Currently it is applied only to GL module but later on we can gradually shift its application to all other modules.
253 06/18/2019 04:59:53 pm
Re: Unable to Access Global Variables on Reports (2 replies, posted in Reporting)
I think I didn't sleep well last night. All is working now ![]()
254 06/18/2019 12:32:12 pm
Topic: Unable to Access Global Variables on Reports (2 replies, posted in Reporting)
Hello, I am unable to access system global variables on reports. While they are accessible on any other page. Any Idea?
For example I tried calling on rep501.php the global variable $bank_account_types even exclusively including includes/sysnames.inc like below code
$page_security = 'SA_DIMENSIONREP';
// ----------------------------------------------------------------
// $ Revision: 2.0 $
// Creator: Joe Hunt
// date_: 2005-05-19
// Title: Dimension Summary
// ----------------------------------------------------------------
$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 . "/gl/includes/gl_db.inc");
include_once($path_to_root . "/includes/sysnames.inc");
//----------------------------------------------------------------------------------------------------
write_sql_to_file("Dimension Inquiry control_cols".print_r($bank_account_types,true));but it gives following error and the global variable is not read
Undefined variable: bank_account_types in file: /home/pakerp/web/pakerp.net/public_html/reporting/rep501.php at line 30While these variables are accessible from all other UI pages. Why?
255 06/18/2019 12:21:35 pm
Re: Payroll & Human Resource Management. (216 replies, posted in Modules Add-on's)
Yes waiting for all good news
256 06/17/2019 05:29:12 pm
Re: Payroll & Human Resource Management. (216 replies, posted in Modules Add-on's)
Attendance with time in and time out.
Csv import for time in and time out
257 06/17/2019 08:07:13 am
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
@joe, not for this topic now. But I have few suggestions for 2.5. This post https://frontaccounting.com/punbb/viewtopic.php?id=8137 doesn't allow us to post. Where can we post for suggestions for 2.5.
258 06/17/2019 06:06:15 am
Re: Update in reporting code (7 replies, posted in Reporting)
@barbarian, great work. I will test it. I really needed a good reporting from HTML to PDF.
259 06/16/2019 09:49:25 pm
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
@joe,
Should we change back to the former functions, get_domestic_price, in rep301 and rep308, but wich these changed rows?
You can do either, or but I think better keep the one in post # 11. I have tested it. It has changed conditions as well as some removal of logical bugs and
And post #8 should be changed? and the wrongly calculated domestic price?
Post #8 should be committed otherwise domestic_price will not calculate correctly.
With my finally suggested codes in post#8 and post#11 domestic_price is calculating correctly the average cost.
Regards.
260 06/16/2019 08:37:36 pm
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
@joe,
function get_domestic_price needs some more adjustments. But it requires changes in post#8 to be committed first.
function get_domestic_price($myrow, $stock_id)
{
if ($myrow['type'] == ST_SUPPRECEIVE || $myrow['type'] == ST_SUPPCREDIT || $myrow['type'] == ST_INVADJUST)
{
$price = $myrow['price'];
if ($myrow['person_id'] > 0)
{
// Do we have foreign currency?
$supp = get_supplier($myrow['person_id']);
$currency = $supp['curr_code'];
$ex_rate = $myrow['ex_rate'];
$price *= $ex_rate;
}
}
else
$price = $myrow['standard_cost']; //pick standard_cost for sales deliveries
return $price;
}Explanation:
1. We need price Value only for ST_SUPPRECEIVE, ST_SUPPCREDIT AND ST_INVADUST. For Sales Deliveries we need the standard_cost for Average cost calculation in rep301, rep308.
2. $price *= $ex_rate is currently $price /= $ex_rate which is a logical mistake.
3. We can pick Exchange Rate directly from Supplier Transaction for GRN and Supplier Credit Note. For this we need some more changes in rep301 and rep308
Following partial code in the SQL Query shall be replaced with
IF(ISNULL(supplier.supplier_id), debtor.debtor_no, supplier.supplier_id) person_idThis code
supplier.supplier_id person_id, IF(ISNULL(grn.rate), credit.rate, grn.rate) ex_rateExplanation
1. We need person_id only for suppliers to get exchange rate of the transaction in get_domestic_price function
2. ex_rate is directly picked from either GRN or Supplier Credit
I have tested all this after creating a fresh item and executing all type of transactions on it as in this image
There is one understanding that ST_CUSTCREDIT transactions will always pick the prevailing unit_cost.
Regards.
261 06/16/2019 04:11:41 pm
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
Thanks for your endorsement. I agree with your plan
262 06/16/2019 10:19:23 am
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
@joe,
This commit needs one more commit in the function add_stock_adjustment_item on /inventory/includes/db/items_adjust_db.inc as follows
function add_stock_adjustment_item($adj_id, $stock_id, $location, $date_, $reference,
$quantity, $price, $memo_)
{
$mb_flag = get_mb_flag($stock_id);
if (is_service($mb_flag))
{
display_db_error("Cannot do inventory adjustment for Service item : $stock_id", "");
}
update_average_material_cost(null, $stock_id, $price, $quantity, $date_);
if (is_fixed_asset($mb_flag)) {
$sql = "UPDATE ".TB_PREF."stock_master SET inactive=1
WHERE stock_id=".db_escape($stock_id);
db_query($sql,"The inactive flag for the fixed asset could not be updated");
}
$standard_cost = get_unit_cost($stock_id); //added by faisal
add_stock_move(ST_INVADJUST, $stock_id, $adj_id, $location,
$date_, $reference, $quantity, $standard_cost, $price);
$inv_value = $price * $quantity;
$adj_value = $price * -($quantity);
if (is_fixed_asset($mb_flag)) {
// get the initial value of the fixed assset.
$row = get_fixed_asset_move($stock_id, ST_SUPPRECEIVE);
$inv_value = $row['price'] * $quantity;
$adj_value = (-($row['price']) + $price) * $quantity;
}
if ($price > 0 || is_fixed_asset($mb_flag))
{
$stock_gl_codes = get_stock_gl_code($stock_id);
add_gl_trans_std_cost(ST_INVADJUST, $adj_id, $date_,
$stock_gl_codes['adjustment_account'], $stock_gl_codes['dimension_id'], $stock_gl_codes['dimension2_id'], $memo_, $adj_value );
add_gl_trans_std_cost(ST_INVADJUST, $adj_id, $date_, $stock_gl_codes['inventory_account'], 0, 0, $memo_, $inv_value);
}
if (is_fixed_asset($mb_flag)) {
// Additional gl entry for fixed asset.
$grn_act = get_company_pref('default_loss_on_asset_disposal_act');
add_gl_trans_std_cost(ST_INVADJUST, $adj_id, $date_, $grn_act, 0, 0, $memo_, ($price * -($quantity)));
}
}FOR LEGACY DATA ACCURACY
In order to keep rep301 and rep308 workable with older data than this commit one update query needs to be executed to bring standard_cost values in the price field for all transactions through inventory_adjustment.
UPDATE stock_moves SET price=standard_cost WHERE type=17WORKAROUND FOR COST UPDATE
@itronics for logging Cost Update tracking in stock_moves I have a workaround solution. May be you endorse it. Just sharing the idea. If approved I can work on code.
We can execute 2 Inventory Adjustments per location for that particular item when cost update is executed.
#1. This will bring the QOH to ZERO even for -ve inventory on the prevailing cost price in the system.
#2. This will bring the QOH on the same position either +ve or -ve at the New Cost give through Cost Update.
With this workaround we will be able to bring correct results in rep301 and rep308 as well.
EXCHANGE RATE AFFECT
In this function get_domestic_price the exchange rate factor is applied when person_id > 0. But for Inventory Adjustments person_id is always 0
However you are right that there shall be a column to record Exchange Rate of that transaction so that any change in exchange_rates shall not affect the transaction.
263 06/15/2019 07:21:30 pm
Re: Anomaly created by Cost Update in Inventory Sales Report (rep304) (20 replies, posted in Items and Inventory)
Thanks @itronics, I had some more observations but I held them because of no feedback.
In stock_moves table we have 2 fields price and standard_cost.
Ideally price is the factor affecting the resulting standard_cost. But this is not happening for transactions done through Inventory Adjustment.
Ideally Inventory Adjustment shall always be done at Prevailing Avg Cost of the Item but since the Input Field is open for Unit Cost on this page /inventory/adjustments.php?NewAdjustment=1 and if user input different Unit Cost then Prevailing then it affects the Avg Cost.
For e.g Item A's Avg Cost in the system is 20 with QOH=40 and while recording Adjustment the User Inputs 30 for +10 quantity then Price Affecting the Avg Cost is 30 while Resulting Avg Cost is 22
In this scenario currently in FA the standard_cost field is updated with 30 instead of 22 while price field is updated with 1 instead of 30.
I think this should be Fixed.
POST FIX PROBLEM
In rep301 and rep308 the following function
function get_domestic_price($myrow, $stock_id)
{
if ($myrow['type'] == ST_SUPPRECEIVE || $myrow['type'] == ST_SUPPCREDIT)
{
$price = $myrow['price'];
if ($myrow['person_id'] > 0)
{
// Do we have foreign currency?
$supp = get_supplier($myrow['person_id']);
$currency = $supp['curr_code'];
$ex_rate = get_exchange_rate_to_home_currency($currency, sql2date($myrow['tran_date']));
$price /= $ex_rate;
}
}
else
$price = $myrow['standard_cost']; // Item Adjustments just have the real cost
return $price;
} returns standard_cost for inventory adjustment transactions.
This can be changed as follows
function get_domestic_price($myrow, $stock_id)
{
$price = $myrow['price'];
if ($myrow['person_id'] > 0)
{
// Do we have foreign currency?
$supp = get_supplier($myrow['person_id']);
$currency = $supp['curr_code'];
$ex_rate = get_exchange_rate_to_home_currency($currency, sql2date($myrow['tran_date']));
$price /= $ex_rate;
}
return $price;
} In both reports this function returns the Price Affecting the Avg Cost.
If we do this than these two fields will become a Log of Changing Avg Cost with Price Affecting it.
264 06/12/2019 03:40:34 am
Re: Tax Inquiry - Does not show output tax info (114 replies, posted in Reporting)
Hello @BarryHavenga, check post # 90 by @BraathWaate
265 06/08/2019 11:05:02 am
Re: Add stamp or watermark to reports on the fly – ad hoc. V2 (2 replies, posted in FA Modifications)
I have added this to my portal. Thanks @poncho1234
266 06/08/2019 02:38:05 am
Re: Services rendered invoicing? (2 replies, posted in Installation)
@ewwecwcc, yes this software can be used for services only too.
267 06/08/2019 02:36:27 am
Re: HR and Payroll Module (66 replies, posted in Modules Add-on's)
Hello @Technicavolous
Post your issues to this discussion https://frontaccounting.com/punbb/viewtopic.php?id=6860
You need to set your Access Setup for HRM.
268 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)
Any Comment? Feedback? May be I am taking this as Anomaly but any explanation for this behaviour of Cost Update would be grateful.
269 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.
270 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
271 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.
272 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
273 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 faisal274 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.
275 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?
