226

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

@Rmendez
I'm the FrontHrm developer, please post your problem on to This Thread so those who have the same problem can get their help too.

227

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

This is not implemented @apmuthu, it is there because I plan to create 2 project types in the future:

0. Open project which all user will have accessible
1. Private project, can be accessed only by specific users.

228

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

Added task comment system and email notification : DEMO

229

(2 replies, posted in Report Bugs here)

Line 145 of items_db.inc currently is :

_('Cannot delete this item because there are existing purchase order items for it.'),

It should be:

_('Cannot delete this item because there are existing sales order items for it.'),

Comment out the last line in gl_trans_view.php

// end_page(true, false, false, $_GET['type_id'], $_GET['trans_no']);

@stefan, it's my client's product, not free.

What a serious mistake sad
Thanks @mnhpiash for detecting. It has been fixed

I think edit the Order details in the Sales Order Inquiry is the only way

233

(4 replies, posted in Setup)

Try to create a new one for 2019 active it then close the 2018 one and it can be deleted.
But I guess not all transactions will be cleared.

Replace lines 261-262 of gl/includes/ui/gl_journal_ui.inc with the following:

amount_cells(null, 'AmountDebit');
amount_cells(null, 'AmountCredit');

GJ - General journal
BP - Bank payment
BD - Bank deposits
BT - Bank transfer
SI - Sales invoice
CN - Customer Credit note ????
CP - Customer payment
LS - ********************** Not used in FA or in standard extensions - don't know why it is there
IT - Inventory transfer
IA - Inventory adjustment
PO - Purchase order
PI - Purchase invoice
PC - Purchase credit note
SP - Supplier payment
GRN - Goods Received Note
WO - Work order
WI - Work in progress - Issued to Manufacture
WP - Work in Progress - Received from manufacturing
SO - Sales order
SQ - Sales quotation
CU - Cost update

See the /includes/sysnames.inc line 52 - 73

Restructured FrontHrm has been released:

- New tables structure without any changes to the orignal FA database.
- Monthly Salary and Daily Wages options for each Salary Scale
- Minutes based attendance input, example: 7:30, 06:15 ...

Source code
Demo

237

(3 replies, posted in Setup)

You can understand Dimension through this https://frontaccounting.com/punbb/viewtopic.php?id=38

238

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

@Alaa, I don't know, I did not think about this, module was written in Javascript mainly so we have to find a library like PHP gettext for Javascript.

Early next month @Alaa

Based on suggetions of apmuthu and other FA community members the HRM module will be restructured for more portable and suitable for more form of work. It has been restructuring and hope will be released soon.

241

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

These features have not been implemented yet. They will be included later.

242

(1 replies, posted in Installation)

Read the Wiki may help.

problem may be fiscal year, please create new fiscal year for 2018 then update in company setup

244

(5 replies, posted in Report Bugs here)

Change the $go_debug in the config.php to 2 and see the errors

245

(3 replies, posted in Translations)

You have to directly edit strings in source code.
But creating a new English language pack is better

The current ERD updated
https://ibb.co/fMvaSG

Line 182 of inventory/manage/items.php should be

elseif (strstr($_POST['NewStockID'], "-") || strstr($_POST['NewStockID'],"'") || 

to prevent the - symbol entered by user
Can someone explain about the forbidden characters in the Item code (- ' " + & space), is the reason security ?

Then @boxygen's dimension_entry.php would now be

<?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 . "/modules/clearing/includes/dim_db.inc");
include_once ($path_to_root . "/modules/clearing/includes/dimensions_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 . "/modules/clearing/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_dim($_POST['ref'], $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_'], $_POST['client'], $_POST['item'], $_POST['POL'], $_POST['mode'], $_POST['volume'], $_POST['weight'], $_POST['cont_no'], $_POST['equip_no'], $_POST['bl_no'], $_POST['bl_date'], $_POST['ETA'], $_POST['doc_copy'], $_POST['doc_org'], $_POST['gd_date'], $_POST['po_duty'], $_POST['po_do'], $_POST['po_wfg'], $_POST['destuff'], $_POST['assessment'], $_POST['delivery'], $_POST['gd_no'], $_POST['igm_no'], $_POST['igm_date'], $_POST['index_no'], $_POST['cash_no'], $_POST['cash_date'], $_POST['value'], $_POST['no_of_pkg'], $_POST['POD'], $_POST['gross_weight']);
            add_tag_associations($id, $_POST['dimension_tags']);
            meta_forward($_SERVER['PHP_SELF'], "AddedID=$id", 0, true);
        }
        else
        {
            update_dim($selected_id, $_POST['Dref'], $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_'], $_POST['client'], $_POST['item'], $_POST['POL'], $_POST['mode'], $_POST['volume'], $_POST['weight'], $_POST['cont_no'], $_POST['equip_no'], $_POST['bl_no'], $_POST['bl_date'], $_POST['ETA'], $_POST['doc_copy'], $_POST['doc_org'], $_POST['gd_date'], $_POST['po_duty'], $_POST['po_do'], $_POST['po_wfg'], $_POST['destuff'], $_POST['assessment'], $_POST['delivery'], $_POST['gd_no'], $_POST['igm_no'], $_POST['igm_date'], $_POST['index_no'], $_POST['cash_no'], $_POST['cash_date'], $_POST['value'], $_POST['no_of_pkg'], $_POST['POD'], $_POST['gross_weight']);
            update_tag_associations(TAG_DIMENSION, $selected_id, $_POST['dimension_tags']);
            meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$selected_id", 0, true);
        }
    }
}
// --------------------------------------------------------------------------------------
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_outer_table(TABLESTYLE2);
table_section(1);
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']); //Commented By Faisal
    ref_row(_("Dimension Reference:") , 'Dref', '', $_POST['ref']); //added by faisal
    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', 25, 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);
text_row(_("Client") . ":", 'client', @$myrow['client'], 25, 75);
text_row(_("Item") . ":", 'item', @$myrow['item'], 25, 75);
table_section(2);
text_row(_("POL") . ":", 'POL', @$myrow['POL'], 25, 75);
text_row(_("Mode") . ":", 'mode', @$myrow['mode'], 25, 75);
text_row(_("Volume") . ":", 'volume', @$myrow['volume'], 25, 75);
text_row(_("Weight") . ":", 'weight', @$myrow['weight'], 25, 75);
text_row(_("Container No") . ":", 'cont_no', @$myrow['cont_no'], 25, 75);
text_row(_("Equipment NO") . ":", 'equip_no', @$myrow['equip_no'], 25, 75);
text_row(_("BL No") . ":", 'bl_no', @$myrow['bl_no'], 25, 75);
text_row(_("BL Date") . ":", 'bl_date', @$myrow['bl_date'], 25, 75);
text_row(_("ETA") . ":", 'ETA', @$myrow['ETA'], 25, 75);
table_section(3);
text_row(_("Doc Copy") . ":", 'doc_copy', @$myrow['doc_copy'], 25, 75);
text_row(_("Doc Original") . ":", 'doc_org', @$myrow['doc_org'], 25, 75);
text_row(_("GD Date") . ":", 'gd_date', @$myrow['gd_date'], 25, 75);
text_row(_("Duty POrder") . ":", 'po_duty', @$myrow['po_duty'], 25, 75);
text_row(_("DO POrder") . ":", 'po_do', @$myrow['po_do'], 25, 75);
text_row(_("Wharfage POrder") . ":", 'po_wfg', @$myrow['po_wfg'], 25, 75);
text_row(_("Destuff Date") . ":", 'destuff', @$myrow['destuff'], 25, 75);
text_row(_("Assessment Date") . ":", 'assessment', @$myrow['assessment'], 25, 75);
text_row(_("Delivery Date") . ":", 'delivery', @$myrow['delivery'], 25, 75);
text_row(_("GD Number") . ":", 'gd_no', @$myrow['gd_no'], 25, 75);
table_section(4);
text_row(_("IGM Number") . ":", 'igm_no', @$myrow['igm_no'], 25, 75);
text_row(_("IGM Date") . ":", 'igm_date', @$myrow['igm_date'], 25, 75);
text_row(_("Index Number") . ":", 'index_no', @$myrow['index_no'], 25, 75);
text_row(_("Cash Number") . ":", 'cash_no', @$myrow['cash_no'], 25, 75);
text_row(_("Cash Date") . ":", 'cash_date', @$myrow['cash_date'], 25, 75);
text_row(_("Value") . ":", 'value', @$myrow['value'], 25, 75);
text_row(_("No Of Pkg") . ":", 'no_of_pkg', @$myrow['no_of_pkg'], 25, 75);
text_row(_("POD") . ":", 'POD', @$myrow['POD'], 25, 75);
text_row(_("Gross Weight") . ":", 'gross_weight', @$myrow['gross_weight'], 25, 75);
end_outer_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();

@apmuthu
The other places are working because they are not calling meta_forward after form submit, I guess anywhere calling meta_forward after submit form will not store the values fed for next entry.

About the exit; in the ui_controls.inc line 168 we can understand its use through an example like following:

Let's comment out exit; in ui_controls.inc line 168
Now we make an sales entry, says Sales Quotation Entry
After process the order the $_SESSION['Items'] will be cleared by the processing_end() at line 492 and function meta_forward will be called at line 501 of sales_order_entry.php, since the exit; is disabled so after redirect all statements in the sales_order_entry.php will not be stopped then we can see the errors:


Undefined index: Items in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 700
Trying to get property of non-object in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 700
Undefined index: Items in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 707
Trying to get property of non-object in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 707
Undefined index: Items in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 713
Trying to get property of non-object in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 713
Undefined index: Items in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 719
Trying to get property of non-object in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 719
Unhandled exception [0]: Call to a member function is_started() on null. in file: C:\xampp\htdocs\fa243\sales\sales_order_entry.php at line 737
exception_handler((Error Object))


In case of Dimension Entry the exit; can be disabled without any errors. So I think @apmuthu's suggestion for another argument for the function to conditionally execute an exit maybe good

exit; statement in ui_controls.inc line 168 is the cause of @boxygen's trouble, I don't know why but you can temporarily  create your own meta_forward function without the exit; statement so that your module can work as it is now.
Something like this

function clearing_meta_forward($forward_to, $params="", $timeout=0)
{
    global $Ajax;
    echo "<meta http-equiv='Refresh' content='".$timeout."; url=$forward_to?$params'>\n";
    echo "<center><br>" . _("You should automatically be forwarded.");
    echo " " . _("If this does not happen") . " " . "<a href='$forward_to?$params'>" . _("click here") . "</a> " . _("to continue") . ".<br><br></center>\n";
    if ($params !='') $params = '?'.$params;
    $Ajax->redirect($forward_to.$params);
    //exit;
}