26

(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.

31

(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"],

34

(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.

35

(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

37

(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.

39

(1 replies, posted in Setup)

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

40

(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);

41

(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?

44

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

Are you doing this for API?

45

(1 replies, posted in Reporting)

Can you share the Screen Shot for better understanding.

Please enable the debug mode from config.php and then see the errors

@rahmanbd currently you can't select the Sales Person while Creating Sales order. Sales Person is predefined to each customer and it is not linked to order.

48

(5 replies, posted in Accounts Payable)

I can confirm that

1. Reference is now being picked correctly
2. Edit of Credit Note is not Reversing Entries now.
But
3. Credit Note is not being allocated to the Invoice.

No 1:
When Supplier Credit Note is Edited it is reverting the GL Entry.

https://imgur.com/a/dhiTEPw

No 2:
When Supplier Credit Note is Created Directly then it is taking the Reference of Supplier Credit Not but when it is created by clicking the Credit Icon in Supplier Transaction Inquiry against any Supplier Inovice then it is taking the Next Reference from Supplier Invoice.

50

(10 replies, posted in Setup)

When you install FA it gives you option to install it with Demo Data. Try that.