Topic: Import Multiple Journal Entries - nothing imported

To my recent FA 2.4.8 installation (see https://frontaccounting.com/punbb/viewtopic.php?id=8755 post #13 [Import of Direct Sales Invoice from csv fails]) I added the Import Multiple Journal Entries extension, with the modification described in https://frontaccounting.com/punbb/viewt … 547#p31547 [Providing fix for Import Multiple Journal Entries module in v2.4rc1 by boxygen]. My test input csv file looks like this:

entryid,date,reference,accountcode,dimension1,dimension2,amount,memo,person_id
1,2016/12/31,101/2016,3100,001/2020,002/2020,-69.00,"Initial Balance xferred from QBO - Robert Rackl",1
1,2016/12/31,101/2016,1200,001/2020,002/2020,69.00,"Initial Balance xferred from QBO - Robert Rackl",1
2,2016/12/31,102/2016,3100,001/2020,002/2020,247.40,"Initial Balance xferred from QBO - Marc Brooks",2
2,2016/12/31,102/2016,1200,001/2020,002/2020,-247.40,"Initial Balance xferred from QBO - Marc Brooks",2

When I import this file the response is a simple 'Back' link under the heading 'Import Multiple Journal Entries / Deposits / Payments'; nothing else. No error message on the screen or in the log file. No modifications made in the database.

Account codes 3100 and 1200 exist in the CoA. The apparently inconsistent use of minus-signs in front of amounts is intentional because Robert had a negative accounts receivable balance. Person_ids 1 and 2 exist in field debtor_no in table 1_cust_branch. Contents of table 1_dimensions:

  id  reference  name  type_  closed  date_       due_date
   1  001/2020   D1        1       0  2000-01-01  2199-12-31
   2  002/2020   D2        2       0  2000-01-01  2199-12-31

$debug is set to 1 in config.php . Date format is set to YYYY/MM/DD.

Please suggest ways for troubleshooting this problem.

r4

Re: Import Multiple Journal Entries - nothing imported

Hi,

I am able to import journal entries from 'Import Transactions',  but I am not able import from 'Import Multiple Journal Entries' option.

Question: Import Transactions option is working for limited of transactions, When I tried on one month data it is failing to import. When I tried with 2 days data, it is working fine.

Is there any restriction on No.of records in the csv. Please let me know


Thanks
Prasad

Re: Import Multiple Journal Entries - nothing imported

I am trying to import with the extension, it is not working,
when I turned the debug on I found the following errorrs
Undefined variable: trans_type in file: /var/www/xxx/xxx/xxx/import_multijournalentries.php at line 163Unhandled exception [0]: Call to undefined function add_bank_transaction(). in file: /var/www/xxx/xxx/xxx/modules/import_multijournalentries/import_multijournalentries.php at line 69
what can the problem be ?
best regards

Re: Import Multiple Journal Entries - nothing imported

I hope you are using the module from my repo at:
https://github.com/apmuthu/FA24extensions/tree/master/Extensions/import_multijournalentries

The function add_bank_transaction() was a native function in FA but not available in both v2.3.26 and in any v2.4.x versions now.

Re: Import Multiple Journal Entries - nothing imported

Thanks very muc Apmuthu,
Now I am getting the error

Unhandled exception [0]: Call to undefined function add_bank_transaction(). in file: /xx/xxx/xxx//import_multijournalentries/import_multijournalentries.php at line 69

and when I checked Your github file that I installed i found that the function still exist in line 69
what should I do now ?

Re: Import Multiple Journal Entries - nothing imported

In gl/includes/db/gl_db_banking.inc there is a function write_bank_transaction() that may a clue to what changed since 27th Oct 2010 when the said function name was changed in FA v2.3 RC3.

The original function was:

//----------------------------------------------------------------------------------
//    Add bank payment or deposit to database.
//
//    $from_account - bank account id
//  $item - transaction cart (line item's amounts in bank account's currency)
//  $person_type_id - defines type of $person_id identifiers
//  $person_id    - supplier/customer/other id
// $person_detail_id - customer branch id or not used
//
// returns an array of (inserted trans type, trans no)

function add_bank_transaction($trans_type, $from_account, $items, $date_,
    $person_type_id, $person_id, $person_detail_id,    $ref, $memo_, $use_transaction=true)
{
    global $Refs, $SysPrefs;

    // we can only handle type 1 (payment)and type 2 (deposit)
    if ($trans_type != ST_BANKPAYMENT && $trans_type != ST_BANKDEPOSIT)
        display_db_error("Invalid type ($trans_type) sent to add_bank_transaction");

    $do_exchange_variance = false;
    $exchanged = false;
    if ($use_transaction)
        begin_transaction();

    $currency = get_bank_account_currency($from_account);
    $bank_gl_account = get_bank_gl_account($from_account);

    // the gl items are already inversed/negated for type 2 (deposit)
    $total_amount = $items->gl_items_total();

    if ($person_type_id == PT_CUSTOMER)
    {
        // we need to add a customer transaction record

        // convert to customer currency
        $cust_amount = exchange_from_to($total_amount, $currency, get_customer_currency($person_id), $date_);
        // we need to negate it too
        $cust_amount = -$cust_amount;

        $trans_no = write_customer_trans($trans_type, 0, $person_id, $person_detail_id, $date_,
            $ref, $cust_amount);

    }
    elseif ($person_type_id == PT_SUPPLIER)
    {
        // we need to add a supplier transaction record
        // convert to supp currency
        $supp_amount = exchange_from_to($total_amount, $currency, get_supplier_currency($person_id), $date_);

        // we need to negate it too
        $supp_amount = -$supp_amount;

        $trans_no = add_supp_trans($trans_type, $person_id, $date_, '',
            $ref, "", $supp_amount, 0, 0);

    }
    else
    {
        $trans_no = get_next_trans_no($trans_type);
        $do_exchange_variance = $SysPrefs->auto_currency_revaluation();
        if ($do_exchange_variance)
            $trans_no1 = get_next_trans_no(ST_JOURNAL);
    }

    // do the source account postings

    add_bank_trans($trans_type, $trans_no, $from_account, $ref,
        $date_, -$total_amount,
        $person_type_id, $person_id,
        $currency,
        "Cannot insert a source bank transaction");
    $total = 0;
    foreach ($items->gl_items as $gl_item)
    {
        $is_bank_to = is_bank_account($gl_item->code_id);

        if ($trans_type == ST_BANKPAYMENT AND $is_bank_to)
        {
            // we don't allow payments to go to a bank account. use transfer for this !
            display_db_error("invalid payment entered. Cannot pay to another bank account", "");
        }

        // do the destination account postings
        $total += add_gl_trans($trans_type, $trans_no, $date_, $gl_item->code_id,
            $gl_item->dimension_id, $gl_item->dimension2_id, $gl_item->reference,
            $gl_item->amount, $currency, $person_type_id, $person_id);

        if ($is_bank_to)
        {
            add_bank_trans($trans_type, $trans_no, $is_bank_to, $ref,
                $date_, $gl_item->amount,
                $person_type_id, $person_id, $currency,
                "Cannot insert a destination bank transaction");
            if ($do_exchange_variance)
            {
                add_exchange_variation($trans_no1, $date_, $is_bank_to, $gl_item->code_id, 
                    $currency, $person_type_id, $person_id);
            }        
        }
        // store tax details if the gl account is a tax account

        $amount = $gl_item->amount;
        $ex_rate = get_exchange_rate_from_home_currency($currency, $date_);
            
        add_gl_tax_details($gl_item->code_id, $trans_type, $trans_no, -$amount,
            $ex_rate, $date_, $memo_);
    }

    // do the source account postings
    add_gl_trans($trans_type, $trans_no, $date_, $bank_gl_account, 0, 0, $memo_,
        -$total, null, $person_type_id, $person_id);

    if ($do_exchange_variance)
    {
        if ($exchanged || add_exchange_variation($trans_no1, $date_, $from_account, $bank_gl_account, 
            $currency, $person_type_id, $person_id))
        {    
               $ref1 = $Refs->get_next(ST_JOURNAL);
            $Refs->save(ST_JOURNAL, $trans_no1, $ref1);
            add_audit_trail(ST_JOURNAL, $trans_no1, $date_);
        }    
    }

    add_comments($trans_type, $trans_no, $date_, $memo_);

    $Refs->save($trans_type, $trans_no, $ref);
    add_audit_trail($trans_type, $trans_no, $date_);

    if ($use_transaction)
        commit_transaction();

    return array($trans_type, $trans_no);
}

and that got changed then to

//----------------------------------------------------------------------------------
//    Add bank payment or deposit to database.
//
//    $from_account - bank account id
//  $item - transaction cart (line item's amounts in bank account's currency)
//  $person_type_id - defines type of $person_id identifiers
//  $person_id    - supplier/customer/other id
// $person_detail_id - customer branch id or not used
//
// returns an array of (inserted trans type, trans no)
//
// FIXME -revise code for update case
//
function write_bank_transaction($trans_type, $trans_no, $from_account, $items, $date_,
    $person_type_id, $person_id, $person_detail_id,    $ref, $memo_, $use_transaction=true)
{
    global $Refs, $SysPrefs;

    // we can only handle type 1 (payment)and type 2 (deposit)
    if ($trans_type != ST_BANKPAYMENT && $trans_type != ST_BANKDEPOSIT)
        display_db_error("Invalid type ($trans_type) sent to add_bank_transaction");

    $do_exchange_variance = false;
    $exchanged = false;
    if ($use_transaction)
        begin_transaction();

    if ($trans_no)
        clear_bank_transaction($_SESSION['pay_items']->trans_type, $_SESSION['pay_items']->order_id);

    $currency = get_bank_account_currency($from_account);
    $bank_gl_account = get_bank_gl_account($from_account);

    // the gl items are already inversed/negated for type 2 (deposit)
    $total_amount = $items->gl_items_total();

    if ($person_type_id == PT_CUSTOMER)
    {
        // we need to add a customer transaction record

        // convert to customer currency
        $cust_amount = exchange_from_to($total_amount, $currency, get_customer_currency($person_id), $date_);
        // we need to negate it too
        $cust_amount = -$cust_amount;

        $trans_no = write_customer_trans($trans_type, $trans_no, $person_id, $person_detail_id, $date_,
            $ref, $cust_amount);

    }
    elseif ($person_type_id == PT_SUPPLIER)
    {
        // we need to add a supplier transaction record
        // convert to supp currency
        $supp_amount = exchange_from_to($total_amount, $currency, get_supplier_currency($person_id), $date_);

        // we need to negate it too
        $supp_amount = -$supp_amount;

        $trans_no = write_supp_trans($trans_type, $trans_no, $person_id, $date_, '',
            $ref, "", $supp_amount, 0, 0);

    }
    else
    {
        if (!$trans_no)
            $trans_no = get_next_trans_no($trans_type);
        $do_exchange_variance = $SysPrefs->auto_currency_revaluation();
        if ($do_exchange_variance)
            $trans_no1 = get_next_trans_no(ST_JOURNAL);
    }

    // do the source account postings

    add_bank_trans($trans_type, $trans_no, $from_account, $ref,
        $date_, -$total_amount,
        $person_type_id, $person_id,
        $currency,
        "Cannot insert a source bank transaction");
    $total = 0;
    foreach ($items->gl_items as $gl_item)
    {
        $is_bank_to = is_bank_account($gl_item->code_id);

        if ($trans_type == ST_BANKPAYMENT AND $is_bank_to)
        {
            // we don't allow payments to go to a bank account. use transfer for this !
            display_db_error("invalid payment entered. Cannot pay to another bank account", "");
        }

        // do the destination account postings
        $total += add_gl_trans($trans_type, $trans_no, $date_, $gl_item->code_id,
            $gl_item->dimension_id, $gl_item->dimension2_id, $gl_item->reference,
            $gl_item->amount, $currency, $person_type_id, $person_id);

        if ($is_bank_to)
        {
            add_bank_trans($trans_type, $trans_no, $is_bank_to, $ref,
                $date_, $gl_item->amount,
                $person_type_id, $person_id, $currency,
                "Cannot insert a destination bank transaction");
            if ($do_exchange_variance)
            {
                add_exchange_variation($trans_no1, $date_, $is_bank_to, $gl_item->code_id, 
                    $currency, $person_type_id, $person_id);
            }        
        }
        // store tax details if the gl account is a tax account

        $amount = $gl_item->amount;
        $ex_rate = get_exchange_rate_from_home_currency($currency, $date_);
            
        add_gl_tax_details($gl_item->code_id, $trans_type, $trans_no, -$amount,
            $ex_rate, $date_, $memo_);
    }

    // do the source account postings
    add_gl_trans($trans_type, $trans_no, $date_, $bank_gl_account, 0, 0, $memo_,
        -$total, null, $person_type_id, $person_id);

    if ($do_exchange_variance)
    {
        if ($exchanged || add_exchange_variation($trans_no1, $date_, $from_account, $bank_gl_account, 
            $currency, $person_type_id, $person_id))
        {    
               $ref1 = $Refs->get_next(ST_JOURNAL);
            $Refs->save(ST_JOURNAL, $trans_no1, $ref1);
            add_audit_trail(ST_JOURNAL, $trans_no1, $date_);
        }    
    }

    add_comments($trans_type, $trans_no, $date_, $memo_);

    $Refs->save($trans_type, $trans_no, $ref);
    add_audit_trail($trans_type, $trans_no, $date_);

    if ($use_transaction)
        commit_transaction();

    return array($trans_type, $trans_no);
}

and now in v2.4.10+ stands at:

//----------------------------------------------------------------------------------
//    Add bank payment or deposit to database.
//
//    $from_account - bank account id
//  $items - transaction cart (line amounts in bank account's currency); negative for deposit
//  $person_type_id - defines type of $person_id identifiers
//  $person_id    - supplier/customer/other id
//  $person_detail_id - customer branch id or not used
//  $settled_amount - settled amount in AR/AP (if applicable) in customer/supplier currency (always non-negative number)
//
// returns an array of (inserted trans type, trans no)
//
// FIXME -revise code for update case
//
function write_bank_transaction($trans_type, $trans_no, $from_account, $items, $date_,
    $person_type_id, $person_id, $person_detail_id,    $ref, $memo_, $use_transaction=true, $settled_amount=null)
{
    global $Refs, $SysPrefs;

    // we can only handle type 1 (payment)and type 2 (deposit)
    if ($trans_type != ST_BANKPAYMENT && $trans_type != ST_BANKDEPOSIT)
        display_db_error("Invalid type ($trans_type) sent to add_bank_transaction");

    $do_exchange_variance = false;
    if ($use_transaction)
        begin_transaction();

    $args = func_get_args(); if (count($args) < 11) $args[] = true;
    $args = (object)array_combine(array('trans_type', 'trans_no', 'from_account', 'items', 'date_',
        'person_type_id', 'person_id', 'person_detail_id', 'ref', 'memo_', 'use_transaction', 'settled_amount'),
        $args);
    hook_db_prewrite($args, $trans_type);

    $aid = 0;
    if ($trans_no) {
        $old_trans = $trans_no;
        $Refs->restore_last($trans_type, $trans_no);
        $aid = has_attachment($trans_type, $trans_no);
    } else
        $old_trans = false;

    $currency = get_bank_account_currency($from_account);
    $bank_gl_account = get_bank_gl_account($from_account);

    // the gl items are already inversed/negated for type 2 (deposit)
    $total_amount = $items->gl_items_total();

    if ($person_type_id == PT_CUSTOMER)
    {
        // we need to add a customer transaction record
        // convert to customer currency
        if (!isset($settled_amount)) // leaved for backward/ext compatibility 
            $cust_amount = exchange_from_to(abs($total_amount), $currency, get_customer_currency($person_id), $date_);
        else
            $cust_amount = $settled_amount;

        if ($trans_type == ST_BANKPAYMENT)
            $cust_amount = -$cust_amount;

        $trans_no = write_customer_trans($trans_type, 0, $person_id, $person_detail_id, $date_,
            $ref, $cust_amount);
        if ($old_trans)
            move_trans_attachments($trans_type, $old_trans, $trans_no);
    }
    elseif ($person_type_id == PT_SUPPLIER)
    {
        // we need to add a supplier transaction record
        // convert to supp currency
        if (!isset($settled_amount)) // leaved for for backward/ext compatibility 
            $supp_amount = exchange_from_to(abs($total_amount), $currency, get_supplier_currency($person_id), $date_);
        else
            $supp_amount = $settled_amount;

        if ($trans_type == ST_BANKPAYMENT)
            $supp_amount = -$supp_amount;

        $trans_no = write_supp_trans($trans_type, 0, $person_id, $date_, '',
            $ref, "", $supp_amount, 0, 0);
        if ($old_trans)
            move_trans_attachments($trans_type, $old_trans, $trans_no);
    }
    else
    {
           $trans_no = get_next_trans_no($trans_type);
        $do_exchange_variance = $SysPrefs->auto_currency_revaluation();
        if ($do_exchange_variance)
            $trans_no1 = get_next_trans_no(ST_JOURNAL);
    }
    if ($aid != 0)
    {
        $row = get_attachment($aid);
        update_attachment($aid, $row['type_no'], $trans_no, $row['description'],
            $row['filename'], $row['unique_name'], $row['filesize'], $row['filetype']);
    }
    // do the source account postings

    add_bank_trans($trans_type, $trans_no, $from_account, $ref,
        $date_, -$total_amount,
        $person_type_id, $person_id,
        $currency,
        "Cannot insert a source bank transaction");
    $total = 0;
    foreach ($items->gl_items as $gl_item)
    {
        $is_bank_to = is_bank_account($gl_item->code_id);

        if ($trans_type == ST_BANKPAYMENT AND $is_bank_to)
        {
            // we don't allow payments to go to a bank account. use transfer for this !
            display_db_error("invalid payment entered. Cannot pay to another bank account", "");
        }

        // do the destination account postings
        $total += add_gl_trans($trans_type, $trans_no, $date_, $gl_item->code_id,
            $gl_item->dimension_id, $gl_item->dimension2_id, $gl_item->reference,
            $gl_item->amount, $currency, $person_type_id, $person_id);

        if ($is_bank_to)
        {
            add_bank_trans($trans_type, $trans_no, $is_bank_to, $ref,
                $date_, $gl_item->amount,
                $person_type_id, $person_id, $currency,
                "Cannot insert a destination bank transaction");
            if ($do_exchange_variance)
            {
                add_exchange_variation($trans_no1, $date_, $is_bank_to, $gl_item->code_id, 
                    $currency, $person_type_id, $person_id);
            }
        }
        // store tax details if the gl account is a tax account

        $amount = $gl_item->amount;
        $ex_rate = get_exchange_rate_from_home_currency($currency, $date_);

        add_gl_tax_details($gl_item->code_id, $trans_type, $trans_no, -$amount,
            $ex_rate, $date_, $memo_);
    }

    // do the source account postings
    add_gl_trans($trans_type, $trans_no, $date_, $bank_gl_account, $gl_item->dimension_id, $gl_item->dimension2_id, $memo_,
        -$total, null, $person_type_id, $person_id);

    if ($do_exchange_variance)
    {
        add_exchange_variation($trans_no1, $date_, $from_account, $bank_gl_account, 
            $currency, $person_type_id, $person_id);
    }

    add_comments($trans_type, $trans_no, $date_, $memo_);

    $Refs->save($trans_type, $trans_no, $ref);
    add_audit_trail($trans_type, $trans_no, $date_);

    // old transaction can be voided only after new transaction is entered,
    //  otherwise the operation could fail for cash accounts due to temporary negative balance
    if ($old_trans) 
    {
        $msg = void_transaction($trans_type, $old_trans, $date_, _("Document reentered."));
        if ($msg)
        {
            display_error($msg);
            return false;
        }
    }


    $args->trans_no = $trans_no;
    hook_db_postwrite($args, $trans_type);
    if ($use_transaction)
        commit_transaction();

    return array($trans_type, $trans_no);
}

Hence hash an appropriate add_bank_transaction() function from the above in the said file that spews the stated error and you should be good to go.

Dimensions are now set, the second argument is now a trans_no and a settled_amount is the last optional argument.

Post's attachments

add_bank_transaction_to_write_bank_transaction.zip 3.5 kb, 3 downloads since 2021-08-19 

You don't have the permssions to download the attachments of this post.

Re: Import Multiple Journal Entries - nothing imported

Thanks for the detailed explanation,
I did not understand , and i would recommend making the changes to the extension itself ,
ie., in the import_multujournalentries.php line 69

add_bank_transaction function would be changed to write_bank_transaction function with the appropriate variables list adjusted, this way the main Frontaccounting code would be kept intact

Can this be done:
Current Code

    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);
    }

to be modified as

    elseif ($type == ST_BANKDEPOSIT || $type == ST_BANKPAYMENT) {
        write_bank_transaction($entry->trans_type, $curEntryId, $bank_account, $entry, $entry->tran_date, // FA built-in function
            false, false, false, $entry->reference, $entry->memo_, false);
    }

Re: Import Multiple Journal Entries - nothing imported

Try and let us know what results you get.