@Joe, @notrinos thanks alot for this nice feature.
Also if we can apply the Security Area on Dashboard Widgets then it would be great
It's much more fun, when you can discuss your problems with others...
You are not logged in. Please login or register.
FrontAccounting forum → Posts by boxygen
@Joe, @notrinos thanks alot for this nice feature.
Also if we can apply the Security Area on Dashboard Widgets then it would be great
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'));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
@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
Yes changing the return to 1 has worked.
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.
Thanks all for your input. I will post my feedback once done
I need 100 users on 100 work stations concurrently accessing FA installed on the server in LAN
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?
@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 56The 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.
Yes, this solution has solved my problem
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?
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 )
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
@TOR,
comment out lines from 323-328 in /gl/gl_bank.php
// if (!check_num('amount', 0))
// {
// display_error( _("The amount entered is not a valid number or is less than zero."));
// set_focus('amount');
// return false;
// }You will get your desired result. I hope it will not cause any other anomaly in Database.
FrontAccounting forum → Posts by boxygen
Powered by PunBB, supported by Informer Technologies, Inc.
Currently installed 4 official extensions. Copyright © 2003–2009 PunBB.