@Joe,
Please check these reports of 2017 and 2018.

Check the closing balance of 2017 and opening balance of 2018

You will find the difference in Allocated and Outstanding Figures of Closing and Opening Balances.

I hope I could have explained the issue.

Regards.

Customer is QY009 Babjee Traders

You can Login

id: admin
pass: Pakistan1947

To reproduce this open rep101.php
select above customer
Show Balance => No
View report of 2017 whole year
View report of 2018 till date

PS: To understand the problem read the whole thread once again. We were discussing that due to Bank Payment Transaction to customer, the SQL Query shall be adjusted to produce correct results.

Hello @joe, could you check this bug

428

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

@Rmendez why don't you try HRM by @notrinos

@joe, still one problem exists in rep101.php after applying your last commit

Check the same customer's balances with Parameter ShowBalance=>No

First Date Range 1st Jan 2017 till 31 Dec 2017

Note down Charges, Credits, Allocated and Balance Closing figures

Second Date Range 1st Jan 2018 till date

The above closing shall reflect in this opening but there is a difference Opening

430

(4 replies, posted in Setup)

One of my clients data file has grown up to 200 MB. The Backup routine is unable to take its backup.

Is there any alternate way except PHPMyadmin to take backup of such large databases?

Yes it is working. Thanks alot for your time and input.

@joe, I think you have check the supplier side also.

@joe
You are absolutely right, but let me show you the situation with real client's data.

Login Here
id: admin
pass: Pakistan1947

Open customer balances report from 1st Jan 2017 till date
Select customer QY009-BABJEE TRADERS
Set Show Balance = Yes
Note down the Ending Balance = 811,922

Now set the date from 23 NOv 2017 till Date with same parameters.
Now the Ending balance will be = -2,609,707

This is because the Opening Balance is wrong i.e. -2,286,233
that is supposed to be 1,135,467

Because you can see 5 Bank Payment Entries that are made to this customer by client.

BP319, BP426, BP747, BP748, BP749.

My point is that since we can't stop customer to make a Bank Payment to a Customer because option is there in FA.

So we need to adjust our report that shall contain such silly accounting mistakes.

I hope my point is clear now.

@Joe, you are right. This is the most professional way to do it.

But I have many clients who are not professional accountants.

Since in FA, we have an option to make a BankPayment to customer so either this option be disabled to stop users to exercise it OR

we have to make necessary adjustments to make report show the actual balance.

If we don't commit the suggested changes to rep101.php and other such reports the Opening Balance is not showing the correct value.

We can't restrict any user to record a BankPayment to a customer through BankPayment Entry. This happens in practical environment when same party works as a customer or supplier or in any other capacity.

Modifying below statements From Line 35 onwards will fix this issue.

$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,";

Please verify it

@cowlas I can do it for you. you can send me email via forum.

I tried this and it worked. But I fear if this creates any anomaly in database and relations. @apmuthu can you just review it.

<?php
/**********************************************************************
    Copyright (C) FrontAccounting, 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>.
***********************************************************************/
//-----------------------------------------------------------------------------
//
//    Entry/Modify Delivery Note against Sales Order
//
$page_security = 'SA_SALESDELIVERY';
$path_to_root = "../..";

include_once($path_to_root . "/sales/includes/cart_class.inc");
include_once($path_to_root . "/includes/session.inc");
include_once($path_to_root . "/includes/data_checks.inc");
include_once($path_to_root . "/sales/includes/sales_db.inc");
include_once($path_to_root . "/sales/includes/sales_ui.inc");
include_once($path_to_root . "/reporting/includes/reporting.inc");
include_once($path_to_root . "/taxes/tax_calc.inc");

$js = "";
if ($SysPrefs->use_popup_windows) {
    $js .= get_js_open_window(900, 500);
}
if (user_use_date_picker()) {
    $js .= get_js_date_picker();
}

if (isset($_GET['ModifyDelivery'])) {
    $_SESSION['page_title'] = sprintf(_("Modifying Delivery Note # %d."), $_GET['ModifyDelivery']);
    $help_context = "Modifying Delivery Note";
    processing_start();
} elseif (isset($_GET['OrderNumber'])) {
    $_SESSION['page_title'] = _($help_context = "Deliver Items for a Sales Order");
    processing_start();
}

page($_SESSION['page_title'], false, false, "", $js);

if (isset($_GET['AddedID'])) {
    $dispatch_no = $_GET['AddedID'];

    display_notification_centered(sprintf(_("Delivery # %d has been entered."),$dispatch_no));

    display_note(get_customer_trans_view_str(ST_CUSTDELIVERY, $dispatch_no, _("&View This Delivery")), 0, 1);

    display_note(print_document_link($dispatch_no, _("&Print Delivery Note"), true, ST_CUSTDELIVERY));
    display_note(print_document_link($dispatch_no, _("&Email Delivery Note"), true, ST_CUSTDELIVERY, false, "printlink", "", 1), 1, 1);
    display_note(print_document_link($dispatch_no, _("P&rint as Packing Slip"), true, ST_CUSTDELIVERY, false, "printlink", "", 0, 1));
    display_note(print_document_link($dispatch_no, _("E&mail as Packing Slip"), true, ST_CUSTDELIVERY, false, "printlink", "", 1, 1), 1);

    display_note(get_gl_view_str(13, $dispatch_no, _("View the GL Journal Entries for this Dispatch")),1);

    if (!isset($_GET['prepaid']))
        hyperlink_params("$path_to_root/sales/customer_invoice.php", _("Invoice This Delivery"), "DeliveryNumber=$dispatch_no");

    hyperlink_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select Another Order For Dispatch"), "OutstandingOnly=1");

    display_footer_exit();

} elseif (isset($_GET['UpdatedID'])) {

    $delivery_no = $_GET['UpdatedID'];

    display_notification_centered(sprintf(_('Delivery Note # %d has been updated.'),$delivery_no));

    display_note(get_trans_view_str(ST_CUSTDELIVERY, $delivery_no, _("View this delivery")), 0, 1);

    display_note(print_document_link($delivery_no, _("&Print Delivery Note"), true, ST_CUSTDELIVERY));
    display_note(print_document_link($delivery_no, _("&Email Delivery Note"), true, ST_CUSTDELIVERY, false, "printlink", "", 1), 1, 1);
    display_note(print_document_link($delivery_no, _("P&rint as Packing Slip"), true, ST_CUSTDELIVERY, false, "printlink", "", 0, 1));
    display_note(print_document_link($delivery_no, _("E&mail as Packing Slip"), true, ST_CUSTDELIVERY, false, "printlink", "", 1, 1), 1);

    if (!isset($_GET['prepaid']))
        hyperlink_params($path_to_root . "/sales/customer_invoice.php", _("Confirm Delivery and Invoice"), "DeliveryNumber=$delivery_no");

    hyperlink_params($path_to_root . "/sales/inquiry/sales_deliveries_view.php", _("Select A Different Delivery"), "OutstandingOnly=1");

    display_footer_exit();
}
//-----------------------------------------------------------------------------

if (isset($_GET['OrderNumber']) && $_GET['OrderNumber'] > 0) {

    $ord = new Cart(ST_SALESORDER, $_GET['OrderNumber'], true);
    if ($ord->is_prepaid())
        check_deferred_income_act(_("You have to set Deferred Income Account in GL Setup to entry prepayment invoices."));

    if ($ord->count_items() == 0) {
        hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php",
            _("Select a different sales order to delivery"), "OutstandingOnly=1");
        echo "<br><center><b>" . _("This order has no items. There is nothing to delivery.") .
            "</center></b>";
        display_footer_exit();
    } else if (!$ord->is_released()) {
        hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php",_("Select a different sales order to delivery"),
            "OutstandingOnly=1");
        echo "<br><center><b>"._("This prepayment order is not yet ready for delivery due to insufficient amount received.")
            ."</center></b>";
        display_footer_exit();
    }
    // Adjust Shipping Charge based upon previous deliveries TAM
    adjust_shipping_charge($ord, $_GET['OrderNumber']);

    $_SESSION['Items'] = $ord;
    copy_from_cart();

} elseif (isset($_GET['ModifyDelivery']) && $_GET['ModifyDelivery'] > 0) {

    check_is_editable(ST_CUSTDELIVERY, $_GET['ModifyDelivery']);
    $_SESSION['Items'] = new Cart(ST_CUSTDELIVERY,$_GET['ModifyDelivery']);

    if (!$_SESSION['Items']->prepaid && $_SESSION['Items']->count_items() == 0) {
        hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php",
            _("Select a different delivery"), "OutstandingOnly=1");
        echo "<br><center><b>" . _("This delivery has all items invoiced. There is nothing to modify.") .
            "</center></b>";
        display_footer_exit();
    }

    copy_from_cart();

} elseif ( !processing_active() ) {
    /* This page can only be called with an order number for invoicing*/

    display_error(_("This page can only be opened if an order or delivery note has been selected. Please select it first."));

    hyperlink_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select a Sales Order to Delivery"), "OutstandingOnly=1");

    end_page();
    exit;

} else {
    check_edit_conflicts(get_post('cart_id'));

    if (!check_quantities()) {
        display_error(_("Selected quantity cannot be less than quantity invoiced nor more than quantity    not dispatched on sales order."));

    } elseif(!check_num('ChargeFreightCost', 0)) {
        display_error(_("Freight cost cannot be less than zero"));
        set_focus('ChargeFreightCost');
    }
}

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

function check_data()
{
    global $Refs, $SysPrefs;

    if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate']))    {
        display_error(_("The entered date of delivery is invalid."));
        set_focus('DispatchDate');
        return false;
    }

    if (!is_date_in_fiscalyear($_POST['DispatchDate'])) {
        display_error(_("The entered date is out of fiscal year or is closed for further data entry."));
        set_focus('DispatchDate');
        return false;
    }

    if (!isset($_POST['due_date']) || !is_date($_POST['due_date']))    {
        display_error(_("The entered dead-line for invoice is invalid."));
        set_focus('due_date');
        return false;
    }

    if ($_SESSION['Items']->trans_no==0) {
        if (!$Refs->is_valid($_POST['ref'], ST_CUSTDELIVERY)) {
            display_error(_("You must enter a reference."));
            set_focus('ref');
            return false;
        }
    }
    if ($_POST['ChargeFreightCost'] == "") {
        $_POST['ChargeFreightCost'] = price_format(0);
    }

    if (!check_num('ChargeFreightCost',0)) {
        display_error(_("The entered shipping value is not numeric."));
        set_focus('ChargeFreightCost');
        return false;
    }

    if ($_SESSION['Items']->has_items_dispatch() == 0 && input_num('ChargeFreightCost') == 0) {
        display_error(_("There are no item quantities on this delivery note."));
        return false;
    }

    if (!check_quantities()) {
        return false;
    }

    copy_to_cart();

    if (!$SysPrefs->allow_negative_stock() && ($low_stock = $_SESSION['Items']->check_qoh()))
    {
        display_error(_("This document cannot be processed because there is insufficient quantity for items marked."));
        return false;
    }

    return true;
}
//------------------------------------------------------------------------------
function copy_to_cart()
{
    $cart = &$_SESSION['Items'];
    $cart->ship_via = $_POST['ship_via'];
    $cart->Branch = $_POST['branch_id']; //added by faisal
    $cart->freight_cost = input_num('ChargeFreightCost');
    $cart->document_date = $_POST['DispatchDate'];
    $cart->due_date =  $_POST['due_date'];
    $cart->Location = $_POST['Location'];
    $cart->Comments = $_POST['Comments'];
    $cart->dimension_id = $_POST['dimension_id'];
    $cart->dimension2_id = $_POST['dimension2_id'];
    if ($cart->trans_no == 0)
        $cart->reference = $_POST['ref'];

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

function copy_from_cart()
{
    $cart = &$_SESSION['Items'];
    $_POST['ship_via'] = $cart->ship_via;
    $_POST['ChargeFreightCost'] = price_format($cart->freight_cost);
    $_POST['DispatchDate'] = $cart->document_date;
    $_POST['due_date'] = $cart->due_date;
    $_POST['Location'] = $cart->Location;
    $_POST['Comments'] = $cart->Comments;
    $_POST['dimension_id'] = $cart->dimension_id;
    $_POST['dimension2_id'] = $cart->dimension2_id;
    $_POST['cart_id'] = $cart->cart_id;
    $_POST['ref'] = $cart->reference;
}
//------------------------------------------------------------------------------

function check_quantities()
{
    $ok =1;
    // Update cart delivery quantities/descriptions
    foreach ($_SESSION['Items']->line_items as $line=>$itm) {
        if (isset($_POST['Line'.$line])) {
            if($_SESSION['Items']->trans_no) {
                $min = $itm->qty_done;
                $max = $itm->quantity;
            } else {
                $min = 0;
                $max = $itm->quantity - $itm->qty_done;
            }

            if (check_num('Line'.$line, $min, $max)) {
                $_SESSION['Items']->line_items[$line]->qty_dispatched =
                  input_num('Line'.$line);
            } else {
                set_focus('Line'.$line);
                $ok = 0;
            }

        }

        if (isset($_POST['Line'.$line.'Desc'])) {
            $line_desc = $_POST['Line'.$line.'Desc'];
            if (strlen($line_desc) > 0) {
                $_SESSION['Items']->line_items[$line]->item_description = $line_desc;
            }
        }
    }
    return $ok;
}

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

if (isset($_POST['process_delivery']) && check_data()) {
    $dn = &$_SESSION['Items'];

    if ($_POST['bo_policy']) {
        $bo_policy = 0;
    } else {
        $bo_policy = 1;
    }
    $newdelivery = ($dn->trans_no == 0);

    if ($newdelivery)
        new_doc_date($dn->document_date);

    $delivery_no = $dn->write($bo_policy);

    if ($delivery_no == -1)
    {
        display_error(_("The entered reference is already in use."));
        set_focus('ref');
    }
    else
    {
        $is_prepaid = $dn->is_prepaid() ? "&prepaid=Yes" : '';

        processing_end();
        if ($newdelivery) {
            meta_forward($_SERVER['PHP_SELF'], "AddedID=$delivery_no$is_prepaid");
        } else {
            meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$delivery_no$is_prepaid");
        }
    }
}

if (isset($_POST['Update']) || isset($_POST['_Location_update']) || isset($_POST['qty']) || isset($_POST['process_delivery'])) {
    $Ajax->activate('Items');
}
//------------------------------------------------------------------------------
start_form();
hidden('cart_id');

start_table(TABLESTYLE2, "width='80%'", 5);
echo "<tr><td>"; // outer table

start_table(TABLESTYLE, "width='100%'");
start_row();
label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'");

label_cell(_("Branch"), "class='tableheader2'");//changed by faisal
customer_branches_list_cells('',
        $_SESSION['Items']->customer_id, 'branch_id', null, false, true, true, true); //added by faisal

label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'");
end_row();
start_row();

if ($_SESSION['Items']->trans_no==0) {
    ref_cells(_("Reference"), 'ref', '', null, "class='tableheader2'", false, ST_CUSTDELIVERY,
    array('customer' => $_SESSION['Items']->customer_id,
            'branch' => $_SESSION['Items']->Branch,
            'date' => get_post('DispatchDate')));
} else {
    label_cells(_("Reference"), $_SESSION['Items']->reference, "class='tableheader2'");
}

label_cells(_("For Sales Order"), get_customer_trans_view_str(ST_SALESORDER, $_SESSION['Items']->order_no), "class='tableheader2'");

label_cells(_("Sales Type"), $_SESSION['Items']->sales_type_name, "class='tableheader2'");
end_row();
start_row();

if (!isset($_POST['Location'])) {
    $_POST['Location'] = $_SESSION['Items']->Location;
}
label_cell(_("Delivery From"), "class='tableheader2'");
locations_list_cells(null, 'Location', null, false, true);

if (!isset($_POST['ship_via'])) {
    $_POST['ship_via'] = $_SESSION['Items']->ship_via;
}
label_cell(_("Shipping Company"), "class='tableheader2'");
shippers_list_cells(null, 'ship_via', $_POST['ship_via']);

// set this up here cuz it's used to calc qoh
if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate'])) {
    $_POST['DispatchDate'] = new_doc_date();
    if (!is_date_in_fiscalyear($_POST['DispatchDate'])) {
        $_POST['DispatchDate'] = end_fiscalyear();
    }
}
date_cells(_("Date"), 'DispatchDate', '', $_SESSION['Items']->trans_no==0, 0, 0, 0, "class='tableheader2'");
end_row();

end_table();

echo "</td><td>";// outer table

start_table(TABLESTYLE, "width='90%'");

if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) {
    $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->payment, $_POST['DispatchDate']);
}
customer_credit_row($_SESSION['Items']->customer_id, $_SESSION['Items']->credit, "class='tableheader2'");

$dim = get_company_pref('use_dimension');
if ($dim > 0) {
    start_row();
    label_cell(_("Dimension").":", "class='tableheader2'");
    dimensions_list_cells(null, 'dimension_id', null, true, ' ', false, 1, false);
    end_row();
}
else
    hidden('dimension_id', 0);
if ($dim > 1) {
    start_row();
    label_cell(_("Dimension")." 2:", "class='tableheader2'");
    dimensions_list_cells(null, 'dimension2_id', null, true, ' ', false, 2, false);
    end_row();
}
else
    hidden('dimension2_id', 0);
//---------
start_row();
date_cells(_("Invoice Dead-line"), 'due_date', '', null, 0, 0, 0, "class='tableheader2'");
end_row();
end_table();

echo "</td></tr>";
end_table(1); // outer table

$row = get_customer_to_order($_SESSION['Items']->customer_id);
if ($row['dissallow_invoices'] == 1)
{
    display_error(_("The selected customer account is currently on hold. Please contact the credit control personnel to discuss."));
    end_form();
    end_page();
    exit();
}
display_heading(_("Delivery Items"));
div_start('Items');
start_table(TABLESTYLE, "width='80%'");

$new = $_SESSION['Items']->trans_no==0;
$th = array(_("Item Code"), _("Item Description"),
    $new ? _("Ordered") : _("Max. delivery"), _("Units"), $new ? _("Delivered") : _("Invoiced"),
    _("This Delivery"), _("Price"), _("Tax Type"), _("Discount"), _("Total"));

table_header($th);
$k = 0;
$has_marked = false;

foreach ($_SESSION['Items']->line_items as $line=>$ln_itm) {
    if ($ln_itm->quantity==$ln_itm->qty_done) {
        continue; //this line is fully delivered
    }
    if(isset($_POST['_Location_update']) || isset($_POST['clear_quantity']) || isset($_POST['reset_quantity'])) {
        // reset quantity
        $ln_itm->qty_dispatched = $ln_itm->quantity-$ln_itm->qty_done;
    }
    // if it's a non-stock item (eg. service) don't show qoh
    $row_classes = null;
    if (has_stock_holding($ln_itm->mb_flag) && $ln_itm->qty_dispatched) {
        // It's a stock : call get_dispatchable_quantity hook  to get which quantity to preset in the
        // quantity input box. This allows for example a hook to modify the default quantity to what's dispatchable
        // (if there is not enough in hand), check at other location or other order people etc ...
        // This hook also returns a 'reason' (css classes) which can be used to theme the row.
        //
        // FIXME: hook_get_dispatchable definition does not allow qoh checks on transaction level
        // (but anyway dispatch is checked again later before transaction is saved)

        $qty = $ln_itm->qty_dispatched;
        if ($check = check_negative_stock($ln_itm->stock_id, $ln_itm->qty_done-$ln_itm->qty_dispatched, $_POST['Location'], $_POST['DispatchDate']))
            $qty = $check['qty'];

        $q_class =  hook_get_dispatchable_quantity($ln_itm, $_POST['Location'], $_POST['DispatchDate'], $qty);

        // Skip line if needed
        if($q_class === 'skip')  continue;
        if(is_array($q_class)) {
          list($ln_itm->qty_dispatched, $row_classes) = $q_class;
            $has_marked = true;
        }
    }

    alt_table_row_color($k, $row_classes);
    view_stock_status_cell($ln_itm->stock_id);

    if ($ln_itm->descr_editable)
        text_cells(null, 'Line'.$line.'Desc', $ln_itm->item_description, 30, 50);
    else
        label_cell($ln_itm->item_description);

    $dec = get_qty_dec($ln_itm->stock_id);
    qty_cell($ln_itm->quantity, false, $dec);
    label_cell($ln_itm->units);
    qty_cell($ln_itm->qty_done, false, $dec);

    if(isset($_POST['clear_quantity'])) {
        $ln_itm->qty_dispatched = 0;
    }
    $_POST['Line'.$line]=$ln_itm->qty_dispatched; /// clear post so value displayed in the fiel is the 'new' quantity
    small_qty_cells(null, 'Line'.$line, qty_format($ln_itm->qty_dispatched, $ln_itm->stock_id, $dec), null, null, $dec);

    $display_discount_percent = percent_format($ln_itm->discount_percent*100) . "%";

    $line_total = ($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent));

    amount_cell($ln_itm->price);
    label_cell($ln_itm->tax_type_name);
    label_cell($display_discount_percent, "nowrap align=right");
    amount_cell($line_total);

    end_row();
}

$_POST['ChargeFreightCost'] =  get_post('ChargeFreightCost',
    price_format($_SESSION['Items']->freight_cost));

$colspan = 9;

start_row();
label_cell(_("Shipping Cost"), "colspan=$colspan align=right");
small_amount_cells(null, 'ChargeFreightCost', $_SESSION['Items']->freight_cost);
end_row();

$inv_items_total = $_SESSION['Items']->get_items_total_dispatch();

$display_sub_total = price_format($inv_items_total + input_num('ChargeFreightCost'));

label_row(_("Sub-total"), $display_sub_total, "colspan=$colspan align=right","align=right");

$taxes = $_SESSION['Items']->get_taxes(input_num('ChargeFreightCost'));
$tax_total = display_edit_tax_items($taxes, $colspan, $_SESSION['Items']->tax_included);

$display_total = price_format(($inv_items_total + input_num('ChargeFreightCost') + $tax_total));

label_row(_("Amount Total"), $display_total, "colspan=$colspan align=right","align=right");

end_table(1);

if ($has_marked) {
    display_note(_("Marked items have insufficient quantities in stock as on day of delivery."), 0, 1, "class='stockmankofg'");
}
start_table(TABLESTYLE2);

policy_list_row(_("Action For Balance"), "bo_policy", null);

textarea_row(_("Memo"), 'Comments', null, 50, 4);

end_table(1);
div_end();
submit_center_first('Update', _("Update"),
    _('Refresh document page'), true);
if(isset($_POST['clear_quantity'])) {
    submit('reset_quantity', _('Reset quantity'), true, _('Refresh document page'));
}
else  {
    submit('clear_quantity', _('Clear quantity'), true, _('Refresh document page'));
}
submit_center_last('process_delivery', _("Process Dispatch"),
    _('Check entered data and save document'), 'default');

end_form();


end_page();

changes are commented by //faisal

What if we make the customer branch field changeable in delivery against sales order page. Will that work?

I need to enable multiple deliveries against one sales order at different branches of a customer.

Currently we can't change the Branch on the customer_delivery.php page

Any idea?

440

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

Commercial sad

441

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

You can contact @notrinos for POS module. He shared with me privately. Here is the demo link

notrinos.webstarterz.com

442

(7 replies, posted in Report Bugs here)

thanks

443

(7 replies, posted in Report Bugs here)

No you are wrong, I am pressing upload button while selecting a .sql file to upload.

If I apply your suggestion, It only avoid error shown in post#1 but the file is still not uploaded.

You have to review the commit mentioned in post#1, Better give it a try to upload a .sql file to understand the bug.

444

(7 replies, posted in Report Bugs here)

@itronics, I think yours commit has created this bug in uploading a .sql backup file

Regards

Now I think in core dimension_entry.php Lines from 149-167 shall be updated with below

$Ajax->activate('_page_body');
    if (can_process())
    {

        if ($selected_id == -1)
        {
            $id = add_dimension($_POST['ref'], $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_']);
            add_tag_associations($id, $_POST['dimension_tags']);
            meta_forward($_SERVER['PHP_SELF'], "AddedID=$id",0,true);
        }
        else
        {

            update_dimension($selected_id, $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_']);
            update_tag_associations(TAG_DIMENSION, $selected_id, $_POST['dimension_tags']);

            meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$selected_id",0,true);
        }
    }

Great Friends, Great Team

I thank you all for your contributions.

Joe is Comitter and I am Bugger smile

I have no words to thank you @notrinos and @apmuthu.

You are right. After commenting meta_forward() it is working.

Can you guide how to debug Ajax? I am very poor in that smile

Thanks a lot, you have take such a pain for my problem.

You may be right, but how does the browser and version issue / OS issue is only affecting dimension_entry.php page while other pages like I mentioned earlier company_preferences.php is working fine on the same browser, version and OS?

@notrinos you have added one line

include_once ($path_to_root . "/includes/ui.inc");

So finally the Core dimension_entry.php file looks like below after your modifications

<?php
/**********************************************************************
    Copyright (C) FrontAccounting, 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_DIMENSION';
$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 . "/admin/db/tags_db.inc");
include_once($path_to_root . "/dimensions/includes/dimensions_db.inc");
include_once($path_to_root . "/dimensions/includes/dimensions_ui.inc");
include_once ($path_to_root . "/includes/ui.inc");


$js = "";
if (user_use_date_picker())
    $js .= get_js_date_picker();
page(_($help_context = "Dimension Entry"), false, false, "", $js);

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

if (isset($_GET['trans_no']))
{
    $selected_id = $_GET['trans_no'];
} 
elseif(isset($_POST['selected_id']))
{
    $selected_id = $_POST['selected_id'];
}
else
    $selected_id = -1;
//---------------------------------------------------------------------------------------

if (isset($_GET['AddedID'])) 
{
    $id = $_GET['AddedID'];

    display_notification_centered(_("The dimension has been entered."));

    safe_exit();
}

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

if (isset($_GET['UpdatedID'])) 
{
    $id = $_GET['UpdatedID'];

    display_notification_centered(_("The dimension has been updated."));
    safe_exit();
}

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

if (isset($_GET['DeletedID'])) 
{
    $id = $_GET['DeletedID'];

    display_notification_centered(_("The dimension has been deleted."));
    safe_exit();
}

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

if (isset($_GET['ClosedID'])) 
{
    $id = $_GET['ClosedID'];

    display_notification_centered(_("The dimension has been closed. There can be no more changes to it.") . " #$id");
    safe_exit();
}

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

if (isset($_GET['ReopenedID'])) 
{
    $id = $_GET['ReopenedID'];

    display_notification_centered(_("The dimension has been re-opened. ") . " #$id");
    safe_exit();
}

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

function safe_exit()
{
    global $path_to_root;

    hyperlink_no_params("", _("Enter a &new dimension"));
    echo "<br>";
    hyperlink_no_params($path_to_root . "/dimensions/inquiry/search_dimensions.php", _("&Select an existing dimension"));

    display_footer_exit();
}

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

function can_process()
{
    global $selected_id, $Refs;

    if ($selected_id == -1) 
    {
        if (!check_reference($_POST['ref'], ST_DIMENSION))
        {
            set_focus('ref');
            return false;
        }
    }

    if (strlen($_POST['name']) == 0) 
    {
        display_error( _("The dimension name must be entered."));
        set_focus('name');
        return false;
    }

    if (!is_date($_POST['date_']))
    {
        display_error( _("The date entered is in an invalid format."));
        set_focus('date_');
        return false;
    }

    if (!is_date($_POST['due_date']))
    {
        display_error( _("The required by date entered is in an invalid format."));
        set_focus('due_date');
        return false;
    }

    return true;
}

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

if (isset($_POST['ADD_ITEM']) || isset($_POST['UPDATE_ITEM'])) 
{
    if (!isset($_POST['dimension_tags']))
        $_POST['dimension_tags'] = array();
        
    $Ajax->activate('_page_body');
    if (can_process()) 
    {

        if ($selected_id == -1) 
        {
            $id = add_dimension($_POST['ref'], $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_']);
            add_tag_associations($id, $_POST['dimension_tags']);
            meta_forward($_SERVER['PHP_SELF'], "AddedID=$id");
        } 
        else 
        {

            update_dimension($selected_id, $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_']);
            update_tag_associations(TAG_DIMENSION, $selected_id, $_POST['dimension_tags']);

            meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$selected_id");
        }
    }
}

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

if (isset($_POST['delete'])) 
{

    $cancel_delete = false;

    // can't delete it there are productions or issues
    if (dimension_has_payments($selected_id) || dimension_has_deposits($selected_id))
    {
        display_error(_("This dimension cannot be deleted because it has already been processed."));
        set_focus('ref');
        $cancel_delete = true;
    }

    if ($cancel_delete == false) 
    { //ie not cancelled the delete as a result of above tests

        // delete
        delete_dimension($selected_id);
        delete_tag_associations(TAG_DIMENSION,$selected_id, true);
        meta_forward($_SERVER['PHP_SELF'], "DeletedID=$selected_id");
    }
}

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

if (isset($_POST['close'])) 
{

    // update the closed flag
    close_dimension($selected_id);
    meta_forward($_SERVER['PHP_SELF'], "ClosedID=$selected_id");
}

if (isset($_POST['reopen'])) 
{

    // update the closed flag
    reopen_dimension($selected_id);
    meta_forward($_SERVER['PHP_SELF'], "ReopenedID=$selected_id");
}
//-------------------------------------------------------------------------------------

start_form();

start_table(TABLESTYLE2);

if ($selected_id != -1)
{
    $myrow = get_dimension($selected_id);

    if (strlen($myrow[0]) == 0) 
    {
        display_error(_("The dimension sent is not valid."));
        display_footer_exit();
    }

    // if it's a closed dimension can't edit it
    //if ($myrow["closed"] == 1) 
    //{
    //    display_error(_("This dimension is closed and cannot be edited."));
    //    display_footer_exit();
    //}

    $_POST['ref'] = $myrow["reference"];
    $_POST['closed'] = $myrow["closed"];
    $_POST['name'] = $myrow["name"];
    $_POST['type_'] = $myrow["type_"];
    $_POST['date_'] = sql2date($myrow["date_"]);
    $_POST['due_date'] = sql2date($myrow["due_date"]);
    $_POST['memo_'] = get_comments_string(ST_DIMENSION, $selected_id);
    
     $tags_result = get_tags_associated_with_record(TAG_DIMENSION, $selected_id);
     $tagids = array();
     while ($tag = db_fetch($tags_result)) 
          $tagids[] = $tag['id'];
     $_POST['dimension_tags'] = $tagids;    

    hidden('ref', $_POST['ref']);

    label_row(_("Dimension Reference:"), $_POST['ref']);

    hidden('selected_id', $selected_id);
} 
else 
{
    $_POST['dimension_tags'] = array();
    ref_row(_("Dimension Reference:"), 'ref', '', $Refs->get_next(ST_DIMENSION), false, ST_DIMENSION);
}

text_row_ex(_("Name") . ":", 'name', 50, 75);

$dim = get_company_pref('use_dimension');

number_list_row(_("Type"), 'type_', null, 1, $dim);

date_row(_("Start Date") . ":", 'date_');

date_row(_("Date Required By") . ":", 'due_date', '', null, $SysPrefs->default_dimension_required_by());

tag_list_row(_("Tags:"), 'dimension_tags', 5, TAG_DIMENSION, true);

textarea_row(_("Memo:"), 'memo_', null, 40, 5);

end_table(1);

if (isset($_POST['closed']) && $_POST['closed'] == 1)
    display_note(_("This Dimension is closed."), 0, 0, "class='currentfg'");

if ($selected_id != -1) 
{
    echo "<br>";
    submit_center_first('UPDATE_ITEM', _("Update"), _('Save changes to dimension'), 'default');
    if ($_POST['closed'] == 1)
        submit('reopen', _("Re-open This Dimension"), true, _('Mark this dimension as re-opened'), true);
    else    
        submit('close', _("Close This Dimension"), true, _('Mark this dimension as closed'), true);
    submit_center_last('delete', _("Delete This Dimension"), _('Delete unused dimension'), true);
}
else
{
    submit_center('ADD_ITEM', _("Add"), true, '', 'default');
}
end_form();

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

end_page();

Unfortunately I couldn't get results. I have applied all the changes to the latest version of FA at following URL

Click to Login
id: admin
pass:Pakistan1947
company:Clearing

I really appreciate your feedback.

But unfortunately still it doesn't work after I applied @notrinos suggestion in post#10

Are you sure that

$Ajax->activate('_page_body');

controls this feature?

In order to dig further I took a complete fresh installation of FA243

In company_preferences.php I commented the line 126

//$Ajax->activate('_page_body');

But still this page is saving and showing Auto Fill Values.

In order to check further I took the core dimension_entry.php page and added

$Ajax->activate('_page_body');

Before

if (can_process())

Any value feeded in the Dimension Name is not appearing in the List of Values.

This exercise is saying that there may be some other code controlling this feature.

Any further feedback?