In chart_master table if I change the data type of account_code field from Varchar to int, will it cause any anomaly in relationships with other tables?

I have kept all Account Codes as Integer

There is an inactive column in Table 0_crm_persons which is inactive.

Is it deliberately set inactive or by mistake.

I need to have this activated in sales/manage/customer_branches.php Contacts tab.

Yes this is a serious issue I have also been facing for long time. The issue Arises when the transaction is recorded (almost for all transactions like sales, purchases, gl transactions) but the Reference Number is not incremented to then next one in the Table reflines

This doesn't happen every time but some time. No behavior could be recorded that after how many transactions this fails to increment.

404

(3 replies, posted in FA Modifications)

yes

405

(3 replies, posted in FA Modifications)

While creating Direct Invoice, the system automatically creates Direct GRN. This GRN is supposed to be the source for Direct Invoice. The src_id is actually the id of GRN

406

(2 replies, posted in Dimensions)

Shouldn't we customize the function
safe_exit() as below in dimension_entry.php

function safe_exit()
{
    global $path_to_root;
    $trans_no=isset($_GET['AddedID']) ? $_GET['AddedID'] : $_GET['UpdatedID'];

    hyperlink_no_params("", _("Enter a &new dimension"));
    echo "<br>";
    hyperlink_no_params($path_to_root . "/dimensions/inquiry/search_dimensions.php", _("&Select an existing dimension"));
    echo "<br>";
    hyperlink_no_params($path_to_root . "/admin/attachments.php?filterType=40&trans_no=$trans_no", _("&Add Attachment"));


    display_footer_exit();
}

@Braath Waate you are right

I have modified import_multiplejournalentries.php to add Journal Entries for Customers and Suppliers

<?php
/**********************************************
Author: Tom Hallman
Name: Import Multiple Journal Entries/Deposits/Payments v2.3
Free software under GNU GPL
***********************************************/
$page_security = 'SA_CSVMULTIJOURNALIMPORT';
$path_to_root="../..";

include_once($path_to_root . "/includes/ui/items_cart.inc");
include_once($path_to_root . "/gl/includes/db/gl_db_trans.inc");
include_once($path_to_root . "/includes/session.inc");
add_access_extensions();

// Turn these next two lines on for debugging
//error_reporting(E_ALL);
//ini_set("display_errors", "on");

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

function init_entry(&$entry,$type,$date,$reference) // See gl/gl_journal::create_cart() & gl/gl_bank::handle_new_order()
{
    $entry = new items_cart($type);
    $entry->order_id = 0;
    $entry->tran_date = $date;
    $entry->reference = $reference;
    $entry->memo_ = 'Imported via \'Import Multiple Journal Entries\' plugin';
}

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

function import_type_list_row($label, $name, $selected=null, $submit_on_change=false)
{
    $arr = array(
        ST_JOURNAL=> "Journal Entry",
        ST_BANKDEPOSIT=> "Deposit",
        ST_BANKPAYMENT=> "Payment"
    );

    echo "<tr><td class='label'>$label</td><td>";
    echo array_selector($name, $selected, $arr,
        array(
            'select_submit'=> $submit_on_change,
            'async' => false,
        ));
    echo "</td></tr>\n";
}

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

function check_journal_entry(&$entry, $entryid)
{
    // Check that this journal entry adds up!
    if (abs($entry->gl_items_total()) > 0.0001)
    {
        display_error("Error: journal entry with entryid '$entryid' does not balance (import file: '{$_FILES['imp']['name']}')");
        return true;
    }
}

function write_trans($type, $entry, $curEntryId, $bank_account)
{
    if ($type == ST_JOURNAL)
    {
        if (!check_journal_entry($entry, $curEntryId));
            write_journal_entries($entry, false, false); // FA built-in function
    }
    elseif ($type == ST_BANKDEPOSIT || $type == ST_BANKPAYMENT) {
        add_bank_transaction($entry->trans_type, $bank_account, $entry, $entry->tran_date, // FA built-in function
            false, false, false, $entry->reference, $entry->memo_, false);
    }

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

function get_dimension_id_from_reference($ref)
{
    if ($ref == null || trim($ref) == '')
        return 0;

    $sql = "SELECT id FROM ".TB_PREF."dimensions WHERE reference LIKE ".db_escape($ref);

    $result = db_query($sql, "could not get dimension from reference");

    $row = db_fetch_row($result);

    return $row[0];
}

//--------------------------------------------------------------------------------------------------
// Begin the UI
include_once($path_to_root . "/includes/ui.inc");

page("Import Multiple Journal Entries / Deposits / Payments");

// If the import button was selected, we'll process the form here.  (If not, skip to actual content below.)
if (isset($_POST['import']))
{
    if (isset($_FILES['imp']) && $_FILES['imp']['name'] != '')
    {
        $filename = $_FILES['imp']['tmp_name'];
        $sep = $_POST['sep'];
        $type = $_POST['type'];
        $bank_account = isset($_POST['bank_account']) ? $_POST['bank_account'] : "";

        // Open the file
        $fp = @fopen($filename, "r");
        if (!$fp)
        {
            display_error("Error opening file $filename");
        } else {

            // Initialize first entryid & date to be null so that a new one is established
            $curEntryId = $curDate = null;

            // Prepare the DB to receive the imported journal entries
            begin_transaction();

            // Process the import file
            $line = 0;
            $entryCount = 0;
            $error = false;
            $errCnt = 0;
            while ($data = fgetcsv($fp, 4096, $sep))
            {
                // Skip the first line, as it's a header
                if ($line++ == 0) continue;

                // Skip blank lines (which shouldn't happen in a well-formed CSV, but we'll be safe)
                if (count($data) == 1) continue;

                // Parse the row of data; Format: entryid,date,reference,accountcode,dimension1,dimension2,amount,memo
                list($entryid, $date, $reference, $code, $dim1_ref, $dim2_ref, $amt, $memo, $person_id) = $data;

                // If the entryid has changed, create the current journal entry (if there was one) and start a new one
                if ($entryid != $curEntryId) {

                    // Check that date is properly-formatted
                    if (!is_date($date)) {
                        display_error("Error: date '$date' not properly formatted (line $line in import file '{$_FILES['imp']['name']}')");
                        $error = true;
                    }

                    // Check that the date is in range
                    if (!is_date_in_fiscalyear($date)) {
                        display_error("Error: date not in fiscal year (line $line in import file '{$_FILES['imp']['name']}')");
                        $error = true;
                    }

                    // Assign a default reference if it is not specified
                    if ($reference == '') {
                        // If the entryid has shifted but date is the same, it needs another reference
                        if ($date == $curDate)
                            $refCount++;
                        else // else the entryid and date have shifted, so we can start with a new reference
                            $refCount = 1;
                        list($day, $month, $year) = explode_date_to_dmy($date);
                        $reference = "$month/$day-$refCount";
                    }

                    // Check that the reference is not in use
                    global $Refs;
                    if (!$Refs->is_new_reference($reference,$type)) {
                        display_error("Error: reference '$reference' is already in use (line $line in import file '{$_FILES['imp']['name']}')");
                        $error = true;
                    }

                    // All good! Initialize a new entry
                    if ($curEntryId != null) {
                        if (!$error)
                        {
                            write_trans($type, $entry, $curEntryId, $bank_account);
                            $entryCount++;
                        }
                    }
                    if ($error)
                        $errCnt++;
                    $error = false;
                    init_entry($entry,$type,$date,$reference);
                    $curEntryId = $entryid;
                    $curDate = $date;
                }

                if ($entryid == '') {
                    display_error("Error: entryid not specified (line $line in import file '{$_FILES['imp']['name']}')");
                    $error = true;
                }
                // Check that the account code exists
                if (get_gl_account($code) == null) {
                    display_error("Error: Could not find account code '$code' (line $line in import file '{$_FILES['imp']['name']}')");
                    $error = true;
                }
                // Check that dimension 1 exists
                $dim1 = get_dimension_id_from_reference($dim1_ref);
                if ($dim1_ref != '' && $dim1 == null) {
                    display_error("Error: Could not find dimension with reference '$dim1_ref' (line $line in import file '{$_FILES['imp']['name']}')");
                    $error = true;
                }
                // Check that dimension 2 exists
                $dim2 = get_dimension_id_from_reference($dim2_ref);
                if ($dim2_ref != '' && $dim2 == null) {
                    display_error("Error: Could not find dimension with reference '$dim2_ref' (line $line in import file '{$_FILES['imp']['name']}')");
                    $error = true;
                }

                if ($type == ST_BANKDEPOSIT)
                    $amt = -$amt;

                // Add to the journal entry / deposit / payment
                if (!$error)
                    $entry->add_gl_item($code, $dim1, $dim2, $amt, $memo,'',$person_id);
            }

            // Process final entries in the file
            if (!$error)
            {
                if ($curEntryId != null) {
                    write_trans($type, $entry, $curEntryId, $bank_account);
                    $entryCount++;
                }
            } else
                $errCnt++;

            @fclose($fp);

            // Commit import to database
            if (!$errCnt)
                commit_transaction();

            if ($type == ST_JOURNAL)
                $typeString = "journal entries";
            elseif ($type == ST_BANKDEPOSIT)
                $typeString = "deposits";
            elseif ($type == ST_BANKPAYMENT)
                $typeString = "payments";

            if (!$errCnt) {
                if ($entryCount > 0)
                    display_notification_centered("$entryCount $typeString have been imported.");
                else
                    display_error("Import file contained no $typeString.");
            }
        }
    }
    else
        display_error("No import file selected");
}

start_form(true);

start_table(TABLESTYLE2);

if (!isset($_POST['type']))
    $_POST['type'] = ST_JOURNAL;

if (!isset($_POST['sep']))
    $_POST['sep'] = ",";

    echo ' | ';
    echo "<a href=https://my.pakerp.net/modules/import_multijournalentries/Journal_Entry.cs>Click Here To Download Sample File For Import </a>";
    echo "<br> There should be no Comma (,) in any value in any column. Please double check before import";
    echo "<br> For Customers Opening Balance person_id shall contain debtor_no field value and code shall be Accounts Receivable Code.";
    echo "<br> For Suppliers Opening Balance person_id shall contain supplier_id field value and code shall be Accounts Payable Code.";

table_section_title("Import Settings");
import_type_list_row("Import Type:", 'type', $_POST['type'], true);
if ($_POST['type'] != ST_JOURNAL)
    bank_accounts_list_row( $_POST['type'] == ST_BANKPAYMENT ? _("From:") : _("To:"), 'bank_account', null, false);
text_row("Field Separator:", 'sep', $_POST['sep'], 2, 1);
label_row("Import File:", "<input type='file' id='imp' name='imp'>");

end_table(1);

submit_center('import', "Perform Import");//,true,false,'process',ICON_SUBMIT);

end_form();

end_page();

This is very helpful to record opening balances of all Trial Balance Accounts when shifting to FA from any other ERP.

ini_set('max_execution_time', 300);

Worked in my case

One of my client creates Recurring Invoices that are around 230 invoices.

When he clicks to Print Recurring Invoices the Ajax fails to show the print preview. The document is however created in the company's pdf folder but Print Preview is not shown.

HOw to resolve this issue. Any Idea?

411

(6 replies, posted in Reporting)

Oh yes, you are right

412

(6 replies, posted in Reporting)

Oh, Yes I missed that. But I think either this Variable is set to 0 or 1, the result shall be same because the function getAverageCost also returns UnitCost with the same algorithm, the weighted average, which is used to calculate the material_cost stored in stock_master.

This was discussed in detail in the topic mentioned in Post # 2

413

(9 replies, posted in Manufactoring)

Yes, you are right. There is no Estimation System in FA right now.

414

(6 replies, posted in Reporting)

$use_costed_values is not used anywhere in reports in latest FA Versions

It was well discussed in this topic.

Adding following 2 Code Components in gl/includes/db/gl_db_rates.inc Worked

at Line 163

elseif ($provider == 'CCA') //free.currencyconverterapi.com
    {
        $filename = "/api/v5/convert?q={$curr_b}_{$curr_a}&compact=y";
        $site = "free.currencyconverterapi.com";
        $proto = 'https://';

    }

and at Line 240

    elseif ($provider == 'CCA')
    {
        $rates = json_decode($contents, true);
        $val = $rates[$curr_b.'_'.$curr_a]['val'];
      }

and It works for all currencies without fail

https://free.currencyconverterapi.com/api/v5/convert?q=PHP_PKR&compact=y

This Gives Results. Can anyone suggest the Code for this

Is there any solution for PKR as base currency?

@Joe, this fix works fine if the Value in Transaction References is a Not Used Value

But I am facing complaints from some of the clients and I couldn't figure out the reason that after some transactions specially in Bank Payment Entry the Value in Transaction References doesn't increment.

How to Fix this?

419

(6 replies, posted in Development)

Thanks @joe for considering me. However, I am not a good PHP Developer and don't know anything about Javascript. I am basically a financial consultant. I have been trying to Hack FA Code for some of my solutions for my clients. As you have talked about 'Landing Costs'. I think you meant Import Landing Cost. I have developed a simple module for this using Dimensions and Stock Adjustment. What it does is it Divides the Total Cost of Imports using Weighted Average Method to all products in Imports. Thus Adding Value to the Purchase Price of the Product.

Similarly I have developed a Manufacturing Module. The Current Manufacturing Module of FA have two Levels

1. Simple Manufacturing
2. Advance Manufacturing

In Advance Manufacturing, we can't handle a manufacturing process that generates 2 or more Finished Goods. We can input multiple Raw Materials but Finished Good is Single. Anyhow, I didn't like it.

My manufacturing module can be used for Simple as well as Advanced Processes. However it doesn't take into account the Labour and Overhead Costs separately. But it just calculates the per unit cost of each Finished Good Item using Weighted Average Method.

In Both Imports and Manufacturing Process, you need to open a Job in Dimensions of Type 2.

I have linked the Stock Adjustment also with Dimension. So all Raw Material can be Stocked Out in that Job day by day as process moves on.

Similarly all cash expenses can be loaded to that Job.

Once Job is Finished, you process it and all cost of that Job is allocated to each Item in Process.

If you are interested in this then give me email address to send the code to.

Regards.

@joe and @apmuthu,

It is necessary in two scenarios

1. You have more than one data entry operators who are recording bank transactions at the same time. Both have same Next Reference say BP115 on their forms. The person who will commit transaction lately will see the error Transaction Reference Already in Use

2. Even if we have only one Data Entry operator but it happens many times that the next reference stucks and don't increase itself. Then one needs to manually go to Transaction References Page and increase it.

This is my point of view.

Also we need to add following lines in copy_to_cart () function in sales_order_entry.php page

function copy_to_cart()
{
    check_reference($_POST['ref'], $_SESSION['Items']->trans_type, $_SESSION['Items']->trans_no); //added by faisal

I found one problem with this.

In Supplier Invoice and Supplier Credit Notes the name of reference input field is not ref but reference

@davidkumi, @itronics, @joe, @apmuthu

I have a suggestion and I have tested it with many transactions (not all) and it is working

Modify the function check_reference() with following single line change

function check_reference($reference, $trans_type, $trans_no=0, $context=null, $line=null)
{
    global $Refs;

    if (!$Refs->is_valid($reference, $trans_type, $context, $line))
    {
        display_error(_("The entered reference is invalid.")); return false;
    }
    elseif (!$Refs->is_new_reference($reference, $trans_type, $trans_no))
    {
        $_POST['ref'] = $Refs->get_next($trans_type, null, $context); //modified by faisal
        // display_error( _("The entered reference is already in use.")); return false;
    }
    return true;
}

Before applying to my main server I request you all to please authenticate it. I don't know if it conflicts with some other behaviour of FA

424

(1 replies, posted in Installation)

Try Using this API

425

(5 replies, posted in Reporting)

Yes please this is needed.