326

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

The variable $comp_path is undefined.

@kvvaradha, good effort.

However if modernizing can turn this into bootstrap theme with less number of clicks to reach any page then it will be very good.
Obviously if @Joe and @itronics agree.

Currently if we are on any page and we need to navigate to any other module or any other page, we need multiple clicks.

If using bootstrap the Menu Dashboard gets Available on Mouse Hoover and Left Panel then it will be perfect.

Thanks

328

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

@apmuthu

Line # 19 on repgen_print.php must be like this

$file =  company_path().'/pdf_files/'.$id.'.pdf';

The Edit and Copy functions are not working properly.

Copying a Report is Copying the Function.
Editing a Report is Editing the Function.

You can check at fresh installation at

Click Here
id: admin
pass: Pakistan1947

@anoopmb, I have tested this Ajax Version. I would suggest that there shall be a Variable controlling to Use Ajax or Not in Config. The Ajax is needed if the list goes long. Secondly along with Ajax at least first 100 values shall be shown in the list.

Ajax searching is taking time. So Initially when the list is not long the user can set $ajax_use=false something like that.

Its a great feature.

Agreed

I have taken a Very Simple Case Through Advanced Manufacturing without defining BOM.

1. Manufacturing of 400 Kg rice Bags.

Day 1:
a. Raw Material of 200 Kg is Issued to WO.
b. Labour and OH Cost is also issued to Work Order
c. 200 KG of Rice Bags are Produced.
d. No Finished Good Inventory of Rice is Added.
e. We needed to Sell those 200 Bags but since No STock was added to Inventory the Invoice Couldn't be made.

Day 2:
a. Raw Material of 100 Kg is Issued to WO.
b. Labour and OH Cost is also issued to Work Order
c. 100 KG of Rice Bags are Produced.
d. No Finished Good Inventory of Rice is Added.
e. We needed to Sell those 100 Bags but since No STock was added to Inventory the Invoice Couldn't be made.

Day 3:
a. Raw Material of 100 Kg is Issued to WO.
b. Labour and OH Cost is also issued to Work Order
c. 100 KG of Rice Bags are Produced.
d. 400 Bags of Rice are Added to inventory and WO is set to Closed.


My Question is Why Stock is not Added If Partial Production is Run. Is this any irrational behavior no one could figure out yet or it is lack of my understanding?

Any Idea?

332

(36 replies, posted in FA Modifications)

@anoopmb can you mention the changes you made in the core. Overwriting my files with your files will overwrite some of my modifications too.

Thanks in Advance

333

(11 replies, posted in Reporting)

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

334

(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

335

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

336

(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

337

(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

343

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

344

(14 replies, posted in Accounts Receivable)

Yes changing the return to 1 has worked.

345

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

347

(8 replies, posted in Installation)

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

348

(8 replies, posted in Installation)

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

349

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

350

(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