@joe This is an honour for me and all contributors.
327 12/21/2018 09:55:31 am
Re: Modularizing the Dashboard (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 12/21/2018 09:37:20 am
Re: Customer Trial Balance Report (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 12/21/2018 06:11:21 am
Topic: Customer Trial Balance Report (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 12/21/2018 05:45:07 am
Re: Modularizing the Dashboard (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.
331 12/19/2018 03:35:52 am
Re: No exchange rate working in FA now (20 replies, posted in Report Bugs here)
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 */
332 12/19/2018 03:15:34 am
Re: FA with Batch/Serial/Lot Number Tracking System (19 replies, posted in FA Modifications)
@kvvaradha As you mentioned in Post # 12 that Batch system will be open source. How can I get it?
333 12/18/2018 04:43:37 am
Re: Multiple Products From One Manufacturing Process (5 replies, posted in Manufactoring)
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.
334 12/18/2018 03:48:44 am
Re: Multiple Products From One Manufacturing Process (5 replies, posted in Manufactoring)
@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?
335 12/16/2018 03:29:57 pm
Re: Bug Created by Last Commit to items.php (8 replies, posted in Items and Inventory)
@joe , please have a look at this bug also or roll it back
336 12/16/2018 10:43:23 am
Re: Bug due to commit (14 replies, posted in Accounts Receivable)
337 12/16/2018 06:07:45 am
Re: Bug due to commit (14 replies, posted in Accounts Receivable)
Yes changing the return to 1 has worked.
338 12/15/2018 05:20:41 am
Topic: Bug due to commit (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.
339 12/14/2018 04:05:07 am
Re: Bug Created by Last Commit to items.php (8 replies, posted in Items and Inventory)
This bug is not addressed yet I think.
340 12/10/2018 04:57:53 pm
Re: Local Server Requirements (8 replies, posted in Installation)
Thanks all for your input. I will post my feedback once done
341 12/09/2018 05:28:45 pm
Re: Local Server Requirements (8 replies, posted in Installation)
I need 100 users on 100 work stations concurrently accessing FA installed on the server in LAN
342 12/09/2018 06:14:55 am
Topic: Local Server Requirements (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 11/05/2018 09:37:10 am
Re: Fixing Usage - report generator (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
344 11/02/2018 04:59:11 pm
Re: Bug Created by Last Commit to items.php (8 replies, posted in Items and Inventory)
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
345 11/02/2018 11:09:30 am
Topic: Bug Created by Last Commit to items.php (8 replies, posted in Items and Inventory)
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 10/21/2018 04:03:49 pm
Re: How to Use Print Profiles (9 replies, posted in Setup)
Yes, this solution has solved my problem
347 10/15/2018 04:57:31 pm
Re: How to Use Print Profiles (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 10/15/2018 04:55:20 am
Re: How to Use Print Profiles (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 10/13/2018 04:21:50 pm
Topic: How to Use Print Profiles (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.
350 09/29/2018 09:10:33 am
Re: Is it possible to add custom cases into "BoxReports->get_ctrl()" ? (1 replies, posted in Reporting)
@kvvaradha , I think it is done in HR module by @notrinos