326

(11 replies, posted in Reporting)

@joe This is an honour for me and all contributors.

327

(82 replies, posted in FA Modifications)

@Joe, @notrinos thanks alot for this nice feature.

Also if we can apply the Security Area on Dashboard Widgets then it would be great

328

(11 replies, posted in Reporting)

Here is Supplier Trial Balance report

<?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="..";

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

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

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.") 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.") 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.")), 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 get_open_balance($supplier_id, $to)
// {
//     $to = date2sql($to);
//
//     $sql = "SELECT SUM(IF(".TB_PREF."supp_trans.type = ".ST_SUPPINVOICE." OR ".TB_PREF."supp_trans.type = ".ST_BANKDEPOSIT.",
//         (".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount), 0)) AS charges,
//         SUM(IF(".TB_PREF."supp_trans.type <> ".ST_SUPPINVOICE." AND ".TB_PREF."supp_trans.type <> ".ST_BANKDEPOSIT.",
//         (".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount), 0)) AS credits,
//         SUM(".TB_PREF."supp_trans.alloc) AS Allocated,
//         SUM(IF(".TB_PREF."supp_trans.type = ".ST_SUPPINVOICE." OR ".TB_PREF."supp_trans.type = ".ST_BANKDEPOSIT.",
//         (".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount - ".TB_PREF."supp_trans.alloc),
//         (".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ".TB_PREF."supp_trans.alloc))) AS OutStanding
//         FROM ".TB_PREF."supp_trans
//         WHERE ".TB_PREF."supp_trans.tran_date < '$to'
//         AND ".TB_PREF."supp_trans.supplier_id = '$supplier_id' 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'];
        $currency = $_POST['PARAM_3'];
        $no_zeros = $_POST['PARAM_4'];
            $comments = $_POST['PARAM_5'];
    $orientation = $_POST['PARAM_6'];
    $destination = $_POST['PARAM_7'];
    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, 100, 130, 190,    250, 320, 385, 450,    515);

    $headers = array(_('Name'), _(''), _(''), _('Opening Bal'), _('Debit'),
        _('Credit'), _(''), _('Balance'));

    $aligns = array('left',    'left',    'left',    'right',    '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 TB'), "SupplierTB", user_pagesize(), 9, $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");

$tot_cur_cr = $tot_cur_db = 0;
    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);

        $init[3] = $init[1] - $init[0];
        $accumulate += $init[3];

        $res = getTransactions($myrow['supplier_id'], $from, $to);

        $total = array(0,0,0,0);
        for ($i = 0; $i < 4; $i++)
        {
            $total[$i] += $init[$i];
            $grandtotal[$i] += $init[$i];
        }

        if ($no_zeros && $init[3] == 0) continue;

        if (db_num_rows($res)==0) {
            $rep->TextCol(0, 2, $myrow['name']);
            $rep->AmountCol(3, 4, $init[3], $dec);
            $rep->AmountCol(7, 8, $init[3], $dec);
            $rep->Line($rep->row  - 2);
        $rep->NewLine();

            continue;
        }
        $curr_db = $curr_cr =0;
        while ($trans=db_fetch($res))
        {
            if ($no_zeros && floatcmp(abs($trans['TotalAmount']), $trans['Allocated']) == 0) continue;
            $item[0] = $item[1] = 0.0;
            if ($trans['TotalAmount'] > 0.0)
            {
                $item[0] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $curr_cr += $item[0];
                $tot_cur_cr += $item[0];

                $accumulate -= $item[0];
            }
            else
            {
                $item[1] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $curr_db += $item[1];
                $tot_cur_db += $item[1];
                $accumulate += $item[1];
            }
            $item[2] = round2($trans['Allocated'] * $rate, $dec);
            if ($trans['TotalAmount'] > 0.0)
                $item[3] = $item[2] - $item[0];
            else
                $item[3] = ($item[2] - $item[1]) * -1;

            for ($i = 0; $i < 4; $i++)
            {
                $total[$i] += $item[$i];
                $grandtotal[$i] += $item[$i];
            }
                $total[3] = $total[1] - $total[0];

        }

                $rep->AmountCol(5, 6, $curr_cr, $dec);
                $rep->AmountCol(4, 5, $curr_db, $dec);


        $rep->TextCol(0, 2, $myrow['name']);
        $rep->AmountCol(3, 4, $total[3] + $curr_cr - $curr_db, $dec);
        $rep->AmountCol(7, 8, $total[3], $dec);


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

    $grandtotal[3] = $grandtotal[1] - $grandtotal[0];

$rep->AmountCol(3, 4,$grandtotal[3] - $tot_cur_db + $tot_cur_cr, $dec);

$rep->AmountCol(4, 5,$tot_cur_db, $dec);
$rep->AmountCol(5, 6,$tot_cur_cr, $dec);

    $rep->AmountCol(7, 8,$grandtotal[3], $dec);
    $rep->Line($rep->row  - 2);
    $rep->NewLine();
    $rep->End();
}

?>

Here is the code for reports_main.php

    $reports->addReport(RC_SUPPLIER, "_supplier_tb", _('Supplier &TB'),
                array(    _('Start Date') => 'DATEBEGIN',
                        _('End Date') => 'DATEENDM',
                        _('Supplier') => 'SUPPLIERS_NO_FILTER',
                        _('Currency Filter') => 'CURRENCY',
                        _('Suppress Zeros') => 'YES_NO',
                        _('Comments') => 'TEXTBOX',
                        _('Orientation') => 'ORIENTATION',
                        _('Destination') => 'DESTINATION'));

329

(11 replies, posted in Reporting)

I have designed this report for one of my client. May be this is helpful for our Community

Below is the report to be added in reporting folder as rep_customer_tb.php

<?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_CUSTPAYMREP';

// ----------------------------------------------------------------
// $ Revision:    2.0 $
// Creator:    Joe Hunt
// date_:    2005-05-19
// Title:    Customer Balances
// ----------------------------------------------------------------
$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 . "/sales/includes/db/customers_db.inc");

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

print_customer_balances();

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

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

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

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

     $sql .=    "SUM(IF(t.type = ".ST_SALESINVOICE.", 1, -1) *
             (abs(t.ov_amount + t.ov_gst + t.ov_freight + t.ov_freight_tax + t.ov_discount) - abs(t.alloc))) AS OutStanding
        FROM ".TB_PREF."debtor_trans t
        WHERE t.debtor_no = ".db_escape($debtorno)
        ." AND t.type <> ".ST_CUSTDELIVERY;
    if ($to)
        $sql .= " AND t.tran_date < '$to'";
    $sql .= " GROUP BY debtor_no";

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

function get_transactions($debtorno, $from, $to, $only_rec)
{
    $from = date2sql($from);
    $to = date2sql($to);

     $allocated_from =
             "(SELECT trans_type_from as trans_type, trans_no_from as trans_no, date_alloc, sum(amt) amount
             FROM ".TB_PREF."cust_allocations alloc
                 WHERE person_id=".db_escape($debtorno)."
                     AND date_alloc <= '$to'
                 GROUP BY trans_type_from, trans_no_from) alloc_from";
     $allocated_to =
             "(SELECT trans_type_to as trans_type, trans_no_to as trans_no, date_alloc, sum(amt) amount
             FROM ".TB_PREF."cust_allocations alloc
                 WHERE person_id=".db_escape($debtorno)."
                     AND date_alloc <= '$to'
                 GROUP BY trans_type_to, trans_no_to) alloc_to";

     $sql = "SELECT trans.*, comments.memo_,
         (trans.ov_amount + trans.ov_gst + trans.ov_freight + trans.ov_freight_tax + trans.ov_discount) AS TotalAmount,
         IFNULL(alloc_from.amount, alloc_to.amount) AS Allocated,
         ((trans.type = ".ST_SALESINVOICE.")    AND trans.due_date < '$to') AS OverDue
         FROM ".TB_PREF."debtor_trans trans
             LEFT JOIN ".TB_PREF."voided voided ON trans.type=voided.type AND trans.trans_no=voided.id
            LEFT JOIN ".TB_PREF."comments comments ON trans.type=comments.type AND trans.trans_no=comments.id
             LEFT JOIN $allocated_from ON alloc_from.trans_type = trans.type AND alloc_from.trans_no = trans.trans_no
             LEFT JOIN $allocated_to ON alloc_to.trans_type = trans.type AND alloc_to.trans_no = trans.trans_no

         WHERE trans.tran_date >= '$from'
             AND trans.tran_date <= '$to'
             AND trans.debtor_no = ".db_escape($debtorno);

            $sql .= " AND trans.type <> ".ST_CUSTDELIVERY;

             $sql .= " AND ISNULL(voided.id)
         ORDER BY trans.tran_date ";
    return db_query($sql,"No transactions were returned");
}

function get_customer_reference ($order_number)
{

    $sql = "SELECT customer_ref FROM ".TB_PREF."sales_orders WHERE order_no ='$order_number' AND trans_type=".ST_SALESORDER."";

    $result = db_query($sql,"No Transcation were returned");

    $val = db_fetch($result);

    return $val['customer_ref'];


}
//----------------------------------------------------------------------------------------------------

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

            $from = $_POST['PARAM_0'];
        $to = $_POST['PARAM_1'];
        $fromcust = $_POST['PARAM_2'];
        $area = $_POST['PARAM_3']; //added by Faisal to filter by area
        $folk = $_POST['PARAM_4'];  // added by Faisal to filter by sales person
        $currency = $_POST['PARAM_5'];
        $no_zeros = $_POST['PARAM_6'];
        $hide_trans = 1;
        $comments = $_POST['PARAM_7'];
    $orientation = $_POST['PARAM_8'];
    $destination = $_POST['PARAM_9'];
    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 ($fromcust == ALL_TEXT)
        $cust = _('All');
    else
        $cust = get_customer_name($fromcust);
        $dec = user_price_dec();

    if ($area == ALL_NUMERIC)
             $area = 0;

     if ($area == 0)
             $sarea = _('All Areas');
     else
             $sarea = get_area_name($area);

     if ($folk == ALL_NUMERIC)
             $folk = 0;
     if ($folk == 0)
             $salesfolk = _('All Sales Man');
     else
             $salesfolk = get_salesman_name($folk);

    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, 70, 140, 180, 230,    270, 350, 445, 495,    555);

    $headers = array(_('Name'), _(''), _(''), _('Opening Bal'), _(''), _('Debits'), _('Credits'),
        _(''),     _('Balance'));

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

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

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

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


        $sql = "SELECT ".TB_PREF."debtors_master.debtor_no, name, curr_code FROM ".TB_PREF."debtors_master
        INNER JOIN ".TB_PREF."cust_branch
        ON ".TB_PREF."debtors_master.debtor_no=".TB_PREF."cust_branch.debtor_no
    INNER JOIN ".TB_PREF."areas
        ON ".TB_PREF."cust_branch.area = ".TB_PREF."areas.area_code
    INNER JOIN ".TB_PREF."salesman
        ON ".TB_PREF."cust_branch.salesman=".TB_PREF."salesman.salesman_code";
    if ($fromcust != ALL_TEXT )
        {
           // if ($area != 0 || $folk != 0) continue;
            $sql .= " WHERE ".TB_PREF."debtors_master.debtor_no=".db_escape($fromcust);
        }

    elseif ($area != 0)
        {
            if ($folk != 0)
                $sql .= " WHERE ".TB_PREF."salesman.salesman_code=".db_escape($folk)."
                    AND ".TB_PREF."areas.area_code=".db_escape($area);
            else
                $sql .= " WHERE ".TB_PREF."areas.area_code=".db_escape($area);
        }
    elseif ($folk != 0 )
        {
            $sql .= " WHERE ".TB_PREF."salesman.salesman_code=".db_escape($folk);
        }

$sql .= " GROUP BY ".TB_PREF."debtors_master.debtor_no ORDER BY name";


    $result = db_query($sql, "The customers could not be retrieved");

$tot_cur_cr = $tot_cur_db = 0;
    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['debtor_no'], $from, $convert);
        $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);
        $init[3] = $init[0] - $init[1];
        $accumulate += $init[3];

        $res = get_transactions($myrow['debtor_no'], $from, $to, false);

        $total = array(0,0,0,0);
            for ($i = 0; $i < 4; $i++)
            {
                    $total[$i] += $init[$i];
                    $grandtotal[$i] += $init[$i];

            }

            if ($no_zeros && $init[3]==0) continue;

        if (db_num_rows($res)==0) {

                $rep->TextCol(0, 2, $myrow['name']);
                $rep->AmountCol(3, 4, $init[3], $dec);
                $rep->AmountCol(8, 9, $init[3], $dec);
                $rep->Line($rep->row  - 2);
               $rep->NewLine(1);
                continue;
        }
        $curr_cr = $curr_db = 0;
        while ($trans = db_fetch($res)) //Detail starts here
        {

          $item[0] = $item[1] = 0.0;
            //modified below by faisal
            if ($trans['type'] == ST_CUSTCREDIT || $trans['type'] == ST_CUSTPAYMENT || $trans['type'] == ST_BANKDEPOSIT || $trans['type'] == ST_BULKDEPOSIT || $trans['type'] == ST_CASHDEPOSIT)
                $trans['TotalAmount'] *= -1;
            if ($trans['TotalAmount'] > 0.0)
            {
                $item[0] = round2(abs($trans['TotalAmount']) * $rate, $dec);
                $accumulate += $item[0];
                $curr_db += $item[0];
                $tot_cur_db += $item[0];
                $item[2] = round2($trans['Allocated'] * $rate, $dec);
            }
            else
            {
                $item[1] = round2(Abs($trans['TotalAmount']) * $rate, $dec);
                $accumulate -= $item[1];
                $curr_cr += $item[1];
                $tot_cur_cr +=$item[1];
                $item[2] = round2($trans['Allocated'] * $rate, $dec) * -1;
            }

            if ($trans['type'] == ST_JOURNAL || $trans['type'] == ST_SALESINVOICE || $trans['type'] == ST_BANKPAYMENT)
                $item[3] = $item[0] - $item[2];
            else
                $item[3] = -$item[1] - $item[2];


            for ($i = 0; $i < 4; $i++)
            {
                $total[$i] += $item[$i];
                $grandtotal[$i] += $item[$i];
            }
            $total[3] = $total[0] - $total[1];
        }

        $rep->TextCol(0, 2, $myrow['name']);
        $rep->AmountCol(8, 9, $total[3], $dec);

        $rep->AmountCol(3, 4, $total[3] + $curr_cr - $curr_db, $dec);
        $rep->AmountCol(5, 6, $curr_db, $dec);

        $rep->AmountCol(6, 7, $curr_cr, $dec);



           $rep->Line($rep->row  - 2);
           $rep->NewLine(1);
    }
    $rep->NewLine();
    $rep->fontSize += 2;
    $rep->TextCol(0, 3, _('Grand Total'));
    $rep->fontSize -= 2;
    $grandtotal[3] = $grandtotal[0] - $grandtotal[1];

    $rep->AmountCol(3, 4, $grandtotal[3] - $tot_cur_db + $tot_cur_cr, $dec);
    $rep->AmountCol(5, 6, $tot_cur_db, $dec);
    $rep->AmountCol(6, 7, $tot_cur_cr, $dec);
        $rep->AmountCol(8, 9, $grandtotal[3], $dec);
    $rep->Line($rep->row  - 2);
    $rep->NewLine();
        $rep->End();
}

Below is the code to be added in reports_main.php

$reports->addReport(RC_CUSTOMER, "_customer_tb", _('Customer TB'),
                array(    _('Start Date') => 'DATEBEGIN',
                        _('End Date') => 'DATEENDM',
                        _('Customer') => 'CUSTOMERS_NO_FILTER',
                        _('Sales Areas') => 'AREAS',
                        _('Sales Folk') => 'SALESMEN',
                        _('Currency Filter') => 'CURRENCY',
                        _('Suppress Zeros') => 'YES_NO',
                        _('Comments') => 'TEXTBOX',
                        _('Orientation') => 'ORIENTATION',
                        _('Destination') => 'DESTINATION'));

Here is the screen shot

330

(82 replies, posted in FA Modifications)

@joe, @itronics

I request you to please include this customization in the core. Flexible dashboards are really the need of the day. It will be a great option if we can manage dashboards using modules/extensions.

https://free.currencyconverterapi.com/

They allow 100 Requests Per Hour for Free.

This is also a good option

config.php changes

$xr_providers = array("ECB", "YAHOO", "GOOGLE", "BLOOMBERG", "CCA");

gl_db_rates.inc changes as follows.

function get_extern_rate($curr_b, $provider = 'ECB', $date)
{
    global    $path_to_root;

    if ($date != Today())    // no historical rates available
        return 0;

    $contents = '';
    $proto = 'http://';
    $curr_a = get_company_pref('curr_default');
    if ($provider == 'ECB')
    {
        $filename = "/stats/eurofxref/eurofxref-daily.xml";
        $site = "www.ecb.europa.eu";
        $site_ip="172.230.157.137";
    }
    elseif ($provider == 'YAHOO')
    {
        $filename = "/d/quotes.csv?s={$curr_a}{$curr_b}=X&f=sl1d1t1ba&e=.csv"; // new URL's for YAHOO
        $site = "download.finance.yahoo.com";
        $site_ip="203.84.220.151";
    }
    elseif ($provider == 'GOOGLE')
    {
        $filename = "/bctzjpnsun/converter?a=1&from={$curr_a}&to={$curr_b}";
        $site = "finance.google.com";
    }
    elseif ($provider == 'BLOOMBERG')
    {
        $filename = "/quote/{$curr_b}{$curr_a}:CUR";
        $site = "www.bloomberg.com";
        $proto = 'https://';
        $contents=file_get_contents($proto.$site.$filename);
    }
    elseif ($provider == 'CCA') //free.currencyconverterapi.com
    {
        $filename = "/api/v5/convert?q={$curr_b}_{$curr_a}&compact=y";
        $site = "free.currencyconverterapi.com";
        $proto = 'https://';

    }
    if (empty($contents)) {
        if (function_exists('curl_init'))
        {    // first check with curl as we can set short timeout;
            $retry = 1;
             do {
                   $ch = curl_init();
                   curl_setopt ($ch, CURLOPT_URL, $proto.$site.$filename);
                   curl_setopt ($ch, CURLOPT_COOKIEJAR, VARLIB_PATH."/cookie.txt");
                   curl_setopt ($ch, CURLOPT_HEADER, 0);
                   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
                   // prevent warning while safe_mode/open_basedir on (redirection doesn't occur at least on ECB page)
                   if (!ini_get('safe_mode') && !ini_get('open_basedir'))
                       curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
                   curl_setopt ($ch, CURLOPT_TIMEOUT, 3);
                   $contents = curl_exec ($ch);
                   curl_close($ch);
                // due to resolver bug in some curl versions (e.g. 7.15.5)
                // try again for constant IP.
                if (isset($site_ip))
                       $site=$site_ip;
               } while( ($contents == '') && $retry--);
        } else {
            $contents = url_get_contents($proto.$site.$filename);
        }
    }
    $val = '';
    if ($provider == 'ECB')
    {
        $contents = str_replace ("<Cube currency='USD'", " <Cube currency='EUR' rate='1'/> <Cube currency='USD'", $contents);
        $from_mask = "|<Cube\s*currency=\'" . $curr_a . "\'\s*rate=\'([\d.,]*)\'\s*/>|i";
        preg_match ( $from_mask, $contents, $out );
        $val_a = isset($out[1]) ? $out[1] : 0;
        $val_a = str_replace ( ',', '', $val_a );
        $to_mask = "|<Cube\s*currency=\'" . $curr_b . "\'\s*rate=\'([\d.,]*)\'\s*/>|i";
        preg_match ( $to_mask, $contents, $out );
        $val_b = isset($out[1]) ? $out[1] : 0;
        $val_b = str_replace ( ',', '', $val_b );
        if ($val_b)
        {
            $val = $val_a / $val_b;
        }
        else
        {
            $val = 0;
        }
    }
    elseif ($provider == 'YAHOO')
    {
        $array = explode(',',$contents); // New operations for YAHOO. Safer.
        $val = $array[1];
        if ($val != 0)
            $val = 1 / $val;
    }
    elseif ($provider == 'GOOGLE')
    {
        $val = getInnerStr($contents, '<span class=bld>', ' ');
        if (empty($val) || $val+0 <= 0.0001) {
            // reverse lookup on could not convert for too small values
            $filename = "/bctzjpnsun/converter?a=1&from={$curr_b}&to={$curr_a}";
            $contents = url_get_contents($proto.$site.$filename);
            $val = getInnerStr($contents, '<span class=bld>', ' ');
        } else {
            if ($val != 0)
                $val = 1 / $val;
        }
    }
    elseif ($provider == 'BLOOMBERG')
    {
        $val = getInnerStr($contents, ',"price":', ',"');
    }
    elseif ($provider == 'CCA')
    {
        $rates = json_decode($contents, true);
        $val = $rates[$curr_b.'_'.$curr_a]['val'];
      }
    return $val;
}  /* end function get_extern_rate */

@kvvaradha As you mentioned in Post # 12 that Batch system will be open source. How can I get it?

I tried using UnAssembly but it has 2 problems.

1. The output quantity is not confirmed. But we can handle this by creating BOM at the final stage.
2. The cost of Raw Material issued is not distributed among the Finished Products received. Even the OverHead and Labour cost is not loaded to the Finished Goods.

@apmuthu, in post#2 you suggested that we need to split raw materials if the desired finished goods are multiple items. I am facing a scenario where in Rice Processing Plant, Raw Material is single called "Paddy". When it is processed the Finished Products are 3 Different Grades of Rice i.e Grade A, Grade B and Grade C. The fourth by product is the "Husk".

In this scenario we can't split the Raw Material. Can this be handled in FA?

@joe , please have a look at this bug also or roll it back

336

(14 replies, posted in Accounts Receivable)

Found this bug after new commit

And I doubt this one also have logical error after this new commit.

337

(14 replies, posted in Accounts Receivable)

Yes changing the return to 1 has worked.

338

(14 replies, posted in Accounts Receivable)

This commit has created a bug shown in image.

I could have caught just one. May be this is affecting other places too.

Please rectify.

This bug is not addressed yet I think.

340

(8 replies, posted in Installation)

Thanks all for your input. I will post my feedback once done

341

(8 replies, posted in Installation)

I need 100 users on 100 work stations concurrently accessing FA installed on the server in LAN

342

(8 replies, posted in Installation)

Hello,
I need to install FA in a local network powered by Windows with more than 100 Users.

What should be configuration of Local Server to host FA with this number of users.

Any Ideas?

343

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

@apmuthu Getting This Error while using Report Generator Module

Parse error: syntax error, unexpected '$protocol' (T_VARIABLE), expecting '(' in C:\xampp\htdocs\my-pakerp-com\modules\repgen\includes\repgen_def.inc on line 56

The problem is not in Cloning but Just in View of an already Created Item whose Code is Same as that of any GL Code.

To Reproduce the Error follow the steps below

Login here
id: admin
pass: Pakistan1947

Go to Iitems&Inventory>>Items

Create a New Item with Code 5800 and check the behavior.

There is already a GL Account with Code 5800 named Licenses.

Once you Create the Item and then Reopen it you will see this screen

While you see the above screen the Data in Database is absolutely correct. The problem is just in View of the related GL Codes for this Item.

Note: This installation is a Fresh installation with the Demo Data

After this Commit a bug is found in items.php.

If by chance the Item Code matches with any of the GL Code then When you see the details of any Item it shows that GL Code in all related GL Accounts for that Item.

346

(9 replies, posted in Setup)

Yes, this solution has solved my problem

347

(9 replies, posted in Setup)

Actually I need to avoid the process of previewing and then printing through browser. It will save time by avoiding a repetitive process while handing customers at Point of Sale location.

Can't we set print profiles for this reason?

348

(9 replies, posted in Setup)

By FA location if you mean the hosted location then yes FA is hosted at cloud. But if you mean the browser location from where print is sent then it is the same location i.e same computer to which POS printer is connected .

Only one printer i.e the POS printed is connected to the POS machine (computer )

349

(9 replies, posted in Setup)

How to use Print Profiles to send print directly to printer at a POS Location without going to browser preview. I am using Windows 10.

Printer is connected to the same computer where FA is used.

@kvvaradha , I think it is done in HR module by @notrinos