Update of old 0 and -1 parents in chart_types to an empty string
[fa-stable.git] / gl / includes / db / gl_db_banking.inc
index b20644c58c2d79113383e18df7ce2057ff4ee6be..cff9e70d0b1bda27aa4d9832a02fd27c5e42b5ac 100644 (file)
@@ -16,14 +16,25 @@ function add_exchange_variation($trans_type, $trans_no, $date_, $acc_id, $accoun
                return;
        if ($date_ == null)
                $date_ = Today();
-       $rate = get_exchange_rate_from_home_currency($currency, $date_);
-       $result = db_query("SELECT SUM(amount) FROM ".TB_PREF."bank_trans WHERE 
-               bank_act='$acc_id' AND trans_date<='".date2sql($date_)."'", 
-               "Transactions for account $account could not be calculated");
-       $row = db_fetch_row($result);
-       $foreign_amount = $row[0];
+       $for_amount = 0;
+
+       // We have to calculate all the currency accounts belonging to the GL account
+       // upto $date_ and calculate with the exchange rates. And then compare with the GL account balance.
+       // 2010-02-23 Joe Hunt with help of Ary Wibowo
+       $sql = "SELECT SUM(bt.amount) AS for_amount, ba.bank_curr_code          
+               FROM ".TB_PREF."bank_trans bt, ".TB_PREF."bank_accounts ba
+               WHERE ba.id = bt.bank_act AND ba.account_code = ".db_escape($account)." AND bt.trans_date<='".date2sql($date_)."'
+               GROUP BY ba.bank_curr_code";    
+       $result = db_query($sql, "Transactions for bank account $acc_id could not be calculated");
+       while ($row = db_fetch($result))
+       {
+               if ($row['for_amount'] == 0)
+                       continue;
+               $rate = get_exchange_rate_from_home_currency($row['bank_curr_code'], $date_);
+               $for_amount += round2($row['for_amount'] * $rate, user_price_dec());
+       }       
        $amount = get_gl_trans_from_to("", $date_, $account);
-       $diff = $amount - (round2($foreign_amount * $rate, user_price_dec()));
+       $diff = $amount - $for_amount;
        if ($diff != 0)
        {
                if ($trans_type == null)
@@ -102,7 +113,9 @@ function add_bank_transfer($from_account, $to_account, $date_,
                $date_, $amount, PT_MISC, "",
                $currency, "Cannot insert a destination bank transaction");
 
-       add_exchange_variation($trans_type, $trans_no, $date_, $from_account, $from_gl_account, 
+       $currency = get_bank_account_currency($to_account);
+       
+       add_exchange_variation($trans_type, $trans_no, $date_, $to_account, $to_gl_account, 
                $currency, PT_MISC, "");
        
        add_comments($trans_type, $trans_no, $date_, $memo_);
@@ -127,7 +140,7 @@ function add_bank_transfer($from_account, $to_account, $date_,
 // 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_)
+       $person_type_id, $person_id, $person_detail_id, $ref, $memo_, $use_transaction=true)
 {
        global $Refs;
 
@@ -137,7 +150,8 @@ function add_bank_transaction($trans_type, $from_account, $items, $date_,
 
        $do_exchange_variance = false;
        
-       begin_transaction();
+       if ($use_transaction)
+               begin_transaction();
 
        $currency = get_bank_account_currency($from_account);
        $bank_gl_account = get_bank_gl_account($from_account);
@@ -232,7 +246,8 @@ function add_bank_transaction($trans_type, $from_account, $items, $date_,
        $Refs->save($trans_type, $trans_no, $ref);
        add_audit_trail($trans_type, $trans_no, $date_);
 
-       commit_transaction();
+       if ($use_transaction)
+               commit_transaction();
 
        return array($trans_type, $trans_no);
 }