551

(6 replies, posted in Report Bugs here)

I have located. The bug is due to one of my extension. Thanks for input

552

(6 replies, posted in Report Bugs here)

Further If you create more invoices it is allocating wrong Delivery Numbers.

553

(6 replies, posted in Report Bugs here)

Yes this is my (Boxygen) clients data.

554

(6 replies, posted in Report Bugs here)

And If you check in Customer Transaction Inquiry After Invoice Number 420 All INvoices View are showing wrong Delivery Numbers

555

(6 replies, posted in Report Bugs here)

Please check this link

http://fa.boxygen.biz/fa2325/sales/view/view_invoice.php?trans_no=643&trans_type=10

id: admin
pass: frontaccounting

In Deliveries you will find 348. But this Delivery is a voided delivery. How is this allocated to this invoice.

The Actual Delivery to this invoice is 643.

The Order Number for this Transaction is 646

How this could happen.

Once Activated URDU the Urdu Text is shown as ????????? in Fields.

A little modification to rep301 is needed.

Replace lines from 209-218 with following lines

$UnitCost = getAverageCost($trans['stock_id'], $location, $date);
$ItemTotal = $trans['QtyOnHand'] * $UnitCost;

Hence now no need of $use_costed_values in config.php

558

(24 replies, posted in Installation)

apmuthu wrote:

This error has been sorted out in FA 2.4.1+ in this commit.

How can I follow each commit in main FA Repo?

559

(24 replies, posted in Installation)

OK which version of php and xampp will support 2.3.25?

560

(24 replies, posted in Installation)

That worked for installation but after installation same error appeared when running the application. Then I made the similar changes in includes/session.inc. I changed with below code

wrote:

include_once($path_to_root . "/includes/current_user.inc");
  include_once($path_to_root . "/boxygen.php");
  include_once($path_to_root . "/admin/db/security_db.inc");
  include_once($path_to_root . "/includes/lang/language.php");
  include_once($path_to_root . "/config_db.php");
  include_once($path_to_root . "/includes/ajax.inc");
  include_once($path_to_root . "/includes/ui/ui_msgs.inc");
  include_once($path_to_root . "/includes/prefs/sysprefs.inc");
 
include_once($path_to_root . "/includes/errors.inc");
// colect all error msgs
set_error_handler('error_handler' /*, errtypes */);

It worked but it gives following notice 6 times

wrote:

Notice: Trying to get property of non-object in C:\xampp\htdocs\fa241\includes\errors.inc on line 74


The Same I tried with FA2325 but during installation following error is showing

wrote:

Your PHP has to have MySQL extension enabled.

561

(24 replies, posted in Installation)

I am receiving the same error on Windows Installation for FA2.4.1 and XAMP 3.2.2 and PHP Version 7.05 and Windows Version 64-Bit. Any ideas?

I have gone through the post mentioned above and Uncommented following line on session.inc as suggested in the final post.

ini_set('session.save_path', dirname(__FILE__).'/../tmp/');

But still the problem is not resolved.

Hello I need help on this

You can't restrict backdated entry for any user. However with little modification in Journal Inquiry to search it via Entry Date Instead of Transaction Date you can have a monitoring over it.

564

(9 replies, posted in Announcements)

@joe, I have some custom modifications in FA 2.4 RC1. Is it possible to know exactly which files have been changed from 2.4 RC to 2.4.1 so that my custom modification remains intact.

Great Work FA Team

What do you mean by Standard FA. Is there any Premium FA as well?

I am trying to create a custom report for inventory conversion.

I added a parameter in custom report as below

global $reports;


            $reports->addReport(RC_INVENTORY, '_inventory_conversion', _('Invetory Conversion'),
                array(    _('Start Date') => 'DATEBEGINM',
                        _('End Date') => 'DATEENDM',
                        _('Inventory Category') => 'CATEGORIES',
                        _('Location') => 'LOCATIONS',
                        _('Sales Folk') => 'SALESMEN',
                        _('Conversion UOM') => 'UOM',
                        _('Show Service Items') => 'YES_NO',
                        _('Comments') => 'TEXTBOX',
                        _('Orientation') => 'ORIENTATION',
                        _('Destination') => 'DESTINATION'));

The new Parameter is UOM

Then I added following lines in reports_classes.inc

case 'UOM':
                        return stock_units_list(_('Units of Measure:'), 'units', null);

But When I try to run report it gives following error


Unknown report parameter type:UOM
D:\xampp\htdocs\boxygen\includes\ui\ui_msgs.inc:14:    trigger_error('Unknown report parameter type:UOM','256')
D:\xampp\htdocs\boxygen\reporting\includes\reports_classes.inc:153:    display_error('Unknown report parameter type:UOM')
D:\xampp\htdocs\boxygen\reporting\includes\reports_classes.inc:103:    (BoxReports Object)->getOptions((Array[10]),'_inventory_conversion')
D:\xampp\htdocs\boxygen\reporting\reports_main.php:530:    (BoxReports Object)->getDisplay()

Please see the screen shot

See Error

What am I missing?

567

(25 replies, posted in Reporting)

Thanks @apmuthu it worked.

It shall be GROUP BY ".TB_PREF."debtors_master.debtor_no

Its my pleasure. Thanks for giving us such a rich platform.

REP308

<?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_ITEMSVALREP';
// ----------------------------------------------------------------
// $ Revision:     2.1 $
// Creator:        boxygen
// date_:        2017-05-12
// Title:        Costed Inventory Movements
// ----------------------------------------------------------------
$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/ui/ui_input.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 . "/sales/includes/db/sales_types_db.inc");
include_once($path_to_root . "/inventory/includes/inventory_db.inc");

//----------------------------------------------------------------------------------------------------

inventory_movements();

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;
}


function fetch_items($category=0)
{
        $sql = "SELECT stock_id, stock.description AS name,
                stock.category_id,units,
                cat.description
            FROM ".TB_PREF."stock_master stock LEFT JOIN ".TB_PREF."stock_category cat ON stock.category_id=cat.category_id
                WHERE mb_flag <> 'D'";
        if ($category != 0)
            $sql .= " AND cat.category_id = ".db_escape($category);
        $sql .= " ORDER BY stock.category_id, stock_id";
    return db_query($sql,"No transactions were returned");
}

function trans_qty($stock_id, $location=null, $from_date, $to_date, $inward = true)
{
    if ($from_date == null)
        $from_date = Today();
    $from_date = date2sql($from_date);
    if ($to_date == null)
        $to_date = Today();
    $to_date = date2sql($to_date);
    $sql = "SELECT ".($inward ? '' : '-')."SUM(qty) FROM ".TB_PREF."stock_moves
        WHERE stock_id=".db_escape($stock_id)."
        AND tran_date >= '$from_date'
        AND tran_date <= '$to_date' AND type <> ".ST_LOCTRANSFER;
    if ($location != '')
        $sql .= " AND loc_code = ".db_escape($location);
    if ($inward)
        $sql .= " AND qty > 0 ";
    else
        $sql .= " AND qty < 0 ";
    $result = db_query($sql, "QOH calculation failed");
    $myrow = db_fetch_row($result);
    return $myrow[0];
}
function avg_unit_cost($stock_id, $location=null, $to_date)
{
    if ($to_date == null)
        $to_date = Today();
    $to_date = date2sql($to_date);
    $sql = "SELECT standard_cost, price, tran_date, type, trans_no, qty, person_id  FROM ".TB_PREF."stock_moves
        WHERE stock_id=".db_escape($stock_id)."
        AND tran_date < '$to_date' AND standard_cost > 0.001 AND qty <> 0 AND type <> ".ST_LOCTRANSFER;
    if ($location != '')
        $sql .= " AND loc_code = ".db_escape($location);
    $sql .= " ORDER BY tran_date";
    $result = db_query($sql, "No standard cost transactions were returned");
    if ($result == false)
        return 0;
    $qty = $tot_cost = 0;
    while ($row=db_fetch($result))
    {
        $qty += $row['qty'];
        $price = get_domestic_price($row, $stock_id);
        $tran_cost = $price * $row['qty'];
        $tot_cost += $tran_cost;
    }
    if ($qty != 0)
        return $tot_cost/ $qty;
    else
        return 0; //by Faisal
}
//----------------------------------------------------------------------------------------------------
function trans_qty_unit_cost($stock_id, $location=null, $from_date, $to_date, $inward = true)
{
    if ($from_date == null)
        $from_date = Today();
    $from_date = date2sql($from_date);
    if ($to_date == null)
        $to_date = Today();
    $to_date = date2sql($to_date);
    $sql = "SELECT standard_cost, price, tran_date, type, trans_no, qty, person_id FROM ".TB_PREF."stock_moves
        WHERE stock_id=".db_escape($stock_id)."
        AND tran_date <= '$to_date' AND tran_date >= '$from_date' AND standard_cost > 0.001 AND qty <> 0 AND type <> ".ST_LOCTRANSFER;
    if ($location != '')
        $sql .= " AND loc_code = ".db_escape($location);
    if ($inward)
        $sql .= " AND qty > 0 ";
    else
        $sql .= " AND qty < 0 ";
    $sql .= " ORDER BY tran_date";
    $result = db_query($sql, "No standard cost transactions were returned");
    if ($result == false)
        return 0;
    $qty = $tot_cost = 0;
    while ($row=db_fetch($result))
    {
        $qty += $row['qty'];
        $price = get_domestic_price($row, $stock_id);
        $tran_cost = $row['qty'] * $price;
        $tot_cost += $tran_cost;
    }
    if ($qty != 0)
        return $tot_cost/ $qty;
    else
        return 0; //by Faisal
}

//----------------------------------------------------------------------------------------------------

function inventory_movements()
{
    global $path_to_root;
    $from_date = $_POST['PARAM_0'];
    $to_date = $_POST['PARAM_1'];
    $category = $_POST['PARAM_2'];
    $location = $_POST['PARAM_3'];
    $comments = $_POST['PARAM_4'];
    $orientation = $_POST['PARAM_5'];
    $destination = $_POST['PARAM_6'];
    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');
    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);
    $cols = array(0, 60, 130, 160, 185, 215, 250, 275, 305, 340, 365, 395, 430, 455, 485, 520);
    $headers = array(_('Category'), _('Description'),    _('UOM'), '', '', _('OpeningStock'), '', '',_('StockIn'), '', '', _('Delivery'), '', '', _('ClosingStock'));
    $headers2 = array("", "", "", _("QTY"), _("Rate"), _("Value"), _("QTY"), _("Rate"), _("Value"), _("QTY"), _("Rate"), _("Value"), _("QTY"), _("Rate"), _("Value"));
    $aligns = array('left',    'left',    'left', 'right', 'right', 'right', 'right','right' ,'right', 'right', 'right','right', 'right', 'right', 'right');
    $params =   array(     0 => $comments,
                        1 => array('text' => _('Period'), 'from' => $from_date, 'to' => $to_date),
                        2 => array('text' => _('Category'), 'from' => $cat, 'to' => ''),
                        3 => array('text' => _('Location'), 'from' => $loc, 'to' => ''));
    $rep = new FrontReport(_('Costed Inventory Movements'), "CostedInventoryMovements", user_pagesize(), 8, $orientation);
    if ($orientation == 'L')
        recalculate_cols($cols);
    $rep->Font();
    $rep->Info($params, $cols, $headers2, $aligns, $cols, $headers, $aligns);
    $rep->NewPage();
    $totval_open = $totval_in = $totval_out = $totval_close = 0;
    $result = fetch_items($category);
    $dec = user_price_dec();
    $catgor = '';
    while ($myrow=db_fetch($result))
    {
        if ($catgor != $myrow['description'])
        {
            $rep->NewLine(2);
            $rep->fontSize += 2;
            $rep->TextCol(0, 3, $myrow['category_id'] . " - " . $myrow['description']);
            $catgor = $myrow['description'];
            $rep->fontSize -= 2;
            $rep->NewLine();
        }
        $qoh_start = get_qoh_on_date($myrow['stock_id'], $location, add_days($from_date, -1));
        $qoh_end = get_qoh_on_date($myrow['stock_id'], $location, $to_date);
        $inward = trans_qty($myrow['stock_id'], $location, $from_date, $to_date);
        $outward = trans_qty($myrow['stock_id'], $location, $from_date, $to_date, false);
        $openCost = avg_unit_cost($myrow['stock_id'], $location, $from_date);
        $unitCost = avg_unit_cost($myrow['stock_id'], $location, add_days($to_date, 1));
        if ($qoh_start == 0 && $inward == 0 && $outward == 0 && $qoh_end == 0)
            continue;
        $rep->NewLine();
        $rep->TextCol(0, 1,    $myrow['stock_id']);
        $rep->TextCol(1, 2, $myrow['name']);
        $rep->TextCol(2, 3, $myrow['units']);
        $rep->AmountCol(3, 4, $qoh_start, get_qty_dec($myrow['stock_id']));
        $rep->AmountCol(4, 5, $openCost, $dec);
        $openCost *= $qoh_start;
        $totval_open += $openCost;
        $rep->AmountCol(5, 6, $openCost);
        if($inward>0){
            $rep->AmountCol(6, 7, $inward, get_qty_dec($myrow['stock_id']));
            $unitCost_in = trans_qty_unit_cost($myrow['stock_id'], $location, $from_date, $to_date);
            $rep->AmountCol(7, 8, $unitCost_in,$dec);
            $unitCost_in *= $inward;
            $totval_in += $unitCost_in;
            $rep->AmountCol(8, 9, $unitCost_in);
        }
        if($outward>0){
            $rep->AmountCol(9, 10, $outward, get_qty_dec($myrow['stock_id']));
            $unitCost_out =    trans_qty_unit_cost($myrow['stock_id'], $location, $from_date, $to_date, false);
            $rep->AmountCol(10, 11, $unitCost_out,$dec);
            $unitCost_out *= $outward;
            $totval_out += $unitCost_out;
            $rep->AmountCol(11, 12, $unitCost_out);
        }
        $rep->AmountCol(12, 13, $qoh_end, get_qty_dec($myrow['stock_id']));
        $rep->AmountCol(13, 14, $unitCost,$dec);
        $unitCost *= $qoh_end;
        $totval_close += $unitCost;
        $rep->AmountCol(14, 15, $unitCost);
        $rep->NewLine(0, 1);
    }
    $rep->Line($rep->row  - 4);
    $rep->NewLine(2);
    $rep->TextCol(0, 1,    _("Total"));
    $rep->AmountCol(5, 6, $totval_open);
    $rep->AmountCol(8, 9, $totval_in);
    $rep->AmountCol(11, 12, $totval_out);
    $rep->AmountCol(14, 15, $totval_close);
    $rep->Line($rep->row  - 4);
    $rep->End();
}
?>

REP301

<?php
$page_security = 'SA_ITEMSVALREP';
// ----------------------------------------------------------------
// $ Revision:    2.0 $
// Creator:    Joe Hunt
// date_:    2005-05-19
// Title:    Inventory Valuation
// ----------------------------------------------------------------
$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 . "/inventory/includes/db/items_category_db.inc");

//----------------------------------------------------------------------------------------------------

print_inventory_valuation_report();

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;
}

function getAverageCost($stock_id, $to_date)
{
    if ($to_date == null)
        $to_date = Today();

    $to_date = date2sql($to_date);

    $sql = "SELECT standard_cost, price, tran_date, type, trans_no, qty, person_id FROM ".TB_PREF."stock_moves
        WHERE stock_id=".db_escape($stock_id)."
        AND tran_date <= '$to_date' AND standard_cost > 0.001 AND qty <> 0 AND type <> ".ST_LOCTRANSFER;

    $sql .= " ORDER BY tran_date";

    $result = db_query($sql, "No standard cost transactions were returned");
    if ($result == false)
        return 0;
    $qty = $old_qty = $count = $old_std_cost = $tot_cost = 0;
    while ($row=db_fetch($result))
    {
        $qty += $row['qty'];

        $price = get_domestic_price($row, $stock_id);

        //$old_std_cost = $row['standard_cost'];
        $tran_cost = $row['qty'] * $price;
        $tot_cost += $tran_cost;
        //$count++;
        $old_qty = $qty;
    }
    if ($qty == 0)
        return 0;
        return $tot_cost / $qty;
}

function getTransactions($category, $location, $date)
{
    $date = date2sql($date);

    $sql = "SELECT ".TB_PREF."stock_master.category_id,
            ".TB_PREF."stock_category.description AS cat_description,
            ".TB_PREF."stock_master.stock_id,
            ".TB_PREF."stock_master.units,
            ".TB_PREF."stock_master.description, ".TB_PREF."stock_master.inactive,
            ".TB_PREF."stock_moves.loc_code,
            SUM(".TB_PREF."stock_moves.qty) AS QtyOnHand,
            ".TB_PREF."stock_master.material_cost + ".TB_PREF."stock_master.labour_cost + ".TB_PREF."stock_master.overhead_cost AS UnitCost,
            SUM(".TB_PREF."stock_moves.qty) *(".TB_PREF."stock_master.material_cost + ".TB_PREF."stock_master.labour_cost + ".TB_PREF."stock_master.overhead_cost) AS ItemTotal
            FROM ".TB_PREF."stock_master,
            ".TB_PREF."stock_category,
            ".TB_PREF."stock_moves
        WHERE ".TB_PREF."stock_master.stock_id=".TB_PREF."stock_moves.stock_id
        AND ".TB_PREF."stock_master.category_id=".TB_PREF."stock_category.category_id
        AND ".TB_PREF."stock_master.mb_flag<>'D'
        AND ".TB_PREF."stock_moves.tran_date <= '$date'
        GROUP BY ".TB_PREF."stock_master.category_id,
            ".TB_PREF."stock_category.description, ";
        if ($location != 'all')
            $sql .= TB_PREF."stock_moves.loc_code, ";
        $sql .= TB_PREF."stock_master.stock_id,
            ".TB_PREF."stock_master.description
        HAVING SUM(".TB_PREF."stock_moves.qty) != 0";
        if ($category != 0)
            $sql .= " AND ".TB_PREF."stock_master.category_id = ".db_escape($category);
        if ($location != 'all')
            $sql .= " AND ".TB_PREF."stock_moves.loc_code = ".db_escape($location);
        $sql .= " ORDER BY ".TB_PREF."stock_master.category_id,
            ".TB_PREF."stock_master.stock_id";

    return db_query($sql,"No transactions were returned");
}

//----------------------------------------------------------------------------------------------------

function print_inventory_valuation_report()
{
    global $path_to_root, $use_costed_values;;

    $date = $_POST['PARAM_0'];
    $category = $_POST['PARAM_1'];
    $location = $_POST['PARAM_2'];
    $detail = $_POST['PARAM_3'];
    $comments = $_POST['PARAM_4'];
    $orientation = $_POST['PARAM_5'];
    $destination = $_POST['PARAM_6'];
    if ($destination)
        include_once($path_to_root . "/reporting/includes/excel_report.inc");
    else
        include_once($path_to_root . "/reporting/includes/pdf_report.inc");
    $detail = !$detail;
    $dec = user_price_dec();

    $orientation = ($orientation ? 'L' : 'P');
    if ($category == ALL_NUMERIC)
        $category = 0;
    if ($category == 0)
        $cat = _('All');
    else
        $cat = get_category_name($category);

    if ($location == ALL_TEXT)
        $location = 'all';
    if ($location == 'all')
        $loc = _('All');
    else
        $loc = get_location_name($location);

    $cols = array(0, 75, 225, 250, 350, 450,    515);

    $headers = array(_('Category'), '', _('UOM'), _('Quantity'), _('Unit Cost'), _('Value'));

    $aligns = array('left',    'left',    'left', 'right', 'right', 'right');

    $params =   array(     0 => $comments,
                        1 => array('text' => _('End Date'), 'from' => $date,         'to' => ''),
                        2 => array('text' => _('Category'), 'from' => $cat, 'to' => ''),
                        3 => array('text' => _('Location'), 'from' => $loc, 'to' => ''));

    $rep = new FrontReport(_('Inventory Valuation Report'), "InventoryValReport", user_pagesize(), 9, $orientation);
    if ($orientation == 'L')
        recalculate_cols($cols);
    $rep->Font();
    $rep->Info($params, $cols, $headers, $aligns);
    $rep->NewPage();

    $res = getTransactions($category, $location, $date);
    $total = $grandtotal = 0.0;
    $catt = '';
    while ($trans=db_fetch($res))
    {
        if ($catt != $trans['cat_description'])
        {
            if ($catt != '')
            {
                if ($detail)
                {
                    $rep->NewLine(2, 3);
                    $rep->TextCol(0, 4, _('Total'));
                }
                $rep->AmountCol(5, 6, $total, $dec);
                if ($detail)
                {
                    $rep->Line($rep->row - 2);
                    $rep->NewLine();
                }
                $rep->NewLine();
                $total = 0.0;
            }
            $rep->TextCol(0, 1, $trans['category_id']);
            $rep->TextCol(1, 2, $trans['cat_description']);
            $catt = $trans['cat_description'];
            if ($detail)
                $rep->NewLine();
        }
        if (isset($use_costed_values) && $use_costed_values==1)
        {
            $UnitCost = getAverageCost($trans['stock_id'], $date);
            $ItemTotal = $trans['QtyOnHand'] * $UnitCost;
        }
        else
        {
            $UnitCost = $trans['UnitCost'];
            $ItemTotal = $trans['ItemTotal'];
        }
        if ($detail)
        {
            $rep->NewLine();
            $rep->fontSize -= 2;
            $rep->TextCol(0, 1, $trans['stock_id']);
            $rep->TextCol(1, 2, $trans['description'].($trans['inactive']==1 ? " ("._("Inactive").")" : ""), -1);
            $rep->TextCol(2, 3, $trans['units']);
            $rep->AmountCol(3, 4, $trans['QtyOnHand'], get_qty_dec($trans['stock_id']));

            $dec2 = 0;
            price_decimal_format($UnitCost, $dec2);
            $rep->AmountCol(4, 5, $UnitCost, $dec2);
            $rep->AmountCol(5, 6, $ItemTotal, $dec);
            $rep->fontSize += 2;
        }
        $total += $ItemTotal;
        $grandtotal += $ItemTotal;
    }
    if ($detail)
    {
        $rep->NewLine(2, 3);
        $rep->TextCol(0, 4, _('Total'));
    }
    $rep->Amountcol(5, 6, $total, $dec);
    if ($detail)
    {
        $rep->Line($rep->row - 2);
        $rep->NewLine();
    }
    $rep->NewLine(2, 1);
    $rep->TextCol(0, 4, _('Grand Total'));
    $rep->AmountCol(5, 6, $grandtotal, $dec);
    $rep->Line($rep->row  - 4);
    $rep->NewLine();
    $rep->End();
}

?>

Hurrah,

Finally got all reports reconciled with each other as well as with GL.

However I am not claiming so please have a critical look.

I edited the function get_domestic_price() in both rep301 and rep308.

Now both of them are reconciled with each other as well as GL whether you set the flag $use_costed_value to 1 or 0.

There is again a logical Bug in rep301. If we set $use_costed_value = 1 it will call function getAverageCost(). In this function the algorithm to calculate Average Cost is not Weighted Average.

Please change with the following Code from Line 81 to 93

$qty += $row['qty'];

        $price = $row['standard_cost']; //get_domestic_price($row, $stock_id, $qty, $old_std_cost, $old_qty);

        //$old_std_cost = $row['standard_cost'];
        $tran_cost = $row['qty'] * $price;
        $tot_cost += $tran_cost;
        //$count++;
        $old_qty = $qty;
    }
    if ($qty == 0)
        return 0;
        return $tot_cost / $qty;

Here again there is no use of function get_domestic_price.

After committing this change the Costed Inventory Valuation by rep301 is same as that of rep308.

But both these Inventory Valuations are not reconciling with that of Trial Balance.

While with value of $use_costed_value = 0 the Inventory Valuation of rep301 reconciles with Trial Balance.

So now we are in a fix whether to reconcile rep301 with rep308 or with GL.

We need to further look into it minutely that these two reports shall also match with GL.

/Faisal

Thanks Joe,

Its a great pleasure for me that I have contributed to FA.

We can't change rep301 because it is reconciled with the Inventory Valuation given by Trial Balance.

I am looking into this report further to have it reconciled with rep301 also.

/Faisal

The Exchange Rate Factor will only affect when we pick the rate from Supplier's table. But doing that will again disturb this report. Since I am picking the rate from stock_moves table and this rate is already adjusted by the exchange rate at the time of transaction so no need to take into account the factor of exchange rate.

I have made few adjustments to this report.

1. Forced to return only the standard cost of the transaction instead of any supplier price or any other factor from the function get_domestic_price()

2. The Weighted Average Cost Calculation was not done in two functions avg_unit_cost() and trans_qty_unit_cost()

Now this report is reconciled means it is showing the result Opening Stock + Stock In - Delivers = Closing Stock

But it has few assumptions.

The Closing Stock Value may differ from Stock Valuation Report because in this report the base is only Transactional Cost i.e. standard_cost from stock_moves table. While the Stock Valuation report depends on latest Avg Cost of the item.

Please check and confirm.