Please note my repo is very much customized.
I have tested this in core repo and it is working
But you need to recheck with core and remove my customization if any

<?php
/**********************************************************************
    Copyright (C) Boxygen, 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_SUPPLIERANALYTIC';
// ----------------------------------------------------------------
// $ Revision:    2.0 $
// Creator:    Joe Hunt
// date_:    2005-05-19
// Title:    Supplier Balances
// ----------------------------------------------------------------
// $path_to_root=".."; //Fro Cron

//include_once($path_to_root . "/includes/session.inc"); //For Cron
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");

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

print_supplier_balances();

function get_open_balance($supplier_id, $to)
{
    if($to)
        $to = date2sql($to);

        $sql = "SELECT SUM(IF(t.type = ".ST_SUPPINVOICE." OR (t.type IN (".ST_JOURNAL." , ".ST_BANKDEPOSIT.", ".ST_BANKDEPOSIT.") AND t.ov_amount>0),
                        -abs(t.ov_amount + t.ov_gst + t.ov_discount), 0)) AS charges,";

 $sql .= "SUM(IF(t.type != ".ST_SUPPINVOICE." AND NOT(t.type IN (".ST_JOURNAL." , ".ST_BANKDEPOSIT.", ".ST_BANKDEPOSIT.") AND t.ov_amount>0),
                        abs(t.ov_amount + t.ov_gst + t.ov_discount) * -1, 0)) AS credits,";

     $sql .= "SUM(IF(t.type != ".ST_SUPPINVOICE." AND NOT(t.type IN (".ST_JOURNAL." , ".ST_BANKDEPOSIT." , ".ST_BANKDEPOSIT.")), t.alloc * -1, t.alloc)) AS Allocated,";

     $sql .=    "SUM(IF(t.type = ".ST_SUPPINVOICE.", 1, -1) *
             (abs(t.ov_amount + t.ov_gst + t.ov_discount) - abs(t.alloc))) AS OutStanding
        FROM ".TB_PREF."supp_trans t
        WHERE t.supplier_id = ".db_escape($supplier_id);
    if ($to)
        $sql .= " AND t.tran_date < '$to'";
    $sql .= " GROUP BY supplier_id";

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


function getTransactions($supplier_id, $from, $to)
{
    $from = date2sql($from);
    $to = date2sql($to);
//memo added by faisal
    $sql = "SELECT ".TB_PREF."supp_trans.*, comments.memo_,
                (".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount)
                AS TotalAmount, ".TB_PREF."supp_trans.alloc AS Allocated,
                ((".TB_PREF."supp_trans.type = ".ST_SUPPINVOICE.")
                    AND ".TB_PREF."supp_trans.due_date < '$to') AS OverDue
                FROM ".TB_PREF."supp_trans
                    LEFT JOIN ".TB_PREF."comments comments ON ".TB_PREF."supp_trans.type=comments.type AND ".TB_PREF."supp_trans.trans_no=comments.id
                     WHERE ".TB_PREF."supp_trans.tran_date >= '$from' AND ".TB_PREF."supp_trans.tran_date <= '$to'
                AND ".TB_PREF."supp_trans.supplier_id = '$supplier_id' AND ".TB_PREF."supp_trans.ov_amount!=0
                    ORDER BY ".TB_PREF."supp_trans.tran_date";

    $TransResult = db_query($sql,"No transactions were returned");

    return $TransResult;
}


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

function print_supplier_balances()
{
        global $path_to_root, $systypes_array;

        $from = $_POST['PARAM_0'];
        $to = $_POST['PARAM_1'];
        $fromsupp = $_POST['PARAM_2'];
        $show_balance = $_POST['PARAM_3'];
        $currency = $_POST['PARAM_4'];
        $no_zeros = $_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');
    if ($fromsupp == ALL_TEXT)
        $supp = _('All');
    else
        $supp = get_supplier_name($fromsupp);
        $dec = user_price_dec();

    if ($currency == ALL_TEXT)
    {
        $convert = true;
        $currency = _('Balances in Home currency');
    }
    else
        $convert = false;

    if ($no_zeros) $nozeros = _('Yes');
    else $nozeros = _('No');

    $cols = array(0, 80, 130, 190,    250, 320, 385, 450,    515);

    $headers = array(_('Trans Type'), _('#'), _('Date'), _('Due Date'), _('Debit'),
        _('Credit'), _('Allocated'), _('Outstanding'));

    if ($show_balance)
        $headers[7] = _('Balance');
    $aligns = array('left',    'left',    'left',    'left',    'right', 'right', 'right', 'right');

    $params =   array(     0 => $comments,
                1 => array('text' => _('Period'), 'from' => $from, 'to' => $to),
                2 => array('text' => _('Supplier'), 'from' => $supp, 'to' => ''),
                3 => array(  'text' => _('Currency'),'from' => $currency, 'to' => ''),
            4 => array('text' => _('Suppress Zeros'), 'from' => $nozeros, 'to' => ''));

    $rep = new FrontReport(_('Supplier Ledger'), "SupplierBalances", user_pagesize(), 8, $orientation);
    if ($orientation == 'L')
        recalculate_cols($cols);

    $rep->Font();
    $rep->Info($params, $cols, $headers, $aligns);
    $rep->NewPage();

    $total = array();
    $grandtotal = array(0,0,0,0);

    $sql = "SELECT supplier_id, supp_name AS name, curr_code FROM ".TB_PREF."suppliers";
    if ($fromsupp != ALL_TEXT)
        $sql .= " WHERE supplier_id=".db_escape($fromsupp);
    $sql .= " ORDER BY supp_name";
    $result = db_query($sql, "The customers could not be retrieved");

    while ($myrow=db_fetch($result))
    {
        if (!$convert && $currency != $myrow['curr_code'])
            continue;
        $accumulate = 0;
        $rate = $convert ? get_exchange_rate_from_home_currency($myrow['curr_code'], Today()) : 1;
        $bal = get_open_balance($myrow['supplier_id'], $from);
        $init[0] = $init[1] = 0.0;
        $init[0] = round2(abs($bal['charges']*$rate), $dec);
        $init[1] = round2(Abs($bal['credits']*$rate), $dec);
        $init[2] = round2($bal['Allocated']*$rate, $dec);
        if ($show_balance)
        {
            $init[3] = $init[1] - $init[0];
            $accumulate += $init[3];
        }
        else
            $init[3] = round2($bal['OutStanding']*$rate, $dec);
        $res = getTransactions($myrow['supplier_id'], $from, $to);
        if ($no_zeros && db_num_rows($res) == 0) continue;

        $rep->fontSize += 2;
        $rep->TextCol(0, 2, $myrow['name']);
        if ($convert) $rep->TextCol(2, 3,    $myrow['curr_code']);
        $rep->fontSize -= 2;
        $rep->TextCol(3, 4,    _("Open Balance"));
        $rep->AmountCol(5, 6, $init[0], $dec);
        $rep->AmountCol(4, 5, $init[1], $dec);
        $rep->AmountCol(6, 7, $init[2], $dec);
        $rep->AmountCol(7, 8, $init[3], $dec);
        $total = array(0,0,0,0);
        for ($i = 0; $i < 4; $i++)
        {
            $total[$i] += $init[$i];
            $grandtotal[$i] += $init[$i];
        }
        $rep->NewLine(1, 2);
        $rep->Line($rep->row + 4);
        if (db_num_rows($res)==0) {
            $rep->NewLine(1, 2);
            continue;
        }
        while ($trans=db_fetch($res))
        {
            if ($no_zeros && floatcmp(abs($trans['TotalAmount']), $trans['Allocated']) == 0) continue;
            $rep->NewLine(1, 2);
            $rep->TextCol(0, 1, $systypes_array[$trans['type']]);
            $rep->TextCol(1, 2,    $trans['reference']);
            $rep->DateCol(2, 3,    $trans['tran_date'], true);
            if ($trans['type'] == ST_SUPPINVOICE)
                $rep->DateCol(3, 4,    $trans['due_date'], true);
            $item[0] = $item[1] = 0.0;
            if ($trans['TotalAmount'] > 0.0)
            {
                $item[0] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $rep->AmountCol(5, 6, $item[0], $dec);
                $accumulate -= $item[0];
            }
            else
            {
                $item[1] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $rep->AmountCol(4, 5, $item[1], $dec);
                $accumulate += $item[1];
            }
            $item[2] = round2($trans['Allocated'] * $rate, $dec);
            $rep->AmountCol(6, 7, $item[2], $dec);
            if ($trans['TotalAmount'] > 0.0)
                $item[3] = $item[2] - $item[0];
            else
                $item[3] = ($item[2] - $item[1]) * -1;
            if ($show_balance)
                $rep->AmountCol(7, 8, $accumulate, $dec);
            else
                $rep->AmountCol(7, 8, $item[3], $dec);
            for ($i = 0; $i < 4; $i++)
            {
                $total[$i] += $item[$i];
                $grandtotal[$i] += $item[$i];
            }
            if ($show_balance)
                $total[3] = $total[1] - $total[0];

                // $gl_memo = get_gl_memo($trans['type'], -round2($trans['TotalAmount'] * $rate, $dec), $trans['trans_no'], null, $myrow['supplier_id'], PT_SUPPLIER);
                $memo = $gl_memo != "" ? $gl_memo : $trans['memo_'];

                if ($memo <> "")
                {
                        $rep->NewLine(1, 2);
                        $rep->fontSize -= 2;
                        $rep->TextCol(1, 8,    $memo); // added by faisal
                        $rep->fontSize += 2;

                }
                $rep->Line($rep->row - 2);

        }
        $rep->Line($rep->row - 8);

        $rep->NewLine(2);

        $rep->TextCol(0, 1, _('Total Activity'));
        // $rep->TextCol(2, 6, $myrow['name']);
        $rep->AmountCol(5, 6, $total[0] - $init[0], $dec);
        $rep->AmountCol(4, 5, $total[1] - $init[1], $dec);

        $rep->NewLine(2);
        $rep->TextCol(0, 3,    _('Total'));
        $rep->AmountCol(5, 6, $total[0], $dec);
        $rep->AmountCol(4, 5, $total[1], $dec);

        for ($i = 2; $i < 4; $i++)
        {
            $rep->AmountCol($i + 4, $i + 5, $total[$i], $dec);
            $total[$i] = 0.0;
        }
        $rep->Line($rep->row  - 4);
        $rep->NewLine(2);
    }
    $rep->fontSize += 2;
    $rep->TextCol(0, 3,    _('Grand Total'));
    $rep->fontSize -= 2;
    if ($show_balance)
        $grandtotal[3] = $grandtotal[1] - $grandtotal[0];
$rep->AmountCol(4,  5,$grandtotal[1], $dec);
$rep->AmountCol(5,  6,$grandtotal[0], $dec);

    for ($i = 2; $i < 4; $i++)
        $rep->AmountCol($i + 4, $i + 5,$grandtotal[$i], $dec);
    $rep->Line($rep->row  - 4);
    $rep->NewLine();
    $rep->End();
}

?>

You can comment that line

29

(4 replies, posted in Wish List)

1. In FA currently we can't produce multiple products from one single process. I have a customization that can produce multiple products and it disctibutes the Work In Process cost as a weighted average to all produced items taking the Selling Price of the product as a Weight.

2. Such requirements are very specific. In FA we are providing a Generic platform for masses. For specific requirements you need to create modules.

5. There are few POS available as a modules created by some developers like @notrinos. you can contact them and integrate them in your repo

30

(2 replies, posted in Reporting)

Support on older versions is difficult. A lot has been changed in FA and PHP both..

31

(1 replies, posted in Reporting)

Have you checked the proper reference is defined for this transaction type in Setup >> Transaction References?

Can you elaborate further?

33

(2 replies, posted in Wish List)

Dimensions can be used as Cost Centers.

Which version of FA and PHP you are using?

Your supplier balances report is not same as core. You have done customization.
In Core The Column Names are Charges and Credits.
Charges is what you means as Credit
Credits is what you mean as Debit.
I have a Customized Supplier Ledger Report given below. I hope that works for your repo.

<?php

$page_security = 'SA_SUPPLIERANALYTIC';
// ----------------------------------------------------------------
// $ Revision:    2.0 $
// Creator:    Joe Hunt
// date_:    2005-05-19
// Title:    Supplier Balances
// ----------------------------------------------------------------
// $path_to_root=".."; //Fro Cron

//include_once($path_to_root . "/includes/session.inc"); //For Cron
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");

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

print_supplier_balances();

function get_open_balance($supplier_id, $to)
{
    if($to)
        $to = date2sql($to);

        $sql = "SELECT SUM(IF(t.type = ".ST_SUPPINVOICE." OR (t.type IN (".ST_JOURNAL." , ".ST_BANKDEPOSIT.", ".ST_CASHDEPOSIT.") AND t.ov_amount>0),
                        -abs(t.ov_amount + t.ov_gst + t.ov_discount), 0)) AS charges,";

 $sql .= "SUM(IF(t.type != ".ST_SUPPINVOICE." AND NOT(t.type IN (".ST_JOURNAL." , ".ST_BANKDEPOSIT.", ".ST_CASHDEPOSIT.") AND t.ov_amount>0),
                        abs(t.ov_amount + t.ov_gst + t.ov_discount) * -1, 0)) AS credits,";

     $sql .= "SUM(IF(t.type != ".ST_SUPPINVOICE." AND NOT(t.type IN (".ST_JOURNAL." , ".ST_BANKDEPOSIT." , ".ST_CASHDEPOSIT.")), t.alloc * -1, t.alloc)) AS Allocated,";

     $sql .=    "SUM(IF(t.type = ".ST_SUPPINVOICE.", 1, -1) *
             (abs(t.ov_amount + t.ov_gst + t.ov_discount) - abs(t.alloc))) AS OutStanding
        FROM ".TB_PREF."supp_trans t
        WHERE t.supplier_id = ".db_escape($supplier_id);
    if ($to)
        $sql .= " AND t.tran_date < '$to'";
    $sql .= " GROUP BY supplier_id";

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


function getTransactions($supplier_id, $from, $to)
{
    $from = date2sql($from);
    $to = date2sql($to);
//memo added by faisal
    $sql = "SELECT ".TB_PREF."supp_trans.*, comments.memo_,
                (".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount)
                AS TotalAmount, ".TB_PREF."supp_trans.alloc AS Allocated,
                ((".TB_PREF."supp_trans.type = ".ST_SUPPINVOICE.")
                    AND ".TB_PREF."supp_trans.due_date < '$to') AS OverDue
                FROM ".TB_PREF."supp_trans
                    LEFT JOIN ".TB_PREF."comments comments ON ".TB_PREF."supp_trans.type=comments.type AND ".TB_PREF."supp_trans.trans_no=comments.id
                     WHERE ".TB_PREF."supp_trans.tran_date >= '$from' AND ".TB_PREF."supp_trans.tran_date <= '$to'
                AND ".TB_PREF."supp_trans.supplier_id = '$supplier_id' AND ".TB_PREF."supp_trans.ov_amount!=0
                    ORDER BY ".TB_PREF."supp_trans.tran_date";

    $TransResult = db_query($sql,"No transactions were returned");

    return $TransResult;
}


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

function print_supplier_balances()
{
        global $path_to_root, $systypes_array;

        $from = $_POST['PARAM_0'];
        $to = $_POST['PARAM_1'];
        $fromsupp = $_POST['PARAM_2'];
        $show_balance = $_POST['PARAM_3'];
        $currency = $_POST['PARAM_4'];
        $no_zeros = $_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');
    if ($fromsupp == ALL_TEXT)
        $supp = _('All');
    else
        $supp = get_supplier_name($fromsupp);
        $dec = user_price_dec();

    if ($currency == ALL_TEXT)
    {
        $convert = true;
        $currency = _('Balances in Home currency');
    }
    else
        $convert = false;

    if ($no_zeros) $nozeros = _('Yes');
    else $nozeros = _('No');

    $cols = array(0, 80, 130, 190,    250, 320, 385, 450,    515);

    $headers = array(_('Trans Type'), _('#'), _('Date'), _('Due Date'), _('Debit'),
        _('Credit'), _('Allocated'), _('Outstanding'));

    if ($show_balance)
        $headers[7] = _('Balance');
    $aligns = array('left',    'left',    'left',    'left',    'right', 'right', 'right', 'right');

    $params =   array(     0 => $comments,
                1 => array('text' => _('Period'), 'from' => $from, 'to' => $to),
                2 => array('text' => _('Supplier'), 'from' => $supp, 'to' => ''),
                3 => array(  'text' => _('Currency'),'from' => $currency, 'to' => ''),
            4 => array('text' => _('Suppress Zeros'), 'from' => $nozeros, 'to' => ''));

    $rep = new FrontReport(_('Supplier Ledger'), "SupplierBalances", user_pagesize(), 8, $orientation);
    if ($orientation == 'L')
        recalculate_cols($cols);

    $rep->Font();
    $rep->Info($params, $cols, $headers, $aligns);
    $rep->NewPage();

    $total = array();
    $grandtotal = array(0,0,0,0);

    $sql = "SELECT supplier_id, supp_name AS name, curr_code FROM ".TB_PREF."suppliers";
    if ($fromsupp != ALL_TEXT)
        $sql .= " WHERE supplier_id=".db_escape($fromsupp);
    $sql .= " ORDER BY supp_name";
    $result = db_query($sql, "The customers could not be retrieved");

    while ($myrow=db_fetch($result))
    {
        if (!$convert && $currency != $myrow['curr_code'])
            continue;
        $accumulate = 0;
        $rate = $convert ? get_exchange_rate_from_home_currency($myrow['curr_code'], Today()) : 1;
        $bal = get_open_balance($myrow['supplier_id'], $from);
        $init[0] = $init[1] = 0.0;
        $init[0] = round2(abs($bal['charges']*$rate), $dec);
        $init[1] = round2(Abs($bal['credits']*$rate), $dec);
        $init[2] = round2($bal['Allocated']*$rate, $dec);
        if ($show_balance)
        {
            $init[3] = $init[1] - $init[0];
            $accumulate += $init[3];
        }
        else
            $init[3] = round2($bal['OutStanding']*$rate, $dec);
        $res = getTransactions($myrow['supplier_id'], $from, $to);
        if ($no_zeros && db_num_rows($res) == 0) continue;

        $rep->fontSize += 2;
        $rep->TextCol(0, 2, $myrow['name']);
        if ($convert) $rep->TextCol(2, 3,    $myrow['curr_code']);
        $rep->fontSize -= 2;
        $rep->TextCol(3, 4,    _("Open Balance"));
        $rep->AmountCol(5, 6, $init[0], $dec);
        $rep->AmountCol(4, 5, $init[1], $dec);
        $rep->AmountCol(6, 7, $init[2], $dec);
        $rep->AmountCol(7, 8, $init[3], $dec);
        $total = array(0,0,0,0);
        for ($i = 0; $i < 4; $i++)
        {
            $total[$i] += $init[$i];
            $grandtotal[$i] += $init[$i];
        }
        $rep->NewLine(1, 2);
        $rep->Line($rep->row + 4);
        if (db_num_rows($res)==0) {
            $rep->NewLine(1, 2);
            continue;
        }
        while ($trans=db_fetch($res))
        {
            if ($no_zeros && floatcmp(abs($trans['TotalAmount']), $trans['Allocated']) == 0) continue;
            $rep->NewLine(1, 2);
            $rep->TextCol(0, 1, $systypes_array[$trans['type']]);
            $rep->TextCol(1, 2,    $trans['reference']);
            $rep->DateCol(2, 3,    $trans['tran_date'], true);
            if ($trans['type'] == ST_SUPPINVOICE)
                $rep->DateCol(3, 4,    $trans['due_date'], true);
            $item[0] = $item[1] = 0.0;
            if ($trans['TotalAmount'] > 0.0)
            {
                $item[0] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $rep->AmountCol(5, 6, $item[0], $dec);
                $accumulate -= $item[0];
            }
            else
            {
                $item[1] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $rep->AmountCol(4, 5, $item[1], $dec);
                $accumulate += $item[1];
            }
            $item[2] = round2($trans['Allocated'] * $rate, $dec);
            $rep->AmountCol(6, 7, $item[2], $dec);
            if ($trans['TotalAmount'] > 0.0)
                $item[3] = $item[2] - $item[0];
            else
                $item[3] = ($item[2] - $item[1]) * -1;
            if ($show_balance)
                $rep->AmountCol(7, 8, $accumulate, $dec);
            else
                $rep->AmountCol(7, 8, $item[3], $dec);
            for ($i = 0; $i < 4; $i++)
            {
                $total[$i] += $item[$i];
                $grandtotal[$i] += $item[$i];
            }
            if ($show_balance)
                $total[3] = $total[1] - $total[0];

                $gl_memo = get_gl_memo($trans['type'], -round2($trans['TotalAmount'] * $rate, $dec), $trans['trans_no'], null, $myrow['supplier_id'], PT_SUPPLIER);
                $memo = $gl_memo != "" ? $gl_memo : $trans['memo_'];

                if ($memo <> "")
                {
                        $rep->NewLine(1, 2);
                        $rep->fontSize -= 2;
                        $rep->TextCol(1, 8,    $memo); // added by faisal
                        $rep->fontSize += 2;

                }
                $rep->Line($rep->row - 2);

        }
        $rep->Line($rep->row - 8);

        $rep->NewLine(2);

        $rep->TextCol(0, 1, _('Total Activity'));
        // $rep->TextCol(2, 6, $myrow['name']);
        $rep->AmountCol(5, 6, $total[0] - $init[0], $dec);
        $rep->AmountCol(4, 5, $total[1] - $init[1], $dec);

        $rep->NewLine(2);
        $rep->TextCol(0, 3,    _('Total'));
        $rep->AmountCol(5, 6, $total[0], $dec);
        $rep->AmountCol(4, 5, $total[1], $dec);

        for ($i = 2; $i < 4; $i++)
        {
            $rep->AmountCol($i + 4, $i + 5, $total[$i], $dec);
            $total[$i] = 0.0;
        }
        $rep->Line($rep->row  - 4);
        $rep->NewLine(2);
    }
    $rep->fontSize += 2;
    $rep->TextCol(0, 3,    _('Grand Total'));
    $rep->fontSize -= 2;
    if ($show_balance)
        $grandtotal[3] = $grandtotal[1] - $grandtotal[0];
$rep->AmountCol(4,  5,$grandtotal[1], $dec);
$rep->AmountCol(5,  6,$grandtotal[0], $dec);

    for ($i = 2; $i < 4; $i++)
        $rep->AmountCol($i + 4, $i + 5,$grandtotal[$i], $dec);
    $rep->Line($rep->row  - 4);
    $rep->NewLine();
    $rep->End();
}

?>

Hello,

In purchasing/includes/purchasing_db.inc the below function call on Line # 200 the third last argument true is additional I think

$inv->add_grn_to_trans($line->grn_item_id, $line->po_detail_rec, $line->stock_id,
            $line->item_description, $line->receive_qty, 0, $line->receive_qty,
            $line->price, $line->price, true, get_unit_cost($line->stock_id), '');
function add_grn_to_trans($grn_item_id, $po_detail_item, $item_code, $item_description, 
        $qty_recd, $prev_quantity_inv, $this_quantity_inv, $order_price, $chg_price, 
        $std_cost_unit=null, $gl_code='')
    {
        $this->grn_items[$grn_item_id] = new grn_item($grn_item_id, $po_detail_item, 
            $item_code, $item_description, $qty_recd, $prev_quantity_inv, $this_quantity_inv, 
            $order_price, $chg_price, $std_cost_unit, $gl_code, $this->tax_included);

        $this->src_docs = find_src_invoices($this);

        unset($this->tax_overrides); // cancel tax overrides after cart change
        return 1;
    }

You can share your code here so that any one else can also get benefit from that if needed.
And off course depending on regional requirements FA can be modified.

38

(1 replies, posted in Accounts Receivable)

I think you are talking about Overall Invoice Discount. Currently we have Line Item Based Discount in FA But Overall Discount I think that needs to be customized.

In Customer Payments the discount is basically Early Payment Discount and not the discount on Sales.

I have been facing this issue quite a long but couldn't find the reason becuase this is not happening always but only once in 1000 attempts may be.

While Creating Invoice From Delivery Notes a function write_customer_trans_detail_item is called from customer_invoice.php with following backtrace and function arguments

Function Arguments
(
    [0] => 10
    [1] => 916
    [2] => 10036
    [3] => 50/3 Polyester Color SKY 2500
    [4] => 88
    [5] => 139
    [6] => 0
    [7] => 0
    [8] => 62.160883841992
    [9] => 9783
    [10] => 9783
)
/home/sites/22a/e/eeb3fd1d98/public_html/boxyerp/sales/includes/db/sales_invoice_db.inc:122: write_customer_trans_detail_item('10','916','10036','50/3 Polyester Color SKY 2500','88','139','0','0','62.160883841992','9783','9783')

/home/sites/22a/e/eeb3fd1d98/public_html/boxyerp/sales/includes/cart_class.inc:343: write_sales_invoice((Cart Object))

/home/sites/22a/e/eeb3fd1d98/public_html/boxyerp/sales/customer_invoice.php:396: (Cart Object)->write()</td

I have just added following lines in the beginning of function to alert the user

function write_customer_trans_detail_item($debtor_trans_type, $debtor_trans_no, $stock_id, $description,
    $quantity, $unit_price, $unit_tax, $discount_percent, $std_cost, $src_id, $line_id=0)
{
    if ($debtor_trans_type == ST_SALESINVOICE && $src_id == $line_id){
        display_error ("High Alert. Bug Found in Invoice Creation. Please Try Again");
        exit();
    }

Here $line_id was supposed to be Zero but it was same as $src_id and that is creating a big database anomaly.

Still trying to investigate why this happens.
Just sharing here if anyone else facing same issue.

Regards.

Hello, @sairmalhi In reporting/includes/pdf_report.inc in the function SetCommonData add 'stock_id' after 'StockItemName' and then use this in reporting/includes/doctext.inc as

_("Manufactured Item") => $this->formData["stock_id"],

41

(6 replies, posted in Setup)

Hello @MacKenzie, GRN Clearing Account is a contra account when you have received the goods but haven't credited the supplier. This contra account is settled when the supplier is credited against Goods Received.

42

(6 replies, posted in Setup)

In this function gl_account_in_company_defaults
please add one more line

OR name='grn_clearing_act'

There are few interesting discussion on API. I think you must have a look on them if not yet

https://frontaccounting.com/punbb/viewtopic.php?id=7536
https://frontaccounting.com/punbb/viewtopic.php?id=7132
https://frontaccounting.com/punbb/viewtopic.php?pid=36418#p36418

44

(1 replies, posted in Wish List)

Have you tried this post

https://frontaccounting.com/punbb/viewtopic.php?id=9510

Yes that is needed. But I think @Andres is no more maintaining this extension.

46

(1 replies, posted in Setup)

Better if you can share Screen Shot to elaborate your problem.

47

(5 replies, posted in Accounts Payable)

I have found another bug in Supplier Credit Note

https://imgur.com/a/AHcqP7g

Fix as below at line # 395 on invoice_db.inc

exchange_variation(ST_SUPPCREDIT, $invoice_id, ST_SUPPINVOICE, $invoice_no, $date_,
                    $allocate_amount, PT_SUPPLIER);

48

(3 replies, posted in Modules Add-on's)

Hello way back @anoopmb did something to comply with SLIM3. It might help you.

https://frontaccounting.com/punbb/viewt … 418#p36418

Ok Thank you. I missed that Post earlier

I faced a case with one of my installation.

I tried voiding a Customer Payment.

When It comes to the following Line of code in void_transaction() function

case ST_CUSTPAYMENT : // it's a customer payment
            if (!check_void_bank_trans($type, $type_no))
                return _('This transaction cannot be voided because the operation would decrease account balance below allowed limit in some point of account history.');
        case ST_SALESINVOICE : // it's a customer invoice
             if (is_cust_invoice_credited($type_no))
                return _('This invoice cannot be voided because it was already credited.');

    case ST_CUSTCREDIT : // it's a customer credit note
        case ST_CUSTDELIVERY : // it's a customer dispatch
            if (!exists_customer_trans($type, $type_no))
                return _('Selected transaction does not exists.');
            if ($type == ST_CUSTDELIVERY)    // added 04 Oct 2008 by Joe Hunt. If delivery note has a not voided invoice, then NO.
            {
                $vers = get_customer_trans_version($type, $type_no);
                if ($vers[$type_no] == 1) {
                    $childs = get_sales_child_lines($type, $type_no, false); // 2011-03-17 This had been changed. Joe
                    if ($childs && db_num_rows($childs))
                        return _('This delivery cannot be voided because it was already invoiced.');
                }
            }
            post_void_customer_trans($type, $type_no);
            break;

it gave the error message This invoice cannot be voided because it was already credited

Means there is no break after ST_CUSTPAYMENT condition so it attempted the next switch case ST_SALESINVOICE

I resolved the bug with following changes.

case ST_CUSTPAYMENT : // it's a customer payment
            if (!check_void_bank_trans($type, $type_no))
                return _('This transaction cannot be voided because the operation would decrease account balance below allowed limit in some point of account history.');
            post_void_customer_trans($type, $type_no);
            break;
        case ST_SALESINVOICE : // it's a customer invoice
             if (is_cust_invoice_credited($type_no))
                return _('This invoice cannot be voided because it was already credited.');
            post_void_customer_trans($type, $type_no);
            break;

Please let me know if this is the right way to handle this bug?